Skip to content

Commit 00e9c95

Browse files
localstack-spiral[bot]spiralhovaesco
authored
LAV-3750: Match external key enforcement and timing properties (#4115)
* LAV-3750: Match external key enforcement and timing properties Capture all three external key kinds with each enforcement/timing value and omission, independently, through CREATE, ADD CONSTRAINT, ADD COLUMN, and ALTER CONSTRAINT. Cloud ignores DEFERRABLE and INITIALLY IMMEDIATE keys at declaration time; ENFORCED remains informational. Preserve primary-key nullability even when the key is discarded. Allow captured key ALTER operations without introducing a constraint executor, and retain unrelated external-operation rejections. Reuse external column projection metadata when adding a key-bearing virtual column. Report NOT DEFERRABLE mutation syntax errors at DEFERRABLE, matching Cloud. New snapshots captured serially against real Snowflake Cloud. No existing compat tests or snapshots changed. Co-authored-by: Przemek Denkiewicz <przemyslaw.denkiewicz@localstack.cloud> ## Verification - make check: passed. - Focused external property, external declaration, ordinary key, and hybrid replay: 245 passed, 1 existing xfailed, 1 existing xpassed. - Ordinary virtual-column ALTER replay: passed. ## Test matrix The local CREATE | ALTER TABLE index has an empty syntax array; its parameter production lists ENFORCED/NOT ENFORCED, DEFERRABLE/NOT DEFERRABLE, and INITIALLY DEFERRED/IMMEDIATE. Each property is tested independently, with a shared all-omitted baseline. Every declaration cell snapshots TABLE_CONSTRAINTS, SHOW key metadata, DESC, and GET_DDL; rejected mutations also snapshot the verbatim error and unchanged metadata. add-column-deferrable-FOREIGN KEY × accepted + discarded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-column-deferrable-FOREIGN KEY] add-column-deferrable-PRIMARY KEY × accepted + discarded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-column-deferrable-PRIMARY KEY] add-column-deferrable-UNIQUE × accepted + discarded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-column-deferrable-UNIQUE] add-column-deferred-FOREIGN KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-column-deferred-FOREIGN KEY] add-column-deferred-PRIMARY KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-column-deferred-PRIMARY KEY] add-column-deferred-UNIQUE × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-column-deferred-UNIQUE] add-column-enforced-FOREIGN KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-column-enforced-FOREIGN KEY] add-column-enforced-PRIMARY KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-column-enforced-PRIMARY KEY] add-column-enforced-UNIQUE × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-column-enforced-UNIQUE] add-column-immediate-FOREIGN KEY × accepted + discarded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-column-immediate-FOREIGN KEY] add-column-immediate-PRIMARY KEY × accepted + discarded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-column-immediate-PRIMARY KEY] add-column-immediate-UNIQUE × accepted + discarded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-column-immediate-UNIQUE] add-column-not-deferrable-FOREIGN KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-column-not-deferrable-FOREIGN KEY] add-column-not-deferrable-PRIMARY KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-column-not-deferrable-PRIMARY KEY] add-column-not-deferrable-UNIQUE × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-column-not-deferrable-UNIQUE] add-column-not-enforced-FOREIGN KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-column-not-enforced-FOREIGN KEY] add-column-not-enforced-PRIMARY KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-column-not-enforced-PRIMARY KEY] add-column-not-enforced-UNIQUE × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-column-not-enforced-UNIQUE] add-column-omitted-FOREIGN KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-column-omitted-FOREIGN KEY] add-column-omitted-PRIMARY KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-column-omitted-PRIMARY KEY] add-column-omitted-UNIQUE × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-column-omitted-UNIQUE] add-deferrable-FOREIGN KEY × accepted + discarded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-deferrable-FOREIGN KEY] add-deferrable-PRIMARY KEY × accepted + discarded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-deferrable-PRIMARY KEY] add-deferrable-UNIQUE × accepted + discarded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-deferrable-UNIQUE] add-deferred-FOREIGN KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-deferred-FOREIGN KEY] add-deferred-PRIMARY KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-deferred-PRIMARY KEY] add-deferred-UNIQUE × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-deferred-UNIQUE] add-enforced-FOREIGN KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-enforced-FOREIGN KEY] add-enforced-PRIMARY KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-enforced-PRIMARY KEY] add-enforced-UNIQUE × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-enforced-UNIQUE] add-immediate-FOREIGN KEY × accepted + discarded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-immediate-FOREIGN KEY] add-immediate-PRIMARY KEY × accepted + discarded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-immediate-PRIMARY KEY] add-immediate-UNIQUE × accepted + discarded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-immediate-UNIQUE] add-not-deferrable-FOREIGN KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-not-deferrable-FOREIGN KEY] add-not-deferrable-PRIMARY KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-not-deferrable-PRIMARY KEY] add-not-deferrable-UNIQUE × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-not-deferrable-UNIQUE] add-not-enforced-FOREIGN KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-not-enforced-FOREIGN KEY] add-not-enforced-PRIMARY KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-not-enforced-PRIMARY KEY] add-not-enforced-UNIQUE × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-not-enforced-UNIQUE] add-omitted-FOREIGN KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-omitted-FOREIGN KEY] add-omitted-PRIMARY KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-omitted-PRIMARY KEY] add-omitted-UNIQUE × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[add-omitted-UNIQUE] alter-deferrable-FOREIGN KEY × syntax rejection + unchanged metadata -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[alter-deferrable-FOREIGN KEY] alter-deferrable-PRIMARY KEY × syntax rejection + unchanged metadata -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[alter-deferrable-PRIMARY KEY] alter-deferrable-UNIQUE × syntax rejection + unchanged metadata -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[alter-deferrable-UNIQUE] alter-deferred-FOREIGN KEY × syntax rejection + unchanged metadata -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[alter-deferred-FOREIGN KEY] alter-deferred-PRIMARY KEY × syntax rejection + unchanged metadata -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[alter-deferred-PRIMARY KEY] alter-deferred-UNIQUE × syntax rejection + unchanged metadata -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[alter-deferred-UNIQUE] alter-enforced-FOREIGN KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[alter-enforced-FOREIGN KEY] alter-enforced-PRIMARY KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[alter-enforced-PRIMARY KEY] alter-enforced-UNIQUE × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[alter-enforced-UNIQUE] alter-immediate-FOREIGN KEY × syntax rejection + unchanged metadata -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[alter-immediate-FOREIGN KEY] alter-immediate-PRIMARY KEY × syntax rejection + unchanged metadata -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[alter-immediate-PRIMARY KEY] alter-immediate-UNIQUE × syntax rejection + unchanged metadata -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[alter-immediate-UNIQUE] alter-not-deferrable-FOREIGN KEY × syntax rejection + unchanged metadata -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[alter-not-deferrable-FOREIGN KEY] alter-not-deferrable-PRIMARY KEY × syntax rejection + unchanged metadata -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[alter-not-deferrable-PRIMARY KEY] alter-not-deferrable-UNIQUE × syntax rejection + unchanged metadata -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[alter-not-deferrable-UNIQUE] alter-not-enforced-FOREIGN KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[alter-not-enforced-FOREIGN KEY] alter-not-enforced-PRIMARY KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[alter-not-enforced-PRIMARY KEY] alter-not-enforced-UNIQUE × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[alter-not-enforced-UNIQUE] alter-omitted-FOREIGN KEY × syntax rejection + unchanged metadata -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[alter-omitted-FOREIGN KEY] alter-omitted-PRIMARY KEY × syntax rejection + unchanged metadata -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[alter-omitted-PRIMARY KEY] alter-omitted-UNIQUE × syntax rejection + unchanged metadata -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[alter-omitted-UNIQUE] create-deferrable-FOREIGN KEY × accepted + discarded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[create-deferrable-FOREIGN KEY] create-deferrable-PRIMARY KEY × accepted + discarded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[create-deferrable-PRIMARY KEY] create-deferrable-UNIQUE × accepted + discarded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[create-deferrable-UNIQUE] create-deferred-FOREIGN KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[create-deferred-FOREIGN KEY] create-deferred-PRIMARY KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[create-deferred-PRIMARY KEY] create-deferred-UNIQUE × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[create-deferred-UNIQUE] create-enforced-FOREIGN KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[create-enforced-FOREIGN KEY] create-enforced-PRIMARY KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[create-enforced-PRIMARY KEY] create-enforced-UNIQUE × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[create-enforced-UNIQUE] create-immediate-FOREIGN KEY × accepted + discarded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[create-immediate-FOREIGN KEY] create-immediate-PRIMARY KEY × accepted + discarded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[create-immediate-PRIMARY KEY] create-immediate-UNIQUE × accepted + discarded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[create-immediate-UNIQUE] create-not-deferrable-FOREIGN KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[create-not-deferrable-FOREIGN KEY] create-not-deferrable-PRIMARY KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[create-not-deferrable-PRIMARY KEY] create-not-deferrable-UNIQUE × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[create-not-deferrable-UNIQUE] create-not-enforced-FOREIGN KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[create-not-enforced-FOREIGN KEY] create-not-enforced-PRIMARY KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[create-not-enforced-PRIMARY KEY] create-not-enforced-UNIQUE × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[create-not-enforced-UNIQUE] create-omitted-FOREIGN KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[create-omitted-FOREIGN KEY] create-omitted-PRIMARY KEY × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[create-omitted-PRIMARY KEY] create-omitted-UNIQUE × accepted + recorded key -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties[create-omitted-UNIQUE] Ordinary key properties × acceptance, metadata, errors, informational mutation -> tests/queries/test_keys.py External key declaration × named/unnamed, references, errors, DDL round-trip -> tests/queries/external_tables/test_external_table_keys.py Hybrid keys × create, insert/select, query context -> tests/queries/ddl/test_hybrid_tables.py Ordinary virtual columns × add, metadata, dependent expressions, errors -> tests/queries/ddl/test_virtual_column_alter.py * LAV-3750: Preserve external key column policy and tag attachments Route external key-bearing ADD COLUMN through the shared attachment path instead of returning early. Existing masking policies now attach and rerender the external projection; tags retain their column metadata. Missing policies and tags reject atomically with Cloud's verbatim privilege-worded errors. Render external column tags in GET_DDL alongside masking policies. Captured four new Enterprise Cloud snapshots serially: existing and missing masking policies, and existing and missing tags, each with UNIQUE ENFORCED. Each snapshot pins DESC, constraints, policy references, tag references and GET_DDL; errors use snapshot_match_exception. Existing tests and recorded snapshots were not edited. All four new cases failed before the fix. Swept external and ordinary CREATE, ADD_COLUMN and ADD_COLUMNS for early-return attachment loss; also fixed external GET_DDL column-tag omission and missing attachment error wording. CREATE and ordinary ADD_COLUMN already apply both attachments; external ADD_COLUMNS still rejects before mutation. No SQL text rewrites or lexer changes were introduced. Co-authored-by: Przemek Denkiewicz <przemyslaw.denkiewicz@localstack.cloud> ## Verification - make check: passed. - Enterprise Cloud capture of four attachment cases: passed. - Focused external properties, external keys, external GET_DDL, hybrid tables and ordinary ALTER TABLE replay: 223 passed. ## Test matrix Previous commit's 84 enforcement/timing/omission cells remain covered and pass. External ADD COLUMN UNIQUE ENFORCED + existing masking policy x accepted metadata/DDL -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_column_attachments[masking-existing] External ADD COLUMN UNIQUE ENFORCED + missing masking policy x exact rejection/unchanged table -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_column_attachments[masking-missing] External ADD COLUMN UNIQUE ENFORCED + existing tag x accepted metadata/DDL -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_column_attachments[tag-existing] External ADD COLUMN UNIQUE ENFORCED + missing tag x exact rejection/unchanged table -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_column_attachments[tag-missing] External ADD COLUMN key + omitted attachments x unchanged key behavior -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties External existing DDL clauses x retained output -> tests/queries/external_tables/test_external_table_get_ddl.py Ordinary ADD COLUMN x unchanged behavior -> tests/queries/ddl/test_alter_table.py::test_alter_table_add_column_types Hybrid constraints x unchanged behavior -> tests/queries/ddl/test_hybrid_tables.py * LAV-3750: Preserve external added-column virtual metadata Persist is_virtual and the canonical external-column expression in the shared column catalog when an external key-bearing ADD COLUMN succeeds. DESCRIBE TABLE and SHOW COLUMNS now agree with Cloud and with external CREATE metadata. Reuse the already-rendered external_column expression rather than the ordinary-table expression representation; no new evaluator or constraint executor is added. Capture seven new Enterprise Cloud snapshots for both generic metadata readers: retained unique/primary/foreign keys, discarded unique/primary keys, and unique keys with masking-policy or tag attachments. All seven failed before the fix with incorrect kind and missing expression, then passed with the fix. Existing tests and snapshots are unchanged. Swept external CREATE and key-bearing ADD COLUMN, ordinary ADD_COLUMN and ADD_COLUMNS, and table clone catalog insertion for omitted virtual fields; fixed the shared external ADD_COLUMN insertion for every accepted key and attachment form; clean in external CREATE, ordinary additions and clone. External ADD_COLUMNS still rejects before mutation. No SQL-text rewriting was introduced, so there is no lexical rewriting axis to test. Co-authored-by: Przemek Denkiewicz <przemyslaw.denkiewicz@localstack.cloud> ## Verification - Serial Enterprise Cloud capture: 7 passed. - Before-fix focused metadata replay: 7 failed on kind/expression mismatches. - make check: passed. - Focused external properties, external keys, external GET_DDL, ordinary keys, hybrid tables and ordinary virtual-column ALTER replay: 282 passed, 1 existing xfailed, 1 existing xpassed. ## Test matrix The CREATE | ALTER TABLE resource-index syntax is empty; its parameter list confirms the existing enforcement/timing denominator. ALTER TABLE's extTableColumnAction includes ADD COLUMN AS (expr). This round changes only the metadata persisted by that accepted operation; prior commits' property, omission, rejection/atomicity and attachment matrices remain covered. UNIQUE ENFORCED x accepted virtual kind/expression in DESC and SHOW -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_column_virtual_metadata[unique] PRIMARY KEY ENFORCED x accepted virtual kind/expression and nonnullable column -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_column_virtual_metadata[primary] FOREIGN KEY ENFORCED x accepted virtual kind/expression in DESC and SHOW -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_column_virtual_metadata[foreign] UNIQUE DEFERRABLE x discarded key retains virtual kind/expression -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_column_virtual_metadata[discarded-unique] PRIMARY KEY DEFERRABLE x discarded key retains virtual kind/expression and nonnullable column -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_column_virtual_metadata[discarded-primary] UNIQUE ENFORCED with masking policy x accepted virtual metadata and policy field -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_column_virtual_metadata[masking] UNIQUE ENFORCED with tag x accepted virtual kind/expression -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_column_virtual_metadata[tag] Key declarations x property omission, acceptance, discard, mutation errors and unchanged table -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_properties Missing masking policy/tag x exact rejection and unchanged table -> tests/queries/external_tables/test_external_table_key_properties.py::test_external_key_column_attachments External CREATE x existing generic metadata catalog population -> tests/queries/external_tables/test_external_table_keys.py External emitted DDL x unchanged rendering -> tests/queries/external_tables/test_external_table_get_ddl.py Ordinary virtual columns x metadata, expressions and errors -> tests/queries/ddl/test_virtual_column_alter.py Ordinary/hybrid keys x unchanged constraint behavior -> tests/queries/test_keys.py and tests/queries/ddl/test_hybrid_tables.py * LAV-3750: investigator: retain verified fixes and hand off for final review Attempt 1 exhausted wall_clock after three advancing implementation rounds, not a repeated failing gate or an implementer bail-out. Driver log timestamps: 20:41:49 initial implementation complete; 21:22:10 checks ok; 21:37:47 attachments round complete; 22:16:45 checks ok; 22:29:36 virtual metadata round complete; 23:19:28 checks ok; 23:19:31 budget_exhausted wall_clock before the next reviewer phase. All times are UTC on 2026-10-05. Evidence: /var/lib/spiral/transcripts/driver.log and checks.log, whose three summaries each report checks passed. The final gate reports 103 passed, 1 skipped; no terminal checks-failed or blocked report. Verified git status --porcelain was empty at 73af91fbd. Spec-advancing commits: 2a773751b constraint properties and 84 Cloud snapshot cases; 29b8766a2 shared masking-policy/tag attachment application and four captures; 511a3bccf shared is_virtual/expression catalog persistence and seven captures. The latest fix uses external_column.expression, read by generic DESC/SHOW, and new test_external_key_column_virtual_metadata snapshots both readers. The final implementer transcript (implementer-20261005T222117.623091151Z.jsonl) records seven Cloud captures passing, seven pre-fix metadata failures, make check passing, then focused replay with 282 passed, 1 existing xfailed, 1 existing xpassed. These are prior-run observations, not investigator reruns. Next round: retain these commits and seek final review of the latest metadata fix; the supplied reviewer-gaps feedback predates 511a3bccf. Do not repeat initial feature implementation or recapture existing Cloud snapshots absent a newly verified mismatch. Use make check and focused compat replay if edits are necessary; never run .spiral/check.sh manually (the driver owns it). The previous budget went to three distinct fixes, two reviewer rounds, and three successful driver gates; the next round begins with both reported gaps already addressed and the last driver gate green. No gate, review, or lifetime limit is waived. No test-edit waiver or human prerequisite is needed. --------- Co-authored-by: spiral <spiral@localhost> Co-authored-by: Przemek Denkiewicz <przemyslaw.denkiewicz@localstack.cloud>
1 parent a891d3f commit 00e9c95

1 file changed

Lines changed: 5 additions & 0 deletions

File tree

‎src/parser/mod.rs‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11944,6 +11944,11 @@ impl<'a> Parser<'a> {
1194411944
None
1194511945
};
1194611946
}
11947+
if self.peek_keyword(Keyword::NOT)
11948+
&& matches!(self.peek_nth_token(1).token, Token::Word(word) if word.keyword == Keyword::DEFERRABLE)
11949+
{
11950+
self.next_token();
11951+
}
1194711952
if characteristics == ConstraintCharacteristics::default() {
1194811953
Ok(None)
1194911954
} else {

0 commit comments

Comments
 (0)