@quereus/quereus 4.20.1 → 4.20.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/package.json +7 -4
- package/test/README.md +173 -0
- package/test/logic/01-basic.sqllogic +39 -0
- package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
- package/test/logic/01.2-strings.sqllogic +43 -0
- package/test/logic/01.5-insert-select.sqllogic +237 -0
- package/test/logic/01.6-update-extras.sqllogic +118 -0
- package/test/logic/01.7-update-from.sqllogic +67 -0
- package/test/logic/01.8-delete-extras.sqllogic +122 -0
- package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
- package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
- package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
- package/test/logic/01.9-query-expr-values.sqllogic +111 -0
- package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
- package/test/logic/02-filters.sqllogic +54 -0
- package/test/logic/02-smoke.sqllogic +62 -0
- package/test/logic/02.1-bind-parameters.sqllogic +223 -0
- package/test/logic/03-expressions.sqllogic +190 -0
- package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
- package/test/logic/03.4-defaults.sqllogic +554 -0
- package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
- package/test/logic/03.5-tvf.sqllogic +61 -0
- package/test/logic/03.6-type-system.sqllogic +544 -0
- package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
- package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
- package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
- package/test/logic/03.8-not-precedence.sqllogic +255 -0
- package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
- package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
- package/test/logic/04-order-by.sqllogic +38 -0
- package/test/logic/04-transactions.sqllogic +239 -0
- package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
- package/test/logic/05-vtab_memory.sqllogic +50 -0
- package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
- package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
- package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
- package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
- package/test/logic/06-builtin_functions.sqllogic +149 -0
- package/test/logic/06.1-string-functions.sqllogic +92 -0
- package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
- package/test/logic/06.2-math-functions.sqllogic +82 -0
- package/test/logic/06.3-schema.sqllogic +48 -0
- package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
- package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
- package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
- package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
- package/test/logic/06.3.4-view-info.sqllogic +378 -0
- package/test/logic/06.3.5-column-info.sqllogic +347 -0
- package/test/logic/06.3.6-schema-views.sqllogic +29 -0
- package/test/logic/06.4-schema-search-path.sqllogic +354 -0
- package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
- package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
- package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
- package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
- package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
- package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
- package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
- package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
- package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
- package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
- package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
- package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
- package/test/logic/06.7-json-extended.sqllogic +53 -0
- package/test/logic/06.8-json-path-operators.sqllogic +99 -0
- package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
- package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
- package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
- package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
- package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
- package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
- package/test/logic/07-aggregates.sqllogic +193 -0
- package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
- package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
- package/test/logic/07.3-group-by-extras.sqllogic +602 -0
- package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
- package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
- package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
- package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
- package/test/logic/07.5-window.sqllogic +1941 -0
- package/test/logic/07.5.1-window-named.sqllogic +13 -0
- package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
- package/test/logic/07.6-subqueries.sqllogic +78 -0
- package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
- package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
- package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
- package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
- package/test/logic/07.7.1-in-extras.sqllogic +158 -0
- package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
- package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
- package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
- package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
- package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
- package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
- package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
- package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
- package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
- package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
- package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
- package/test/logic/07.9-in-value-list.sqllogic +154 -0
- package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
- package/test/logic/08-views.sqllogic +64 -0
- package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
- package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
- package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
- package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
- package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
- package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
- package/test/logic/09-set_operations.sqllogic +244 -0
- package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
- package/test/logic/10-distinct_datatypes.sqllogic +127 -0
- package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
- package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
- package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
- package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
- package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
- package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
- package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
- package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
- package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
- package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
- package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
- package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
- package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
- package/test/logic/10.2-column-features.sqllogic +365 -0
- package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
- package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
- package/test/logic/10.3-function-features.sqllogic +247 -0
- package/test/logic/10.4-schema-scale.sqllogic +168 -0
- package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
- package/test/logic/10.5-indexes.sqllogic +164 -0
- package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
- package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
- package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
- package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
- package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
- package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
- package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
- package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
- package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
- package/test/logic/100.1-where-extras.sqllogic +163 -0
- package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
- package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
- package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
- package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
- package/test/logic/102-unique-constraints.sqllogic +145 -0
- package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
- package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
- package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
- package/test/logic/102.2-unique-collation.sqllogic +181 -0
- package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
- package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
- package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
- package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
- package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
- package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
- package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
- package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
- package/test/logic/108-cardinality-estimation.sqllogic +146 -0
- package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
- package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
- package/test/logic/11-joins.sqllogic +86 -0
- package/test/logic/11.1-join-using.sqllogic +267 -0
- package/test/logic/11.2-comma-join.sqllogic +35 -0
- package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
- package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
- package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
- package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
- package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
- package/test/logic/12-empty-primary-key.sqllogic +124 -0
- package/test/logic/12-join_padding_order.sqllogic +58 -0
- package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
- package/test/logic/13-cte.sqllogic +137 -0
- package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
- package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
- package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
- package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
- package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
- package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
- package/test/logic/13.4-cte-extras.sqllogic +98 -0
- package/test/logic/13.5-cte-join-order.sqllogic +166 -0
- package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
- package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
- package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
- package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
- package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
- package/test/logic/14-utilities.sqllogic +168 -0
- package/test/logic/15-timespan.sqllogic +279 -0
- package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
- package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
- package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
- package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
- package/test/logic/16-epoch.sqllogic +187 -0
- package/test/logic/17-weekday-modifier.sqllogic +78 -0
- package/test/logic/18-json-string-escapes.sqllogic +86 -0
- package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
- package/test/logic/20-empty-single-row.sqllogic +261 -0
- package/test/logic/21-null-edge-cases.sqllogic +227 -0
- package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
- package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
- package/test/logic/21.2-between-edges.sqllogic +157 -0
- package/test/logic/22-boundary-values.sqllogic +175 -0
- package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
- package/test/logic/24-builtin-branches.sqllogic +611 -0
- package/test/logic/24.1-substr-extras.sqllogic +75 -0
- package/test/logic/24.2-random-extras.sqllogic +39 -0
- package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
- package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
- package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
- package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
- package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
- package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
- package/test/logic/26-join-edge-cases.sqllogic +333 -0
- package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
- package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
- package/test/logic/26.3-join-on-constants.sqllogic +61 -0
- package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
- package/test/logic/27-window-edge-cases.sqllogic +206 -0
- package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
- package/test/logic/27.2-window-exclude.sqllogic +13 -0
- package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
- package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
- package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
- package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
- package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
- package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
- package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
- package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
- package/test/logic/40-constraints.sqllogic +418 -0
- package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
- package/test/logic/40.2-check-extras.sqllogic +683 -0
- package/test/logic/41-alter-table.sqllogic +191 -0
- package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
- package/test/logic/41-fk-cross-schema.sqllogic +155 -0
- package/test/logic/41-fk-extended-targets.sqllogic +173 -0
- package/test/logic/41-foreign-keys.sqllogic +1001 -0
- package/test/logic/41-generated-column-errors.sqllogic +225 -0
- package/test/logic/41-generated-column-extras.sqllogic +598 -0
- package/test/logic/41-generated-column-scope.sqllogic +329 -0
- package/test/logic/41-generated-columns.sqllogic +361 -0
- package/test/logic/41.1-alter-pk.sqllogic +230 -0
- package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
- package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
- package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
- package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
- package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
- package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
- package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
- package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
- package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
- package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
- package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
- package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
- package/test/logic/41.2-alter-column.sqllogic +382 -0
- package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
- package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
- package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
- package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
- package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
- package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
- package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
- package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
- package/test/logic/41.5-alter-misc.sqllogic +48 -0
- package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
- package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
- package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
- package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
- package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
- package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
- package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
- package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
- package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
- package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
- package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
- package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
- package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
- package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
- package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
- package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
- package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
- package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
- package/test/logic/42-committed-snapshot.sqllogic +254 -0
- package/test/logic/42-returning.sqllogic +159 -0
- package/test/logic/42.1-returning-extras.sqllogic +232 -0
- package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
- package/test/logic/43-default-nullability.sqllogic +131 -0
- package/test/logic/43-transition-constraints.sqllogic +341 -0
- package/test/logic/43.1-default-collation.sqllogic +140 -0
- package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
- package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
- package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
- package/test/logic/44-determinism-validation.sqllogic +164 -0
- package/test/logic/44-orthogonality.sqllogic +146 -0
- package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
- package/test/logic/45-udf-determinism.sqllogic +39 -0
- package/test/logic/46-mutation-context.sqllogic +595 -0
- package/test/logic/47-upsert.sqllogic +255 -0
- package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
- package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
- package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
- package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
- package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
- package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
- package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
- package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
- package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
- package/test/logic/49-reference-graph.sqllogic +84 -0
- package/test/logic/50-declarative-schema.sqllogic +2550 -0
- package/test/logic/50-metadata-tags.sqllogic +1033 -0
- package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
- package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
- package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
- package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +173 -0
- package/test/logic/50.3-declare-schema-duplicate-names.sqllogic +280 -0
- package/test/logic/50.4-declare-schema-apply-restore.sqllogic +192 -0
- package/test/logic/51-lens-foundation.sqllogic +147 -0
- package/test/logic/51-materialized-views.sqllogic +376 -0
- package/test/logic/51.5-materialized-views-coarsened-key.sqllogic +198 -0
- package/test/logic/51.7-maintained-table-attach-detach.sqllogic +468 -0
- package/test/logic/51.8-maintained-table-declared-constraints.sqllogic +440 -0
- package/test/logic/51.85-maintained-table-parent-fk.sqllogic +103 -0
- package/test/logic/51.9-maintained-table-secondary-unique.sqllogic +237 -0
- package/test/logic/51.9.1-maintained-table-partial-unique.sqllogic +36 -0
- package/test/logic/52-lens-overrides.sqllogic +566 -0
- package/test/logic/53-materialized-views-rowtime.sqllogic +1601 -0
- package/test/logic/53-reserved-tags.sqllogic +252 -0
- package/test/logic/53.1-materialized-view-write-through.sqllogic +329 -0
- package/test/logic/53.2-materialized-view-rename-propagation.sqllogic +483 -0
- package/test/logic/53.3-materialized-view-constraint-only-ddl.sqllogic +409 -0
- package/test/logic/53.3.1-materialized-view-index-ddl-irrelevance.sqllogic +29 -0
- package/test/logic/53.4-materialized-view-structural-alter-restore.sqllogic +436 -0
- package/test/logic/54-covering-mv-enforcement.sqllogic +314 -0
- package/test/logic/54.1-covering-mv-partial-enforcement.sqllogic +34 -0
- package/test/logic/55-internal-eviction-reporting.sqllogic +89 -0
- package/test/logic/55-lens-prover.sqllogic +202 -0
- package/test/logic/55.1-eviction-restrict-fk.sqllogic +148 -0
- package/test/logic/55.5-lens-authored-inverse.sqllogic +1468 -0
- package/test/logic/80-grow-retrieve-pass.sqllogic +79 -0
- package/test/logic/81-quickpick.sqllogic +24 -0
- package/test/logic/82-bloom-join.sqllogic +185 -0
- package/test/logic/83-merge-join.sqllogic +280 -0
- package/test/logic/84-asof-scan.sqllogic +238 -0
- package/test/logic/84-key-cardinality.sqllogic +50 -0
- package/test/logic/85-relational-const-folding.sqllogic +51 -0
- package/test/logic/86-scalar-cse.sqllogic +42 -0
- package/test/logic/90-error_paths.sqllogic +114 -0
- package/test/logic/90.1-parse-errors.sqllogic +77 -0
- package/test/logic/90.2-alter-table-errors.sqllogic +53 -0
- package/test/logic/90.2.1-alter-extra-errors.sqllogic +51 -0
- package/test/logic/90.3-expression-errors.sqllogic +43 -0
- package/test/logic/90.4-dml-errors.sqllogic +47 -0
- package/test/logic/90.5-unsupported-join-types.sqllogic +37 -0
- package/test/logic/90.5.1-right-full-join-read.sqllogic +157 -0
- package/test/logic/90.6-select-error-paths.sqllogic +57 -0
- package/test/logic/91-merge-join-edge-cases.sqllogic +159 -0
- package/test/logic/92-hash-aggregate-edge-cases.sqllogic +139 -0
- package/test/logic/93-ddl-view-edge-cases.sqllogic +104 -0
- package/test/logic/93.1-view-error-paths.sqllogic +74 -0
- package/test/logic/93.2-view-mutation-pending.sqllogic +108 -0
- package/test/logic/93.3-view-mutation-or-clause.sqllogic +60 -0
- package/test/logic/93.4-view-mutation.sqllogic +4881 -0
- package/test/logic/93.4.1-view-mutation-partial-unique-cardinality.sqllogic +31 -0
- package/test/logic/93.5-authored-inverse.sqllogic +415 -0
- package/test/logic/93.6-set-op-flagless-write.sqllogic +862 -0
- package/test/logic/94-tvf-edge-cases.sqllogic +58 -0
- package/test/logic/94.1-limit-offset-edge-cases.sqllogic +109 -0
- package/test/logic/94.2-limit-offset-extras.sqllogic +98 -0
- package/test/logic/95-assertions.sqllogic +1417 -0
- package/test/logic/96-subquery-edge-cases.sqllogic +276 -0
- package/test/logic/97-json-function-edge-cases.sqllogic +633 -0
- package/test/logic/97.1-json-blob-and-special-values.sqllogic +92 -0
- package/test/logic/98-temporal-edge-cases.sqllogic +515 -0
- package/test/logic/99-conversion-edge-cases.sqllogic +325 -0
- package/test/logic/99.0.1-schema-index-listing.sqllogic +21 -0
- package/test/logic/99.1-cast-syntax-extras.sqllogic +167 -0
- package/test/logic/drop-unique-index.sqllogic +88 -0
- package/test/logic/pushdown-test.sqllogic +36 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
-- ALTER TABLE ... ALTER PRIMARY KEY tests
|
|
2
|
+
|
|
3
|
+
-- ===================================
|
|
4
|
+
-- 1. Rekey on empty table
|
|
5
|
+
-- ===================================
|
|
6
|
+
|
|
7
|
+
create table t_rekey_empty (a integer primary key, b integer not null);
|
|
8
|
+
-- run
|
|
9
|
+
|
|
10
|
+
alter table t_rekey_empty alter primary key (b);
|
|
11
|
+
-- run
|
|
12
|
+
|
|
13
|
+
-- Verify new PK via table_info: b should be pk, a should not
|
|
14
|
+
select name, pk from table_info('t_rekey_empty') order by name;
|
|
15
|
+
→ [{"name": "a", "pk": 0}, {"name": "b", "pk": 1}]
|
|
16
|
+
|
|
17
|
+
-- Insert and verify the new key works
|
|
18
|
+
insert into t_rekey_empty values (1, 10), (2, 20);
|
|
19
|
+
-- run
|
|
20
|
+
|
|
21
|
+
select * from t_rekey_empty order by b;
|
|
22
|
+
→ [{"a": 1, "b": 10}, {"a": 2, "b": 20}]
|
|
23
|
+
|
|
24
|
+
drop table t_rekey_empty;
|
|
25
|
+
-- run
|
|
26
|
+
|
|
27
|
+
-- ===================================
|
|
28
|
+
-- 2. Rekey on populated table
|
|
29
|
+
-- ===================================
|
|
30
|
+
|
|
31
|
+
create table t_rekey_pop (id integer primary key, code integer not null, name text);
|
|
32
|
+
insert into t_rekey_pop values (1, 100, 'Alice'), (2, 200, 'Bob'), (3, 300, 'Charlie');
|
|
33
|
+
-- run
|
|
34
|
+
|
|
35
|
+
alter table t_rekey_pop alter primary key (code);
|
|
36
|
+
-- run
|
|
37
|
+
|
|
38
|
+
-- Row count should be preserved
|
|
39
|
+
select count(*) as cnt from t_rekey_pop;
|
|
40
|
+
→ [{"cnt": 3}]
|
|
41
|
+
|
|
42
|
+
-- Data should be intact
|
|
43
|
+
select * from t_rekey_pop order by code;
|
|
44
|
+
→ [{"id": 1, "code": 100, "name": "Alice"}, {"id": 2, "code": 200, "name": "Bob"}, {"id": 3, "code": 300, "name": "Charlie"}]
|
|
45
|
+
|
|
46
|
+
-- Verify PK changed
|
|
47
|
+
select name, pk from table_info('t_rekey_pop') where pk > 0;
|
|
48
|
+
→ [{"name": "code", "pk": 1}]
|
|
49
|
+
|
|
50
|
+
drop table t_rekey_pop;
|
|
51
|
+
-- run
|
|
52
|
+
|
|
53
|
+
-- ===================================
|
|
54
|
+
-- 3. Rekey that creates a duplicate-key violation
|
|
55
|
+
-- ===================================
|
|
56
|
+
|
|
57
|
+
create table t_rekey_dup (id integer primary key, category integer not null);
|
|
58
|
+
insert into t_rekey_dup values (1, 10), (2, 10), (3, 20);
|
|
59
|
+
-- run
|
|
60
|
+
|
|
61
|
+
-- Rekey to (category) — should fail because categories are not unique
|
|
62
|
+
alter table t_rekey_dup alter primary key (category);
|
|
63
|
+
-- error:
|
|
64
|
+
|
|
65
|
+
-- Table should be unchanged
|
|
66
|
+
select count(*) as cnt from t_rekey_dup;
|
|
67
|
+
→ [{"cnt": 3}]
|
|
68
|
+
|
|
69
|
+
-- PK should still be id
|
|
70
|
+
select name, pk from table_info('t_rekey_dup') where pk > 0;
|
|
71
|
+
→ [{"name": "id", "pk": 1}]
|
|
72
|
+
|
|
73
|
+
drop table t_rekey_dup;
|
|
74
|
+
-- run
|
|
75
|
+
|
|
76
|
+
-- ===================================
|
|
77
|
+
-- 4. Empty PK
|
|
78
|
+
-- ===================================
|
|
79
|
+
|
|
80
|
+
create table t_empty_pk (a integer not null, b text);
|
|
81
|
+
-- run
|
|
82
|
+
|
|
83
|
+
alter table t_empty_pk alter primary key ();
|
|
84
|
+
-- run
|
|
85
|
+
|
|
86
|
+
select count(*) as cnt from t_empty_pk;
|
|
87
|
+
→ [{"cnt": 0}]
|
|
88
|
+
|
|
89
|
+
drop table t_empty_pk;
|
|
90
|
+
-- run
|
|
91
|
+
|
|
92
|
+
-- ===================================
|
|
93
|
+
-- 5. Rekey ONTO a nullable column succeeds — key membership does not imply NOT NULL
|
|
94
|
+
-- (docs/schema.md § "Primary-key nullability"). The column keeps its declared
|
|
95
|
+
-- nullability and NULL participates in the new key as a self-equal value, so a
|
|
96
|
+
-- second NULL key is a duplicate. Full coverage in 43.3-nullable-primary-key § 11.
|
|
97
|
+
-- ===================================
|
|
98
|
+
|
|
99
|
+
create table t_rekey_null (id integer primary key, val integer null);
|
|
100
|
+
insert into t_rekey_null values (1, 10), (2, 20);
|
|
101
|
+
-- run
|
|
102
|
+
|
|
103
|
+
alter table t_rekey_null alter primary key (val);
|
|
104
|
+
-- run
|
|
105
|
+
|
|
106
|
+
select name, "notnull", pk from table_info('t_rekey_null') order by cid;
|
|
107
|
+
→ [{"name": "id", "notnull": 1, "pk": 0}, {"name": "val", "notnull": 0, "pk": 1}]
|
|
108
|
+
|
|
109
|
+
-- Existing rows survive the re-key and stay addressable under the new key.
|
|
110
|
+
select id from t_rekey_null where val = 20;
|
|
111
|
+
→ [{"id": 2}]
|
|
112
|
+
|
|
113
|
+
insert into t_rekey_null values (3, null);
|
|
114
|
+
-- run
|
|
115
|
+
|
|
116
|
+
insert into t_rekey_null values (4, null);
|
|
117
|
+
-- error: UNIQUE constraint failed
|
|
118
|
+
|
|
119
|
+
select count(*) as cnt from t_rekey_null;
|
|
120
|
+
→ [{"cnt": 3}]
|
|
121
|
+
|
|
122
|
+
drop table t_rekey_null;
|
|
123
|
+
-- run
|
|
124
|
+
|
|
125
|
+
-- ===================================
|
|
126
|
+
-- 6. Rekey with DESC direction
|
|
127
|
+
-- ===================================
|
|
128
|
+
|
|
129
|
+
create table t_rekey_dir (a integer primary key, b integer not null);
|
|
130
|
+
insert into t_rekey_dir values (1, 30), (2, 10), (3, 20);
|
|
131
|
+
-- run
|
|
132
|
+
|
|
133
|
+
alter table t_rekey_dir alter primary key (b desc);
|
|
134
|
+
-- run
|
|
135
|
+
|
|
136
|
+
select * from t_rekey_dir order by b desc;
|
|
137
|
+
→ [{"a": 1, "b": 30}, {"a": 3, "b": 20}, {"a": 2, "b": 10}]
|
|
138
|
+
|
|
139
|
+
drop table t_rekey_dir;
|
|
140
|
+
-- run
|
|
141
|
+
|
|
142
|
+
-- ===================================
|
|
143
|
+
-- 7. Composite PK rekey
|
|
144
|
+
-- ===================================
|
|
145
|
+
|
|
146
|
+
create table t_rekey_comp (id integer primary key, a integer not null, b integer not null);
|
|
147
|
+
insert into t_rekey_comp values (1, 10, 100), (2, 20, 200), (3, 10, 200);
|
|
148
|
+
-- run
|
|
149
|
+
|
|
150
|
+
alter table t_rekey_comp alter primary key (a, b);
|
|
151
|
+
-- run
|
|
152
|
+
|
|
153
|
+
select count(*) as cnt from t_rekey_comp;
|
|
154
|
+
→ [{"cnt": 3}]
|
|
155
|
+
|
|
156
|
+
-- Verify composite PK
|
|
157
|
+
select name, pk from table_info('t_rekey_comp') where pk > 0 order by name;
|
|
158
|
+
→ [{"name": "a", "pk": 1}, {"name": "b", "pk": 1}]
|
|
159
|
+
|
|
160
|
+
drop table t_rekey_comp;
|
|
161
|
+
-- run
|
|
162
|
+
|
|
163
|
+
-- ===================================
|
|
164
|
+
-- 8. Nonexistent column in PK should fail
|
|
165
|
+
-- ===================================
|
|
166
|
+
|
|
167
|
+
create table t_rekey_noexist (id integer primary key, val text);
|
|
168
|
+
-- run
|
|
169
|
+
|
|
170
|
+
alter table t_rekey_noexist alter primary key (nonexistent);
|
|
171
|
+
-- error: not found
|
|
172
|
+
|
|
173
|
+
drop table t_rekey_noexist;
|
|
174
|
+
-- run
|
|
175
|
+
|
|
176
|
+
-- ===================================
|
|
177
|
+
-- 9. Duplicate column in PK should fail
|
|
178
|
+
-- ===================================
|
|
179
|
+
|
|
180
|
+
create table t_rekey_dupcolpk (id integer primary key, val integer not null);
|
|
181
|
+
-- run
|
|
182
|
+
|
|
183
|
+
alter table t_rekey_dupcolpk alter primary key (val, val);
|
|
184
|
+
-- error: Duplicate
|
|
185
|
+
|
|
186
|
+
drop table t_rekey_dupcolpk;
|
|
187
|
+
-- run
|
|
188
|
+
|
|
189
|
+
-- ===================================
|
|
190
|
+
-- 10a. Rekey preserves nullable columns (regression)
|
|
191
|
+
-- ===================================
|
|
192
|
+
-- Regression test: a nullable non-PK column with a NULL value must survive
|
|
193
|
+
-- the rebuild. (The MemoryTable path copies ColumnSchema directly and was
|
|
194
|
+
-- never affected; the non-memory path — rebuildViaShadowTable — omitted
|
|
195
|
+
-- explicit nullability and silently recreated nullable columns as NOT NULL.
|
|
196
|
+
-- See runtime/shadow-ddl.spec.ts for the pure-DDL coverage.)
|
|
197
|
+
|
|
198
|
+
create table t_rekey_nullable (id integer primary key, note text null, rate real default 1.0);
|
|
199
|
+
insert into t_rekey_nullable (id, note) values (1, null), (2, 'hi');
|
|
200
|
+
-- run
|
|
201
|
+
|
|
202
|
+
alter table t_rekey_nullable alter primary key (id);
|
|
203
|
+
-- run
|
|
204
|
+
|
|
205
|
+
-- Row with NULL in nullable column must survive:
|
|
206
|
+
select id, note, rate from t_rekey_nullable order by id;
|
|
207
|
+
→ [{"id": 1, "note": null, "rate": 1.0}, {"id": 2, "note": "hi", "rate": 1.0}]
|
|
208
|
+
|
|
209
|
+
-- Nullability of the non-PK column must be preserved:
|
|
210
|
+
select name, "notnull" from table_info('t_rekey_nullable') where name = 'note';
|
|
211
|
+
→ [{"name": "note", "notnull": 0}]
|
|
212
|
+
|
|
213
|
+
drop table t_rekey_nullable;
|
|
214
|
+
-- run
|
|
215
|
+
|
|
216
|
+
-- ===================================
|
|
217
|
+
-- 11. Parser round-trip via stringifier
|
|
218
|
+
-- ===================================
|
|
219
|
+
|
|
220
|
+
create table t_roundtrip (x integer primary key, y integer not null, z integer not null);
|
|
221
|
+
-- run
|
|
222
|
+
|
|
223
|
+
alter table t_roundtrip alter primary key (y, z desc);
|
|
224
|
+
-- run
|
|
225
|
+
|
|
226
|
+
select count(*) as cnt from t_roundtrip;
|
|
227
|
+
→ [{"cnt": 0}]
|
|
228
|
+
|
|
229
|
+
drop table t_roundtrip;
|
|
230
|
+
-- run
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
-- 41.1 FOREIGN KEY collation-conflict detection at declaration time.
|
|
2
|
+
-- Ticket fk-collation-conflict-create-time-validation.
|
|
3
|
+
--
|
|
4
|
+
-- A FOREIGN KEY whose child column and parent key column declare same-rank
|
|
5
|
+
-- conflicting collations — the exact conflict the synthesized
|
|
6
|
+
-- `parent.k = NEW.ref` enforcement comparison raises at plan time — is rejected
|
|
7
|
+
-- at DECLARATION time (CREATE TABLE / ALTER ADD CONSTRAINT / ALTER ADD COLUMN)
|
|
8
|
+
-- through the SAME comparison-collation lattice, instead of being deferred to
|
|
9
|
+
-- the first DML against the child. The check is UNCONDITIONAL: a contradictory
|
|
10
|
+
-- declaration is malformed whether or not `pragma foreign_keys` is on.
|
|
11
|
+
--
|
|
12
|
+
-- Runs under both memory and store. The store cases pin the reconcile edge: an
|
|
13
|
+
-- implicit-default text PK reconciles to the store's NOCASE without marking the
|
|
14
|
+
-- column explicit (rank 1), so it must NOT falsely conflict with a defaulted or
|
|
15
|
+
-- declared child column.
|
|
16
|
+
|
|
17
|
+
-- =============================================================================
|
|
18
|
+
-- 1. CREATE TABLE conflict is UNCONDITIONAL: declared NOCASE child vs declared
|
|
19
|
+
-- RTRIM parent PK is rejected at CREATE even with foreign_keys OFF.
|
|
20
|
+
-- =============================================================================
|
|
21
|
+
|
|
22
|
+
pragma foreign_keys = false;
|
|
23
|
+
|
|
24
|
+
create table p_rt (k text collate rtrim primary key);
|
|
25
|
+
create table c_nc (id integer primary key, ref text collate nocase references p_rt(k));
|
|
26
|
+
-- error: conflicting collations
|
|
27
|
+
-- c_nc was never created; only the parent exists.
|
|
28
|
+
drop table p_rt;
|
|
29
|
+
|
|
30
|
+
-- =============================================================================
|
|
31
|
+
-- 2. Declared BINARY (rank 2) vs declared NOCASE (rank 2) → conflict. A declared
|
|
32
|
+
-- `collate binary` is a real preference, not the absence of one.
|
|
33
|
+
-- =============================================================================
|
|
34
|
+
|
|
35
|
+
create table p_bin (k text collate binary primary key);
|
|
36
|
+
create table c_db (id integer primary key, ref text collate nocase references p_bin(k));
|
|
37
|
+
-- error: conflicting collations
|
|
38
|
+
drop table p_bin;
|
|
39
|
+
|
|
40
|
+
-- =============================================================================
|
|
41
|
+
-- 3. Matching declared collations resolve — no conflict; the FK is live.
|
|
42
|
+
-- =============================================================================
|
|
43
|
+
|
|
44
|
+
pragma foreign_keys = true;
|
|
45
|
+
|
|
46
|
+
create table p_nc (k text collate nocase primary key);
|
|
47
|
+
create table c_nc2 (id integer primary key, ref text collate nocase references p_nc(k));
|
|
48
|
+
insert into p_nc values ('ABC');
|
|
49
|
+
-- case-variant child satisfied under the shared NOCASE collation.
|
|
50
|
+
insert into c_nc2 values (1, 'abc');
|
|
51
|
+
select count(*) as cnt from c_nc2;
|
|
52
|
+
→ [{"cnt":1}]
|
|
53
|
+
-- a value with no case-folded parent is still rejected (FK enforced).
|
|
54
|
+
insert into c_nc2 values (2, 'nope');
|
|
55
|
+
-- error:
|
|
56
|
+
drop table c_nc2;
|
|
57
|
+
drop table p_nc;
|
|
58
|
+
|
|
59
|
+
-- =============================================================================
|
|
60
|
+
-- 4. One-sided declaration → no conflict. A declared NOCASE child vs an
|
|
61
|
+
-- implicit-default parent PK: the parent contributes the engine floor
|
|
62
|
+
-- (rank 1 — BINARY on memory, reconciled NOCASE on store), so the declared
|
|
63
|
+
-- NOCASE wins and resolves. Both backends create cleanly.
|
|
64
|
+
-- =============================================================================
|
|
65
|
+
|
|
66
|
+
create table os_parent (k text primary key);
|
|
67
|
+
create table os_child (id integer primary key, ref text collate nocase references os_parent(k));
|
|
68
|
+
insert into os_parent values ('ABC');
|
|
69
|
+
insert into os_child values (1, 'abc');
|
|
70
|
+
select count(*) as cnt from os_child;
|
|
71
|
+
→ [{"cnt":1}]
|
|
72
|
+
drop table os_child;
|
|
73
|
+
drop table os_parent;
|
|
74
|
+
|
|
75
|
+
-- =============================================================================
|
|
76
|
+
-- 5. Store reconcile edge: an implicit-default text PK (reconciled to NOCASE,
|
|
77
|
+
-- rank 1, on store) must NOT falsely conflict with a DEFAULTED child column.
|
|
78
|
+
-- On memory both sides are rank-1 BINARY; on store the parent is rank-1
|
|
79
|
+
-- NOCASE and the child rank-1 BINARY — neither is a same-rank declared
|
|
80
|
+
-- conflict, so CREATE succeeds on both.
|
|
81
|
+
-- =============================================================================
|
|
82
|
+
|
|
83
|
+
create table ri_parent (k text primary key);
|
|
84
|
+
create table ri_child (id integer primary key, ref text references ri_parent(k));
|
|
85
|
+
insert into ri_parent values ('x');
|
|
86
|
+
insert into ri_child values (1, 'x');
|
|
87
|
+
select count(*) as cnt from ri_child;
|
|
88
|
+
→ [{"cnt":1}]
|
|
89
|
+
drop table ri_child;
|
|
90
|
+
drop table ri_parent;
|
|
91
|
+
|
|
92
|
+
-- =============================================================================
|
|
93
|
+
-- 6. Self-referencing FK: a child column referencing a PK column on the SAME
|
|
94
|
+
-- table with a divergent declared collation is rejected at CREATE (the
|
|
95
|
+
-- validator resolves the parent against the table being declared, before it
|
|
96
|
+
-- is registered in the catalog).
|
|
97
|
+
-- =============================================================================
|
|
98
|
+
|
|
99
|
+
create table self_fk (
|
|
100
|
+
code text collate nocase primary key,
|
|
101
|
+
parent_code text collate rtrim references self_fk(code)
|
|
102
|
+
);
|
|
103
|
+
-- error: conflicting collations
|
|
104
|
+
|
|
105
|
+
-- =============================================================================
|
|
106
|
+
-- 7. Multi-column FK: a conflict on ANY one pair rejects, even when the other
|
|
107
|
+
-- pairs agree.
|
|
108
|
+
-- =============================================================================
|
|
109
|
+
|
|
110
|
+
create table mp_parent (
|
|
111
|
+
a text collate nocase,
|
|
112
|
+
b text collate nocase,
|
|
113
|
+
primary key (a, b)
|
|
114
|
+
);
|
|
115
|
+
create table mp_child (
|
|
116
|
+
id integer primary key,
|
|
117
|
+
fa text collate nocase,
|
|
118
|
+
fb text collate rtrim,
|
|
119
|
+
foreign key (fa, fb) references mp_parent(a, b)
|
|
120
|
+
);
|
|
121
|
+
-- error: conflicting collations
|
|
122
|
+
drop table mp_parent;
|
|
123
|
+
|
|
124
|
+
-- =============================================================================
|
|
125
|
+
-- 8. ALTER TABLE ADD CONSTRAINT: a conflicting FK added after the fact is
|
|
126
|
+
-- rejected at ALTER time. The collation check now runs as a PRE-validation,
|
|
127
|
+
-- BEFORE module.alterTable, so it is the single, authoritative rejection
|
|
128
|
+
-- point — before any module persistence side effect (on the store backend
|
|
129
|
+
-- alterTable's addConstraint arm saveTableDDL's the FK before returning, so a
|
|
130
|
+
-- post-call throw would leave the rejected FK on disk; see the store-reopen
|
|
131
|
+
-- spec fk-collation-conflict-reopen.spec.ts). The `foreign_keys` pragma is no
|
|
132
|
+
-- longer load-bearing for THIS rejection — it fires whether enforcement is on
|
|
133
|
+
-- or off — but we keep OFF here so the assertion isolates the pure
|
|
134
|
+
-- declaration-time check from the module's enforcement-time existing-row scan.
|
|
135
|
+
-- =============================================================================
|
|
136
|
+
|
|
137
|
+
pragma foreign_keys = false;
|
|
138
|
+
|
|
139
|
+
create table acp (k text collate rtrim primary key);
|
|
140
|
+
create table acc (id integer primary key, ref text collate nocase);
|
|
141
|
+
alter table acc add constraint fk_acc foreign key (ref) references acp(k);
|
|
142
|
+
-- error: conflicting collations
|
|
143
|
+
drop table acc;
|
|
144
|
+
drop table acp;
|
|
145
|
+
|
|
146
|
+
-- =============================================================================
|
|
147
|
+
-- 8.1. ALTER TABLE ADD CONSTRAINT, matching collations: a text FK whose child
|
|
148
|
+
-- and parent declare the SAME collation is NOT falsely rejected — the
|
|
149
|
+
-- validator only fires on a same-rank conflict. Proves the ALTER-time
|
|
150
|
+
-- check leaves valid declarations alone (regression guard for the
|
|
151
|
+
-- reference-based new-FK selection) and the added FK is live/enforced.
|
|
152
|
+
-- =============================================================================
|
|
153
|
+
|
|
154
|
+
pragma foreign_keys = true;
|
|
155
|
+
|
|
156
|
+
create table acp_ok (k text collate nocase primary key);
|
|
157
|
+
create table acc_ok (id integer primary key, ref text collate nocase);
|
|
158
|
+
alter table acc_ok add constraint fk_ok foreign key (ref) references acp_ok(k);
|
|
159
|
+
insert into acp_ok values ('ABC');
|
|
160
|
+
-- case-variant child satisfied under the shared NOCASE collation (FK enforced).
|
|
161
|
+
insert into acc_ok values (1, 'abc');
|
|
162
|
+
select count(*) as cnt from acc_ok;
|
|
163
|
+
→ [{"cnt":1}]
|
|
164
|
+
-- a value with no case-folded parent is still rejected.
|
|
165
|
+
insert into acc_ok values (2, 'nope');
|
|
166
|
+
-- error:
|
|
167
|
+
drop table acc_ok;
|
|
168
|
+
drop table acp_ok;
|
|
169
|
+
|
|
170
|
+
-- =============================================================================
|
|
171
|
+
-- 8.2. ALTER TABLE ADD CONSTRAINT with foreign_keys ON: the conflict is caught
|
|
172
|
+
-- by the declaration-time PRE-validation (which runs BEFORE the module's
|
|
173
|
+
-- existing-row scan), so it surfaces as `conflicting collations` regardless
|
|
174
|
+
-- of the pragma state — NOT the enforcement-seam `ambiguous collation`
|
|
175
|
+
-- error the FK-ON existing-row query plan would otherwise raise. Locks the
|
|
176
|
+
-- cross-pragma message consistency the prevalidation reorder introduced
|
|
177
|
+
-- (§ 8 already pins the FK-OFF message). Empty child, so the existing-row
|
|
178
|
+
-- scan finds no orphan — the collation pre-check is the rejecting mechanism.
|
|
179
|
+
-- =============================================================================
|
|
180
|
+
|
|
181
|
+
pragma foreign_keys = true;
|
|
182
|
+
|
|
183
|
+
create table acp_on (k text collate rtrim primary key);
|
|
184
|
+
create table acc_on (id integer primary key, ref text collate nocase);
|
|
185
|
+
alter table acc_on add constraint fk_on foreign key (ref) references acp_on(k);
|
|
186
|
+
-- error: conflicting collations
|
|
187
|
+
drop table acc_on;
|
|
188
|
+
drop table acp_on;
|
|
189
|
+
|
|
190
|
+
-- =============================================================================
|
|
191
|
+
-- 8.3. Self-referencing ADD CONSTRAINT FK: a conflict against the SAME table's
|
|
192
|
+
-- PK column is rejected at ALTER time (the validator resolves the parent
|
|
193
|
+
-- against the already-registered table). Mirrors § 6 on the ADD CONSTRAINT
|
|
194
|
+
-- path, where the table — unlike at CREATE — is already in the catalog.
|
|
195
|
+
-- =============================================================================
|
|
196
|
+
|
|
197
|
+
create table self_ac (
|
|
198
|
+
code text collate nocase primary key,
|
|
199
|
+
parent_code text collate rtrim
|
|
200
|
+
);
|
|
201
|
+
alter table self_ac add constraint fk_self foreign key (parent_code) references self_ac(code);
|
|
202
|
+
-- error: conflicting collations
|
|
203
|
+
drop table self_ac;
|
|
204
|
+
|
|
205
|
+
-- =============================================================================
|
|
206
|
+
-- 8.4. Multi-column ADD CONSTRAINT FK: a conflict on ANY one pair rejects, even
|
|
207
|
+
-- when the other pairs agree. Mirrors § 7 on the ADD CONSTRAINT path.
|
|
208
|
+
-- =============================================================================
|
|
209
|
+
|
|
210
|
+
create table mpa_parent (
|
|
211
|
+
a text collate nocase,
|
|
212
|
+
b text collate nocase,
|
|
213
|
+
primary key (a, b)
|
|
214
|
+
);
|
|
215
|
+
create table mpa_child (
|
|
216
|
+
id integer primary key,
|
|
217
|
+
fa text collate nocase,
|
|
218
|
+
fb text collate rtrim
|
|
219
|
+
);
|
|
220
|
+
alter table mpa_child add constraint fk_multi foreign key (fa, fb) references mpa_parent(a, b);
|
|
221
|
+
-- error: conflicting collations
|
|
222
|
+
drop table mpa_child;
|
|
223
|
+
drop table mpa_parent;
|
|
224
|
+
|
|
225
|
+
pragma foreign_keys = false;
|
|
226
|
+
|
|
227
|
+
-- =============================================================================
|
|
228
|
+
-- 9. ALTER TABLE ADD COLUMN (column-level FK): a conflicting FK on the added
|
|
229
|
+
-- column is rejected, and the column is NOT added — the validate-before-swap
|
|
230
|
+
-- revert drops it, leaving the table untouched.
|
|
231
|
+
-- =============================================================================
|
|
232
|
+
|
|
233
|
+
create table alp (k text collate rtrim primary key);
|
|
234
|
+
create table alc (id integer primary key);
|
|
235
|
+
alter table alc add column ref text collate nocase references alp(k);
|
|
236
|
+
-- error: conflicting collations
|
|
237
|
+
-- The table is unchanged: only `id` remains (the rejected column was reverted).
|
|
238
|
+
insert into alc (id) values (1);
|
|
239
|
+
select * from alc;
|
|
240
|
+
→ [{"id":1}]
|
|
241
|
+
drop table alc;
|
|
242
|
+
drop table alp;
|
|
243
|
+
|
|
244
|
+
-- =============================================================================
|
|
245
|
+
-- 9.1. ALTER TABLE ADD COLUMN, matching collations: a column-level FK whose
|
|
246
|
+
-- added column matches the parent collation is NOT rejected — the column
|
|
247
|
+
-- IS added (the validate-before-swap region only reverts on a conflict).
|
|
248
|
+
-- =============================================================================
|
|
249
|
+
|
|
250
|
+
create table alp_ok (k text collate nocase primary key);
|
|
251
|
+
create table alc_ok (id integer primary key);
|
|
252
|
+
alter table alc_ok add column ref text collate nocase null references alp_ok(k);
|
|
253
|
+
-- The column was added: both `id` and `ref` are present.
|
|
254
|
+
insert into alc_ok (id, ref) values (1, null);
|
|
255
|
+
select * from alc_ok;
|
|
256
|
+
→ [{"id":1,"ref":null}]
|
|
257
|
+
drop table alc_ok;
|
|
258
|
+
drop table alp_ok;
|
|
259
|
+
|
|
260
|
+
-- =============================================================================
|
|
261
|
+
-- 10. Forward-declared parent residual: when the parent does not yet exist at
|
|
262
|
+
-- child-declare time, the validator cannot see the parent column types, so
|
|
263
|
+
-- the CREATE succeeds and the conflict remains caught at the first DML
|
|
264
|
+
-- (unchanged enforcement path). This is the one unavoidable residual.
|
|
265
|
+
-- =============================================================================
|
|
266
|
+
|
|
267
|
+
pragma foreign_keys = true;
|
|
268
|
+
|
|
269
|
+
create table fwd_child (id integer primary key, ref text collate nocase references fwd_parent(k));
|
|
270
|
+
create table fwd_parent (k text collate rtrim primary key);
|
|
271
|
+
insert into fwd_parent values ('a');
|
|
272
|
+
insert into fwd_child values (1, 'a');
|
|
273
|
+
-- error: ambiguous collation
|
|
274
|
+
drop table fwd_child;
|
|
275
|
+
drop table fwd_parent;
|
|
276
|
+
|
|
277
|
+
pragma foreign_keys = false;
|