@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,145 @@
|
|
|
1
|
+
-- Tests for non-PK UNIQUE constraint enforcement
|
|
2
|
+
|
|
3
|
+
-- === Basic UNIQUE column enforcement ===
|
|
4
|
+
|
|
5
|
+
CREATE TABLE t_uc (id INTEGER PRIMARY KEY, email TEXT UNIQUE, name TEXT);
|
|
6
|
+
INSERT INTO t_uc VALUES (1, 'alice@test.com', 'Alice');
|
|
7
|
+
INSERT INTO t_uc VALUES (2, 'bob@test.com', 'Bob');
|
|
8
|
+
-- run
|
|
9
|
+
|
|
10
|
+
SELECT * FROM t_uc ORDER BY id;
|
|
11
|
+
→ [{"id":1,"email":"alice@test.com","name":"Alice"},{"id":2,"email":"bob@test.com","name":"Bob"}]
|
|
12
|
+
|
|
13
|
+
-- Duplicate UNIQUE value should fail
|
|
14
|
+
INSERT INTO t_uc VALUES (3, 'alice@test.com', 'Eve');
|
|
15
|
+
-- error: UNIQUE constraint failed
|
|
16
|
+
|
|
17
|
+
-- Original data unchanged after failed insert
|
|
18
|
+
SELECT count(*) as cnt FROM t_uc;
|
|
19
|
+
→ [{"cnt":2}]
|
|
20
|
+
|
|
21
|
+
-- === INSERT OR IGNORE with UNIQUE violation ===
|
|
22
|
+
|
|
23
|
+
INSERT OR IGNORE INTO t_uc VALUES (4, 'alice@test.com', 'Ignored');
|
|
24
|
+
SELECT count(*) as cnt FROM t_uc;
|
|
25
|
+
→ [{"cnt":2}]
|
|
26
|
+
|
|
27
|
+
-- === INSERT OR REPLACE with UNIQUE violation ===
|
|
28
|
+
|
|
29
|
+
INSERT OR REPLACE INTO t_uc VALUES (5, 'alice@test.com', 'Replaced');
|
|
30
|
+
SELECT * FROM t_uc ORDER BY id;
|
|
31
|
+
→ [{"id":2,"email":"bob@test.com","name":"Bob"},{"id":5,"email":"alice@test.com","name":"Replaced"}]
|
|
32
|
+
|
|
33
|
+
-- The old row (id=1) with the conflicting email was deleted
|
|
34
|
+
SELECT count(*) as cnt FROM t_uc WHERE id = 1;
|
|
35
|
+
→ [{"cnt":0}]
|
|
36
|
+
|
|
37
|
+
DROP TABLE t_uc;
|
|
38
|
+
-- run
|
|
39
|
+
|
|
40
|
+
-- === NULL values in UNIQUE columns ===
|
|
41
|
+
|
|
42
|
+
CREATE TABLE t_uc_null (id INTEGER PRIMARY KEY, code TEXT NULL UNIQUE);
|
|
43
|
+
INSERT INTO t_uc_null VALUES (1, null);
|
|
44
|
+
INSERT INTO t_uc_null VALUES (2, null);
|
|
45
|
+
INSERT INTO t_uc_null VALUES (3, 'abc');
|
|
46
|
+
-- run
|
|
47
|
+
|
|
48
|
+
-- Multiple NULLs are allowed per SQL standard
|
|
49
|
+
SELECT count(*) as cnt FROM t_uc_null;
|
|
50
|
+
→ [{"cnt":3}]
|
|
51
|
+
|
|
52
|
+
-- But duplicate non-NULL values still fail
|
|
53
|
+
INSERT INTO t_uc_null VALUES (4, 'abc');
|
|
54
|
+
-- error: UNIQUE constraint failed
|
|
55
|
+
|
|
56
|
+
DROP TABLE t_uc_null;
|
|
57
|
+
-- run
|
|
58
|
+
|
|
59
|
+
-- === UPDATE changing UNIQUE column to conflicting value ===
|
|
60
|
+
|
|
61
|
+
CREATE TABLE t_uc_upd (id INTEGER PRIMARY KEY, tag TEXT UNIQUE, val INTEGER);
|
|
62
|
+
INSERT INTO t_uc_upd VALUES (1, 'alpha', 10);
|
|
63
|
+
INSERT INTO t_uc_upd VALUES (2, 'beta', 20);
|
|
64
|
+
-- run
|
|
65
|
+
|
|
66
|
+
-- Updating to a conflicting UNIQUE value should fail
|
|
67
|
+
UPDATE t_uc_upd SET tag = 'alpha' WHERE id = 2;
|
|
68
|
+
-- error: UNIQUE constraint failed
|
|
69
|
+
|
|
70
|
+
-- Data unchanged
|
|
71
|
+
SELECT * FROM t_uc_upd ORDER BY id;
|
|
72
|
+
→ [{"id":1,"tag":"alpha","val":10},{"id":2,"tag":"beta","val":20}]
|
|
73
|
+
|
|
74
|
+
-- Updating non-UNIQUE column is fine
|
|
75
|
+
UPDATE t_uc_upd SET val = 99 WHERE id = 2;
|
|
76
|
+
-- run
|
|
77
|
+
|
|
78
|
+
SELECT * FROM t_uc_upd ORDER BY id;
|
|
79
|
+
→ [{"id":1,"tag":"alpha","val":10},{"id":2,"tag":"beta","val":99}]
|
|
80
|
+
|
|
81
|
+
-- Updating UNIQUE column to its own value is fine (no conflict)
|
|
82
|
+
UPDATE t_uc_upd SET tag = 'beta' WHERE id = 2;
|
|
83
|
+
-- run
|
|
84
|
+
|
|
85
|
+
SELECT * FROM t_uc_upd ORDER BY id;
|
|
86
|
+
→ [{"id":1,"tag":"alpha","val":10},{"id":2,"tag":"beta","val":99}]
|
|
87
|
+
|
|
88
|
+
-- Updating UNIQUE column to a new value is fine
|
|
89
|
+
UPDATE t_uc_upd SET tag = 'gamma' WHERE id = 2;
|
|
90
|
+
-- run
|
|
91
|
+
|
|
92
|
+
SELECT * FROM t_uc_upd ORDER BY id;
|
|
93
|
+
→ [{"id":1,"tag":"alpha","val":10},{"id":2,"tag":"gamma","val":99}]
|
|
94
|
+
|
|
95
|
+
DROP TABLE t_uc_upd;
|
|
96
|
+
-- run
|
|
97
|
+
|
|
98
|
+
-- === Composite UNIQUE constraint ===
|
|
99
|
+
|
|
100
|
+
CREATE TABLE t_uc_comp (
|
|
101
|
+
id INTEGER PRIMARY KEY,
|
|
102
|
+
a TEXT,
|
|
103
|
+
b INTEGER,
|
|
104
|
+
UNIQUE (a, b)
|
|
105
|
+
);
|
|
106
|
+
INSERT INTO t_uc_comp VALUES (1, 'x', 1);
|
|
107
|
+
INSERT INTO t_uc_comp VALUES (2, 'x', 2);
|
|
108
|
+
INSERT INTO t_uc_comp VALUES (3, 'y', 1);
|
|
109
|
+
-- run
|
|
110
|
+
|
|
111
|
+
-- Same combination should fail
|
|
112
|
+
INSERT INTO t_uc_comp VALUES (4, 'x', 1);
|
|
113
|
+
-- error: UNIQUE constraint failed
|
|
114
|
+
|
|
115
|
+
-- Different combinations are fine
|
|
116
|
+
SELECT count(*) as cnt FROM t_uc_comp;
|
|
117
|
+
→ [{"cnt":3}]
|
|
118
|
+
|
|
119
|
+
DROP TABLE t_uc_comp;
|
|
120
|
+
-- run
|
|
121
|
+
|
|
122
|
+
-- === UNIQUE with PK-change UPDATE ===
|
|
123
|
+
|
|
124
|
+
CREATE TABLE t_uc_pkchg (id INTEGER PRIMARY KEY, code TEXT UNIQUE);
|
|
125
|
+
INSERT INTO t_uc_pkchg VALUES (1, 'aaa');
|
|
126
|
+
INSERT INTO t_uc_pkchg VALUES (2, 'bbb');
|
|
127
|
+
-- run
|
|
128
|
+
|
|
129
|
+
-- PK-change update that also conflicts on UNIQUE should fail
|
|
130
|
+
UPDATE t_uc_pkchg SET id = 3, code = 'aaa' WHERE id = 2;
|
|
131
|
+
-- error: UNIQUE constraint failed
|
|
132
|
+
|
|
133
|
+
-- Old row should be preserved after failed PK-change update
|
|
134
|
+
SELECT * FROM t_uc_pkchg ORDER BY id;
|
|
135
|
+
→ [{"id":1,"code":"aaa"},{"id":2,"code":"bbb"}]
|
|
136
|
+
|
|
137
|
+
-- PK-change update without UNIQUE conflict should succeed
|
|
138
|
+
UPDATE t_uc_pkchg SET id = 3, code = 'ccc' WHERE id = 2;
|
|
139
|
+
-- run
|
|
140
|
+
|
|
141
|
+
SELECT * FROM t_uc_pkchg ORDER BY id;
|
|
142
|
+
→ [{"id":1,"code":"aaa"},{"id":3,"code":"ccc"}]
|
|
143
|
+
|
|
144
|
+
DROP TABLE t_uc_pkchg;
|
|
145
|
+
-- run
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
-- 102.0.1-schema-catalog-indexed-table.sqllogic
|
|
2
|
+
--
|
|
3
|
+
-- requires-capability: standalone-index-ddl
|
|
4
|
+
--
|
|
5
|
+
-- Carved out of 102-schema-catalog-edge-cases: that file's DDL round-trips,
|
|
6
|
+
-- multi-schema search-path handling, table_info(), views, assertions and window
|
|
7
|
+
-- coverage need no index DDL. This one section round-trips a table that carries
|
|
8
|
+
-- secondary indexes, so it moves here rather than costing a backend without
|
|
9
|
+
-- first-class CREATE INDEX the whole catalog file.
|
|
10
|
+
--
|
|
11
|
+
-- Subject: a table created with two secondary indexes stays queryable through the
|
|
12
|
+
-- indexed columns, and both indexes drop cleanly.
|
|
13
|
+
|
|
14
|
+
-- ===================================
|
|
15
|
+
-- Table with indexes
|
|
16
|
+
-- ===================================
|
|
17
|
+
|
|
18
|
+
CREATE TABLE rt_indexed (id INTEGER PRIMARY KEY, name TEXT, category TEXT);
|
|
19
|
+
CREATE INDEX idx_name ON rt_indexed (name);
|
|
20
|
+
CREATE INDEX idx_cat ON rt_indexed (category);
|
|
21
|
+
INSERT INTO rt_indexed VALUES (1, 'Alice', 'A'), (2, 'Bob', 'B');
|
|
22
|
+
|
|
23
|
+
-- Verify indexes are used (data accessible via indexed columns)
|
|
24
|
+
SELECT id FROM rt_indexed WHERE name = 'Alice';
|
|
25
|
+
→ [{"id": 1}]
|
|
26
|
+
|
|
27
|
+
SELECT id FROM rt_indexed WHERE category = 'B';
|
|
28
|
+
→ [{"id": 2}]
|
|
29
|
+
|
|
30
|
+
DROP INDEX idx_name;
|
|
31
|
+
DROP INDEX idx_cat;
|
|
32
|
+
DROP TABLE rt_indexed;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
-- adapted from SQLite test/unique.test, test/unique2.test
|
|
2
|
+
-- UNIQUE constraint scenarios beyond 102-unique-constraints.sqllogic.
|
|
3
|
+
|
|
4
|
+
-- ===================================
|
|
5
|
+
-- 1. COLLATE with the LOWERCASE spelling `nocase` is NORMALIZED at DDL.
|
|
6
|
+
-- SQLite treats collation names case-insensitively; Quereus normalizes the
|
|
7
|
+
-- requested name to its canonical uppercase form in columnDefToSchema and
|
|
8
|
+
-- validates against TEXT_TYPE.supportedCollations = ['BINARY','NOCASE','RTRIM']
|
|
9
|
+
-- case-insensitively, so lowercase `nocase` is equivalent to `NOCASE`. A
|
|
10
|
+
-- `collate nocase unique` column is therefore accepted and enforces
|
|
11
|
+
-- case-insensitively (see unique-constraint-honors-column-collation /
|
|
12
|
+
-- 102.2-unique-collation.sqllogic). An UNKNOWN collation is still rejected,
|
|
13
|
+
-- now with explicit "Unknown collation" wording (pinned below).
|
|
14
|
+
-- ===================================
|
|
15
|
+
|
|
16
|
+
create table t_uci (id integer primary key, email text collate nocase unique);
|
|
17
|
+
insert into t_uci values (1, 'abc');
|
|
18
|
+
|
|
19
|
+
-- the lowercase `nocase` spelling normalizes to NOCASE, so a case-variant
|
|
20
|
+
-- duplicate is a UNIQUE violation under case-insensitive comparison
|
|
21
|
+
insert into t_uci values (2, 'ABC');
|
|
22
|
+
-- error: UNIQUE constraint failed: t_uci (email)
|
|
23
|
+
|
|
24
|
+
select count(*) as n from t_uci;
|
|
25
|
+
→ [{"n":1}]
|
|
26
|
+
|
|
27
|
+
-- a value that is NOT NOCASE-equal still inserts
|
|
28
|
+
insert into t_uci values (3, 'abd');
|
|
29
|
+
select id, email from t_uci order by id;
|
|
30
|
+
→ [{"id":1,"email":"abc"},{"id":3,"email":"abd"}]
|
|
31
|
+
|
|
32
|
+
drop table t_uci;
|
|
33
|
+
|
|
34
|
+
-- composite UNIQUE with the lowercase `nocase` spelling on a TEXT member is
|
|
35
|
+
-- likewise accepted; the `a` member folds case under the normalized NOCASE
|
|
36
|
+
create table t_uci2 (
|
|
37
|
+
id integer primary key,
|
|
38
|
+
a text collate nocase,
|
|
39
|
+
b text,
|
|
40
|
+
unique (a, b)
|
|
41
|
+
);
|
|
42
|
+
insert into t_uci2 values (1, 'abc', 'x');
|
|
43
|
+
|
|
44
|
+
-- 'a' matches case-insensitively and 'b' matches under BINARY -> composite conflict
|
|
45
|
+
insert into t_uci2 values (2, 'ABC', 'x');
|
|
46
|
+
-- error: UNIQUE constraint failed: t_uci2
|
|
47
|
+
|
|
48
|
+
select count(*) as n from t_uci2;
|
|
49
|
+
→ [{"n":1}]
|
|
50
|
+
|
|
51
|
+
-- a genuinely distinct 'a' still inserts (proves no over-matching)
|
|
52
|
+
insert into t_uci2 values (3, 'xyz', 'x');
|
|
53
|
+
select count(*) as n from t_uci2;
|
|
54
|
+
→ [{"n":2}]
|
|
55
|
+
|
|
56
|
+
drop table t_uci2;
|
|
57
|
+
|
|
58
|
+
-- an UNKNOWN collation name is still rejected at DDL, now with explicit wording
|
|
59
|
+
create table t_ucbad (id integer primary key, x text collate frobnicate);
|
|
60
|
+
-- error: Unknown collation
|
|
61
|
+
|
|
62
|
+
drop table if exists t_ucbad;
|
|
63
|
+
|
|
64
|
+
-- ===================================
|
|
65
|
+
-- 2. UNIQUE constraint error message identifies the violated column
|
|
66
|
+
-- ===================================
|
|
67
|
+
|
|
68
|
+
create table t_ue (id integer primary key, email text unique, code text unique);
|
|
69
|
+
insert into t_ue values (1, 'a@x', 'AAA');
|
|
70
|
+
|
|
71
|
+
-- conflict on email reports email
|
|
72
|
+
insert into t_ue values (2, 'a@x', 'BBB');
|
|
73
|
+
-- error: t_ue (email)
|
|
74
|
+
|
|
75
|
+
-- conflict on code reports code
|
|
76
|
+
insert into t_ue values (3, 'b@x', 'AAA');
|
|
77
|
+
-- error: t_ue (code)
|
|
78
|
+
|
|
79
|
+
drop table t_ue;
|
|
80
|
+
|
|
81
|
+
-- composite UNIQUE error names the offending column(s)
|
|
82
|
+
create table t_uec (id integer primary key, a text, b text, unique (a, b));
|
|
83
|
+
insert into t_uec values (1, 'x', 'y');
|
|
84
|
+
|
|
85
|
+
insert into t_uec values (2, 'x', 'y');
|
|
86
|
+
-- error: t_uec
|
|
87
|
+
|
|
88
|
+
drop table t_uec;
|
|
89
|
+
|
|
90
|
+
-- ===================================
|
|
91
|
+
-- 3. CREATE UNIQUE INDEX rejected when data already has duplicates
|
|
92
|
+
-- ===================================
|
|
93
|
+
-- Lives in 102.1.1-unique-index-creation-edge-cases: adding a UNIQUE after rows
|
|
94
|
+
-- exist requires a standalone `create unique index`.
|
|
95
|
+
|
|
96
|
+
-- ===================================
|
|
97
|
+
-- 4. PRIMARY KEY / UNIQUE referencing non-existent column rejected at DDL
|
|
98
|
+
-- ===================================
|
|
99
|
+
|
|
100
|
+
create table u2_bad1 (a integer not null, b integer not null, primary key (nope));
|
|
101
|
+
-- error:
|
|
102
|
+
|
|
103
|
+
drop table if exists u2_bad1;
|
|
104
|
+
|
|
105
|
+
create table u2_bad2 (id integer primary key, a integer not null, unique (missing));
|
|
106
|
+
-- error:
|
|
107
|
+
|
|
108
|
+
drop table if exists u2_bad2;
|
|
109
|
+
|
|
110
|
+
-- The CREATE UNIQUE INDEX form of the same rejection lives in
|
|
111
|
+
-- 102.1.1-unique-index-creation-edge-cases § 2.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
-- 102.1.1-unique-index-creation-edge-cases.sqllogic
|
|
2
|
+
--
|
|
3
|
+
-- requires-capability: standalone-index-ddl
|
|
4
|
+
--
|
|
5
|
+
-- Carved out of 102.1-unique-edge-cases: the rest of that file establishes UNIQUE
|
|
6
|
+
-- through inline or table-level constraints (collation normalization, duplicate
|
|
7
|
+
-- rejection, missing-column DDL errors) and needs no index DDL. These sections build
|
|
8
|
+
-- the constraint with a standalone `create unique index` instead, which is the only
|
|
9
|
+
-- way to add one AFTER rows exist — so they move here rather than making the whole
|
|
10
|
+
-- UNIQUE edge-case file unrunnable on a backend without first-class CREATE INDEX.
|
|
11
|
+
--
|
|
12
|
+
-- Subject: post-hoc CREATE UNIQUE INDEX — rejected over already-duplicated data,
|
|
13
|
+
-- accepted after dedup and then enforcing, NULL-tolerant on nullable columns, and
|
|
14
|
+
-- rejected outright when it names a column that does not exist.
|
|
15
|
+
|
|
16
|
+
-- ===================================
|
|
17
|
+
-- 1. CREATE UNIQUE INDEX rejected when data already has duplicates
|
|
18
|
+
-- ===================================
|
|
19
|
+
|
|
20
|
+
create table u2_a (k text primary key, x text not null);
|
|
21
|
+
insert into u2_a values ('r1', 'dup'), ('r2', 'dup');
|
|
22
|
+
|
|
23
|
+
create unique index u2_a_x on u2_a(x);
|
|
24
|
+
-- error: UNIQUE
|
|
25
|
+
|
|
26
|
+
-- after dedup, the index creates fine and rejects new duplicates
|
|
27
|
+
delete from u2_a where k = 'r2';
|
|
28
|
+
|
|
29
|
+
create unique index u2_a_x on u2_a(x);
|
|
30
|
+
|
|
31
|
+
insert into u2_a values ('r3', 'dup');
|
|
32
|
+
-- error: UNIQUE
|
|
33
|
+
|
|
34
|
+
drop table u2_a;
|
|
35
|
+
|
|
36
|
+
-- post-hoc CREATE UNIQUE INDEX on already-unique data subsequently rejects
|
|
37
|
+
-- inserts that would violate the new unique constraint. Use `-- run` markers
|
|
38
|
+
-- to run each step as its own implicit transaction; otherwise the CREATE
|
|
39
|
+
-- UNIQUE INDEX would land in the same implicit transaction as the prior
|
|
40
|
+
-- INSERTs, whose rows live in an uncommitted layer that the index's seed
|
|
41
|
+
-- scan does not see (a known schema-change-mid-transaction limitation).
|
|
42
|
+
create table u2_b (k integer primary key, x text not null);
|
|
43
|
+
-- run
|
|
44
|
+
insert into u2_b values (1, 'a'), (2, 'b');
|
|
45
|
+
-- run
|
|
46
|
+
create unique index u2_b_x on u2_b(x);
|
|
47
|
+
-- run
|
|
48
|
+
|
|
49
|
+
insert into u2_b values (3, 'a');
|
|
50
|
+
-- error: UNIQUE
|
|
51
|
+
|
|
52
|
+
drop table u2_b;
|
|
53
|
+
|
|
54
|
+
-- nullable indexed columns: multiple NULL allowed
|
|
55
|
+
create table u2_c (k integer primary key, y text null, z text null);
|
|
56
|
+
insert into u2_c values (1, null, null), (2, null, null);
|
|
57
|
+
|
|
58
|
+
create unique index u2_c_yz on u2_c(y, z);
|
|
59
|
+
|
|
60
|
+
select count(*) as cnt from u2_c;
|
|
61
|
+
→ [{"cnt":2}]
|
|
62
|
+
|
|
63
|
+
drop table u2_c;
|
|
64
|
+
|
|
65
|
+
-- ===================================
|
|
66
|
+
-- 2. CREATE UNIQUE INDEX referencing a non-existent column rejected at DDL
|
|
67
|
+
-- ===================================
|
|
68
|
+
-- (the PRIMARY KEY / table-level UNIQUE forms of the same rejection stay in
|
|
69
|
+
-- 102.1-unique-edge-cases § 4)
|
|
70
|
+
|
|
71
|
+
create table u2_bad3 (id integer primary key, b integer not null);
|
|
72
|
+
create unique index u2_bad3_idx on u2_bad3(no_such_col);
|
|
73
|
+
-- error: not found
|
|
74
|
+
|
|
75
|
+
drop table u2_bad3;
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
-- 102.2-unique-collation.sqllogic — a UNIQUE constraint over a column declared
|
|
2
|
+
-- with a non-binary collation (e.g. `text collate NOCASE`) must enforce under that
|
|
3
|
+
-- collation, not BINARY (unique-constraint-honors-column-collation). The auto-built
|
|
4
|
+
-- UNIQUE index carries the column's declared collation, and every conflict validator
|
|
5
|
+
-- (auto-index path, cold scan, and the row-time covering-MV path) re-compares with the
|
|
6
|
+
-- column collation. Uses the canonical UPPERCASE spelling `NOCASE` / `RTRIM` — the
|
|
7
|
+
-- lowercase spelling is rejected at DDL by a separate collation-name case-sensitivity
|
|
8
|
+
-- quirk documented in 102.1-unique-edge-cases.sqllogic.
|
|
9
|
+
--
|
|
10
|
+
-- Runs under BOTH the memory module (`yarn test`) and the store module
|
|
11
|
+
-- (`yarn test:store`); §4 additionally exercises the MV-backed enforcement path on
|
|
12
|
+
-- each module, using a non-derived NOCASE column through a row-time covering MV.
|
|
13
|
+
--
|
|
14
|
+
-- Every section here declares its UNIQUE inline or table-level, so the enforcement
|
|
15
|
+
-- collation is always the column's. The counterpart shapes — where the collation
|
|
16
|
+
-- comes from an explicit `create unique index … collate …` instead — live in
|
|
17
|
+
-- 102.2.1-unique-collation-index-derived (former §§9-13), split out because they
|
|
18
|
+
-- need standalone index DDL.
|
|
19
|
+
|
|
20
|
+
-- ===================================
|
|
21
|
+
-- 1. Table-level `unique (x)` over a NOCASE column — auto-index enforcement.
|
|
22
|
+
-- ===================================
|
|
23
|
+
|
|
24
|
+
create table ta (id integer primary key, x text collate NOCASE, unique (x));
|
|
25
|
+
insert into ta values (1, 'abc');
|
|
26
|
+
|
|
27
|
+
-- a case-insensitive duplicate is a UNIQUE violation under NOCASE (was silently
|
|
28
|
+
-- accepted as a distinct value under the old BINARY enforcement)
|
|
29
|
+
insert into ta values (2, 'ABC');
|
|
30
|
+
-- error: UNIQUE constraint failed: ta (x)
|
|
31
|
+
|
|
32
|
+
select count(*) as n from ta;
|
|
33
|
+
→ [{"n":1}]
|
|
34
|
+
|
|
35
|
+
-- a value that is NOT NOCASE-equal still inserts (guard against over-matching)
|
|
36
|
+
insert into ta values (3, 'abd');
|
|
37
|
+
select id, x from ta order by id;
|
|
38
|
+
→ [{"id":1,"x":"abc"},{"id":3,"x":"abd"}]
|
|
39
|
+
|
|
40
|
+
-- ===================================
|
|
41
|
+
-- 2. Column-level inline `x text collate NOCASE unique` — same enforcement.
|
|
42
|
+
-- ===================================
|
|
43
|
+
|
|
44
|
+
create table tb (id integer primary key, x text collate NOCASE unique);
|
|
45
|
+
insert into tb values (1, 'abc');
|
|
46
|
+
|
|
47
|
+
insert into tb values (2, 'ABC');
|
|
48
|
+
-- error: UNIQUE constraint failed: tb (x)
|
|
49
|
+
|
|
50
|
+
select count(*) as n from tb;
|
|
51
|
+
→ [{"n":1}]
|
|
52
|
+
|
|
53
|
+
-- ===================================
|
|
54
|
+
-- 3. OR IGNORE / OR REPLACE interplay on a NOCASE duplicate.
|
|
55
|
+
-- ===================================
|
|
56
|
+
|
|
57
|
+
create table tc (id integer primary key, x text collate NOCASE unique);
|
|
58
|
+
insert into tc values (1, 'abc');
|
|
59
|
+
|
|
60
|
+
-- OR IGNORE: the case-insensitive duplicate is silently skipped
|
|
61
|
+
insert or ignore into tc values (2, 'ABC');
|
|
62
|
+
select id, x from tc order by id;
|
|
63
|
+
→ [{"id":1,"x":"abc"}]
|
|
64
|
+
|
|
65
|
+
-- OR REPLACE: the case-insensitive duplicate (id=1) is evicted, the new row lands
|
|
66
|
+
insert or replace into tc values (3, 'ABC');
|
|
67
|
+
select id, x from tc order by id;
|
|
68
|
+
→ [{"id":3,"x":"ABC"}]
|
|
69
|
+
|
|
70
|
+
-- ===================================
|
|
71
|
+
-- 4. Row-time covering MV over a NOCASE column — MV-backed enforcement path.
|
|
72
|
+
-- `findIndexForConstraint` prefers the covering MV over the auto-index, so this
|
|
73
|
+
-- drives `checkUniqueViaMaterializedView` (memory) / `findUniqueConflictViaCoveringMv`
|
|
74
|
+
-- (store). Mirrors 54-covering-mv-enforcement.sqllogic.
|
|
75
|
+
-- ===================================
|
|
76
|
+
|
|
77
|
+
create table tm (id integer primary key, x text collate NOCASE, unique (x));
|
|
78
|
+
create materialized view tm_ix as select x, id from tm order by x;
|
|
79
|
+
insert into tm values (1, 'abc');
|
|
80
|
+
|
|
81
|
+
-- default ABORT through the covering MV: a NOCASE duplicate with a different PK is rejected
|
|
82
|
+
insert into tm values (2, 'ABC');
|
|
83
|
+
-- error: UNIQUE constraint failed: tm (x)
|
|
84
|
+
|
|
85
|
+
select count(*) as n from tm;
|
|
86
|
+
→ [{"n":1}]
|
|
87
|
+
|
|
88
|
+
-- OR REPLACE through the covering MV: id=1 evicted, id=10 lands
|
|
89
|
+
insert or replace into tm values (10, 'ABC');
|
|
90
|
+
select id, x from tm order by id;
|
|
91
|
+
→ [{"id":10,"x":"ABC"}]
|
|
92
|
+
|
|
93
|
+
-- a non-NOCASE-equal value still inserts through the covering path
|
|
94
|
+
insert into tm values (11, 'abd');
|
|
95
|
+
select id, x from tm order by id;
|
|
96
|
+
→ [{"id":10,"x":"ABC"},{"id":11,"x":"abd"}]
|
|
97
|
+
|
|
98
|
+
-- ===================================
|
|
99
|
+
-- 5. Generality with a second collation: `collate RTRIM` ignores trailing spaces.
|
|
100
|
+
-- ===================================
|
|
101
|
+
|
|
102
|
+
create table tr (id integer primary key, x text collate RTRIM, unique (x));
|
|
103
|
+
insert into tr values (1, 'abc');
|
|
104
|
+
|
|
105
|
+
-- a trailing-space-only variant collides under RTRIM
|
|
106
|
+
insert into tr values (2, 'abc ');
|
|
107
|
+
-- error: UNIQUE constraint failed: tr (x)
|
|
108
|
+
|
|
109
|
+
select count(*) as n from tr;
|
|
110
|
+
→ [{"n":1}]
|
|
111
|
+
|
|
112
|
+
-- a genuinely different value still inserts
|
|
113
|
+
insert into tr values (3, 'abcd');
|
|
114
|
+
select id, x from tr order by id;
|
|
115
|
+
→ [{"id":1,"x":"abc"},{"id":3,"x":"abcd"}]
|
|
116
|
+
|
|
117
|
+
-- ===================================
|
|
118
|
+
-- 6. Composite UNIQUE with a mix of NOCASE + BINARY members — each member is
|
|
119
|
+
-- compared under its OWN declared collation (per-column threading), not a
|
|
120
|
+
-- single table-wide collation. The NOCASE member folds case; the BINARY
|
|
121
|
+
-- member does not.
|
|
122
|
+
-- ===================================
|
|
123
|
+
|
|
124
|
+
create table tcomp (id integer primary key, a text collate NOCASE, b text collate BINARY, unique (a, b));
|
|
125
|
+
insert into tcomp values (1, 'abc', 'xyz');
|
|
126
|
+
|
|
127
|
+
-- both members match under their own collations (a: NOCASE-equal, b: BINARY-equal) → conflict
|
|
128
|
+
insert into tcomp values (2, 'ABC', 'xyz');
|
|
129
|
+
-- error: UNIQUE constraint failed: tcomp
|
|
130
|
+
|
|
131
|
+
select count(*) as n from tcomp;
|
|
132
|
+
→ [{"n":1}]
|
|
133
|
+
|
|
134
|
+
-- a matches under NOCASE but b differs under BINARY ('XYZ' != 'xyz'), so the composite
|
|
135
|
+
-- key is distinct and the row inserts — proves the BINARY member is NOT case-folded
|
|
136
|
+
insert into tcomp values (3, 'ABC', 'XYZ');
|
|
137
|
+
select id, a, b from tcomp order by id;
|
|
138
|
+
→ [{"id":1,"a":"abc","b":"xyz"},{"id":3,"a":"ABC","b":"XYZ"}]
|
|
139
|
+
|
|
140
|
+
-- ===================================
|
|
141
|
+
-- 7. UPDATE onto a NOCASE-equal value is rejected (the conflict validators back
|
|
142
|
+
-- UPDATE as well as INSERT). Guards the UPDATE path, not just INSERT.
|
|
143
|
+
-- ===================================
|
|
144
|
+
|
|
145
|
+
create table tu (id integer primary key, x text collate NOCASE, unique (x));
|
|
146
|
+
insert into tu values (1, 'abc');
|
|
147
|
+
insert into tu values (2, 'def');
|
|
148
|
+
|
|
149
|
+
-- moving id=2's value onto a NOCASE-equal of id=1's value collides
|
|
150
|
+
update tu set x = 'ABC' where id = 2;
|
|
151
|
+
-- error: UNIQUE constraint failed: tu
|
|
152
|
+
|
|
153
|
+
-- the aborted UPDATE left both rows unchanged
|
|
154
|
+
select id, x from tu order by id;
|
|
155
|
+
→ [{"id":1,"x":"abc"},{"id":2,"x":"def"}]
|
|
156
|
+
|
|
157
|
+
-- updating onto a genuinely distinct value still succeeds
|
|
158
|
+
update tu set x = 'xyz' where id = 2;
|
|
159
|
+
select id, x from tu order by id;
|
|
160
|
+
→ [{"id":1,"x":"abc"},{"id":2,"x":"xyz"}]
|
|
161
|
+
|
|
162
|
+
-- ===================================
|
|
163
|
+
-- 8. The LOWERCASE collation spelling `collate nocase` normalizes to NOCASE and
|
|
164
|
+
-- enforces identically to the uppercase form (DDL case-insensitivity fix).
|
|
165
|
+
-- ===================================
|
|
166
|
+
|
|
167
|
+
create table tl (id integer primary key, x text collate nocase unique);
|
|
168
|
+
insert into tl values (1, 'abc');
|
|
169
|
+
|
|
170
|
+
-- a case-variant duplicate collides under the normalized NOCASE collation
|
|
171
|
+
insert into tl values (2, 'ABC');
|
|
172
|
+
-- error: UNIQUE constraint failed: tl (x)
|
|
173
|
+
|
|
174
|
+
select count(*) as n from tl;
|
|
175
|
+
→ [{"n":1}]
|
|
176
|
+
|
|
177
|
+
-- a non-NOCASE-equal value still inserts
|
|
178
|
+
insert into tl values (3, 'abd');
|
|
179
|
+
select id, x from tl order by id;
|
|
180
|
+
→ [{"id":1,"x":"abc"},{"id":3,"x":"abd"}]
|
|
181
|
+
|