@quereus/quereus 4.20.1 → 4.20.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/src/schema/schema-differ.d.ts.map +1 -1
- package/dist/src/schema/schema-differ.js +17 -69
- package/dist/src/schema/schema-differ.js.map +1 -1
- package/package.json +7 -4
- package/test/README.md +173 -0
- package/test/logic/01-basic.sqllogic +39 -0
- package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
- package/test/logic/01.2-strings.sqllogic +43 -0
- package/test/logic/01.5-insert-select.sqllogic +237 -0
- package/test/logic/01.6-update-extras.sqllogic +118 -0
- package/test/logic/01.7-update-from.sqllogic +67 -0
- package/test/logic/01.8-delete-extras.sqllogic +122 -0
- package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
- package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
- package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
- package/test/logic/01.9-query-expr-values.sqllogic +111 -0
- package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
- package/test/logic/02-filters.sqllogic +54 -0
- package/test/logic/02-smoke.sqllogic +62 -0
- package/test/logic/02.1-bind-parameters.sqllogic +223 -0
- package/test/logic/03-expressions.sqllogic +190 -0
- package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
- package/test/logic/03.4-defaults.sqllogic +554 -0
- package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
- package/test/logic/03.5-tvf.sqllogic +61 -0
- package/test/logic/03.6-type-system.sqllogic +544 -0
- package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
- package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
- package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
- package/test/logic/03.8-not-precedence.sqllogic +255 -0
- package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
- package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
- package/test/logic/04-order-by.sqllogic +38 -0
- package/test/logic/04-transactions.sqllogic +239 -0
- package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
- package/test/logic/05-vtab_memory.sqllogic +50 -0
- package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
- package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
- package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
- package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
- package/test/logic/06-builtin_functions.sqllogic +149 -0
- package/test/logic/06.1-string-functions.sqllogic +92 -0
- package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
- package/test/logic/06.2-math-functions.sqllogic +82 -0
- package/test/logic/06.3-schema.sqllogic +48 -0
- package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
- package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
- package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
- package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
- package/test/logic/06.3.4-view-info.sqllogic +378 -0
- package/test/logic/06.3.5-column-info.sqllogic +347 -0
- package/test/logic/06.3.6-schema-views.sqllogic +29 -0
- package/test/logic/06.4-schema-search-path.sqllogic +354 -0
- package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
- package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
- package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
- package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
- package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
- package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
- package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
- package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
- package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
- package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
- package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
- package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
- package/test/logic/06.7-json-extended.sqllogic +53 -0
- package/test/logic/06.8-json-path-operators.sqllogic +99 -0
- package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
- package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
- package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
- package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
- package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
- package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
- package/test/logic/07-aggregates.sqllogic +193 -0
- package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
- package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
- package/test/logic/07.3-group-by-extras.sqllogic +602 -0
- package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
- package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
- package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
- package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
- package/test/logic/07.5-window.sqllogic +1941 -0
- package/test/logic/07.5.1-window-named.sqllogic +13 -0
- package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
- package/test/logic/07.6-subqueries.sqllogic +78 -0
- package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
- package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
- package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
- package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
- package/test/logic/07.7.1-in-extras.sqllogic +158 -0
- package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
- package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
- package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
- package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
- package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
- package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
- package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
- package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
- package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
- package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
- package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
- package/test/logic/07.9-in-value-list.sqllogic +154 -0
- package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
- package/test/logic/08-views.sqllogic +64 -0
- package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
- package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
- package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
- package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
- package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
- package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
- package/test/logic/09-set_operations.sqllogic +244 -0
- package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
- package/test/logic/10-distinct_datatypes.sqllogic +127 -0
- package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
- package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
- package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
- package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
- package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
- package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
- package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
- package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
- package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
- package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
- package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
- package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
- package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
- package/test/logic/10.2-column-features.sqllogic +365 -0
- package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
- package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
- package/test/logic/10.3-function-features.sqllogic +247 -0
- package/test/logic/10.4-schema-scale.sqllogic +168 -0
- package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
- package/test/logic/10.5-indexes.sqllogic +164 -0
- package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
- package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
- package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
- package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
- package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
- package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
- package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
- package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
- package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
- package/test/logic/100.1-where-extras.sqllogic +163 -0
- package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
- package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
- package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
- package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
- package/test/logic/102-unique-constraints.sqllogic +145 -0
- package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
- package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
- package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
- package/test/logic/102.2-unique-collation.sqllogic +181 -0
- package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
- package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
- package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
- package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
- package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
- package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
- package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
- package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
- package/test/logic/108-cardinality-estimation.sqllogic +146 -0
- package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
- package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
- package/test/logic/11-joins.sqllogic +86 -0
- package/test/logic/11.1-join-using.sqllogic +267 -0
- package/test/logic/11.2-comma-join.sqllogic +35 -0
- package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
- package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
- package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
- package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
- package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
- package/test/logic/12-empty-primary-key.sqllogic +124 -0
- package/test/logic/12-join_padding_order.sqllogic +58 -0
- package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
- package/test/logic/13-cte.sqllogic +137 -0
- package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
- package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
- package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
- package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
- package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
- package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
- package/test/logic/13.4-cte-extras.sqllogic +98 -0
- package/test/logic/13.5-cte-join-order.sqllogic +166 -0
- package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
- package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
- package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
- package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
- package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
- package/test/logic/14-utilities.sqllogic +168 -0
- package/test/logic/15-timespan.sqllogic +279 -0
- package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
- package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
- package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
- package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
- package/test/logic/16-epoch.sqllogic +187 -0
- package/test/logic/17-weekday-modifier.sqllogic +78 -0
- package/test/logic/18-json-string-escapes.sqllogic +86 -0
- package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
- package/test/logic/20-empty-single-row.sqllogic +261 -0
- package/test/logic/21-null-edge-cases.sqllogic +227 -0
- package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
- package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
- package/test/logic/21.2-between-edges.sqllogic +157 -0
- package/test/logic/22-boundary-values.sqllogic +175 -0
- package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
- package/test/logic/24-builtin-branches.sqllogic +611 -0
- package/test/logic/24.1-substr-extras.sqllogic +75 -0
- package/test/logic/24.2-random-extras.sqllogic +39 -0
- package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
- package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
- package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
- package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
- package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
- package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
- package/test/logic/26-join-edge-cases.sqllogic +333 -0
- package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
- package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
- package/test/logic/26.3-join-on-constants.sqllogic +61 -0
- package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
- package/test/logic/27-window-edge-cases.sqllogic +206 -0
- package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
- package/test/logic/27.2-window-exclude.sqllogic +13 -0
- package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
- package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
- package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
- package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
- package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
- package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
- package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
- package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
- package/test/logic/40-constraints.sqllogic +418 -0
- package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
- package/test/logic/40.2-check-extras.sqllogic +683 -0
- package/test/logic/41-alter-table.sqllogic +191 -0
- package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
- package/test/logic/41-fk-cross-schema.sqllogic +155 -0
- package/test/logic/41-fk-extended-targets.sqllogic +173 -0
- package/test/logic/41-foreign-keys.sqllogic +1001 -0
- package/test/logic/41-generated-column-errors.sqllogic +225 -0
- package/test/logic/41-generated-column-extras.sqllogic +598 -0
- package/test/logic/41-generated-column-scope.sqllogic +329 -0
- package/test/logic/41-generated-columns.sqllogic +361 -0
- package/test/logic/41.1-alter-pk.sqllogic +230 -0
- package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
- package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
- package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
- package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
- package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
- package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
- package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
- package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
- package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
- package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
- package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
- package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
- package/test/logic/41.2-alter-column.sqllogic +382 -0
- package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
- package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
- package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
- package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
- package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
- package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
- package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
- package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
- package/test/logic/41.5-alter-misc.sqllogic +48 -0
- package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
- package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
- package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
- package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
- package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
- package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
- package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
- package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
- package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
- package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
- package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
- package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
- package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
- package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
- package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
- package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
- package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
- package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
- package/test/logic/42-committed-snapshot.sqllogic +254 -0
- package/test/logic/42-returning.sqllogic +159 -0
- package/test/logic/42.1-returning-extras.sqllogic +232 -0
- package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
- package/test/logic/43-default-nullability.sqllogic +131 -0
- package/test/logic/43-transition-constraints.sqllogic +341 -0
- package/test/logic/43.1-default-collation.sqllogic +140 -0
- package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
- package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
- package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
- package/test/logic/44-determinism-validation.sqllogic +164 -0
- package/test/logic/44-orthogonality.sqllogic +146 -0
- package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
- package/test/logic/45-udf-determinism.sqllogic +39 -0
- package/test/logic/46-mutation-context.sqllogic +595 -0
- package/test/logic/47-upsert.sqllogic +255 -0
- package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
- package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
- package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
- package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
- package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
- package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
- package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
- package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
- package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
- package/test/logic/49-reference-graph.sqllogic +84 -0
- package/test/logic/50-declarative-schema.sqllogic +2550 -0
- package/test/logic/50-metadata-tags.sqllogic +1033 -0
- package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
- package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
- package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
- package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +210 -0
- package/test/logic/50.3-declare-schema-duplicate-names.sqllogic +280 -0
- package/test/logic/50.4-declare-schema-apply-restore.sqllogic +192 -0
- package/test/logic/51-lens-foundation.sqllogic +147 -0
- package/test/logic/51-materialized-views.sqllogic +376 -0
- package/test/logic/51.5-materialized-views-coarsened-key.sqllogic +198 -0
- package/test/logic/51.7-maintained-table-attach-detach.sqllogic +468 -0
- package/test/logic/51.8-maintained-table-declared-constraints.sqllogic +440 -0
- package/test/logic/51.85-maintained-table-parent-fk.sqllogic +103 -0
- package/test/logic/51.9-maintained-table-secondary-unique.sqllogic +237 -0
- package/test/logic/51.9.1-maintained-table-partial-unique.sqllogic +36 -0
- package/test/logic/52-lens-overrides.sqllogic +566 -0
- package/test/logic/53-materialized-views-rowtime.sqllogic +1601 -0
- package/test/logic/53-reserved-tags.sqllogic +252 -0
- package/test/logic/53.1-materialized-view-write-through.sqllogic +329 -0
- package/test/logic/53.2-materialized-view-rename-propagation.sqllogic +483 -0
- package/test/logic/53.3-materialized-view-constraint-only-ddl.sqllogic +409 -0
- package/test/logic/53.3.1-materialized-view-index-ddl-irrelevance.sqllogic +29 -0
- package/test/logic/53.4-materialized-view-structural-alter-restore.sqllogic +436 -0
- package/test/logic/54-covering-mv-enforcement.sqllogic +314 -0
- package/test/logic/54.1-covering-mv-partial-enforcement.sqllogic +34 -0
- package/test/logic/55-internal-eviction-reporting.sqllogic +89 -0
- package/test/logic/55-lens-prover.sqllogic +202 -0
- package/test/logic/55.1-eviction-restrict-fk.sqllogic +148 -0
- package/test/logic/55.5-lens-authored-inverse.sqllogic +1468 -0
- package/test/logic/80-grow-retrieve-pass.sqllogic +79 -0
- package/test/logic/81-quickpick.sqllogic +24 -0
- package/test/logic/82-bloom-join.sqllogic +185 -0
- package/test/logic/83-merge-join.sqllogic +280 -0
- package/test/logic/84-asof-scan.sqllogic +238 -0
- package/test/logic/84-key-cardinality.sqllogic +50 -0
- package/test/logic/85-relational-const-folding.sqllogic +51 -0
- package/test/logic/86-scalar-cse.sqllogic +42 -0
- package/test/logic/90-error_paths.sqllogic +114 -0
- package/test/logic/90.1-parse-errors.sqllogic +77 -0
- package/test/logic/90.2-alter-table-errors.sqllogic +53 -0
- package/test/logic/90.2.1-alter-extra-errors.sqllogic +51 -0
- package/test/logic/90.3-expression-errors.sqllogic +43 -0
- package/test/logic/90.4-dml-errors.sqllogic +47 -0
- package/test/logic/90.5-unsupported-join-types.sqllogic +37 -0
- package/test/logic/90.5.1-right-full-join-read.sqllogic +157 -0
- package/test/logic/90.6-select-error-paths.sqllogic +57 -0
- package/test/logic/91-merge-join-edge-cases.sqllogic +159 -0
- package/test/logic/92-hash-aggregate-edge-cases.sqllogic +139 -0
- package/test/logic/93-ddl-view-edge-cases.sqllogic +104 -0
- package/test/logic/93.1-view-error-paths.sqllogic +74 -0
- package/test/logic/93.2-view-mutation-pending.sqllogic +108 -0
- package/test/logic/93.3-view-mutation-or-clause.sqllogic +60 -0
- package/test/logic/93.4-view-mutation.sqllogic +4881 -0
- package/test/logic/93.4.1-view-mutation-partial-unique-cardinality.sqllogic +31 -0
- package/test/logic/93.5-authored-inverse.sqllogic +415 -0
- package/test/logic/93.6-set-op-flagless-write.sqllogic +862 -0
- package/test/logic/94-tvf-edge-cases.sqllogic +58 -0
- package/test/logic/94.1-limit-offset-edge-cases.sqllogic +109 -0
- package/test/logic/94.2-limit-offset-extras.sqllogic +98 -0
- package/test/logic/95-assertions.sqllogic +1417 -0
- package/test/logic/96-subquery-edge-cases.sqllogic +276 -0
- package/test/logic/97-json-function-edge-cases.sqllogic +633 -0
- package/test/logic/97.1-json-blob-and-special-values.sqllogic +92 -0
- package/test/logic/98-temporal-edge-cases.sqllogic +515 -0
- package/test/logic/99-conversion-edge-cases.sqllogic +325 -0
- package/test/logic/99.0.1-schema-index-listing.sqllogic +21 -0
- package/test/logic/99.1-cast-syntax-extras.sqllogic +167 -0
- package/test/logic/drop-unique-index.sqllogic +88 -0
- package/test/logic/pushdown-test.sqllogic +36 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
-- ALTER TABLE ALTER COLUMN ... SET COLLATE — change a column's collation in place.
|
|
2
|
+
-- This file covers the query-layer semantics that derive purely from the column
|
|
3
|
+
-- schema collation (ORDER BY / `=` follow the new collation), the table_info
|
|
4
|
+
-- round-trip, unknown-collation rejection, set-back-to-BINARY, and idempotent
|
|
5
|
+
-- re-apply. All of these update + re-register the column schema, so they run under
|
|
6
|
+
-- BOTH the memory module (`yarn test`) and the store module (`yarn test:store`).
|
|
7
|
+
--
|
|
8
|
+
-- Structure re-sort + existing-row uniqueness re-validation (memory-specific) live
|
|
9
|
+
-- in 41.7.1-alter-column-collate-unique.sqllogic.
|
|
10
|
+
|
|
11
|
+
-- ===================================
|
|
12
|
+
-- 1. SET COLLATE NOCASE changes `=` semantics on a non-key column.
|
|
13
|
+
-- ===================================
|
|
14
|
+
|
|
15
|
+
create table t_eq (id integer primary key, name text);
|
|
16
|
+
insert into t_eq values (1, 'abc'), (2, 'ABC'), (3, 'abd');
|
|
17
|
+
|
|
18
|
+
-- Under BINARY, only the exact 'ABC' matches.
|
|
19
|
+
select count(*) as n from t_eq where name = 'ABC';
|
|
20
|
+
→ [{"n":1}]
|
|
21
|
+
|
|
22
|
+
alter table t_eq alter column name set collate nocase;
|
|
23
|
+
|
|
24
|
+
-- Under NOCASE, both 'abc' and 'ABC' equal 'ABC'.
|
|
25
|
+
select count(*) as n from t_eq where name = 'ABC';
|
|
26
|
+
→ [{"n":2}]
|
|
27
|
+
|
|
28
|
+
drop table t_eq;
|
|
29
|
+
|
|
30
|
+
-- ===================================
|
|
31
|
+
-- 2. SET COLLATE NOCASE changes ORDER BY on a non-key column.
|
|
32
|
+
-- ===================================
|
|
33
|
+
|
|
34
|
+
create table t_ord (id integer primary key, name text);
|
|
35
|
+
insert into t_ord values (1, 'b'), (2, 'A'), (3, 'C');
|
|
36
|
+
|
|
37
|
+
-- BINARY: all uppercase sort before lowercase → A, C, b
|
|
38
|
+
select name from t_ord order by name;
|
|
39
|
+
→ [{"name":"A"},{"name":"C"},{"name":"b"}]
|
|
40
|
+
|
|
41
|
+
alter table t_ord alter column name set collate nocase;
|
|
42
|
+
|
|
43
|
+
-- NOCASE: case-folded order → A, b, C
|
|
44
|
+
select name from t_ord order by name;
|
|
45
|
+
→ [{"name":"A"},{"name":"b"},{"name":"C"}]
|
|
46
|
+
|
|
47
|
+
drop table t_ord;
|
|
48
|
+
|
|
49
|
+
-- ===================================
|
|
50
|
+
-- 3. table_info round-trip; set-back-to-BINARY clears it.
|
|
51
|
+
-- ===================================
|
|
52
|
+
|
|
53
|
+
create table t_ti (id integer primary key, name text);
|
|
54
|
+
|
|
55
|
+
select name, collation from table_info('t_ti') order by cid;
|
|
56
|
+
→ [{"name":"id","collation":"BINARY"},{"name":"name","collation":"BINARY"}]
|
|
57
|
+
|
|
58
|
+
alter table t_ti alter column name set collate nocase;
|
|
59
|
+
select name, collation from table_info('t_ti') order by cid;
|
|
60
|
+
→ [{"name":"id","collation":"BINARY"},{"name":"name","collation":"NOCASE"}]
|
|
61
|
+
|
|
62
|
+
-- the canonical UPPERCASE spelling round-trips identically
|
|
63
|
+
alter table t_ti alter column name set collate RTRIM;
|
|
64
|
+
select name, collation from table_info('t_ti') order by cid;
|
|
65
|
+
→ [{"name":"id","collation":"BINARY"},{"name":"name","collation":"RTRIM"}]
|
|
66
|
+
|
|
67
|
+
-- SET COLLATE BINARY restores the default
|
|
68
|
+
alter table t_ti alter column name set collate binary;
|
|
69
|
+
select name, collation from table_info('t_ti') order by cid;
|
|
70
|
+
→ [{"name":"id","collation":"BINARY"},{"name":"name","collation":"BINARY"}]
|
|
71
|
+
|
|
72
|
+
drop table t_ti;
|
|
73
|
+
|
|
74
|
+
-- ===================================
|
|
75
|
+
-- 4. Unknown / unsupported collation rejected (same error shape as CREATE TABLE).
|
|
76
|
+
-- ===================================
|
|
77
|
+
|
|
78
|
+
create table t_bad (id integer primary key, name text);
|
|
79
|
+
-- run
|
|
80
|
+
|
|
81
|
+
alter table t_bad alter column name set collate nosuchcollation;
|
|
82
|
+
-- error: Unknown collation 'nosuchcollation' for type 'TEXT'
|
|
83
|
+
|
|
84
|
+
-- the rejected ALTER left the column untouched
|
|
85
|
+
select name, collation from table_info('t_bad') order by cid;
|
|
86
|
+
→ [{"name":"id","collation":"BINARY"},{"name":"name","collation":"BINARY"}]
|
|
87
|
+
|
|
88
|
+
drop table t_bad;
|
|
89
|
+
|
|
90
|
+
-- ===================================
|
|
91
|
+
-- 5. Idempotent: re-applying the same collation is a harmless no-op.
|
|
92
|
+
-- ===================================
|
|
93
|
+
|
|
94
|
+
create table t_idem (id integer primary key, name text);
|
|
95
|
+
insert into t_idem values (1, 'a'), (2, 'B');
|
|
96
|
+
alter table t_idem alter column name set collate nocase;
|
|
97
|
+
alter table t_idem alter column name set collate nocase;
|
|
98
|
+
|
|
99
|
+
select name, collation from table_info('t_idem') order by cid;
|
|
100
|
+
→ [{"name":"id","collation":"BINARY"},{"name":"name","collation":"NOCASE"}]
|
|
101
|
+
|
|
102
|
+
select name from t_idem order by name;
|
|
103
|
+
→ [{"name":"a"},{"name":"B"}]
|
|
104
|
+
|
|
105
|
+
drop table t_idem;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
-- ALTER COLUMN ... SET COLLATE — PRIMARY KEY re-key collision (cross-module).
|
|
2
|
+
--
|
|
3
|
+
-- CROSS-MODULE (NOT in MEMORY_ONLY_FILES): runs in both memory and store modes.
|
|
4
|
+
-- Both modules enforce PRIMARY KEY uniqueness/ordering under a PER-COLUMN collation
|
|
5
|
+
-- and re-key the primary structure on an ALTER COLUMN SET COLLATE of a PK member —
|
|
6
|
+
-- memory re-keys its primary tree, the store physically re-encodes its data-store
|
|
7
|
+
-- keys (and rebuilds dependent secondary indexes). So a PK pair distinct under
|
|
8
|
+
-- BINARY but colliding under NOCASE rejects the ALTER with CONSTRAINT on both,
|
|
9
|
+
-- leaving the table unchanged and still BINARY.
|
|
10
|
+
--
|
|
11
|
+
-- The PK column is declared `collate binary` EXPLICITLY: the store's table-level
|
|
12
|
+
-- default key collation K is NOCASE, so an undecorated text PK would be keyed NOCASE
|
|
13
|
+
-- and could not even hold the 'a'/'A' pair. The explicit BINARY declaration is
|
|
14
|
+
-- honored natively by the store's per-column key encoding (ticket
|
|
15
|
+
-- store-pk-collate-physical-rekey), which is what makes this fixture runnable
|
|
16
|
+
-- cross-module. On memory `collate binary` matches its BINARY column default, so the
|
|
17
|
+
-- declaration is a no-op there.
|
|
18
|
+
--
|
|
19
|
+
-- The non-PK UNIQUE / CREATE UNIQUE INDEX sections (identical across both modules)
|
|
20
|
+
-- live in 41.7.2-alter-column-collate-unique-store.sqllogic, which also covers a
|
|
21
|
+
-- divergent PK collation change that is HONORED (re-keyed, non-colliding). The
|
|
22
|
+
-- cross-module query-layer behavior lives in 41.7-alter-column-collate.sqllogic.
|
|
23
|
+
|
|
24
|
+
-- ===================================
|
|
25
|
+
-- 1. PK column collation change re-keys the primary structure; a PK that is
|
|
26
|
+
-- unique under BINARY but collides under NOCASE is rejected, all-or-nothing.
|
|
27
|
+
-- ===================================
|
|
28
|
+
|
|
29
|
+
create table pkc (k text collate binary primary key);
|
|
30
|
+
insert into pkc values ('a'), ('A');
|
|
31
|
+
-- run
|
|
32
|
+
|
|
33
|
+
alter table pkc alter column k set collate nocase;
|
|
34
|
+
-- error: UNIQUE constraint failed
|
|
35
|
+
|
|
36
|
+
-- rollback: both rows survive, column still BINARY (BINARY order: A before a)
|
|
37
|
+
select k from pkc order by k;
|
|
38
|
+
→ [{"k":"A"},{"k":"a"}]
|
|
39
|
+
|
|
40
|
+
-- the table is still writable after the failed ALTER
|
|
41
|
+
insert into pkc values ('B');
|
|
42
|
+
select count(*) as n from pkc;
|
|
43
|
+
→ [{"n":3}]
|
|
44
|
+
|
|
45
|
+
drop table pkc;
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
-- ALTER COLUMN ... SET COLLATE — cross-module existing-row re-validation.
|
|
2
|
+
--
|
|
3
|
+
-- CROSS-MODULE (NOT in MEMORY_ONLY_FILES): runs in both memory and store modes.
|
|
4
|
+
-- Sections 1-8: a per-column collation change is re-validated against existing rows
|
|
5
|
+
-- for every non-PK UNIQUE constraint covering the altered column (inline / table-level
|
|
6
|
+
-- here; the CREATE UNIQUE INDEX-derived cases are in
|
|
7
|
+
-- 41.7.2.1-alter-column-collate-unique-index-store): a value set distinct under BINARY but colliding under
|
|
8
|
+
-- NOCASE rejects the ALTER with CONSTRAINT (schema unchanged), and a distinct set
|
|
9
|
+
-- succeeds and then enforces under the new collation. The store reaches end-to-end
|
|
10
|
+
-- parity with memory here because the constrained column is row DATA keyed by the
|
|
11
|
+
-- integer PK, so the store's fixed-table-collation KEY encoding is irrelevant — both
|
|
12
|
+
-- modules behave identically.
|
|
13
|
+
--
|
|
14
|
+
-- Section 9: a PRIMARY KEY column's collation change runs cross-module. Both modules
|
|
15
|
+
-- key the PK per-column and re-key the primary structure on SET COLLATE — memory
|
|
16
|
+
-- re-keys its primary tree, the store physically re-encodes its data-store keys and
|
|
17
|
+
-- rebuilds dependent secondary indexes (ticket store-pk-collate-physical-rekey). §9
|
|
18
|
+
-- exercises a NON-colliding divergent change (NOCASE→BINARY) that is HONORED: a
|
|
19
|
+
-- case-distinct PK that NOCASE collapsed now coexists, and ordering/uniqueness follow
|
|
20
|
+
-- BINARY. The COLLIDING divergent case ('a'/'A' under BINARY→NOCASE rejects with
|
|
21
|
+
-- CONSTRAINT, all-or-nothing) lives cross-module in
|
|
22
|
+
-- 41.7.1-alter-column-collate-unique.sqllogic. The cross-module query-layer behavior
|
|
23
|
+
-- lives in 41.7-alter-column-collate.sqllogic.
|
|
24
|
+
|
|
25
|
+
-- ===================================
|
|
26
|
+
-- 1. UNIQUE column, values distinct under BOTH collations → ALTER succeeds, and a
|
|
27
|
+
-- subsequent NOCASE-colliding insert is then rejected under the new collation.
|
|
28
|
+
-- ===================================
|
|
29
|
+
|
|
30
|
+
create table us (id integer primary key, email text unique);
|
|
31
|
+
insert into us values (1, 'a@x'), (2, 'b@x');
|
|
32
|
+
|
|
33
|
+
alter table us alter column email set collate nocase;
|
|
34
|
+
-- run
|
|
35
|
+
|
|
36
|
+
-- the change took effect: a case-only duplicate now collides under NOCASE
|
|
37
|
+
insert into us values (3, 'A@X');
|
|
38
|
+
-- error: UNIQUE constraint failed
|
|
39
|
+
|
|
40
|
+
select id, email from us order by id;
|
|
41
|
+
→ [{"id":1,"email":"a@x"},{"id":2,"email":"b@x"}]
|
|
42
|
+
|
|
43
|
+
-- a genuinely distinct value still inserts
|
|
44
|
+
insert into us values (4, 'c@x');
|
|
45
|
+
select id, email from us order by id;
|
|
46
|
+
→ [{"id":1,"email":"a@x"},{"id":2,"email":"b@x"},{"id":4,"email":"c@x"}]
|
|
47
|
+
|
|
48
|
+
drop table us;
|
|
49
|
+
|
|
50
|
+
-- ===================================
|
|
51
|
+
-- 2. UNIQUE column, values distinct under BINARY but COLLIDING under NOCASE →
|
|
52
|
+
-- the ALTER is rejected with CONSTRAINT and the table is left unchanged.
|
|
53
|
+
-- ===================================
|
|
54
|
+
|
|
55
|
+
create table uc (id integer primary key, email text unique);
|
|
56
|
+
insert into uc values (1, 'a@x'), (2, 'A@x');
|
|
57
|
+
-- run
|
|
58
|
+
|
|
59
|
+
alter table uc alter column email set collate nocase;
|
|
60
|
+
-- error: UNIQUE constraint failed
|
|
61
|
+
|
|
62
|
+
-- the rejected ALTER rolled back: both rows survive and the column is still BINARY,
|
|
63
|
+
-- so the two case-distinct values remain valid
|
|
64
|
+
select id, email from uc order by id;
|
|
65
|
+
→ [{"id":1,"email":"a@x"},{"id":2,"email":"A@x"}]
|
|
66
|
+
|
|
67
|
+
select name, collation from table_info('uc') order by cid;
|
|
68
|
+
→ [{"name":"id","collation":"BINARY"},{"name":"email","collation":"BINARY"}]
|
|
69
|
+
|
|
70
|
+
-- and the table is still writable after the failed ALTER
|
|
71
|
+
insert into uc values (3, 'B@x');
|
|
72
|
+
select count(*) as n from uc;
|
|
73
|
+
→ [{"n":3}]
|
|
74
|
+
|
|
75
|
+
drop table uc;
|
|
76
|
+
|
|
77
|
+
-- ===================================
|
|
78
|
+
-- 3-4. EXPLICIT `create unique index` (not an inline UNIQUE), re-validated by the
|
|
79
|
+
-- same existing-row scan — rejecting on collision, honoring when distinct.
|
|
80
|
+
-- ===================================
|
|
81
|
+
-- Lives in 41.7.2.1-alter-column-collate-unique-index-store; needs standalone index DDL.
|
|
82
|
+
|
|
83
|
+
-- ===================================
|
|
84
|
+
-- 5. COMPOSITE UNIQUE (a, b) where only member `a`'s collation changes. Each member
|
|
85
|
+
-- is normalized by its OWN column collation: after `a`→NOCASE, rows that differ
|
|
86
|
+
-- only by the case of `a` collide; the still-BINARY `b` keeps distinguishing rows
|
|
87
|
+
-- that differ in `b`'s case.
|
|
88
|
+
-- ===================================
|
|
89
|
+
|
|
90
|
+
-- 5a. distinct under BINARY (a: x vs X), colliding once `a` is NOCASE → ALTER rejected.
|
|
91
|
+
create table cc (id integer primary key, a text, b text, unique (a, b));
|
|
92
|
+
insert into cc values (1, 'x', 'y'), (2, 'X', 'y');
|
|
93
|
+
-- run
|
|
94
|
+
|
|
95
|
+
alter table cc alter column a set collate nocase;
|
|
96
|
+
-- error: UNIQUE constraint failed
|
|
97
|
+
|
|
98
|
+
-- rollback: both rows survive, `a` still BINARY
|
|
99
|
+
select id, a, b from cc order by id;
|
|
100
|
+
→ [{"id":1,"a":"x","b":"y"},{"id":2,"a":"X","b":"y"}]
|
|
101
|
+
|
|
102
|
+
drop table cc;
|
|
103
|
+
|
|
104
|
+
-- 5b. `a` differs only by case BUT `b` differs by case too → under (NOCASE a, BINARY b)
|
|
105
|
+
-- the rows stay distinct (b is still BINARY) → ALTER succeeds, and the composite
|
|
106
|
+
-- then enforces with `a` NOCASE / `b` BINARY.
|
|
107
|
+
create table cd (id integer primary key, a text, b text, unique (a, b));
|
|
108
|
+
insert into cd values (1, 'x', 'y'), (2, 'X', 'Y');
|
|
109
|
+
|
|
110
|
+
alter table cd alter column a set collate nocase;
|
|
111
|
+
-- run
|
|
112
|
+
|
|
113
|
+
-- ('x','y') vs ('X','Y'): a collides under NOCASE, b ('y' vs 'Y') still distinguishes → OK
|
|
114
|
+
select id, a, b from cd order by id;
|
|
115
|
+
→ [{"id":1,"a":"x","b":"y"},{"id":2,"a":"X","b":"Y"}]
|
|
116
|
+
|
|
117
|
+
-- now a NOCASE-on-a + exact-on-b duplicate collides
|
|
118
|
+
insert into cd values (3, 'X', 'y');
|
|
119
|
+
-- error: UNIQUE constraint failed
|
|
120
|
+
|
|
121
|
+
-- but a row distinguished by b (still BINARY, value distinct from both rows) inserts fine
|
|
122
|
+
insert into cd values (4, 'x', 'z');
|
|
123
|
+
select count(*) as n from cd;
|
|
124
|
+
→ [{"n":3}]
|
|
125
|
+
|
|
126
|
+
drop table cd;
|
|
127
|
+
|
|
128
|
+
-- ===================================
|
|
129
|
+
-- 6. PARTIAL unique index — only rows the predicate accepts are re-validated.
|
|
130
|
+
-- ===================================
|
|
131
|
+
-- Lives in 41.7.2.1-alter-column-collate-unique-index-store: a partial UNIQUE can only
|
|
132
|
+
-- be spelled as `create unique index … where …`, so it needs standalone index DDL.
|
|
133
|
+
|
|
134
|
+
-- ===================================
|
|
135
|
+
-- 7. NULL handling — SQL UNIQUE allows multiple NULLs, so existing NULL rows never
|
|
136
|
+
-- count as collisions during the re-validation scan.
|
|
137
|
+
-- ===================================
|
|
138
|
+
|
|
139
|
+
create table nn (id integer primary key, email text null unique);
|
|
140
|
+
insert into nn values (1, null), (2, null), (3, 'a@x');
|
|
141
|
+
-- run
|
|
142
|
+
|
|
143
|
+
alter table nn alter column email set collate nocase;
|
|
144
|
+
-- run
|
|
145
|
+
|
|
146
|
+
select name, collation from table_info('nn') where name = 'email';
|
|
147
|
+
→ [{"name":"email","collation":"NOCASE"}]
|
|
148
|
+
|
|
149
|
+
-- multiple NULLs still allowed after the change; a NOCASE duplicate still rejected
|
|
150
|
+
insert into nn values (4, null);
|
|
151
|
+
insert into nn values (5, 'A@X');
|
|
152
|
+
-- error: UNIQUE constraint failed
|
|
153
|
+
|
|
154
|
+
select count(*) as n from nn;
|
|
155
|
+
→ [{"n":4}]
|
|
156
|
+
|
|
157
|
+
drop table nn;
|
|
158
|
+
|
|
159
|
+
-- ===================================
|
|
160
|
+
-- 8. NO-OP guard — setting the collation to the value it already has is a no-op that
|
|
161
|
+
-- neither scans nor rejects (re-applying NOCASE after it is already NOCASE), even
|
|
162
|
+
-- when existing rows would collide under some OTHER collation.
|
|
163
|
+
-- ===================================
|
|
164
|
+
|
|
165
|
+
create table nopg (id integer primary key, email text collate nocase unique);
|
|
166
|
+
-- two rows distinct under NOCASE
|
|
167
|
+
insert into nopg values (1, 'a@x'), (2, 'b@x');
|
|
168
|
+
-- run
|
|
169
|
+
|
|
170
|
+
-- idempotent re-apply: already NOCASE → returns the existing schema, no scan
|
|
171
|
+
alter table nopg alter column email set collate nocase;
|
|
172
|
+
-- run
|
|
173
|
+
|
|
174
|
+
select name, collation from table_info('nopg') where name = 'email';
|
|
175
|
+
→ [{"name":"email","collation":"NOCASE"}]
|
|
176
|
+
|
|
177
|
+
-- still enforcing NOCASE afterward
|
|
178
|
+
insert into nopg values (3, 'A@X');
|
|
179
|
+
-- error: UNIQUE constraint failed
|
|
180
|
+
|
|
181
|
+
drop table nopg;
|
|
182
|
+
|
|
183
|
+
-- ===================================
|
|
184
|
+
-- 9. PRIMARY KEY column, DIVERGENT collation change (NOCASE → BINARY) is HONORED
|
|
185
|
+
-- cross-module via a physical re-key. The column is declared `collate nocase`
|
|
186
|
+
-- EXPLICITLY so both modules start NOCASE-keyed (the store honors the explicit
|
|
187
|
+
-- NOCASE per-column; memory keys NOCASE too). After re-keying to BINARY a
|
|
188
|
+
-- case-distinct PK that NOCASE collapsed now coexists, and ordering/uniqueness
|
|
189
|
+
-- follow BINARY. (The store re-keys per-column instead of rejecting the divergent
|
|
190
|
+
-- change — ticket store-pk-collate-physical-rekey.)
|
|
191
|
+
-- ===================================
|
|
192
|
+
|
|
193
|
+
create table pkb (k text collate nocase primary key);
|
|
194
|
+
insert into pkb values ('alpha'), ('beta');
|
|
195
|
+
|
|
196
|
+
alter table pkb alter column k set collate binary;
|
|
197
|
+
-- run
|
|
198
|
+
|
|
199
|
+
-- under BINARY a case-distinct value now coexists (it would collide under NOCASE)
|
|
200
|
+
insert into pkb values ('ALPHA');
|
|
201
|
+
select k from pkb order by k;
|
|
202
|
+
→ [{"k":"ALPHA"},{"k":"alpha"},{"k":"beta"}]
|
|
203
|
+
|
|
204
|
+
-- an exact-duplicate PK still collides under BINARY
|
|
205
|
+
insert into pkb values ('beta');
|
|
206
|
+
-- error: UNIQUE constraint failed
|
|
207
|
+
|
|
208
|
+
drop table pkb;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
-- 41.7.2.1-alter-column-collate-unique-index-store.sqllogic
|
|
2
|
+
--
|
|
3
|
+
-- requires-capability: standalone-index-ddl
|
|
4
|
+
--
|
|
5
|
+
-- ALTER COLUMN ... SET COLLATE re-validation where the UNIQUE comes from a standalone
|
|
6
|
+
-- `create unique index`.
|
|
7
|
+
--
|
|
8
|
+
-- CROSS-MODULE (NOT in MEMORY_ONLY_FILES): runs in both memory and store modes, for the
|
|
9
|
+
-- same reason as its parent — the constrained column is row DATA keyed by the integer PK,
|
|
10
|
+
-- so the store's fixed-table-collation KEY encoding is irrelevant.
|
|
11
|
+
--
|
|
12
|
+
-- Carved out of 41.7.2-alter-column-collate-unique-store: sections 1, 2, 5, 7, 8 and 9
|
|
13
|
+
-- there make the same re-validation points (reject on collision, honor when distinct,
|
|
14
|
+
-- composite members, NULLs, no-op guard, PK re-key) with inline / table-level UNIQUE and
|
|
15
|
+
-- need no index DDL. These sections need an explicit index — §1/§2 below because the
|
|
16
|
+
-- constraint is index-derived rather than declared, §3 because a PARTIAL unique
|
|
17
|
+
-- constraint has no declarative spelling in this engine.
|
|
18
|
+
--
|
|
19
|
+
-- Subject: an index-derived UNIQUE (including a partial one) is re-validated by the same
|
|
20
|
+
-- existing-row scan on SET COLLATE, and afterwards enforces under the resulting collation.
|
|
21
|
+
|
|
22
|
+
-- ===================================
|
|
23
|
+
-- 1. EXPLICIT `create unique index` (not an inline UNIQUE) is re-validated by the
|
|
24
|
+
-- same existing-row scan. A value set distinct under BINARY but colliding under
|
|
25
|
+
-- NOCASE rejects the ALTER and rolls back; the table stays writable and the index
|
|
26
|
+
-- keeps enforcing under the original collation.
|
|
27
|
+
-- ===================================
|
|
28
|
+
create table xi (id integer primary key, email text);
|
|
29
|
+
create unique index xi_email on xi(email);
|
|
30
|
+
insert into xi values (1, 'a@x'), (2, 'A@x');
|
|
31
|
+
-- run
|
|
32
|
+
|
|
33
|
+
alter table xi alter column email set collate nocase;
|
|
34
|
+
-- error: UNIQUE constraint failed
|
|
35
|
+
|
|
36
|
+
-- rollback: both rows survive, column still BINARY
|
|
37
|
+
select id, email from xi order by id;
|
|
38
|
+
→ [{"id":1,"email":"a@x"},{"id":2,"email":"A@x"}]
|
|
39
|
+
|
|
40
|
+
select name, collation from table_info('xi') order by cid;
|
|
41
|
+
→ [{"name":"id","collation":"BINARY"},{"name":"email","collation":"BINARY"}]
|
|
42
|
+
|
|
43
|
+
-- the explicit unique index still enforces (under the original BINARY collation):
|
|
44
|
+
-- a case-distinct value is still allowed, an exact duplicate is rejected.
|
|
45
|
+
insert into xi values (3, 'B@x');
|
|
46
|
+
select count(*) as n from xi;
|
|
47
|
+
→ [{"n":3}]
|
|
48
|
+
|
|
49
|
+
insert into xi values (4, 'a@x');
|
|
50
|
+
-- error: UNIQUE constraint failed
|
|
51
|
+
|
|
52
|
+
drop table xi;
|
|
53
|
+
|
|
54
|
+
-- ===================================
|
|
55
|
+
-- 2. EXPLICIT `create unique index`, distinct under BOTH collations → ALTER
|
|
56
|
+
-- succeeds and the index then enforces under the NEW collation.
|
|
57
|
+
-- ===================================
|
|
58
|
+
|
|
59
|
+
create table xj (id integer primary key, email text);
|
|
60
|
+
create unique index xj_email on xj(email);
|
|
61
|
+
insert into xj values (1, 'a@x'), (2, 'b@x');
|
|
62
|
+
|
|
63
|
+
alter table xj alter column email set collate nocase;
|
|
64
|
+
-- run
|
|
65
|
+
|
|
66
|
+
-- the index now enforces under NOCASE: a case-only duplicate collides
|
|
67
|
+
insert into xj values (3, 'A@X');
|
|
68
|
+
-- error: UNIQUE constraint failed
|
|
69
|
+
|
|
70
|
+
select id, email from xj order by id;
|
|
71
|
+
→ [{"id":1,"email":"a@x"},{"id":2,"email":"b@x"}]
|
|
72
|
+
|
|
73
|
+
drop table xj;
|
|
74
|
+
|
|
75
|
+
-- ===================================
|
|
76
|
+
-- 3. PARTIAL unique index — only rows the predicate accepts are re-validated. A
|
|
77
|
+
-- case-collision among EXCLUDED rows must NOT block the ALTER; a collision among
|
|
78
|
+
-- INCLUDED rows must.
|
|
79
|
+
-- ===================================
|
|
80
|
+
|
|
81
|
+
-- 3a. the colliding pair is excluded by the predicate → ALTER succeeds.
|
|
82
|
+
create table pp (id integer primary key, code text, active integer);
|
|
83
|
+
create unique index pp_code on pp(code) where active = 1;
|
|
84
|
+
insert into pp values (1, 'a', 0), (2, 'A', 0);
|
|
85
|
+
-- run
|
|
86
|
+
|
|
87
|
+
alter table pp alter column code set collate nocase;
|
|
88
|
+
-- run
|
|
89
|
+
|
|
90
|
+
-- the change took effect and the partial index now enforces NOCASE for active rows
|
|
91
|
+
select name, collation from table_info('pp') where name = 'code';
|
|
92
|
+
→ [{"name":"code","collation":"NOCASE"}]
|
|
93
|
+
|
|
94
|
+
insert into pp values (3, 'a', 1);
|
|
95
|
+
insert into pp values (4, 'A', 1);
|
|
96
|
+
-- error: UNIQUE constraint failed
|
|
97
|
+
|
|
98
|
+
drop table pp;
|
|
99
|
+
|
|
100
|
+
-- 3b. the colliding pair is INCLUDED by the predicate → ALTER rejected, rollback.
|
|
101
|
+
create table pq (id integer primary key, code text, active integer);
|
|
102
|
+
create unique index pq_code on pq(code) where active = 1;
|
|
103
|
+
insert into pq values (1, 'a', 1), (2, 'A', 1);
|
|
104
|
+
-- run
|
|
105
|
+
|
|
106
|
+
alter table pq alter column code set collate nocase;
|
|
107
|
+
-- error: UNIQUE constraint failed
|
|
108
|
+
|
|
109
|
+
select name, collation from table_info('pq') where name = 'code';
|
|
110
|
+
→ [{"name":"code","collation":"BINARY"}]
|
|
111
|
+
|
|
112
|
+
drop table pq;
|
|
113
|
+
|
|
114
|
+
-- ===================================
|