@quereus/quereus 4.20.0 → 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/dist/src/common/types.d.ts +4 -4
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/schema/catalog-rendering.js +13 -1
- package/dist/src/schema/catalog-rendering.js.map +1 -1
- package/dist/src/schema/catalog.d.ts +35 -2
- package/dist/src/schema/catalog.d.ts.map +1 -1
- package/dist/src/schema/catalog.js +42 -33
- package/dist/src/schema/catalog.js.map +1 -1
- package/dist/src/schema/schema-differ.d.ts +1 -1
- package/dist/src/schema/schema-differ.d.ts.map +1 -1
- package/dist/src/schema/schema-differ.js +195 -33
- package/dist/src/schema/schema-differ.js.map +1 -1
- package/dist/src/schema/unique-enforcement.d.ts +23 -1
- package/dist/src/schema/unique-enforcement.d.ts.map +1 -1
- package/dist/src/schema/unique-enforcement.js +43 -1
- package/dist/src/schema/unique-enforcement.js.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts +15 -12
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +87 -100
- package/dist/src/vtab/memory/layer/manager.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 +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,173 @@
|
|
|
1
|
+
-- 50.2.1-declare-schema-index-renames.sqllogic
|
|
2
|
+
--
|
|
3
|
+
-- requires-capability: standalone-index-ddl
|
|
4
|
+
--
|
|
5
|
+
-- Carved out of 50.2-declare-schema-renames: the declarative-schema rename/diff engine
|
|
6
|
+
-- treats tables, views and indexes as three parallel object kinds, and 50.2 exercises the
|
|
7
|
+
-- whole engine (hint resolution, drop+create ordering, in-diff column and table renames,
|
|
8
|
+
-- rename policies, ambiguity guards) on the table and view kinds with no index DDL.
|
|
9
|
+
-- These four sections are the INDEX-kind instances, so they live here.
|
|
10
|
+
--
|
|
11
|
+
-- Section numbers keep their original 50.2 labels so cross-references still resolve.
|
|
12
|
+
--
|
|
13
|
+
-- Subject: a hinted index rename becomes DROP INDEX + recreate, orders correctly against
|
|
14
|
+
-- an in-diff column or table rename of its source, and does not trip the require-hint
|
|
15
|
+
-- guard.
|
|
16
|
+
|
|
17
|
+
-- ===================================
|
|
18
|
+
-- 17. Hinted INDEX rename, body unchanged → drop + recreate
|
|
19
|
+
-- ===================================
|
|
20
|
+
|
|
21
|
+
create table ir_t (id integer primary key, category text);
|
|
22
|
+
create index ix_old on ir_t (category);
|
|
23
|
+
|
|
24
|
+
declare schema main {
|
|
25
|
+
table ir_t {
|
|
26
|
+
id integer primary key,
|
|
27
|
+
category text
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
index ix_new on ir_t (category) with tags ("quereus.previous_name" = 'ix_old')
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
-- run
|
|
34
|
+
|
|
35
|
+
diff schema main;
|
|
36
|
+
→ [{"ddl": "DROP INDEX IF EXISTS ix_old"}, {"ddl": "create index ix_new on ir_t (category) with tags (\"quereus.previous_name\" = 'ix_old')"}]
|
|
37
|
+
|
|
38
|
+
apply schema main;
|
|
39
|
+
|
|
40
|
+
-- run
|
|
41
|
+
|
|
42
|
+
select name, tbl_name from schema() where type = 'index';
|
|
43
|
+
→ [{"name": "ix_new", "tbl_name": "ir_t"}]
|
|
44
|
+
|
|
45
|
+
diff schema main;
|
|
46
|
+
→ []
|
|
47
|
+
|
|
48
|
+
drop index ix_new;
|
|
49
|
+
drop table ir_t;
|
|
50
|
+
|
|
51
|
+
-- ===================================
|
|
52
|
+
-- 20. Hinted INDEX rename + in-diff COLUMN rename of its table
|
|
53
|
+
-- ===================================
|
|
54
|
+
|
|
55
|
+
create table irc_t (id integer primary key, amount integer not null);
|
|
56
|
+
create index irc_old on irc_t (amount);
|
|
57
|
+
|
|
58
|
+
declare schema main {
|
|
59
|
+
table irc_t {
|
|
60
|
+
id integer primary key,
|
|
61
|
+
qty integer not null with tags ("quereus.previous_name" = 'amount')
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
index irc_new on irc_t (qty) with tags ("quereus.previous_name" = 'irc_old')
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
-- run
|
|
68
|
+
|
|
69
|
+
-- The recreate names the OLD column (RENAME COLUMN runs after creates); the
|
|
70
|
+
-- propagation rewrites the fresh index's columns.
|
|
71
|
+
diff schema main;
|
|
72
|
+
→ [{"ddl": "DROP INDEX IF EXISTS irc_old"}, {"ddl": "create index irc_new on irc_t (amount) with tags (\"quereus.previous_name\" = 'irc_old')"}, {"ddl": "ALTER TABLE irc_t RENAME COLUMN amount TO qty"}]
|
|
73
|
+
|
|
74
|
+
apply schema main;
|
|
75
|
+
|
|
76
|
+
-- run
|
|
77
|
+
|
|
78
|
+
select name from schema() where type = 'index';
|
|
79
|
+
→ [{"name": "irc_new"}]
|
|
80
|
+
|
|
81
|
+
diff schema main;
|
|
82
|
+
→ []
|
|
83
|
+
|
|
84
|
+
drop index irc_new;
|
|
85
|
+
drop table irc_t;
|
|
86
|
+
|
|
87
|
+
-- ===================================
|
|
88
|
+
-- 21. require-hint: hinted view + index renames apply cleanly
|
|
89
|
+
-- ===================================
|
|
90
|
+
|
|
91
|
+
-- A hinted rename's drop+create pair is deliberate, not an ambiguous unhinted
|
|
92
|
+
-- rename — it must not trip the require-hint guard (excluded from the counts,
|
|
93
|
+
-- like the body-change recreates of §14).
|
|
94
|
+
|
|
95
|
+
create table rh2_t (id integer primary key, v integer);
|
|
96
|
+
create view rh2_vold as select id, v from rh2_t;
|
|
97
|
+
create index rh2_ixold on rh2_t (v);
|
|
98
|
+
|
|
99
|
+
declare schema main {
|
|
100
|
+
table rh2_t {
|
|
101
|
+
id integer primary key,
|
|
102
|
+
v integer
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
view rh2_vnew as select id, v from rh2_t with tags ("quereus.previous_name" = 'rh2_vold')
|
|
106
|
+
|
|
107
|
+
index rh2_ixnew on rh2_t (v) with tags ("quereus.previous_name" = 'rh2_ixold')
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
-- run
|
|
111
|
+
|
|
112
|
+
apply schema main options (rename_policy = 'require-hint');
|
|
113
|
+
|
|
114
|
+
-- run
|
|
115
|
+
|
|
116
|
+
diff schema main;
|
|
117
|
+
→ []
|
|
118
|
+
|
|
119
|
+
select name from schema() where type = 'view';
|
|
120
|
+
→ [{"name": "rh2_vnew"}]
|
|
121
|
+
|
|
122
|
+
select name from schema() where type = 'index';
|
|
123
|
+
→ [{"name": "rh2_ixnew"}]
|
|
124
|
+
|
|
125
|
+
drop view rh2_vnew;
|
|
126
|
+
drop index rh2_ixnew;
|
|
127
|
+
drop table rh2_t;
|
|
128
|
+
|
|
129
|
+
-- ===================================
|
|
130
|
+
-- 22. Hinted VIEW + INDEX rename + in-diff TABLE rename of their source
|
|
131
|
+
-- ===================================
|
|
132
|
+
|
|
133
|
+
-- The recreates keep the DECLARED table name (no inverse table pass): table
|
|
134
|
+
-- renames emit FIRST in migration order, so the new name is live by the time
|
|
135
|
+
-- the view/index creates plan their bodies.
|
|
136
|
+
|
|
137
|
+
create table src_old (id integer primary key, v integer);
|
|
138
|
+
create view trv_old as select id, v from src_old;
|
|
139
|
+
create index tri_old on src_old (v);
|
|
140
|
+
insert into src_old values (1, 10);
|
|
141
|
+
|
|
142
|
+
declare schema main {
|
|
143
|
+
table src_new {
|
|
144
|
+
id integer primary key,
|
|
145
|
+
v integer
|
|
146
|
+
} with tags ("quereus.previous_name" = 'src_old')
|
|
147
|
+
|
|
148
|
+
view trv_new as select id, v from src_new with tags ("quereus.previous_name" = 'trv_old')
|
|
149
|
+
|
|
150
|
+
index tri_new on src_new (v) with tags ("quereus.previous_name" = 'tri_old')
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
-- run
|
|
154
|
+
|
|
155
|
+
diff schema main;
|
|
156
|
+
→ [{"ddl": "ALTER TABLE src_old RENAME TO src_new"}, {"ddl": "DROP VIEW IF EXISTS trv_old"}, {"ddl": "DROP INDEX IF EXISTS tri_old"}, {"ddl": "create view trv_new as select id, v from src_new with tags (\"quereus.previous_name\" = 'trv_old')"}, {"ddl": "create index tri_new on src_new (v) with tags (\"quereus.previous_name\" = 'tri_old')"}]
|
|
157
|
+
|
|
158
|
+
apply schema main;
|
|
159
|
+
|
|
160
|
+
-- run
|
|
161
|
+
|
|
162
|
+
select * from trv_new order by id;
|
|
163
|
+
→ [{"id": 1, "v": 10}]
|
|
164
|
+
|
|
165
|
+
select name, tbl_name from schema() where type = 'index';
|
|
166
|
+
→ [{"name": "tri_new", "tbl_name": "src_new"}]
|
|
167
|
+
|
|
168
|
+
diff schema main;
|
|
169
|
+
→ []
|
|
170
|
+
|
|
171
|
+
drop view trv_new;
|
|
172
|
+
drop index tri_new;
|
|
173
|
+
drop table src_new;
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
-- 50.3-declare-schema-duplicate-names.sqllogic
|
|
2
|
+
--
|
|
3
|
+
-- A declared schema names each object once (docs/invariants.md SCH-003).
|
|
4
|
+
-- Every `declared*` map in the differ's collection loop is keyed schema-wide by
|
|
5
|
+
-- lowercased name, so a repeated declaration used to silently last-writer-wins:
|
|
6
|
+
-- the first declaration never reached the migration and no diagnostic fired.
|
|
7
|
+
|
|
8
|
+
-- ===================================
|
|
9
|
+
-- 1. Same-kind duplicates
|
|
10
|
+
-- ===================================
|
|
11
|
+
|
|
12
|
+
declare schema dup_table using (default_vtab_module = 'memory') {
|
|
13
|
+
table t1 {
|
|
14
|
+
id integer primary key,
|
|
15
|
+
a text
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
table t1 {
|
|
19
|
+
id integer primary key,
|
|
20
|
+
b text
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
-- run
|
|
25
|
+
|
|
26
|
+
diff schema dup_table;
|
|
27
|
+
-- error: Table 't1' is declared more than once in schema 'dup_table'
|
|
28
|
+
|
|
29
|
+
-- `apply schema` surfaces the same rejection, before any DDL runs.
|
|
30
|
+
apply schema dup_table;
|
|
31
|
+
-- error: Table 't1' is declared more than once in schema 'dup_table'
|
|
32
|
+
|
|
33
|
+
-- Names compare case-insensitively.
|
|
34
|
+
declare schema dup_table_case using (default_vtab_module = 'memory') {
|
|
35
|
+
table T1 {
|
|
36
|
+
id integer primary key,
|
|
37
|
+
a text
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
table t1 {
|
|
41
|
+
id integer primary key,
|
|
42
|
+
b text
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
-- run
|
|
47
|
+
|
|
48
|
+
diff schema dup_table_case;
|
|
49
|
+
-- error: Table 't1' is declared more than once in schema 'dup_table_case'
|
|
50
|
+
|
|
51
|
+
declare schema dup_view using (default_vtab_module = 'memory') {
|
|
52
|
+
table t1 {
|
|
53
|
+
id integer primary key,
|
|
54
|
+
a text
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
view v as select id as x from t1
|
|
58
|
+
|
|
59
|
+
view v as select a as y from t1
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
-- run
|
|
63
|
+
|
|
64
|
+
diff schema dup_view;
|
|
65
|
+
-- error: View 'v' is declared more than once in schema 'dup_view'
|
|
66
|
+
|
|
67
|
+
-- Both materialized-view bodies are FROM-less on purpose: a `materialized view`
|
|
68
|
+
-- item written directly after an item whose body ends at a FROM source is
|
|
69
|
+
-- misparsed (`materialized` is taken as a table alias) — see ticket
|
|
70
|
+
-- bug-declare-schema-materialized-swallowed-as-table-alias.
|
|
71
|
+
declare schema dup_mv using (default_vtab_module = 'memory') {
|
|
72
|
+
materialized view mv as select 1 as one
|
|
73
|
+
|
|
74
|
+
materialized view mv as select 2 as two
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
-- run
|
|
78
|
+
|
|
79
|
+
diff schema dup_mv;
|
|
80
|
+
-- error: Materialized view 'mv' is declared more than once in schema 'dup_mv'
|
|
81
|
+
|
|
82
|
+
-- Assertions live in main.
|
|
83
|
+
declare schema main {
|
|
84
|
+
table dup_assert_t {
|
|
85
|
+
id integer primary key,
|
|
86
|
+
n integer
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
assertion ck check (not exists (select 1 from dup_assert_t where n < 0))
|
|
90
|
+
|
|
91
|
+
assertion ck check (not exists (select 1 from dup_assert_t where n < 1))
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
-- run
|
|
95
|
+
|
|
96
|
+
diff schema main;
|
|
97
|
+
-- error: Assertion 'ck' is declared more than once in schema 'main'
|
|
98
|
+
|
|
99
|
+
-- ===================================
|
|
100
|
+
-- 2. Cross-kind duplicates (table / view / materialized view share one namespace)
|
|
101
|
+
-- ===================================
|
|
102
|
+
|
|
103
|
+
-- `Schema.addView` rejects a view whose name a table already holds, so this
|
|
104
|
+
-- declaration could never apply — it used to emit both CREATEs, run the table
|
|
105
|
+
-- create, then fail deep in the migration loop leaving the table behind.
|
|
106
|
+
declare schema dup_cross using (default_vtab_module = 'memory') {
|
|
107
|
+
table dual {
|
|
108
|
+
id integer primary key
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
view dual as select 1 as one
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
-- run
|
|
115
|
+
|
|
116
|
+
diff schema dup_cross;
|
|
117
|
+
-- error: 'dual' is declared as both a table and a view in schema 'dup_cross'
|
|
118
|
+
|
|
119
|
+
-- Kinds are named in declaration order.
|
|
120
|
+
declare schema dup_cross_rev using (default_vtab_module = 'memory') {
|
|
121
|
+
view dual as select 1 as one
|
|
122
|
+
|
|
123
|
+
table dual {
|
|
124
|
+
id integer primary key
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
-- run
|
|
129
|
+
|
|
130
|
+
diff schema dup_cross_rev;
|
|
131
|
+
-- error: 'dual' is declared as both a view and a table in schema 'dup_cross_rev'
|
|
132
|
+
|
|
133
|
+
declare schema dup_cross_mv using (default_vtab_module = 'memory') {
|
|
134
|
+
table mv {
|
|
135
|
+
id integer primary key
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
materialized view mv as select 1 as one
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
-- run
|
|
142
|
+
|
|
143
|
+
diff schema dup_cross_mv;
|
|
144
|
+
-- error: 'mv' is declared as both a table and a materialized view in schema 'dup_cross_mv'
|
|
145
|
+
|
|
146
|
+
-- ===================================
|
|
147
|
+
-- 3. Duplicate seed blocks (rejected at declare time, not diff time)
|
|
148
|
+
-- ===================================
|
|
149
|
+
|
|
150
|
+
-- Seed rows are stored one block per table, so a second block for the same table
|
|
151
|
+
-- used to discard the first block's rows. The differ never sees seed items, so
|
|
152
|
+
-- the guard runs when the declaration is stored — nothing is stored at all.
|
|
153
|
+
declare schema dup_seed using (default_vtab_module = 'memory') {
|
|
154
|
+
table t {
|
|
155
|
+
id integer primary key,
|
|
156
|
+
n integer
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
seed t (
|
|
160
|
+
(1, 10)
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
seed t (
|
|
164
|
+
(2, 20)
|
|
165
|
+
)
|
|
166
|
+
}
|
|
167
|
+
-- error: Seed data for table 't' is declared more than once in schema 'dup_seed'
|
|
168
|
+
|
|
169
|
+
-- The rejected declaration was not stored.
|
|
170
|
+
diff schema dup_seed;
|
|
171
|
+
-- error: No declared schema found for 'dup_seed'
|
|
172
|
+
|
|
173
|
+
-- Target table names compare case-insensitively here too.
|
|
174
|
+
declare schema dup_seed_case using (default_vtab_module = 'memory') {
|
|
175
|
+
table t {
|
|
176
|
+
id integer primary key,
|
|
177
|
+
n integer
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
seed T (
|
|
181
|
+
(1, 10)
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
seed t (
|
|
185
|
+
(2, 20)
|
|
186
|
+
)
|
|
187
|
+
}
|
|
188
|
+
-- error: Seed data for table 't' is declared more than once in schema 'dup_seed_case'
|
|
189
|
+
|
|
190
|
+
-- A rejected declaration leaves an EARLIER good one for the same schema intact:
|
|
191
|
+
-- the guard runs before `clearSeedData` and `setDeclaredSchema`, so neither the
|
|
192
|
+
-- stored declaration nor the stored seed rows are touched.
|
|
193
|
+
declare schema seed_keep using (default_vtab_module = 'memory') {
|
|
194
|
+
table t {
|
|
195
|
+
id integer primary key,
|
|
196
|
+
n integer
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
seed t (
|
|
200
|
+
(1, 10)
|
|
201
|
+
)
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
-- run
|
|
205
|
+
|
|
206
|
+
apply schema seed_keep with seed;
|
|
207
|
+
|
|
208
|
+
-- run
|
|
209
|
+
|
|
210
|
+
declare schema seed_keep using (default_vtab_module = 'memory') {
|
|
211
|
+
table t {
|
|
212
|
+
id integer primary key,
|
|
213
|
+
n integer
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
seed t (
|
|
217
|
+
(2, 20)
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
seed t (
|
|
221
|
+
(3, 30)
|
|
222
|
+
)
|
|
223
|
+
}
|
|
224
|
+
-- error: Seed data for table 't' is declared more than once in schema 'seed_keep'
|
|
225
|
+
|
|
226
|
+
-- The prior declaration survives (the diff still converges) ...
|
|
227
|
+
diff schema seed_keep;
|
|
228
|
+
→ []
|
|
229
|
+
|
|
230
|
+
-- ... and so do its stored seed rows: wipe the table and re-seed from the store.
|
|
231
|
+
delete from seed_keep.t;
|
|
232
|
+
|
|
233
|
+
-- run
|
|
234
|
+
|
|
235
|
+
apply schema seed_keep with seed;
|
|
236
|
+
|
|
237
|
+
-- run
|
|
238
|
+
|
|
239
|
+
select n from seed_keep.t;
|
|
240
|
+
→ [{"n":10}]
|
|
241
|
+
|
|
242
|
+
-- ===================================
|
|
243
|
+
-- 4. Positive control — distinct names apply cleanly
|
|
244
|
+
-- ===================================
|
|
245
|
+
|
|
246
|
+
declare schema dup_ok using (default_vtab_module = 'memory') {
|
|
247
|
+
table t1 {
|
|
248
|
+
id integer primary key,
|
|
249
|
+
a text
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
table t2 {
|
|
253
|
+
id integer primary key,
|
|
254
|
+
b text
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
seed t1 (
|
|
258
|
+
(1, 'alpha')
|
|
259
|
+
)
|
|
260
|
+
|
|
261
|
+
seed t2 (
|
|
262
|
+
(2, 'beta')
|
|
263
|
+
)
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
-- run
|
|
267
|
+
|
|
268
|
+
apply schema dup_ok with seed;
|
|
269
|
+
|
|
270
|
+
-- run
|
|
271
|
+
|
|
272
|
+
select a from dup_ok.t1 where id = 1;
|
|
273
|
+
→ [{"a":"alpha"}]
|
|
274
|
+
|
|
275
|
+
select b from dup_ok.t2 where id = 2;
|
|
276
|
+
→ [{"b":"beta"}]
|
|
277
|
+
|
|
278
|
+
-- Re-applying stays clean: the declaration is unambiguous, so the diff converges.
|
|
279
|
+
diff schema dup_ok;
|
|
280
|
+
→ []
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
-- Declarative schema: a migration that fails partway is unwound, so the catalog is back where
|
|
2
|
+
-- the apply found it. Tightening a named constraint whose new body the existing rows violate
|
|
3
|
+
-- is the motivating case: the plan is DROP CONSTRAINT + ADD CONSTRAINT, the re-add fails its
|
|
4
|
+
-- existing-row validation, and the undo journal re-adds the OLD constraint — which must not
|
|
5
|
+
-- only be back in the catalog but still be enforced. Runs on both backends
|
|
6
|
+
-- (see docs/schema.md § Failure and restoration; the executor is runBatchedMigrationLoop).
|
|
7
|
+
|
|
8
|
+
-- ===================================
|
|
9
|
+
-- 1. CHECK tightened against a violating row
|
|
10
|
+
-- ===================================
|
|
11
|
+
|
|
12
|
+
create table t_ck (id integer primary key, v integer, constraint ck_v check (v > 0));
|
|
13
|
+
insert into t_ck values (1, 5);
|
|
14
|
+
|
|
15
|
+
declare schema main {
|
|
16
|
+
table t_ck {
|
|
17
|
+
id integer primary key,
|
|
18
|
+
v integer,
|
|
19
|
+
constraint ck_v check (v > 10)
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
-- run
|
|
24
|
+
|
|
25
|
+
diff schema main;
|
|
26
|
+
→ [{"ddl": "ALTER TABLE t_ck DROP CONSTRAINT ck_v"}, {"ddl": "ALTER TABLE t_ck ADD constraint ck_v check (v > 10)"}]
|
|
27
|
+
|
|
28
|
+
-- The re-add fails over the row v = 5; the DROP that preceded it is undone.
|
|
29
|
+
apply schema main;
|
|
30
|
+
-- error: ck_v
|
|
31
|
+
|
|
32
|
+
-- The row is untouched, the old rule is back, and it is still enforced.
|
|
33
|
+
select v from t_ck;
|
|
34
|
+
→ [{"v": 5}]
|
|
35
|
+
|
|
36
|
+
insert into t_ck values (2, -1);
|
|
37
|
+
-- error: CHECK constraint failed
|
|
38
|
+
|
|
39
|
+
insert into t_ck values (2, 7);
|
|
40
|
+
|
|
41
|
+
-- run
|
|
42
|
+
|
|
43
|
+
-- Re-diffing produces the original plan again: nothing about the failure was cached.
|
|
44
|
+
diff schema main;
|
|
45
|
+
→ [{"ddl": "ALTER TABLE t_ck DROP CONSTRAINT ck_v"}, {"ddl": "ALTER TABLE t_ck ADD constraint ck_v check (v > 10)"}]
|
|
46
|
+
|
|
47
|
+
drop table t_ck;
|
|
48
|
+
|
|
49
|
+
-- ===================================
|
|
50
|
+
-- 2. UNIQUE tightened against duplicate rows
|
|
51
|
+
-- ===================================
|
|
52
|
+
|
|
53
|
+
create table t_uq (id integer primary key, a integer, b integer, constraint uq_ab unique (a, b));
|
|
54
|
+
insert into t_uq values (1, 1, 1), (2, 1, 2);
|
|
55
|
+
|
|
56
|
+
declare schema main {
|
|
57
|
+
table t_uq {
|
|
58
|
+
id integer primary key,
|
|
59
|
+
a integer,
|
|
60
|
+
b integer,
|
|
61
|
+
constraint uq_ab unique (a)
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
-- run
|
|
66
|
+
|
|
67
|
+
apply schema main;
|
|
68
|
+
-- error: uq_ab
|
|
69
|
+
|
|
70
|
+
-- The old two-column rule is back: a duplicate (a, b) is refused, a duplicate a alone is not.
|
|
71
|
+
insert into t_uq values (3, 1, 1);
|
|
72
|
+
-- error: UNIQUE constraint failed
|
|
73
|
+
|
|
74
|
+
insert into t_uq values (3, 1, 3);
|
|
75
|
+
|
|
76
|
+
-- run
|
|
77
|
+
|
|
78
|
+
select count(*) as n from t_uq;
|
|
79
|
+
→ [{"n": 3}]
|
|
80
|
+
|
|
81
|
+
drop table t_uq;
|
|
82
|
+
|
|
83
|
+
-- ===================================
|
|
84
|
+
-- 3. FOREIGN KEY re-targeted at a column the child rows do not match
|
|
85
|
+
-- ===================================
|
|
86
|
+
|
|
87
|
+
create table p (id integer primary key, alt integer, constraint uq_alt unique (alt));
|
|
88
|
+
insert into p values (1, 100);
|
|
89
|
+
create table c (id integer primary key, pid integer, constraint fk_p foreign key (pid) references p(id));
|
|
90
|
+
insert into c values (1, 1);
|
|
91
|
+
|
|
92
|
+
declare schema main {
|
|
93
|
+
table p {
|
|
94
|
+
id integer primary key,
|
|
95
|
+
alt integer,
|
|
96
|
+
constraint uq_alt unique (alt)
|
|
97
|
+
}
|
|
98
|
+
table c {
|
|
99
|
+
id integer primary key,
|
|
100
|
+
pid integer,
|
|
101
|
+
constraint fk_p foreign key (pid) references p(alt)
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
-- run
|
|
106
|
+
|
|
107
|
+
-- pid = 1 is a p.id, not a p.alt, so the re-add fails and the old reference is restored.
|
|
108
|
+
apply schema main;
|
|
109
|
+
-- error: fk_p
|
|
110
|
+
|
|
111
|
+
insert into c values (2, 999);
|
|
112
|
+
-- error: constraint failed: fk_p
|
|
113
|
+
|
|
114
|
+
insert into c values (2, 1);
|
|
115
|
+
|
|
116
|
+
-- run
|
|
117
|
+
|
|
118
|
+
select count(*) as n from c;
|
|
119
|
+
→ [{"n": 2}]
|
|
120
|
+
|
|
121
|
+
drop table c;
|
|
122
|
+
drop table p;
|
|
123
|
+
|
|
124
|
+
-- ===================================
|
|
125
|
+
-- 4. A multi-step plan: the steps that landed before the failure are taken back
|
|
126
|
+
-- ===================================
|
|
127
|
+
|
|
128
|
+
create table t (id integer primary key, v text null);
|
|
129
|
+
insert into t values (1, 'a');
|
|
130
|
+
|
|
131
|
+
declare schema main {
|
|
132
|
+
table t {
|
|
133
|
+
id integer primary key,
|
|
134
|
+
v text null,
|
|
135
|
+
w integer not null
|
|
136
|
+
}
|
|
137
|
+
table n1 {
|
|
138
|
+
id integer primary key
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
-- run
|
|
143
|
+
|
|
144
|
+
-- create table n1 lands, then ALTER TABLE t ADD COLUMN w fails over the existing row.
|
|
145
|
+
diff schema main;
|
|
146
|
+
→ [{"ddl": "create table n1 (id integer primary key)"}, {"ddl": "ALTER TABLE t ADD COLUMN w integer not null"}]
|
|
147
|
+
|
|
148
|
+
apply schema main;
|
|
149
|
+
-- error: NOT NULL constraint failed
|
|
150
|
+
|
|
151
|
+
-- n1 is gone again and t has no w.
|
|
152
|
+
select * from n1;
|
|
153
|
+
-- error: not found
|
|
154
|
+
|
|
155
|
+
select * from t;
|
|
156
|
+
→ [{"id": 1, "v": "a"}]
|
|
157
|
+
|
|
158
|
+
diff schema main;
|
|
159
|
+
→ [{"ddl": "create table n1 (id integer primary key)"}, {"ddl": "ALTER TABLE t ADD COLUMN w integer not null"}]
|
|
160
|
+
|
|
161
|
+
-- ===================================
|
|
162
|
+
-- 5. The same failure inside an explicit transaction: savepoint-like
|
|
163
|
+
-- ===================================
|
|
164
|
+
|
|
165
|
+
begin;
|
|
166
|
+
insert into t values (2, 'b');
|
|
167
|
+
apply schema main;
|
|
168
|
+
-- error: NOT NULL constraint failed
|
|
169
|
+
|
|
170
|
+
-- The transaction is still open and usable after the restored failure.
|
|
171
|
+
insert into t values (3, 'c');
|
|
172
|
+
commit;
|
|
173
|
+
|
|
174
|
+
-- run
|
|
175
|
+
|
|
176
|
+
select id from t order by id;
|
|
177
|
+
→ [{"id": 1}, {"id": 2}, {"id": 3}]
|
|
178
|
+
|
|
179
|
+
select * from n1;
|
|
180
|
+
-- error: not found
|
|
181
|
+
|
|
182
|
+
-- Once the violating rows are gone the same declaration applies cleanly.
|
|
183
|
+
delete from t;
|
|
184
|
+
apply schema main;
|
|
185
|
+
|
|
186
|
+
-- run
|
|
187
|
+
|
|
188
|
+
diff schema main;
|
|
189
|
+
→ []
|
|
190
|
+
|
|
191
|
+
drop table n1;
|
|
192
|
+
drop table t;
|