@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,445 @@
|
|
|
1
|
+
-- ALTER COLUMN ... SET DATA TYPE into a type that COMPARES differently, when the physical
|
|
2
|
+
-- storage class does not change.
|
|
3
|
+
--
|
|
4
|
+
-- TEXT and TIMESPAN are both physically text, and every spelling below is already the new
|
|
5
|
+
-- type's canonical form, so the retype leaves the stored bytes alone (the rewrite pass
|
|
6
|
+
-- re-parses each value — '1 hour' WOULD become 'PT1H'; see 41.2 §12 — but ISO durations
|
|
7
|
+
-- round-trip unchanged). It does change how two values compare: TIMESPAN ranks by elapsed time, so 'PT1H',
|
|
8
|
+
-- 'PT60M' and 'PT3600S' are ONE value where text sees three. Every index over the column is
|
|
9
|
+
-- keyed by the column's logical type, so such a retype must be treated exactly like a
|
|
10
|
+
-- SET COLLATE: re-validate every uniqueness-enforcing structure covering the column BEFORE
|
|
11
|
+
-- mutating anything, and re-sort those structures when the change is accepted.
|
|
12
|
+
--
|
|
13
|
+
-- Without that, the change was silently accepted and left the indexes sorted the old way:
|
|
14
|
+
-- an index-backed lookup for another spelling of a stored duration found nothing, while an
|
|
15
|
+
-- INSERT of that same spelling was rejected as a duplicate — a value simultaneously absent
|
|
16
|
+
-- on SELECT and duplicate on INSERT (bug-retype-to-semantic-type-unique-and-query).
|
|
17
|
+
--
|
|
18
|
+
-- CROSS-MODULE (the `-memory` in the filename is historical): the store backend used to cover
|
|
19
|
+
-- only the TIMESPAN/JSON halves, via its own key-transform guard. It now gates its value rewrite
|
|
20
|
+
-- on logical-type identity like memory does (bug-retype-same-class-skips-value-validation), so
|
|
21
|
+
-- the DATE / TIME / DATETIME retypes of section 7b re-validate and rebuild there too, and this
|
|
22
|
+
-- file runs on both legs.
|
|
23
|
+
|
|
24
|
+
-- ===================================
|
|
25
|
+
-- 1. Colliding rows under an explicit `create unique index` → the ALTER is REJECTED.
|
|
26
|
+
-- ===================================
|
|
27
|
+
-- Lives in 41.7.4.1-alter-column-retype-semantic-index-memory (it needs standalone index
|
|
28
|
+
-- DDL); § 2 below is the same collision through an inline `v text unique`.
|
|
29
|
+
|
|
30
|
+
-- ===================================
|
|
31
|
+
-- 2. Same collision through an inline `v text unique` (the auto-built covering index
|
|
32
|
+
-- rather than a user-created one).
|
|
33
|
+
-- ===================================
|
|
34
|
+
|
|
35
|
+
create table sem2 (id integer primary key, v text unique);
|
|
36
|
+
insert into sem2 values (1, 'PT1H'), (2, 'PT60M');
|
|
37
|
+
-- run
|
|
38
|
+
|
|
39
|
+
alter table sem2 alter column v set data type timespan;
|
|
40
|
+
-- error: UNIQUE constraint failed
|
|
41
|
+
|
|
42
|
+
select name, type from table_info('sem2') where name = 'v';
|
|
43
|
+
→ [{"name":"v","type":"TEXT"}]
|
|
44
|
+
|
|
45
|
+
select id, v from sem2 order by id;
|
|
46
|
+
→ [{"id":1,"v":"PT1H"},{"id":2,"v":"PT60M"}]
|
|
47
|
+
|
|
48
|
+
drop table sem2;
|
|
49
|
+
|
|
50
|
+
-- ===================================
|
|
51
|
+
-- 3. ACCEPTED: no collision (one hour and two hours). The change must still re-sort the
|
|
52
|
+
-- index — this is the case the old code got wrong WITHOUT any uniqueness violation.
|
|
53
|
+
-- ===================================
|
|
54
|
+
|
|
55
|
+
create table sem3 (id integer primary key, v text, unique (v));
|
|
56
|
+
insert into sem3 values (1, 'PT1H'), (2, 'PT2H');
|
|
57
|
+
-- run
|
|
58
|
+
|
|
59
|
+
alter table sem3 alter column v set data type timespan;
|
|
60
|
+
-- run
|
|
61
|
+
|
|
62
|
+
select name, type from table_info('sem3') where name = 'v';
|
|
63
|
+
→ [{"name":"v","type":"TIMESPAN"}]
|
|
64
|
+
|
|
65
|
+
-- the stored values survive byte-identical: both are already canonical ISO durations, so the
|
|
66
|
+
-- rewrite pass re-parses them to themselves
|
|
67
|
+
select id, v, typeof(v) from sem3 order by id;
|
|
68
|
+
→ [{"id":1,"v":"PT1H","typeof(v)":"text"},{"id":2,"v":"PT2H","typeof(v)":"text"}]
|
|
69
|
+
|
|
70
|
+
-- an index-backed lookup by ANOTHER spelling of the stored duration finds the row
|
|
71
|
+
select id from sem3 where v = 'PT60M';
|
|
72
|
+
→ [{"id":1}]
|
|
73
|
+
|
|
74
|
+
select id from sem3 where v = 'PT3600S';
|
|
75
|
+
→ [{"id":1}]
|
|
76
|
+
|
|
77
|
+
-- ...and uniqueness now enforces semantically: 120 minutes duplicates the stored 'PT2H'
|
|
78
|
+
insert into sem3 values (3, 'PT120M');
|
|
79
|
+
-- error: UNIQUE constraint failed
|
|
80
|
+
|
|
81
|
+
-- a genuinely new duration is still accepted
|
|
82
|
+
insert into sem3 values (4, 'PT30M');
|
|
83
|
+
select id from sem3 where v = 'PT1800S';
|
|
84
|
+
→ [{"id":4}]
|
|
85
|
+
|
|
86
|
+
drop table sem3;
|
|
87
|
+
|
|
88
|
+
-- ===================================
|
|
89
|
+
-- 4. Non-unique index: no uniqueness to violate, but the index still has to be re-sorted
|
|
90
|
+
-- or the lookup misses rows.
|
|
91
|
+
-- ===================================
|
|
92
|
+
-- The indexed legs (4 and 4c) live in 41.7.4.1-alter-column-retype-semantic-index-memory;
|
|
93
|
+
-- the unindexed leg stays here as the answer they must match.
|
|
94
|
+
|
|
95
|
+
-- 4b. the identical table with no index at all
|
|
96
|
+
create table sem4b (id integer primary key, v text);
|
|
97
|
+
insert into sem4b values (1, 'PT1H'), (2, 'PT60M'), (3, 'PT2H');
|
|
98
|
+
-- run
|
|
99
|
+
|
|
100
|
+
alter table sem4b alter column v set data type timespan;
|
|
101
|
+
-- run
|
|
102
|
+
|
|
103
|
+
select id from sem4b where v = 'PT3600S' order by id;
|
|
104
|
+
→ [{"id":1},{"id":2}]
|
|
105
|
+
|
|
106
|
+
drop table sem4b;
|
|
107
|
+
|
|
108
|
+
-- ===================================
|
|
109
|
+
-- 5. Reverse direction, TIMESPAN → TEXT: comparison becomes textual again, so the spellings
|
|
110
|
+
-- separate and a duration that was a duplicate becomes insertable.
|
|
111
|
+
-- ===================================
|
|
112
|
+
|
|
113
|
+
create table sem5 (id integer primary key, v timespan, unique (v));
|
|
114
|
+
insert into sem5 values (1, 'PT1H'), (2, 'PT2H');
|
|
115
|
+
-- run
|
|
116
|
+
|
|
117
|
+
-- while TIMESPAN: another spelling finds the row and duplicates it
|
|
118
|
+
select id from sem5 where v = 'PT60M';
|
|
119
|
+
→ [{"id":1}]
|
|
120
|
+
|
|
121
|
+
alter table sem5 alter column v set data type text;
|
|
122
|
+
-- run
|
|
123
|
+
|
|
124
|
+
select name, type from table_info('sem5') where name = 'v';
|
|
125
|
+
→ [{"name":"v","type":"TEXT"}]
|
|
126
|
+
|
|
127
|
+
-- now purely textual: 'PT60M' is a different value from the stored 'PT1H'
|
|
128
|
+
select id from sem5 where v = 'PT60M';
|
|
129
|
+
→ []
|
|
130
|
+
|
|
131
|
+
select id from sem5 where v = 'PT1H';
|
|
132
|
+
→ [{"id":1}]
|
|
133
|
+
|
|
134
|
+
-- ...so it is no longer a duplicate
|
|
135
|
+
insert into sem5 values (3, 'PT60M');
|
|
136
|
+
select count(*) as n from sem5;
|
|
137
|
+
→ [{"n":3}]
|
|
138
|
+
|
|
139
|
+
drop table sem5;
|
|
140
|
+
|
|
141
|
+
-- ===================================
|
|
142
|
+
-- 6. A retype into a type that compares IDENTICALLY stays a metadata-only no-op — the
|
|
143
|
+
-- guard must not re-validate or re-sort on every `text → varchar` widening.
|
|
144
|
+
-- ===================================
|
|
145
|
+
|
|
146
|
+
create table sem6 (id integer primary key, v text, unique (v));
|
|
147
|
+
insert into sem6 values (1, 'PT1H'), (2, 'PT60M');
|
|
148
|
+
-- run
|
|
149
|
+
|
|
150
|
+
-- both spellings survive: still two distinct TEXT values
|
|
151
|
+
alter table sem6 alter column v set data type varchar(50);
|
|
152
|
+
-- run
|
|
153
|
+
|
|
154
|
+
select id, v from sem6 order by id;
|
|
155
|
+
→ [{"id":1,"v":"PT1H"},{"id":2,"v":"PT60M"}]
|
|
156
|
+
|
|
157
|
+
select id from sem6 where v = 'PT60M';
|
|
158
|
+
→ [{"id":2}]
|
|
159
|
+
|
|
160
|
+
drop table sem6;
|
|
161
|
+
|
|
162
|
+
-- 6b. integer → bigint, likewise a no-op
|
|
163
|
+
create table sem6b (id integer primary key, n integer, unique (n));
|
|
164
|
+
insert into sem6b values (1, 10), (2, 9);
|
|
165
|
+
-- run
|
|
166
|
+
|
|
167
|
+
alter table sem6b alter column n set data type bigint;
|
|
168
|
+
-- run
|
|
169
|
+
|
|
170
|
+
select id, n from sem6b order by id;
|
|
171
|
+
→ [{"id":1,"n":10},{"id":2,"n":9}]
|
|
172
|
+
|
|
173
|
+
select id from sem6b where n = 9;
|
|
174
|
+
→ [{"id":2}]
|
|
175
|
+
|
|
176
|
+
drop table sem6b;
|
|
177
|
+
|
|
178
|
+
-- ===================================
|
|
179
|
+
-- 7. SET DATA TYPE keeps the column's existing collation, so the NEW type has to accept it.
|
|
180
|
+
-- DATE / TIME / DATETIME / TIMESPAN / JSON declare `supportedCollations: []` — they accept
|
|
181
|
+
-- BINARY only — so retyping a `collate nocase` column into any of them is REJECTED with
|
|
182
|
+
-- the same error `create table … (d date collate nocase)` gives. Otherwise the ALTER would
|
|
183
|
+
-- mint `d DATE COLLATE NOCASE`, a column shape no CREATE TABLE can produce and whose
|
|
184
|
+
-- canonical DDL does not re-parse (on a store-backed database the table is dropped on
|
|
185
|
+
-- reopen). Remedy is one extra statement: `set collate binary` first — see 7c.
|
|
186
|
+
--
|
|
187
|
+
-- The rejection is uniform: it does not matter whether the collation was written by the
|
|
188
|
+
-- user or inherited from `pragma default_collation`, because that distinction is not
|
|
189
|
+
-- persisted and would flip on a reopen.
|
|
190
|
+
-- ===================================
|
|
191
|
+
|
|
192
|
+
create table sem7 (id integer primary key, d text collate nocase, unique (d));
|
|
193
|
+
insert into sem7 values (1, '2024-01-01'), (2, '2024-02-01');
|
|
194
|
+
-- run
|
|
195
|
+
|
|
196
|
+
alter table sem7 alter column d set data type date;
|
|
197
|
+
-- error: Unknown collation
|
|
198
|
+
|
|
199
|
+
-- the rejection changed nothing: declared type, collation, rows and index all survive
|
|
200
|
+
select name, type from table_info('sem7') where name = 'd';
|
|
201
|
+
→ [{"name":"d","type":"TEXT"}]
|
|
202
|
+
|
|
203
|
+
select name, collation from table_info('sem7') where name = 'd';
|
|
204
|
+
→ [{"name":"d","collation":"NOCASE"}]
|
|
205
|
+
|
|
206
|
+
select id, d from sem7 order by id;
|
|
207
|
+
→ [{"id":1,"d":"2024-01-01"},{"id":2,"d":"2024-02-01"}]
|
|
208
|
+
|
|
209
|
+
-- still writable, and the index still enforces NOCASE uniqueness under the unchanged type
|
|
210
|
+
insert into sem7 values (3, '2024-03-01');
|
|
211
|
+
select count(*) as n from sem7;
|
|
212
|
+
→ [{"n":3}]
|
|
213
|
+
|
|
214
|
+
drop table sem7;
|
|
215
|
+
|
|
216
|
+
-- 7b. …and the collation-legal shape of the same retype (a plain BINARY `text` column, the
|
|
217
|
+
-- only collation DATE accepts). DATE compares exactly as BINARY text does, so this one
|
|
218
|
+
-- re-sorts into the order it was already in — the point is that it stays correct and stays
|
|
219
|
+
-- accepted. This is the surviving re-key coverage now that section 7 rejects.
|
|
220
|
+
create table sem7b (id integer primary key, d text, unique (d));
|
|
221
|
+
insert into sem7b values (1, '2024-02-01'), (2, '2024-01-01');
|
|
222
|
+
-- run
|
|
223
|
+
|
|
224
|
+
alter table sem7b alter column d set data type date;
|
|
225
|
+
-- run
|
|
226
|
+
|
|
227
|
+
select id, d from sem7b order by d;
|
|
228
|
+
→ [{"id":2,"d":"2024-01-01"},{"id":1,"d":"2024-02-01"}]
|
|
229
|
+
|
|
230
|
+
select id from sem7b where d = '2024-02-01';
|
|
231
|
+
→ [{"id":1}]
|
|
232
|
+
|
|
233
|
+
drop table sem7b;
|
|
234
|
+
|
|
235
|
+
-- 7c. …the remedy for section 7: drop the illegal collation first, then retype. Two statements,
|
|
236
|
+
-- both accepted, and the resulting column is a shape CREATE TABLE could have produced directly.
|
|
237
|
+
create table sem7c (id integer primary key, d text collate nocase, unique (d));
|
|
238
|
+
insert into sem7c values (1, '2024-02-01'), (2, '2024-01-01');
|
|
239
|
+
-- run
|
|
240
|
+
|
|
241
|
+
alter table sem7c alter column d set collate binary;
|
|
242
|
+
-- run
|
|
243
|
+
alter table sem7c alter column d set data type date;
|
|
244
|
+
-- run
|
|
245
|
+
|
|
246
|
+
select name, type, collation from table_info('sem7c') where name = 'd';
|
|
247
|
+
→ [{"name":"d","type":"DATE","collation":"BINARY"}]
|
|
248
|
+
|
|
249
|
+
select id, d from sem7c order by d;
|
|
250
|
+
→ [{"id":2,"d":"2024-01-01"},{"id":1,"d":"2024-02-01"}]
|
|
251
|
+
|
|
252
|
+
drop table sem7c;
|
|
253
|
+
|
|
254
|
+
-- 7d. Every collation-less type rejects, and the collation name is not special — RTRIM
|
|
255
|
+
-- rejects exactly as NOCASE does.
|
|
256
|
+
create table sem7d (id integer primary key, v text collate nocase);
|
|
257
|
+
insert into sem7d values (1, 'x');
|
|
258
|
+
-- run
|
|
259
|
+
|
|
260
|
+
alter table sem7d alter column v set data type date;
|
|
261
|
+
-- error: Unknown collation
|
|
262
|
+
|
|
263
|
+
alter table sem7d alter column v set data type time;
|
|
264
|
+
-- error: Unknown collation
|
|
265
|
+
|
|
266
|
+
alter table sem7d alter column v set data type datetime;
|
|
267
|
+
-- error: Unknown collation
|
|
268
|
+
|
|
269
|
+
alter table sem7d alter column v set data type timespan;
|
|
270
|
+
-- error: Unknown collation
|
|
271
|
+
|
|
272
|
+
alter table sem7d alter column v set data type json;
|
|
273
|
+
-- error: Unknown collation
|
|
274
|
+
|
|
275
|
+
select name, type, collation from table_info('sem7d') where name = 'v';
|
|
276
|
+
→ [{"name":"v","type":"TEXT","collation":"NOCASE"}]
|
|
277
|
+
|
|
278
|
+
drop table sem7d;
|
|
279
|
+
|
|
280
|
+
create table sem7d2 (id integer primary key, v text collate rtrim);
|
|
281
|
+
insert into sem7d2 values (1, 'x');
|
|
282
|
+
-- run
|
|
283
|
+
|
|
284
|
+
alter table sem7d2 alter column v set data type timespan;
|
|
285
|
+
-- error: Unknown collation
|
|
286
|
+
|
|
287
|
+
select name, type, collation from table_info('sem7d2') where name = 'v';
|
|
288
|
+
→ [{"name":"v","type":"TEXT","collation":"RTRIM"}]
|
|
289
|
+
|
|
290
|
+
drop table sem7d2;
|
|
291
|
+
|
|
292
|
+
-- 7e. …and the types that declare NO collation list (INTEGER / REAL / BLOB) must not regress
|
|
293
|
+
-- into rejecting: they accept any registered collation, so a NOCASE column still retypes.
|
|
294
|
+
create table sem7e (id integer primary key, v text collate nocase);
|
|
295
|
+
insert into sem7e values (1, '10');
|
|
296
|
+
-- run
|
|
297
|
+
|
|
298
|
+
alter table sem7e alter column v set data type integer;
|
|
299
|
+
-- run
|
|
300
|
+
|
|
301
|
+
select name, type, collation from table_info('sem7e') where name = 'v';
|
|
302
|
+
→ [{"name":"v","type":"INTEGER","collation":"NOCASE"}]
|
|
303
|
+
|
|
304
|
+
drop table sem7e;
|
|
305
|
+
|
|
306
|
+
create table sem7e2 (id integer primary key, v text collate nocase);
|
|
307
|
+
insert into sem7e2 values (1, 'abc');
|
|
308
|
+
-- run
|
|
309
|
+
|
|
310
|
+
alter table sem7e2 alter column v set data type blob;
|
|
311
|
+
-- run
|
|
312
|
+
|
|
313
|
+
select name, type, collation from table_info('sem7e2') where name = 'v';
|
|
314
|
+
→ [{"name":"v","type":"BLOB","collation":"NOCASE"}]
|
|
315
|
+
|
|
316
|
+
drop table sem7e2;
|
|
317
|
+
|
|
318
|
+
-- 7f. The rejection does not care where the collation came from: with a session default of
|
|
319
|
+
-- NOCASE the user never writes COLLATE, and the retype is still rejected. (`collationExplicit`
|
|
320
|
+
-- is not persisted, so keying the rule on user intent would flip on a reopen.)
|
|
321
|
+
pragma default_collation = 'nocase';
|
|
322
|
+
-- run
|
|
323
|
+
|
|
324
|
+
create table sem7f (id integer primary key, v text);
|
|
325
|
+
insert into sem7f values (1, '2024-01-01');
|
|
326
|
+
-- run
|
|
327
|
+
|
|
328
|
+
select name, collation from table_info('sem7f') where name = 'v';
|
|
329
|
+
→ [{"name":"v","collation":"NOCASE"}]
|
|
330
|
+
|
|
331
|
+
alter table sem7f alter column v set data type date;
|
|
332
|
+
-- error: Unknown collation
|
|
333
|
+
|
|
334
|
+
drop table sem7f;
|
|
335
|
+
|
|
336
|
+
pragma default_collation = 'binary';
|
|
337
|
+
-- run
|
|
338
|
+
|
|
339
|
+
-- ===================================
|
|
340
|
+
-- 8. EFFECTIVE rows, not committed rows: a collision involving a row the open transaction
|
|
341
|
+
-- has staged but not committed MUST reject the retype, and the transaction stays usable.
|
|
342
|
+
-- ===================================
|
|
343
|
+
|
|
344
|
+
create table sem8 (id integer primary key, v text, unique (v));
|
|
345
|
+
insert into sem8 values (1, 'PT1H');
|
|
346
|
+
-- run
|
|
347
|
+
|
|
348
|
+
begin;
|
|
349
|
+
-- run
|
|
350
|
+
insert into sem8 values (2, 'PT60M');
|
|
351
|
+
-- run
|
|
352
|
+
|
|
353
|
+
alter table sem8 alter column v set data type timespan;
|
|
354
|
+
-- error: UNIQUE constraint failed
|
|
355
|
+
|
|
356
|
+
-- the transaction survived the rejection: removing the offending row lets the retry pass
|
|
357
|
+
delete from sem8 where id = 2;
|
|
358
|
+
-- run
|
|
359
|
+
alter table sem8 alter column v set data type timespan;
|
|
360
|
+
-- run
|
|
361
|
+
commit;
|
|
362
|
+
-- run
|
|
363
|
+
|
|
364
|
+
select id, v from sem8 order by id;
|
|
365
|
+
→ [{"id":1,"v":"PT1H"}]
|
|
366
|
+
|
|
367
|
+
-- committed under the new type, so the re-sorted index answers semantically
|
|
368
|
+
select id from sem8 where v = 'PT3600S';
|
|
369
|
+
→ [{"id":1}]
|
|
370
|
+
|
|
371
|
+
drop table sem8;
|
|
372
|
+
|
|
373
|
+
-- 8b. …and a collision only among rows the transaction has DELETED does NOT block it.
|
|
374
|
+
create table sem8b (id integer primary key, v text, unique (v));
|
|
375
|
+
insert into sem8b values (1, 'PT1H'), (2, 'PT60M'), (3, 'PT2H');
|
|
376
|
+
-- run
|
|
377
|
+
|
|
378
|
+
begin;
|
|
379
|
+
-- run
|
|
380
|
+
delete from sem8b where id = 2;
|
|
381
|
+
-- run
|
|
382
|
+
alter table sem8b alter column v set data type timespan;
|
|
383
|
+
-- run
|
|
384
|
+
commit;
|
|
385
|
+
-- run
|
|
386
|
+
|
|
387
|
+
select id from sem8b where v = 'PT3600S';
|
|
388
|
+
→ [{"id":1}]
|
|
389
|
+
|
|
390
|
+
select id from sem8b where v = 'PT120M';
|
|
391
|
+
→ [{"id":3}]
|
|
392
|
+
|
|
393
|
+
drop table sem8b;
|
|
394
|
+
|
|
395
|
+
-- ===================================
|
|
396
|
+
-- 9. JSON is the third same-storage-class type carrying its own comparison: it ranks by
|
|
397
|
+
-- canonical structure, so '{"a":1}' and '{ "a" : 1 }' are one document where text sees
|
|
398
|
+
-- two. Same contract as the TIMESPAN sections above.
|
|
399
|
+
-- ===================================
|
|
400
|
+
|
|
401
|
+
create table sem9 (id integer primary key, v text, unique (v));
|
|
402
|
+
insert into sem9 values (1, '{"a":1}'), (2, '{ "a" : 1 }');
|
|
403
|
+
-- run
|
|
404
|
+
|
|
405
|
+
alter table sem9 alter column v set data type json;
|
|
406
|
+
-- error: UNIQUE constraint failed
|
|
407
|
+
|
|
408
|
+
select id, v from sem9 order by id;
|
|
409
|
+
→ [{"id":1,"v":"{\"a\":1}"},{"id":2,"v":"{ \"a\" : 1 }"}]
|
|
410
|
+
|
|
411
|
+
drop table sem9;
|
|
412
|
+
|
|
413
|
+
-- 9b. …the accepted case: distinct documents, so the retype lands and the index enforces
|
|
414
|
+
-- uniqueness by structure rather than by spelling. The retyped column must answer exactly as
|
|
415
|
+
-- a column declared `json` from the start does — which is what 9c pins.
|
|
416
|
+
create table sem9b (id integer primary key, v text, unique (v));
|
|
417
|
+
insert into sem9b values (1, '{"a":1}'), (2, '{"b":2}');
|
|
418
|
+
-- run
|
|
419
|
+
|
|
420
|
+
alter table sem9b alter column v set data type json;
|
|
421
|
+
-- run
|
|
422
|
+
|
|
423
|
+
insert into sem9b values (3, '{ "b":2 }');
|
|
424
|
+
-- error: UNIQUE constraint failed
|
|
425
|
+
|
|
426
|
+
-- A differently-spaced document is one document to the INDEX and to `=` alike: the text
|
|
427
|
+
-- operand is coerced to JSON at plan time, so equality compares structure. See
|
|
428
|
+
-- 06.9.2-json-structural-equality.sqllogic for the full contract.
|
|
429
|
+
select id from sem9b where v = '{ "a" : 1 }';
|
|
430
|
+
→ [{"id":1}]
|
|
431
|
+
|
|
432
|
+
drop table sem9b;
|
|
433
|
+
|
|
434
|
+
-- 9c. …and the natively-declared column the retyped one has to match, spelling for spelling.
|
|
435
|
+
create table sem9c (id integer primary key, v json, unique (v));
|
|
436
|
+
insert into sem9c values (1, '{"a":1}'), (2, '{"b":2}');
|
|
437
|
+
-- run
|
|
438
|
+
|
|
439
|
+
insert into sem9c values (3, '{ "b":2 }');
|
|
440
|
+
-- error: UNIQUE constraint failed
|
|
441
|
+
|
|
442
|
+
select id from sem9c where v = '{ "a" : 1 }';
|
|
443
|
+
→ [{"id":1}]
|
|
444
|
+
|
|
445
|
+
drop table sem9c;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
-- 41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic
|
|
2
|
+
--
|
|
3
|
+
-- requires-capability: standalone-index-ddl
|
|
4
|
+
--
|
|
5
|
+
-- Carved out of 41.7.4-alter-column-retype-semantic-memory. That file's subject is
|
|
6
|
+
-- retype semantics for same-storage-class types that carry their own comparison
|
|
7
|
+
-- (text <-> timespan / json / date): the change must re-sort and re-validate under the
|
|
8
|
+
-- NEW type's compare. It makes every one of those points through inline / table-level
|
|
9
|
+
-- `unique` or through a plain scan, so it needs no index DDL. Two things there genuinely
|
|
10
|
+
-- do: an index-DERIVED unique (a distinct enforcement path from a declared one), and a
|
|
11
|
+
-- NON-unique secondary index, which has no declarative spelling at all.
|
|
12
|
+
--
|
|
13
|
+
-- Subject: (1) an index-derived UNIQUE rejects a retype whose converted values collide,
|
|
14
|
+
-- changing nothing; (2) a non-unique secondary index over the retyped column is re-sorted,
|
|
15
|
+
-- so a lookup through it answers exactly as the unindexed table and the natively-declared
|
|
16
|
+
-- column do.
|
|
17
|
+
|
|
18
|
+
-- ===================================
|
|
19
|
+
-- 1. Colliding rows under an explicit `create unique index` → the ALTER is REJECTED, and
|
|
20
|
+
-- the rejection changes nothing: values, declared type and writability all survive.
|
|
21
|
+
-- ===================================
|
|
22
|
+
|
|
23
|
+
create table sem1 (id integer primary key, v text);
|
|
24
|
+
create unique index sem1_v on sem1 (v);
|
|
25
|
+
insert into sem1 values (1, 'PT1H'), (2, 'PT60M');
|
|
26
|
+
-- run
|
|
27
|
+
|
|
28
|
+
alter table sem1 alter column v set data type timespan;
|
|
29
|
+
-- error: UNIQUE constraint failed
|
|
30
|
+
|
|
31
|
+
-- the declared type is unchanged — a rejected ALTER must not leave a new type over
|
|
32
|
+
-- structures still keyed the old way
|
|
33
|
+
select name, type from table_info('sem1') where name = 'v';
|
|
34
|
+
→ [{"name":"v","type":"TEXT"}]
|
|
35
|
+
|
|
36
|
+
select id, v from sem1 order by id;
|
|
37
|
+
→ [{"id":1,"v":"PT1H"},{"id":2,"v":"PT60M"}]
|
|
38
|
+
|
|
39
|
+
-- still writable, and the index still enforces TEXTUAL uniqueness under the unchanged type,
|
|
40
|
+
-- so a third spelling of the same duration is accepted
|
|
41
|
+
insert into sem1 values (3, 'PT3600S');
|
|
42
|
+
select count(*) as n from sem1;
|
|
43
|
+
→ [{"n":3}]
|
|
44
|
+
|
|
45
|
+
insert into sem1 values (4, 'PT1H');
|
|
46
|
+
-- error: UNIQUE constraint failed
|
|
47
|
+
|
|
48
|
+
drop table sem1;
|
|
49
|
+
|
|
50
|
+
-- ===================================
|
|
51
|
+
-- 4. Non-unique index: no uniqueness to violate, but the index still has to be re-sorted or
|
|
52
|
+
-- the lookup misses rows. The answer must match the same table with NO index, and the
|
|
53
|
+
-- same table declared TIMESPAN from the start.
|
|
54
|
+
-- ===================================
|
|
55
|
+
|
|
56
|
+
create table sem4 (id integer primary key, v text);
|
|
57
|
+
create index sem4_v on sem4 (v);
|
|
58
|
+
insert into sem4 values (1, 'PT1H'), (2, 'PT60M'), (3, 'PT2H');
|
|
59
|
+
-- run
|
|
60
|
+
|
|
61
|
+
alter table sem4 alter column v set data type timespan;
|
|
62
|
+
-- run
|
|
63
|
+
|
|
64
|
+
select id from sem4 where v = 'PT3600S' order by id;
|
|
65
|
+
→ [{"id":1},{"id":2}]
|
|
66
|
+
|
|
67
|
+
drop table sem4;
|
|
68
|
+
|
|
69
|
+
-- 4b. …the identical table with no index at all
|
|
70
|
+
create table sem4b (id integer primary key, v text);
|
|
71
|
+
insert into sem4b values (1, 'PT1H'), (2, 'PT60M'), (3, 'PT2H');
|
|
72
|
+
-- run
|
|
73
|
+
|
|
74
|
+
alter table sem4b alter column v set data type timespan;
|
|
75
|
+
-- run
|
|
76
|
+
|
|
77
|
+
select id from sem4b where v = 'PT3600S' order by id;
|
|
78
|
+
→ [{"id":1},{"id":2}]
|
|
79
|
+
|
|
80
|
+
drop table sem4b;
|
|
81
|
+
|
|
82
|
+
-- 4c. …and the same rows under a natively-declared TIMESPAN column
|
|
83
|
+
create table sem4c (id integer primary key, v timespan);
|
|
84
|
+
create index sem4c_v on sem4c (v);
|
|
85
|
+
insert into sem4c values (1, 'PT1H'), (2, 'PT60M'), (3, 'PT2H');
|
|
86
|
+
-- run
|
|
87
|
+
|
|
88
|
+
select id from sem4c where v = 'PT3600S' order by id;
|
|
89
|
+
→ [{"id":1},{"id":2}]
|
|
90
|
+
|
|
91
|
+
drop table sem4c;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
-- ALTER COLUMN ... SET COLLATE on a PRIMARY KEY column, interleaved with rows the
|
|
2
|
+
-- transaction deleted, re-inserted, or staged at a case-variant key.
|
|
3
|
+
--
|
|
4
|
+
-- Cross-module: both backends ask the same two questions before mutating anything
|
|
5
|
+
-- (memory: MemoryTableManager.validateRekeyedPrimaryKey; store:
|
|
6
|
+
-- StoreTable.validateRekeyedPrimaryKey) — a collision the transaction can SEE is
|
|
7
|
+
-- CONSTRAINT, a collision confined to rows only a rollback could restore is BUSY, and
|
|
8
|
+
-- either refusal leaves the transaction usable. The PK declares `collate binary`
|
|
9
|
+
-- explicitly because the store defaults an undecorated text PK to NOCASE (see
|
|
10
|
+
-- 10.2.2-default-collation-memory.sqllogic), which would make the case-variant pairs
|
|
11
|
+
-- collide at INSERT before any ALTER runs. The isolation layer's own coverage of these
|
|
12
|
+
-- sequences lives in packages/quereus-isolation/test/isolation-layer.spec.ts
|
|
13
|
+
-- ("collapses overlay deletion markers").
|
|
14
|
+
|
|
15
|
+
-- ===================================
|
|
16
|
+
-- 1. Delete a row, re-insert a case-variant replacement, then re-key: the deleted row
|
|
17
|
+
-- must not block the change, and the replacement survives the commit.
|
|
18
|
+
-- ===================================
|
|
19
|
+
|
|
20
|
+
create table t_rk (k text collate binary primary key, v text);
|
|
21
|
+
insert into t_rk values ('A', 'x');
|
|
22
|
+
|
|
23
|
+
begin;
|
|
24
|
+
delete from t_rk where k = 'A';
|
|
25
|
+
insert into t_rk values ('a', 'y');
|
|
26
|
+
alter table t_rk alter column k set collate nocase;
|
|
27
|
+
commit;
|
|
28
|
+
|
|
29
|
+
select k, v from t_rk;
|
|
30
|
+
→ [{"k":"a","v":"y"}]
|
|
31
|
+
|
|
32
|
+
drop table t_rk;
|
|
33
|
+
|
|
34
|
+
-- ===================================
|
|
35
|
+
-- 2. Rows inserted AND deleted inside one transaction leave the case-colliding pair in the
|
|
36
|
+
-- transaction's history; the re-key's conservative representability check refuses it as
|
|
37
|
+
-- retryable (BUSY), the transaction's own work still commits, and the retry succeeds.
|
|
38
|
+
-- ===================================
|
|
39
|
+
|
|
40
|
+
create table t_rk2 (k text collate binary primary key, v text);
|
|
41
|
+
-- run
|
|
42
|
+
|
|
43
|
+
begin;
|
|
44
|
+
insert into t_rk2 values ('A', 'x'), ('a', 'y');
|
|
45
|
+
delete from t_rk2 where k in ('A', 'a');
|
|
46
|
+
-- run
|
|
47
|
+
|
|
48
|
+
alter table t_rk2 alter column k set collate nocase;
|
|
49
|
+
-- error: still collide under the new key definition
|
|
50
|
+
|
|
51
|
+
commit;
|
|
52
|
+
select count(*) as n from t_rk2;
|
|
53
|
+
→ [{"n":0}]
|
|
54
|
+
|
|
55
|
+
alter table t_rk2 alter column k set collate nocase;
|
|
56
|
+
select name, collation from table_info('t_rk2') order by cid;
|
|
57
|
+
→ [{"name":"k","collation":"NOCASE"},{"name":"v","collation":"BINARY"}]
|
|
58
|
+
|
|
59
|
+
drop table t_rk2;
|
|
60
|
+
|
|
61
|
+
-- ===================================
|
|
62
|
+
-- 3. A staged row colliding with a COMMITTED row under the new collation is a duplicate
|
|
63
|
+
-- this transaction's own select would return: the change is invalid (CONSTRAINT), and
|
|
64
|
+
-- the refusal leaves the transaction untouched and usable.
|
|
65
|
+
-- ===================================
|
|
66
|
+
|
|
67
|
+
create table t_rk3 (k text collate binary primary key, v text);
|
|
68
|
+
insert into t_rk3 values ('A', 'x');
|
|
69
|
+
-- run
|
|
70
|
+
|
|
71
|
+
begin;
|
|
72
|
+
insert into t_rk3 values ('a', 'y');
|
|
73
|
+
-- run
|
|
74
|
+
|
|
75
|
+
alter table t_rk3 alter column k set collate nocase;
|
|
76
|
+
-- error: collides under the new key definition
|
|
77
|
+
|
|
78
|
+
rollback;
|
|
79
|
+
select k, v from t_rk3;
|
|
80
|
+
→ [{"k":"A","v":"x"}]
|
|
81
|
+
|
|
82
|
+
drop table t_rk3;
|
|
83
|
+
|
|
84
|
+
-- ===================================
|
|
85
|
+
-- 4. A committed collider DELETED in this transaction is invisible to the transaction's
|
|
86
|
+
-- view but must survive a rollback, and a re-keyed structure cannot hold the pair:
|
|
87
|
+
-- refused as retryable (BUSY), transaction still usable, retry after commit succeeds.
|
|
88
|
+
-- ===================================
|
|
89
|
+
|
|
90
|
+
create table t_rk4 (k text collate binary primary key, v text);
|
|
91
|
+
insert into t_rk4 values ('A', 'x'), ('a', 'y');
|
|
92
|
+
-- run
|
|
93
|
+
|
|
94
|
+
begin;
|
|
95
|
+
delete from t_rk4 where k = 'a';
|
|
96
|
+
-- run
|
|
97
|
+
|
|
98
|
+
alter table t_rk4 alter column k set collate nocase;
|
|
99
|
+
-- error: still collide under the new key definition
|
|
100
|
+
|
|
101
|
+
commit;
|
|
102
|
+
alter table t_rk4 alter column k set collate nocase;
|
|
103
|
+
select k, v from t_rk4;
|
|
104
|
+
→ [{"k":"A","v":"x"}]
|
|
105
|
+
|
|
106
|
+
drop table t_rk4;
|