@quereus/quereus 4.20.1 → 4.20.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/package.json +7 -4
- package/test/README.md +173 -0
- package/test/logic/01-basic.sqllogic +39 -0
- package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
- package/test/logic/01.2-strings.sqllogic +43 -0
- package/test/logic/01.5-insert-select.sqllogic +237 -0
- package/test/logic/01.6-update-extras.sqllogic +118 -0
- package/test/logic/01.7-update-from.sqllogic +67 -0
- package/test/logic/01.8-delete-extras.sqllogic +122 -0
- package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
- package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
- package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
- package/test/logic/01.9-query-expr-values.sqllogic +111 -0
- package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
- package/test/logic/02-filters.sqllogic +54 -0
- package/test/logic/02-smoke.sqllogic +62 -0
- package/test/logic/02.1-bind-parameters.sqllogic +223 -0
- package/test/logic/03-expressions.sqllogic +190 -0
- package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
- package/test/logic/03.4-defaults.sqllogic +554 -0
- package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
- package/test/logic/03.5-tvf.sqllogic +61 -0
- package/test/logic/03.6-type-system.sqllogic +544 -0
- package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
- package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
- package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
- package/test/logic/03.8-not-precedence.sqllogic +255 -0
- package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
- package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
- package/test/logic/04-order-by.sqllogic +38 -0
- package/test/logic/04-transactions.sqllogic +239 -0
- package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
- package/test/logic/05-vtab_memory.sqllogic +50 -0
- package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
- package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
- package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
- package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
- package/test/logic/06-builtin_functions.sqllogic +149 -0
- package/test/logic/06.1-string-functions.sqllogic +92 -0
- package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
- package/test/logic/06.2-math-functions.sqllogic +82 -0
- package/test/logic/06.3-schema.sqllogic +48 -0
- package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
- package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
- package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
- package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
- package/test/logic/06.3.4-view-info.sqllogic +378 -0
- package/test/logic/06.3.5-column-info.sqllogic +347 -0
- package/test/logic/06.3.6-schema-views.sqllogic +29 -0
- package/test/logic/06.4-schema-search-path.sqllogic +354 -0
- package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
- package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
- package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
- package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
- package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
- package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
- package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
- package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
- package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
- package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
- package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
- package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
- package/test/logic/06.7-json-extended.sqllogic +53 -0
- package/test/logic/06.8-json-path-operators.sqllogic +99 -0
- package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
- package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
- package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
- package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
- package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
- package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
- package/test/logic/07-aggregates.sqllogic +193 -0
- package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
- package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
- package/test/logic/07.3-group-by-extras.sqllogic +602 -0
- package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
- package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
- package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
- package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
- package/test/logic/07.5-window.sqllogic +1941 -0
- package/test/logic/07.5.1-window-named.sqllogic +13 -0
- package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
- package/test/logic/07.6-subqueries.sqllogic +78 -0
- package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
- package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
- package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
- package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
- package/test/logic/07.7.1-in-extras.sqllogic +158 -0
- package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
- package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
- package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
- package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
- package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
- package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
- package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
- package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
- package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
- package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
- package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
- package/test/logic/07.9-in-value-list.sqllogic +154 -0
- package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
- package/test/logic/08-views.sqllogic +64 -0
- package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
- package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
- package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
- package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
- package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
- package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
- package/test/logic/09-set_operations.sqllogic +244 -0
- package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
- package/test/logic/10-distinct_datatypes.sqllogic +127 -0
- package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
- package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
- package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
- package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
- package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
- package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
- package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
- package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
- package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
- package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
- package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
- package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
- package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
- package/test/logic/10.2-column-features.sqllogic +365 -0
- package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
- package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
- package/test/logic/10.3-function-features.sqllogic +247 -0
- package/test/logic/10.4-schema-scale.sqllogic +168 -0
- package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
- package/test/logic/10.5-indexes.sqllogic +164 -0
- package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
- package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
- package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
- package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
- package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
- package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
- package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
- package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
- package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
- package/test/logic/100.1-where-extras.sqllogic +163 -0
- package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
- package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
- package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
- package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
- package/test/logic/102-unique-constraints.sqllogic +145 -0
- package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
- package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
- package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
- package/test/logic/102.2-unique-collation.sqllogic +181 -0
- package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
- package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
- package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
- package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
- package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
- package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
- package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
- package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
- package/test/logic/108-cardinality-estimation.sqllogic +146 -0
- package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
- package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
- package/test/logic/11-joins.sqllogic +86 -0
- package/test/logic/11.1-join-using.sqllogic +267 -0
- package/test/logic/11.2-comma-join.sqllogic +35 -0
- package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
- package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
- package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
- package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
- package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
- package/test/logic/12-empty-primary-key.sqllogic +124 -0
- package/test/logic/12-join_padding_order.sqllogic +58 -0
- package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
- package/test/logic/13-cte.sqllogic +137 -0
- package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
- package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
- package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
- package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
- package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
- package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
- package/test/logic/13.4-cte-extras.sqllogic +98 -0
- package/test/logic/13.5-cte-join-order.sqllogic +166 -0
- package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
- package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
- package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
- package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
- package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
- package/test/logic/14-utilities.sqllogic +168 -0
- package/test/logic/15-timespan.sqllogic +279 -0
- package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
- package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
- package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
- package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
- package/test/logic/16-epoch.sqllogic +187 -0
- package/test/logic/17-weekday-modifier.sqllogic +78 -0
- package/test/logic/18-json-string-escapes.sqllogic +86 -0
- package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
- package/test/logic/20-empty-single-row.sqllogic +261 -0
- package/test/logic/21-null-edge-cases.sqllogic +227 -0
- package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
- package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
- package/test/logic/21.2-between-edges.sqllogic +157 -0
- package/test/logic/22-boundary-values.sqllogic +175 -0
- package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
- package/test/logic/24-builtin-branches.sqllogic +611 -0
- package/test/logic/24.1-substr-extras.sqllogic +75 -0
- package/test/logic/24.2-random-extras.sqllogic +39 -0
- package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
- package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
- package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
- package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
- package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
- package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
- package/test/logic/26-join-edge-cases.sqllogic +333 -0
- package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
- package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
- package/test/logic/26.3-join-on-constants.sqllogic +61 -0
- package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
- package/test/logic/27-window-edge-cases.sqllogic +206 -0
- package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
- package/test/logic/27.2-window-exclude.sqllogic +13 -0
- package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
- package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
- package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
- package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
- package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
- package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
- package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
- package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
- package/test/logic/40-constraints.sqllogic +418 -0
- package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
- package/test/logic/40.2-check-extras.sqllogic +683 -0
- package/test/logic/41-alter-table.sqllogic +191 -0
- package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
- package/test/logic/41-fk-cross-schema.sqllogic +155 -0
- package/test/logic/41-fk-extended-targets.sqllogic +173 -0
- package/test/logic/41-foreign-keys.sqllogic +1001 -0
- package/test/logic/41-generated-column-errors.sqllogic +225 -0
- package/test/logic/41-generated-column-extras.sqllogic +598 -0
- package/test/logic/41-generated-column-scope.sqllogic +329 -0
- package/test/logic/41-generated-columns.sqllogic +361 -0
- package/test/logic/41.1-alter-pk.sqllogic +230 -0
- package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
- package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
- package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
- package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
- package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
- package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
- package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
- package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
- package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
- package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
- package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
- package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
- package/test/logic/41.2-alter-column.sqllogic +382 -0
- package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
- package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
- package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
- package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
- package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
- package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
- package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
- package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
- package/test/logic/41.5-alter-misc.sqllogic +48 -0
- package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
- package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
- package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
- package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
- package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
- package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
- package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
- package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
- package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
- package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
- package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
- package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
- package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
- package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
- package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
- package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
- package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
- package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
- package/test/logic/42-committed-snapshot.sqllogic +254 -0
- package/test/logic/42-returning.sqllogic +159 -0
- package/test/logic/42.1-returning-extras.sqllogic +232 -0
- package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
- package/test/logic/43-default-nullability.sqllogic +131 -0
- package/test/logic/43-transition-constraints.sqllogic +341 -0
- package/test/logic/43.1-default-collation.sqllogic +140 -0
- package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
- package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
- package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
- package/test/logic/44-determinism-validation.sqllogic +164 -0
- package/test/logic/44-orthogonality.sqllogic +146 -0
- package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
- package/test/logic/45-udf-determinism.sqllogic +39 -0
- package/test/logic/46-mutation-context.sqllogic +595 -0
- package/test/logic/47-upsert.sqllogic +255 -0
- package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
- package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
- package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
- package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
- package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
- package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
- package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
- package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
- package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
- package/test/logic/49-reference-graph.sqllogic +84 -0
- package/test/logic/50-declarative-schema.sqllogic +2550 -0
- package/test/logic/50-metadata-tags.sqllogic +1033 -0
- package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
- package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
- package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
- package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +173 -0
- package/test/logic/50.3-declare-schema-duplicate-names.sqllogic +280 -0
- package/test/logic/50.4-declare-schema-apply-restore.sqllogic +192 -0
- package/test/logic/51-lens-foundation.sqllogic +147 -0
- package/test/logic/51-materialized-views.sqllogic +376 -0
- package/test/logic/51.5-materialized-views-coarsened-key.sqllogic +198 -0
- package/test/logic/51.7-maintained-table-attach-detach.sqllogic +468 -0
- package/test/logic/51.8-maintained-table-declared-constraints.sqllogic +440 -0
- package/test/logic/51.85-maintained-table-parent-fk.sqllogic +103 -0
- package/test/logic/51.9-maintained-table-secondary-unique.sqllogic +237 -0
- package/test/logic/51.9.1-maintained-table-partial-unique.sqllogic +36 -0
- package/test/logic/52-lens-overrides.sqllogic +566 -0
- package/test/logic/53-materialized-views-rowtime.sqllogic +1601 -0
- package/test/logic/53-reserved-tags.sqllogic +252 -0
- package/test/logic/53.1-materialized-view-write-through.sqllogic +329 -0
- package/test/logic/53.2-materialized-view-rename-propagation.sqllogic +483 -0
- package/test/logic/53.3-materialized-view-constraint-only-ddl.sqllogic +409 -0
- package/test/logic/53.3.1-materialized-view-index-ddl-irrelevance.sqllogic +29 -0
- package/test/logic/53.4-materialized-view-structural-alter-restore.sqllogic +436 -0
- package/test/logic/54-covering-mv-enforcement.sqllogic +314 -0
- package/test/logic/54.1-covering-mv-partial-enforcement.sqllogic +34 -0
- package/test/logic/55-internal-eviction-reporting.sqllogic +89 -0
- package/test/logic/55-lens-prover.sqllogic +202 -0
- package/test/logic/55.1-eviction-restrict-fk.sqllogic +148 -0
- package/test/logic/55.5-lens-authored-inverse.sqllogic +1468 -0
- package/test/logic/80-grow-retrieve-pass.sqllogic +79 -0
- package/test/logic/81-quickpick.sqllogic +24 -0
- package/test/logic/82-bloom-join.sqllogic +185 -0
- package/test/logic/83-merge-join.sqllogic +280 -0
- package/test/logic/84-asof-scan.sqllogic +238 -0
- package/test/logic/84-key-cardinality.sqllogic +50 -0
- package/test/logic/85-relational-const-folding.sqllogic +51 -0
- package/test/logic/86-scalar-cse.sqllogic +42 -0
- package/test/logic/90-error_paths.sqllogic +114 -0
- package/test/logic/90.1-parse-errors.sqllogic +77 -0
- package/test/logic/90.2-alter-table-errors.sqllogic +53 -0
- package/test/logic/90.2.1-alter-extra-errors.sqllogic +51 -0
- package/test/logic/90.3-expression-errors.sqllogic +43 -0
- package/test/logic/90.4-dml-errors.sqllogic +47 -0
- package/test/logic/90.5-unsupported-join-types.sqllogic +37 -0
- package/test/logic/90.5.1-right-full-join-read.sqllogic +157 -0
- package/test/logic/90.6-select-error-paths.sqllogic +57 -0
- package/test/logic/91-merge-join-edge-cases.sqllogic +159 -0
- package/test/logic/92-hash-aggregate-edge-cases.sqllogic +139 -0
- package/test/logic/93-ddl-view-edge-cases.sqllogic +104 -0
- package/test/logic/93.1-view-error-paths.sqllogic +74 -0
- package/test/logic/93.2-view-mutation-pending.sqllogic +108 -0
- package/test/logic/93.3-view-mutation-or-clause.sqllogic +60 -0
- package/test/logic/93.4-view-mutation.sqllogic +4881 -0
- package/test/logic/93.4.1-view-mutation-partial-unique-cardinality.sqllogic +31 -0
- package/test/logic/93.5-authored-inverse.sqllogic +415 -0
- package/test/logic/93.6-set-op-flagless-write.sqllogic +862 -0
- package/test/logic/94-tvf-edge-cases.sqllogic +58 -0
- package/test/logic/94.1-limit-offset-edge-cases.sqllogic +109 -0
- package/test/logic/94.2-limit-offset-extras.sqllogic +98 -0
- package/test/logic/95-assertions.sqllogic +1417 -0
- package/test/logic/96-subquery-edge-cases.sqllogic +276 -0
- package/test/logic/97-json-function-edge-cases.sqllogic +633 -0
- package/test/logic/97.1-json-blob-and-special-values.sqllogic +92 -0
- package/test/logic/98-temporal-edge-cases.sqllogic +515 -0
- package/test/logic/99-conversion-edge-cases.sqllogic +325 -0
- package/test/logic/99.0.1-schema-index-listing.sqllogic +21 -0
- package/test/logic/99.1-cast-syntax-extras.sqllogic +167 -0
- package/test/logic/drop-unique-index.sqllogic +88 -0
- package/test/logic/pushdown-test.sqllogic +36 -0
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
-- transaction-edge-cases.sqllogic - Edge cases for savepoint nesting, empty txns, commit-after-fail
|
|
2
|
+
|
|
3
|
+
-- ===================================
|
|
4
|
+
-- Empty Transactions
|
|
5
|
+
-- ===================================
|
|
6
|
+
|
|
7
|
+
CREATE TABLE txe (id INTEGER PRIMARY KEY, val TEXT);
|
|
8
|
+
INSERT INTO txe VALUES (1, 'initial');
|
|
9
|
+
|
|
10
|
+
-- BEGIN + COMMIT with no mutations
|
|
11
|
+
BEGIN;
|
|
12
|
+
COMMIT;
|
|
13
|
+
|
|
14
|
+
SELECT val FROM txe WHERE id = 1;
|
|
15
|
+
→ [{"val": "initial"}]
|
|
16
|
+
|
|
17
|
+
-- BEGIN + ROLLBACK with no mutations
|
|
18
|
+
BEGIN;
|
|
19
|
+
ROLLBACK;
|
|
20
|
+
|
|
21
|
+
SELECT val FROM txe WHERE id = 1;
|
|
22
|
+
→ [{"val": "initial"}]
|
|
23
|
+
|
|
24
|
+
-- ===================================
|
|
25
|
+
-- Double BEGIN (should error)
|
|
26
|
+
-- ===================================
|
|
27
|
+
|
|
28
|
+
BEGIN;
|
|
29
|
+
INSERT INTO txe VALUES (2, 'in-txn');
|
|
30
|
+
COMMIT;
|
|
31
|
+
-- run
|
|
32
|
+
|
|
33
|
+
-- Second BEGIN while already in transaction
|
|
34
|
+
BEGIN;
|
|
35
|
+
BEGIN;
|
|
36
|
+
-- error: a transaction is already active
|
|
37
|
+
|
|
38
|
+
ROLLBACK;
|
|
39
|
+
-- run
|
|
40
|
+
|
|
41
|
+
SELECT val FROM txe WHERE id = 2;
|
|
42
|
+
→ [{"val": "in-txn"}]
|
|
43
|
+
|
|
44
|
+
-- ===================================
|
|
45
|
+
-- Double COMMIT (second is no-op)
|
|
46
|
+
-- ===================================
|
|
47
|
+
|
|
48
|
+
BEGIN;
|
|
49
|
+
INSERT INTO txe VALUES (3, 'commit-twice');
|
|
50
|
+
COMMIT;
|
|
51
|
+
COMMIT;
|
|
52
|
+
-- run
|
|
53
|
+
|
|
54
|
+
SELECT val FROM txe WHERE id = 3;
|
|
55
|
+
→ [{"val": "commit-twice"}]
|
|
56
|
+
|
|
57
|
+
-- ===================================
|
|
58
|
+
-- Double ROLLBACK (second is no-op)
|
|
59
|
+
-- ===================================
|
|
60
|
+
|
|
61
|
+
BEGIN;
|
|
62
|
+
INSERT INTO txe VALUES (99, 'will-rollback');
|
|
63
|
+
ROLLBACK;
|
|
64
|
+
ROLLBACK;
|
|
65
|
+
-- run
|
|
66
|
+
|
|
67
|
+
SELECT count(*) as cnt FROM txe WHERE id = 99;
|
|
68
|
+
→ [{"cnt": 0}]
|
|
69
|
+
|
|
70
|
+
-- ===================================
|
|
71
|
+
-- Commit After Failed Statement
|
|
72
|
+
-- ===================================
|
|
73
|
+
-- A failed statement mid-transaction should not prevent subsequent operations
|
|
74
|
+
|
|
75
|
+
BEGIN;
|
|
76
|
+
INSERT INTO txe VALUES (4, 'before-fail');
|
|
77
|
+
-- run
|
|
78
|
+
|
|
79
|
+
-- This should fail (duplicate key)
|
|
80
|
+
INSERT INTO txe VALUES (1, 'duplicate');
|
|
81
|
+
-- error: UNIQUE constraint failed
|
|
82
|
+
|
|
83
|
+
-- Transaction should still be usable after the failed statement
|
|
84
|
+
INSERT INTO txe VALUES (5, 'after-fail');
|
|
85
|
+
COMMIT;
|
|
86
|
+
-- run
|
|
87
|
+
|
|
88
|
+
SELECT val FROM txe WHERE id = 4;
|
|
89
|
+
→ [{"val": "before-fail"}]
|
|
90
|
+
|
|
91
|
+
SELECT val FROM txe WHERE id = 5;
|
|
92
|
+
→ [{"val": "after-fail"}]
|
|
93
|
+
|
|
94
|
+
-- ===================================
|
|
95
|
+
-- Deeply Nested Savepoints (3+ levels)
|
|
96
|
+
-- ===================================
|
|
97
|
+
|
|
98
|
+
BEGIN;
|
|
99
|
+
INSERT INTO txe VALUES (10, 'base');
|
|
100
|
+
SAVEPOINT sp_a;
|
|
101
|
+
INSERT INTO txe VALUES (11, 'level-1');
|
|
102
|
+
SAVEPOINT sp_b;
|
|
103
|
+
INSERT INTO txe VALUES (12, 'level-2');
|
|
104
|
+
SAVEPOINT sp_c;
|
|
105
|
+
INSERT INTO txe VALUES (13, 'level-3');
|
|
106
|
+
|
|
107
|
+
-- Verify all visible within transaction
|
|
108
|
+
SELECT count(*) as cnt FROM txe WHERE id >= 10;
|
|
109
|
+
→ [{"cnt": 4}]
|
|
110
|
+
|
|
111
|
+
-- Rollback innermost only
|
|
112
|
+
ROLLBACK TO SAVEPOINT sp_c;
|
|
113
|
+
SELECT count(*) as cnt FROM txe WHERE id >= 10;
|
|
114
|
+
→ [{"cnt": 3}]
|
|
115
|
+
|
|
116
|
+
-- sp_c is preserved after rollback — can reuse
|
|
117
|
+
INSERT INTO txe VALUES (14, 'reuse-sp_c');
|
|
118
|
+
RELEASE SAVEPOINT sp_c;
|
|
119
|
+
|
|
120
|
+
-- Rollback to sp_b discards sp_c's released data plus sp_b's data
|
|
121
|
+
ROLLBACK TO SAVEPOINT sp_b;
|
|
122
|
+
SELECT count(*) as cnt FROM txe WHERE id >= 10;
|
|
123
|
+
→ [{"cnt": 2}]
|
|
124
|
+
|
|
125
|
+
-- Release sp_b and sp_a, then commit
|
|
126
|
+
RELEASE SAVEPOINT sp_b;
|
|
127
|
+
RELEASE SAVEPOINT sp_a;
|
|
128
|
+
COMMIT;
|
|
129
|
+
|
|
130
|
+
-- Only base + level-1 should survive
|
|
131
|
+
SELECT val FROM txe WHERE id IN (10, 11) ORDER BY id;
|
|
132
|
+
→ [{"val": "base"}, {"val": "level-1"}]
|
|
133
|
+
|
|
134
|
+
SELECT count(*) as cnt FROM txe WHERE id >= 12;
|
|
135
|
+
→ [{"cnt": 0}]
|
|
136
|
+
|
|
137
|
+
-- ===================================
|
|
138
|
+
-- Release inner savepoint then rollback outer
|
|
139
|
+
-- ===================================
|
|
140
|
+
|
|
141
|
+
BEGIN;
|
|
142
|
+
INSERT INTO txe VALUES (20, 'outer');
|
|
143
|
+
SAVEPOINT sp_outer;
|
|
144
|
+
INSERT INTO txe VALUES (21, 'inner-pre');
|
|
145
|
+
SAVEPOINT sp_inner;
|
|
146
|
+
INSERT INTO txe VALUES (22, 'inner-post');
|
|
147
|
+
RELEASE SAVEPOINT sp_inner;
|
|
148
|
+
|
|
149
|
+
-- inner-post is now merged into sp_outer scope
|
|
150
|
+
SELECT count(*) as cnt FROM txe WHERE id >= 20;
|
|
151
|
+
→ [{"cnt": 3}]
|
|
152
|
+
|
|
153
|
+
-- Rollback sp_outer undoes everything including released inner data
|
|
154
|
+
ROLLBACK TO SAVEPOINT sp_outer;
|
|
155
|
+
SELECT count(*) as cnt FROM txe WHERE id >= 20;
|
|
156
|
+
→ [{"cnt": 1}]
|
|
157
|
+
|
|
158
|
+
RELEASE SAVEPOINT sp_outer;
|
|
159
|
+
COMMIT;
|
|
160
|
+
|
|
161
|
+
SELECT val FROM txe WHERE id = 20;
|
|
162
|
+
→ [{"val": "outer"}]
|
|
163
|
+
|
|
164
|
+
SELECT count(*) as cnt FROM txe WHERE id IN (21, 22);
|
|
165
|
+
→ [{"cnt": 0}]
|
|
166
|
+
|
|
167
|
+
-- ===================================
|
|
168
|
+
-- Savepoint with same name at different nesting levels
|
|
169
|
+
-- ===================================
|
|
170
|
+
|
|
171
|
+
BEGIN;
|
|
172
|
+
INSERT INTO txe VALUES (30, 'base');
|
|
173
|
+
SAVEPOINT dup;
|
|
174
|
+
INSERT INTO txe VALUES (31, 'dup-level-1');
|
|
175
|
+
SAVEPOINT dup;
|
|
176
|
+
INSERT INTO txe VALUES (32, 'dup-level-2');
|
|
177
|
+
|
|
178
|
+
-- ROLLBACK TO dup goes to the most recent (innermost) 'dup'
|
|
179
|
+
ROLLBACK TO SAVEPOINT dup;
|
|
180
|
+
SELECT count(*) as cnt FROM txe WHERE id = 32;
|
|
181
|
+
→ [{"cnt": 0}]
|
|
182
|
+
|
|
183
|
+
-- level-1 data should still be visible
|
|
184
|
+
SELECT count(*) as cnt FROM txe WHERE id = 31;
|
|
185
|
+
→ [{"cnt": 1}]
|
|
186
|
+
|
|
187
|
+
RELEASE SAVEPOINT dup;
|
|
188
|
+
RELEASE SAVEPOINT dup;
|
|
189
|
+
COMMIT;
|
|
190
|
+
|
|
191
|
+
SELECT val FROM txe WHERE id IN (30, 31) ORDER BY id;
|
|
192
|
+
→ [{"val": "base"}, {"val": "dup-level-1"}]
|
|
193
|
+
|
|
194
|
+
-- ===================================
|
|
195
|
+
-- Mutation types across savepoints
|
|
196
|
+
-- ===================================
|
|
197
|
+
-- INSERT, UPDATE, DELETE across savepoint boundaries
|
|
198
|
+
|
|
199
|
+
BEGIN;
|
|
200
|
+
INSERT INTO txe VALUES (40, 'inserted');
|
|
201
|
+
SAVEPOINT sp_mut;
|
|
202
|
+
UPDATE txe SET val = 'updated' WHERE id = 40;
|
|
203
|
+
SAVEPOINT sp_del;
|
|
204
|
+
DELETE FROM txe WHERE id = 40;
|
|
205
|
+
|
|
206
|
+
-- Row is gone within innermost scope
|
|
207
|
+
SELECT count(*) as cnt FROM txe WHERE id = 40;
|
|
208
|
+
→ [{"cnt": 0}]
|
|
209
|
+
|
|
210
|
+
-- Rollback the delete
|
|
211
|
+
ROLLBACK TO SAVEPOINT sp_del;
|
|
212
|
+
SELECT val FROM txe WHERE id = 40;
|
|
213
|
+
→ [{"val": "updated"}]
|
|
214
|
+
|
|
215
|
+
-- Rollback the update too
|
|
216
|
+
ROLLBACK TO SAVEPOINT sp_mut;
|
|
217
|
+
SELECT val FROM txe WHERE id = 40;
|
|
218
|
+
→ [{"val": "inserted"}]
|
|
219
|
+
|
|
220
|
+
RELEASE SAVEPOINT sp_mut;
|
|
221
|
+
COMMIT;
|
|
222
|
+
|
|
223
|
+
SELECT val FROM txe WHERE id = 40;
|
|
224
|
+
→ [{"val": "inserted"}]
|
|
225
|
+
|
|
226
|
+
-- ===================================
|
|
227
|
+
-- Large transaction with many inserts
|
|
228
|
+
-- ===================================
|
|
229
|
+
|
|
230
|
+
BEGIN;
|
|
231
|
+
INSERT INTO txe VALUES (100, 'r100');
|
|
232
|
+
INSERT INTO txe VALUES (101, 'r101');
|
|
233
|
+
INSERT INTO txe VALUES (102, 'r102');
|
|
234
|
+
INSERT INTO txe VALUES (103, 'r103');
|
|
235
|
+
INSERT INTO txe VALUES (104, 'r104');
|
|
236
|
+
INSERT INTO txe VALUES (105, 'r105');
|
|
237
|
+
INSERT INTO txe VALUES (106, 'r106');
|
|
238
|
+
INSERT INTO txe VALUES (107, 'r107');
|
|
239
|
+
INSERT INTO txe VALUES (108, 'r108');
|
|
240
|
+
INSERT INTO txe VALUES (109, 'r109');
|
|
241
|
+
COMMIT;
|
|
242
|
+
|
|
243
|
+
SELECT count(*) as cnt FROM txe WHERE id >= 100;
|
|
244
|
+
→ [{"cnt": 10}]
|
|
245
|
+
|
|
246
|
+
-- ===================================
|
|
247
|
+
-- Rollback large transaction
|
|
248
|
+
-- ===================================
|
|
249
|
+
|
|
250
|
+
BEGIN;
|
|
251
|
+
INSERT INTO txe VALUES (200, 'will-rollback');
|
|
252
|
+
INSERT INTO txe VALUES (201, 'will-rollback');
|
|
253
|
+
INSERT INTO txe VALUES (202, 'will-rollback');
|
|
254
|
+
INSERT INTO txe VALUES (203, 'will-rollback');
|
|
255
|
+
INSERT INTO txe VALUES (204, 'will-rollback');
|
|
256
|
+
ROLLBACK;
|
|
257
|
+
|
|
258
|
+
SELECT count(*) as cnt FROM txe WHERE id >= 200;
|
|
259
|
+
→ [{"cnt": 0}]
|
|
260
|
+
|
|
261
|
+
-- ===================================
|
|
262
|
+
-- Implicit transaction auto-commits on success
|
|
263
|
+
-- ===================================
|
|
264
|
+
|
|
265
|
+
INSERT INTO txe VALUES (300, 'auto');
|
|
266
|
+
|
|
267
|
+
SELECT val FROM txe WHERE id = 300;
|
|
268
|
+
→ [{"val": "auto"}]
|
|
269
|
+
|
|
270
|
+
-- ===================================
|
|
271
|
+
-- Savepoint without explicit BEGIN (creates implicit transaction)
|
|
272
|
+
-- ===================================
|
|
273
|
+
|
|
274
|
+
SAVEPOINT implicit_sp;
|
|
275
|
+
INSERT INTO txe VALUES (301, 'in-implicit-sp');
|
|
276
|
+
RELEASE SAVEPOINT implicit_sp;
|
|
277
|
+
|
|
278
|
+
SELECT val FROM txe WHERE id = 301;
|
|
279
|
+
→ [{"val": "in-implicit-sp"}]
|
|
280
|
+
|
|
281
|
+
-- ===================================
|
|
282
|
+
-- Statement-level atomicity inside an explicit transaction (UPDATE)
|
|
283
|
+
-- ===================================
|
|
284
|
+
-- A multi-row UPDATE whose Nth row throws must roll back the WHOLE statement
|
|
285
|
+
-- (rows 1..N-1 included), mirroring SQLite's implicit-savepoint-per-statement.
|
|
286
|
+
-- The autocommit path is already atomic via implicit-transaction rollback, so
|
|
287
|
+
-- this MUST wrap in begin/rollback to exercise the statement savepoint. Without
|
|
288
|
+
-- it, id=1's update (x=11) would survive the aborted statement.
|
|
289
|
+
|
|
290
|
+
-- The preceding section upgraded an implicit savepoint to an explicit
|
|
291
|
+
-- transaction that is still open; commit it so our BEGIN starts clean
|
|
292
|
+
-- (a no-op if autocommit is already active).
|
|
293
|
+
COMMIT;
|
|
294
|
+
-- run
|
|
295
|
+
|
|
296
|
+
CREATE TABLE atom_u (id INTEGER PRIMARY KEY, x INTEGER NOT NULL);
|
|
297
|
+
INSERT INTO atom_u VALUES (1, 10), (2, 20), (3, 30);
|
|
298
|
+
-- run
|
|
299
|
+
|
|
300
|
+
-- Row id=1 updates to x=11 first, then id=2 violates NOT NULL (x -> NULL).
|
|
301
|
+
BEGIN;
|
|
302
|
+
UPDATE atom_u SET x = CASE WHEN id = 2 THEN NULL ELSE x + 1 END WHERE id IN (1, 2);
|
|
303
|
+
-- error: NOT NULL constraint failed: atom_u.x
|
|
304
|
+
|
|
305
|
+
-- Inside the still-open transaction: id=1's update must NOT have survived.
|
|
306
|
+
SELECT id, x FROM atom_u ORDER BY id;
|
|
307
|
+
→ [{"id":1,"x":10},{"id":2,"x":20},{"id":3,"x":30}]
|
|
308
|
+
ROLLBACK;
|
|
309
|
+
-- run
|
|
310
|
+
|
|
311
|
+
-- After rollback nothing persisted either.
|
|
312
|
+
SELECT id, x FROM atom_u ORDER BY id;
|
|
313
|
+
→ [{"id":1,"x":10},{"id":2,"x":20},{"id":3,"x":30}]
|
|
314
|
+
|
|
315
|
+
-- Same guarantee when the later row trips a UNIQUE collision rather than a
|
|
316
|
+
-- NOT NULL check: id=1's k moves to 15 (fine), then id=2's k -> 30 collides
|
|
317
|
+
-- with id=3. The whole statement must revert id=1's move.
|
|
318
|
+
CREATE TABLE atom_uq (id INTEGER PRIMARY KEY, k INTEGER UNIQUE);
|
|
319
|
+
INSERT INTO atom_uq VALUES (1, 10), (2, 20), (3, 30);
|
|
320
|
+
-- run
|
|
321
|
+
|
|
322
|
+
BEGIN;
|
|
323
|
+
UPDATE atom_uq SET k = CASE WHEN id = 1 THEN 15 WHEN id = 2 THEN 30 END WHERE id IN (1, 2);
|
|
324
|
+
-- error: constraint failed
|
|
325
|
+
|
|
326
|
+
SELECT id, k FROM atom_uq ORDER BY id;
|
|
327
|
+
→ [{"id":1,"k":10},{"id":2,"k":20},{"id":3,"k":30}]
|
|
328
|
+
ROLLBACK;
|
|
329
|
+
-- run
|
|
330
|
+
|
|
331
|
+
-- ===================================
|
|
332
|
+
-- Statement-level atomicity inside an explicit transaction (DELETE)
|
|
333
|
+
-- ===================================
|
|
334
|
+
-- A multi-row DELETE whose Nth row throws (FK RESTRICT child reference) must
|
|
335
|
+
-- roll back the whole statement. id=1 (unreferenced) deletes first, then id=2
|
|
336
|
+
-- (referenced by a RESTRICT child) trips the parent-side FK check.
|
|
337
|
+
|
|
338
|
+
CREATE TABLE atom_dp (id INTEGER PRIMARY KEY);
|
|
339
|
+
CREATE TABLE atom_dc (id INTEGER PRIMARY KEY, pid INTEGER REFERENCES atom_dp(id) ON DELETE RESTRICT);
|
|
340
|
+
INSERT INTO atom_dp VALUES (1), (2), (3);
|
|
341
|
+
INSERT INTO atom_dc VALUES (100, 2);
|
|
342
|
+
-- run
|
|
343
|
+
|
|
344
|
+
BEGIN;
|
|
345
|
+
DELETE FROM atom_dp WHERE id IN (1, 2);
|
|
346
|
+
-- error: constraint failed
|
|
347
|
+
|
|
348
|
+
-- id=1's delete must NOT have survived the aborted statement.
|
|
349
|
+
SELECT id FROM atom_dp ORDER BY id;
|
|
350
|
+
→ [{"id":1},{"id":2},{"id":3}]
|
|
351
|
+
ROLLBACK;
|
|
352
|
+
-- run
|
|
353
|
+
|
|
354
|
+
SELECT id FROM atom_dp ORDER BY id;
|
|
355
|
+
→ [{"id":1},{"id":2},{"id":3}]
|
|
356
|
+
|
|
357
|
+
-- ===================================
|
|
358
|
+
-- Rolled-back statements must not corrupt UNIQUE enforcement state
|
|
359
|
+
-- ===================================
|
|
360
|
+
-- Regression (memory module): secondary-index entries are shared across
|
|
361
|
+
-- inherited layer trees, so a rolled-back transaction's index mutations must
|
|
362
|
+
-- be copy-on-written into the transaction's own tree, never applied in place
|
|
363
|
+
-- to the shared committed entry (MemoryIndex.ownedEntries). A leaked delete
|
|
364
|
+
-- silently un-enforced UNIQUE; a leaked insert left a phantom candidate.
|
|
365
|
+
|
|
366
|
+
CREATE TABLE rbk (id INTEGER PRIMARY KEY, v TEXT UNIQUE);
|
|
367
|
+
INSERT INTO rbk VALUES (1, 'x');
|
|
368
|
+
|
|
369
|
+
-- a rolled-back DELETE must leave UNIQUE enforcement intact
|
|
370
|
+
BEGIN;
|
|
371
|
+
DELETE FROM rbk WHERE id = 1;
|
|
372
|
+
ROLLBACK;
|
|
373
|
+
|
|
374
|
+
INSERT INTO rbk VALUES (2, 'x');
|
|
375
|
+
-- error: UNIQUE constraint failed
|
|
376
|
+
|
|
377
|
+
-- a rolled-back INSERT must not leave a phantom that blocks the value
|
|
378
|
+
BEGIN;
|
|
379
|
+
INSERT INTO rbk VALUES (3, 'y');
|
|
380
|
+
ROLLBACK;
|
|
381
|
+
|
|
382
|
+
INSERT INTO rbk VALUES (4, 'y');
|
|
383
|
+
SELECT id, v FROM rbk ORDER BY id;
|
|
384
|
+
→ [{"id":1,"v":"x"},{"id":4,"v":"y"}]
|
|
385
|
+
|
|
386
|
+
-- ===================================
|
|
387
|
+
-- Cleanup
|
|
388
|
+
-- ===================================
|
|
389
|
+
|
|
390
|
+
DROP TABLE rbk;
|
|
391
|
+
DROP TABLE txe;
|
|
392
|
+
DROP TABLE atom_dc;
|
|
393
|
+
DROP TABLE atom_dp;
|
|
394
|
+
DROP TABLE atom_uq;
|
|
395
|
+
DROP TABLE atom_u;
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
-- schema-catalog-edge-cases.sqllogic - Multi-schema, DDL roundtrip, schema change events
|
|
2
|
+
|
|
3
|
+
-- ===================================
|
|
4
|
+
-- DDL Round-trip: Create → Export → Drop → Recreate → Verify
|
|
5
|
+
-- ===================================
|
|
6
|
+
|
|
7
|
+
-- Simple table DDL roundtrip: create, drop, recreate, verify identical behavior
|
|
8
|
+
CREATE TABLE rt_simple (id INTEGER PRIMARY KEY, name TEXT NOT NULL, active INTEGER);
|
|
9
|
+
INSERT INTO rt_simple VALUES (1, 'Alice', 1);
|
|
10
|
+
|
|
11
|
+
-- Verify table_info returns expected columns
|
|
12
|
+
SELECT name, type, pk FROM table_info('rt_simple') ORDER BY cid;
|
|
13
|
+
→ [{"name": "id", "type": "INTEGER", "pk": 1}, {"name": "name", "type": "TEXT", "pk": 0}, {"name": "active", "type": "INTEGER", "pk": 0}]
|
|
14
|
+
|
|
15
|
+
SELECT * FROM rt_simple;
|
|
16
|
+
→ [{"id": 1, "name": "Alice", "active": 1}]
|
|
17
|
+
|
|
18
|
+
DROP TABLE rt_simple;
|
|
19
|
+
|
|
20
|
+
-- Recreate the same table and verify it works identically
|
|
21
|
+
CREATE TABLE rt_simple (id INTEGER PRIMARY KEY, name TEXT NOT NULL, active INTEGER);
|
|
22
|
+
INSERT INTO rt_simple VALUES (1, 'Alice', 1);
|
|
23
|
+
|
|
24
|
+
SELECT * FROM rt_simple;
|
|
25
|
+
→ [{"id": 1, "name": "Alice", "active": 1}]
|
|
26
|
+
|
|
27
|
+
DROP TABLE rt_simple;
|
|
28
|
+
|
|
29
|
+
-- ===================================
|
|
30
|
+
-- Composite primary key DDL
|
|
31
|
+
-- ===================================
|
|
32
|
+
|
|
33
|
+
CREATE TABLE rt_composite (a INTEGER, b TEXT, c REAL, PRIMARY KEY (a, b));
|
|
34
|
+
INSERT INTO rt_composite VALUES (1, 'x', 3.14), (1, 'y', 2.71), (2, 'x', 1.0);
|
|
35
|
+
|
|
36
|
+
SELECT * FROM rt_composite ORDER BY a, b;
|
|
37
|
+
→ [{"a": 1, "b": "x", "c": 3.14}, {"a": 1, "b": "y", "c": 2.71}, {"a": 2, "b": "x", "c": 1.0}]
|
|
38
|
+
|
|
39
|
+
DROP TABLE rt_composite;
|
|
40
|
+
|
|
41
|
+
-- Recreate and verify
|
|
42
|
+
CREATE TABLE rt_composite (a INTEGER, b TEXT, c REAL, PRIMARY KEY (a, b));
|
|
43
|
+
INSERT INTO rt_composite VALUES (1, 'x', 3.14);
|
|
44
|
+
|
|
45
|
+
SELECT * FROM rt_composite;
|
|
46
|
+
→ [{"a": 1, "b": "x", "c": 3.14}]
|
|
47
|
+
|
|
48
|
+
DROP TABLE rt_composite;
|
|
49
|
+
|
|
50
|
+
-- ===================================
|
|
51
|
+
-- Table with indexes
|
|
52
|
+
-- ===================================
|
|
53
|
+
-- Lives in 102.0.1-schema-catalog-indexed-table (it needs standalone CREATE INDEX).
|
|
54
|
+
|
|
55
|
+
-- ===================================
|
|
56
|
+
-- Table with CHECK constraints
|
|
57
|
+
-- ===================================
|
|
58
|
+
|
|
59
|
+
CREATE TABLE rt_checked (id INTEGER PRIMARY KEY, val INTEGER CHECK (val > 0), name TEXT CHECK (length(name) > 0));
|
|
60
|
+
INSERT INTO rt_checked VALUES (1, 10, 'valid');
|
|
61
|
+
|
|
62
|
+
SELECT * FROM rt_checked;
|
|
63
|
+
→ [{"id": 1, "val": 10, "name": "valid"}]
|
|
64
|
+
|
|
65
|
+
-- Verify constraints work
|
|
66
|
+
INSERT INTO rt_checked VALUES (2, -1, 'test');
|
|
67
|
+
-- error: CHECK constraint failed
|
|
68
|
+
|
|
69
|
+
INSERT INTO rt_checked VALUES (3, 5, '');
|
|
70
|
+
-- error: CHECK constraint failed
|
|
71
|
+
|
|
72
|
+
DROP TABLE rt_checked;
|
|
73
|
+
|
|
74
|
+
-- ===================================
|
|
75
|
+
-- Multi-schema: declare and apply
|
|
76
|
+
-- ===================================
|
|
77
|
+
|
|
78
|
+
declare schema app1 {
|
|
79
|
+
table customers {
|
|
80
|
+
id INTEGER PRIMARY KEY,
|
|
81
|
+
name TEXT NOT NULL
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
apply schema app1;
|
|
86
|
+
-- run
|
|
87
|
+
|
|
88
|
+
INSERT INTO app1.customers VALUES (1, 'Acme'), (2, 'Beta');
|
|
89
|
+
|
|
90
|
+
SELECT * FROM app1.customers ORDER BY id;
|
|
91
|
+
→ [{"id": 1, "name": "Acme"}, {"id": 2, "name": "Beta"}]
|
|
92
|
+
|
|
93
|
+
-- ===================================
|
|
94
|
+
-- Cross-schema queries
|
|
95
|
+
-- ===================================
|
|
96
|
+
|
|
97
|
+
CREATE TABLE main_data (id INTEGER PRIMARY KEY, val TEXT);
|
|
98
|
+
INSERT INTO main_data VALUES (1, 'main-val');
|
|
99
|
+
|
|
100
|
+
SELECT c.name, m.val FROM app1.customers AS c JOIN main_data AS m ON c.id = m.id;
|
|
101
|
+
→ [{"name": "Acme", "val": "main-val"}]
|
|
102
|
+
|
|
103
|
+
-- ===================================
|
|
104
|
+
-- Schema search path resolution
|
|
105
|
+
-- ===================================
|
|
106
|
+
|
|
107
|
+
-- Set search path to include app1
|
|
108
|
+
PRAGMA schema_path = 'app1,main';
|
|
109
|
+
|
|
110
|
+
-- Unqualified 'customers' should resolve to app1.customers
|
|
111
|
+
SELECT * FROM customers ORDER BY id;
|
|
112
|
+
→ [{"id": 1, "name": "Acme"}, {"id": 2, "name": "Beta"}]
|
|
113
|
+
|
|
114
|
+
-- Unqualified 'main_data' should resolve to main.main_data
|
|
115
|
+
SELECT * FROM main_data;
|
|
116
|
+
→ [{"id": 1, "val": "main-val"}]
|
|
117
|
+
|
|
118
|
+
-- Reset search path
|
|
119
|
+
PRAGMA schema_path = 'main';
|
|
120
|
+
-- run
|
|
121
|
+
|
|
122
|
+
-- ===================================
|
|
123
|
+
-- table_info edge cases
|
|
124
|
+
-- ===================================
|
|
125
|
+
|
|
126
|
+
-- Table with many columns
|
|
127
|
+
CREATE TABLE wide_table (
|
|
128
|
+
a INTEGER PRIMARY KEY,
|
|
129
|
+
b TEXT,
|
|
130
|
+
c REAL,
|
|
131
|
+
d INTEGER,
|
|
132
|
+
e TEXT,
|
|
133
|
+
f REAL
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
SELECT count(*) as cnt FROM table_info('wide_table');
|
|
137
|
+
→ [{"cnt": 6}]
|
|
138
|
+
|
|
139
|
+
-- Verify column order
|
|
140
|
+
SELECT name FROM table_info('wide_table') ORDER BY cid;
|
|
141
|
+
→ [{"name": "a"}, {"name": "b"}, {"name": "c"}, {"name": "d"}, {"name": "e"}, {"name": "f"}]
|
|
142
|
+
|
|
143
|
+
DROP TABLE wide_table;
|
|
144
|
+
|
|
145
|
+
-- Table with no non-PK columns
|
|
146
|
+
CREATE TABLE pk_only (id INTEGER PRIMARY KEY);
|
|
147
|
+
INSERT INTO pk_only VALUES (1), (2), (3);
|
|
148
|
+
|
|
149
|
+
SELECT * FROM pk_only ORDER BY id;
|
|
150
|
+
→ [{"id": 1}, {"id": 2}, {"id": 3}]
|
|
151
|
+
|
|
152
|
+
-- table_info on single-column table
|
|
153
|
+
SELECT name, type, pk FROM table_info('pk_only') ORDER BY cid;
|
|
154
|
+
→ [{"name": "id", "type": "INTEGER", "pk": 1}]
|
|
155
|
+
|
|
156
|
+
DROP TABLE pk_only;
|
|
157
|
+
|
|
158
|
+
-- ===================================
|
|
159
|
+
-- Views
|
|
160
|
+
-- ===================================
|
|
161
|
+
|
|
162
|
+
CREATE TABLE v_source (id INTEGER PRIMARY KEY, name TEXT, active INTEGER);
|
|
163
|
+
INSERT INTO v_source VALUES (1, 'Alice', 1), (2, 'Bob', 0), (3, 'Charlie', 1);
|
|
164
|
+
|
|
165
|
+
CREATE VIEW active_items AS SELECT id, name FROM v_source WHERE active = 1;
|
|
166
|
+
|
|
167
|
+
SELECT * FROM active_items ORDER BY id;
|
|
168
|
+
→ [{"id": 1, "name": "Alice"}, {"id": 3, "name": "Charlie"}]
|
|
169
|
+
|
|
170
|
+
-- Drop and recreate view
|
|
171
|
+
DROP VIEW active_items;
|
|
172
|
+
|
|
173
|
+
CREATE VIEW active_items AS SELECT id, name FROM v_source WHERE active = 1;
|
|
174
|
+
|
|
175
|
+
SELECT * FROM active_items ORDER BY id;
|
|
176
|
+
→ [{"id": 1, "name": "Alice"}, {"id": 3, "name": "Charlie"}]
|
|
177
|
+
|
|
178
|
+
DROP VIEW active_items;
|
|
179
|
+
DROP TABLE v_source;
|
|
180
|
+
|
|
181
|
+
-- ===================================
|
|
182
|
+
-- DROP TABLE IF EXISTS
|
|
183
|
+
-- ===================================
|
|
184
|
+
|
|
185
|
+
-- Should not error on non-existent table
|
|
186
|
+
DROP TABLE IF EXISTS nonexistent_table;
|
|
187
|
+
-- run
|
|
188
|
+
|
|
189
|
+
-- Should work on existing table
|
|
190
|
+
CREATE TABLE temp_drop (id INTEGER PRIMARY KEY);
|
|
191
|
+
DROP TABLE IF EXISTS temp_drop;
|
|
192
|
+
-- run
|
|
193
|
+
|
|
194
|
+
-- Verify it was dropped
|
|
195
|
+
SELECT * FROM temp_drop;
|
|
196
|
+
-- error: not found
|
|
197
|
+
|
|
198
|
+
-- ===================================
|
|
199
|
+
-- Schema with assertions
|
|
200
|
+
-- ===================================
|
|
201
|
+
|
|
202
|
+
declare schema validated {
|
|
203
|
+
table accounts {
|
|
204
|
+
id INTEGER PRIMARY KEY,
|
|
205
|
+
balance REAL NOT NULL
|
|
206
|
+
}
|
|
207
|
+
assertion positive_balance check (not exists (select 1 from validated.accounts where balance < 0))
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
apply schema validated;
|
|
211
|
+
-- run
|
|
212
|
+
|
|
213
|
+
INSERT INTO validated.accounts VALUES (1, 100.0), (2, 50.0);
|
|
214
|
+
|
|
215
|
+
SELECT * FROM validated.accounts ORDER BY id;
|
|
216
|
+
→ [{"id": 1, "balance": 100.0}, {"id": 2, "balance": 50.0}]
|
|
217
|
+
|
|
218
|
+
-- Negative balance should violate assertion
|
|
219
|
+
INSERT INTO validated.accounts VALUES (3, -10.0);
|
|
220
|
+
-- error: assertion
|
|
221
|
+
|
|
222
|
+
-- ===================================
|
|
223
|
+
-- Window functions in queries (verify schema supports them)
|
|
224
|
+
-- ===================================
|
|
225
|
+
|
|
226
|
+
CREATE TABLE wf_data (id INTEGER PRIMARY KEY, grp TEXT, val INTEGER);
|
|
227
|
+
INSERT INTO wf_data VALUES (1, 'A', 10), (2, 'A', 20), (3, 'B', 30), (4, 'B', 40), (5, 'B', 50);
|
|
228
|
+
|
|
229
|
+
SELECT id, grp, val, row_number() over (partition by grp order by val) as rn FROM wf_data ORDER BY grp, val;
|
|
230
|
+
→ [{"id": 1, "grp": "A", "val": 10, "rn": 1}, {"id": 2, "grp": "A", "val": 20, "rn": 2}, {"id": 3, "grp": "B", "val": 30, "rn": 1}, {"id": 4, "grp": "B", "val": 40, "rn": 2}, {"id": 5, "grp": "B", "val": 50, "rn": 3}]
|
|
231
|
+
|
|
232
|
+
SELECT id, val, rank() over (order by val) as rnk FROM wf_data ORDER BY val;
|
|
233
|
+
→ [{"id": 1, "val": 10, "rnk": 1}, {"id": 2, "val": 20, "rnk": 2}, {"id": 3, "val": 30, "rnk": 3}, {"id": 4, "val": 40, "rnk": 4}, {"id": 5, "val": 50, "rnk": 5}]
|
|
234
|
+
|
|
235
|
+
SELECT id, val, dense_rank() over (order by val) as drnk FROM wf_data ORDER BY val;
|
|
236
|
+
→ [{"id": 1, "val": 10, "drnk": 1}, {"id": 2, "val": 20, "drnk": 2}, {"id": 3, "val": 30, "drnk": 3}, {"id": 4, "val": 40, "drnk": 4}, {"id": 5, "val": 50, "drnk": 5}]
|
|
237
|
+
|
|
238
|
+
SELECT id, grp, val, sum(val) over (partition by grp order by val) as running_sum FROM wf_data ORDER BY grp, val;
|
|
239
|
+
→ [{"id": 1, "grp": "A", "val": 10, "running_sum": 10}, {"id": 2, "grp": "A", "val": 20, "running_sum": 30}, {"id": 3, "grp": "B", "val": 30, "running_sum": 30}, {"id": 4, "grp": "B", "val": 40, "running_sum": 70}, {"id": 5, "grp": "B", "val": 50, "running_sum": 120}]
|
|
240
|
+
|
|
241
|
+
DROP TABLE wf_data;
|
|
242
|
+
|
|
243
|
+
-- ===================================
|
|
244
|
+
-- Cleanup
|
|
245
|
+
-- ===================================
|
|
246
|
+
|
|
247
|
+
DROP TABLE app1.customers;
|
|
248
|
+
-- The assertion still names validated.accounts, so the table drop is refused
|
|
249
|
+
-- until the rule goes first.
|
|
250
|
+
DROP ASSERTION validated.positive_balance;
|
|
251
|
+
DROP TABLE validated.accounts;
|
|
252
|
+
DROP TABLE main_data;
|