@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,99 @@
|
|
|
1
|
+
-- Write-path scope/attribute collation conformance. Ticket
|
|
2
|
+
-- write-path-scope-collation-conformance. Expressions compiled over a table's
|
|
3
|
+
-- row image (DEFAULT expressions, OR REPLACE NOT NULL default substitution,
|
|
4
|
+
-- RETURNING projections, upsert SET) resolve declared column collations
|
|
5
|
+
-- exactly like a read-path query over the same schema. A literal contributes
|
|
6
|
+
-- no collation, so a declared NOCASE drives the comparison from either side.
|
|
7
|
+
-- Mirrors the CHECK collation section of 40.2-check-extras.
|
|
8
|
+
|
|
9
|
+
-- ===================================
|
|
10
|
+
-- 1. DEFAULT referencing a NOCASE sibling (row-expansion path): the
|
|
11
|
+
-- comparison inside the default resolves the sibling's declared collation.
|
|
12
|
+
-- ===================================
|
|
13
|
+
|
|
14
|
+
create table def_coll (id integer primary key, c text collate nocase, flag text default (case when new.c = 'abc' then 'match' else 'nomatch' end));
|
|
15
|
+
insert into def_coll (id, c) values (1, 'ABC');
|
|
16
|
+
insert into def_coll (id, c) values (2, 'xyz');
|
|
17
|
+
select id, flag from def_coll order by id;
|
|
18
|
+
→ [{"id":1,"flag":"match"},{"id":2,"flag":"nomatch"}]
|
|
19
|
+
-- read path agrees: the same comparison matches the case-variant row.
|
|
20
|
+
select count(*) as cnt from def_coll where c = 'abc';
|
|
21
|
+
→ [{"cnt":1}]
|
|
22
|
+
drop table def_coll;
|
|
23
|
+
|
|
24
|
+
-- ===================================
|
|
25
|
+
-- 2. OR REPLACE NOT NULL default substitution: the pre-built default plan
|
|
26
|
+
-- (buildNotNullDefaults) resolves the sibling's declared collation too.
|
|
27
|
+
-- ===================================
|
|
28
|
+
|
|
29
|
+
create table def_nn (id integer primary key, c text collate nocase, flag text not null default (case when new.c = 'abc' then 'match' else 'nomatch' end));
|
|
30
|
+
insert or replace into def_nn values (1, 'ABC', null);
|
|
31
|
+
select flag from def_nn where id = 1;
|
|
32
|
+
→ [{"flag":"match"}]
|
|
33
|
+
insert or replace into def_nn values (2, 'xyz', null);
|
|
34
|
+
select flag from def_nn where id = 2;
|
|
35
|
+
→ [{"flag":"nomatch"}]
|
|
36
|
+
drop table def_nn;
|
|
37
|
+
|
|
38
|
+
-- ===================================
|
|
39
|
+
-- 3. RETURNING comparisons against a NOCASE column (NEW on INSERT/UPDATE,
|
|
40
|
+
-- OLD on DELETE) match the read-path resolution of the same expression.
|
|
41
|
+
-- ===================================
|
|
42
|
+
|
|
43
|
+
create table ret_coll (id integer primary key, c text collate nocase);
|
|
44
|
+
insert into ret_coll values (1, 'ABC') returning c = 'abc' as eq;
|
|
45
|
+
→ [{"eq":true}]
|
|
46
|
+
-- read path agrees.
|
|
47
|
+
select c = 'abc' as eq from ret_coll where id = 1;
|
|
48
|
+
→ [{"eq":true}]
|
|
49
|
+
|
|
50
|
+
-- UPDATE RETURNING: both row images carry the declared collation, so a
|
|
51
|
+
-- case-variant rewrite still compares equal under NOCASE.
|
|
52
|
+
update ret_coll set c = 'abc' where id = 1 returning old.c = new.c as same;
|
|
53
|
+
→ [{"same":true}]
|
|
54
|
+
|
|
55
|
+
-- DELETE RETURNING resolves OLD with the declared collation.
|
|
56
|
+
delete from ret_coll where id = 1 returning c = 'aBc' as eq;
|
|
57
|
+
→ [{"eq":true}]
|
|
58
|
+
drop table ret_coll;
|
|
59
|
+
|
|
60
|
+
-- ===================================
|
|
61
|
+
-- 4. Upsert DO UPDATE: the conflicting (existing) row's columns resolve the
|
|
62
|
+
-- declared collation inside SET expressions.
|
|
63
|
+
-- ===================================
|
|
64
|
+
|
|
65
|
+
create table ups_coll (id integer primary key, c text collate nocase, note text null);
|
|
66
|
+
insert into ups_coll values (1, 'ABC', null);
|
|
67
|
+
insert into ups_coll values (1, 'zzz', null)
|
|
68
|
+
on conflict (id) do update set note = case when c = 'abc' then 'was-match' else 'was-nomatch' end;
|
|
69
|
+
select note from ups_coll where id = 1;
|
|
70
|
+
→ [{"note":"was-match"}]
|
|
71
|
+
drop table ups_coll;
|
|
72
|
+
|
|
73
|
+
-- ===================================
|
|
74
|
+
-- 5. Foreign-key check scope: the synthesized parent-existence comparison
|
|
75
|
+
-- `parent.k = NEW.ref` resolves the child FK column's declared collation
|
|
76
|
+
-- (declared NOCASE outranks the parent column's defaulted BINARY in the
|
|
77
|
+
-- provenance lattice, mirroring read-path comparison resolution). A
|
|
78
|
+
-- NOCASE child column therefore matches a case-variant parent key, exactly
|
|
79
|
+
-- as a read-path join over the two columns would.
|
|
80
|
+
-- ===================================
|
|
81
|
+
|
|
82
|
+
pragma foreign_keys = true;
|
|
83
|
+
create table fk_parent (k text primary key);
|
|
84
|
+
create table fk_child (id integer primary key, ref text collate nocase references fk_parent(k));
|
|
85
|
+
insert into fk_parent values ('ABC');
|
|
86
|
+
-- Case-variant FK satisfied: NOCASE on the child column drives the parent lookup.
|
|
87
|
+
insert into fk_child values (1, 'abc');
|
|
88
|
+
select count(*) as cnt from fk_child where id = 1;
|
|
89
|
+
→ [{"cnt":1}]
|
|
90
|
+
-- read path agrees: the same comparison (parent.k = child.ref, child side
|
|
91
|
+
-- declared NOCASE) matches across the case variance.
|
|
92
|
+
select count(*) as cnt from fk_parent as p join fk_child as c on p.k = c.ref;
|
|
93
|
+
→ [{"cnt":1}]
|
|
94
|
+
-- A value with no case-folded parent match is still rejected (FK is enforced).
|
|
95
|
+
insert into fk_child values (2, 'nope');
|
|
96
|
+
-- error:
|
|
97
|
+
drop table fk_child;
|
|
98
|
+
drop table fk_parent;
|
|
99
|
+
pragma foreign_keys = false;
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
-- Comparison collation: provenance-ranked, symmetric resolution. Ticket
|
|
2
|
+
-- comparison-collation-provenance-and-precedence. Each operand contributes
|
|
3
|
+
-- (collation, rank) from its type's provenance: explicit COLLATE (rank 3) >
|
|
4
|
+
-- explicitly-declared column collation (rank 2) > defaulted collation (rank 1;
|
|
5
|
+
-- a defaulted BINARY contributes nothing) > BINARY floor. The highest rank
|
|
6
|
+
-- wins; same-rank explicit/declared conflicts error at prepare time;
|
|
7
|
+
-- same-rank default conflicts resolve to BINARY silently. Resolution is
|
|
8
|
+
-- symmetric — `a = b` and `b = a` always resolve identically — which
|
|
9
|
+
-- deliberately diverges from SQLite's left-operand precedence (docs/types.md
|
|
10
|
+
-- § Comparison collation resolution). IS [NOT] is parsed only in its unary
|
|
11
|
+
-- NULL/TRUE/FALSE forms, so binary IS never reaches comparison resolution.
|
|
12
|
+
|
|
13
|
+
-- =============================================================================
|
|
14
|
+
-- 1. Headline: declared NOCASE vs defaulted BINARY resolves NOCASE from
|
|
15
|
+
-- EITHER side (the defaulted BINARY of a plain column contributes nothing).
|
|
16
|
+
-- =============================================================================
|
|
17
|
+
|
|
18
|
+
create table t_dn (id integer primary key, b text, c text collate nocase);
|
|
19
|
+
insert into t_dn values (1, 'Bob', 'bob'), (2, 'xyz', 'zzz');
|
|
20
|
+
|
|
21
|
+
select id from t_dn where b = c;
|
|
22
|
+
→ [{"id":1}]
|
|
23
|
+
|
|
24
|
+
-- flipped spelling: identical resolution (previously BINARY → no rows).
|
|
25
|
+
select id from t_dn where c = b;
|
|
26
|
+
→ [{"id":1}]
|
|
27
|
+
|
|
28
|
+
-- ordering comparisons resolve through the same lattice.
|
|
29
|
+
select id from t_dn where b <= c order by id;
|
|
30
|
+
→ [{"id":1},{"id":2}]
|
|
31
|
+
select id from t_dn where c >= b order by id;
|
|
32
|
+
→ [{"id":1},{"id":2}]
|
|
33
|
+
|
|
34
|
+
-- =============================================================================
|
|
35
|
+
-- 2. explicit vs explicit: same name fine; different names error (both
|
|
36
|
+
-- spellings, and for ordering operators too); errors fire even for
|
|
37
|
+
-- statically non-textual operands (consistent strictness).
|
|
38
|
+
-- =============================================================================
|
|
39
|
+
|
|
40
|
+
select id from t_dn where b collate nocase = c collate nocase;
|
|
41
|
+
→ [{"id":1}]
|
|
42
|
+
|
|
43
|
+
select id from t_dn where b collate nocase = c collate rtrim;
|
|
44
|
+
-- error: conflicting COLLATE clauses
|
|
45
|
+
|
|
46
|
+
select id from t_dn where c collate rtrim = b collate nocase;
|
|
47
|
+
-- error: conflicting COLLATE clauses
|
|
48
|
+
|
|
49
|
+
select id from t_dn where b collate rtrim < c collate nocase;
|
|
50
|
+
-- error: conflicting COLLATE clauses
|
|
51
|
+
|
|
52
|
+
select id from t_dn where id collate nocase = id collate rtrim;
|
|
53
|
+
-- error: conflicting COLLATE clauses
|
|
54
|
+
|
|
55
|
+
-- =============================================================================
|
|
56
|
+
-- 3. explicit BINARY (rank 3) beats declared NOCASE (rank 2): `collate binary`
|
|
57
|
+
-- is a real demand, not the absence of one.
|
|
58
|
+
-- =============================================================================
|
|
59
|
+
|
|
60
|
+
select id from t_dn where c = 'BOB';
|
|
61
|
+
→ [{"id":1}]
|
|
62
|
+
|
|
63
|
+
select id from t_dn where c = 'BOB' collate binary;
|
|
64
|
+
→ []
|
|
65
|
+
|
|
66
|
+
select id from t_dn where 'BOB' collate binary = c;
|
|
67
|
+
→ []
|
|
68
|
+
|
|
69
|
+
-- =============================================================================
|
|
70
|
+
-- 4. declared vs declared: same name fine; different names are a prepare-time
|
|
71
|
+
-- error (both spellings); an explicit COLLATE disambiguates; a declared
|
|
72
|
+
-- `collate binary` column counts at rank 2 (conflicts with declared NOCASE)
|
|
73
|
+
-- while declared-binary vs plain resolves BINARY with no error.
|
|
74
|
+
-- =============================================================================
|
|
75
|
+
|
|
76
|
+
create table t_dd (id integer primary key, n1 text collate nocase, n2 text collate nocase, r text collate rtrim, bb text collate binary, p text);
|
|
77
|
+
insert into t_dd values (1, 'Ann', 'ANN', 'x ', 'q', 'Q');
|
|
78
|
+
|
|
79
|
+
select id from t_dd where n1 = n2;
|
|
80
|
+
→ [{"id":1}]
|
|
81
|
+
|
|
82
|
+
select id from t_dd where n1 = r;
|
|
83
|
+
-- error: ambiguous collation
|
|
84
|
+
|
|
85
|
+
select id from t_dd where r = n1;
|
|
86
|
+
-- error: ambiguous collation
|
|
87
|
+
|
|
88
|
+
-- rank 3 outranks the conflicted pair.
|
|
89
|
+
select id from t_dd where n1 = r collate binary;
|
|
90
|
+
→ []
|
|
91
|
+
|
|
92
|
+
-- declared BINARY vs declared NOCASE: a real rank-2 conflict.
|
|
93
|
+
select id from t_dd where bb = n1;
|
|
94
|
+
-- error: ambiguous collation
|
|
95
|
+
|
|
96
|
+
-- declared BINARY vs plain (defaulted) column: BINARY, silently. 'q' vs 'Q'
|
|
97
|
+
-- proves the comparison is BINARY (NOCASE would match).
|
|
98
|
+
select id from t_dd where bb = p;
|
|
99
|
+
→ []
|
|
100
|
+
select id from t_dd where p = bb;
|
|
101
|
+
→ []
|
|
102
|
+
|
|
103
|
+
drop table t_dd;
|
|
104
|
+
|
|
105
|
+
-- =============================================================================
|
|
106
|
+
-- 5. The error fires wherever the comparison compiles. CHECK predicates
|
|
107
|
+
-- compile when the enforcing DML plans (constraint-builder), so the
|
|
108
|
+
-- conflict surfaces at the first write against the table; WHERE-clause
|
|
109
|
+
-- conflicts surface at that statement's prepare. (The FK variant now also
|
|
110
|
+
-- validates at CREATE/ALTER — see § 10 and 41.1-fk-collation-conflict —
|
|
111
|
+
-- but CREATE-time detection of a conflicted CHECK is still unimplemented,
|
|
112
|
+
-- so a conflicted CHECK remains caught at the first write below.)
|
|
113
|
+
-- =============================================================================
|
|
114
|
+
|
|
115
|
+
create table t_chk_conflict (id integer primary key, a text collate nocase, b text collate rtrim, check (a = b));
|
|
116
|
+
insert into t_chk_conflict values (1, 'x', 'x');
|
|
117
|
+
-- error: ambiguous collation
|
|
118
|
+
drop table t_chk_conflict;
|
|
119
|
+
|
|
120
|
+
create table t_dml_conf (id integer primary key, a text collate nocase, b text collate rtrim);
|
|
121
|
+
insert into t_dml_conf values (1, 'x', 'x');
|
|
122
|
+
update t_dml_conf set a = 'y' where a = b;
|
|
123
|
+
-- error: ambiguous collation
|
|
124
|
+
drop table t_dml_conf;
|
|
125
|
+
|
|
126
|
+
-- =============================================================================
|
|
127
|
+
-- 6. Defaulted collations are preferences: a defaulted non-BINARY collation
|
|
128
|
+
-- wins over a defaulted BINARY, but two DIFFERENT defaulted collations
|
|
129
|
+
-- resolve to BINARY silently (no error). Tables created under different
|
|
130
|
+
-- session defaults.
|
|
131
|
+
-- =============================================================================
|
|
132
|
+
|
|
133
|
+
pragma default_collation='nocase';
|
|
134
|
+
create table t_def_nc (id integer primary key, v text);
|
|
135
|
+
pragma default_collation='rtrim';
|
|
136
|
+
create table t_def_rt (id integer primary key, w text);
|
|
137
|
+
pragma default_collation='binary';
|
|
138
|
+
create table t_def_b (id integer primary key, u text);
|
|
139
|
+
|
|
140
|
+
-- 'Bob'/'bob' would match under NOCASE; 'bob '/'bob' would match under RTRIM;
|
|
141
|
+
-- neither matches under BINARY — so 0 proves the defaults-conflict → BINARY rule.
|
|
142
|
+
insert into t_def_nc values (1, 'Bob'), (2, 'bob ');
|
|
143
|
+
insert into t_def_rt values (1, 'bob');
|
|
144
|
+
select count(*) as cnt from t_def_nc join t_def_rt on v = w;
|
|
145
|
+
→ [{"cnt":0}]
|
|
146
|
+
select count(*) as cnt from t_def_rt join t_def_nc on w = v;
|
|
147
|
+
→ [{"cnt":0}]
|
|
148
|
+
|
|
149
|
+
-- defaulted NOCASE vs defaulted BINARY: NOCASE wins (rank-1 BINARY contributes
|
|
150
|
+
-- nothing), from either side.
|
|
151
|
+
insert into t_def_b values (1, 'BOB');
|
|
152
|
+
select count(*) as cnt from t_def_nc join t_def_b on v = u;
|
|
153
|
+
→ [{"cnt":1}]
|
|
154
|
+
select count(*) as cnt from t_def_b join t_def_nc on u = v;
|
|
155
|
+
→ [{"cnt":1}]
|
|
156
|
+
|
|
157
|
+
drop table t_def_nc;
|
|
158
|
+
drop table t_def_rt;
|
|
159
|
+
drop table t_def_b;
|
|
160
|
+
|
|
161
|
+
-- =============================================================================
|
|
162
|
+
-- 7. Propagation through concat: provenance rides through `||` by rank; a
|
|
163
|
+
-- plain operand's defaulted BINARY no longer shadows a declared collation
|
|
164
|
+
-- on the other side, and a concat of two DIFFERENT declared collations
|
|
165
|
+
-- propagates no collation — the comparison falls back to BINARY.
|
|
166
|
+
-- =============================================================================
|
|
167
|
+
|
|
168
|
+
create table t_cc (id integer primary key, b text, c text collate nocase, r text collate rtrim);
|
|
169
|
+
insert into t_cc values (1, 'B', 'ob', 'OB');
|
|
170
|
+
|
|
171
|
+
-- declared NOCASE survives concat with a plain operand (previously the plain
|
|
172
|
+
-- side's defaulted BINARY shadowed it).
|
|
173
|
+
select count(*) as cnt from t_cc where b || c = 'bOB';
|
|
174
|
+
→ [{"cnt":1}]
|
|
175
|
+
|
|
176
|
+
-- explicit COLLATE nested inside an operand propagates rank 3 through concat.
|
|
177
|
+
select count(*) as cnt from t_cc where (b collate nocase) || c = 'bOB';
|
|
178
|
+
→ [{"cnt":1}]
|
|
179
|
+
|
|
180
|
+
-- concat-laundered declared conflict: no collation propagates; the comparison
|
|
181
|
+
-- is BINARY ('obOB' matches byte-exactly, the NOCASE-variant does not).
|
|
182
|
+
select count(*) as cnt from t_cc where c || r = 'obOB';
|
|
183
|
+
→ [{"cnt":1}]
|
|
184
|
+
select count(*) as cnt from t_cc where c || r = 'OBob';
|
|
185
|
+
→ [{"cnt":0}]
|
|
186
|
+
|
|
187
|
+
drop table t_cc;
|
|
188
|
+
|
|
189
|
+
-- =============================================================================
|
|
190
|
+
-- 8. BETWEEN: each bound is an independent comparison. Two differently-
|
|
191
|
+
-- collated explicit bounds are NOT a conflict with each other; a
|
|
192
|
+
-- declared-vs-declared conflict on ONE bound errors; NOT BETWEEN takes the
|
|
193
|
+
-- same path; an explicit COLLATE on the conflicted bound disambiguates.
|
|
194
|
+
-- =============================================================================
|
|
195
|
+
|
|
196
|
+
create table t_bt (id integer primary key, v text);
|
|
197
|
+
insert into t_bt values (1, 'm');
|
|
198
|
+
|
|
199
|
+
select id from t_bt where v between 'M' collate nocase and 'z ' collate rtrim;
|
|
200
|
+
→ [{"id":1}]
|
|
201
|
+
|
|
202
|
+
drop table t_bt;
|
|
203
|
+
|
|
204
|
+
create table t_bt2 (id integer primary key, v text collate nocase, lo text collate rtrim);
|
|
205
|
+
insert into t_bt2 values (1, 'm', 'a');
|
|
206
|
+
|
|
207
|
+
select id from t_bt2 where v between lo and 'z';
|
|
208
|
+
-- error: ambiguous collation
|
|
209
|
+
|
|
210
|
+
select id from t_bt2 where v not between lo and 'z';
|
|
211
|
+
-- error: ambiguous collation
|
|
212
|
+
|
|
213
|
+
select id from t_bt2 where v between lo collate binary and 'z';
|
|
214
|
+
→ [{"id":1}]
|
|
215
|
+
|
|
216
|
+
drop table t_bt2;
|
|
217
|
+
|
|
218
|
+
-- =============================================================================
|
|
219
|
+
-- 9. IN: the condition and every RHS value resolve to ONE collation through
|
|
220
|
+
-- the lattice. A declared-NOCASE element drives a plain condition; element
|
|
221
|
+
-- contributions conflict like operands; a subquery RHS contributes its
|
|
222
|
+
-- output column's collation.
|
|
223
|
+
-- =============================================================================
|
|
224
|
+
|
|
225
|
+
create table t_in (id integer primary key, a text, n text collate nocase);
|
|
226
|
+
insert into t_in values (1, 'BOB', 'bob');
|
|
227
|
+
|
|
228
|
+
-- condition declared NOCASE with a literal list: NOCASE (unchanged).
|
|
229
|
+
select id from t_in where n in ('BOB', 'x');
|
|
230
|
+
→ [{"id":1}]
|
|
231
|
+
|
|
232
|
+
-- plain condition, declared-NOCASE element: NOCASE (new symmetric behavior;
|
|
233
|
+
-- previously the condition's defaulted BINARY drove the comparison).
|
|
234
|
+
select id from t_in where a in (n);
|
|
235
|
+
→ [{"id":1}]
|
|
236
|
+
|
|
237
|
+
-- NOT IN resolves identically.
|
|
238
|
+
select id from t_in where a not in (n);
|
|
239
|
+
→ []
|
|
240
|
+
|
|
241
|
+
-- list elements with conflicting explicit collations: error.
|
|
242
|
+
select id from t_in where a in ('x' collate nocase, 'y' collate rtrim);
|
|
243
|
+
-- error: conflicting COLLATE clauses
|
|
244
|
+
|
|
245
|
+
-- subquery RHS: declared-NOCASE output column vs plain condition → NOCASE.
|
|
246
|
+
create table t_in_src (v text collate nocase);
|
|
247
|
+
insert into t_in_src values ('bob');
|
|
248
|
+
select id from t_in where a in (select v from t_in_src);
|
|
249
|
+
→ [{"id":1}]
|
|
250
|
+
drop table t_in_src;
|
|
251
|
+
|
|
252
|
+
-- condition and element with conflicting declared collations: error.
|
|
253
|
+
create table t_in2 (id integer primary key, n text collate nocase, r text collate rtrim);
|
|
254
|
+
insert into t_in2 values (1, 'x', 'x');
|
|
255
|
+
select id from t_in2 where n in (r);
|
|
256
|
+
-- error: ambiguous collation
|
|
257
|
+
drop table t_in2;
|
|
258
|
+
|
|
259
|
+
drop table t_in;
|
|
260
|
+
drop table t_dn;
|
|
261
|
+
|
|
262
|
+
-- =============================================================================
|
|
263
|
+
-- 10. FK with parent and child declaring DIFFERENT explicit collations: the
|
|
264
|
+
-- conflict is now rejected at CREATE TABLE (declaration time) through the
|
|
265
|
+
-- same lattice the synthesized parent-existence comparison uses — no longer
|
|
266
|
+
-- deferred to the first DML. Ticket fk-collation-conflict-create-time-
|
|
267
|
+
-- validation. (The DML-time error remains the residual for a forward-
|
|
268
|
+
-- declared parent; that path is covered in 41.1-fk-collation-conflict.)
|
|
269
|
+
-- =============================================================================
|
|
270
|
+
|
|
271
|
+
pragma foreign_keys = true;
|
|
272
|
+
create table fkp_conf (k text collate rtrim primary key);
|
|
273
|
+
create table fkc_conf (id integer primary key, ref text collate nocase references fkp_conf(k));
|
|
274
|
+
-- error: conflicting collations
|
|
275
|
+
drop table fkp_conf;
|
|
276
|
+
pragma foreign_keys = false;
|
|
277
|
+
|
|
278
|
+
-- =============================================================================
|
|
279
|
+
-- 11. SET COLLATE provenance (ticket collation-provenance-stability-set-collate-
|
|
280
|
+
-- and-reload). `ALTER COLUMN ... SET COLLATE` is a user declaration with the
|
|
281
|
+
-- same standing as a CREATE-time COLLATE clause: it marks the collation
|
|
282
|
+
-- explicit (rank 2 'declared') regardless of the column's creation history,
|
|
283
|
+
-- so the rank is a function of the current catalog column, not its past.
|
|
284
|
+
-- Runs under BOTH memory and store (SET COLLATE re-registers the schema on
|
|
285
|
+
-- each — see the 41.7 header). The same statement that previously diverged
|
|
286
|
+
-- (rank 1 vs rank 2 depending on whether the column happened to be created
|
|
287
|
+
-- with a COLLATE clause) now resolves identically.
|
|
288
|
+
-- =============================================================================
|
|
289
|
+
|
|
290
|
+
-- 11a. The reproduced bug, now fixed: SET COLLATE NOCASE on a column created
|
|
291
|
+
-- WITHOUT a COLLATE clause vs a declared RTRIM column ⇒ rank-2 vs rank-2,
|
|
292
|
+
-- ambiguous-collation error (was silently RTRIM — rank-1 lost to rank-2).
|
|
293
|
+
create table sc_r1 (id integer primary key, v text, r text collate rtrim);
|
|
294
|
+
insert into sc_r1 values (1, 'xx', 'xx');
|
|
295
|
+
alter table sc_r1 alter column v set collate nocase;
|
|
296
|
+
select id from sc_r1 where v = r;
|
|
297
|
+
-- error: ambiguous collation
|
|
298
|
+
drop table sc_r1;
|
|
299
|
+
|
|
300
|
+
-- 11b. History independence: the SAME SET COLLATE NOCASE statement on a column
|
|
301
|
+
-- created WITH `collate binary` yields the identical rank-2 result — the
|
|
302
|
+
-- same ambiguous-collation error against a declared RTRIM column. The rank
|
|
303
|
+
-- follows the current column, not whether it was once created with COLLATE.
|
|
304
|
+
create table sc_r1b (id integer primary key, v text collate binary, r text collate rtrim);
|
|
305
|
+
insert into sc_r1b values (1, 'xx', 'xx');
|
|
306
|
+
alter table sc_r1b alter column v set collate nocase;
|
|
307
|
+
select id from sc_r1b where v = r;
|
|
308
|
+
-- error: ambiguous collation
|
|
309
|
+
drop table sc_r1b;
|
|
310
|
+
|
|
311
|
+
-- 11c. SET COLLATE NOCASE on a plain column vs a declared BINARY column: a real
|
|
312
|
+
-- rank-2 vs rank-2 conflict (declared `collate binary` contributes at rank
|
|
313
|
+
-- 2), ambiguous-collation error.
|
|
314
|
+
create table sc_db (id integer primary key, v text, b text collate binary);
|
|
315
|
+
insert into sc_db values (1, 'xx', 'xx');
|
|
316
|
+
alter table sc_db alter column v set collate nocase;
|
|
317
|
+
select id from sc_db where v = b;
|
|
318
|
+
-- error: ambiguous collation
|
|
319
|
+
drop table sc_db;
|
|
320
|
+
|
|
321
|
+
-- 11d. SET COLLATE NOCASE on a plain column vs another plain (defaulted-BINARY)
|
|
322
|
+
-- column: rank-2 NOCASE wins over the rank-1 BINARY that contributes
|
|
323
|
+
-- nothing, so the comparison resolves NOCASE and the case-folded row matches.
|
|
324
|
+
create table sc_p (id integer primary key, v text, p text);
|
|
325
|
+
insert into sc_p values (1, 'AB', 'ab'), (2, 'xy', 'zz');
|
|
326
|
+
alter table sc_p alter column v set collate nocase;
|
|
327
|
+
select id from sc_p where v = p;
|
|
328
|
+
→ [{"id":1}]
|
|
329
|
+
drop table sc_p;
|
|
330
|
+
|
|
331
|
+
-- 11e. SET COLLATE binary is rank 2 too (a real BINARY demand, not the absence of
|
|
332
|
+
-- one): on a defaulted-BINARY column it flips the column explicit, so a
|
|
333
|
+
-- conflict against a declared NOCASE column is an ambiguous-collation error
|
|
334
|
+
-- in-session (was silently NOCASE — rank-1 defaulted BINARY lost to rank-2).
|
|
335
|
+
-- This pins the "consistency argues yes" decision; no reopen assertion (the
|
|
336
|
+
-- flag does not survive a store reload, by design — BINARY DDL is elided).
|
|
337
|
+
create table sc_bin (id integer primary key, v text, n text collate nocase);
|
|
338
|
+
insert into sc_bin values (1, 'xx', 'xx');
|
|
339
|
+
alter table sc_bin alter column v set collate binary;
|
|
340
|
+
select id from sc_bin where v = n;
|
|
341
|
+
-- error: ambiguous collation
|
|
342
|
+
drop table sc_bin;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
-- 06.4.5-any-collate-declared-keys.sqllogic
|
|
2
|
+
--
|
|
3
|
+
-- requires-capability: standalone-index-ddl
|
|
4
|
+
--
|
|
5
|
+
-- Subject: a declared COLLATE on an `any` column is honored by declared-key
|
|
6
|
+
-- structures (the PK BTree, secondary indexes) exactly as the generic comparison
|
|
7
|
+
-- path honors it (ticket any-type-compare-honors-collation): `ANY_TYPE.compare`
|
|
8
|
+
-- applies the collation it is handed, so creating an index never changes a
|
|
9
|
+
-- query's answer, and PK/UNIQUE enforcement agrees with the identity that
|
|
10
|
+
-- DISTINCT / GROUP BY / IN already use. Each section pins the before-index
|
|
11
|
+
-- answer as the oracle and asserts the after-index answer equals it.
|
|
12
|
+
|
|
13
|
+
-- Case 1: equality and range answers must not move when an index appears.
|
|
14
|
+
create table t1 (id integer primary key, v any collate nocase);
|
|
15
|
+
insert into t1 values (1, 'Bob'), (2, 'zed');
|
|
16
|
+
select id from t1 where v = 'BOB';
|
|
17
|
+
→ [{"id":1}]
|
|
18
|
+
select id from t1 where v > 'a' order by id;
|
|
19
|
+
→ [{"id":1},{"id":2}]
|
|
20
|
+
create index ix1 on t1 (v);
|
|
21
|
+
select id from t1 where v = 'BOB';
|
|
22
|
+
→ [{"id":1}]
|
|
23
|
+
select id from t1 where v > 'a' order by id;
|
|
24
|
+
→ [{"id":1},{"id":2}]
|
|
25
|
+
drop table t1;
|
|
26
|
+
|
|
27
|
+
-- Case 2: an index that supplies ORDER BY must reproduce the NOCASE order
|
|
28
|
+
-- (A, b, C), not BINARY byte order (A, C, b).
|
|
29
|
+
create table t2 (id integer primary key, v any collate nocase);
|
|
30
|
+
insert into t2 values (1, 'b'), (2, 'A'), (3, 'C');
|
|
31
|
+
select id from t2 order by v;
|
|
32
|
+
→ [{"id":2},{"id":1},{"id":3}]
|
|
33
|
+
create index ix2 on t2 (v);
|
|
34
|
+
select id from t2 order by v;
|
|
35
|
+
→ [{"id":2},{"id":1},{"id":3}]
|
|
36
|
+
drop table t2;
|
|
37
|
+
|
|
38
|
+
-- Case 3: an index COLLATE over an undecorated `any` column must be keyed under
|
|
39
|
+
-- that collation — the cover analysis serves the NOCASE demand from it.
|
|
40
|
+
create table t3 (id integer primary key, v any);
|
|
41
|
+
insert into t3 values (1, 'Bob'), (2, 'zed');
|
|
42
|
+
select id from t3 where v = 'BOB' collate nocase;
|
|
43
|
+
→ [{"id":1}]
|
|
44
|
+
create index ix3 on t3 (v collate nocase);
|
|
45
|
+
select id from t3 where v = 'BOB' collate nocase;
|
|
46
|
+
→ [{"id":1}]
|
|
47
|
+
-- The column itself still compares BINARY when no collation is demanded.
|
|
48
|
+
select id from t3 where v = 'BOB';
|
|
49
|
+
→ []
|
|
50
|
+
drop table t3;
|
|
51
|
+
|
|
52
|
+
-- Case 4: PK and UNIQUE enforce under the declared collation — the same
|
|
53
|
+
-- identity DISTINCT already collapses (a dup DISTINCT merges must not be
|
|
54
|
+
-- admitted by UNIQUE).
|
|
55
|
+
create table pk4 (k any collate nocase primary key, n integer);
|
|
56
|
+
insert into pk4 values ('Bob', 1);
|
|
57
|
+
insert into pk4 values ('BOB', 2);
|
|
58
|
+
-- error: UNIQUE constraint failed
|
|
59
|
+
select n from pk4 where k = 'BOB';
|
|
60
|
+
→ [{"n":1}]
|
|
61
|
+
drop table pk4;
|
|
62
|
+
|
|
63
|
+
create table u4 (id integer primary key, v any collate nocase, unique (v));
|
|
64
|
+
insert into u4 values (1, 'Bob');
|
|
65
|
+
insert into u4 values (2, 'BOB');
|
|
66
|
+
-- error: UNIQUE constraint failed
|
|
67
|
+
select count(*) as cnt from u4;
|
|
68
|
+
→ [{"cnt":1}]
|
|
69
|
+
insert into u4 values (3, 'zed');
|
|
70
|
+
select count(distinct v) as dv from u4;
|
|
71
|
+
→ [{"dv":2}]
|
|
72
|
+
drop table u4;
|
|
73
|
+
|
|
74
|
+
-- Case 5: the identity paths — row DISTINCT, GROUP BY, aggregate DISTINCT, min/max
|
|
75
|
+
-- — all collapse case variants of an `any collate nocase` column, and an index does
|
|
76
|
+
-- not move any of those answers either.
|
|
77
|
+
create table t5 (id integer primary key, v any collate nocase);
|
|
78
|
+
insert into t5 values (1, 'Bob'), (2, 'BOB'), (3, 'zed');
|
|
79
|
+
select distinct v from t5 order by v;
|
|
80
|
+
→ [{"v":"Bob"},{"v":"zed"}]
|
|
81
|
+
select v, count(*) as n from t5 group by v order by v;
|
|
82
|
+
→ [{"v":"Bob","n":2},{"v":"zed","n":1}]
|
|
83
|
+
select count(distinct v) as dv, min(v) as lo, max(v) as hi from t5;
|
|
84
|
+
→ [{"dv":2,"lo":"Bob","hi":"zed"}]
|
|
85
|
+
create index ix5 on t5 (v);
|
|
86
|
+
select distinct v from t5 order by v;
|
|
87
|
+
→ [{"v":"Bob"},{"v":"zed"}]
|
|
88
|
+
select v, count(*) as n from t5 group by v order by v;
|
|
89
|
+
→ [{"v":"Bob","n":2},{"v":"zed","n":1}]
|
|
90
|
+
select count(distinct v) as dv, min(v) as lo, max(v) as hi from t5;
|
|
91
|
+
→ [{"dv":2,"lo":"Bob","hi":"zed"}]
|
|
92
|
+
drop table t5;
|