Skip to content

Commit 19e434f

Browse files
localstack-spiral[bot]spiralhovaesco
authored
LAV-3818: Match CREATE DATABASE FROM LISTING missing-listing errors (#4198)
* LAV-3818: Match Cloud errors for CREATE DATABASE FROM LISTING Parse listing sources explicitly and reject unavailable listings before database creation, using the active session role and Cloud's normalized listing identity. Clause-scoped token parsing preserves the captured distinctions between missing objects, invalid identifiers, malformed operands, incomplete options and invalid properties. Preserve the complete multiline connector errors in snapshots. Only new SQL compat tests and their serial default-account Cloud captures were added; existing test bodies, snapshot values and metadata projections are intact. No listing catalog, lifecycle or successful import support is introduced. Verification: - TEST_TARGET=SNOWFLAKE_CLOUD PYTEST_XDIST_ARGS="" make test-compat PYTEST_PATH=tests/queries/ddl/test_database_from_listing.py PYTEST_ARGS="--snapshot-update" (34 passed); additive grammar capture with --snapshot-update -k grammar establishes the remaining three cases. - make check: passed after the final changes. - make test-vendored-sqlparser: passed, including visitor and doctest targets. - PYTEST_XDIST_ARGS="" make test-compat: 42 passed, selecting the new listing file plus test_create_database_with_params, test_share_mount_end_to_end, test_share_mount_nonexistent_share, test_database_backup_and_restore, and test_container_restore_reject_matrix from their existing files. Co-authored-by: Przemek Denkiewicz <przemyslaw.denkiewicz@localstack.cloud> ## Deviations Cloud uppercases mixed-case string-literal listing names. Single-quoted names containing dots, hyphens, colons, slashes, spaces or escaped quotes fail with 000904 rather than a missing-listing error; underscore and dollar punctuation remain valid missing names. Implemented the captured distinctions, not a blanket missing-listing rejection for every quoted string. ## Test matrix CREATE DATABASE IF NOT EXISTS LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE IF NOT EXISTS LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING'] CREATE DATABASE LAV3818_IMPORT FROM LISTING "LAV3818.MISSING" × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING "LAV3818.MISSING"] CREATE DATABASE LAV3818_IMPORT FROM LISTING "LAV3818_MISSING" × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING "LAV3818_MISSING"] CREATE DATABASE LAV3818_IMPORT FROM LISTING "Lav3818_Mixed" × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING "Lav3818_Mixed"] CREATE DATABASE LAV3818_IMPORT FROM LISTING '1lav3818' × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING '1lav3818'] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' COMMENT = 'x' garbage × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' COMMENT = 'x' garbage] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' COMMENT = 'x' × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' COMMENT = 'x'] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' COMMENT = 123 × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' COMMENT = 123] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' COMMENT = × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' COMMENT =] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' COMMENT × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' COMMENT] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' FROM LISTING 'OTHER_MISSING' × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' FROM LISTING 'OTHER_MISSING'] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' FROM SHARE missing.share × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' FROM SHARE missing.share] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' garbage = 1 × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' garbage = 1] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' garbage = × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' garbage =] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' garbage × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' garbage] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING'; × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING';] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'invalid-name' garbage × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'invalid-name' garbage] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'lav3818 missing' × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'lav3818 missing'] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'unterminated × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'unterminated] CREATE DATABASE LAV3818_IMPORT FROM LISTING ('LAV3818_MISSING') × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING ('LAV3818_MISSING')] CREATE DATABASE LAV3818_IMPORT FROM LISTING /* comment */ 'LAV3818_MISSING' -- tail × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING /* comment */ 'LAV3818_MISSING' -- tail] CREATE DATABASE LAV3818_IMPORT FROM LISTING 123 × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 123] CREATE DATABASE LAV3818_IMPORT FROM LISTING LAV3818_MISSING × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING LAV3818_MISSING] CREATE DATABASE LAV3818_IMPORT FROM LISTING NULL × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING NULL] CREATE DATABASE LAV3818_IMPORT FROM LISTING × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING] CREATE OR REPLACE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE OR REPLACE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING'] CREATE TRANSIENT DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE TRANSIENT DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING'] Listing operand $$Lav3818_Missing$$ × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_missing[$$Lav3818_Missing$$] Listing operand $listing$Lav3818_Missing$listing$ × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_missing[$listing$Lav3818_Missing$listing$] Listing operand '' × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_missing[''] Listing operand 'LAV3818_MISSING_LISTING' × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_missing['LAV3818_MISSING_LISTING'] Listing operand 'Lav3818_Global$Name' × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_missing['Lav3818_Global$Name'] Listing operand 'Lav3818_MixedCase' × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_missing['Lav3818_MixedCase'] Listing operand 'lav3818''missing' × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_missing['lav3818''missing'] Listing operand 'lav3818.missing-listing:global/name' × captured error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_missing['lav3818.missing-listing:global/name'] Initial current namespace × observation -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_atomicity Rejected import × complete error -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_atomicity Rejected import × SHOW destination absent -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_atomicity Rejected import × current namespace unchanged -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_atomicity Destination after rejection × ordinary CREATE succeeds -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_atomicity FROM LISTING inside COMMENT literal × ordinary CREATE/DROP success -> tests/queries/ddl/test_database_from_listing.py::test_database_listing_keyword_is_not_a_clause Ordinary CREATE DATABASE parameters × success -> tests/queries/ddl/test_database_parameters.py::test_create_database_with_params FROM SHARE × successful live mount -> tests/queries/ddl/test_share_mounts.py::test_share_mount_end_to_end FROM SHARE × missing-share error -> tests/queries/ddl/test_share_mounts.py::test_share_mount_nonexistent_share FROM BACKUP SET database × successful restore -> tests/queries/ddl/test_container_backups.py::test_database_backup_and_restore FROM BACKUP SET container × rejection matrix -> tests/queries/ddl/test_container_backups.py::test_container_restore_reject_matrix * LAV-3818: Reject conflicting database listing sources before dispatch Recognize listing clauses after SHARE, CLONE and database options, and continue source validation through WITH TAG and WITH CONTACT. Reject mixed sources before share mounting or database creation. Match Cloud's distinct error location for a CLONE operand immediately after LISTING versus a CLONE clause after options. Swept the CREATE DATABASE listing header and suffix paths for conflicting-source validation bypasses; also fixed source clauses after COMMENT and tagged-dollar TAG values that Cloud rejects before a subsequent source. Clean for ordinary and dollar-quoted strings, escaped-string forms, quoted identifiers, line comments and block comments. Parsing uses the existing SQL tokenizer and parser, with parenthesized options bounded by the parser; no raw-text keyword matching. Added 25 serial, default-account Cloud captures. Every conflicting-source test also snapshots destination absence, unchanged current database/schema and a subsequent successful ordinary CREATE. Existing test bodies, snapshot values, metadata projections and import lifecycle behavior remain unchanged. Verification: - Initial focused replay: 14 failures / 1 pass, confirming the new assertions catch the pre-fix header and option-suffix bypasses. - Serial default-account TEST_TARGET=SNOWFLAKE_CLOUD make test-compat with PYTEST_XDIST_ARGS="", --snapshot-update and focused selections: passed. - make check: passed (including vendored sqlparser tests). - Focused make test-compat replay: 67 passed, 66 deselected; all listing tests plus ordinary CREATE, share mount success/missing share, database backup and restore rejection regressions. - git diff --check: passed; all 37 pre-existing snapshot records unchanged. Co-authored-by: Przemek Denkiewicz <przemyslaw.denkiewicz@localstack.cloud> ## Test matrix Resource-index CREATE DATABASE syntax checked offline. The touched surface is LISTING error handling, source conflicts and option traversal, not implementation of the other database options or a successful listing-import model. test_database_from_listing_atomicity × captured 002003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_atomicity test_database_from_listing_atomicity × destination absent -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_atomicity test_database_from_listing_atomicity × namespace unchanged -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_atomicity test_database_from_listing_atomicity × subsequent ordinary CREATE success -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_atomicity CLONE {original} -- FROM LISTING 'ignored'\n FROM LISTING 'LAV3818_MISSING' × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[CLONE {original} -- FROM LISTING 'ignored'\n FROM LISTING 'LAV3818_MISSING'] CLONE {original} -- FROM LISTING 'ignored'\n FROM LISTING 'LAV3818_MISSING' × destination absent -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[CLONE {original} -- FROM LISTING 'ignored'\n FROM LISTING 'LAV3818_MISSING'] CLONE {original} -- FROM LISTING 'ignored'\n FROM LISTING 'LAV3818_MISSING' × namespace unchanged -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[CLONE {original} -- FROM LISTING 'ignored'\n FROM LISTING 'LAV3818_MISSING'] CLONE {original} -- FROM LISTING 'ignored'\n FROM LISTING 'LAV3818_MISSING' × subsequent ordinary CREATE success -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[CLONE {original} -- FROM LISTING 'ignored'\n FROM LISTING 'LAV3818_MISSING'] CLONE {original} FROM LISTING 'LAV3818_MISSING' × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[CLONE {original} FROM LISTING 'LAV3818_MISSING'] CLONE {original} FROM LISTING 'LAV3818_MISSING' × destination absent -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[CLONE {original} FROM LISTING 'LAV3818_MISSING'] CLONE {original} FROM LISTING 'LAV3818_MISSING' × namespace unchanged -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[CLONE {original} FROM LISTING 'LAV3818_MISSING'] CLONE {original} FROM LISTING 'LAV3818_MISSING' × subsequent ordinary CREATE success -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[CLONE {original} FROM LISTING 'LAV3818_MISSING'] CLONE {original} WITH TAG (tag = 'FROM LISTING ignored') FROM LISTING 'LAV3818_MISSING' × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[CLONE {original} WITH TAG (tag = 'FROM LISTING ignored') FROM LISTING 'LAV3818_MISSING'] CLONE {original} WITH TAG (tag = 'FROM LISTING ignored') FROM LISTING 'LAV3818_MISSING' × destination absent -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[CLONE {original} WITH TAG (tag = 'FROM LISTING ignored') FROM LISTING 'LAV3818_MISSING'] CLONE {original} WITH TAG (tag = 'FROM LISTING ignored') FROM LISTING 'LAV3818_MISSING' × namespace unchanged -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[CLONE {original} WITH TAG (tag = 'FROM LISTING ignored') FROM LISTING 'LAV3818_MISSING'] CLONE {original} WITH TAG (tag = 'FROM LISTING ignored') FROM LISTING 'LAV3818_MISSING' × subsequent ordinary CREATE success -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[CLONE {original} WITH TAG (tag = 'FROM LISTING ignored') FROM LISTING 'LAV3818_MISSING'] COMMENT = 'FROM SHARE ignored.share' FROM LISTING 'LAV3818_MISSING' × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[COMMENT = 'FROM SHARE ignored.share' FROM LISTING 'LAV3818_MISSING'] COMMENT = 'FROM SHARE ignored.share' FROM LISTING 'LAV3818_MISSING' × destination absent -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[COMMENT = 'FROM SHARE ignored.share' FROM LISTING 'LAV3818_MISSING'] COMMENT = 'FROM SHARE ignored.share' FROM LISTING 'LAV3818_MISSING' × namespace unchanged -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[COMMENT = 'FROM SHARE ignored.share' FROM LISTING 'LAV3818_MISSING'] COMMENT = 'FROM SHARE ignored.share' FROM LISTING 'LAV3818_MISSING' × subsequent ordinary CREATE success -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[COMMENT = 'FROM SHARE ignored.share' FROM LISTING 'LAV3818_MISSING'] FROM LISTING 'LAV3818_MISSING' CLONE LAV3818_SOURCE × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' CLONE LAV3818_SOURCE] FROM LISTING 'LAV3818_MISSING' CLONE LAV3818_SOURCE × destination absent -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' CLONE LAV3818_SOURCE] FROM LISTING 'LAV3818_MISSING' CLONE LAV3818_SOURCE × namespace unchanged -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' CLONE LAV3818_SOURCE] FROM LISTING 'LAV3818_MISSING' CLONE LAV3818_SOURCE × subsequent ordinary CREATE success -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' CLONE LAV3818_SOURCE] FROM LISTING 'LAV3818_MISSING' COMMENT = 'CLONE ignored' FROM SHARE missing.share × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' COMMENT = 'CLONE ignored' FROM SHARE missing.share] FROM LISTING 'LAV3818_MISSING' COMMENT = 'CLONE ignored' FROM SHARE missing.share × destination absent -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' COMMENT = 'CLONE ignored' FROM SHARE missing.share] FROM LISTING 'LAV3818_MISSING' COMMENT = 'CLONE ignored' FROM SHARE missing.share × namespace unchanged -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' COMMENT = 'CLONE ignored' FROM SHARE missing.share] FROM LISTING 'LAV3818_MISSING' COMMENT = 'CLONE ignored' FROM SHARE missing.share × subsequent ordinary CREATE success -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' COMMENT = 'CLONE ignored' FROM SHARE missing.share] FROM LISTING 'LAV3818_MISSING' WITH CONTACT (SUPPORT = contact) CLONE {original} × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH CONTACT (SUPPORT = contact) CLONE {original}] FROM LISTING 'LAV3818_MISSING' WITH CONTACT (SUPPORT = contact) CLONE {original} × destination absent -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH CONTACT (SUPPORT = contact) CLONE {original}] FROM LISTING 'LAV3818_MISSING' WITH CONTACT (SUPPORT = contact) CLONE {original} × namespace unchanged -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH CONTACT (SUPPORT = contact) CLONE {original}] FROM LISTING 'LAV3818_MISSING' WITH CONTACT (SUPPORT = contact) CLONE {original} × subsequent ordinary CREATE success -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH CONTACT (SUPPORT = contact) CLONE {original}] FROM LISTING 'LAV3818_MISSING' WITH CONTACT (SUPPORT = contact) FROM LISTING 'OTHER_MISSING' × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH CONTACT (SUPPORT = contact) FROM LISTING 'OTHER_MISSING'] FROM LISTING 'LAV3818_MISSING' WITH CONTACT (SUPPORT = contact) FROM LISTING 'OTHER_MISSING' × destination absent -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH CONTACT (SUPPORT = contact) FROM LISTING 'OTHER_MISSING'] FROM LISTING 'LAV3818_MISSING' WITH CONTACT (SUPPORT = contact) FROM LISTING 'OTHER_MISSING' × namespace unchanged -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH CONTACT (SUPPORT = contact) FROM LISTING 'OTHER_MISSING'] FROM LISTING 'LAV3818_MISSING' WITH CONTACT (SUPPORT = contact) FROM LISTING 'OTHER_MISSING' × subsequent ordinary CREATE success -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH CONTACT (SUPPORT = contact) FROM LISTING 'OTHER_MISSING'] FROM LISTING 'LAV3818_MISSING' WITH CONTACT (SUPPORT = contact) FROM SHARE missing.share × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH CONTACT (SUPPORT = contact) FROM SHARE missing.share] FROM LISTING 'LAV3818_MISSING' WITH CONTACT (SUPPORT = contact) FROM SHARE missing.share × destination absent -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH CONTACT (SUPPORT = contact) FROM SHARE missing.share] FROM LISTING 'LAV3818_MISSING' WITH CONTACT (SUPPORT = contact) FROM SHARE missing.share × namespace unchanged -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH CONTACT (SUPPORT = contact) FROM SHARE missing.share] FROM LISTING 'LAV3818_MISSING' WITH CONTACT (SUPPORT = contact) FROM SHARE missing.share × subsequent ordinary CREATE success -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH CONTACT (SUPPORT = contact) FROM SHARE missing.share] FROM LISTING 'LAV3818_MISSING' WITH TAG ("FROM LISTING" = 'value') CLONE {original} × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH TAG ("FROM LISTING" = 'value') CLONE {original}] FROM LISTING 'LAV3818_MISSING' WITH TAG ("FROM LISTING" = 'value') CLONE {original} × destination absent -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH TAG ("FROM LISTING" = 'value') CLONE {original}] FROM LISTING 'LAV3818_MISSING' WITH TAG ("FROM LISTING" = 'value') CLONE {original} × namespace unchanged -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH TAG ("FROM LISTING" = 'value') CLONE {original}] FROM LISTING 'LAV3818_MISSING' WITH TAG ("FROM LISTING" = 'value') CLONE {original} × subsequent ordinary CREATE success -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH TAG ("FROM LISTING" = 'value') CLONE {original}] FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = $$FROM LISTING 'ignored'$$) FROM LISTING 'OTHER_MISSING' × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = $$FROM LISTING 'ignored'$$) FROM LISTING 'OTHER_MISSING'] FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = $$FROM LISTING 'ignored'$$) FROM LISTING 'OTHER_MISSING' × destination absent -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = $$FROM LISTING 'ignored'$$) FROM LISTING 'OTHER_MISSING'] FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = $$FROM LISTING 'ignored'$$) FROM LISTING 'OTHER_MISSING' × namespace unchanged -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = $$FROM LISTING 'ignored'$$) FROM LISTING 'OTHER_MISSING'] FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = $$FROM LISTING 'ignored'$$) FROM LISTING 'OTHER_MISSING' × subsequent ordinary CREATE success -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = $$FROM LISTING 'ignored'$$) FROM LISTING 'OTHER_MISSING'] FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'FROM SHARE ignored.share') FROM SHARE missing.share × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'FROM SHARE ignored.share') FROM SHARE missing.share] FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'FROM SHARE ignored.share') FROM SHARE missing.share × destination absent -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'FROM SHARE ignored.share') FROM SHARE missing.share] FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'FROM SHARE ignored.share') FROM SHARE missing.share × namespace unchanged -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'FROM SHARE ignored.share') FROM SHARE missing.share] FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'FROM SHARE ignored.share') FROM SHARE missing.share × subsequent ordinary CREATE success -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'FROM SHARE ignored.share') FROM SHARE missing.share] FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'value') CLONE {original} × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'value') CLONE {original}] FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'value') CLONE {original} × destination absent -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'value') CLONE {original}] FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'value') CLONE {original} × namespace unchanged -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'value') CLONE {original}] FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'value') CLONE {original} × subsequent ordinary CREATE success -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'value') CLONE {original}] FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'value') FROM LISTING 'OTHER_MISSING' × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'value') FROM LISTING 'OTHER_MISSING'] FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'value') FROM LISTING 'OTHER_MISSING' × destination absent -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'value') FROM LISTING 'OTHER_MISSING'] FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'value') FROM LISTING 'OTHER_MISSING' × namespace unchanged -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'value') FROM LISTING 'OTHER_MISSING'] FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'value') FROM LISTING 'OTHER_MISSING' × subsequent ordinary CREATE success -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'value') FROM LISTING 'OTHER_MISSING'] FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'value') FROM SHARE missing.share × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'value') FROM SHARE missing.share] FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'value') FROM SHARE missing.share × destination absent -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'value') FROM SHARE missing.share] FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'value') FROM SHARE missing.share × namespace unchanged -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'value') FROM SHARE missing.share] FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'value') FROM SHARE missing.share × subsequent ordinary CREATE success -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'value') FROM SHARE missing.share] FROM SHARE missing.share /* FROM LISTING 'ignored' */ FROM LISTING 'LAV3818_MISSING' × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM SHARE missing.share /* FROM LISTING 'ignored' */ FROM LISTING 'LAV3818_MISSING'] FROM SHARE missing.share /* FROM LISTING 'ignored' */ FROM LISTING 'LAV3818_MISSING' × destination absent -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM SHARE missing.share /* FROM LISTING 'ignored' */ FROM LISTING 'LAV3818_MISSING'] FROM SHARE missing.share /* FROM LISTING 'ignored' */ FROM LISTING 'LAV3818_MISSING' × namespace unchanged -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM SHARE missing.share /* FROM LISTING 'ignored' */ FROM LISTING 'LAV3818_MISSING'] FROM SHARE missing.share /* FROM LISTING 'ignored' */ FROM LISTING 'LAV3818_MISSING' × subsequent ordinary CREATE success -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM SHARE missing.share /* FROM LISTING 'ignored' */ FROM LISTING 'LAV3818_MISSING'] FROM SHARE missing.share COMMENT = 'FROM LISTING ignored' FROM LISTING 'LAV3818_MISSING' × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM SHARE missing.share COMMENT = 'FROM LISTING ignored' FROM LISTING 'LAV3818_MISSING'] FROM SHARE missing.share COMMENT = 'FROM LISTING ignored' FROM LISTING 'LAV3818_MISSING' × destination absent -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM SHARE missing.share COMMENT = 'FROM LISTING ignored' FROM LISTING 'LAV3818_MISSING'] FROM SHARE missing.share COMMENT = 'FROM LISTING ignored' FROM LISTING 'LAV3818_MISSING' × namespace unchanged -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM SHARE missing.share COMMENT = 'FROM LISTING ignored' FROM LISTING 'LAV3818_MISSING'] FROM SHARE missing.share COMMENT = 'FROM LISTING ignored' FROM LISTING 'LAV3818_MISSING' × subsequent ordinary CREATE success -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM SHARE missing.share COMMENT = 'FROM LISTING ignored' FROM LISTING 'LAV3818_MISSING'] FROM SHARE missing.share FROM LISTING 'LAV3818_MISSING' × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM SHARE missing.share FROM LISTING 'LAV3818_MISSING'] FROM SHARE missing.share FROM LISTING 'LAV3818_MISSING' × destination absent -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM SHARE missing.share FROM LISTING 'LAV3818_MISSING'] FROM SHARE missing.share FROM LISTING 'LAV3818_MISSING' × namespace unchanged -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM SHARE missing.share FROM LISTING 'LAV3818_MISSING'] FROM SHARE missing.share FROM LISTING 'LAV3818_MISSING' × subsequent ordinary CREATE success -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_conflicting_sources[FROM SHARE missing.share FROM LISTING 'LAV3818_MISSING'] CREATE DATABASE IF NOT EXISTS LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' × captured 002003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE IF NOT EXISTS LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING'] CREATE DATABASE LAV3818_IMPORT FROM LISTING "LAV3818.MISSING" × captured 002003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING "LAV3818.MISSING"] CREATE DATABASE LAV3818_IMPORT FROM LISTING "LAV3818_MISSING" × captured 002003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING "LAV3818_MISSING"] CREATE DATABASE LAV3818_IMPORT FROM LISTING "Lav3818_Mixed" × captured 002003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING "Lav3818_Mixed"] CREATE DATABASE LAV3818_IMPORT FROM LISTING '1lav3818' × captured 000904 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING '1lav3818'] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' COMMENT = 'x' garbage × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' COMMENT = 'x' garbage] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' COMMENT = 'x' × captured 002003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' COMMENT = 'x'] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' COMMENT = 123 × captured 001008 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' COMMENT = 123] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' COMMENT = × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' COMMENT =] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' COMMENT × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' COMMENT] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' FROM LISTING 'OTHER_MISSING' × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' FROM LISTING 'OTHER_MISSING'] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' FROM SHARE missing.share × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' FROM SHARE missing.share] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' garbage = 1 × captured 001420 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' garbage = 1] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' garbage = × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' garbage =] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' garbage × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' garbage] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING'; × captured 002003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING';] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'invalid-name' garbage × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'invalid-name' garbage] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'lav3818 missing' × captured 000904 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'lav3818 missing'] CREATE DATABASE LAV3818_IMPORT FROM LISTING 'unterminated × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 'unterminated] CREATE DATABASE LAV3818_IMPORT FROM LISTING ('LAV3818_MISSING') × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING ('LAV3818_MISSING')] CREATE DATABASE LAV3818_IMPORT FROM LISTING /* comment */ 'LAV3818_MISSING' -- tail × captured 002003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING /* comment */ 'LAV3818_MISSING' -- tail] CREATE DATABASE LAV3818_IMPORT FROM LISTING 123 × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING 123] CREATE DATABASE LAV3818_IMPORT FROM LISTING LAV3818_MISSING × captured 002003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING LAV3818_MISSING] CREATE DATABASE LAV3818_IMPORT FROM LISTING NULL × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING NULL] CREATE DATABASE LAV3818_IMPORT FROM LISTING × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE DATABASE LAV3818_IMPORT FROM LISTING] CREATE OR REPLACE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' × captured 002003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE OR REPLACE DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING'] CREATE TRANSIENT DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING' × captured 002003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_grammar[CREATE TRANSIENT DATABASE LAV3818_IMPORT FROM LISTING 'LAV3818_MISSING'] FROM LISTING 'LAV3818_MISSING' COMMENT = $$CLONE missing$$ × captured 002003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_lexical_options[FROM LISTING 'LAV3818_MISSING' COMMENT = $$CLONE missing$$] FROM LISTING 'LAV3818_MISSING' WITH CONTACT (SUPPORT = "FROM LISTING") × captured 002003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_lexical_options[FROM LISTING 'LAV3818_MISSING' WITH CONTACT (SUPPORT = "FROM LISTING")] FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = $$FROM LISTING 'OTHER_MISSING'$$) × captured 002003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_lexical_options[FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = $$FROM LISTING 'OTHER_MISSING'$$)] FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = $tag$FROM SHARE missing.share$tag$) FROM SHARE missing.share × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_lexical_options[FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = $tag$FROM SHARE missing.share$tag$) FROM SHARE missing.share] FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'FROM SHARE missing.share') × captured 002003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_lexical_options[FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = 'FROM SHARE missing.share')] FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = E'FROM SHARE missing.share') FROM SHARE missing.share × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_lexical_options[FROM LISTING 'LAV3818_MISSING' WITH TAG (tag = E'FROM SHARE missing.share') FROM SHARE missing.share] FROM LISTING E'LAV3818_MISSING' × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_lexical_options[FROM LISTING E'LAV3818_MISSING'] $$Lav3818_Missing$$ × captured 002003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_missing[$$Lav3818_Missing$$] $listing$Lav3818_Missing$listing$ × captured 001003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_missing[$listing$Lav3818_Missing$listing$] '' × captured 000904 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_missing[''] 'LAV3818_MISSING_LISTING' × captured 002003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_missing['LAV3818_MISSING_LISTING'] 'Lav3818_Global$Name' × captured 002003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_missing['Lav3818_Global$Name'] 'Lav3818_MixedCase' × captured 002003 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_missing['Lav3818_MixedCase'] 'lav3818''missing' × captured 000904 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_missing['lav3818''missing'] 'lav3818.missing-listing:global/name' × captured 000904 -> tests/queries/ddl/test_database_from_listing.py::test_database_from_listing_missing['lav3818.missing-listing:global/name'] test_database_listing_keyword_is_not_a_clause × captured result -> tests/queries/ddl/test_database_from_listing.py::test_database_listing_keyword_is_not_a_clause Ordinary CREATE with database parameters × success -> tests/queries/ddl/test_database_parameters.py::test_create_database_with_params Authorized SHARE mount × success -> tests/queries/ddl/test_share_mounts.py::test_share_mount_end_to_end Missing SHARE × complete error -> tests/queries/ddl/test_share_mounts.py::test_share_mount_nonexistent_share FROM BACKUP SET × restore success -> tests/queries/ddl/test_container_backups.py::test_database_backup_and_restore FROM BACKUP SET × restore rejection -> tests/queries/ddl/test_container_backups.py::test_container_restore_reject_matrix --------- Co-authored-by: spiral <spiral@localhost> Co-authored-by: Przemek Denkiewicz <przemyslaw.denkiewicz@localstack.cloud>
1 parent e2b779d commit 19e434f

4 files changed

Lines changed: 41 additions & 2 deletions

File tree

‎src/ast/helpers/stmt_create_database.rs‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ pub struct CreateDatabaseBuilder {
105105
pub with_contacts: Option<Vec<ContactEntry>>,
106106
/// Optional `FROM SHARE <share>` source.
107107
pub from_share: Option<ObjectName>,
108+
/// Global name of an imported data exchange listing.
109+
pub from_listing: Option<String>,
108110
}
109111

110112
impl CreateDatabaseBuilder {
@@ -138,6 +140,7 @@ impl CreateDatabaseBuilder {
138140
with_tags: None,
139141
with_contacts: None,
140142
from_share: None,
143+
from_listing: None,
141144
}
142145
}
143146

@@ -311,6 +314,7 @@ impl CreateDatabaseBuilder {
311314
with_tags: self.with_tags,
312315
with_contacts: self.with_contacts,
313316
from_share: self.from_share,
317+
from_listing: self.from_listing,
314318
}
315319
}
316320
}
@@ -344,6 +348,7 @@ impl TryFrom<Statement> for CreateDatabaseBuilder {
344348
with_tags,
345349
with_contacts,
346350
from_share,
351+
from_listing,
347352
} => Ok(Self {
348353
db_name,
349354
if_not_exists,
@@ -368,6 +373,7 @@ impl TryFrom<Statement> for CreateDatabaseBuilder {
368373
with_tags,
369374
with_contacts,
370375
from_share,
376+
from_listing,
371377
}),
372378
_ => Err(ParserError::ParserError(format!(
373379
"Expected create database statement, but received: {stmt}"

‎src/ast/mod.rs‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5016,6 +5016,8 @@ pub enum Statement {
50165016
with_contacts: Option<Vec<ContactEntry>>,
50175017
/// `FROM SHARE <share>` — creates a database from a share.
50185018
from_share: Option<ObjectName>,
5019+
/// Global name of an imported data exchange listing.
5020+
from_listing: Option<String>,
50195021
},
50205022
/// ```sql
50215023
/// CREATE FUNCTION
@@ -7815,6 +7817,7 @@ impl fmt::Display for Statement {
78157817
with_tags,
78167818
with_contacts,
78177819
from_share,
7820+
from_listing,
78187821
} => {
78197822
write!(
78207823
f,
@@ -7837,6 +7840,13 @@ impl fmt::Display for Statement {
78377840
if let Some(share) = from_share {
78387841
write!(f, " FROM SHARE {share}")?;
78397842
}
7843+
if let Some(listing) = from_listing {
7844+
write!(
7845+
f,
7846+
" FROM LISTING '{}'",
7847+
value::escape_single_quote_string(listing)
7848+
)?;
7849+
}
78407850

78417851
if let Some(value) = data_retention_time_in_days {
78427852
write!(f, " DATA_RETENTION_TIME_IN_DAYS = {value}")?;

‎src/dialect/snowflake.rs‎

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3294,8 +3294,30 @@ pub fn parse_create_database(
32943294
builder = builder.clone_clause(Some(parser.parse_object_name(false)?));
32953295
}
32963296
Keyword::FROM => {
3297-
parser.expect_keyword(Keyword::SHARE)?;
3298-
builder = builder.from_share(Some(parser.parse_object_name(false)?));
3297+
if parser.parse_keyword(Keyword::LISTING) {
3298+
let listing = if matches!(parser.peek_token().token, Token::Word(_)) {
3299+
let ident = parser.parse_identifier()?;
3300+
let mut characters = ident.value.chars();
3301+
let unquoted = characters.next().is_some_and(|character| {
3302+
character.is_ascii_alphabetic() || character == '_'
3303+
}) && characters.all(|character| {
3304+
character.is_ascii_alphanumeric() || matches!(character, '_' | '$')
3305+
});
3306+
if ident.quote_style.is_some()
3307+
&& (!unquoted || ident.value != ident.value.to_uppercase())
3308+
{
3309+
ident.to_string()
3310+
} else {
3311+
ident.value.to_uppercase()
3312+
}
3313+
} else {
3314+
parser.parse_literal_string()?.to_uppercase()
3315+
};
3316+
builder.from_listing = Some(listing);
3317+
} else {
3318+
parser.expect_keyword(Keyword::SHARE)?;
3319+
builder = builder.from_share(Some(parser.parse_object_name(false)?));
3320+
}
32993321
}
33003322
Keyword::DATA_RETENTION_TIME_IN_DAYS => {
33013323
parser.expect_token(&Token::Eq)?;

‎src/parser/mod.rs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6667,6 +6667,7 @@ impl<'a> Parser<'a> {
66676667
with_tags: None,
66686668
with_contacts: None,
66696669
from_share,
6670+
from_listing: None,
66706671
})
66716672
}
66726673

0 commit comments

Comments
 (0)