@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,274 @@
|
|
|
1
|
+
-- ALTER TABLE DROP COLUMN vs. the table's OWN foreign keys.
|
|
2
|
+
--
|
|
3
|
+
-- A foreign key records which of its own table's columns it constrains by POSITION
|
|
4
|
+
-- (`foreignKeys[].columns` is an array of indices into that table's column list), so a
|
|
5
|
+
-- DROP COLUMN has to renumber them — exactly as it already renumbers the primary key,
|
|
6
|
+
-- the secondary indexes and the UNIQUE constraints. A key that loses any of its child
|
|
7
|
+
-- columns is removed outright rather than narrowed (a key missing a child column is a
|
|
8
|
+
-- different constraint against the parent's key). Left unshifted, a surviving key's
|
|
9
|
+
-- index either dangles past the end of the column array (raw TypeError on the next
|
|
10
|
+
-- enforced write) or silently slides onto an unrelated column.
|
|
11
|
+
--
|
|
12
|
+
-- These cases run under both the memory module (`yarn test`) and the store module
|
|
13
|
+
-- (`yarn test:store`, which additionally round-trips the corrected keys through the
|
|
14
|
+
-- persisted DDL). Assertions read `foreign_key_info`, which is module-agnostic and
|
|
15
|
+
-- resolves the `from` column as `columns[fk.columns[seq]].name` — the very read that
|
|
16
|
+
-- raises on a dangling index.
|
|
17
|
+
--
|
|
18
|
+
-- NOTE: the `-- error:` lines match the auto-generated constraint name (`_fk_<table>_<cols>`)
|
|
19
|
+
-- on purpose — the name proves WHICH column is being enforced, which a generic `foreign key`
|
|
20
|
+
-- match would not. If that naming convention ever changes, update these expectations; the
|
|
21
|
+
-- convention itself is pinned by `41.4-alter-add-column-constraints.sqllogic` § 7e.
|
|
22
|
+
--
|
|
23
|
+
-- Most keys here are declared with `create table`; § 10 covers the same rule for a key
|
|
24
|
+
-- an `alter table add column … references …` created, which is also the shape the engine
|
|
25
|
+
-- reverts by dropping the just-added column.
|
|
26
|
+
|
|
27
|
+
pragma foreign_keys = true;
|
|
28
|
+
|
|
29
|
+
create table FkP (pid integer primary key);
|
|
30
|
+
insert into FkP values (1), (2);
|
|
31
|
+
|
|
32
|
+
-- ===================================================================
|
|
33
|
+
-- 1. A key whose child column sits AFTER the dropped one shifts down and
|
|
34
|
+
-- keeps constraining the same column.
|
|
35
|
+
-- ===================================================================
|
|
36
|
+
|
|
37
|
+
create table FkShift (id integer primary key, a integer, fkcol integer references FkP(pid));
|
|
38
|
+
insert into FkShift values (1, 10, 1);
|
|
39
|
+
|
|
40
|
+
-- Drop `a`, which precedes the FK child column: the recorded position 2 must become 1.
|
|
41
|
+
alter table FkShift drop column a;
|
|
42
|
+
|
|
43
|
+
-- Introspection resolves the child column (a dangling index throws here instead).
|
|
44
|
+
select "from", "to" from foreign_key_info('FkShift');
|
|
45
|
+
→ [{"from":"fkcol","to":"pid"}]
|
|
46
|
+
|
|
47
|
+
-- Still enforced, and against the CORRECT column: an orphan is rejected. The
|
|
48
|
+
-- constraint named in the error is the one declared on `fkcol`, not a slid-over key.
|
|
49
|
+
insert into FkShift values (2, 99);
|
|
50
|
+
-- error: _fk_fkshift_fkcol
|
|
51
|
+
|
|
52
|
+
-- ...while a value present in the parent is accepted.
|
|
53
|
+
insert into FkShift values (3, 2);
|
|
54
|
+
select count(*) as c from FkShift;
|
|
55
|
+
→ [{"c":2}]
|
|
56
|
+
|
|
57
|
+
-- ===================================================================
|
|
58
|
+
-- 2. Dropping the key's ONLY child column removes the whole key — it must not
|
|
59
|
+
-- slide onto the next column along. This is the silent-corruption case: with
|
|
60
|
+
-- the key left in place, position 1 now names the unrelated text column `z`,
|
|
61
|
+
-- which the engine would then check against the parent's integer key.
|
|
62
|
+
-- ===================================================================
|
|
63
|
+
|
|
64
|
+
create table FkGone (id integer primary key, fkcol integer references FkP(pid), z text);
|
|
65
|
+
insert into FkGone values (1, 1, 'a');
|
|
66
|
+
alter table FkGone drop column fkcol;
|
|
67
|
+
|
|
68
|
+
-- No key survives, so `foreignKeys` is back to empty.
|
|
69
|
+
select count(*) as c from foreign_key_info('FkGone');
|
|
70
|
+
→ [{"c":0}]
|
|
71
|
+
|
|
72
|
+
-- `z` is unconstrained: a text value that is no parent key inserts cleanly.
|
|
73
|
+
insert into FkGone values (11, 'r');
|
|
74
|
+
select count(*) as c from FkGone;
|
|
75
|
+
→ [{"c":2}]
|
|
76
|
+
|
|
77
|
+
-- ===================================================================
|
|
78
|
+
-- 3. A MULTI-column key that loses one of its columns is removed in full —
|
|
79
|
+
-- not narrowed to its surviving columns.
|
|
80
|
+
-- ===================================================================
|
|
81
|
+
|
|
82
|
+
create table FkP2 (a integer, b integer, primary key (a, b));
|
|
83
|
+
insert into FkP2 values (1, 2);
|
|
84
|
+
|
|
85
|
+
create table FkMulti (id integer primary key, x integer, y integer, foreign key (x, y) references FkP2(a, b));
|
|
86
|
+
insert into FkMulti values (1, 1, 2);
|
|
87
|
+
|
|
88
|
+
-- Enforced over the pair while both columns exist.
|
|
89
|
+
insert into FkMulti values (2, 9, 9);
|
|
90
|
+
-- error: _fk_fkmulti_x_y
|
|
91
|
+
|
|
92
|
+
alter table FkMulti drop column y;
|
|
93
|
+
select count(*) as c from foreign_key_info('FkMulti');
|
|
94
|
+
→ [{"c":0}]
|
|
95
|
+
|
|
96
|
+
-- `x` alone is no longer constrained against FkP2.a — a narrowed leftover key
|
|
97
|
+
-- would have rejected this.
|
|
98
|
+
insert into FkMulti values (3, 77);
|
|
99
|
+
select count(*) as c from FkMulti;
|
|
100
|
+
→ [{"c":2}]
|
|
101
|
+
|
|
102
|
+
-- ===================================================================
|
|
103
|
+
-- 4. Control: dropping a column the key does NOT use leaves it enforcing.
|
|
104
|
+
-- ===================================================================
|
|
105
|
+
|
|
106
|
+
create table FkKeep (id integer primary key, fkcol integer references FkP(pid), z text);
|
|
107
|
+
insert into FkKeep values (1, 1, 'a');
|
|
108
|
+
|
|
109
|
+
-- `z` is the trailing column — no recorded position changes.
|
|
110
|
+
alter table FkKeep drop column z;
|
|
111
|
+
select "from", "to" from foreign_key_info('FkKeep');
|
|
112
|
+
→ [{"from":"fkcol","to":"pid"}]
|
|
113
|
+
|
|
114
|
+
insert into FkKeep values (2, 99);
|
|
115
|
+
-- error: _fk_fkkeep_fkcol
|
|
116
|
+
insert into FkKeep values (3, 2);
|
|
117
|
+
select count(*) as c from FkKeep;
|
|
118
|
+
→ [{"c":2}]
|
|
119
|
+
|
|
120
|
+
-- ===================================================================
|
|
121
|
+
-- 5. Two keys, one dropped and one shifted in the same statement: the partition
|
|
122
|
+
-- must remove `f1`'s key AND renumber `f2`'s from position 2 to 1.
|
|
123
|
+
-- ===================================================================
|
|
124
|
+
|
|
125
|
+
create table FkTwo (id integer primary key, f1 integer references FkP(pid), f2 integer references FkP(pid));
|
|
126
|
+
insert into FkTwo values (1, 1, 2);
|
|
127
|
+
alter table FkTwo drop column f1;
|
|
128
|
+
|
|
129
|
+
select "from", "to" from foreign_key_info('FkTwo');
|
|
130
|
+
→ [{"from":"f2","to":"pid"}]
|
|
131
|
+
|
|
132
|
+
-- The survivor enforces over f2, not over the vacated slot — and the error names
|
|
133
|
+
-- f2's own constraint, so the shift landed on the right column.
|
|
134
|
+
insert into FkTwo values (2, 99);
|
|
135
|
+
-- error: _fk_fktwo_f2
|
|
136
|
+
insert into FkTwo values (3, 1);
|
|
137
|
+
select count(*) as c from FkTwo;
|
|
138
|
+
→ [{"c":2}]
|
|
139
|
+
|
|
140
|
+
-- ===================================================================
|
|
141
|
+
-- 6. A referential ACTION still fires correctly after a preceding drop — the
|
|
142
|
+
-- cascade path reads the same child column indices.
|
|
143
|
+
-- ===================================================================
|
|
144
|
+
|
|
145
|
+
create table FkCascP (pid integer primary key);
|
|
146
|
+
insert into FkCascP values (1), (2);
|
|
147
|
+
|
|
148
|
+
create table FkCasc (id integer primary key, a integer, fkcol integer references FkCascP(pid) on delete cascade);
|
|
149
|
+
insert into FkCasc values (1, 10, 1);
|
|
150
|
+
insert into FkCasc values (2, 20, 2);
|
|
151
|
+
|
|
152
|
+
-- Drop the column preceding the FK child column, then trigger the cascade.
|
|
153
|
+
alter table FkCasc drop column a;
|
|
154
|
+
delete from FkCascP where pid = 1;
|
|
155
|
+
|
|
156
|
+
-- Only the child of the deleted parent went away.
|
|
157
|
+
select id, fkcol from FkCasc order by id;
|
|
158
|
+
→ [{"id":2,"fkcol":2}]
|
|
159
|
+
|
|
160
|
+
-- ===================================================================
|
|
161
|
+
-- 7. Declaration shape is irrelevant to the shift: an explicitly NAMED key,
|
|
162
|
+
-- a MULTI-column key whose columns all move, and an `on update` action all
|
|
163
|
+
-- renumber the same way. (The partition never reads `name`, and the actions
|
|
164
|
+
-- read the shifted child positions.)
|
|
165
|
+
-- ===================================================================
|
|
166
|
+
|
|
167
|
+
create table FkNamed (id integer primary key, a integer, fkcol integer, constraint fk_named foreign key (fkcol) references FkP(pid));
|
|
168
|
+
insert into FkNamed values (1, 10, 1);
|
|
169
|
+
alter table FkNamed drop column a;
|
|
170
|
+
select "from", "to", name from foreign_key_info('FkNamed');
|
|
171
|
+
→ [{"from":"fkcol","to":"pid","name":"fk_named"}]
|
|
172
|
+
insert into FkNamed values (2, 99);
|
|
173
|
+
-- error: fk_named
|
|
174
|
+
|
|
175
|
+
-- Both child positions of a composite key move down one.
|
|
176
|
+
create table FkMultiShift (id integer primary key, dead integer, x integer, y integer, foreign key (x, y) references FkP2(a, b));
|
|
177
|
+
insert into FkMultiShift values (1, 0, 1, 2);
|
|
178
|
+
alter table FkMultiShift drop column dead;
|
|
179
|
+
select "from", "to", seq from foreign_key_info('FkMultiShift') order by seq;
|
|
180
|
+
→ [{"from":"x","to":"a","seq":0},{"from":"y","to":"b","seq":1}]
|
|
181
|
+
insert into FkMultiShift values (2, 9, 9);
|
|
182
|
+
-- error: _fk_fkmultishift_x_y
|
|
183
|
+
insert into FkMultiShift values (3, 1, 2);
|
|
184
|
+
select count(*) as c from FkMultiShift;
|
|
185
|
+
→ [{"c":2}]
|
|
186
|
+
|
|
187
|
+
-- `on update cascade` rewrites the child through the shifted position.
|
|
188
|
+
create table FkUpP (pid integer primary key);
|
|
189
|
+
insert into FkUpP values (1);
|
|
190
|
+
create table FkUpC (id integer primary key, dead integer, fkcol integer references FkUpP(pid) on update cascade);
|
|
191
|
+
insert into FkUpC values (1, 0, 1);
|
|
192
|
+
alter table FkUpC drop column dead;
|
|
193
|
+
update FkUpP set pid = 5 where pid = 1;
|
|
194
|
+
select id, fkcol from FkUpC;
|
|
195
|
+
→ [{"id":1,"fkcol":5}]
|
|
196
|
+
|
|
197
|
+
-- ===================================================================
|
|
198
|
+
-- 8. A DEFERRED key still resolves at COMMIT against the shifted position.
|
|
199
|
+
-- ===================================================================
|
|
200
|
+
|
|
201
|
+
create table FkDef (id integer primary key, dead integer, fkcol integer references FkP(pid) deferrable initially deferred);
|
|
202
|
+
alter table FkDef drop column dead;
|
|
203
|
+
begin;
|
|
204
|
+
insert into FkDef values (1, 7);
|
|
205
|
+
insert into FkP values (7);
|
|
206
|
+
commit;
|
|
207
|
+
select id, fkcol from FkDef;
|
|
208
|
+
→ [{"id":1,"fkcol":7}]
|
|
209
|
+
|
|
210
|
+
-- ===================================================================
|
|
211
|
+
-- 9. A SELF-referential key shifts on the child side and keeps resolving its
|
|
212
|
+
-- parent column by name against the narrowed table.
|
|
213
|
+
-- ===================================================================
|
|
214
|
+
|
|
215
|
+
create table FkSelf (id integer primary key, a integer, parent_id integer null references FkSelf(id));
|
|
216
|
+
insert into FkSelf values (1, 10, null);
|
|
217
|
+
alter table FkSelf drop column a;
|
|
218
|
+
select "from", "to" from foreign_key_info('FkSelf');
|
|
219
|
+
→ [{"from":"parent_id","to":"id"}]
|
|
220
|
+
insert into FkSelf values (2, 1);
|
|
221
|
+
insert into FkSelf values (3, 77);
|
|
222
|
+
-- error: _fk_fkself_parent_id
|
|
223
|
+
select count(*) as c from FkSelf;
|
|
224
|
+
→ [{"c":2}]
|
|
225
|
+
|
|
226
|
+
-- ===================================================================
|
|
227
|
+
-- 10. A key created by `add column … references …` is removed by dropping that
|
|
228
|
+
-- same column — the shape the engine's own ADD COLUMN revert path takes.
|
|
229
|
+
-- ===================================================================
|
|
230
|
+
|
|
231
|
+
create table FkAdded (id integer primary key, z text);
|
|
232
|
+
insert into FkAdded values (1, 'a');
|
|
233
|
+
alter table FkAdded add column fkcol integer null references FkP(pid);
|
|
234
|
+
select count(*) as c from foreign_key_info('FkAdded');
|
|
235
|
+
→ [{"c":1}]
|
|
236
|
+
alter table FkAdded drop column fkcol;
|
|
237
|
+
select count(*) as c from foreign_key_info('FkAdded');
|
|
238
|
+
→ [{"c":0}]
|
|
239
|
+
|
|
240
|
+
-- ===================================================================
|
|
241
|
+
-- 11. DROP COLUMN lands *between* a deferred check being queued and the COMMIT
|
|
242
|
+
-- that evaluates it. The parked check carries a row image and a plan frozen
|
|
243
|
+
-- at write time, so a column vanishing under it on either side is the shape
|
|
244
|
+
-- most likely to mismatch arity. Case 8 above drops before the transaction;
|
|
245
|
+
-- these drop inside it.
|
|
246
|
+
-- ===================================================================
|
|
247
|
+
|
|
248
|
+
-- parent side
|
|
249
|
+
create table FkMidP (pid integer primary key, extra text);
|
|
250
|
+
create table FkMidC (id integer primary key,
|
|
251
|
+
fkcol integer null references FkMidP(pid) deferrable initially deferred);
|
|
252
|
+
|
|
253
|
+
begin;
|
|
254
|
+
insert into FkMidC values (10, 1);
|
|
255
|
+
insert into FkMidP values (1, 'x');
|
|
256
|
+
alter table FkMidP drop column extra;
|
|
257
|
+
commit;
|
|
258
|
+
|
|
259
|
+
select id, fkcol from FkMidC;
|
|
260
|
+
→ [{"id":10,"fkcol":1}]
|
|
261
|
+
|
|
262
|
+
-- child side (the table the parked row itself belongs to)
|
|
263
|
+
create table FkMid2P (pid integer primary key);
|
|
264
|
+
create table FkMid2C (id integer primary key, extra text,
|
|
265
|
+
fkcol integer null references FkMid2P(pid) deferrable initially deferred);
|
|
266
|
+
|
|
267
|
+
begin;
|
|
268
|
+
insert into FkMid2C values (10, 'x', 1);
|
|
269
|
+
insert into FkMid2P values (1);
|
|
270
|
+
alter table FkMid2C drop column extra;
|
|
271
|
+
commit;
|
|
272
|
+
|
|
273
|
+
select id, fkcol from FkMid2C;
|
|
274
|
+
→ [{"id":10,"fkcol":1}]
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
-- 41.10.1-alter-drop-column-unique-index.sqllogic
|
|
2
|
+
--
|
|
3
|
+
-- requires-capability: standalone-index-ddl
|
|
4
|
+
--
|
|
5
|
+
-- Subject: `ALTER TABLE … DROP COLUMN` over a standalone `CREATE INDEX` that spans the
|
|
6
|
+
-- dropped column — which of the two fates the index meets, and whether the rows it
|
|
7
|
+
-- indexes are still answered correctly afterwards.
|
|
8
|
+
--
|
|
9
|
+
-- A UNIQUE index spanning the dropped column must be removed OUTRIGHT, not narrowed to
|
|
10
|
+
-- its surviving columns — narrowing invents a UNIQUE the table never declared, and one
|
|
11
|
+
-- nothing enforces (the matching derived UNIQUE constraint is removed, since a
|
|
12
|
+
-- constraint missing one of its columns is a different, stronger constraint). A
|
|
13
|
+
-- narrowed survivor would then be reported by index_info, trusted by the planner's
|
|
14
|
+
-- at-most-one-matching-row proofs, and re-persisted as a real CREATE UNIQUE INDEX.
|
|
15
|
+
-- A plain (non-unique) index is narrowed instead, and survives.
|
|
16
|
+
--
|
|
17
|
+
-- Sections 4 and 5 index rows written BEFORE the drop, which is what exercises a
|
|
18
|
+
-- module's obligation to reshape the index's PHYSICAL structure — re-encode the one the
|
|
19
|
+
-- drop narrowed (its key holds one fewer column value), tear down the one it removed. A
|
|
20
|
+
-- module that only rewrites the schema answers a later indexed lookup SHORT (the narrowed
|
|
21
|
+
-- case) or DOUBLE (a same-named index rebuilt over a store still holding the removed
|
|
22
|
+
-- index's entries).
|
|
23
|
+
--
|
|
24
|
+
-- Every case runs under the memory module (`yarn test`) and the store module
|
|
25
|
+
-- (`yarn test:store`); the assertions read module-agnostic engine introspection.
|
|
26
|
+
|
|
27
|
+
-- ===================================================================
|
|
28
|
+
-- 1. A UNIQUE index spanning the dropped column is removed outright
|
|
29
|
+
-- ===================================================================
|
|
30
|
+
|
|
31
|
+
create table DcUx (id integer primary key, b integer, c integer);
|
|
32
|
+
create unique index ux_bc on DcUx (b, c);
|
|
33
|
+
alter table DcUx drop column b;
|
|
34
|
+
-- run
|
|
35
|
+
|
|
36
|
+
-- Neither the index nor its derived constraint survives.
|
|
37
|
+
select count(*) as c from index_info('DcUx');
|
|
38
|
+
→ [{"c":0}]
|
|
39
|
+
select count(*) as c from unique_constraint_info('DcUx');
|
|
40
|
+
→ [{"c":0}]
|
|
41
|
+
|
|
42
|
+
-- And nothing is enforced over the surviving column: duplicate c values are accepted,
|
|
43
|
+
-- which is correct — no UNIQUE over (c) was ever declared.
|
|
44
|
+
insert into DcUx values (1, 5);
|
|
45
|
+
insert into DcUx values (2, 5);
|
|
46
|
+
select count(*) as c from DcUx;
|
|
47
|
+
→ [{"c":2}]
|
|
48
|
+
|
|
49
|
+
drop table DcUx;
|
|
50
|
+
-- run
|
|
51
|
+
|
|
52
|
+
-- ===================================================================
|
|
53
|
+
-- 2. A UNIQUE index that keeps every column is renumbered, not dropped
|
|
54
|
+
-- ===================================================================
|
|
55
|
+
|
|
56
|
+
create table DcKeep (id integer primary key, b integer, c integer, d integer);
|
|
57
|
+
create unique index ux_cd on DcKeep (c, d);
|
|
58
|
+
insert into DcKeep values (1, 9, 10, 11);
|
|
59
|
+
alter table DcKeep drop column b;
|
|
60
|
+
-- run
|
|
61
|
+
|
|
62
|
+
-- Survives over its own (renumbered) columns, still unique.
|
|
63
|
+
select index_name, column_name from index_info('DcKeep') order by column_name;
|
|
64
|
+
→ [{"index_name":"ux_cd","column_name":"c"},{"index_name":"ux_cd","column_name":"d"}]
|
|
65
|
+
|
|
66
|
+
insert into DcKeep values (2, 10, 11);
|
|
67
|
+
-- error: UNIQUE
|
|
68
|
+
|
|
69
|
+
insert into DcKeep values (3, 10, 12);
|
|
70
|
+
select count(*) as c from DcKeep;
|
|
71
|
+
→ [{"c":2}]
|
|
72
|
+
|
|
73
|
+
drop table DcKeep;
|
|
74
|
+
-- run
|
|
75
|
+
|
|
76
|
+
-- ===================================================================
|
|
77
|
+
-- 3. A plain (non-unique) index spanning the dropped column is narrowed —
|
|
78
|
+
-- it constrains nothing, so the surviving columns remain a usable index
|
|
79
|
+
-- ===================================================================
|
|
80
|
+
|
|
81
|
+
create table DcPlain (id integer primary key, b integer, c integer);
|
|
82
|
+
create index ix_bc on DcPlain (b, c);
|
|
83
|
+
alter table DcPlain drop column b;
|
|
84
|
+
-- run
|
|
85
|
+
|
|
86
|
+
select index_name, column_name from index_info('DcPlain');
|
|
87
|
+
→ [{"index_name":"ix_bc","column_name":"c"}]
|
|
88
|
+
|
|
89
|
+
-- Duplicates are fine on a plain index, and the index still serves lookups.
|
|
90
|
+
insert into DcPlain values (1, 5);
|
|
91
|
+
insert into DcPlain values (2, 5);
|
|
92
|
+
select count(*) as c from DcPlain where c = 5;
|
|
93
|
+
→ [{"c":2}]
|
|
94
|
+
|
|
95
|
+
drop table DcPlain;
|
|
96
|
+
-- run
|
|
97
|
+
|
|
98
|
+
-- ===================================================================
|
|
99
|
+
-- 4. A narrowed index still answers lookups over rows indexed BEFORE the drop
|
|
100
|
+
-- ===================================================================
|
|
101
|
+
--
|
|
102
|
+
-- The pre-drop rows are the point: their index entries were written under the WIDE key
|
|
103
|
+
-- (b's value ahead of c's) while every later seek computes the NARROW one. A module that
|
|
104
|
+
-- leaves them unreshaped answers the seek short — `c = 100` finds nothing — and a later
|
|
105
|
+
-- DELETE cannot match its own entries, so they orphan.
|
|
106
|
+
|
|
107
|
+
create table DcPre (id integer primary key, b integer, c integer);
|
|
108
|
+
create index ix_bc on DcPre (b, c);
|
|
109
|
+
insert into DcPre values (1, 10, 100);
|
|
110
|
+
insert into DcPre values (2, 20, 200);
|
|
111
|
+
alter table DcPre drop column b;
|
|
112
|
+
-- run
|
|
113
|
+
|
|
114
|
+
select index_name, column_name from index_info('DcPre');
|
|
115
|
+
→ [{"index_name":"ix_bc","column_name":"c"}]
|
|
116
|
+
|
|
117
|
+
-- Each pre-drop row is reachable through the narrowed index, exactly once.
|
|
118
|
+
select id from DcPre where c = 100;
|
|
119
|
+
→ [{"id":1}]
|
|
120
|
+
select id from DcPre where c > 0 order by id;
|
|
121
|
+
→ [{"id":1},{"id":2}]
|
|
122
|
+
|
|
123
|
+
-- A row inserted after the drop joins them under the same encoding.
|
|
124
|
+
insert into DcPre values (3, 300);
|
|
125
|
+
select id from DcPre where c > 150 order by id;
|
|
126
|
+
→ [{"id":2},{"id":3}]
|
|
127
|
+
|
|
128
|
+
-- DELETE recomputes each index key: a table drained through the index leaves no row
|
|
129
|
+
-- findable, pre-drop or post-drop.
|
|
130
|
+
delete from DcPre;
|
|
131
|
+
select count(*) as n from DcPre;
|
|
132
|
+
→ [{"n":0}]
|
|
133
|
+
select count(*) as n from DcPre where c > 0;
|
|
134
|
+
→ [{"n":0}]
|
|
135
|
+
|
|
136
|
+
drop table DcPre;
|
|
137
|
+
-- run
|
|
138
|
+
|
|
139
|
+
-- ===================================================================
|
|
140
|
+
-- 5. Re-creating an index under the REMOVED index's name gets a clean structure
|
|
141
|
+
-- ===================================================================
|
|
142
|
+
--
|
|
143
|
+
-- The single-column index collapses (its only column is gone), so its name is free again.
|
|
144
|
+
-- A module that left the removed index's physical structure behind hands it to the new
|
|
145
|
+
-- index of the same name, which then holds both encodings — a range scan yields each row
|
|
146
|
+
-- twice, and a count is doubled.
|
|
147
|
+
|
|
148
|
+
create table DcReuse (id integer primary key, b integer, c integer);
|
|
149
|
+
create index ix_b on DcReuse (b);
|
|
150
|
+
insert into DcReuse values (1, 10, 100);
|
|
151
|
+
insert into DcReuse values (2, 20, 200);
|
|
152
|
+
alter table DcReuse drop column b;
|
|
153
|
+
-- run
|
|
154
|
+
|
|
155
|
+
select count(*) as n from index_info('DcReuse');
|
|
156
|
+
→ [{"n":0}]
|
|
157
|
+
|
|
158
|
+
create index ix_b on DcReuse (c);
|
|
159
|
+
-- run
|
|
160
|
+
|
|
161
|
+
select id from DcReuse where c > 0 order by id;
|
|
162
|
+
→ [{"id":1},{"id":2}]
|
|
163
|
+
select count(*) as n from DcReuse where c > 0;
|
|
164
|
+
→ [{"n":2}]
|
|
165
|
+
select id from DcReuse where c = 100;
|
|
166
|
+
→ [{"id":1}]
|
|
167
|
+
|
|
168
|
+
drop table DcReuse;
|
|
169
|
+
-- run
|