Skip to content

Commit 1af2a12

Browse files
localstack-spiral[bot]spiralsabir-akhadov-localstack
authored
LAV-4506: Flaky tests: 4 in tests/queries/access_control/test_caller_grants_direct.py +2 more files (Compat tests (shard 3/8)) (#4684)
* LAV-4506: keep container OFFSET anchors stable across DDL retries Co-authored-by: Sabir Akhadov <sabir.akhadov@localstack.cloud> ## Root causes The shard-3 artifacts from run 38521189703 show three distinct manifestations of dependency-DAG / RBAC lock congestion, not a poisoned pool or leaked setting. - The caller-grants CREATE VIEW timed out at 06:32:36.019 while waiting on advisory key (6850687, 0), held by backend 9686 in __snowflake$enter_executable_context_with_namespace_usage. The run was built at 86e4d2d0, before fdb1398e9 (LAV-4456) registered the pooled context-entry operations as healthy blockers. That merged fix already handles this exact cause; retain it rather than duplicate it. Replay the caller file and the staged procedure-context blocker regression, including the original drop nodeid, to verify the existing fix. - The ordinary and mixed DATABASE clones began at 06:34:07.926 and 06:34:13.886, hit the internal DDL lock bound, retried, and completed after 06:35:02. Each retry evaluated statement_timestamp() again, moving OFFSET => -30 past the source UPDATE and cloning 11/12 instead of 1/2. Freeze raw DDL OFFSET's wall-clock base in the transformed AST, so all backend attempts use the same anchor. Do not use the simulated scheduling clock. Ordinary gated query anchors still use the executing statement's timestamp. - The SCHEMA test updated EARLY at 06:34:27.406, then its CREATE TABLE LATE waited until 06:35:03. Its clone only began at 06:35:03.359, so the fixed -30 offset already pointed past the UPDATE before its first attempt. Both affected fixtures now derive a constant integer offset from the recorded pre-mutation timestamp immediately before cloning, rather than assuming all post-mutation DDL fits in 30 seconds. Round toward the past, preserving the fixture's one-second gaps on either side of that timestamp and its constant arithmetic OFFSET coverage. The original expected results are unchanged. Add four real-Snowflake snapshot regressions (DATABASE/SCHEMA x AT/BEFORE). Stage a restricted procedure's context-entry transaction holding the DAG key while waiting on RBAC, then submit a constant OFFSET clone and hold it through multiple four-second attempts. Snapshot the exact CALL, clone status, historical rows, and clone independence. The unfixed production code reproduced the reported 1/2 -> 11/12 mismatch locally. Wait for the isolated account's live retention holder before creating the source, so the test never asks for history older than that account's actual horizon. Swept both raw-anchor call sites: container cloning and CREATE STREAM seeds share the frozen base. Replayed the stream OFFSET, TIMESTAMP and STATEMENT seed contracts; gated query anchors remain execution-relative. No snapshots were captured from the emulator and no existing assertion was weakened. ## Observed CI failures ### tests/queries/access_control/test_caller_grants_direct.py::test_caller_temporary_shadow_view_lifecycle[drop]@caller_account_grants_empty_database ``` db_execute = <function db_execute.<locals>._execute at 0x7f5d87e5f880> request = <FixtureRequest for <Function test_caller_temporary_shadow_view_lifecycle[drop]>> run_snapshot_test = <function run_snapshot_test.<locals>._run at 0x7f5d87e5ee80> add_cleanup_query = <function add_cleanup_query.<locals>._cleanup at 0x7f5d87e5e5c0> register_identifier = <function register_identifier.<locals>._register at 0x7f5d87ef93a0> operation = 'drop' @pytest.mark.parametrize("operation", ["drop", "replace", "rename"]) @pytest.mark.xdist_group("caller_account_grants") def test_caller_temporary_shadow_view_lifecycle( db_execute, request, run_snapshot_test, add_cleanup_query, register_identifier, operation, ): suffix = short_uid().upper() view, renamed, role = ( f"CG_TEMP_VIEW_{suffix}", f"CG_MOVED_{suffix}", f"CG_ROLE_{suffix}", ) for name in (view, renamed, role): register_identifier(name, case_insensitive=True) db_execute(f"CREATE ROLE {role}") add_cleanup_query(f"DROP ROLE IF EXISTS {role}") > db_execute(f"CREATE VIEW {view} AS SELECT 7 AS v") tests/queries/access_control/test_caller_grants_direct.py:423: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/conftest.py:1108: in _execute cursor.execute(*args, **kwargs) tests/conftest.py:310: in execute return original(self, command, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/conftest.py:310: in execute return original(self, command, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .venv/lib/python3.12/site-packages/snowflake/connector/cursor.py:1142: in execute Error.errorhandler_wrapper(self.connection, self, error_class, errvalue) .venv/lib/python3.12/site-packages/snowflake/connector/errors.py:298: in errorhandler_wrapper handed_over = Error.hand_to_other_handler( .venv/lib/python3.12/site-packages/snowflake/connector/errors.py:354: in hand_to_other_handler cursor.errorhandler(connection, cursor, error_class, error_value) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ connection = <snowflake.connector.connection.SnowflakeConnection object at 0x7f5d98fe83e0> cursor = <snowflake.connector.cursor.SnowflakeCursor object at 0x7f5d87e22d50> error_class = <class 'snowflake.connector.errors.ProgrammingError'> error_value = {'msg': 'Statement reached its lock timeout and was canceled.', 'errno': 627, 'sqlstate': '57014', 'sfqid': 'e2ffbeec-e355-4e91-a4e1-b9a0fdc65cbb', ...} @staticmethod def default_errorhandler( connection: SnowflakeConnection, cursor: SnowflakeCursor, error_class: type[Error], error_value: dict[str, str], ) -> None: """Default error handler that raises an error. Args: connection: Connections in which the error happened. cursor: Cursor in which the error happened. error_class: Class of error that needs handling. error_value: A dictionary of the error details. Raises: A Snowflake error. """ errno = error_value.get("errno") done_format_msg = error_value.get("done_format_msg") > raise error_class( msg=error_value.get("msg"), errno=None if errno is None else int(errno), sqlstate=error_value.get("sqlstate"), sfqid=error_value.get("sfqid"), query=error_value.get("query"), done_format_msg=( None if done_format_msg is None else bool(done_format_msg) ), connection=connection, cursor=cursor, ) E snowflake.connector.errors.ProgrammingError: 000627 (57014): Statement reached its lock timeout and was canceled. .venv/lib/python3.12/site-packages/snowflake/connector/errors.py:229: ProgrammingError ``` ### tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[True-OFFSET-BEFORE-SCHEMA] ``` >> match key: rows-0 (~) /[0]/[0] 1 → 11 ... (expected → actual) (~) /[1]/[0] 2 → 12 ... (expected → actual) >> match key: independent-0 (~) /[0]/[0] 1 → 11 ... (expected → actual) (~) /[1]/[0] 2 → 12 ... (expected → actual) ``` ### tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-OFFSET-AT-ordinary-DATABASE] ``` >> match key: rows (~) /[0]/[0] 1 → 11 ... (expected → actual) (~) /[1]/[0] 2 → 12 ... (expected → actual) ``` ### tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-OFFSET-AT-mixed-DATABASE] ``` >> match key: rows (~) /[0]/[0] 1 → 11 ... (expected → actual) (~) /[1]/[0] 2 → 12 ... (expected → actual) ``` ## Deterministic local reproduction before the production fix make test-compat PYTEST_PATH='tests/queries/ddl/test_container_time_travel.py::test_container_offset_clone_waits_for_procedure_context[AT-DATABASE]' PYTEST_XDIST_ARGS='' ``` >> match key: rows (~) /[0]/[0] 1 → 11 ... (expected → actual) (~) /[1]/[0] 2 → 12 ... (expected → actual) >> match key: independent (~) /[0]/[0] 1 → 11 ... (expected → actual) (~) /[1]/[0] 2 → 12 ... (expected → actual) ``` The local emulator log recorded healthy-blocker retries at 07:16:46.869 and 07:16:50.905 while the same statement was waiting for its staged DAG holder. test_edit_waiver: tests/queries/access_control/test_caller_grants_direct.py, tests/queries/ddl/test_container_time_travel.py, tests/queries/ddl/test_container_clone_hybrid_history.py ## Test matrix DATABASE x AT x TIMESTAMP x replace=False x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[False-TIMESTAMP-AT-DATABASE] DATABASE x AT x TIMESTAMP x replace=True x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[True-TIMESTAMP-AT-DATABASE] DATABASE x AT x OFFSET x replace=False x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[False-OFFSET-AT-DATABASE] DATABASE x AT x OFFSET x replace=True x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[True-OFFSET-AT-DATABASE] DATABASE x AT x STATEMENT x replace=False x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[False-STATEMENT-AT-DATABASE] DATABASE x AT x STATEMENT x replace=True x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[True-STATEMENT-AT-DATABASE] DATABASE x BEFORE x TIMESTAMP x replace=False x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[False-TIMESTAMP-BEFORE-DATABASE] DATABASE x BEFORE x TIMESTAMP x replace=True x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[True-TIMESTAMP-BEFORE-DATABASE] DATABASE x BEFORE x OFFSET x replace=False x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[False-OFFSET-BEFORE-DATABASE] DATABASE x BEFORE x OFFSET x replace=True x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[True-OFFSET-BEFORE-DATABASE] DATABASE x BEFORE x STATEMENT x replace=False x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[False-STATEMENT-BEFORE-DATABASE] DATABASE x BEFORE x STATEMENT x replace=True x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[True-STATEMENT-BEFORE-DATABASE] SCHEMA x AT x TIMESTAMP x replace=False x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[False-TIMESTAMP-AT-SCHEMA] SCHEMA x AT x TIMESTAMP x replace=True x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[True-TIMESTAMP-AT-SCHEMA] SCHEMA x AT x OFFSET x replace=False x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[False-OFFSET-AT-SCHEMA] SCHEMA x AT x OFFSET x replace=True x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[True-OFFSET-AT-SCHEMA] SCHEMA x AT x STATEMENT x replace=False x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[False-STATEMENT-AT-SCHEMA] SCHEMA x AT x STATEMENT x replace=True x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[True-STATEMENT-AT-SCHEMA] SCHEMA x BEFORE x TIMESTAMP x replace=False x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[False-TIMESTAMP-BEFORE-SCHEMA] SCHEMA x BEFORE x TIMESTAMP x replace=True x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[True-TIMESTAMP-BEFORE-SCHEMA] SCHEMA x BEFORE x OFFSET x replace=False x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[False-OFFSET-BEFORE-SCHEMA] SCHEMA x BEFORE x OFFSET x replace=True x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[True-OFFSET-BEFORE-SCHEMA] SCHEMA x BEFORE x STATEMENT x replace=False x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[False-STATEMENT-BEFORE-SCHEMA] SCHEMA x BEFORE x STATEMENT x replace=True x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[True-STATEMENT-BEFORE-SCHEMA] DATABASE x ordinary source x AT x TIMESTAMP x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-TIMESTAMP-AT-ordinary-DATABASE] DATABASE x ordinary source x AT x TIMESTAMP x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-TIMESTAMP-AT-ordinary-DATABASE] DATABASE x ordinary source x AT x OFFSET x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-OFFSET-AT-ordinary-DATABASE] DATABASE x ordinary source x AT x OFFSET x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-OFFSET-AT-ordinary-DATABASE] DATABASE x ordinary source x AT x STATEMENT x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-STATEMENT-AT-ordinary-DATABASE] DATABASE x ordinary source x AT x STATEMENT x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-STATEMENT-AT-ordinary-DATABASE] DATABASE x ordinary source x BEFORE x TIMESTAMP x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-TIMESTAMP-BEFORE-ordinary-DATABASE] DATABASE x ordinary source x BEFORE x TIMESTAMP x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-TIMESTAMP-BEFORE-ordinary-DATABASE] DATABASE x ordinary source x BEFORE x OFFSET x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-OFFSET-BEFORE-ordinary-DATABASE] DATABASE x ordinary source x BEFORE x OFFSET x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-OFFSET-BEFORE-ordinary-DATABASE] DATABASE x ordinary source x BEFORE x STATEMENT x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-STATEMENT-BEFORE-ordinary-DATABASE] DATABASE x ordinary source x BEFORE x STATEMENT x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-STATEMENT-BEFORE-ordinary-DATABASE] DATABASE x hybrid source x AT x TIMESTAMP x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-TIMESTAMP-AT-hybrid-DATABASE] DATABASE x hybrid source x AT x TIMESTAMP x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-TIMESTAMP-AT-hybrid-DATABASE] DATABASE x hybrid source x AT x OFFSET x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-OFFSET-AT-hybrid-DATABASE] DATABASE x hybrid source x AT x OFFSET x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-OFFSET-AT-hybrid-DATABASE] DATABASE x hybrid source x AT x STATEMENT x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-STATEMENT-AT-hybrid-DATABASE] DATABASE x hybrid source x AT x STATEMENT x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-STATEMENT-AT-hybrid-DATABASE] DATABASE x hybrid source x BEFORE x TIMESTAMP x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-TIMESTAMP-BEFORE-hybrid-DATABASE] DATABASE x hybrid source x BEFORE x TIMESTAMP x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-TIMESTAMP-BEFORE-hybrid-DATABASE] DATABASE x hybrid source x BEFORE x OFFSET x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-OFFSET-BEFORE-hybrid-DATABASE] DATABASE x hybrid source x BEFORE x OFFSET x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-OFFSET-BEFORE-hybrid-DATABASE] DATABASE x hybrid source x BEFORE x STATEMENT x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-STATEMENT-BEFORE-hybrid-DATABASE] DATABASE x hybrid source x BEFORE x STATEMENT x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-STATEMENT-BEFORE-hybrid-DATABASE] DATABASE x mixed source x AT x TIMESTAMP x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-TIMESTAMP-AT-mixed-DATABASE] DATABASE x mixed source x AT x TIMESTAMP x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-TIMESTAMP-AT-mixed-DATABASE] DATABASE x mixed source x AT x OFFSET x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-OFFSET-AT-mixed-DATABASE] DATABASE x mixed source x AT x OFFSET x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-OFFSET-AT-mixed-DATABASE] DATABASE x mixed source x AT x STATEMENT x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-STATEMENT-AT-mixed-DATABASE] DATABASE x mixed source x AT x STATEMENT x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-STATEMENT-AT-mixed-DATABASE] DATABASE x mixed source x BEFORE x TIMESTAMP x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-TIMESTAMP-BEFORE-mixed-DATABASE] DATABASE x mixed source x BEFORE x TIMESTAMP x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-TIMESTAMP-BEFORE-mixed-DATABASE] DATABASE x mixed source x BEFORE x OFFSET x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-OFFSET-BEFORE-mixed-DATABASE] DATABASE x mixed source x BEFORE x OFFSET x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-OFFSET-BEFORE-mixed-DATABASE] DATABASE x mixed source x BEFORE x STATEMENT x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-STATEMENT-BEFORE-mixed-DATABASE] DATABASE x mixed source x BEFORE x STATEMENT x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-STATEMENT-BEFORE-mixed-DATABASE] SCHEMA x ordinary source x AT x TIMESTAMP x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-TIMESTAMP-AT-ordinary-SCHEMA] SCHEMA x ordinary source x AT x TIMESTAMP x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-TIMESTAMP-AT-ordinary-SCHEMA] SCHEMA x ordinary source x AT x OFFSET x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-OFFSET-AT-ordinary-SCHEMA] SCHEMA x ordinary source x AT x OFFSET x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-OFFSET-AT-ordinary-SCHEMA] SCHEMA x ordinary source x AT x STATEMENT x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-STATEMENT-AT-ordinary-SCHEMA] SCHEMA x ordinary source x AT x STATEMENT x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-STATEMENT-AT-ordinary-SCHEMA] SCHEMA x ordinary source x BEFORE x TIMESTAMP x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-TIMESTAMP-BEFORE-ordinary-SCHEMA] SCHEMA x ordinary source x BEFORE x TIMESTAMP x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-TIMESTAMP-BEFORE-ordinary-SCHEMA] SCHEMA x ordinary source x BEFORE x OFFSET x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-OFFSET-BEFORE-ordinary-SCHEMA] SCHEMA x ordinary source x BEFORE x OFFSET x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-OFFSET-BEFORE-ordinary-SCHEMA] SCHEMA x ordinary source x BEFORE x STATEMENT x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-STATEMENT-BEFORE-ordinary-SCHEMA] SCHEMA x ordinary source x BEFORE x STATEMENT x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-STATEMENT-BEFORE-ordinary-SCHEMA] SCHEMA x hybrid source x AT x TIMESTAMP x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-TIMESTAMP-AT-hybrid-SCHEMA] SCHEMA x hybrid source x AT x TIMESTAMP x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-TIMESTAMP-AT-hybrid-SCHEMA] SCHEMA x hybrid source x AT x OFFSET x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-OFFSET-AT-hybrid-SCHEMA] SCHEMA x hybrid source x AT x OFFSET x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-OFFSET-AT-hybrid-SCHEMA] SCHEMA x hybrid source x AT x STATEMENT x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-STATEMENT-AT-hybrid-SCHEMA] SCHEMA x hybrid source x AT x STATEMENT x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-STATEMENT-AT-hybrid-SCHEMA] SCHEMA x hybrid source x BEFORE x TIMESTAMP x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-TIMESTAMP-BEFORE-hybrid-SCHEMA] SCHEMA x hybrid source x BEFORE x TIMESTAMP x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-TIMESTAMP-BEFORE-hybrid-SCHEMA] SCHEMA x hybrid source x BEFORE x OFFSET x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-OFFSET-BEFORE-hybrid-SCHEMA] SCHEMA x hybrid source x BEFORE x OFFSET x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-OFFSET-BEFORE-hybrid-SCHEMA] SCHEMA x hybrid source x BEFORE x STATEMENT x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-STATEMENT-BEFORE-hybrid-SCHEMA] SCHEMA x hybrid source x BEFORE x STATEMENT x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-STATEMENT-BEFORE-hybrid-SCHEMA] SCHEMA x mixed source x AT x TIMESTAMP x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-TIMESTAMP-AT-mixed-SCHEMA] SCHEMA x mixed source x AT x TIMESTAMP x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-TIMESTAMP-AT-mixed-SCHEMA] SCHEMA x mixed source x AT x OFFSET x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-OFFSET-AT-mixed-SCHEMA] SCHEMA x mixed source x AT x OFFSET x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-OFFSET-AT-mixed-SCHEMA] SCHEMA x mixed source x AT x STATEMENT x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-STATEMENT-AT-mixed-SCHEMA] SCHEMA x mixed source x AT x STATEMENT x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-STATEMENT-AT-mixed-SCHEMA] SCHEMA x mixed source x BEFORE x TIMESTAMP x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-TIMESTAMP-BEFORE-mixed-SCHEMA] SCHEMA x mixed source x BEFORE x TIMESTAMP x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-TIMESTAMP-BEFORE-mixed-SCHEMA] SCHEMA x mixed source x BEFORE x OFFSET x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-OFFSET-BEFORE-mixed-SCHEMA] SCHEMA x mixed source x BEFORE x OFFSET x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-OFFSET-BEFORE-mixed-SCHEMA] SCHEMA x mixed source x BEFORE x STATEMENT x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-STATEMENT-BEFORE-mixed-SCHEMA] SCHEMA x mixed source x BEFORE x STATEMENT x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-STATEMENT-BEFORE-mixed-SCHEMA] DATABASE x AT x constant OFFSET x multiple healthy-blocker retries -> tests/queries/ddl/test_container_time_travel.py::test_container_offset_clone_waits_for_procedure_context[AT-DATABASE] DATABASE x BEFORE x constant OFFSET x multiple healthy-blocker retries -> tests/queries/ddl/test_container_time_travel.py::test_container_offset_clone_waits_for_procedure_context[BEFORE-DATABASE] DATABASE x unknown anchor error x exact recorded rejection -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone_error[unknown-DATABASE] DATABASE x ddl anchor error x exact recorded rejection -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone_error[ddl-DATABASE] DATABASE x null anchor error x exact recorded rejection -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone_error[null-DATABASE] DATABASE x old anchor error x exact recorded rejection -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone_error[old-DATABASE] SCHEMA x AT x constant OFFSET x multiple healthy-blocker retries -> tests/queries/ddl/test_container_time_travel.py::test_container_offset_clone_waits_for_procedure_context[AT-SCHEMA] SCHEMA x BEFORE x constant OFFSET x multiple healthy-blocker retries -> tests/queries/ddl/test_container_time_travel.py::test_container_offset_clone_waits_for_procedure_context[BEFORE-SCHEMA] SCHEMA x unknown anchor error x exact recorded rejection -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone_error[unknown-SCHEMA] SCHEMA x ddl anchor error x exact recorded rejection -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone_error[ddl-SCHEMA] SCHEMA x null anchor error x exact recorded rejection -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone_error[null-SCHEMA] SCHEMA x old anchor error x exact recorded rejection -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone_error[old-SCHEMA] DATABASE/SCHEMA x current OFFSET=0 x retention clause boundary -> tests/queries/ddl/test_container_time_travel.py::test_container_clone_current_anchor_retention_clause DATABASE/SCHEMA x unanchored clone x retention clause boundary -> tests/queries/ddl/test_container_time_travel.py::test_container_clone_unanchored_retention_clause DATABASE/SCHEMA x hybrid/retention selection errors and atomic preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_retention_selection CREATE STREAM x OFFSET=0 seed boundary -> tests/queries/test_streams.py::test_stream_seed_offset_key_deferred CREATE STREAM x TIMESTAMP seed -> tests/queries/test_streams.py::test_stream_seed_timestamp_key_deferred CREATE STREAM x STATEMENT seed -> tests/queries/test_streams.py::test_stream_seed_statement_key_deferred CREATE VIEW x healthy context-entry congestion x temporary-shadow drop -> tests/queries/access_control/test_caller_grants_direct.py::test_caller_temporary_shadow_view_lifecycle[drop] Temporary-shadow replace/rename x permanent view and caller grants retained -> tests/queries/access_control/test_caller_grants_direct.py::test_caller_temporary_shadow_view_lifecycle DROP TABLE x registered procedure context-entry blocker x successful retry -> tests/queries/ddl/test_async_stmt_ddl_wait.py::test_drop_waits_for_procedure_context_entry DDL x registered healthy blocker x successful bounded-attempt retry -> tests/queries/ddl/test_dependent_view_concurrency.py::test_ddl_waiter_behind_in_flight_emulator_statement_retries DDL x foreign blocker x exact first-bound 000627 error -> tests/queries/ddl/test_dependent_view_concurrency.py::test_ddl_waiter_behind_foreign_blocker_surfaces_000627 ## Verification - make check: passed after the final source and fixture edits, and again before commit. - Four-worker focused broad replay: 401 passed. Covers both full container files, the full caller-grants direct file, the existing procedure-context blocker regression, and stream OFFSET/TIMESTAMP/STATEMENT seed contracts. - Serial --keep-duplicates replay: 20 passed, five separate executions of every reported nodeid. No failure reruns were enabled. Duplicate nodeids collapse under xdist's loadgroup scheduler, so serial execution was used to verify the actual five repetitions rather than count scheduled items. - Focused concurrency replay: 11 passed, including all four new staged clone cases and both healthy/foreign DDL-blocker contracts. A later focused four-worker replay of the final fixtures also passed all eight selected cases. - TEST_TARGET=SNOWFLAKE_CLOUD / --snapshot-update / PYTEST_XDIST_ARGS='': all four new regressions passed and captured the new snapshots. The three original OFFSET failure cases were also captured with the final constant elapsed-time offsets: all passed, and their recorded-content matches the existing snapshots exactly (only capture dates changed). - An initial broad replay exposed one new-fixture horizon setup race (000707), corrected by observing the actual retention holder before creating source data; the final broad replay passed all 401 cases. - git diff --check: passed. No .spiral/check.sh or slow full-suite gate run; the driver's post-turn gate remains untouched. * LAV-4506: make OFFSET fixtures and stored-body anchors deterministic Stored SQL must defer raw DDL OFFSET bases until CALL, while ordinary DDL retains the request's frozen base across backend retries. Thread the context through both raw-anchor consumers and mark reusable procedure statements at their generic transform_inner call. Anonymous submissions remain request-pinned. Replace the two separate-query elapsed-time OFFSET estimators with a pending source UPDATE transaction and a distinct cloning connection. The historical rows cannot advance while clone submission is delayed. Commit after cloning; for OFFSET only, create LATE afterward. TIMESTAMP/STATEMENT still exercise historical exclusion of already-created LATE objects. Existing snapshots and assertions retain their recorded content. The four lock-staged regressions now use OFFSET 0 and commit the pending source mutation after observing an actual clone lock wait. Observe three distinct (backend pid, query_start) attempts before releasing the context blocker. Seven-second delays before CALL and clone submission exceed the old six-second fixture window without changing the expected 1/2 historical rows. Capture ten stored-body regressions against real Snowflake: DATABASE/SCHEMA clones and streams on TABLE/VIEW/EXTERNAL TABLE, AT/BEFORE, with committed source changes after procedure creation and again before repeated invocation. Enable change tracking before the TABLE/VIEW mutations, and snapshot their exact post-invocation deltas. External streams recreate their source generation before each CALL and snapshot the exact created result and source metadata; REFRESH_ON_CREATE=FALSE needs no uploaded objects or external-service fixture. Four additional Cloud regressions delay the original OFFSET fixtures' clone submission by three seconds. Re-capture the four staged cases: only their recording dates change, never their expected content. Swept both resolve_raw_anchor consumers and stored/anonymous generic lowering for definition-time freezing; also fixed table/view/external stream seeds; gated query anchors remain execution-relative. Swept both waived OFFSET fixtures and all four staged parameterizations for separate-clock/submission windows; replaced both estimators and the staged mutation ordering. Swept container parser terminators: DATABASE consumed its semicolon, whereas SCHEMA and Iceberg parsing preserve it; fixed DATABASE, leaving EOF behavior intact. The original caller-grants timeout remains accounted for by merged fdb1398e9, which registers context-entry pool work as a healthy blocker. No new retry, skip, xfail, deletion, snapshot weakening, or caller-grants source change. Co-authored-by: Sabir Akhadov <sabir.akhadov@localstack.cloud> ## Observed failures The original CI failure (also quoted in ba5ea71a6) was: snowflake.connector.errors.ProgrammingError: 000627 (57014): Statement reached its lock timeout and was canceled. Its three clone failures reported rows and independent snapshots as: (~) /[0]/[0] 1 -> 11 ... (expected -> actual) (~) /[1]/[0] 2 -> 12 ... (expected -> actual) Read job 115712028248 and downloaded the still-live shard-3 emulator, PostgreSQL and traceback artifacts from run 38521189703 before investigating this round. Disabling only the new stored-body deferral reproduced all eight DATABASE, SCHEMA, TABLE-stream and VIEW-stream AT/BEFORE snapshot failures. For example: test_stored_body_offset_anchor_invocation[BEFORE-SCHEMA] >> match key: rows-0 (~) /[0]/[0] 11 -> 1 ... (expected -> actual) (~) /[1]/[0] 12 -> 2 ... (expected -> actual) >> match key: rows-1 (~) /[0]/[0] 21 -> 1 ... (expected -> actual) (~) /[1]/[0] 22 -> 2 ... (expected -> actual) make test-compat -k stored_body_offset_anchor_invocation: 8 failed. Restoring statement_timestamp() for ordinary DDL while retaining stored-body deferral reproduced all four modified, delayed staged retry regressions: test_container_offset_clone_waits_for_procedure_context[AT-DATABASE] >> match key: rows (~) /[0]/[0] 1 -> 11 ... (expected -> actual) (~) /[1]/[0] 2 -> 12 ... (expected -> actual) The independent snapshot has the same mismatch. Focused four-worker replay: 4 failed. Both temporary production reversions were restored afterward. The DATABASE stored-body tests also exposed a required parser prerequisite: ProgrammingError: 001003 (42000): SQL compilation error: syntax error line 1 at position 100 unexpected 'RETURN'. The database parser had consumed the statement separator before the outer scripting parser could read it. Preserve that token, like the neighboring Iceberg parser, and the captured Snowflake procedure parses and executes. ## Deviations - The hinted generic transform_inner call now lives in render_body_stmt_tail, not transform_body_stmt_inner. Mark deferred anchors at the actual generic body-lowering call so stored statements, including nested ones, share it. - DATABASE stored-body regressions exposed a consumed-semicolon prerequisite. Fix vendor/sqlparser/src/dialect/snowflake.rs so the outer scripting parser receives the terminator; the observed RETURN error uniquely determines it. test_edit_waiver: tests/queries/access_control/test_caller_grants_direct.py, tests/queries/ddl/test_container_time_travel.py, tests/queries/ddl/test_container_clone_hybrid_history.py ## Test matrix DATABASE x AT x TIMESTAMP x replace=False x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[False-TIMESTAMP-AT-DATABASE] DATABASE x AT x TIMESTAMP x replace=True x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[True-TIMESTAMP-AT-DATABASE] DATABASE x AT x OFFSET x replace=False x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[False-OFFSET-AT-DATABASE] DATABASE x AT x OFFSET x replace=True x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[True-OFFSET-AT-DATABASE] DATABASE x AT x STATEMENT x replace=False x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[False-STATEMENT-AT-DATABASE] DATABASE x AT x STATEMENT x replace=True x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[True-STATEMENT-AT-DATABASE] DATABASE x BEFORE x TIMESTAMP x replace=False x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[False-TIMESTAMP-BEFORE-DATABASE] DATABASE x BEFORE x TIMESTAMP x replace=True x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[True-TIMESTAMP-BEFORE-DATABASE] DATABASE x BEFORE x OFFSET x replace=False x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[False-OFFSET-BEFORE-DATABASE] DATABASE x BEFORE x OFFSET x replace=True x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[True-OFFSET-BEFORE-DATABASE] DATABASE x BEFORE x STATEMENT x replace=False x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[False-STATEMENT-BEFORE-DATABASE] DATABASE x BEFORE x STATEMENT x replace=True x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[True-STATEMENT-BEFORE-DATABASE] SCHEMA x AT x TIMESTAMP x replace=False x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[False-TIMESTAMP-AT-SCHEMA] SCHEMA x AT x TIMESTAMP x replace=True x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[True-TIMESTAMP-AT-SCHEMA] SCHEMA x AT x OFFSET x replace=False x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[False-OFFSET-AT-SCHEMA] SCHEMA x AT x OFFSET x replace=True x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[True-OFFSET-AT-SCHEMA] SCHEMA x AT x STATEMENT x replace=False x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[False-STATEMENT-AT-SCHEMA] SCHEMA x AT x STATEMENT x replace=True x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[True-STATEMENT-AT-SCHEMA] SCHEMA x BEFORE x TIMESTAMP x replace=False x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[False-TIMESTAMP-BEFORE-SCHEMA] SCHEMA x BEFORE x TIMESTAMP x replace=True x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[True-TIMESTAMP-BEFORE-SCHEMA] SCHEMA x BEFORE x OFFSET x replace=False x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[False-OFFSET-BEFORE-SCHEMA] SCHEMA x BEFORE x OFFSET x replace=True x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[True-OFFSET-BEFORE-SCHEMA] SCHEMA x BEFORE x STATEMENT x replace=False x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[False-STATEMENT-BEFORE-SCHEMA] SCHEMA x BEFORE x STATEMENT x replace=True x historical rows/membership/independence -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone[True-STATEMENT-BEFORE-SCHEMA] DATABASE x ordinary source x AT x TIMESTAMP x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-TIMESTAMP-AT-ordinary-DATABASE] DATABASE x ordinary source x AT x TIMESTAMP x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-TIMESTAMP-AT-ordinary-DATABASE] DATABASE x ordinary source x AT x OFFSET x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-OFFSET-AT-ordinary-DATABASE] DATABASE x ordinary source x AT x OFFSET x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-OFFSET-AT-ordinary-DATABASE] DATABASE x ordinary source x AT x STATEMENT x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-STATEMENT-AT-ordinary-DATABASE] DATABASE x ordinary source x AT x STATEMENT x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-STATEMENT-AT-ordinary-DATABASE] DATABASE x ordinary source x BEFORE x TIMESTAMP x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-TIMESTAMP-BEFORE-ordinary-DATABASE] DATABASE x ordinary source x BEFORE x TIMESTAMP x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-TIMESTAMP-BEFORE-ordinary-DATABASE] DATABASE x ordinary source x BEFORE x OFFSET x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-OFFSET-BEFORE-ordinary-DATABASE] DATABASE x ordinary source x BEFORE x OFFSET x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-OFFSET-BEFORE-ordinary-DATABASE] DATABASE x ordinary source x BEFORE x STATEMENT x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-STATEMENT-BEFORE-ordinary-DATABASE] DATABASE x ordinary source x BEFORE x STATEMENT x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-STATEMENT-BEFORE-ordinary-DATABASE] DATABASE x hybrid source x AT x TIMESTAMP x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-TIMESTAMP-AT-hybrid-DATABASE] DATABASE x hybrid source x AT x TIMESTAMP x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-TIMESTAMP-AT-hybrid-DATABASE] DATABASE x hybrid source x AT x OFFSET x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-OFFSET-AT-hybrid-DATABASE] DATABASE x hybrid source x AT x OFFSET x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-OFFSET-AT-hybrid-DATABASE] DATABASE x hybrid source x AT x STATEMENT x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-STATEMENT-AT-hybrid-DATABASE] DATABASE x hybrid source x AT x STATEMENT x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-STATEMENT-AT-hybrid-DATABASE] DATABASE x hybrid source x BEFORE x TIMESTAMP x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-TIMESTAMP-BEFORE-hybrid-DATABASE] DATABASE x hybrid source x BEFORE x TIMESTAMP x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-TIMESTAMP-BEFORE-hybrid-DATABASE] DATABASE x hybrid source x BEFORE x OFFSET x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-OFFSET-BEFORE-hybrid-DATABASE] DATABASE x hybrid source x BEFORE x OFFSET x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-OFFSET-BEFORE-hybrid-DATABASE] DATABASE x hybrid source x BEFORE x STATEMENT x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-STATEMENT-BEFORE-hybrid-DATABASE] DATABASE x hybrid source x BEFORE x STATEMENT x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-STATEMENT-BEFORE-hybrid-DATABASE] DATABASE x mixed source x AT x TIMESTAMP x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-TIMESTAMP-AT-mixed-DATABASE] DATABASE x mixed source x AT x TIMESTAMP x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-TIMESTAMP-AT-mixed-DATABASE] DATABASE x mixed source x AT x OFFSET x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-OFFSET-AT-mixed-DATABASE] DATABASE x mixed source x AT x OFFSET x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-OFFSET-AT-mixed-DATABASE] DATABASE x mixed source x AT x STATEMENT x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-STATEMENT-AT-mixed-DATABASE] DATABASE x mixed source x AT x STATEMENT x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-STATEMENT-AT-mixed-DATABASE] DATABASE x mixed source x BEFORE x TIMESTAMP x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-TIMESTAMP-BEFORE-mixed-DATABASE] DATABASE x mixed source x BEFORE x TIMESTAMP x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-TIMESTAMP-BEFORE-mixed-DATABASE] DATABASE x mixed source x BEFORE x OFFSET x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-OFFSET-BEFORE-mixed-DATABASE] DATABASE x mixed source x BEFORE x OFFSET x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-OFFSET-BEFORE-mixed-DATABASE] DATABASE x mixed source x BEFORE x STATEMENT x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-STATEMENT-BEFORE-mixed-DATABASE] DATABASE x mixed source x BEFORE x STATEMENT x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-STATEMENT-BEFORE-mixed-DATABASE] SCHEMA x ordinary source x AT x TIMESTAMP x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-TIMESTAMP-AT-ordinary-SCHEMA] SCHEMA x ordinary source x AT x TIMESTAMP x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-TIMESTAMP-AT-ordinary-SCHEMA] SCHEMA x ordinary source x AT x OFFSET x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-OFFSET-AT-ordinary-SCHEMA] SCHEMA x ordinary source x AT x OFFSET x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-OFFSET-AT-ordinary-SCHEMA] SCHEMA x ordinary source x AT x STATEMENT x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-STATEMENT-AT-ordinary-SCHEMA] SCHEMA x ordinary source x AT x STATEMENT x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-STATEMENT-AT-ordinary-SCHEMA] SCHEMA x ordinary source x BEFORE x TIMESTAMP x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-TIMESTAMP-BEFORE-ordinary-SCHEMA] SCHEMA x ordinary source x BEFORE x TIMESTAMP x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-TIMESTAMP-BEFORE-ordinary-SCHEMA] SCHEMA x ordinary source x BEFORE x OFFSET x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-OFFSET-BEFORE-ordinary-SCHEMA] SCHEMA x ordinary source x BEFORE x OFFSET x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-OFFSET-BEFORE-ordinary-SCHEMA] SCHEMA x ordinary source x BEFORE x STATEMENT x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-STATEMENT-BEFORE-ordinary-SCHEMA] SCHEMA x ordinary source x BEFORE x STATEMENT x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-STATEMENT-BEFORE-ordinary-SCHEMA] SCHEMA x hybrid source x AT x TIMESTAMP x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-TIMESTAMP-AT-hybrid-SCHEMA] SCHEMA x hybrid source x AT x TIMESTAMP x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-TIMESTAMP-AT-hybrid-SCHEMA] SCHEMA x hybrid source x AT x OFFSET x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-OFFSET-AT-hybrid-SCHEMA] SCHEMA x hybrid source x AT x OFFSET x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-OFFSET-AT-hybrid-SCHEMA] SCHEMA x hybrid source x AT x STATEMENT x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-STATEMENT-AT-hybrid-SCHEMA] SCHEMA x hybrid source x AT x STATEMENT x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-STATEMENT-AT-hybrid-SCHEMA] SCHEMA x hybrid source x BEFORE x TIMESTAMP x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-TIMESTAMP-BEFORE-hybrid-SCHEMA] SCHEMA x hybrid source x BEFORE x TIMESTAMP x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-TIMESTAMP-BEFORE-hybrid-SCHEMA] SCHEMA x hybrid source x BEFORE x OFFSET x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-OFFSET-BEFORE-hybrid-SCHEMA] SCHEMA x hybrid source x BEFORE x OFFSET x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-OFFSET-BEFORE-hybrid-SCHEMA] SCHEMA x hybrid source x BEFORE x STATEMENT x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-STATEMENT-BEFORE-hybrid-SCHEMA] SCHEMA x hybrid source x BEFORE x STATEMENT x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-STATEMENT-BEFORE-hybrid-SCHEMA] SCHEMA x mixed source x AT x TIMESTAMP x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-TIMESTAMP-AT-mixed-SCHEMA] SCHEMA x mixed source x AT x TIMESTAMP x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-TIMESTAMP-AT-mixed-SCHEMA] SCHEMA x mixed source x AT x OFFSET x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-OFFSET-AT-mixed-SCHEMA] SCHEMA x mixed source x AT x OFFSET x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-OFFSET-AT-mixed-SCHEMA] SCHEMA x mixed source x AT x STATEMENT x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-STATEMENT-AT-mixed-SCHEMA] SCHEMA x mixed source x AT x STATEMENT x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-STATEMENT-AT-mixed-SCHEMA] SCHEMA x mixed source x BEFORE x TIMESTAMP x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-TIMESTAMP-BEFORE-mixed-SCHEMA] SCHEMA x mixed source x BEFORE x TIMESTAMP x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-TIMESTAMP-BEFORE-mixed-SCHEMA] SCHEMA x mixed source x BEFORE x OFFSET x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-OFFSET-BEFORE-mixed-SCHEMA] SCHEMA x mixed source x BEFORE x OFFSET x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-OFFSET-BEFORE-mixed-SCHEMA] SCHEMA x mixed source x BEFORE x STATEMENT x ignore_hybrid=False x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[False-STATEMENT-BEFORE-mixed-SCHEMA] SCHEMA x mixed source x BEFORE x STATEMENT x ignore_hybrid=True x recorded success/error and target preservation -> tests/queries/ddl/test_container_clone_hybrid_history.py::test_container_hybrid_history[True-STATEMENT-BEFORE-mixed-SCHEMA] DATABASE x AT x constant OFFSET x multiple healthy-blocker retries -> tests/queries/ddl/test_container_time_travel.py::test_container_offset_clone_waits_for_procedure_context[AT-DATABASE] DATABASE x BEFORE x constant OFFSET x multiple healthy-blocker retries -> tests/queries/ddl/test_container_time_travel.py::test_container_offset_clone_waits_for_procedure_context[BEFORE-DATABASE] DATABASE x unknown anchor error x exact recorded rejection -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone_error[unknown-DATABASE] DATABASE x ddl anchor error x exact recorded rejection -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone_error[ddl-DATABASE] DATABASE x null anchor error x exact recorded rejection -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone_error[null-DATABASE] DATABASE x old anchor error x exact recorded rejection -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone_error[old-DATABASE] SCHEMA x AT x constant OFFSET x multiple healthy-blocker retries -> tests/queries/ddl/test_container_time_travel.py::test_container_offset_clone_waits_for_procedure_context[AT-SCHEMA] SCHEMA x BEFORE x constant OFFSET x multiple healthy-blocker retries -> tests/queries/ddl/test_container_time_travel.py::test_container_offset_clone_waits_for_procedure_context[BEFORE-SCHEMA] SCHEMA x unknown anchor error x exact recorded rejection -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone_error[unknown-SCHEMA] SCHEMA x ddl anchor error x exact recorded rejection -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone_error[ddl-SCHEMA] SCHEMA x null anchor error x exact recorded rejection -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone_error[null-SCHEMA] SCHEMA x old anchor error x exact recorded rejection -> tests/queries/ddl/test_container_time_travel.py::test_container_historical_clone_error[ol…
1 parent 22f9365 commit 1af2a12

1 file changed

Lines changed: 5 additions & 1 deletion

File tree

‎src/dialect/snowflake.rs‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3512,7 +3512,11 @@ pub fn parse_create_database(
35123512
}
35133513
_ => return parser.expected("end of statement", next_token),
35143514
},
3515-
Token::SemiColon | Token::EOF => break,
3515+
Token::SemiColon => {
3516+
parser.prev_token();
3517+
break;
3518+
}
3519+
Token::EOF => break,
35163520
_ => return parser.expected("end of statement", next_token),
35173521
}
35183522
}

0 commit comments

Comments
 (0)