@quereus/quereus 4.20.1 → 4.20.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/src/schema/schema-differ.d.ts.map +1 -1
- package/dist/src/schema/schema-differ.js +17 -69
- package/dist/src/schema/schema-differ.js.map +1 -1
- package/package.json +7 -4
- package/test/README.md +173 -0
- package/test/logic/01-basic.sqllogic +39 -0
- package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
- package/test/logic/01.2-strings.sqllogic +43 -0
- package/test/logic/01.5-insert-select.sqllogic +237 -0
- package/test/logic/01.6-update-extras.sqllogic +118 -0
- package/test/logic/01.7-update-from.sqllogic +67 -0
- package/test/logic/01.8-delete-extras.sqllogic +122 -0
- package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
- package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
- package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
- package/test/logic/01.9-query-expr-values.sqllogic +111 -0
- package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
- package/test/logic/02-filters.sqllogic +54 -0
- package/test/logic/02-smoke.sqllogic +62 -0
- package/test/logic/02.1-bind-parameters.sqllogic +223 -0
- package/test/logic/03-expressions.sqllogic +190 -0
- package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
- package/test/logic/03.4-defaults.sqllogic +554 -0
- package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
- package/test/logic/03.5-tvf.sqllogic +61 -0
- package/test/logic/03.6-type-system.sqllogic +544 -0
- package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
- package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
- package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
- package/test/logic/03.8-not-precedence.sqllogic +255 -0
- package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
- package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
- package/test/logic/04-order-by.sqllogic +38 -0
- package/test/logic/04-transactions.sqllogic +239 -0
- package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
- package/test/logic/05-vtab_memory.sqllogic +50 -0
- package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
- package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
- package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
- package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
- package/test/logic/06-builtin_functions.sqllogic +149 -0
- package/test/logic/06.1-string-functions.sqllogic +92 -0
- package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
- package/test/logic/06.2-math-functions.sqllogic +82 -0
- package/test/logic/06.3-schema.sqllogic +48 -0
- package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
- package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
- package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
- package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
- package/test/logic/06.3.4-view-info.sqllogic +378 -0
- package/test/logic/06.3.5-column-info.sqllogic +347 -0
- package/test/logic/06.3.6-schema-views.sqllogic +29 -0
- package/test/logic/06.4-schema-search-path.sqllogic +354 -0
- package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
- package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
- package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
- package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
- package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
- package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
- package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
- package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
- package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
- package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
- package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
- package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
- package/test/logic/06.7-json-extended.sqllogic +53 -0
- package/test/logic/06.8-json-path-operators.sqllogic +99 -0
- package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
- package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
- package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
- package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
- package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
- package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
- package/test/logic/07-aggregates.sqllogic +193 -0
- package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
- package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
- package/test/logic/07.3-group-by-extras.sqllogic +602 -0
- package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
- package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
- package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
- package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
- package/test/logic/07.5-window.sqllogic +1941 -0
- package/test/logic/07.5.1-window-named.sqllogic +13 -0
- package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
- package/test/logic/07.6-subqueries.sqllogic +78 -0
- package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
- package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
- package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
- package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
- package/test/logic/07.7.1-in-extras.sqllogic +158 -0
- package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
- package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
- package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
- package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
- package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
- package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
- package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
- package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
- package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
- package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
- package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
- package/test/logic/07.9-in-value-list.sqllogic +154 -0
- package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
- package/test/logic/08-views.sqllogic +64 -0
- package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
- package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
- package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
- package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
- package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
- package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
- package/test/logic/09-set_operations.sqllogic +244 -0
- package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
- package/test/logic/10-distinct_datatypes.sqllogic +127 -0
- package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
- package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
- package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
- package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
- package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
- package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
- package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
- package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
- package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
- package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
- package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
- package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
- package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
- package/test/logic/10.2-column-features.sqllogic +365 -0
- package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
- package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
- package/test/logic/10.3-function-features.sqllogic +247 -0
- package/test/logic/10.4-schema-scale.sqllogic +168 -0
- package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
- package/test/logic/10.5-indexes.sqllogic +164 -0
- package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
- package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
- package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
- package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
- package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
- package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
- package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
- package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
- package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
- package/test/logic/100.1-where-extras.sqllogic +163 -0
- package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
- package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
- package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
- package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
- package/test/logic/102-unique-constraints.sqllogic +145 -0
- package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
- package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
- package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
- package/test/logic/102.2-unique-collation.sqllogic +181 -0
- package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
- package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
- package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
- package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
- package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
- package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
- package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
- package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
- package/test/logic/108-cardinality-estimation.sqllogic +146 -0
- package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
- package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
- package/test/logic/11-joins.sqllogic +86 -0
- package/test/logic/11.1-join-using.sqllogic +267 -0
- package/test/logic/11.2-comma-join.sqllogic +35 -0
- package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
- package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
- package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
- package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
- package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
- package/test/logic/12-empty-primary-key.sqllogic +124 -0
- package/test/logic/12-join_padding_order.sqllogic +58 -0
- package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
- package/test/logic/13-cte.sqllogic +137 -0
- package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
- package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
- package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
- package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
- package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
- package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
- package/test/logic/13.4-cte-extras.sqllogic +98 -0
- package/test/logic/13.5-cte-join-order.sqllogic +166 -0
- package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
- package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
- package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
- package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
- package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
- package/test/logic/14-utilities.sqllogic +168 -0
- package/test/logic/15-timespan.sqllogic +279 -0
- package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
- package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
- package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
- package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
- package/test/logic/16-epoch.sqllogic +187 -0
- package/test/logic/17-weekday-modifier.sqllogic +78 -0
- package/test/logic/18-json-string-escapes.sqllogic +86 -0
- package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
- package/test/logic/20-empty-single-row.sqllogic +261 -0
- package/test/logic/21-null-edge-cases.sqllogic +227 -0
- package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
- package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
- package/test/logic/21.2-between-edges.sqllogic +157 -0
- package/test/logic/22-boundary-values.sqllogic +175 -0
- package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
- package/test/logic/24-builtin-branches.sqllogic +611 -0
- package/test/logic/24.1-substr-extras.sqllogic +75 -0
- package/test/logic/24.2-random-extras.sqllogic +39 -0
- package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
- package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
- package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
- package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
- package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
- package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
- package/test/logic/26-join-edge-cases.sqllogic +333 -0
- package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
- package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
- package/test/logic/26.3-join-on-constants.sqllogic +61 -0
- package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
- package/test/logic/27-window-edge-cases.sqllogic +206 -0
- package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
- package/test/logic/27.2-window-exclude.sqllogic +13 -0
- package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
- package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
- package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
- package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
- package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
- package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
- package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
- package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
- package/test/logic/40-constraints.sqllogic +418 -0
- package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
- package/test/logic/40.2-check-extras.sqllogic +683 -0
- package/test/logic/41-alter-table.sqllogic +191 -0
- package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
- package/test/logic/41-fk-cross-schema.sqllogic +155 -0
- package/test/logic/41-fk-extended-targets.sqllogic +173 -0
- package/test/logic/41-foreign-keys.sqllogic +1001 -0
- package/test/logic/41-generated-column-errors.sqllogic +225 -0
- package/test/logic/41-generated-column-extras.sqllogic +598 -0
- package/test/logic/41-generated-column-scope.sqllogic +329 -0
- package/test/logic/41-generated-columns.sqllogic +361 -0
- package/test/logic/41.1-alter-pk.sqllogic +230 -0
- package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
- package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
- package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
- package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
- package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
- package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
- package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
- package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
- package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
- package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
- package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
- package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
- package/test/logic/41.2-alter-column.sqllogic +382 -0
- package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
- package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
- package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
- package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
- package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
- package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
- package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
- package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
- package/test/logic/41.5-alter-misc.sqllogic +48 -0
- package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
- package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
- package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
- package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
- package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
- package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
- package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
- package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
- package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
- package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
- package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
- package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
- package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
- package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
- package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
- package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
- package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
- package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
- package/test/logic/42-committed-snapshot.sqllogic +254 -0
- package/test/logic/42-returning.sqllogic +159 -0
- package/test/logic/42.1-returning-extras.sqllogic +232 -0
- package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
- package/test/logic/43-default-nullability.sqllogic +131 -0
- package/test/logic/43-transition-constraints.sqllogic +341 -0
- package/test/logic/43.1-default-collation.sqllogic +140 -0
- package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
- package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
- package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
- package/test/logic/44-determinism-validation.sqllogic +164 -0
- package/test/logic/44-orthogonality.sqllogic +146 -0
- package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
- package/test/logic/45-udf-determinism.sqllogic +39 -0
- package/test/logic/46-mutation-context.sqllogic +595 -0
- package/test/logic/47-upsert.sqllogic +255 -0
- package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
- package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
- package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
- package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
- package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
- package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
- package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
- package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
- package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
- package/test/logic/49-reference-graph.sqllogic +84 -0
- package/test/logic/50-declarative-schema.sqllogic +2550 -0
- package/test/logic/50-metadata-tags.sqllogic +1033 -0
- package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
- package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
- package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
- package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +210 -0
- package/test/logic/50.3-declare-schema-duplicate-names.sqllogic +280 -0
- package/test/logic/50.4-declare-schema-apply-restore.sqllogic +192 -0
- package/test/logic/51-lens-foundation.sqllogic +147 -0
- package/test/logic/51-materialized-views.sqllogic +376 -0
- package/test/logic/51.5-materialized-views-coarsened-key.sqllogic +198 -0
- package/test/logic/51.7-maintained-table-attach-detach.sqllogic +468 -0
- package/test/logic/51.8-maintained-table-declared-constraints.sqllogic +440 -0
- package/test/logic/51.85-maintained-table-parent-fk.sqllogic +103 -0
- package/test/logic/51.9-maintained-table-secondary-unique.sqllogic +237 -0
- package/test/logic/51.9.1-maintained-table-partial-unique.sqllogic +36 -0
- package/test/logic/52-lens-overrides.sqllogic +566 -0
- package/test/logic/53-materialized-views-rowtime.sqllogic +1601 -0
- package/test/logic/53-reserved-tags.sqllogic +252 -0
- package/test/logic/53.1-materialized-view-write-through.sqllogic +329 -0
- package/test/logic/53.2-materialized-view-rename-propagation.sqllogic +483 -0
- package/test/logic/53.3-materialized-view-constraint-only-ddl.sqllogic +409 -0
- package/test/logic/53.3.1-materialized-view-index-ddl-irrelevance.sqllogic +29 -0
- package/test/logic/53.4-materialized-view-structural-alter-restore.sqllogic +436 -0
- package/test/logic/54-covering-mv-enforcement.sqllogic +314 -0
- package/test/logic/54.1-covering-mv-partial-enforcement.sqllogic +34 -0
- package/test/logic/55-internal-eviction-reporting.sqllogic +89 -0
- package/test/logic/55-lens-prover.sqllogic +202 -0
- package/test/logic/55.1-eviction-restrict-fk.sqllogic +148 -0
- package/test/logic/55.5-lens-authored-inverse.sqllogic +1468 -0
- package/test/logic/80-grow-retrieve-pass.sqllogic +79 -0
- package/test/logic/81-quickpick.sqllogic +24 -0
- package/test/logic/82-bloom-join.sqllogic +185 -0
- package/test/logic/83-merge-join.sqllogic +280 -0
- package/test/logic/84-asof-scan.sqllogic +238 -0
- package/test/logic/84-key-cardinality.sqllogic +50 -0
- package/test/logic/85-relational-const-folding.sqllogic +51 -0
- package/test/logic/86-scalar-cse.sqllogic +42 -0
- package/test/logic/90-error_paths.sqllogic +114 -0
- package/test/logic/90.1-parse-errors.sqllogic +77 -0
- package/test/logic/90.2-alter-table-errors.sqllogic +53 -0
- package/test/logic/90.2.1-alter-extra-errors.sqllogic +51 -0
- package/test/logic/90.3-expression-errors.sqllogic +43 -0
- package/test/logic/90.4-dml-errors.sqllogic +47 -0
- package/test/logic/90.5-unsupported-join-types.sqllogic +37 -0
- package/test/logic/90.5.1-right-full-join-read.sqllogic +157 -0
- package/test/logic/90.6-select-error-paths.sqllogic +57 -0
- package/test/logic/91-merge-join-edge-cases.sqllogic +159 -0
- package/test/logic/92-hash-aggregate-edge-cases.sqllogic +139 -0
- package/test/logic/93-ddl-view-edge-cases.sqllogic +104 -0
- package/test/logic/93.1-view-error-paths.sqllogic +74 -0
- package/test/logic/93.2-view-mutation-pending.sqllogic +108 -0
- package/test/logic/93.3-view-mutation-or-clause.sqllogic +60 -0
- package/test/logic/93.4-view-mutation.sqllogic +4881 -0
- package/test/logic/93.4.1-view-mutation-partial-unique-cardinality.sqllogic +31 -0
- package/test/logic/93.5-authored-inverse.sqllogic +415 -0
- package/test/logic/93.6-set-op-flagless-write.sqllogic +862 -0
- package/test/logic/94-tvf-edge-cases.sqllogic +58 -0
- package/test/logic/94.1-limit-offset-edge-cases.sqllogic +109 -0
- package/test/logic/94.2-limit-offset-extras.sqllogic +98 -0
- package/test/logic/95-assertions.sqllogic +1417 -0
- package/test/logic/96-subquery-edge-cases.sqllogic +276 -0
- package/test/logic/97-json-function-edge-cases.sqllogic +633 -0
- package/test/logic/97.1-json-blob-and-special-values.sqllogic +92 -0
- package/test/logic/98-temporal-edge-cases.sqllogic +515 -0
- package/test/logic/99-conversion-edge-cases.sqllogic +325 -0
- package/test/logic/99.0.1-schema-index-listing.sqllogic +21 -0
- package/test/logic/99.1-cast-syntax-extras.sqllogic +167 -0
- package/test/logic/drop-unique-index.sqllogic +88 -0
- package/test/logic/pushdown-test.sqllogic +36 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
-- adapted from SQLite test/distinct.test, test/distinct2.test, test/select1.test
|
|
2
|
+
-- DISTINCT edge cases not covered in 10-distinct_datatypes: select-all
|
|
3
|
+
-- wildcards, joins, recursive CTEs, reordered SELECT lists, and explicit
|
|
4
|
+
-- COLLATE in the projection.
|
|
5
|
+
|
|
6
|
+
create table dt (id integer primary key, grp text, val integer);
|
|
7
|
+
insert into dt values
|
|
8
|
+
(1, 'A', 100),
|
|
9
|
+
(2, 'A', 100),
|
|
10
|
+
(3, 'B', 200),
|
|
11
|
+
(4, 'A', 100);
|
|
12
|
+
|
|
13
|
+
-- DISTINCT * — full row deduplication
|
|
14
|
+
select distinct * from dt order by id;
|
|
15
|
+
→ [{"id":1,"grp":"A","val":100},{"id":2,"grp":"A","val":100},{"id":3,"grp":"B","val":200},{"id":4,"grp":"A","val":100}]
|
|
16
|
+
|
|
17
|
+
-- DISTINCT * after dropping the unique key — duplicate rows collapse
|
|
18
|
+
select distinct grp, val from dt order by grp, val;
|
|
19
|
+
→ [{"grp":"A","val":100},{"grp":"B","val":200}]
|
|
20
|
+
|
|
21
|
+
-- DISTINCT with WHERE filter
|
|
22
|
+
select distinct * from dt where grp = 'A' order by id;
|
|
23
|
+
→ [{"id":1,"grp":"A","val":100},{"id":2,"grp":"A","val":100},{"id":4,"grp":"A","val":100}]
|
|
24
|
+
|
|
25
|
+
-- DISTINCT preserves dedup regardless of SELECT-list order
|
|
26
|
+
select distinct val, grp from dt order by val, grp;
|
|
27
|
+
→ [{"val":100,"grp":"A"},{"val":200,"grp":"B"}]
|
|
28
|
+
|
|
29
|
+
drop table dt;
|
|
30
|
+
|
|
31
|
+
-- =============================================================================
|
|
32
|
+
-- DISTINCT across CROSS JOIN — Cartesian product then dedup
|
|
33
|
+
-- =============================================================================
|
|
34
|
+
|
|
35
|
+
create table cj_a (id integer primary key, x integer);
|
|
36
|
+
create table cj_b (id integer primary key, y integer);
|
|
37
|
+
insert into cj_a values (1, 1), (2, 2);
|
|
38
|
+
insert into cj_b values (1, 10), (2, 20), (3, 10);
|
|
39
|
+
|
|
40
|
+
select distinct cj_a.x, cj_b.y
|
|
41
|
+
from cj_a cross join cj_b
|
|
42
|
+
order by cj_a.x, cj_b.y;
|
|
43
|
+
→ [{"x":1,"y":10},{"x":1,"y":20},{"x":2,"y":10},{"x":2,"y":20}]
|
|
44
|
+
|
|
45
|
+
drop table cj_b;
|
|
46
|
+
drop table cj_a;
|
|
47
|
+
|
|
48
|
+
-- =============================================================================
|
|
49
|
+
-- DISTINCT across LEFT JOIN — NULL-padded rows participate in dedup
|
|
50
|
+
-- =============================================================================
|
|
51
|
+
|
|
52
|
+
create table lj_l (id integer primary key, cat text);
|
|
53
|
+
create table lj_r (id integer primary key, lj_l_id integer, tag text);
|
|
54
|
+
insert into lj_l values (1, 'A'), (2, 'B'), (3, 'A');
|
|
55
|
+
insert into lj_r values (10, 1, 'x'), (20, 2, 'y');
|
|
56
|
+
|
|
57
|
+
-- DISTINCT on the parent column: LEFT JOIN's NULL-padded right side doesn't
|
|
58
|
+
-- duplicate the parent — categories collapse to A, B.
|
|
59
|
+
select distinct lj_l.cat
|
|
60
|
+
from lj_l left join lj_r on lj_l.id = lj_r.lj_l_id
|
|
61
|
+
order by lj_l.cat;
|
|
62
|
+
→ [{"cat":"A"},{"cat":"B"}]
|
|
63
|
+
|
|
64
|
+
-- DISTINCT including the joined column — NULL appears once for unmatched parent (lj_l.id=3)
|
|
65
|
+
select distinct lj_l.cat, lj_r.tag
|
|
66
|
+
from lj_l left join lj_r on lj_l.id = lj_r.lj_l_id
|
|
67
|
+
order by lj_l.cat, lj_r.tag;
|
|
68
|
+
→ [{"cat":"A","tag":null},{"cat":"A","tag":"x"},{"cat":"B","tag":"y"}]
|
|
69
|
+
|
|
70
|
+
drop table lj_r;
|
|
71
|
+
drop table lj_l;
|
|
72
|
+
|
|
73
|
+
-- =============================================================================
|
|
74
|
+
-- DISTINCT inside a recursive CTE
|
|
75
|
+
-- =============================================================================
|
|
76
|
+
|
|
77
|
+
with recursive cnt(n) as (
|
|
78
|
+
select 1
|
|
79
|
+
union all
|
|
80
|
+
select n + 1 from cnt where n < 4
|
|
81
|
+
)
|
|
82
|
+
select distinct n from cnt order by n;
|
|
83
|
+
→ [{"n":1},{"n":2},{"n":3},{"n":4}]
|
|
84
|
+
|
|
85
|
+
-- DISTINCT applied to the body of a non-recursive CTE that emits dups
|
|
86
|
+
with src(v) as (
|
|
87
|
+
select 1 union all select 2 union all select 1 union all select 3 union all select 2
|
|
88
|
+
)
|
|
89
|
+
select distinct v from src order by v;
|
|
90
|
+
→ [{"v":1},{"v":2},{"v":3}]
|
|
91
|
+
|
|
92
|
+
-- =============================================================================
|
|
93
|
+
-- DISTINCT with explicit COLLATE in the projection
|
|
94
|
+
-- =============================================================================
|
|
95
|
+
|
|
96
|
+
create table cs (id integer primary key, name text);
|
|
97
|
+
insert into cs values (1, 'Bob'), (2, 'bob'), (3, 'Alice'), (4, 'BOB');
|
|
98
|
+
|
|
99
|
+
-- COLLATE BINARY (default) keeps case-distinct values
|
|
100
|
+
select distinct name from cs order by name;
|
|
101
|
+
→ [{"name":"Alice"},{"name":"BOB"},{"name":"Bob"},{"name":"bob"}]
|
|
102
|
+
|
|
103
|
+
-- COLLATE NOCASE in the projection collapses case-equivalent strings
|
|
104
|
+
select distinct name collate nocase as name from cs order by name collate nocase;
|
|
105
|
+
→ [{"name":"Alice"},{"name":"Bob"}]
|
|
106
|
+
|
|
107
|
+
drop table cs;
|
|
108
|
+
|
|
109
|
+
-- =============================================================================
|
|
110
|
+
-- DISTINCT with duplicate column reference — same column projected twice
|
|
111
|
+
-- =============================================================================
|
|
112
|
+
|
|
113
|
+
create table dc (id integer primary key, x integer);
|
|
114
|
+
insert into dc values (1, 100), (2, 100), (3, 200);
|
|
115
|
+
|
|
116
|
+
select distinct x, x from dc order by x;
|
|
117
|
+
→ [{"x":100,"x:1":100},{"x":200,"x:1":200}]
|
|
118
|
+
|
|
119
|
+
drop table dc;
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
-- predicate-normalization-edge-cases.sqllogic
|
|
2
|
+
-- Tests for predicate normalization: De Morgan, double/triple negation,
|
|
3
|
+
-- NOT on comparisons, OR flattening, OR-to-IN collapse, BETWEEN, IS NULL, etc.
|
|
4
|
+
|
|
5
|
+
-- =============================================================================
|
|
6
|
+
-- Setup
|
|
7
|
+
-- =============================================================================
|
|
8
|
+
|
|
9
|
+
create table norm (id integer primary key, a integer null, b integer null, c text null);
|
|
10
|
+
insert into norm values (1, 10, 100, 'alpha'), (2, 20, 200, 'beta'), (3, 30, 300, null), (4, null, 400, 'delta'), (5, 50, null, 'epsilon');
|
|
11
|
+
|
|
12
|
+
-- =============================================================================
|
|
13
|
+
-- De Morgan's laws
|
|
14
|
+
-- =============================================================================
|
|
15
|
+
|
|
16
|
+
-- De Morgan with AND: NOT (a > 10 AND b > 200) → a <= 10 OR b <= 200
|
|
17
|
+
-- id=1: not(false and false)=true; id=2: not(true and false)=true;
|
|
18
|
+
-- id=3: not(true and true)=false; id=4: not(null and true)=not(null)=null; id=5: not(true and null)=not(null)=null
|
|
19
|
+
select id from norm where not (a > 10 and b > 200) order by id;
|
|
20
|
+
→ [{"id":1},{"id":2}]
|
|
21
|
+
|
|
22
|
+
-- De Morgan with OR: NOT (a = 10 OR a = 20) → a != 10 AND a != 20
|
|
23
|
+
-- id=3: a=30 passes; id=5: a=50 passes; id=4: a=null → null
|
|
24
|
+
select id from norm where not (a = 10 or a = 20) order by id;
|
|
25
|
+
→ [{"id":3},{"id":5}]
|
|
26
|
+
|
|
27
|
+
-- =============================================================================
|
|
28
|
+
-- Double and triple negation
|
|
29
|
+
-- =============================================================================
|
|
30
|
+
|
|
31
|
+
-- Double negation: NOT NOT (a > 20) → a > 20
|
|
32
|
+
select id from norm where not not (a > 20) order by id;
|
|
33
|
+
→ [{"id":3},{"id":5}]
|
|
34
|
+
|
|
35
|
+
-- Triple negation: NOT NOT NOT (a > 20) → NOT (a > 20) → a <= 20
|
|
36
|
+
select id from norm where not not not (a > 20) order by id;
|
|
37
|
+
→ [{"id":1},{"id":2}]
|
|
38
|
+
|
|
39
|
+
-- =============================================================================
|
|
40
|
+
-- NOT on comparison operators
|
|
41
|
+
-- =============================================================================
|
|
42
|
+
|
|
43
|
+
-- NOT (a > 20) → a <= 20
|
|
44
|
+
select id from norm where not (a > 20) order by id;
|
|
45
|
+
→ [{"id":1},{"id":2}]
|
|
46
|
+
|
|
47
|
+
-- NOT (a >= 20) → a < 20
|
|
48
|
+
select id from norm where not (a >= 20) order by id;
|
|
49
|
+
→ [{"id":1}]
|
|
50
|
+
|
|
51
|
+
-- NOT (a < 30) → a >= 30
|
|
52
|
+
select id from norm where not (a < 30) order by id;
|
|
53
|
+
→ [{"id":3},{"id":5}]
|
|
54
|
+
|
|
55
|
+
-- NOT (a <= 20) → a > 20
|
|
56
|
+
select id from norm where not (a <= 20) order by id;
|
|
57
|
+
→ [{"id":3},{"id":5}]
|
|
58
|
+
|
|
59
|
+
-- =============================================================================
|
|
60
|
+
-- OR flattening and OR-to-IN collapse
|
|
61
|
+
-- =============================================================================
|
|
62
|
+
|
|
63
|
+
-- OR flattening: nested OR groups flatten into a single OR
|
|
64
|
+
select id from norm where (a = 10 or a = 20) or a = 30 order by id;
|
|
65
|
+
→ [{"id":1},{"id":2},{"id":3}]
|
|
66
|
+
|
|
67
|
+
-- OR-to-IN collapse: a = 10 OR a = 20 OR a = 30 → a IN (10,20,30)
|
|
68
|
+
select id from norm where a = 10 or a = 20 or a = 30 order by id;
|
|
69
|
+
→ [{"id":1},{"id":2},{"id":3}]
|
|
70
|
+
|
|
71
|
+
-- =============================================================================
|
|
72
|
+
-- BETWEEN and NOT BETWEEN
|
|
73
|
+
-- =============================================================================
|
|
74
|
+
|
|
75
|
+
-- BETWEEN: a between 20 and 30 → a >= 20 AND a <= 30
|
|
76
|
+
select id from norm where a between 20 and 30 order by id;
|
|
77
|
+
→ [{"id":2},{"id":3}]
|
|
78
|
+
|
|
79
|
+
-- NOT BETWEEN: not (a between 20 and 40) → a < 20 OR a > 40
|
|
80
|
+
-- id=1: a=10 outside; id=5: a=50 outside; id=4: a=null → null
|
|
81
|
+
select id from norm where not (a between 20 and 40) order by id;
|
|
82
|
+
→ [{"id":1},{"id":5}]
|
|
83
|
+
|
|
84
|
+
-- =============================================================================
|
|
85
|
+
-- NOT on IS NULL / IS NOT NULL
|
|
86
|
+
-- =============================================================================
|
|
87
|
+
|
|
88
|
+
-- NOT IS NULL → IS NOT NULL
|
|
89
|
+
select id from norm where not (c is null) order by id;
|
|
90
|
+
→ [{"id":1},{"id":2},{"id":4},{"id":5}]
|
|
91
|
+
|
|
92
|
+
-- NOT IS NOT NULL → IS NULL
|
|
93
|
+
select id from norm where not (c is not null) order by id;
|
|
94
|
+
→ [{"id":3}]
|
|
95
|
+
|
|
96
|
+
-- =============================================================================
|
|
97
|
+
-- Complex nested predicates
|
|
98
|
+
-- =============================================================================
|
|
99
|
+
|
|
100
|
+
-- NOT ((a > 10 AND b < 300) OR c IS NULL)
|
|
101
|
+
-- id=1: not((false and true) or false) = not(false) = true
|
|
102
|
+
-- id=2: not((true and true) or false) = not(true) = false
|
|
103
|
+
-- id=3: not((true and false) or true) = not(true) = false
|
|
104
|
+
-- id=4: not((null and false) or false) = not(false) = true
|
|
105
|
+
-- id=5: not((true and null) or false) = not(null) = null
|
|
106
|
+
select id from norm where not ((a > 10 and b < 300) or c is null) order by id;
|
|
107
|
+
→ [{"id":1},{"id":4}]
|
|
108
|
+
|
|
109
|
+
-- Mixed NOT with AND/OR: NOT (a = 10) AND NOT (b = 200)
|
|
110
|
+
-- Only id=3 passes (a=30≠10, b=300≠200); id=4 and id=5 have NULLs
|
|
111
|
+
select id from norm where not (a = 10) and not (b = 200) order by id;
|
|
112
|
+
→ [{"id":3}]
|
|
113
|
+
|
|
114
|
+
-- =============================================================================
|
|
115
|
+
-- Reversed operand order
|
|
116
|
+
-- =============================================================================
|
|
117
|
+
|
|
118
|
+
-- OR with reversed operands: literal = column pattern
|
|
119
|
+
select id from norm where 10 = a or 20 = a order by id;
|
|
120
|
+
→ [{"id":1},{"id":2}]
|
|
121
|
+
|
|
122
|
+
-- =============================================================================
|
|
123
|
+
-- Deeply nested AND flattening
|
|
124
|
+
-- =============================================================================
|
|
125
|
+
|
|
126
|
+
-- Nested AND: a > 5 AND (b > 50 AND (a < 100 AND b < 500)) flattens to four ANDs
|
|
127
|
+
-- id=1: all true; id=2: all true; id=3: all true; id=4: a=null; id=5: b=null
|
|
128
|
+
select id from norm where a > 5 and (b > 50 and (a < 100 and b < 500)) order by id;
|
|
129
|
+
→ [{"id":1},{"id":2},{"id":3}]
|
|
130
|
+
|
|
131
|
+
-- =============================================================================
|
|
132
|
+
-- OR-to-IN with mixed operand order (lit=col and col=lit)
|
|
133
|
+
-- =============================================================================
|
|
134
|
+
|
|
135
|
+
-- Mixed literal=column and column=literal patterns should all resolve correctly
|
|
136
|
+
-- id=1: 10=a true; id=2: a=20 true; id=3: 30=a true
|
|
137
|
+
select id from norm where 10 = a or a = 20 or 30 = a order by id;
|
|
138
|
+
→ [{"id":1},{"id":2},{"id":3}]
|
|
139
|
+
|
|
140
|
+
-- =============================================================================
|
|
141
|
+
-- OR-to-IN with different columns should NOT collapse
|
|
142
|
+
-- =============================================================================
|
|
143
|
+
|
|
144
|
+
-- Different columns in OR disjuncts: no IN collapse, but correct results
|
|
145
|
+
-- id=1: a=10 true; id=2: b=200 true; others: a≠10 and b≠200 or null
|
|
146
|
+
select id from norm where a = 10 or b = 200 order by id;
|
|
147
|
+
→ [{"id":1},{"id":2}]
|
|
148
|
+
|
|
149
|
+
-- =============================================================================
|
|
150
|
+
-- OR-to-IN with non-equality operators
|
|
151
|
+
-- =============================================================================
|
|
152
|
+
|
|
153
|
+
-- Non-equality (>) should not trigger IN collapse
|
|
154
|
+
-- id=2: a=20>10; id=3: a=30>10; id=5: a=50>10; id=4: a=null
|
|
155
|
+
select id from norm where a > 10 or a > 20 order by id;
|
|
156
|
+
→ [{"id":2},{"id":3},{"id":5}]
|
|
157
|
+
|
|
158
|
+
-- =============================================================================
|
|
159
|
+
-- OR-to-IN with non-binary disjunct (BETWEEN)
|
|
160
|
+
-- =============================================================================
|
|
161
|
+
|
|
162
|
+
-- BETWEEN is not a BinaryOp; should not trigger IN collapse
|
|
163
|
+
-- id=1: a=10 true; id=2: a=20 in [20,30]; id=3: a=30 in [20,30]
|
|
164
|
+
select id from norm where a = 10 or a between 20 and 30 order by id;
|
|
165
|
+
→ [{"id":1},{"id":2},{"id":3}]
|
|
166
|
+
|
|
167
|
+
-- =============================================================================
|
|
168
|
+
-- Deeply nested OR flattening (4-level)
|
|
169
|
+
-- =============================================================================
|
|
170
|
+
|
|
171
|
+
-- Four nested ORs: ((a=10 OR a=20) OR (a=30 OR a=50)) flattens completely
|
|
172
|
+
select id from norm where ((a = 10 or a = 20) or (a = 30 or a = 50)) order by id;
|
|
173
|
+
→ [{"id":1},{"id":2},{"id":3},{"id":5}]
|
|
174
|
+
|
|
175
|
+
-- =============================================================================
|
|
176
|
+
-- NOT over IS NOT NULL
|
|
177
|
+
-- =============================================================================
|
|
178
|
+
|
|
179
|
+
-- NOT (a IS NOT NULL) should behave like IS NULL
|
|
180
|
+
-- id=4: a=null
|
|
181
|
+
select id from norm where not (a is not null) order by id;
|
|
182
|
+
→ [{"id":4}]
|
|
183
|
+
|
|
184
|
+
-- NOT (b IS NOT NULL) should behave like IS NULL
|
|
185
|
+
-- id=5: b=null
|
|
186
|
+
select id from norm where not (b is not null) order by id;
|
|
187
|
+
→ [{"id":5}]
|
|
188
|
+
|
|
189
|
+
-- =============================================================================
|
|
190
|
+
-- NOT over non-invertible binary (LIKE)
|
|
191
|
+
-- =============================================================================
|
|
192
|
+
|
|
193
|
+
-- NOT (c LIKE 'alpha') should negate the LIKE result
|
|
194
|
+
-- id=2: beta≠alpha; id=3: null→null; id=4: delta≠alpha; id=5: epsilon≠alpha
|
|
195
|
+
select id from norm where not (c like 'alpha') order by id;
|
|
196
|
+
→ [{"id":2},{"id":4},{"id":5}]
|
|
197
|
+
|
|
198
|
+
-- =============================================================================
|
|
199
|
+
-- OR-to-IN boundary: 33 disjuncts (exceeds 32 limit)
|
|
200
|
+
-- =============================================================================
|
|
201
|
+
|
|
202
|
+
-- 33 disjuncts should not collapse to IN but still return correct results
|
|
203
|
+
-- Only a=10 (id=1), a=20 (id=2), a=30 (id=3), a=50 (id=5) match from our data
|
|
204
|
+
select id from norm where a=1 or a=2 or a=3 or a=4 or a=5 or a=6 or a=7 or a=8 or a=9 or a=10 or a=11 or a=12 or a=13 or a=14 or a=15 or a=16 or a=17 or a=18 or a=19 or a=20 or a=21 or a=22 or a=23 or a=24 or a=25 or a=26 or a=27 or a=28 or a=29 or a=30 or a=31 or a=32 or a=33 order by id;
|
|
205
|
+
→ [{"id":1},{"id":2},{"id":3}]
|
|
206
|
+
|
|
207
|
+
-- =============================================================================
|
|
208
|
+
-- NOT BETWEEN double toggle
|
|
209
|
+
-- =============================================================================
|
|
210
|
+
|
|
211
|
+
-- NOT NOT BETWEEN: double NOT on BETWEEN should cancel out
|
|
212
|
+
-- Equivalent to a BETWEEN 20 AND 30
|
|
213
|
+
select id from norm where not not (a between 20 and 30) order by id;
|
|
214
|
+
→ [{"id":2},{"id":3}]
|
|
215
|
+
|
|
216
|
+
-- =============================================================================
|
|
217
|
+
-- De Morgan with nested OR-to-IN
|
|
218
|
+
-- =============================================================================
|
|
219
|
+
|
|
220
|
+
-- NOT (a = 10 AND b = 100): De Morgan → a != 10 OR b != 100
|
|
221
|
+
-- id=1: a=10,b=100 → false; id=2: a≠10 → true; id=3: a≠10 → true; id=4: b≠100 → true; id=5: a≠10 → true
|
|
222
|
+
select id from norm where not (a = 10 and b = 100) order by id;
|
|
223
|
+
→ [{"id":2},{"id":3},{"id":4},{"id":5}]
|
|
224
|
+
|
|
225
|
+
-- =============================================================================
|
|
226
|
+
-- Mixed operand order with more values
|
|
227
|
+
-- =============================================================================
|
|
228
|
+
|
|
229
|
+
-- Alternating lit=col and col=lit patterns
|
|
230
|
+
-- id=1: 10=a; id=2: a=20; id=5: 50=a
|
|
231
|
+
select id from norm where 10 = a or a = 20 or 50 = a order by id;
|
|
232
|
+
→ [{"id":1},{"id":2},{"id":5}]
|
|
233
|
+
|
|
234
|
+
-- =============================================================================
|
|
235
|
+
-- Cleanup
|
|
236
|
+
-- =============================================================================
|
|
237
|
+
|
|
238
|
+
drop table norm;
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
-- where-extras.sqllogic - WHERE-clause shapes not exercised by 100-predicate-normalization
|
|
2
|
+
-- Distilled from SQLite test/where.test, where4.test, where7.test, where8.test, where9.test
|
|
3
|
+
|
|
4
|
+
create table we (id integer primary key, a integer null, b integer null, c integer null);
|
|
5
|
+
insert into we values
|
|
6
|
+
(1, 10, 100, 1),
|
|
7
|
+
(2, 20, 200, 2),
|
|
8
|
+
(3, 30, 300, 3),
|
|
9
|
+
(4, 40, 400, 4),
|
|
10
|
+
(5, 50, 500, 5),
|
|
11
|
+
(6, null, null, null);
|
|
12
|
+
|
|
13
|
+
-- =============================================================================
|
|
14
|
+
-- Constant WHERE: short-circuit always-true / always-false predicates
|
|
15
|
+
-- =============================================================================
|
|
16
|
+
|
|
17
|
+
select count(*) as cnt from we where 1;
|
|
18
|
+
→ [{"cnt":6}]
|
|
19
|
+
|
|
20
|
+
select count(*) as cnt from we where 0;
|
|
21
|
+
→ [{"cnt":0}]
|
|
22
|
+
|
|
23
|
+
select count(*) as cnt from we where true;
|
|
24
|
+
→ [{"cnt":6}]
|
|
25
|
+
|
|
26
|
+
select count(*) as cnt from we where false;
|
|
27
|
+
→ [{"cnt":0}]
|
|
28
|
+
|
|
29
|
+
select count(*) as cnt from we where 1 = 1;
|
|
30
|
+
→ [{"cnt":6}]
|
|
31
|
+
|
|
32
|
+
select count(*) as cnt from we where 1 = 0;
|
|
33
|
+
→ [{"cnt":0}]
|
|
34
|
+
|
|
35
|
+
-- Constant comparison combined with column predicate
|
|
36
|
+
select id from we where 1 = 1 and a > 30 order by id;
|
|
37
|
+
→ [{"id":4},{"id":5}]
|
|
38
|
+
|
|
39
|
+
select id from we where 1 = 0 or a = 10 order by id;
|
|
40
|
+
→ [{"id":1}]
|
|
41
|
+
|
|
42
|
+
-- =============================================================================
|
|
43
|
+
-- AND combined with multi-branch OR (x AND (y OR z))
|
|
44
|
+
-- =============================================================================
|
|
45
|
+
|
|
46
|
+
select id from we where a > 15 and (b = 200 or b = 400) order by id;
|
|
47
|
+
→ [{"id":2},{"id":4}]
|
|
48
|
+
|
|
49
|
+
select id from we where a > 15 and (b = 200 or c >= 4) order by id;
|
|
50
|
+
→ [{"id":2},{"id":4},{"id":5}]
|
|
51
|
+
|
|
52
|
+
-- (x OR y) AND z: distributes correctly
|
|
53
|
+
select id from we where (a = 10 or a = 30) and b > 50 order by id;
|
|
54
|
+
→ [{"id":1},{"id":3}]
|
|
55
|
+
|
|
56
|
+
-- =============================================================================
|
|
57
|
+
-- Composite OR over (a AND b) tuples
|
|
58
|
+
-- =============================================================================
|
|
59
|
+
|
|
60
|
+
select id from we where (a = 10 and b = 100) or (a = 30 and b = 300) order by id;
|
|
61
|
+
→ [{"id":1},{"id":3}]
|
|
62
|
+
|
|
63
|
+
-- Tuple OR where one disjunct fails the b test
|
|
64
|
+
select id from we where (a = 10 and b = 999) or (a = 30 and b = 300) order by id;
|
|
65
|
+
→ [{"id":3}]
|
|
66
|
+
|
|
67
|
+
-- =============================================================================
|
|
68
|
+
-- Multi-range OR (BETWEEN inside OR)
|
|
69
|
+
-- =============================================================================
|
|
70
|
+
|
|
71
|
+
select id from we where a between 10 and 20 or a between 40 and 50 order by id;
|
|
72
|
+
→ [{"id":1},{"id":2},{"id":4},{"id":5}]
|
|
73
|
+
|
|
74
|
+
select id from we where (a between 10 and 20) or (b between 300 and 400) order by id;
|
|
75
|
+
→ [{"id":1},{"id":2},{"id":3},{"id":4}]
|
|
76
|
+
|
|
77
|
+
-- BETWEEN inside OR mixed with equality
|
|
78
|
+
select id from we where a = 50 or a between 15 and 25 order by id;
|
|
79
|
+
→ [{"id":2},{"id":5}]
|
|
80
|
+
|
|
81
|
+
-- =============================================================================
|
|
82
|
+
-- Three-column AND/OR composite
|
|
83
|
+
-- =============================================================================
|
|
84
|
+
|
|
85
|
+
select id from we where a > 10 and (b = 100 or b = 200 or c >= 4) order by id;
|
|
86
|
+
→ [{"id":2},{"id":4},{"id":5}]
|
|
87
|
+
|
|
88
|
+
select id from we where a > 10 and (b > 250 and c < 5) order by id;
|
|
89
|
+
→ [{"id":3},{"id":4}]
|
|
90
|
+
|
|
91
|
+
-- =============================================================================
|
|
92
|
+
-- OR with IS NULL: non-null disjunct wins, null rows kept via IS NULL
|
|
93
|
+
-- =============================================================================
|
|
94
|
+
|
|
95
|
+
select id from we where a > 25 or a is null order by id;
|
|
96
|
+
→ [{"id":3},{"id":4},{"id":5},{"id":6}]
|
|
97
|
+
|
|
98
|
+
-- IS NULL combined with AND
|
|
99
|
+
select id from we where a is null or (b > 100 and c < 4) order by id;
|
|
100
|
+
→ [{"id":2},{"id":3},{"id":6}]
|
|
101
|
+
|
|
102
|
+
-- =============================================================================
|
|
103
|
+
-- IN list deduplication: duplicate values produce no duplicate rows
|
|
104
|
+
-- =============================================================================
|
|
105
|
+
|
|
106
|
+
select id from we where a in (10, 10, 30, 30, 30) order by id;
|
|
107
|
+
→ [{"id":1},{"id":3}]
|
|
108
|
+
|
|
109
|
+
-- =============================================================================
|
|
110
|
+
-- Reordered ON-clause conjunction equivalence (LEFT JOIN)
|
|
111
|
+
-- =============================================================================
|
|
112
|
+
|
|
113
|
+
create table wj_l (id integer primary key, k integer);
|
|
114
|
+
create table wj_r (id integer primary key, k integer, tag integer);
|
|
115
|
+
insert into wj_l values (1, 1), (2, 2);
|
|
116
|
+
insert into wj_r values (10, 1, 1), (20, 1, 3), (30, 2, 1), (40, 2, 3);
|
|
117
|
+
|
|
118
|
+
-- ON term order should not affect result
|
|
119
|
+
select wj_l.id as lid, wj_r.id as rid from wj_l left join wj_r on wj_l.k = wj_r.k and wj_r.tag = 1 order by lid, rid;
|
|
120
|
+
→ [{"lid":1,"rid":10},{"lid":2,"rid":30}]
|
|
121
|
+
|
|
122
|
+
select wj_l.id as lid, wj_r.id as rid from wj_l left join wj_r on wj_r.tag = 1 and wj_r.k = wj_l.k order by lid, rid;
|
|
123
|
+
→ [{"lid":1,"rid":10},{"lid":2,"rid":30}]
|
|
124
|
+
|
|
125
|
+
-- The indexed variant of this equivalence (an index on the ON columns must not
|
|
126
|
+
-- change the answer) lives in 100.1.1-where-join-on-order-indexed.
|
|
127
|
+
|
|
128
|
+
drop table wj_l;
|
|
129
|
+
drop table wj_r;
|
|
130
|
+
|
|
131
|
+
drop table we;
|
|
132
|
+
|
|
133
|
+
-- =============================================================================
|
|
134
|
+
-- same-table column-column equality: must not crash (regression: seek crash)
|
|
135
|
+
-- A col = same_col predicate is a per-row filter, never a seek key.
|
|
136
|
+
-- =============================================================================
|
|
137
|
+
|
|
138
|
+
create table samecolpk (b text primary key, c text);
|
|
139
|
+
insert into samecolpk values ('u', 'u'), ('v', 'w'), ('x', 'x');
|
|
140
|
+
|
|
141
|
+
-- simple PK: matching rows returned, no crash
|
|
142
|
+
select b from samecolpk where b = c order by b;
|
|
143
|
+
→ [{"b":"u"},{"b":"x"}]
|
|
144
|
+
|
|
145
|
+
-- with inequality too
|
|
146
|
+
select b from samecolpk where b = c and c != 'x';
|
|
147
|
+
→ [{"b":"u"}]
|
|
148
|
+
|
|
149
|
+
drop table samecolpk;
|
|
150
|
+
|
|
151
|
+
-- composite PK: b=c with the other key column pinned must not crash
|
|
152
|
+
create table samecolcomp (b text, c text, x integer, primary key (b, x));
|
|
153
|
+
insert into samecolcomp values ('u','u',1), ('u','u',2), ('v','v',1), ('w','v',1);
|
|
154
|
+
|
|
155
|
+
-- both pk columns specified but b=c is still a per-row filter
|
|
156
|
+
select b, c, x from samecolcomp where b = c and x = 1 order by b;
|
|
157
|
+
→ [{"b":"u","c":"u","x":1},{"b":"v","c":"v","x":1}]
|
|
158
|
+
|
|
159
|
+
-- without x pin: b=c alone as filter
|
|
160
|
+
select b, c, x from samecolcomp where b = c order by b, x;
|
|
161
|
+
→ [{"b":"u","c":"u","x":1},{"b":"u","c":"u","x":2},{"b":"v","c":"v","x":1}]
|
|
162
|
+
|
|
163
|
+
drop table samecolcomp;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
-- 100.1.1-where-join-on-order-indexed.sqllogic
|
|
2
|
+
--
|
|
3
|
+
-- requires-capability: standalone-index-ddl
|
|
4
|
+
--
|
|
5
|
+
-- Carved out of 100.1-where-extras: that file's subject is WHERE-predicate shapes,
|
|
6
|
+
-- and its reordered-ON-clause section already proves term-order equivalence without
|
|
7
|
+
-- any index. The one create/drop index pair below is a robustness check — "an index
|
|
8
|
+
-- on the ON columns must not change the answer" — not index behavior, so it moves
|
|
9
|
+
-- here rather than making the whole WHERE file unrunnable on a backend without
|
|
10
|
+
-- first-class CREATE INDEX.
|
|
11
|
+
--
|
|
12
|
+
-- Subject: a LEFT JOIN whose ON conjunction can be served by a composite index on
|
|
13
|
+
-- the right-hand table returns the same rows as the unindexed plan.
|
|
14
|
+
|
|
15
|
+
create table wj_l (id integer primary key, k integer);
|
|
16
|
+
create table wj_r (id integer primary key, k integer, tag integer);
|
|
17
|
+
insert into wj_l values (1, 1), (2, 2);
|
|
18
|
+
insert into wj_r values (10, 1, 1), (20, 1, 3), (30, 2, 1), (40, 2, 3);
|
|
19
|
+
|
|
20
|
+
-- Baseline: unindexed, both ON term orders.
|
|
21
|
+
select wj_l.id as lid, wj_r.id as rid from wj_l left join wj_r on wj_l.k = wj_r.k and wj_r.tag = 1 order by lid, rid;
|
|
22
|
+
→ [{"lid":1,"rid":10},{"lid":2,"rid":30}]
|
|
23
|
+
|
|
24
|
+
-- Index presence on the ON columns must not change results
|
|
25
|
+
create index wj_r_k_tag on wj_r(k, tag);
|
|
26
|
+
|
|
27
|
+
select wj_l.id as lid, wj_r.id as rid from wj_l left join wj_r on wj_l.k = wj_r.k and wj_r.tag = 1 order by lid, rid;
|
|
28
|
+
→ [{"lid":1,"rid":10},{"lid":2,"rid":30}]
|
|
29
|
+
|
|
30
|
+
select wj_l.id as lid, wj_r.id as rid from wj_l left join wj_r on wj_r.tag = 1 and wj_r.k = wj_l.k order by lid, rid;
|
|
31
|
+
→ [{"lid":1,"rid":10},{"lid":2,"rid":30}]
|
|
32
|
+
|
|
33
|
+
drop index wj_r_k_tag;
|
|
34
|
+
drop table wj_l;
|
|
35
|
+
drop table wj_r;
|