@quereus/quereus 4.20.1 → 4.20.3
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/dist/src/schema/schema-differ.d.ts.map +1 -1
- package/dist/src/schema/schema-differ.js +17 -69
- package/dist/src/schema/schema-differ.js.map +1 -1
- 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 +210 -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,239 @@
|
|
|
1
|
+
-- transactions.sqllogic - Testing BEGIN, COMMIT, ROLLBACK, SAVEPOINT, and implicit transactions
|
|
2
|
+
|
|
3
|
+
-- ===================================
|
|
4
|
+
-- Implicit Transaction Tests
|
|
5
|
+
-- ===================================
|
|
6
|
+
-- When not in an explicit transaction (autocommit mode), each statement
|
|
7
|
+
-- is its own implicit-transaction boundary — matching SQLite's autocommit
|
|
8
|
+
-- semantics. A later statement's failure does NOT roll back prior
|
|
9
|
+
-- statements that already committed in the same `exec` batch.
|
|
10
|
+
|
|
11
|
+
CREATE TABLE implicit_tx (id INTEGER PRIMARY KEY, val TEXT);
|
|
12
|
+
|
|
13
|
+
-- Single statement should auto-commit
|
|
14
|
+
INSERT INTO implicit_tx VALUES (1, 'auto-committed');
|
|
15
|
+
SELECT val FROM implicit_tx WHERE id = 1;
|
|
16
|
+
→ [{ "val": "auto-committed" }]
|
|
17
|
+
|
|
18
|
+
-- Multiple statements in one exec each auto-commit on success.
|
|
19
|
+
INSERT INTO implicit_tx VALUES (2, 'batch-a');
|
|
20
|
+
INSERT INTO implicit_tx VALUES (3, 'batch-b');
|
|
21
|
+
INSERT INTO implicit_tx VALUES (4, 'batch-c');
|
|
22
|
+
SELECT count(*) as cnt FROM implicit_tx;
|
|
23
|
+
→ [{ "cnt": 4 }]
|
|
24
|
+
|
|
25
|
+
-- Error in batch: each statement is its own commit boundary. The first
|
|
26
|
+
-- statement commits, the second statement's duplicate-key failure rolls
|
|
27
|
+
-- back ONLY that statement, and the third statement never runs.
|
|
28
|
+
INSERT INTO implicit_tx VALUES (10, 'new1');
|
|
29
|
+
INSERT INTO implicit_tx VALUES (1, 'duplicate');
|
|
30
|
+
INSERT INTO implicit_tx VALUES (11, 'new2');
|
|
31
|
+
-- error: UNIQUE constraint failed
|
|
32
|
+
|
|
33
|
+
-- Verify per-statement commit boundary: row 10 (committed) survives, row 11 (never ran) does not.
|
|
34
|
+
SELECT count(*) as cnt FROM implicit_tx WHERE id = 10;
|
|
35
|
+
→ [{ "cnt": 1 }]
|
|
36
|
+
SELECT count(*) as cnt FROM implicit_tx WHERE id = 11;
|
|
37
|
+
→ [{ "cnt": 0 }]
|
|
38
|
+
|
|
39
|
+
-- Original data still intact plus the surviving (10, 'new1') row.
|
|
40
|
+
SELECT count(*) as cnt FROM implicit_tx;
|
|
41
|
+
→ [{ "cnt": 5 }]
|
|
42
|
+
|
|
43
|
+
DROP TABLE implicit_tx;
|
|
44
|
+
|
|
45
|
+
-- ===================================
|
|
46
|
+
-- Explicit Transaction Tests
|
|
47
|
+
-- ===================================
|
|
48
|
+
|
|
49
|
+
CREATE TABLE tx_t (id INTEGER PRIMARY KEY, val TEXT);
|
|
50
|
+
INSERT INTO tx_t VALUES (1, 'initial');
|
|
51
|
+
|
|
52
|
+
-- Basic COMMIT
|
|
53
|
+
BEGIN TRANSACTION;
|
|
54
|
+
INSERT INTO tx_t VALUES (2, 'tx1');
|
|
55
|
+
SELECT val FROM tx_t WHERE id = 2;
|
|
56
|
+
→ [{ "val": "tx1" }]
|
|
57
|
+
COMMIT;
|
|
58
|
+
SELECT val FROM tx_t WHERE id = 2;
|
|
59
|
+
→ [{ "val": "tx1" }]
|
|
60
|
+
|
|
61
|
+
-- Basic ROLLBACK
|
|
62
|
+
BEGIN TRANSACTION;
|
|
63
|
+
UPDATE tx_t SET val = 'tx2_update' WHERE id = 1;
|
|
64
|
+
INSERT INTO tx_t VALUES (3, 'tx2');
|
|
65
|
+
SELECT val FROM tx_t WHERE id = 1;
|
|
66
|
+
→ [{ "val": "tx2_update" }]
|
|
67
|
+
SELECT val FROM tx_t WHERE id = 3;
|
|
68
|
+
→ [{ "val": "tx2" }]
|
|
69
|
+
ROLLBACK;
|
|
70
|
+
SELECT val FROM tx_t WHERE id = 1;
|
|
71
|
+
→ [{ "val": "initial" }]
|
|
72
|
+
SELECT count(*) FROM tx_t WHERE id = 3;
|
|
73
|
+
→ [{ "count(*)": 0 }]
|
|
74
|
+
|
|
75
|
+
-- SAVEPOINT and RELEASE
|
|
76
|
+
BEGIN TRANSACTION;
|
|
77
|
+
INSERT INTO tx_t VALUES (4, 'before_sp1');
|
|
78
|
+
SAVEPOINT sp1;
|
|
79
|
+
INSERT INTO tx_t VALUES (5, 'after_sp1');
|
|
80
|
+
SELECT val FROM tx_t WHERE id = 5;
|
|
81
|
+
→ [{ "val": "after_sp1" }]
|
|
82
|
+
RELEASE SAVEPOINT sp1;
|
|
83
|
+
-- sp1 is now merged into the main transaction
|
|
84
|
+
COMMIT;
|
|
85
|
+
SELECT val FROM tx_t WHERE id = 4;
|
|
86
|
+
→ [{ "val": "before_sp1" }]
|
|
87
|
+
SELECT val FROM tx_t WHERE id = 5;
|
|
88
|
+
→ [{ "val": "after_sp1" }]
|
|
89
|
+
|
|
90
|
+
-- SAVEPOINT and ROLLBACK TO
|
|
91
|
+
BEGIN TRANSACTION;
|
|
92
|
+
UPDATE tx_t SET val = 'tx3_update' WHERE id = 1;
|
|
93
|
+
SAVEPOINT sp2;
|
|
94
|
+
INSERT INTO tx_t VALUES (6, 'after_sp2');
|
|
95
|
+
DELETE FROM tx_t WHERE id = 2;
|
|
96
|
+
SELECT count(*) FROM tx_t WHERE id = 6;
|
|
97
|
+
→ [{ "count(*)": 1 }]
|
|
98
|
+
SELECT count(*) FROM tx_t WHERE id = 2;
|
|
99
|
+
→ [{ "count(*)": 0 }]
|
|
100
|
+
ROLLBACK TO SAVEPOINT sp2;
|
|
101
|
+
-- Changes after sp2 are undone
|
|
102
|
+
SELECT count(*) FROM tx_t WHERE id = 6;
|
|
103
|
+
→ [{ "count(*)": 0 }]
|
|
104
|
+
SELECT count(*) FROM tx_t WHERE id = 2; -- Should be back
|
|
105
|
+
→ [{ "count(*)": 1 }]
|
|
106
|
+
SELECT val FROM tx_t WHERE id = 1; -- Update before sp2 remains
|
|
107
|
+
→ [{ "val": "tx3_update" }]
|
|
108
|
+
COMMIT;
|
|
109
|
+
SELECT val FROM tx_t WHERE id = 1;
|
|
110
|
+
→ [{ "val": "tx3_update" }]
|
|
111
|
+
SELECT count(*) FROM tx_t WHERE id = 6;
|
|
112
|
+
→ [{ "count(*)": 0 }]
|
|
113
|
+
|
|
114
|
+
-- ===================================
|
|
115
|
+
-- Nested Savepoints
|
|
116
|
+
-- ===================================
|
|
117
|
+
-- ROLLBACK TO s1 should discard s2 and everything after s1.
|
|
118
|
+
|
|
119
|
+
BEGIN;
|
|
120
|
+
INSERT INTO tx_t VALUES (100, 'a');
|
|
121
|
+
SAVEPOINT s1;
|
|
122
|
+
INSERT INTO tx_t VALUES (101, 'b');
|
|
123
|
+
SAVEPOINT s2;
|
|
124
|
+
INSERT INTO tx_t VALUES (102, 'c');
|
|
125
|
+
ROLLBACK TO s1;
|
|
126
|
+
SELECT count(*) FROM tx_t WHERE id > 99;
|
|
127
|
+
→ [{ "count(*)": 1 }]
|
|
128
|
+
COMMIT;
|
|
129
|
+
|
|
130
|
+
-- Verify after commit
|
|
131
|
+
SELECT count(*) FROM tx_t WHERE id >= 100;
|
|
132
|
+
→ [{ "count(*)": 1 }]
|
|
133
|
+
SELECT val FROM tx_t WHERE id = 100;
|
|
134
|
+
→ [{ "val": "a" }]
|
|
135
|
+
|
|
136
|
+
-- Clean up nested test data
|
|
137
|
+
DELETE FROM tx_t WHERE id >= 100;
|
|
138
|
+
-- run
|
|
139
|
+
|
|
140
|
+
-- ===================================
|
|
141
|
+
-- ROLLBACK TO non-existent savepoint (should error)
|
|
142
|
+
-- ===================================
|
|
143
|
+
|
|
144
|
+
BEGIN;
|
|
145
|
+
INSERT INTO tx_t VALUES (200, 'phantom');
|
|
146
|
+
ROLLBACK TO SAVEPOINT no_such_sp;
|
|
147
|
+
-- error: No such savepoint: no_such_sp
|
|
148
|
+
|
|
149
|
+
ROLLBACK;
|
|
150
|
+
-- run
|
|
151
|
+
|
|
152
|
+
-- ===================================
|
|
153
|
+
-- RELEASE non-existent savepoint (should error)
|
|
154
|
+
-- ===================================
|
|
155
|
+
|
|
156
|
+
BEGIN;
|
|
157
|
+
INSERT INTO tx_t VALUES (200, 'phantom');
|
|
158
|
+
RELEASE SAVEPOINT no_such_sp;
|
|
159
|
+
-- error: No such savepoint: no_such_sp
|
|
160
|
+
|
|
161
|
+
ROLLBACK;
|
|
162
|
+
-- run
|
|
163
|
+
|
|
164
|
+
-- ===================================
|
|
165
|
+
-- Same-prefix savepoint names (no collision)
|
|
166
|
+
-- ===================================
|
|
167
|
+
|
|
168
|
+
BEGIN;
|
|
169
|
+
SAVEPOINT sp;
|
|
170
|
+
INSERT INTO tx_t VALUES (300, 'sp-data');
|
|
171
|
+
SAVEPOINT spa;
|
|
172
|
+
INSERT INTO tx_t VALUES (301, 'spa-data');
|
|
173
|
+
ROLLBACK TO SAVEPOINT spa;
|
|
174
|
+
-- Only spa's changes are undone; sp's data remains
|
|
175
|
+
SELECT count(*) FROM tx_t WHERE id = 300;
|
|
176
|
+
→ [{ "count(*)": 1 }]
|
|
177
|
+
SELECT count(*) FROM tx_t WHERE id = 301;
|
|
178
|
+
→ [{ "count(*)": 0 }]
|
|
179
|
+
RELEASE SAVEPOINT spa;
|
|
180
|
+
RELEASE SAVEPOINT sp;
|
|
181
|
+
COMMIT;
|
|
182
|
+
|
|
183
|
+
-- Verify
|
|
184
|
+
SELECT val FROM tx_t WHERE id = 300;
|
|
185
|
+
→ [{ "val": "sp-data" }]
|
|
186
|
+
|
|
187
|
+
-- Clean up
|
|
188
|
+
DELETE FROM tx_t WHERE id >= 300;
|
|
189
|
+
-- run
|
|
190
|
+
|
|
191
|
+
-- ===================================
|
|
192
|
+
-- ROLLBACK TO preserves the savepoint (can release after rollback)
|
|
193
|
+
-- ===================================
|
|
194
|
+
|
|
195
|
+
BEGIN;
|
|
196
|
+
SAVEPOINT preserve_test;
|
|
197
|
+
INSERT INTO tx_t VALUES (400, 'will-be-undone');
|
|
198
|
+
ROLLBACK TO SAVEPOINT preserve_test;
|
|
199
|
+
-- Savepoint still exists; should be able to release it
|
|
200
|
+
RELEASE SAVEPOINT preserve_test;
|
|
201
|
+
COMMIT;
|
|
202
|
+
|
|
203
|
+
SELECT count(*) FROM tx_t WHERE id = 400;
|
|
204
|
+
→ [{ "count(*)": 0 }]
|
|
205
|
+
|
|
206
|
+
-- ===================================
|
|
207
|
+
-- Nested savepoints unwinding correctly
|
|
208
|
+
-- ===================================
|
|
209
|
+
|
|
210
|
+
BEGIN;
|
|
211
|
+
INSERT INTO tx_t VALUES (500, 'base');
|
|
212
|
+
SAVEPOINT sp_outer;
|
|
213
|
+
INSERT INTO tx_t VALUES (501, 'sp_outer');
|
|
214
|
+
SAVEPOINT sp_middle;
|
|
215
|
+
INSERT INTO tx_t VALUES (502, 'sp_middle');
|
|
216
|
+
SAVEPOINT sp_inner;
|
|
217
|
+
INSERT INTO tx_t VALUES (503, 'sp_inner');
|
|
218
|
+
|
|
219
|
+
-- Rollback to sp_middle should discard sp_inner and sp_middle's changes
|
|
220
|
+
ROLLBACK TO SAVEPOINT sp_middle;
|
|
221
|
+
SELECT count(*) FROM tx_t WHERE id = 503;
|
|
222
|
+
→ [{ "count(*)": 0 }]
|
|
223
|
+
SELECT count(*) FROM tx_t WHERE id = 502;
|
|
224
|
+
→ [{ "count(*)": 0 }]
|
|
225
|
+
-- sp_outer's insert and base should still be visible
|
|
226
|
+
SELECT count(*) FROM tx_t WHERE id = 501;
|
|
227
|
+
→ [{ "count(*)": 1 }]
|
|
228
|
+
SELECT count(*) FROM tx_t WHERE id = 500;
|
|
229
|
+
→ [{ "count(*)": 1 }]
|
|
230
|
+
|
|
231
|
+
RELEASE SAVEPOINT sp_middle;
|
|
232
|
+
RELEASE SAVEPOINT sp_outer;
|
|
233
|
+
COMMIT;
|
|
234
|
+
|
|
235
|
+
-- Verify final state
|
|
236
|
+
SELECT count(*) FROM tx_t WHERE id >= 500;
|
|
237
|
+
→ [{ "count(*)": 2 }]
|
|
238
|
+
|
|
239
|
+
DROP TABLE tx_t;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
-- 04a-savepoint-lazy-attach.sqllogic
|
|
2
|
+
-- Regression coverage for the case where a SAVEPOINT is created before a
|
|
3
|
+
-- table's VirtualTableConnection has been registered with the database.
|
|
4
|
+
--
|
|
5
|
+
-- For modules whose connections register lazily on first read/write
|
|
6
|
+
-- (memory module, isolation layer, etc.), the active savepoint stack must
|
|
7
|
+
-- be replayed onto the new connection so that subsequent ROLLBACK TO /
|
|
8
|
+
-- RELEASE broadcasts targeting earlier depths land on real entries rather
|
|
9
|
+
-- than silently no-op'ing on an out-of-range index.
|
|
10
|
+
|
|
11
|
+
-- ===================================
|
|
12
|
+
-- Case 1: SAVEPOINT before any access on a never-touched table
|
|
13
|
+
-- ===================================
|
|
14
|
+
|
|
15
|
+
CREATE TABLE t1 (id INTEGER PRIMARY KEY, v TEXT);
|
|
16
|
+
-- run
|
|
17
|
+
|
|
18
|
+
BEGIN;
|
|
19
|
+
SAVEPOINT sp;
|
|
20
|
+
INSERT INTO t1 VALUES (1, 'x');
|
|
21
|
+
-- visible inside the savepoint
|
|
22
|
+
SELECT count(*) FROM t1;
|
|
23
|
+
→ [{ "count(*)": 1 }]
|
|
24
|
+
ROLLBACK TO SAVEPOINT sp;
|
|
25
|
+
-- the INSERT must be undone
|
|
26
|
+
SELECT count(*) FROM t1;
|
|
27
|
+
→ [{ "count(*)": 0 }]
|
|
28
|
+
ROLLBACK;
|
|
29
|
+
|
|
30
|
+
-- Outside the transaction the table is still empty
|
|
31
|
+
SELECT count(*) FROM t1;
|
|
32
|
+
→ [{ "count(*)": 0 }]
|
|
33
|
+
|
|
34
|
+
-- ===================================
|
|
35
|
+
-- Case 2: Nested savepoints before any access; ROLLBACK TO outer + RELEASE outer
|
|
36
|
+
-- ===================================
|
|
37
|
+
|
|
38
|
+
BEGIN;
|
|
39
|
+
SAVEPOINT outer_sp;
|
|
40
|
+
SAVEPOINT inner_sp;
|
|
41
|
+
INSERT INTO t1 VALUES (10, 'y');
|
|
42
|
+
SELECT count(*) FROM t1;
|
|
43
|
+
→ [{ "count(*)": 1 }]
|
|
44
|
+
ROLLBACK TO SAVEPOINT outer_sp;
|
|
45
|
+
SELECT count(*) FROM t1;
|
|
46
|
+
→ [{ "count(*)": 0 }]
|
|
47
|
+
RELEASE SAVEPOINT outer_sp;
|
|
48
|
+
COMMIT;
|
|
49
|
+
|
|
50
|
+
SELECT count(*) FROM t1;
|
|
51
|
+
→ [{ "count(*)": 0 }]
|
|
52
|
+
|
|
53
|
+
-- ===================================
|
|
54
|
+
-- Case 3: Prior committed write + nested savepoint rollbacks
|
|
55
|
+
-- ===================================
|
|
56
|
+
-- Verifies that the existing committed row stays put while nested writes
|
|
57
|
+
-- inside lazily-attached transactions are correctly undone at each level.
|
|
58
|
+
|
|
59
|
+
INSERT INTO t1 VALUES (100, 'committed');
|
|
60
|
+
-- run
|
|
61
|
+
|
|
62
|
+
BEGIN;
|
|
63
|
+
SAVEPOINT outer_sp;
|
|
64
|
+
INSERT INTO t1 VALUES (101, 'outer-era');
|
|
65
|
+
SAVEPOINT inner_sp;
|
|
66
|
+
INSERT INTO t1 VALUES (102, 'inner-era');
|
|
67
|
+
SELECT count(*) FROM t1;
|
|
68
|
+
→ [{ "count(*)": 3 }]
|
|
69
|
+
ROLLBACK TO SAVEPOINT inner_sp;
|
|
70
|
+
-- inner-era gone, outer-era stays
|
|
71
|
+
SELECT count(*) FROM t1;
|
|
72
|
+
→ [{ "count(*)": 2 }]
|
|
73
|
+
SELECT v FROM t1 WHERE id = 101;
|
|
74
|
+
→ [{ "v": "outer-era" }]
|
|
75
|
+
ROLLBACK TO SAVEPOINT outer_sp;
|
|
76
|
+
-- outer-era now gone too; committed row remains
|
|
77
|
+
SELECT count(*) FROM t1;
|
|
78
|
+
→ [{ "count(*)": 1 }]
|
|
79
|
+
SELECT v FROM t1 WHERE id = 100;
|
|
80
|
+
→ [{ "v": "committed" }]
|
|
81
|
+
COMMIT;
|
|
82
|
+
|
|
83
|
+
-- After commit, only the originally-committed row survives
|
|
84
|
+
SELECT count(*) FROM t1;
|
|
85
|
+
→ [{ "count(*)": 1 }]
|
|
86
|
+
SELECT v FROM t1 WHERE id = 100;
|
|
87
|
+
→ [{ "v": "committed" }]
|
|
88
|
+
|
|
89
|
+
-- Clean up
|
|
90
|
+
DELETE FROM t1;
|
|
91
|
+
-- run
|
|
92
|
+
|
|
93
|
+
-- ===================================
|
|
94
|
+
-- Case 4: SELECT before SAVEPOINT (isolation-specific)
|
|
95
|
+
-- ===================================
|
|
96
|
+
-- The SELECT registers an IsolatedConnection for t1 before the savepoint, so
|
|
97
|
+
-- onConnectionSavepoint fires and populates savepointsBeforeOverlay. The
|
|
98
|
+
-- subsequent INSERT creates the overlay lazily, and ROLLBACK TO sp must wipe
|
|
99
|
+
-- it. This exercises the pre-existing pre-overlay path which remains live as
|
|
100
|
+
-- a secondary guard alongside the registerConnection replay.
|
|
101
|
+
|
|
102
|
+
INSERT INTO t1 VALUES (200, 'pre-tx');
|
|
103
|
+
-- run
|
|
104
|
+
|
|
105
|
+
BEGIN;
|
|
106
|
+
SELECT count(*) FROM t1;
|
|
107
|
+
→ [{ "count(*)": 1 }]
|
|
108
|
+
SAVEPOINT sp;
|
|
109
|
+
INSERT INTO t1 VALUES (201, 'will-vanish');
|
|
110
|
+
SELECT count(*) FROM t1;
|
|
111
|
+
→ [{ "count(*)": 2 }]
|
|
112
|
+
ROLLBACK TO SAVEPOINT sp;
|
|
113
|
+
SELECT count(*) FROM t1;
|
|
114
|
+
→ [{ "count(*)": 1 }]
|
|
115
|
+
SELECT v FROM t1 WHERE id = 200;
|
|
116
|
+
→ [{ "v": "pre-tx" }]
|
|
117
|
+
COMMIT;
|
|
118
|
+
|
|
119
|
+
SELECT count(*) FROM t1;
|
|
120
|
+
→ [{ "count(*)": 1 }]
|
|
121
|
+
|
|
122
|
+
DROP TABLE t1;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
-- vtab_memory.sqllogic - Testing MemoryTable specific features, especially access paths
|
|
2
|
+
|
|
3
|
+
PRAGMA default_vtab_module='memory';
|
|
4
|
+
|
|
5
|
+
-- Setup with PRIMARY KEY and another index potential
|
|
6
|
+
CREATE TABLE mem_t (id INTEGER PRIMARY KEY, name TEXT, age INTEGER, city TEXT);
|
|
7
|
+
INSERT INTO mem_t VALUES (1, 'Alice', 30, 'New York'), (2, 'Bob', 25, 'London'), (3, 'Charlie', 35, 'New York'), (4, 'David', 30, 'Paris');
|
|
8
|
+
|
|
9
|
+
-- Expect PK point lookup (idxNum=1 likely)
|
|
10
|
+
-- NOTE: We can't directly assert idxNum here, but verify behavior
|
|
11
|
+
SELECT * FROM mem_t WHERE id = 3;
|
|
12
|
+
→ [{"id":3,"name":"Charlie","age":35,"city":"New York"}]
|
|
13
|
+
|
|
14
|
+
-- Expect PK range scan
|
|
15
|
+
SELECT name FROM mem_t WHERE id > 1 AND id < 4 ORDER BY id;
|
|
16
|
+
→ [{"name":"Bob"},{"name":"Charlie"}]
|
|
17
|
+
|
|
18
|
+
-- Expect full table scan (no usable index on name directly for EQ)
|
|
19
|
+
SELECT id FROM mem_t WHERE name = 'Bob';
|
|
20
|
+
→ [{"id":2}]
|
|
21
|
+
|
|
22
|
+
-- ORDER BY PK should be consumed by index scan
|
|
23
|
+
SELECT id FROM mem_t WHERE id > 1 ORDER BY id LIMIT 2;
|
|
24
|
+
→ [{"id":2},{"id":3}]
|
|
25
|
+
|
|
26
|
+
-- ORDER BY non-indexed column requires VDBE sort
|
|
27
|
+
SELECT id FROM mem_t ORDER BY age, name;
|
|
28
|
+
→ [{"id":2},{"id":1},{"id":4},{"id":3}]
|
|
29
|
+
|
|
30
|
+
-- Filter and Order interaction
|
|
31
|
+
SELECT name FROM mem_t WHERE city = 'New York' ORDER BY age;
|
|
32
|
+
→ [{"name":"Alice"},{"name":"Charlie"}]
|
|
33
|
+
|
|
34
|
+
-- Test transactions (covered more in transactions.sqllogic, but include a basic check)
|
|
35
|
+
BEGIN;
|
|
36
|
+
INSERT INTO mem_t VALUES (5, 'Eve', 28, 'London');
|
|
37
|
+
SELECT count(*) FROM mem_t WHERE city = 'London';
|
|
38
|
+
→ [{ "count(*)": 2 }]
|
|
39
|
+
ROLLBACK;
|
|
40
|
+
SELECT count(*) FROM mem_t WHERE city = 'London';
|
|
41
|
+
→ [{ "count(*)": 1 }]
|
|
42
|
+
|
|
43
|
+
-- Test multiple constraints - PK likely preferred
|
|
44
|
+
SELECT name FROM mem_t WHERE id > 1 AND age = 30;
|
|
45
|
+
→ [{"name":"David"}]
|
|
46
|
+
|
|
47
|
+
DROP TABLE mem_t;
|
|
48
|
+
|
|
49
|
+
-- Explicit unique-index collation governing enforcement lives in
|
|
50
|
+
-- 05.0.1-vtab-memory-unique-index-collation (it needs standalone CREATE INDEX).
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
-- 05.0.1-vtab-memory-unique-index-collation.sqllogic
|
|
2
|
+
--
|
|
3
|
+
-- requires-capability: standalone-index-ddl
|
|
4
|
+
--
|
|
5
|
+
-- Carved out of 05-vtab_memory: that file's subject is MemoryTable access-path
|
|
6
|
+
-- behavior (PK point lookup, PK range scan, full scan, ORDER BY consumption,
|
|
7
|
+
-- transactions), none of which needs index DDL. This trailing section was the
|
|
8
|
+
-- file's only `create unique index`, and kept a backend without standalone index
|
|
9
|
+
-- DDL from running any of the access-path coverage.
|
|
10
|
+
--
|
|
11
|
+
-- Subject: a unique index declaring a COARSER collation than its column unifies
|
|
12
|
+
-- case-variants — enforcement runs through the index's comparator, and the
|
|
13
|
+
-- conflict validator re-compares candidates under the index's per-column
|
|
14
|
+
-- collation (checkUniqueViaIndex) — re-checking under the column's BINARY
|
|
15
|
+
-- collation would skip the case-variants the index legitimately unifies.
|
|
16
|
+
-- (The converse — a FINER index over a NOCASE column admitting both
|
|
17
|
+
-- variants — is pinned by test/planner/collation-soundness.spec.ts.)
|
|
18
|
+
|
|
19
|
+
PRAGMA default_vtab_module='memory';
|
|
20
|
+
|
|
21
|
+
CREATE TABLE mem_uci (id INTEGER PRIMARY KEY, b TEXT);
|
|
22
|
+
CREATE UNIQUE INDEX mem_uci_b ON mem_uci (b COLLATE NOCASE);
|
|
23
|
+
INSERT INTO mem_uci VALUES (1, 'Bob');
|
|
24
|
+
|
|
25
|
+
-- a case-variant collides under the index's NOCASE collation
|
|
26
|
+
INSERT INTO mem_uci VALUES (2, 'BOB');
|
|
27
|
+
-- error: UNIQUE constraint failed
|
|
28
|
+
|
|
29
|
+
-- a genuinely different value still inserts
|
|
30
|
+
INSERT INTO mem_uci VALUES (3, 'Carol');
|
|
31
|
+
SELECT id, b FROM mem_uci ORDER BY id;
|
|
32
|
+
→ [{"id":1,"b":"Bob"},{"id":3,"b":"Carol"}]
|
|
33
|
+
|
|
34
|
+
DROP TABLE mem_uci;
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
-- 05.1-composite-pk-range-scan.sqllogic
|
|
2
|
+
-- Regression: a range scan with a lower bound on the leading column of a
|
|
3
|
+
-- COMPOSITE primary key must return every matching row, not just the last one.
|
|
4
|
+
-- (The multi-column secondary-index counterpart is 05.1.1-secondary-index-range-scan,
|
|
5
|
+
-- split out because it needs standalone CREATE INDEX.) Previously the memory-table scanner
|
|
6
|
+
-- built a scalar seek key against array-shaped composite keys, mispositioning
|
|
7
|
+
-- the cursor so the ascending scan collapsed to the final row.
|
|
8
|
+
|
|
9
|
+
PRAGMA default_vtab_module='memory';
|
|
10
|
+
|
|
11
|
+
-- Composite PK (a, b). BTree keys are arrays [a, b].
|
|
12
|
+
CREATE TABLE t (a INTEGER, b INTEGER, v TEXT, PRIMARY KEY (a, b));
|
|
13
|
+
INSERT INTO t VALUES (10, 0, 'x'), (20, 0, 'y'), (30, 0, 'z');
|
|
14
|
+
|
|
15
|
+
-- Lower bound below all keys: all rows.
|
|
16
|
+
SELECT a FROM t WHERE a >= 5 ORDER BY a;
|
|
17
|
+
→ [{"a":10},{"a":20},{"a":30}]
|
|
18
|
+
|
|
19
|
+
-- Lower bound on an exact key (inclusive): all rows from that key.
|
|
20
|
+
SELECT a FROM t WHERE a >= 10 ORDER BY a;
|
|
21
|
+
→ [{"a":10},{"a":20},{"a":30}]
|
|
22
|
+
|
|
23
|
+
-- Lower bound between keys.
|
|
24
|
+
SELECT a FROM t WHERE a >= 15 ORDER BY a;
|
|
25
|
+
→ [{"a":20},{"a":30}]
|
|
26
|
+
|
|
27
|
+
-- Exclusive lower bound on an exact key.
|
|
28
|
+
SELECT a FROM t WHERE a > 10 ORDER BY a;
|
|
29
|
+
→ [{"a":20},{"a":30}]
|
|
30
|
+
|
|
31
|
+
-- Combined lower + upper bound.
|
|
32
|
+
SELECT a FROM t WHERE a >= 10 AND a < 30 ORDER BY a;
|
|
33
|
+
→ [{"a":10},{"a":20}]
|
|
34
|
+
|
|
35
|
+
-- Upper-bound-only (control: was always correct).
|
|
36
|
+
SELECT a FROM t WHERE a <= 25 ORDER BY a;
|
|
37
|
+
→ [{"a":10},{"a":20}]
|
|
38
|
+
|
|
39
|
+
DROP TABLE t;
|
|
40
|
+
|
|
41
|
+
-- Three-column composite PK.
|
|
42
|
+
CREATE TABLE t3 (hlc_ts INTEGER, node_id TEXT, seq INTEGER, v TEXT, PRIMARY KEY (hlc_ts, node_id, seq));
|
|
43
|
+
INSERT INTO t3 VALUES (100, 'n', 0, 'a'), (300, 'n', 0, 'a'), (500, 'n', 0, 'a'), (700, 'n', 0, 'a');
|
|
44
|
+
|
|
45
|
+
SELECT hlc_ts FROM t3 WHERE hlc_ts >= 0 ORDER BY hlc_ts;
|
|
46
|
+
→ [{"hlc_ts":100},{"hlc_ts":300},{"hlc_ts":500},{"hlc_ts":700}]
|
|
47
|
+
|
|
48
|
+
SELECT hlc_ts FROM t3 WHERE hlc_ts >= 0 AND hlc_ts < 1000 ORDER BY hlc_ts;
|
|
49
|
+
→ [{"hlc_ts":100},{"hlc_ts":300},{"hlc_ts":500},{"hlc_ts":700}]
|
|
50
|
+
|
|
51
|
+
SELECT count(*) AS n FROM t3 WHERE hlc_ts >= 0 AND hlc_ts < 1000;
|
|
52
|
+
→ [{"n":4}]
|
|
53
|
+
|
|
54
|
+
DROP TABLE t3;
|
|
55
|
+
|
|
56
|
+
-- Single-column PK (control: scalar seek key matches scalar stored keys).
|
|
57
|
+
CREATE TABLE s (id INTEGER PRIMARY KEY, v TEXT);
|
|
58
|
+
INSERT INTO s VALUES (10, 'a'), (20, 'b'), (30, 'c');
|
|
59
|
+
|
|
60
|
+
SELECT id FROM s WHERE id >= 0 ORDER BY id;
|
|
61
|
+
→ [{"id":10},{"id":20},{"id":30}]
|
|
62
|
+
|
|
63
|
+
DROP TABLE s;
|
|
64
|
+
|
|
65
|
+
-- The multi-column SECONDARY index variants of these range scans (ASC- and
|
|
66
|
+
-- DESC-leading) live in 05.1.1-secondary-index-range-scan; they need standalone
|
|
67
|
+
-- CREATE INDEX, everything here works off PRIMARY KEY declarations alone.
|
|
68
|
+
|
|
69
|
+
-- Composite PRIMARY KEY with a DESC leading column. The primary BTree is
|
|
70
|
+
-- physically ordered with the leading column descending, so an ascending
|
|
71
|
+
-- physical scan must seek from the upper bound and terminate at the lower
|
|
72
|
+
-- bound. Previously the primary branch lacked this handling and dropped every
|
|
73
|
+
-- matching row for a leading-column lower-bound range.
|
|
74
|
+
CREATE TABLE td (a INTEGER, b INTEGER, v TEXT, PRIMARY KEY (a DESC, b));
|
|
75
|
+
INSERT INTO td VALUES (10, 0, 'x'), (20, 0, 'y'), (30, 0, 'z');
|
|
76
|
+
|
|
77
|
+
-- The originally reported failing query.
|
|
78
|
+
SELECT a FROM td WHERE a >= 15 ORDER BY a;
|
|
79
|
+
→ [{"a":20},{"a":30}]
|
|
80
|
+
|
|
81
|
+
-- Inclusive lower bound on an exact key.
|
|
82
|
+
SELECT a FROM td WHERE a >= 20 ORDER BY a;
|
|
83
|
+
→ [{"a":20},{"a":30}]
|
|
84
|
+
|
|
85
|
+
-- Exclusive lower bound on an exact key.
|
|
86
|
+
SELECT a FROM td WHERE a > 20 ORDER BY a;
|
|
87
|
+
→ [{"a":30}]
|
|
88
|
+
|
|
89
|
+
-- Leading-column range (lower + upper bound).
|
|
90
|
+
SELECT a FROM td WHERE a >= 15 AND a < 30 ORDER BY a;
|
|
91
|
+
→ [{"a":20}]
|
|
92
|
+
|
|
93
|
+
-- Descending output over a DESC-leading PK with a leading-column bound.
|
|
94
|
+
SELECT a FROM td WHERE a >= 15 ORDER BY a DESC;
|
|
95
|
+
→ [{"a":30},{"a":20}]
|
|
96
|
+
|
|
97
|
+
-- Descending output combined with a leading-column range.
|
|
98
|
+
SELECT a FROM td WHERE a >= 15 AND a < 30 ORDER BY a DESC;
|
|
99
|
+
→ [{"a":20}]
|
|
100
|
+
|
|
101
|
+
DROP TABLE td;
|
|
102
|
+
|
|
103
|
+
-- Three-column composite PRIMARY KEY with a DESC leading column.
|
|
104
|
+
CREATE TABLE td3 (a INTEGER, b TEXT, c INTEGER, v TEXT, PRIMARY KEY (a DESC, b, c));
|
|
105
|
+
INSERT INTO td3 VALUES (100, 'n', 0, 'a'), (300, 'n', 0, 'a'), (500, 'n', 0, 'a'), (700, 'n', 0, 'a');
|
|
106
|
+
|
|
107
|
+
SELECT a FROM td3 WHERE a >= 250 ORDER BY a;
|
|
108
|
+
→ [{"a":300},{"a":500},{"a":700}]
|
|
109
|
+
|
|
110
|
+
SELECT a FROM td3 WHERE a >= 250 AND a < 600 ORDER BY a;
|
|
111
|
+
→ [{"a":300},{"a":500}]
|
|
112
|
+
|
|
113
|
+
SELECT count(*) AS n FROM td3 WHERE a >= 250 AND a < 600;
|
|
114
|
+
→ [{"n":2}]
|
|
115
|
+
|
|
116
|
+
DROP TABLE td3;
|
|
117
|
+
|
|
118
|
+
-- DESC-leading PK with DUPLICATE leading-column values. The early-termination
|
|
119
|
+
-- break keys off the leading column only, so it must not truncate sibling rows
|
|
120
|
+
-- that share the boundary value, nor break early while still inside the range.
|
|
121
|
+
CREATE TABLE tdup (a INTEGER, b INTEGER, v TEXT, PRIMARY KEY (a DESC, b));
|
|
122
|
+
INSERT INTO tdup VALUES (20, 1, 'p'), (20, 2, 'q'), (10, 1, 'r'), (30, 1, 's');
|
|
123
|
+
|
|
124
|
+
-- Lower bound only: both a=20 rows must come through (no premature break at the
|
|
125
|
+
-- first a=20 row), and the scan must stop once it drops below 15.
|
|
126
|
+
SELECT a, b FROM tdup WHERE a >= 15 ORDER BY a, b;
|
|
127
|
+
→ [{"a":20,"b":1},{"a":20,"b":2},{"a":30,"b":1}]
|
|
128
|
+
|
|
129
|
+
-- Exclusive lower bound landing on a duplicated leading value: every a=20 row is
|
|
130
|
+
-- excluded, the break fires only after exhausting them.
|
|
131
|
+
SELECT a, b FROM tdup WHERE a > 20 ORDER BY a, b;
|
|
132
|
+
→ [{"a":30,"b":1}]
|
|
133
|
+
|
|
134
|
+
-- Inclusive lower bound on the duplicated value keeps all a=20 rows.
|
|
135
|
+
SELECT count(*) AS n FROM tdup WHERE a >= 20;
|
|
136
|
+
→ [{"n":3}]
|
|
137
|
+
|
|
138
|
+
-- Upper-bound-only range over a DESC-leading PK (no lower bound → the DESC
|
|
139
|
+
-- early-termination guard never fires; correctness rests on planAppliesToKey).
|
|
140
|
+
SELECT a, b FROM tdup WHERE a < 25 ORDER BY a, b;
|
|
141
|
+
→ [{"a":10,"b":1},{"a":20,"b":1},{"a":20,"b":2}]
|
|
142
|
+
|
|
143
|
+
-- Inclusive upper bound on an exact (duplicated) key.
|
|
144
|
+
SELECT a, b FROM tdup WHERE a <= 20 ORDER BY a, b;
|
|
145
|
+
→ [{"a":10,"b":1},{"a":20,"b":1},{"a":20,"b":2}]
|
|
146
|
+
|
|
147
|
+
DROP TABLE tdup;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
-- 05.1.1-secondary-index-range-scan.sqllogic
|
|
2
|
+
--
|
|
3
|
+
-- requires-capability: standalone-index-ddl
|
|
4
|
+
--
|
|
5
|
+
-- Carved out of 05.1-composite-pk-range-scan: that file's subject is leading-column
|
|
6
|
+
-- range scans over composite (and DESC-leading composite) PRIMARY KEYS, which need
|
|
7
|
+
-- no index DDL at all. These two scenarios build a standalone multi-column SECONDARY
|
|
8
|
+
-- index purely as a comparison point for the same seek-key bug, so they lived only to
|
|
9
|
+
-- cover the secondary branch — and would have made the whole PK file unrunnable on a
|
|
10
|
+
-- backend without first-class CREATE INDEX.
|
|
11
|
+
--
|
|
12
|
+
-- Subject: a range scan bounded on the leading column of a multi-column SECONDARY
|
|
13
|
+
-- index must return every matching row (ASC-leading and DESC-leading variants).
|
|
14
|
+
|
|
15
|
+
PRAGMA default_vtab_module='memory';
|
|
16
|
+
|
|
17
|
+
-- Multi-column SECONDARY index, leading-column range scan. The PK is a single
|
|
18
|
+
-- scalar column so the primary path is unaffected; force the secondary index
|
|
19
|
+
-- to drive the scan via a leading-column range on a composite index.
|
|
20
|
+
CREATE TABLE idx_t (id INTEGER PRIMARY KEY, k INTEGER, name TEXT, v TEXT);
|
|
21
|
+
CREATE INDEX idx_kn ON idx_t (k, name);
|
|
22
|
+
INSERT INTO idx_t VALUES (1, 10, 'a', 'p'), (2, 20, 'b', 'q'), (3, 30, 'c', 'r');
|
|
23
|
+
|
|
24
|
+
SELECT id FROM idx_t WHERE k >= 10 ORDER BY k;
|
|
25
|
+
→ [{"id":1},{"id":2},{"id":3}]
|
|
26
|
+
|
|
27
|
+
SELECT id FROM idx_t WHERE k >= 15 ORDER BY k;
|
|
28
|
+
→ [{"id":2},{"id":3}]
|
|
29
|
+
|
|
30
|
+
SELECT id FROM idx_t WHERE k >= 10 AND k < 30 ORDER BY k;
|
|
31
|
+
→ [{"id":1},{"id":2}]
|
|
32
|
+
|
|
33
|
+
DROP TABLE idx_t;
|
|
34
|
+
|
|
35
|
+
-- Multi-column SECONDARY index with a DESC leading column. The secondary
|
|
36
|
+
-- branch carries isDescFirstColumn handling (the lower-bound wrap is
|
|
37
|
+
-- direction-independent), so a leading-column range still returns every row.
|
|
38
|
+
-- (The primary branch lacks this handling — tracked separately.)
|
|
39
|
+
CREATE TABLE idx_d (id INTEGER PRIMARY KEY, k INTEGER, name TEXT, v TEXT);
|
|
40
|
+
CREATE INDEX idx_kn_d ON idx_d (k DESC, name);
|
|
41
|
+
INSERT INTO idx_d VALUES (1, 10, 'a', 'p'), (2, 20, 'b', 'q'), (3, 30, 'c', 'r');
|
|
42
|
+
|
|
43
|
+
SELECT id FROM idx_d WHERE k >= 15 ORDER BY k;
|
|
44
|
+
→ [{"id":2},{"id":3}]
|
|
45
|
+
|
|
46
|
+
-- Upper-bound range on the DESC-leading secondary index. An ascending physical
|
|
47
|
+
-- walk over a DESC-leading composite index seeks from the upper bound; that
|
|
48
|
+
-- scalar bound is wrapped in a single-element array so the comparator positions
|
|
49
|
+
-- the seek at the bound rather than at a tree extreme. NOTE: the pre-wrap scalar
|
|
50
|
+
-- form was inefficient (a bare scalar sorts to one tree end, forcing a full
|
|
51
|
+
-- forward scan) but still correct here — it landed at the start of the walk, so
|
|
52
|
+
-- this case is a result-correctness assertion, not a row-drop regression guard.
|
|
53
|
+
SELECT id FROM idx_d WHERE k <= 25 ORDER BY k;
|
|
54
|
+
→ [{"id":1},{"id":2}]
|
|
55
|
+
|
|
56
|
+
DROP TABLE idx_d;
|