@quereus/quereus 4.20.0 → 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/dist/src/common/types.d.ts +4 -4
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/schema/catalog-rendering.js +13 -1
- package/dist/src/schema/catalog-rendering.js.map +1 -1
- package/dist/src/schema/catalog.d.ts +35 -2
- package/dist/src/schema/catalog.d.ts.map +1 -1
- package/dist/src/schema/catalog.js +42 -33
- package/dist/src/schema/catalog.js.map +1 -1
- package/dist/src/schema/schema-differ.d.ts +1 -1
- package/dist/src/schema/schema-differ.d.ts.map +1 -1
- package/dist/src/schema/schema-differ.js +195 -33
- package/dist/src/schema/schema-differ.js.map +1 -1
- package/dist/src/schema/unique-enforcement.d.ts +23 -1
- package/dist/src/schema/unique-enforcement.d.ts.map +1 -1
- package/dist/src/schema/unique-enforcement.js +43 -1
- package/dist/src/schema/unique-enforcement.js.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts +15 -12
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +87 -100
- package/dist/src/vtab/memory/layer/manager.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 +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,444 @@
|
|
|
1
|
+
-- 28-set-ops-sort-edge-cases.sqllogic
|
|
2
|
+
-- Edge-case tests for set operations (UNION/INTERSECT/EXCEPT/DIFF) and ORDER BY
|
|
3
|
+
|
|
4
|
+
-- ============================================================
|
|
5
|
+
-- Setup tables
|
|
6
|
+
-- ============================================================
|
|
7
|
+
|
|
8
|
+
CREATE TABLE sose_t (id INTEGER PRIMARY KEY, val TEXT);
|
|
9
|
+
INSERT INTO sose_t VALUES (1, 'alpha'), (2, 'beta'), (3, 'gamma');
|
|
10
|
+
|
|
11
|
+
-- ============================================================
|
|
12
|
+
-- SET OPERATIONS: Empty inputs
|
|
13
|
+
-- ============================================================
|
|
14
|
+
|
|
15
|
+
-- UNION: empty left, non-empty right
|
|
16
|
+
SELECT val FROM sose_t WHERE 1=0
|
|
17
|
+
UNION
|
|
18
|
+
SELECT val FROM sose_t
|
|
19
|
+
ORDER BY val;
|
|
20
|
+
→ [{"val":"alpha"},{"val":"beta"},{"val":"gamma"}]
|
|
21
|
+
|
|
22
|
+
-- UNION: non-empty left, empty right
|
|
23
|
+
SELECT val FROM sose_t
|
|
24
|
+
UNION
|
|
25
|
+
SELECT val FROM sose_t WHERE 1=0
|
|
26
|
+
ORDER BY val;
|
|
27
|
+
→ [{"val":"alpha"},{"val":"beta"},{"val":"gamma"}]
|
|
28
|
+
|
|
29
|
+
-- UNION: both sides empty
|
|
30
|
+
SELECT val FROM sose_t WHERE 1=0
|
|
31
|
+
UNION
|
|
32
|
+
SELECT val FROM sose_t WHERE 1=0;
|
|
33
|
+
→ []
|
|
34
|
+
|
|
35
|
+
-- UNION ALL: empty left, non-empty right
|
|
36
|
+
SELECT val FROM sose_t WHERE 1=0
|
|
37
|
+
UNION ALL
|
|
38
|
+
SELECT val FROM sose_t
|
|
39
|
+
ORDER BY val;
|
|
40
|
+
→ [{"val":"alpha"},{"val":"beta"},{"val":"gamma"}]
|
|
41
|
+
|
|
42
|
+
-- UNION ALL: non-empty left, empty right
|
|
43
|
+
SELECT val FROM sose_t
|
|
44
|
+
UNION ALL
|
|
45
|
+
SELECT val FROM sose_t WHERE 1=0
|
|
46
|
+
ORDER BY val;
|
|
47
|
+
→ [{"val":"alpha"},{"val":"beta"},{"val":"gamma"}]
|
|
48
|
+
|
|
49
|
+
-- INTERSECT: empty left
|
|
50
|
+
SELECT val FROM sose_t WHERE 1=0
|
|
51
|
+
INTERSECT
|
|
52
|
+
SELECT val FROM sose_t;
|
|
53
|
+
→ []
|
|
54
|
+
|
|
55
|
+
-- INTERSECT: empty right
|
|
56
|
+
SELECT val FROM sose_t
|
|
57
|
+
INTERSECT
|
|
58
|
+
SELECT val FROM sose_t WHERE 1=0;
|
|
59
|
+
→ []
|
|
60
|
+
|
|
61
|
+
-- INTERSECT: both empty
|
|
62
|
+
SELECT val FROM sose_t WHERE 1=0
|
|
63
|
+
INTERSECT
|
|
64
|
+
SELECT val FROM sose_t WHERE 1=0;
|
|
65
|
+
→ []
|
|
66
|
+
|
|
67
|
+
-- EXCEPT: empty left
|
|
68
|
+
SELECT val FROM sose_t WHERE 1=0
|
|
69
|
+
EXCEPT
|
|
70
|
+
SELECT val FROM sose_t;
|
|
71
|
+
→ []
|
|
72
|
+
|
|
73
|
+
-- EXCEPT: empty right — should return all of left
|
|
74
|
+
SELECT val FROM sose_t
|
|
75
|
+
EXCEPT
|
|
76
|
+
SELECT val FROM sose_t WHERE 1=0
|
|
77
|
+
ORDER BY val;
|
|
78
|
+
→ [{"val":"alpha"},{"val":"beta"},{"val":"gamma"}]
|
|
79
|
+
|
|
80
|
+
-- EXCEPT: both empty
|
|
81
|
+
SELECT val FROM sose_t WHERE 1=0
|
|
82
|
+
EXCEPT
|
|
83
|
+
SELECT val FROM sose_t WHERE 1=0;
|
|
84
|
+
→ []
|
|
85
|
+
|
|
86
|
+
-- DIFF: empty left
|
|
87
|
+
SELECT val FROM sose_t WHERE 1=0
|
|
88
|
+
DIFF
|
|
89
|
+
SELECT val FROM sose_t
|
|
90
|
+
ORDER BY val;
|
|
91
|
+
→ [{"val":"alpha"},{"val":"beta"},{"val":"gamma"}]
|
|
92
|
+
|
|
93
|
+
-- DIFF: empty right — should return all of left
|
|
94
|
+
SELECT val FROM sose_t
|
|
95
|
+
DIFF
|
|
96
|
+
SELECT val FROM sose_t WHERE 1=0
|
|
97
|
+
ORDER BY val;
|
|
98
|
+
→ [{"val":"alpha"},{"val":"beta"},{"val":"gamma"}]
|
|
99
|
+
|
|
100
|
+
-- DIFF: both empty
|
|
101
|
+
SELECT val FROM sose_t WHERE 1=0
|
|
102
|
+
DIFF
|
|
103
|
+
SELECT val FROM sose_t WHERE 1=0;
|
|
104
|
+
→ []
|
|
105
|
+
|
|
106
|
+
-- ============================================================
|
|
107
|
+
-- SET OPERATIONS: All-duplicate inputs
|
|
108
|
+
-- ============================================================
|
|
109
|
+
|
|
110
|
+
-- UNION on all-duplicate rows deduplicates to one
|
|
111
|
+
SELECT v FROM (VALUES ('dup'), ('dup'), ('dup')) AS t(v)
|
|
112
|
+
UNION
|
|
113
|
+
SELECT v FROM (VALUES ('dup'), ('dup')) AS t(v);
|
|
114
|
+
→ [{"v":"dup"}]
|
|
115
|
+
|
|
116
|
+
-- UNION ALL preserves all duplicates
|
|
117
|
+
SELECT v FROM (VALUES ('dup'), ('dup'), ('dup')) AS t(v)
|
|
118
|
+
UNION ALL
|
|
119
|
+
SELECT v FROM (VALUES ('dup'), ('dup')) AS t(v);
|
|
120
|
+
→ [{"v":"dup"},{"v":"dup"},{"v":"dup"},{"v":"dup"},{"v":"dup"}]
|
|
121
|
+
|
|
122
|
+
-- INTERSECT on all-duplicate rows returns one
|
|
123
|
+
SELECT v FROM (VALUES ('dup'), ('dup'), ('dup')) AS t(v)
|
|
124
|
+
INTERSECT
|
|
125
|
+
SELECT v FROM (VALUES ('dup'), ('dup')) AS t(v);
|
|
126
|
+
→ [{"v":"dup"}]
|
|
127
|
+
|
|
128
|
+
-- EXCEPT on all-duplicate rows (both sides same) returns empty
|
|
129
|
+
SELECT v FROM (VALUES ('dup'), ('dup'), ('dup')) AS t(v)
|
|
130
|
+
EXCEPT
|
|
131
|
+
SELECT v FROM (VALUES ('dup')) AS t(v);
|
|
132
|
+
→ []
|
|
133
|
+
|
|
134
|
+
-- ============================================================
|
|
135
|
+
-- SET OPERATIONS: Three-way / precedence
|
|
136
|
+
-- ============================================================
|
|
137
|
+
|
|
138
|
+
-- Parser is right-associative: A UNION B EXCEPT C = A UNION (B EXCEPT C)
|
|
139
|
+
-- A={1,2}, B={3,4}, C={2,3} → A UNION ({3,4} EXCEPT {2,3}) = {1,2} UNION {4} = {1,2,4}
|
|
140
|
+
SELECT v FROM (VALUES (1), (2)) AS a(v)
|
|
141
|
+
UNION
|
|
142
|
+
SELECT v FROM (VALUES (3), (4)) AS b(v)
|
|
143
|
+
EXCEPT
|
|
144
|
+
SELECT v FROM (VALUES (2), (3)) AS c(v)
|
|
145
|
+
ORDER BY v;
|
|
146
|
+
→ [{"v":1},{"v":2},{"v":4}]
|
|
147
|
+
|
|
148
|
+
-- A EXCEPT B UNION C = A EXCEPT (B UNION C) (right-assoc)
|
|
149
|
+
-- A={1,2,3}, B={2}, C={4} → {1,2,3} EXCEPT ({2} UNION {4}) = {1,2,3} EXCEPT {2,4} = {1,3}
|
|
150
|
+
SELECT v FROM (VALUES (1), (2), (3)) AS a(v)
|
|
151
|
+
EXCEPT
|
|
152
|
+
SELECT v FROM (VALUES (2)) AS b(v)
|
|
153
|
+
UNION
|
|
154
|
+
SELECT v FROM (VALUES (4)) AS c(v)
|
|
155
|
+
ORDER BY v;
|
|
156
|
+
→ [{"v":1},{"v":3}]
|
|
157
|
+
|
|
158
|
+
-- Explicit CTE to force left-to-right: (A EXCEPT B) UNION C
|
|
159
|
+
-- A={1,2,3}, B={2}, C={4} → {1,3} UNION {4} = {1,3,4}
|
|
160
|
+
WITH ab AS (
|
|
161
|
+
SELECT v FROM (VALUES (1), (2), (3)) AS a(v)
|
|
162
|
+
EXCEPT
|
|
163
|
+
SELECT v FROM (VALUES (2)) AS b(v)
|
|
164
|
+
)
|
|
165
|
+
SELECT v FROM ab
|
|
166
|
+
UNION
|
|
167
|
+
SELECT v FROM (VALUES (4)) AS c(v)
|
|
168
|
+
ORDER BY v;
|
|
169
|
+
→ [{"v":1},{"v":3},{"v":4}]
|
|
170
|
+
|
|
171
|
+
-- A INTERSECT B UNION C = A INTERSECT (B UNION C) (right-assoc)
|
|
172
|
+
-- A={1,2,3}, B={2,3,4}, C={5} → {1,2,3} INTERSECT ({2,3,4} UNION {5}) = {1,2,3} INTERSECT {2,3,4,5} = {2,3}
|
|
173
|
+
SELECT v FROM (VALUES (1), (2), (3)) AS a(v)
|
|
174
|
+
INTERSECT
|
|
175
|
+
SELECT v FROM (VALUES (2), (3), (4)) AS b(v)
|
|
176
|
+
UNION
|
|
177
|
+
SELECT v FROM (VALUES (5)) AS c(v)
|
|
178
|
+
ORDER BY v;
|
|
179
|
+
→ [{"v":2},{"v":3}]
|
|
180
|
+
|
|
181
|
+
-- ============================================================
|
|
182
|
+
-- SET OPERATIONS: Column count mismatch (error)
|
|
183
|
+
-- ============================================================
|
|
184
|
+
|
|
185
|
+
SELECT 1
|
|
186
|
+
UNION
|
|
187
|
+
SELECT 1, 2;
|
|
188
|
+
-- error: column count mismatch
|
|
189
|
+
|
|
190
|
+
SELECT 1, 2
|
|
191
|
+
INTERSECT
|
|
192
|
+
SELECT 1;
|
|
193
|
+
-- error: column count mismatch
|
|
194
|
+
|
|
195
|
+
-- ============================================================
|
|
196
|
+
-- SET OPERATIONS: ORDER BY on combined result
|
|
197
|
+
-- ============================================================
|
|
198
|
+
|
|
199
|
+
-- ORDER BY applies to the full result, not just the last branch
|
|
200
|
+
SELECT val FROM sose_t WHERE id = 3
|
|
201
|
+
UNION
|
|
202
|
+
SELECT val FROM sose_t WHERE id = 1
|
|
203
|
+
ORDER BY val;
|
|
204
|
+
→ [{"val":"alpha"},{"val":"gamma"}]
|
|
205
|
+
|
|
206
|
+
-- ORDER BY with DESC on set operation result
|
|
207
|
+
SELECT val FROM sose_t WHERE id IN (1, 3)
|
|
208
|
+
UNION
|
|
209
|
+
SELECT val FROM sose_t WHERE id = 2
|
|
210
|
+
ORDER BY val DESC;
|
|
211
|
+
→ [{"val":"gamma"},{"val":"beta"},{"val":"alpha"}]
|
|
212
|
+
|
|
213
|
+
-- ============================================================
|
|
214
|
+
-- SET OPERATIONS: ORDER BY ordinal (positional) over a compound
|
|
215
|
+
-- Regression: ticket compound-order-by-ordinal-reference. A bare
|
|
216
|
+
-- positional ordinal must order by the compound's Nth OUTPUT column,
|
|
217
|
+
-- not compile to a constant (a no-op).
|
|
218
|
+
-- ============================================================
|
|
219
|
+
|
|
220
|
+
-- Bare ordinal orders by output column 1 (was: input/union order — no-op)
|
|
221
|
+
SELECT v FROM (VALUES (3), (1), (2)) AS a(v)
|
|
222
|
+
UNION
|
|
223
|
+
SELECT v FROM (VALUES (3), (1), (2)) AS b(v)
|
|
224
|
+
ORDER BY 1;
|
|
225
|
+
→ [{"v":1},{"v":2},{"v":3}]
|
|
226
|
+
|
|
227
|
+
-- Descending ordinal over UNION ALL (bag preserves all rows)
|
|
228
|
+
SELECT v FROM (VALUES (3), (1), (2)) AS a(v)
|
|
229
|
+
UNION ALL
|
|
230
|
+
SELECT v FROM (VALUES (3), (1), (2)) AS b(v)
|
|
231
|
+
ORDER BY 1 DESC;
|
|
232
|
+
→ [{"v":3},{"v":3},{"v":2},{"v":2},{"v":1},{"v":1}]
|
|
233
|
+
|
|
234
|
+
-- Ordinal over INTERSECT
|
|
235
|
+
SELECT v FROM (VALUES (3), (1), (2)) AS a(v)
|
|
236
|
+
INTERSECT
|
|
237
|
+
SELECT v FROM (VALUES (2), (3)) AS b(v)
|
|
238
|
+
ORDER BY 1;
|
|
239
|
+
→ [{"v":2},{"v":3}]
|
|
240
|
+
|
|
241
|
+
-- Ordinal over EXCEPT
|
|
242
|
+
SELECT v FROM (VALUES (3), (1), (2)) AS a(v)
|
|
243
|
+
EXCEPT
|
|
244
|
+
SELECT v FROM (VALUES (2)) AS b(v)
|
|
245
|
+
ORDER BY 1;
|
|
246
|
+
→ [{"v":1},{"v":3}]
|
|
247
|
+
|
|
248
|
+
-- Ordinal over DIFF (symmetric difference: (A EXCEPT B) UNION (B EXCEPT A)).
|
|
249
|
+
-- The ordinal resolves over the outer UNION's output column, so positional
|
|
250
|
+
-- ordering works across the structural expansion.
|
|
251
|
+
SELECT v FROM (VALUES (1), (2), (3)) AS a(v)
|
|
252
|
+
DIFF
|
|
253
|
+
SELECT v FROM (VALUES (2), (3), (4)) AS b(v)
|
|
254
|
+
ORDER BY 1 DESC;
|
|
255
|
+
→ [{"v":4},{"v":1}]
|
|
256
|
+
|
|
257
|
+
-- Mixed ordinal + column-name keys in one ORDER BY
|
|
258
|
+
SELECT a, b FROM (VALUES (2, 'x'), (1, 'y'), (1, 'a')) AS t(a, b)
|
|
259
|
+
UNION
|
|
260
|
+
SELECT a, b FROM (VALUES (2, 'x'), (1, 'y'), (1, 'a')) AS u(a, b)
|
|
261
|
+
ORDER BY 1, b DESC;
|
|
262
|
+
→ [{"a":1,"b":"y"},{"a":1,"b":"a"},{"a":2,"b":"x"}]
|
|
263
|
+
|
|
264
|
+
-- Non-integer expression keeps expression semantics (NOT an ordinal):
|
|
265
|
+
-- `1 + 0` is a constant, so the secondary key `v` decides the order.
|
|
266
|
+
SELECT v FROM (VALUES (3), (1), (2)) AS a(v)
|
|
267
|
+
UNION
|
|
268
|
+
SELECT v FROM (VALUES (3), (1), (2)) AS b(v)
|
|
269
|
+
ORDER BY 1 + 0, v;
|
|
270
|
+
→ [{"v":1},{"v":2},{"v":3}]
|
|
271
|
+
|
|
272
|
+
-- Out-of-range ordinal raises the standard prepare-time error
|
|
273
|
+
SELECT v FROM (VALUES (1)) AS a(v)
|
|
274
|
+
UNION
|
|
275
|
+
SELECT v FROM (VALUES (2)) AS b(v)
|
|
276
|
+
ORDER BY 2;
|
|
277
|
+
-- error: ORDER BY position 2 is not in the SELECT list
|
|
278
|
+
|
|
279
|
+
-- Zero ordinal raises the standard prepare-time error
|
|
280
|
+
SELECT v FROM (VALUES (1)) AS a(v)
|
|
281
|
+
UNION
|
|
282
|
+
SELECT v FROM (VALUES (2)) AS b(v)
|
|
283
|
+
ORDER BY 0;
|
|
284
|
+
-- error: ORDER BY position 0 is not in the SELECT list
|
|
285
|
+
|
|
286
|
+
-- ============================================================
|
|
287
|
+
-- SET OPERATIONS: Type preservation
|
|
288
|
+
-- ============================================================
|
|
289
|
+
|
|
290
|
+
-- integer union real: left-side type preserved for matching values;
|
|
291
|
+
-- non-matching values from right side keep their own type
|
|
292
|
+
-- Note: 3.0 has no fractional part, so JS normalizes it to integer
|
|
293
|
+
SELECT typeof(v) AS t, v FROM (
|
|
294
|
+
SELECT v FROM (VALUES (1), (2)) AS a(v)
|
|
295
|
+
UNION
|
|
296
|
+
SELECT v FROM (VALUES (1.0), (3.5)) AS b(v)
|
|
297
|
+
) AS r
|
|
298
|
+
ORDER BY v;
|
|
299
|
+
→ [{"t":"integer","v":1},{"t":"integer","v":2},{"t":"real","v":3.5}]
|
|
300
|
+
|
|
301
|
+
-- ============================================================
|
|
302
|
+
-- SET OPERATIONS: EXCEPT with no overlap (disjoint sets)
|
|
303
|
+
-- ============================================================
|
|
304
|
+
|
|
305
|
+
-- A and B are completely disjoint — EXCEPT should return all of A
|
|
306
|
+
SELECT v FROM (VALUES (1), (2), (3)) AS a(v)
|
|
307
|
+
EXCEPT
|
|
308
|
+
SELECT v FROM (VALUES (4), (5), (6)) AS b(v)
|
|
309
|
+
ORDER BY v;
|
|
310
|
+
→ [{"v":1},{"v":2},{"v":3}]
|
|
311
|
+
|
|
312
|
+
-- ============================================================
|
|
313
|
+
-- SET OPERATIONS: DIFF identity properties
|
|
314
|
+
-- ============================================================
|
|
315
|
+
|
|
316
|
+
-- A DIFF A is always empty
|
|
317
|
+
SELECT v FROM (VALUES (1), (2), (3)) AS a(v)
|
|
318
|
+
DIFF
|
|
319
|
+
SELECT v FROM (VALUES (1), (2), (3)) AS b(v);
|
|
320
|
+
→ []
|
|
321
|
+
|
|
322
|
+
-- A DIFF empty = A
|
|
323
|
+
SELECT v FROM (VALUES (10), (20)) AS a(v)
|
|
324
|
+
DIFF
|
|
325
|
+
SELECT v FROM (VALUES (99)) AS b(v) WHERE 1=0
|
|
326
|
+
ORDER BY v;
|
|
327
|
+
→ [{"v":10},{"v":20}]
|
|
328
|
+
|
|
329
|
+
-- empty DIFF A = A (DIFF is symmetric)
|
|
330
|
+
SELECT v FROM (VALUES (99)) AS a(v) WHERE 1=0
|
|
331
|
+
DIFF
|
|
332
|
+
SELECT v FROM (VALUES (10), (20)) AS b(v)
|
|
333
|
+
ORDER BY v;
|
|
334
|
+
→ [{"v":10},{"v":20}]
|
|
335
|
+
|
|
336
|
+
DROP TABLE sose_t;
|
|
337
|
+
|
|
338
|
+
-- ============================================================
|
|
339
|
+
-- SORT: Setup for sort edge cases
|
|
340
|
+
-- ============================================================
|
|
341
|
+
|
|
342
|
+
CREATE TABLE sort_t (id INTEGER PRIMARY KEY, key TEXT, seq INTEGER);
|
|
343
|
+
INSERT INTO sort_t VALUES (1, 'X', 10);
|
|
344
|
+
INSERT INTO sort_t VALUES (2, 'X', 20);
|
|
345
|
+
INSERT INTO sort_t VALUES (3, 'X', 30);
|
|
346
|
+
INSERT INTO sort_t VALUES (4, 'Y', 40);
|
|
347
|
+
INSERT INTO sort_t VALUES (5, 'Y', 50);
|
|
348
|
+
-- run
|
|
349
|
+
|
|
350
|
+
-- ============================================================
|
|
351
|
+
-- SORT: Stability with duplicate keys
|
|
352
|
+
-- ============================================================
|
|
353
|
+
|
|
354
|
+
-- Rows with identical sort key 'X' should retain insertion order (stable sort)
|
|
355
|
+
SELECT id, key FROM sort_t WHERE key = 'X' ORDER BY key;
|
|
356
|
+
→ [{"id":1,"key":"X"},{"id":2,"key":"X"},{"id":3,"key":"X"}]
|
|
357
|
+
|
|
358
|
+
-- All rows sorted by key; within same key, insertion order preserved
|
|
359
|
+
SELECT id, key FROM sort_t ORDER BY key;
|
|
360
|
+
→ [{"id":1,"key":"X"},{"id":2,"key":"X"},{"id":3,"key":"X"},{"id":4,"key":"Y"},{"id":5,"key":"Y"}]
|
|
361
|
+
|
|
362
|
+
-- ============================================================
|
|
363
|
+
-- SORT: Expression-based ORDER BY with NULLs
|
|
364
|
+
-- ============================================================
|
|
365
|
+
|
|
366
|
+
CREATE TABLE sort_nulls (id INTEGER PRIMARY KEY, x INTEGER NULL);
|
|
367
|
+
INSERT INTO sort_nulls VALUES (1, NULL);
|
|
368
|
+
INSERT INTO sort_nulls VALUES (2, 5);
|
|
369
|
+
INSERT INTO sort_nulls VALUES (3, NULL);
|
|
370
|
+
INSERT INTO sort_nulls VALUES (4, 1);
|
|
371
|
+
INSERT INTO sort_nulls VALUES (5, 10);
|
|
372
|
+
-- run
|
|
373
|
+
|
|
374
|
+
-- ORDER BY coalesce(x, 0) — NULLs become 0 and sort before positive values
|
|
375
|
+
SELECT id, x FROM sort_nulls ORDER BY coalesce(x, 0);
|
|
376
|
+
→ [{"id":1,"x":null},{"id":3,"x":null},{"id":4,"x":1},{"id":2,"x":5},{"id":5,"x":10}]
|
|
377
|
+
|
|
378
|
+
-- ORDER BY expression: x IS NULL puts NULLs last (false=0 < true=1)
|
|
379
|
+
SELECT id, x FROM sort_nulls ORDER BY x IS NULL, x;
|
|
380
|
+
→ [{"id":4,"x":1},{"id":2,"x":5},{"id":5,"x":10},{"id":1,"x":null},{"id":3,"x":null}]
|
|
381
|
+
|
|
382
|
+
-- ============================================================
|
|
383
|
+
-- SORT: ORDER BY on aliased expressions
|
|
384
|
+
-- ============================================================
|
|
385
|
+
|
|
386
|
+
SELECT x + 10 AS y FROM sort_nulls WHERE x IS NOT NULL ORDER BY y;
|
|
387
|
+
→ [{"y":11},{"y":15},{"y":20}]
|
|
388
|
+
|
|
389
|
+
SELECT id, coalesce(x, -1) AS cx FROM sort_nulls ORDER BY cx;
|
|
390
|
+
→ [{"id":1,"cx":-1},{"id":3,"cx":-1},{"id":4,"cx":1},{"id":2,"cx":5},{"id":5,"cx":10}]
|
|
391
|
+
|
|
392
|
+
-- ============================================================
|
|
393
|
+
-- SORT: Large multi-column sort with mixed directions and NULLS FIRST/LAST
|
|
394
|
+
-- ============================================================
|
|
395
|
+
|
|
396
|
+
CREATE TABLE sort_multi (
|
|
397
|
+
id INTEGER PRIMARY KEY,
|
|
398
|
+
a INTEGER,
|
|
399
|
+
b TEXT,
|
|
400
|
+
c INTEGER,
|
|
401
|
+
d TEXT,
|
|
402
|
+
e INTEGER NULL
|
|
403
|
+
);
|
|
404
|
+
INSERT INTO sort_multi VALUES (1, 1, 'x', 10, 'p', NULL);
|
|
405
|
+
INSERT INTO sort_multi VALUES (2, 1, 'x', 10, 'q', 5);
|
|
406
|
+
INSERT INTO sort_multi VALUES (3, 1, 'x', 20, 'p', 3);
|
|
407
|
+
INSERT INTO sort_multi VALUES (4, 1, 'y', 10, 'p', 1);
|
|
408
|
+
INSERT INTO sort_multi VALUES (5, 2, 'x', 10, 'p', NULL);
|
|
409
|
+
INSERT INTO sort_multi VALUES (6, 2, 'x', 10, 'p', 2);
|
|
410
|
+
INSERT INTO sort_multi VALUES (7, 2, 'y', 30, 'q', 4);
|
|
411
|
+
INSERT INTO sort_multi VALUES (8, 1, 'x', 10, 'p', 7);
|
|
412
|
+
-- run
|
|
413
|
+
|
|
414
|
+
-- 5-column ORDER BY: a ASC, b DESC, c ASC, d DESC, e ASC NULLS FIRST
|
|
415
|
+
-- a=1,b='y' first; then a=1,b='x': c=10,d='q'(id=2) before c=10,d='p'; NULLs first in e
|
|
416
|
+
SELECT id FROM sort_multi
|
|
417
|
+
ORDER BY a ASC, b DESC, c ASC, d DESC, e ASC NULLS FIRST;
|
|
418
|
+
→ [{"id":4},{"id":2},{"id":1},{"id":8},{"id":3},{"id":7},{"id":5},{"id":6}]
|
|
419
|
+
|
|
420
|
+
-- ============================================================
|
|
421
|
+
-- SORT: ORDER BY in subquery vs outer — outer wins
|
|
422
|
+
-- ============================================================
|
|
423
|
+
|
|
424
|
+
-- Inner ORDER BY x DESC, outer ORDER BY id ASC — outer should win
|
|
425
|
+
SELECT id, x FROM (
|
|
426
|
+
SELECT id, x FROM sort_nulls WHERE x IS NOT NULL ORDER BY x DESC
|
|
427
|
+
) AS sub
|
|
428
|
+
ORDER BY id;
|
|
429
|
+
→ [{"id":2,"x":5},{"id":4,"x":1},{"id":5,"x":10}]
|
|
430
|
+
|
|
431
|
+
-- Inner ORDER BY id DESC, outer ORDER BY x ASC — outer should win
|
|
432
|
+
SELECT id, x FROM (
|
|
433
|
+
SELECT id, x FROM sort_nulls WHERE x IS NOT NULL ORDER BY id DESC
|
|
434
|
+
) AS sub
|
|
435
|
+
ORDER BY x;
|
|
436
|
+
→ [{"id":4,"x":1},{"id":2,"x":5},{"id":5,"x":10}]
|
|
437
|
+
|
|
438
|
+
-- ============================================================
|
|
439
|
+
-- Cleanup
|
|
440
|
+
-- ============================================================
|
|
441
|
+
|
|
442
|
+
DROP TABLE sort_t;
|
|
443
|
+
DROP TABLE sort_nulls;
|
|
444
|
+
DROP TABLE sort_multi;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
-- adapted from SQLite test/select4.test, test/select8.test, test/select9.test,
|
|
2
|
+
-- test/selectA.test, test/limit.test
|
|
3
|
+
-- LIMIT / OFFSET applied to the result of a compound SELECT, plus VALUES
|
|
4
|
+
-- clauses appearing as compound operands and compound queries used as
|
|
5
|
+
-- derived tables.
|
|
6
|
+
|
|
7
|
+
create table c_left (id integer primary key, val text);
|
|
8
|
+
create table c_right (id integer primary key, val text);
|
|
9
|
+
insert into c_left values (1, 'a'), (2, 'b'), (3, 'c');
|
|
10
|
+
insert into c_right values (1, 'a'), (4, 'd'), (5, 'e');
|
|
11
|
+
|
|
12
|
+
-- LIMIT applies to the dedup'd UNION result, not to the final branch alone
|
|
13
|
+
select val from c_left union select val from c_right order by val limit 3;
|
|
14
|
+
→ [{"val":"a"},{"val":"b"},{"val":"c"}]
|
|
15
|
+
|
|
16
|
+
-- LIMIT + OFFSET on UNION
|
|
17
|
+
select val from c_left union select val from c_right order by val limit 2 offset 1;
|
|
18
|
+
→ [{"val":"b"},{"val":"c"}]
|
|
19
|
+
|
|
20
|
+
-- UNION ALL retains duplicates; LIMIT trims the merged stream
|
|
21
|
+
select val from c_left union all select val from c_right order by val limit 4;
|
|
22
|
+
→ [{"val":"a"},{"val":"a"},{"val":"b"},{"val":"c"}]
|
|
23
|
+
|
|
24
|
+
-- UNION ALL with OFFSET past duplicates
|
|
25
|
+
select val from c_left union all select val from c_right order by val limit 100 offset 2;
|
|
26
|
+
→ [{"val":"b"},{"val":"c"},{"val":"d"},{"val":"e"}]
|
|
27
|
+
|
|
28
|
+
-- INTERSECT with LIMIT
|
|
29
|
+
select val from c_left intersect select val from c_right limit 1;
|
|
30
|
+
→ [{"val":"a"}]
|
|
31
|
+
|
|
32
|
+
-- EXCEPT with LIMIT — left-only values, ordered, capped
|
|
33
|
+
select val from c_left except select val from c_right order by val limit 2;
|
|
34
|
+
→ [{"val":"b"},{"val":"c"}]
|
|
35
|
+
|
|
36
|
+
-- LIMIT 0 on a compound — empty result regardless of operands
|
|
37
|
+
select val from c_left union select val from c_right order by val limit 0;
|
|
38
|
+
→ []
|
|
39
|
+
|
|
40
|
+
-- Compound + LIMIT in DESC direction
|
|
41
|
+
select val from c_left union select val from c_right order by val desc limit 2;
|
|
42
|
+
→ [{"val":"e"},{"val":"d"}]
|
|
43
|
+
|
|
44
|
+
drop table c_right;
|
|
45
|
+
drop table c_left;
|
|
46
|
+
|
|
47
|
+
-- =============================================================================
|
|
48
|
+
-- VALUES clause as compound operand
|
|
49
|
+
-- =============================================================================
|
|
50
|
+
|
|
51
|
+
-- VALUES UNION VALUES — orthogonal QueryExpr surface now accepts bare
|
|
52
|
+
-- VALUES at top-level participating in a compound. Column names are
|
|
53
|
+
-- synthesized (`column_0`, `column_1`); a SELECT FROM (VALUES ...) form
|
|
54
|
+
-- below preserves user-chosen aliases.
|
|
55
|
+
values (1, 'x'), (2, 'y')
|
|
56
|
+
union
|
|
57
|
+
values (2, 'y'), (3, 'z')
|
|
58
|
+
order by column_0;
|
|
59
|
+
→ [{"column_0":1,"column_1":"x"},{"column_0":2,"column_1":"y"},{"column_0":3,"column_1":"z"}]
|
|
60
|
+
|
|
61
|
+
-- Equivalent expressed via SELECT-FROM-VALUES wrapping with explicit aliases
|
|
62
|
+
select c1, c2 from (values (1, 'x'), (2, 'y')) as v(c1, c2)
|
|
63
|
+
union
|
|
64
|
+
select c1, c2 from (values (2, 'y'), (3, 'z')) as v(c1, c2)
|
|
65
|
+
order by c1;
|
|
66
|
+
→ [{"c1":1,"c2":"x"},{"c1":2,"c2":"y"},{"c1":3,"c2":"z"}]
|
|
67
|
+
|
|
68
|
+
-- VALUES INTERSECT VALUES (wrapped form)
|
|
69
|
+
select c1 from (values (1), (2), (3)) as v(c1)
|
|
70
|
+
intersect
|
|
71
|
+
select c1 from (values (2), (4), (5)) as v(c1);
|
|
72
|
+
→ [{"c1":2}]
|
|
73
|
+
|
|
74
|
+
-- VALUES EXCEPT VALUES (wrapped form)
|
|
75
|
+
select c1 from (values (1), (2), (3)) as v(c1)
|
|
76
|
+
except
|
|
77
|
+
select c1 from (values (2)) as v(c1)
|
|
78
|
+
order by c1;
|
|
79
|
+
→ [{"c1":1},{"c1":3}]
|
|
80
|
+
|
|
81
|
+
-- Mixed: SELECT UNION VALUES (wrapped form)
|
|
82
|
+
create table v_t (id integer primary key, val integer);
|
|
83
|
+
insert into v_t values (1, 10), (2, 20);
|
|
84
|
+
|
|
85
|
+
select val from v_t
|
|
86
|
+
union
|
|
87
|
+
select c1 as val from (values (30), (10)) as v(c1)
|
|
88
|
+
order by val;
|
|
89
|
+
→ [{"val":10},{"val":20},{"val":30}]
|
|
90
|
+
|
|
91
|
+
drop table v_t;
|
|
92
|
+
|
|
93
|
+
-- =============================================================================
|
|
94
|
+
-- Compound SELECT used as derived table; outer WHERE / DISTINCT / GROUP BY apply
|
|
95
|
+
-- =============================================================================
|
|
96
|
+
|
|
97
|
+
create table dt_a (id integer primary key, k integer);
|
|
98
|
+
create table dt_b (id integer primary key, k integer);
|
|
99
|
+
insert into dt_a values (1, 10), (2, 20), (3, 30);
|
|
100
|
+
insert into dt_b values (4, 20), (5, 30), (6, 40);
|
|
101
|
+
|
|
102
|
+
-- UNION ALL inside FROM clause; outer WHERE filters the merged stream
|
|
103
|
+
select k from (
|
|
104
|
+
select k from dt_a
|
|
105
|
+
union all
|
|
106
|
+
select k from dt_b
|
|
107
|
+
) sub
|
|
108
|
+
where k >= 20
|
|
109
|
+
order by k;
|
|
110
|
+
→ [{"k":20},{"k":20},{"k":30},{"k":30},{"k":40}]
|
|
111
|
+
|
|
112
|
+
-- DISTINCT applied to the compound result via the outer SELECT
|
|
113
|
+
select distinct k from (
|
|
114
|
+
select k from dt_a
|
|
115
|
+
union all
|
|
116
|
+
select k from dt_b
|
|
117
|
+
) sub
|
|
118
|
+
order by k;
|
|
119
|
+
→ [{"k":10},{"k":20},{"k":30},{"k":40}]
|
|
120
|
+
|
|
121
|
+
-- GROUP BY + COUNT(*) over compound merge
|
|
122
|
+
select k, count(*) as cnt from (
|
|
123
|
+
select k from dt_a
|
|
124
|
+
union all
|
|
125
|
+
select k from dt_b
|
|
126
|
+
) sub
|
|
127
|
+
group by k
|
|
128
|
+
order by k;
|
|
129
|
+
→ [{"k":10,"cnt":1},{"k":20,"cnt":2},{"k":30,"cnt":2},{"k":40,"cnt":1}]
|
|
130
|
+
|
|
131
|
+
-- LIMIT inside derived table is independent of the outer ORDER BY
|
|
132
|
+
select k from (
|
|
133
|
+
select k from dt_a
|
|
134
|
+
union all
|
|
135
|
+
select k from dt_b
|
|
136
|
+
order by k
|
|
137
|
+
limit 3
|
|
138
|
+
) sub
|
|
139
|
+
order by k;
|
|
140
|
+
→ [{"k":10},{"k":20},{"k":20}]
|
|
141
|
+
|
|
142
|
+
drop table dt_b;
|
|
143
|
+
drop table dt_a;
|