@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,293 @@
|
|
|
1
|
+
-- ALTER COLUMN — value-REWRITING change re-validates UNIQUE over the CONVERTED values.
|
|
2
|
+
--
|
|
3
|
+
-- Two families of ALTER COLUMN rewrite the stored values at one column, and either can
|
|
4
|
+
-- collapse two rows that were distinct onto the same value:
|
|
5
|
+
--
|
|
6
|
+
-- * `set data type` — '1' and '01' are distinct text but both convert to the integer 1;
|
|
7
|
+
-- '1.0' and '1.00' both convert to the real 1.0.
|
|
8
|
+
-- * `set not null` with a DEFAULT — SQL UNIQUE treats several NULLs as mutually
|
|
9
|
+
-- distinct, so backfilling them all to the same DEFAULT literal collides.
|
|
10
|
+
--
|
|
11
|
+
-- Every uniqueness-enforcing structure covering the altered column is therefore
|
|
12
|
+
-- re-validated over the converted values, before anything is mutated: a collision
|
|
13
|
+
-- rejects the ALTER with CONSTRAINT and leaves the table, its type and the transaction
|
|
14
|
+
-- exactly as they were. The judged rows are the DDL transaction's EFFECTIVE rows, so a
|
|
15
|
+
-- collision only among rows it has DELETED does not block the change, while one among
|
|
16
|
+
-- rows it has INSERTED but not committed does reject it.
|
|
17
|
+
--
|
|
18
|
+
-- Cross-module: the memory backend probes the converted rows before replacing its base
|
|
19
|
+
-- tree, and the store backend defers its value rewrite (`mapRowsAtIndex`) until after the
|
|
20
|
+
-- same probe — so on both, a rejection leaves the stored values AND the declared type at
|
|
21
|
+
-- their old form (the `table_info` checks below pin the declared-type half).
|
|
22
|
+
--
|
|
23
|
+
-- NOTE: a bare `v text` column is NOT NULL in this engine; the NULL sections below
|
|
24
|
+
-- declare `v text null` so they can hold NULLs at all.
|
|
25
|
+
|
|
26
|
+
-- ===================================
|
|
27
|
+
-- 1. text → integer collision under an explicit `create unique index` → rejected,
|
|
28
|
+
-- and the rejection changes nothing.
|
|
29
|
+
-- ===================================
|
|
30
|
+
-- Lives in 41.7.3.2-alter-column-retype-unique-index (it needs standalone index DDL);
|
|
31
|
+
-- § 2 below is the same collision seen through a table-level `unique (v)`.
|
|
32
|
+
|
|
33
|
+
-- ===================================
|
|
34
|
+
-- 2. Same collision under a table-level `unique (v)` constraint, caught through the
|
|
35
|
+
-- auto-built covering index rather than a user-created one.
|
|
36
|
+
-- ===================================
|
|
37
|
+
|
|
38
|
+
create table ru (id integer primary key, v text unique);
|
|
39
|
+
insert into ru values (1, '1'), (2, '01');
|
|
40
|
+
-- run
|
|
41
|
+
|
|
42
|
+
alter table ru alter column v set data type integer;
|
|
43
|
+
-- error: UNIQUE constraint failed
|
|
44
|
+
|
|
45
|
+
select id, v, typeof(v) from ru order by id;
|
|
46
|
+
→ [{"id":1,"v":"1","typeof(v)":"text"},{"id":2,"v":"01","typeof(v)":"text"}]
|
|
47
|
+
|
|
48
|
+
drop table ru;
|
|
49
|
+
|
|
50
|
+
-- ===================================
|
|
51
|
+
-- 3. text → real collision — '1.0' and '1.00' are distinct text, one real. The probe
|
|
52
|
+
-- compares under the NEW logical type, which is what makes this reachable.
|
|
53
|
+
-- ===================================
|
|
54
|
+
|
|
55
|
+
create table rr (id integer primary key, v text unique);
|
|
56
|
+
insert into rr values (1, '1.0'), (2, '1.00');
|
|
57
|
+
-- run
|
|
58
|
+
|
|
59
|
+
alter table rr alter column v set data type real;
|
|
60
|
+
-- error: UNIQUE constraint failed
|
|
61
|
+
|
|
62
|
+
select id, v, typeof(v) from rr order by id;
|
|
63
|
+
→ [{"id":1,"v":"1.0","typeof(v)":"text"},{"id":2,"v":"1.00","typeof(v)":"text"}]
|
|
64
|
+
|
|
65
|
+
drop table rr;
|
|
66
|
+
|
|
67
|
+
-- ===================================
|
|
68
|
+
-- 4. `set not null` DEFAULT backfill collision — two legal NULLs become two copies of
|
|
69
|
+
-- the same DEFAULT literal → rejected, and the column stays nullable.
|
|
70
|
+
-- ===================================
|
|
71
|
+
|
|
72
|
+
create table rn (id integer primary key, v text null, unique (v));
|
|
73
|
+
insert into rn (id, v) values (1, null), (2, null);
|
|
74
|
+
-- run
|
|
75
|
+
|
|
76
|
+
alter table rn alter column v set default 'x';
|
|
77
|
+
-- run
|
|
78
|
+
|
|
79
|
+
alter table rn alter column v set not null;
|
|
80
|
+
-- error: UNIQUE constraint failed
|
|
81
|
+
|
|
82
|
+
-- rolled back: both NULLs survive and the column is still nullable
|
|
83
|
+
select id, v from rn order by id;
|
|
84
|
+
→ [{"id":1,"v":null},{"id":2,"v":null}]
|
|
85
|
+
|
|
86
|
+
insert into rn (id, v) values (3, null);
|
|
87
|
+
select count(*) as n from rn where v is null;
|
|
88
|
+
→ [{"n":3}]
|
|
89
|
+
|
|
90
|
+
drop table rn;
|
|
91
|
+
|
|
92
|
+
-- 4b. A backfill that collides with an EXISTING non-null row is rejected too: one NULL
|
|
93
|
+
-- plus a row already holding the DEFAULT value.
|
|
94
|
+
create table rn2 (id integer primary key, v text null, unique (v));
|
|
95
|
+
insert into rn2 (id, v) values (1, 'x'), (2, null);
|
|
96
|
+
-- run
|
|
97
|
+
|
|
98
|
+
alter table rn2 alter column v set default 'x';
|
|
99
|
+
-- run
|
|
100
|
+
|
|
101
|
+
alter table rn2 alter column v set not null;
|
|
102
|
+
-- error: UNIQUE constraint failed
|
|
103
|
+
|
|
104
|
+
select id, v from rn2 order by id;
|
|
105
|
+
→ [{"id":1,"v":"x"},{"id":2,"v":null}]
|
|
106
|
+
|
|
107
|
+
drop table rn2;
|
|
108
|
+
|
|
109
|
+
-- 4c. A single NULL with no colliding partner backfills fine (the guard must not
|
|
110
|
+
-- reject every backfill).
|
|
111
|
+
create table rn3 (id integer primary key, v text null, unique (v));
|
|
112
|
+
insert into rn3 (id, v) values (1, 'a'), (2, null);
|
|
113
|
+
-- run
|
|
114
|
+
|
|
115
|
+
alter table rn3 alter column v set default 'x';
|
|
116
|
+
-- run
|
|
117
|
+
|
|
118
|
+
alter table rn3 alter column v set not null;
|
|
119
|
+
-- run
|
|
120
|
+
|
|
121
|
+
select id, v from rn3 order by id;
|
|
122
|
+
→ [{"id":1,"v":"a"},{"id":2,"v":"x"}]
|
|
123
|
+
|
|
124
|
+
drop table rn3;
|
|
125
|
+
|
|
126
|
+
-- ===================================
|
|
127
|
+
-- 5. ACCEPTED: a non-colliding retype still succeeds, the values are physically
|
|
128
|
+
-- rewritten, and an index-backed lookup finds rows by the NEW value.
|
|
129
|
+
-- ===================================
|
|
130
|
+
|
|
131
|
+
create table ok1 (id integer primary key, v text, unique (v));
|
|
132
|
+
insert into ok1 values (1, '10'), (2, '9');
|
|
133
|
+
-- run
|
|
134
|
+
|
|
135
|
+
alter table ok1 alter column v set data type integer;
|
|
136
|
+
-- run
|
|
137
|
+
|
|
138
|
+
select id, v, typeof(v) from ok1 order by id;
|
|
139
|
+
→ [{"id":1,"v":10,"typeof(v)":"integer"},{"id":2,"v":9,"typeof(v)":"integer"}]
|
|
140
|
+
|
|
141
|
+
-- the accepted retype updates the declared type in lockstep with the values
|
|
142
|
+
select name, type from table_info('ok1') where name = 'v';
|
|
143
|
+
→ [{"name":"v","type":"INTEGER"}]
|
|
144
|
+
|
|
145
|
+
-- index-backed lookup by the new numeric value
|
|
146
|
+
select id from ok1 where v = 9;
|
|
147
|
+
→ [{"id":2}]
|
|
148
|
+
|
|
149
|
+
-- the unique index still enforces after the successful retype
|
|
150
|
+
insert into ok1 values (3, 9);
|
|
151
|
+
-- error: UNIQUE constraint failed
|
|
152
|
+
|
|
153
|
+
drop table ok1;
|
|
154
|
+
|
|
155
|
+
-- ===================================
|
|
156
|
+
-- 6. ACCEPTED: NULLs stay mutually distinct under UNIQUE, so retyping a column holding
|
|
157
|
+
-- several of them is not a collision.
|
|
158
|
+
-- ===================================
|
|
159
|
+
|
|
160
|
+
create table ok2 (id integer primary key, v text null, unique (v));
|
|
161
|
+
insert into ok2 (id, v) values (1, null), (2, null), (3, '7');
|
|
162
|
+
-- run
|
|
163
|
+
|
|
164
|
+
alter table ok2 alter column v set data type integer;
|
|
165
|
+
-- run
|
|
166
|
+
|
|
167
|
+
select id, v, typeof(v) from ok2 order by id;
|
|
168
|
+
→ [{"id":1,"v":null,"typeof(v)":"null"},{"id":2,"v":null,"typeof(v)":"null"},{"id":3,"v":7,"typeof(v)":"integer"}]
|
|
169
|
+
|
|
170
|
+
-- more NULLs still allowed; a duplicate of the converted value is not
|
|
171
|
+
insert into ok2 (id, v) values (4, null);
|
|
172
|
+
select count(*) as n from ok2 where v is null;
|
|
173
|
+
→ [{"n":3}]
|
|
174
|
+
|
|
175
|
+
insert into ok2 (id, v) values (5, 7);
|
|
176
|
+
-- error: UNIQUE constraint failed
|
|
177
|
+
|
|
178
|
+
drop table ok2;
|
|
179
|
+
|
|
180
|
+
-- ===================================
|
|
181
|
+
-- 7. COMPOSITE `unique (a, v)` — only the pair matters. A retype of `v` that makes two
|
|
182
|
+
-- rows share a `v` value is accepted when they still differ in `a`.
|
|
183
|
+
-- ===================================
|
|
184
|
+
|
|
185
|
+
create table ok3 (id integer primary key, a integer, v text, unique (a, v));
|
|
186
|
+
insert into ok3 values (1, 1, '1'), (2, 2, '01');
|
|
187
|
+
-- run
|
|
188
|
+
|
|
189
|
+
alter table ok3 alter column v set data type integer;
|
|
190
|
+
-- run
|
|
191
|
+
|
|
192
|
+
-- v collapses to 1 in both rows, but a (1 vs 2) still distinguishes them
|
|
193
|
+
select id, a, v, typeof(v) from ok3 order by id;
|
|
194
|
+
→ [{"id":1,"a":1,"v":1,"typeof(v)":"integer"},{"id":2,"a":2,"v":1,"typeof(v)":"integer"}]
|
|
195
|
+
|
|
196
|
+
-- the composite now enforces on the converted values
|
|
197
|
+
insert into ok3 values (3, 1, 1);
|
|
198
|
+
-- error: UNIQUE constraint failed
|
|
199
|
+
|
|
200
|
+
drop table ok3;
|
|
201
|
+
|
|
202
|
+
-- 7b. The same shape where `a` matches too → the pair collides → rejected.
|
|
203
|
+
create table rc (id integer primary key, a integer, v text, unique (a, v));
|
|
204
|
+
insert into rc values (1, 1, '1'), (2, 1, '01');
|
|
205
|
+
-- run
|
|
206
|
+
|
|
207
|
+
alter table rc alter column v set data type integer;
|
|
208
|
+
-- error: UNIQUE constraint failed
|
|
209
|
+
|
|
210
|
+
select id, a, v, typeof(v) from rc order by id;
|
|
211
|
+
→ [{"id":1,"a":1,"v":"1","typeof(v)":"text"},{"id":2,"a":1,"v":"01","typeof(v)":"text"}]
|
|
212
|
+
|
|
213
|
+
drop table rc;
|
|
214
|
+
|
|
215
|
+
-- ===================================
|
|
216
|
+
-- 8. EFFECTIVE rows, not committed rows: a collision only among rows the open
|
|
217
|
+
-- transaction has DELETED must NOT block the retype.
|
|
218
|
+
-- ===================================
|
|
219
|
+
|
|
220
|
+
create table tx1 (id integer primary key, v text, unique (v));
|
|
221
|
+
insert into tx1 values (1, '1'), (2, '01'), (3, '5');
|
|
222
|
+
-- run
|
|
223
|
+
|
|
224
|
+
begin;
|
|
225
|
+
-- run
|
|
226
|
+
delete from tx1 where id = 2;
|
|
227
|
+
-- run
|
|
228
|
+
alter table tx1 alter column v set data type integer;
|
|
229
|
+
-- run
|
|
230
|
+
commit;
|
|
231
|
+
-- run
|
|
232
|
+
|
|
233
|
+
select id, v, typeof(v) from tx1 order by id;
|
|
234
|
+
→ [{"id":1,"v":1,"typeof(v)":"integer"},{"id":3,"v":5,"typeof(v)":"integer"}]
|
|
235
|
+
|
|
236
|
+
drop table tx1;
|
|
237
|
+
|
|
238
|
+
-- ===================================
|
|
239
|
+
-- 9. …and a collision among rows the transaction has INSERTED but not committed MUST
|
|
240
|
+
-- reject the retype.
|
|
241
|
+
-- ===================================
|
|
242
|
+
|
|
243
|
+
create table tx2 (id integer primary key, v text, unique (v));
|
|
244
|
+
insert into tx2 values (1, '1');
|
|
245
|
+
-- run
|
|
246
|
+
|
|
247
|
+
begin;
|
|
248
|
+
-- run
|
|
249
|
+
insert into tx2 values (2, '01');
|
|
250
|
+
-- run
|
|
251
|
+
alter table tx2 alter column v set data type integer;
|
|
252
|
+
-- error: UNIQUE constraint failed
|
|
253
|
+
rollback;
|
|
254
|
+
-- run
|
|
255
|
+
|
|
256
|
+
-- the rolled-back transaction left nothing behind, and the column is still text
|
|
257
|
+
select id, v, typeof(v) from tx2 order by id;
|
|
258
|
+
→ [{"id":1,"v":"1","typeof(v)":"text"}]
|
|
259
|
+
|
|
260
|
+
drop table tx2;
|
|
261
|
+
|
|
262
|
+
-- ===================================
|
|
263
|
+
-- 10. A rejected retype leaves the transaction USABLE: removing the offending row and
|
|
264
|
+
-- retrying inside the same transaction succeeds, and the whole thing commits.
|
|
265
|
+
-- (The variant where the transaction also INSERTS a row the retry must convert
|
|
266
|
+
-- lives in 41.7.3.1-…-memory.sqllogic until the isolation layer converts staged
|
|
267
|
+
-- rows — bug-isolation-retype-leaves-staged-rows-unconverted.)
|
|
268
|
+
-- ===================================
|
|
269
|
+
|
|
270
|
+
create table tx3 (id integer primary key, v text, unique (v));
|
|
271
|
+
insert into tx3 values (1, '1');
|
|
272
|
+
-- run
|
|
273
|
+
|
|
274
|
+
begin;
|
|
275
|
+
-- run
|
|
276
|
+
insert into tx3 values (2, '01');
|
|
277
|
+
-- run
|
|
278
|
+
|
|
279
|
+
alter table tx3 alter column v set data type integer;
|
|
280
|
+
-- error: UNIQUE constraint failed
|
|
281
|
+
|
|
282
|
+
-- still writable after the rejection, and the retry now passes
|
|
283
|
+
delete from tx3 where id = 2;
|
|
284
|
+
-- run
|
|
285
|
+
alter table tx3 alter column v set data type integer;
|
|
286
|
+
-- run
|
|
287
|
+
commit;
|
|
288
|
+
-- run
|
|
289
|
+
|
|
290
|
+
select id, v, typeof(v) from tx3 order by id;
|
|
291
|
+
→ [{"id":1,"v":1,"typeof(v)":"integer"}]
|
|
292
|
+
|
|
293
|
+
drop table tx3;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
-- ALTER COLUMN SET DATA TYPE inside a transaction that has also INSERTED rows: the
|
|
2
|
+
-- accepted retype must convert the transaction's own staged rows, so after COMMIT every
|
|
3
|
+
-- row holds a value of the new declared type.
|
|
4
|
+
--
|
|
5
|
+
-- MEMORY-ONLY (listed in MEMORY_ONLY_FILES) for now: under the isolation wrapper the
|
|
6
|
+
-- store backend runs behind, staged rows live in the wrapper's overlay and the overlay's
|
|
7
|
+
-- ALTER migration does not yet convert them — an accepted retype commits the staged row
|
|
8
|
+
-- still holding the OLD type. Fixed by bug-isolation-retype-leaves-staged-rows-unconverted,
|
|
9
|
+
-- which removes this entry. The rejection/retry half of this scenario (without a staged
|
|
10
|
+
-- insert surviving to commit) runs cross-module in 41.7.3 § 10.
|
|
11
|
+
|
|
12
|
+
-- The UNIQUE is declared inline rather than through `create unique index`: the staged-row
|
|
13
|
+
-- conversion this file is about is identical either way, and an inline constraint keeps the
|
|
14
|
+
-- file runnable on backends without standalone index DDL.
|
|
15
|
+
create table tx3 (id integer primary key, v text unique);
|
|
16
|
+
insert into tx3 values (1, '1');
|
|
17
|
+
-- run
|
|
18
|
+
|
|
19
|
+
begin;
|
|
20
|
+
-- run
|
|
21
|
+
insert into tx3 values (2, '01');
|
|
22
|
+
-- run
|
|
23
|
+
|
|
24
|
+
alter table tx3 alter column v set data type integer;
|
|
25
|
+
-- error: UNIQUE constraint failed
|
|
26
|
+
|
|
27
|
+
-- still writable after the rejection, and the retry now passes — converting the
|
|
28
|
+
-- transaction's staged insert (3, '7') along with the committed rows
|
|
29
|
+
delete from tx3 where id = 2;
|
|
30
|
+
-- run
|
|
31
|
+
insert into tx3 values (3, '7');
|
|
32
|
+
-- run
|
|
33
|
+
alter table tx3 alter column v set data type integer;
|
|
34
|
+
-- run
|
|
35
|
+
commit;
|
|
36
|
+
-- run
|
|
37
|
+
|
|
38
|
+
select id, v, typeof(v) from tx3 order by id;
|
|
39
|
+
→ [{"id":1,"v":1,"typeof(v)":"integer"},{"id":3,"v":7,"typeof(v)":"integer"}]
|
|
40
|
+
|
|
41
|
+
drop table tx3;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
-- 41.7.3.2-alter-column-retype-unique-index.sqllogic
|
|
2
|
+
--
|
|
3
|
+
-- requires-capability: standalone-index-ddl
|
|
4
|
+
--
|
|
5
|
+
-- Carved out of 41.7.3-alter-column-retype-unique. That file proves that a
|
|
6
|
+
-- value-REWRITING ALTER COLUMN (`set data type`, or `set not null` with a DEFAULT)
|
|
7
|
+
-- re-validates uniqueness over the CONVERTED values before mutating anything; it makes
|
|
8
|
+
-- every one of those points through inline / table-level `unique`, which needs no index
|
|
9
|
+
-- DDL. The index-derived vehicle is a separate enforcement path (the parent's § 1 and § 2
|
|
10
|
+
-- were deliberately the same collision seen through each), so it lives here.
|
|
11
|
+
--
|
|
12
|
+
-- Cross-module: the memory backend probes the converted rows before replacing its base
|
|
13
|
+
-- tree, and the store backend defers its value rewrite (`mapRowsAtIndex`) until after the
|
|
14
|
+
-- same probe.
|
|
15
|
+
--
|
|
16
|
+
-- Subject: a UNIQUE derived from `create unique index` is re-validated on retype exactly
|
|
17
|
+
-- as a declared one is — rejecting on collision with nothing changed, and rebuilding over
|
|
18
|
+
-- the converted values when it succeeds.
|
|
19
|
+
|
|
20
|
+
-- ===================================
|
|
21
|
+
-- 1. text → integer collision under an explicit `create unique index` → rejected,
|
|
22
|
+
-- and the rejection changes nothing: values, type and writability all survive.
|
|
23
|
+
-- ===================================
|
|
24
|
+
|
|
25
|
+
create table ri (id integer primary key, v text);
|
|
26
|
+
create unique index ri_v on ri (v);
|
|
27
|
+
insert into ri values (1, '1'), (2, '01');
|
|
28
|
+
-- run
|
|
29
|
+
|
|
30
|
+
alter table ri alter column v set data type integer;
|
|
31
|
+
-- error: UNIQUE constraint failed
|
|
32
|
+
|
|
33
|
+
-- rolled back: both rows survive as their original TEXT values
|
|
34
|
+
select id, v, typeof(v) from ri order by id;
|
|
35
|
+
→ [{"id":1,"v":"1","typeof(v)":"text"},{"id":2,"v":"01","typeof(v)":"text"}]
|
|
36
|
+
|
|
37
|
+
-- ...and the DECLARED type is unchanged too — a rejection must not leave rewritten values
|
|
38
|
+
-- behind a stale catalog type, nor a changed catalog over old values
|
|
39
|
+
select name, type from table_info('ri') where name = 'v';
|
|
40
|
+
→ [{"name":"v","type":"TEXT"}]
|
|
41
|
+
|
|
42
|
+
-- the table is still writable, and the index still enforces under the unchanged type
|
|
43
|
+
insert into ri values (3, '001');
|
|
44
|
+
select count(*) as n from ri;
|
|
45
|
+
→ [{"n":3}]
|
|
46
|
+
|
|
47
|
+
insert into ri values (4, '1');
|
|
48
|
+
-- error: UNIQUE constraint failed
|
|
49
|
+
|
|
50
|
+
drop table ri;
|
|
51
|
+
|
|
52
|
+
-- ===================================
|
|
53
|
+
-- 2. ACCEPTED: a non-colliding retype rebuilds the index over the CONVERTED values, so
|
|
54
|
+
-- a later duplicate of a converted value is caught by the index.
|
|
55
|
+
-- ===================================
|
|
56
|
+
|
|
57
|
+
create table ok1 (id integer primary key, v text);
|
|
58
|
+
create unique index ok1_v on ok1 (v);
|
|
59
|
+
insert into ok1 values (1, '10'), (2, '9');
|
|
60
|
+
-- run
|
|
61
|
+
|
|
62
|
+
alter table ok1 alter column v set data type integer;
|
|
63
|
+
-- run
|
|
64
|
+
|
|
65
|
+
select id, v, typeof(v) from ok1 order by id;
|
|
66
|
+
→ [{"id":1,"v":10,"typeof(v)":"integer"},{"id":2,"v":9,"typeof(v)":"integer"}]
|
|
67
|
+
|
|
68
|
+
-- the rebuilt index enforces over the converted values
|
|
69
|
+
insert into ok1 values (3, 10);
|
|
70
|
+
-- error: UNIQUE constraint failed
|
|
71
|
+
|
|
72
|
+
drop table ok1;
|