@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,305 @@
|
|
|
1
|
+
-- 102.2.1-unique-collation-index-derived.sqllogic — UNIQUE whose collation comes from a
|
|
2
|
+
-- standalone `create unique index`, not from the column declaration.
|
|
3
|
+
--
|
|
4
|
+
-- requires-capability: standalone-index-ddl
|
|
5
|
+
--
|
|
6
|
+
-- Carved out of 102.2-unique-collation: §§1-8 there prove the same collation ground
|
|
7
|
+
-- (auto-index enforcement, OR IGNORE/OR REPLACE, covering-MV path, RTRIM, composite
|
|
8
|
+
-- members, UPDATE, lowercase spelling) using only inline / table-level `unique`, and
|
|
9
|
+
-- are a complete self-sufficient subset. Everything below needs an explicit
|
|
10
|
+
-- `create unique index … collate …`, which is the only way to give a UNIQUE a
|
|
11
|
+
-- collation that differs from its column's.
|
|
12
|
+
--
|
|
13
|
+
-- Runs under BOTH the memory module (`yarn test`) and the store module
|
|
14
|
+
-- (`yarn test:store`). §1 (was §9) exercises the index-derived shapes (finer / coarser /
|
|
15
|
+
-- plain index) through the plain per-scan / auto-index path. §2 (was §10) reruns them
|
|
16
|
+
-- through a row-time covering MV, where the collation eligibility gate
|
|
17
|
+
-- (`covering-mv-index-derived-unique-collation`) keeps an MV only when the index
|
|
18
|
+
-- collation is coarser-or-equal to the declared column collation per column. §3 (was §11)
|
|
19
|
+
-- covers two UNIQUE indexes over the SAME column-set with differing collations: each
|
|
20
|
+
-- derived constraint enforces under ITS OWN index's collation in BOTH creation orders
|
|
21
|
+
-- (`memory-multi-index-unique-collation-resolution`). §4 (was §12) covers a NON-derived
|
|
22
|
+
-- (table-level / column) UNIQUE coexisting with a FINER same-column-set
|
|
23
|
+
-- `create unique index`: the non-derived UNIQUE enforces under its DECLARED collation
|
|
24
|
+
-- in BOTH creation orders, the user's finer index keeps enforcing its own uniqueness,
|
|
25
|
+
-- and dropping the non-derived constraint leaves the user index intact
|
|
26
|
+
-- (`memory-nonderived-unique-reused-finer-index-under-enforcement`). §5 (was §13) covers
|
|
27
|
+
-- conflict resolution (OR REPLACE / OR IGNORE) over those two coexisting structures:
|
|
28
|
+
-- a conflict on one is not a false conflict on the other, and OR REPLACE evicts
|
|
29
|
+
-- exactly the row the conflicting structure identifies.
|
|
30
|
+
--
|
|
31
|
+
-- Section numbers below keep their original 9-13 labels so cross-references from
|
|
32
|
+
-- 102.2 and from the source tickets still resolve.
|
|
33
|
+
|
|
34
|
+
-- ===================================
|
|
35
|
+
-- 9. Index-derived UNIQUE enforces under the INDEX's per-column collation, not
|
|
36
|
+
-- the column's declared collation. A `create unique index … (col collate x)`
|
|
37
|
+
-- carries its own comparator; both modules enforce through it (memory's
|
|
38
|
+
-- checkUniqueViaIndex / the store's findUniqueConflict, both now resolving the
|
|
39
|
+
-- index per-column collation). Run through the plain per-scan / auto-index
|
|
40
|
+
-- path (no covering MV), where memory and store provably agree.
|
|
41
|
+
-- (store-index-derived-unique-honors-index-collation.)
|
|
42
|
+
-- ===================================
|
|
43
|
+
|
|
44
|
+
-- 9a. FINER index (BINARY) over a NOCASE column ADMITS both case-variants — the
|
|
45
|
+
-- NOCASE column would unify 'Bob'/'bob' but the BINARY index keeps them apart.
|
|
46
|
+
create table fai (id integer primary key, b text collate NOCASE);
|
|
47
|
+
create unique index fai_b on fai (b collate BINARY);
|
|
48
|
+
insert into fai values (1, 'Bob');
|
|
49
|
+
insert into fai values (2, 'bob');
|
|
50
|
+
select id, b from fai order by id;
|
|
51
|
+
→ [{"id":1,"b":"Bob"},{"id":2,"b":"bob"}]
|
|
52
|
+
|
|
53
|
+
-- a genuine BINARY duplicate is still rejected (guard against under-matching)
|
|
54
|
+
insert into fai values (3, 'bob');
|
|
55
|
+
-- error: UNIQUE constraint failed
|
|
56
|
+
|
|
57
|
+
select count(*) as n from fai;
|
|
58
|
+
→ [{"n":2}]
|
|
59
|
+
|
|
60
|
+
-- 9b. COARSER index (NOCASE) over a BINARY column UNIFIES case-variants — the
|
|
61
|
+
-- BINARY column would keep 'Bob'/'BOB' distinct but the NOCASE index folds them.
|
|
62
|
+
create table cbi (id integer primary key, b text);
|
|
63
|
+
create unique index cbi_b on cbi (b collate NOCASE);
|
|
64
|
+
insert into cbi values (1, 'Bob');
|
|
65
|
+
insert into cbi values (2, 'BOB');
|
|
66
|
+
-- error: UNIQUE constraint failed
|
|
67
|
+
|
|
68
|
+
select count(*) as n from cbi;
|
|
69
|
+
→ [{"n":1}]
|
|
70
|
+
|
|
71
|
+
-- a genuinely different value still inserts
|
|
72
|
+
insert into cbi values (3, 'Carol');
|
|
73
|
+
select id, b from cbi order by id;
|
|
74
|
+
→ [{"id":1,"b":"Bob"},{"id":3,"b":"Carol"}]
|
|
75
|
+
|
|
76
|
+
-- 9c. A plain `create unique index` (no per-column COLLATE) falls back to the
|
|
77
|
+
-- column's declared collation — a NOCASE column's index still folds case.
|
|
78
|
+
create table pgi (id integer primary key, b text collate NOCASE);
|
|
79
|
+
create unique index pgi_b on pgi (b);
|
|
80
|
+
insert into pgi values (1, 'Bob');
|
|
81
|
+
insert into pgi values (2, 'bob');
|
|
82
|
+
-- error: UNIQUE constraint failed
|
|
83
|
+
|
|
84
|
+
select count(*) as n from pgi;
|
|
85
|
+
→ [{"n":1}]
|
|
86
|
+
|
|
87
|
+
-- ===================================
|
|
88
|
+
-- 10. Index-derived UNIQUE through a row-time COVERING MV. Parallels §9's per-scan
|
|
89
|
+
-- shapes but with a covering MV linked, so the collation eligibility gate decides
|
|
90
|
+
-- whether enforcement routes through the MV (BINARY-floor / equal collation) or
|
|
91
|
+
-- falls back to the per-scan / auto-index path (finer/incomparable index). Both
|
|
92
|
+
-- paths honor the INDEX per-column collation, so memory and store agree on each
|
|
93
|
+
-- module (covering-mv-index-derived-unique-collation).
|
|
94
|
+
-- ===================================
|
|
95
|
+
|
|
96
|
+
-- 10a. FINER index (BINARY) over a NOCASE column + covering MV → eligible (I=BINARY
|
|
97
|
+
-- floor). The candidate set is a superset; re-validation under BINARY admits both
|
|
98
|
+
-- case-variants 'Bob'/'bob'. A genuine BINARY duplicate is still rejected.
|
|
99
|
+
create table fam (id integer primary key, b text collate NOCASE);
|
|
100
|
+
create unique index fam_b on fam (b collate BINARY);
|
|
101
|
+
create materialized view fam_mv as select b, id from fam order by b;
|
|
102
|
+
insert into fam values (1, 'Bob');
|
|
103
|
+
insert into fam values (2, 'bob');
|
|
104
|
+
select id, b from fam order by id;
|
|
105
|
+
→ [{"id":1,"b":"Bob"},{"id":2,"b":"bob"}]
|
|
106
|
+
|
|
107
|
+
insert into fam values (3, 'bob');
|
|
108
|
+
-- error: UNIQUE constraint failed
|
|
109
|
+
|
|
110
|
+
select count(*) as n from fam;
|
|
111
|
+
→ [{"n":2}]
|
|
112
|
+
|
|
113
|
+
-- 10b. COARSER index (NOCASE) over a BINARY column + covering MV → declined (I=NOCASE,
|
|
114
|
+
-- D=BINARY). Enforcement falls back to the per-scan / auto-index path under the
|
|
115
|
+
-- index NOCASE, so 'BOB' after 'Bob' is rejected (the silent miss the gate closes).
|
|
116
|
+
create table cbm (id integer primary key, b text);
|
|
117
|
+
create unique index cbm_b on cbm (b collate NOCASE);
|
|
118
|
+
create materialized view cbm_mv as select b, id from cbm order by b;
|
|
119
|
+
insert into cbm values (1, 'Bob');
|
|
120
|
+
insert into cbm values (2, 'BOB');
|
|
121
|
+
-- error: UNIQUE constraint failed
|
|
122
|
+
|
|
123
|
+
select count(*) as n from cbm;
|
|
124
|
+
→ [{"n":1}]
|
|
125
|
+
|
|
126
|
+
-- a genuinely different value still inserts through the per-scan path
|
|
127
|
+
insert into cbm values (3, 'Carol');
|
|
128
|
+
select id, b from cbm order by id;
|
|
129
|
+
→ [{"id":1,"b":"Bob"},{"id":3,"b":"Carol"}]
|
|
130
|
+
|
|
131
|
+
-- 10c. PLAIN index (no per-column COLLATE) over a NOCASE column + covering MV →
|
|
132
|
+
-- eligible (I falls back to D=NOCASE ⇒ equal). Unchanged NOCASE folding (mirrors §4).
|
|
133
|
+
create table pgm (id integer primary key, b text collate NOCASE);
|
|
134
|
+
create unique index pgm_b on pgm (b);
|
|
135
|
+
create materialized view pgm_mv as select b, id from pgm order by b;
|
|
136
|
+
insert into pgm values (1, 'Bob');
|
|
137
|
+
insert into pgm values (2, 'bob');
|
|
138
|
+
-- error: UNIQUE constraint failed
|
|
139
|
+
|
|
140
|
+
select count(*) as n from pgm;
|
|
141
|
+
→ [{"n":1}]
|
|
142
|
+
|
|
143
|
+
-- a non-NOCASE-equal value still inserts through the covering path
|
|
144
|
+
insert into pgm values (3, 'abd');
|
|
145
|
+
select id, b from pgm order by id;
|
|
146
|
+
→ [{"id":1,"b":"Bob"},{"id":3,"b":"abd"}]
|
|
147
|
+
|
|
148
|
+
-- ===================================
|
|
149
|
+
-- 11. TWO UNIQUE indexes over the SAME column-set with DIFFERING collations. Each
|
|
150
|
+
-- index-derived UNIQUE must enforce under ITS OWN index's collation, regardless
|
|
151
|
+
-- of the order the indexes were created in. memory's findIndexForConstraint now
|
|
152
|
+
-- resolves the enforcing index BY NAME (uc.derivedFromIndex), not the FIRST
|
|
153
|
+
-- same-column-set index, so the coarser (NOCASE) UNIQUE rejects a case-variant
|
|
154
|
+
-- duplicate in BOTH creation orders while the finer (BINARY) UNIQUE keeps
|
|
155
|
+
-- genuine byte-distinct values apart. On main the BINARY-first order silently
|
|
156
|
+
-- ADMITTED the NOCASE duplicate (the order-sensitive under-enforcement bug,
|
|
157
|
+
-- memory-multi-index-unique-collation-resolution); store already rejected both.
|
|
158
|
+
-- ===================================
|
|
159
|
+
|
|
160
|
+
-- 11a. BINARY index created FIRST, then NOCASE. The NOCASE UNIQUE still catches a
|
|
161
|
+
-- case-variant duplicate — index order no longer decides the enforcing collation.
|
|
162
|
+
create table mbf (id integer primary key, b text collate NOCASE);
|
|
163
|
+
create unique index mbf_binary on mbf (b collate BINARY);
|
|
164
|
+
create unique index mbf_nocase on mbf (b collate NOCASE);
|
|
165
|
+
insert into mbf values (1, 'Bob');
|
|
166
|
+
|
|
167
|
+
-- 'bob' is BINARY-distinct from 'Bob' but NOCASE-equal → the NOCASE UNIQUE rejects it
|
|
168
|
+
insert into mbf values (2, 'bob');
|
|
169
|
+
-- error: UNIQUE constraint failed
|
|
170
|
+
|
|
171
|
+
select count(*) as n from mbf;
|
|
172
|
+
→ [{"n":1}]
|
|
173
|
+
|
|
174
|
+
-- a genuinely distinct value (neither NOCASE- nor BINARY-equal) still inserts — the
|
|
175
|
+
-- finer BINARY index keys byte-distinct values apart without raising a false conflict
|
|
176
|
+
insert into mbf values (3, 'Carol');
|
|
177
|
+
select id, b from mbf order by id;
|
|
178
|
+
→ [{"id":1,"b":"Bob"},{"id":3,"b":"Carol"}]
|
|
179
|
+
|
|
180
|
+
-- 11b. Reverse creation order: NOCASE FIRST, then BINARY. Same enforcement — the
|
|
181
|
+
-- NOCASE UNIQUE rejects the case-variant regardless of index order.
|
|
182
|
+
create table mnf (id integer primary key, b text collate NOCASE);
|
|
183
|
+
create unique index mnf_nocase on mnf (b collate NOCASE);
|
|
184
|
+
create unique index mnf_binary on mnf (b collate BINARY);
|
|
185
|
+
insert into mnf values (1, 'Bob');
|
|
186
|
+
|
|
187
|
+
insert into mnf values (2, 'bob');
|
|
188
|
+
-- error: UNIQUE constraint failed
|
|
189
|
+
|
|
190
|
+
select count(*) as n from mnf;
|
|
191
|
+
→ [{"n":1}]
|
|
192
|
+
|
|
193
|
+
insert into mnf values (3, 'Carol');
|
|
194
|
+
select id, b from mnf order by id;
|
|
195
|
+
→ [{"id":1,"b":"Bob"},{"id":3,"b":"Carol"}]
|
|
196
|
+
|
|
197
|
+
-- ===================================
|
|
198
|
+
-- 12. A NON-derived (table-level / column) UNIQUE coexisting with a FINER
|
|
199
|
+
-- same-column-set `create unique index`. The non-derived UNIQUE enforces under
|
|
200
|
+
-- its DECLARED column collation (NOCASE) regardless of DDL order — the memory
|
|
201
|
+
-- module no longer reuses or resolves onto the finer (BINARY) user index, which
|
|
202
|
+
-- would silently ADMIT a NOCASE duplicate. The user's BINARY index keeps
|
|
203
|
+
-- enforcing its OWN (byte-exact) uniqueness, and dropping the non-derived
|
|
204
|
+
-- constraint leaves that index intact. On main the index-first order under-enforced
|
|
205
|
+
-- (count went to 2); store already rejected both orders.
|
|
206
|
+
-- (memory-nonderived-unique-reused-finer-index-under-enforcement.)
|
|
207
|
+
-- ===================================
|
|
208
|
+
|
|
209
|
+
-- 12a. INDEX created FIRST, then `alter table … add constraint uq unique (b)` over a
|
|
210
|
+
-- NOCASE column. The NOCASE UNIQUE rejects a case-variant duplicate that the
|
|
211
|
+
-- finer BINARY index alone would have admitted — the bug this fix closes.
|
|
212
|
+
create table mif (id integer primary key, b text collate NOCASE);
|
|
213
|
+
create unique index mif_binary on mif (b collate BINARY);
|
|
214
|
+
alter table mif add constraint uq unique (b);
|
|
215
|
+
insert into mif values (1, 'Bob');
|
|
216
|
+
|
|
217
|
+
-- 'bob' is BINARY-distinct from 'Bob' but NOCASE-equal → the non-derived NOCASE UNIQUE rejects it
|
|
218
|
+
insert into mif values (2, 'bob');
|
|
219
|
+
-- error: UNIQUE constraint failed
|
|
220
|
+
|
|
221
|
+
select count(*) as n from mif;
|
|
222
|
+
→ [{"n":1}]
|
|
223
|
+
|
|
224
|
+
-- a genuinely distinct value (neither NOCASE- nor BINARY-equal) still inserts (guard against over-matching)
|
|
225
|
+
insert into mif values (3, 'Carol');
|
|
226
|
+
select id, b from mif order by id;
|
|
227
|
+
→ [{"id":1,"b":"Bob"},{"id":3,"b":"Carol"}]
|
|
228
|
+
|
|
229
|
+
-- 12b. CONSTRAINT created FIRST (table-level `unique (b)`), THEN the finer index —
|
|
230
|
+
-- order-independence. Same NOCASE enforcement.
|
|
231
|
+
create table mcf (id integer primary key, b text collate NOCASE, unique (b));
|
|
232
|
+
create unique index mcf_binary on mcf (b collate BINARY);
|
|
233
|
+
insert into mcf values (1, 'Bob');
|
|
234
|
+
|
|
235
|
+
insert into mcf values (2, 'bob');
|
|
236
|
+
-- error: UNIQUE constraint failed
|
|
237
|
+
|
|
238
|
+
select count(*) as n from mcf;
|
|
239
|
+
→ [{"n":1}]
|
|
240
|
+
|
|
241
|
+
insert into mcf values (3, 'Carol');
|
|
242
|
+
select id, b from mcf order by id;
|
|
243
|
+
→ [{"id":1,"b":"Bob"},{"id":3,"b":"Carol"}]
|
|
244
|
+
|
|
245
|
+
-- 12c. Lifecycle: dropping the non-derived NOCASE UNIQUE leaves the user's BINARY
|
|
246
|
+
-- index (`mif_binary`) enforcing its own uniqueness. A NOCASE-variant is now
|
|
247
|
+
-- ADMITTED (only BINARY enforces, keeping case-variants apart) while a genuine
|
|
248
|
+
-- byte-exact duplicate is still rejected — proof the user index survived the drop.
|
|
249
|
+
alter table mif drop constraint uq;
|
|
250
|
+
|
|
251
|
+
-- NOCASE folding gone: 'BOB' is BINARY-distinct from existing 'Bob'/'Carol' → admitted
|
|
252
|
+
insert into mif values (4, 'BOB');
|
|
253
|
+
select id, b from mif order by id;
|
|
254
|
+
→ [{"id":1,"b":"Bob"},{"id":3,"b":"Carol"},{"id":4,"b":"BOB"}]
|
|
255
|
+
|
|
256
|
+
-- but a byte-exact duplicate of 'Bob' is still rejected by the surviving BINARY index
|
|
257
|
+
insert into mif values (5, 'Bob');
|
|
258
|
+
-- error: UNIQUE constraint failed
|
|
259
|
+
|
|
260
|
+
select count(*) as n from mif;
|
|
261
|
+
→ [{"n":3}]
|
|
262
|
+
|
|
263
|
+
-- ===================================
|
|
264
|
+
-- 13. Conflict resolution (OR REPLACE / OR IGNORE) with the TWO coexisting unique
|
|
265
|
+
-- structures the §12 fix produces: a NOCASE non-derived UNIQUE (`uq`) and a
|
|
266
|
+
-- FINER BINARY user index (`ixb`). The two enforce DIFFERENT equivalences, so a
|
|
267
|
+
-- conflict on one must not be a false conflict on the other, and OR REPLACE must
|
|
268
|
+
-- evict exactly the row the conflicting structure identifies. Runs under memory
|
|
269
|
+
-- AND store (cross-module conformance with SQLite).
|
|
270
|
+
-- (memory-nonderived-unique-reused-finer-index-under-enforcement, review.)
|
|
271
|
+
-- ===================================
|
|
272
|
+
|
|
273
|
+
create table p (id integer primary key, b text collate nocase);
|
|
274
|
+
create unique index ixb on p (b collate binary);
|
|
275
|
+
alter table p add constraint uq unique (b);
|
|
276
|
+
insert into p values (1, 'Bob');
|
|
277
|
+
|
|
278
|
+
-- OR REPLACE on 'bob': NOCASE-dup of 'Bob' but BINARY-distinct → the NOCASE UNIQUE
|
|
279
|
+
-- drives the conflict and evicts id=1; the BINARY index raises no false conflict.
|
|
280
|
+
insert or replace into p values (2, 'bob');
|
|
281
|
+
select id, b from p order by id;
|
|
282
|
+
→ [{"id":2,"b":"bob"}]
|
|
283
|
+
|
|
284
|
+
-- OR IGNORE on 'BOB': NOCASE-dup of the surviving 'bob' → ignored, table unchanged.
|
|
285
|
+
insert or ignore into p values (3, 'BOB');
|
|
286
|
+
select id, b from p order by id;
|
|
287
|
+
→ [{"id":2,"b":"bob"}]
|
|
288
|
+
|
|
289
|
+
-- OR REPLACE byte-exact dup of 'bob' → BOTH structures conflict on the SAME row id=2;
|
|
290
|
+
-- it is evicted once and the new row inserted (no double-evict error).
|
|
291
|
+
insert or replace into p values (4, 'bob');
|
|
292
|
+
select id, b from p order by id;
|
|
293
|
+
→ [{"id":4,"b":"bob"}]
|
|
294
|
+
|
|
295
|
+
-- OR REPLACE where the NOCASE structure conflicts on one row while a DIFFERENT row
|
|
296
|
+
-- stays clear of both: 'Cat' NOCASE-matches 'cat' (id=1); 'DOG' is BINARY- and
|
|
297
|
+
-- NOCASE-distinct → only id=1 is evicted, id=2 survives.
|
|
298
|
+
create table q (id integer primary key, b text collate nocase);
|
|
299
|
+
create unique index qixb on q (b collate binary);
|
|
300
|
+
alter table q add constraint uq2 unique (b);
|
|
301
|
+
insert into q values (1, 'cat');
|
|
302
|
+
insert into q values (2, 'DOG');
|
|
303
|
+
insert or replace into q values (3, 'Cat');
|
|
304
|
+
select id, b from q order by id;
|
|
305
|
+
→ [{"id":2,"b":"DOG"},{"id":3,"b":"Cat"}]
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
-- database-options-edge-cases.sqllogic - Pragma edge cases and option handling
|
|
2
|
+
|
|
3
|
+
-- ===================================
|
|
4
|
+
-- PRAGMA default_vtab_module
|
|
5
|
+
-- ===================================
|
|
6
|
+
|
|
7
|
+
-- Default should be 'memory'
|
|
8
|
+
PRAGMA default_vtab_module;
|
|
9
|
+
→ [{"name": "default_vtab_module", "value": "memory"}]
|
|
10
|
+
|
|
11
|
+
-- Set to 'memory' explicitly (same value, should be no-op)
|
|
12
|
+
PRAGMA default_vtab_module = 'memory';
|
|
13
|
+
-- run
|
|
14
|
+
|
|
15
|
+
PRAGMA default_vtab_module;
|
|
16
|
+
→ [{"name": "default_vtab_module", "value": "memory"}]
|
|
17
|
+
|
|
18
|
+
-- ===================================
|
|
19
|
+
-- PRAGMA schema_path basics
|
|
20
|
+
-- ===================================
|
|
21
|
+
|
|
22
|
+
-- Default should be 'main'
|
|
23
|
+
PRAGMA schema_path;
|
|
24
|
+
→ [{"name": "schema_path", "value": "main"}]
|
|
25
|
+
|
|
26
|
+
-- Set and read back
|
|
27
|
+
PRAGMA schema_path = 'main,temp';
|
|
28
|
+
|
|
29
|
+
PRAGMA schema_path;
|
|
30
|
+
→ [{"name": "schema_path", "value": "main,temp"}]
|
|
31
|
+
|
|
32
|
+
-- Reset
|
|
33
|
+
PRAGMA schema_path = 'main';
|
|
34
|
+
-- run
|
|
35
|
+
|
|
36
|
+
-- ===================================
|
|
37
|
+
-- Invalid pragma names
|
|
38
|
+
-- ===================================
|
|
39
|
+
|
|
40
|
+
PRAGMA nonexistent_pragma;
|
|
41
|
+
-- error: Unknown pragma
|
|
42
|
+
|
|
43
|
+
PRAGMA nonexistent_pragma = 'value';
|
|
44
|
+
-- error: Unknown pragma
|
|
45
|
+
|
|
46
|
+
-- ===================================
|
|
47
|
+
-- Boolean pragma values (various forms)
|
|
48
|
+
-- ===================================
|
|
49
|
+
|
|
50
|
+
-- Create a table to use for testing
|
|
51
|
+
CREATE TABLE pragma_test (id INTEGER PRIMARY KEY, val TEXT);
|
|
52
|
+
|
|
53
|
+
-- Test boolean conversion forms via PRAGMA (using known boolean pragmas)
|
|
54
|
+
-- The exact boolean pragmas depend on what's registered, but we can test
|
|
55
|
+
-- that the system handles queries correctly after pragma changes
|
|
56
|
+
|
|
57
|
+
INSERT INTO pragma_test VALUES (1, 'test');
|
|
58
|
+
|
|
59
|
+
SELECT * FROM pragma_test;
|
|
60
|
+
→ [{"id": 1, "val": "test"}]
|
|
61
|
+
|
|
62
|
+
DROP TABLE pragma_test;
|
|
63
|
+
|
|
64
|
+
-- ===================================
|
|
65
|
+
-- Multiple pragmas in sequence
|
|
66
|
+
-- ===================================
|
|
67
|
+
|
|
68
|
+
PRAGMA schema_path = 'main';
|
|
69
|
+
PRAGMA default_vtab_module = 'memory';
|
|
70
|
+
-- run
|
|
71
|
+
|
|
72
|
+
PRAGMA schema_path;
|
|
73
|
+
→ [{"name": "schema_path", "value": "main"}]
|
|
74
|
+
|
|
75
|
+
PRAGMA default_vtab_module;
|
|
76
|
+
→ [{"name": "default_vtab_module", "value": "memory"}]
|
|
77
|
+
|
|
78
|
+
-- ===================================
|
|
79
|
+
-- table_info on various table shapes
|
|
80
|
+
-- ===================================
|
|
81
|
+
|
|
82
|
+
-- Simple table
|
|
83
|
+
CREATE TABLE pi_simple (id INTEGER PRIMARY KEY, name TEXT);
|
|
84
|
+
|
|
85
|
+
SELECT name, type, pk FROM table_info('pi_simple') ORDER BY cid;
|
|
86
|
+
→ [{"name": "id", "type": "INTEGER", "pk": 1}, {"name": "name", "type": "TEXT", "pk": 0}]
|
|
87
|
+
|
|
88
|
+
DROP TABLE pi_simple;
|
|
89
|
+
|
|
90
|
+
-- Table with many column types
|
|
91
|
+
CREATE TABLE pi_types (
|
|
92
|
+
a INTEGER PRIMARY KEY,
|
|
93
|
+
b TEXT NOT NULL,
|
|
94
|
+
c REAL,
|
|
95
|
+
d BLOB
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
SELECT name, type, pk FROM table_info('pi_types') ORDER BY cid;
|
|
99
|
+
→ [{"name": "a", "type": "INTEGER", "pk": 1}, {"name": "b", "type": "TEXT", "pk": 0}, {"name": "c", "type": "REAL", "pk": 0}, {"name": "d", "type": "BLOB", "pk": 0}]
|
|
100
|
+
|
|
101
|
+
DROP TABLE pi_types;
|
|
102
|
+
|
|
103
|
+
-- ===================================
|
|
104
|
+
-- table_info on non-existent table should error
|
|
105
|
+
-- ===================================
|
|
106
|
+
|
|
107
|
+
SELECT * FROM table_info('does_not_exist');
|
|
108
|
+
-- error: not found
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
-- pragma-boolean-values.sqllogic - PRAGMA boolean value bareword parsing
|
|
2
|
+
--
|
|
3
|
+
-- Regression coverage for the `on`/`off` bareword spellings of a boolean
|
|
4
|
+
-- pragma value. `on` lexes as the JOIN keyword (TokenType.ON), while `off`
|
|
5
|
+
-- is not a reserved word at all -- so `pragma foreign_keys = off` always
|
|
6
|
+
-- parsed fine, but `pragma foreign_keys = on` used to throw a misleading
|
|
7
|
+
-- "'ON' must follow a JOIN" parse error. The fix accepts any
|
|
8
|
+
-- CONTEXTUAL_KEYWORDS-listed bareword (not just `on`) as a name/value item.
|
|
9
|
+
|
|
10
|
+
-- Default is true
|
|
11
|
+
PRAGMA foreign_keys;
|
|
12
|
+
→ [{"name": "foreign_keys", "value": true}]
|
|
13
|
+
|
|
14
|
+
-- ===================================
|
|
15
|
+
-- off (never broken; regression guard)
|
|
16
|
+
-- ===================================
|
|
17
|
+
|
|
18
|
+
PRAGMA foreign_keys = off;
|
|
19
|
+
-- run
|
|
20
|
+
|
|
21
|
+
PRAGMA foreign_keys;
|
|
22
|
+
→ [{"name": "foreign_keys", "value": false}]
|
|
23
|
+
|
|
24
|
+
-- ===================================
|
|
25
|
+
-- on (the bug: used to throw a JOIN parse error)
|
|
26
|
+
-- ===================================
|
|
27
|
+
|
|
28
|
+
PRAGMA foreign_keys = on;
|
|
29
|
+
-- run
|
|
30
|
+
|
|
31
|
+
PRAGMA foreign_keys;
|
|
32
|
+
→ [{"name": "foreign_keys", "value": true}]
|
|
33
|
+
|
|
34
|
+
-- ===================================
|
|
35
|
+
-- Case-insensitivity
|
|
36
|
+
-- ===================================
|
|
37
|
+
|
|
38
|
+
PRAGMA foreign_keys = OFF;
|
|
39
|
+
-- run
|
|
40
|
+
|
|
41
|
+
PRAGMA foreign_keys;
|
|
42
|
+
→ [{"name": "foreign_keys", "value": false}]
|
|
43
|
+
|
|
44
|
+
PRAGMA foreign_keys = On;
|
|
45
|
+
-- run
|
|
46
|
+
|
|
47
|
+
PRAGMA foreign_keys;
|
|
48
|
+
→ [{"name": "foreign_keys", "value": true}]
|
|
49
|
+
|
|
50
|
+
-- ===================================
|
|
51
|
+
-- Quoted string forms
|
|
52
|
+
-- ===================================
|
|
53
|
+
|
|
54
|
+
PRAGMA foreign_keys = 'off';
|
|
55
|
+
-- run
|
|
56
|
+
|
|
57
|
+
PRAGMA foreign_keys;
|
|
58
|
+
→ [{"name": "foreign_keys", "value": false}]
|
|
59
|
+
|
|
60
|
+
PRAGMA foreign_keys = 'on';
|
|
61
|
+
-- run
|
|
62
|
+
|
|
63
|
+
PRAGMA foreign_keys;
|
|
64
|
+
→ [{"name": "foreign_keys", "value": true}]
|
|
65
|
+
|
|
66
|
+
-- ===================================
|
|
67
|
+
-- Numeric and TRUE/FALSE forms (regression guard)
|
|
68
|
+
-- ===================================
|
|
69
|
+
|
|
70
|
+
PRAGMA foreign_keys = 0;
|
|
71
|
+
-- run
|
|
72
|
+
|
|
73
|
+
PRAGMA foreign_keys;
|
|
74
|
+
→ [{"name": "foreign_keys", "value": false}]
|
|
75
|
+
|
|
76
|
+
PRAGMA foreign_keys = 1;
|
|
77
|
+
-- run
|
|
78
|
+
|
|
79
|
+
PRAGMA foreign_keys;
|
|
80
|
+
→ [{"name": "foreign_keys", "value": true}]
|
|
81
|
+
|
|
82
|
+
PRAGMA foreign_keys = false;
|
|
83
|
+
-- run
|
|
84
|
+
|
|
85
|
+
PRAGMA foreign_keys;
|
|
86
|
+
→ [{"name": "foreign_keys", "value": false}]
|
|
87
|
+
|
|
88
|
+
PRAGMA foreign_keys = true;
|
|
89
|
+
-- run
|
|
90
|
+
|
|
91
|
+
PRAGMA foreign_keys;
|
|
92
|
+
→ [{"name": "foreign_keys", "value": true}]
|
|
93
|
+
|
|
94
|
+
-- ===================================
|
|
95
|
+
-- Another boolean pragma on the same grammar path
|
|
96
|
+
-- ===================================
|
|
97
|
+
|
|
98
|
+
PRAGMA runtime_fuse_scalars = off;
|
|
99
|
+
-- run
|
|
100
|
+
|
|
101
|
+
PRAGMA runtime_fuse_scalars;
|
|
102
|
+
→ [{"name": "runtime_fuse_scalars", "value": false}]
|
|
103
|
+
|
|
104
|
+
PRAGMA runtime_fuse_scalars = on;
|
|
105
|
+
-- run
|
|
106
|
+
|
|
107
|
+
PRAGMA runtime_fuse_scalars;
|
|
108
|
+
→ [{"name": "runtime_fuse_scalars", "value": true}]
|
|
109
|
+
|
|
110
|
+
-- ===================================
|
|
111
|
+
-- Generality: any CONTEXTUAL_KEYWORDS bareword is a value, not just `on`.
|
|
112
|
+
-- A string-typed pragma stores it verbatim (no boolean conversion involved).
|
|
113
|
+
-- ===================================
|
|
114
|
+
|
|
115
|
+
PRAGMA schema_path = key;
|
|
116
|
+
-- run
|
|
117
|
+
|
|
118
|
+
PRAGMA schema_path;
|
|
119
|
+
→ [{"name": "schema_path", "value": "key"}]
|
|
120
|
+
|
|
121
|
+
-- Reset
|
|
122
|
+
PRAGMA schema_path = 'main';
|
|
123
|
+
-- run
|
|
124
|
+
|
|
125
|
+
PRAGMA schema_path;
|
|
126
|
+
→ [{"name": "schema_path", "value": "main"}]
|