@quereus/quereus 4.20.1 → 4.20.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/package.json +7 -4
- package/test/README.md +173 -0
- package/test/logic/01-basic.sqllogic +39 -0
- package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
- package/test/logic/01.2-strings.sqllogic +43 -0
- package/test/logic/01.5-insert-select.sqllogic +237 -0
- package/test/logic/01.6-update-extras.sqllogic +118 -0
- package/test/logic/01.7-update-from.sqllogic +67 -0
- package/test/logic/01.8-delete-extras.sqllogic +122 -0
- package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
- package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
- package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
- package/test/logic/01.9-query-expr-values.sqllogic +111 -0
- package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
- package/test/logic/02-filters.sqllogic +54 -0
- package/test/logic/02-smoke.sqllogic +62 -0
- package/test/logic/02.1-bind-parameters.sqllogic +223 -0
- package/test/logic/03-expressions.sqllogic +190 -0
- package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
- package/test/logic/03.4-defaults.sqllogic +554 -0
- package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
- package/test/logic/03.5-tvf.sqllogic +61 -0
- package/test/logic/03.6-type-system.sqllogic +544 -0
- package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
- package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
- package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
- package/test/logic/03.8-not-precedence.sqllogic +255 -0
- package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
- package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
- package/test/logic/04-order-by.sqllogic +38 -0
- package/test/logic/04-transactions.sqllogic +239 -0
- package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
- package/test/logic/05-vtab_memory.sqllogic +50 -0
- package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
- package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
- package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
- package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
- package/test/logic/06-builtin_functions.sqllogic +149 -0
- package/test/logic/06.1-string-functions.sqllogic +92 -0
- package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
- package/test/logic/06.2-math-functions.sqllogic +82 -0
- package/test/logic/06.3-schema.sqllogic +48 -0
- package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
- package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
- package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
- package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
- package/test/logic/06.3.4-view-info.sqllogic +378 -0
- package/test/logic/06.3.5-column-info.sqllogic +347 -0
- package/test/logic/06.3.6-schema-views.sqllogic +29 -0
- package/test/logic/06.4-schema-search-path.sqllogic +354 -0
- package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
- package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
- package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
- package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
- package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
- package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
- package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
- package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
- package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
- package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
- package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
- package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
- package/test/logic/06.7-json-extended.sqllogic +53 -0
- package/test/logic/06.8-json-path-operators.sqllogic +99 -0
- package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
- package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
- package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
- package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
- package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
- package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
- package/test/logic/07-aggregates.sqllogic +193 -0
- package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
- package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
- package/test/logic/07.3-group-by-extras.sqllogic +602 -0
- package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
- package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
- package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
- package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
- package/test/logic/07.5-window.sqllogic +1941 -0
- package/test/logic/07.5.1-window-named.sqllogic +13 -0
- package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
- package/test/logic/07.6-subqueries.sqllogic +78 -0
- package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
- package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
- package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
- package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
- package/test/logic/07.7.1-in-extras.sqllogic +158 -0
- package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
- package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
- package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
- package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
- package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
- package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
- package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
- package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
- package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
- package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
- package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
- package/test/logic/07.9-in-value-list.sqllogic +154 -0
- package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
- package/test/logic/08-views.sqllogic +64 -0
- package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
- package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
- package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
- package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
- package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
- package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
- package/test/logic/09-set_operations.sqllogic +244 -0
- package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
- package/test/logic/10-distinct_datatypes.sqllogic +127 -0
- package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
- package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
- package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
- package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
- package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
- package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
- package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
- package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
- package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
- package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
- package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
- package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
- package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
- package/test/logic/10.2-column-features.sqllogic +365 -0
- package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
- package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
- package/test/logic/10.3-function-features.sqllogic +247 -0
- package/test/logic/10.4-schema-scale.sqllogic +168 -0
- package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
- package/test/logic/10.5-indexes.sqllogic +164 -0
- package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
- package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
- package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
- package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
- package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
- package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
- package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
- package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
- package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
- package/test/logic/100.1-where-extras.sqllogic +163 -0
- package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
- package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
- package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
- package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
- package/test/logic/102-unique-constraints.sqllogic +145 -0
- package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
- package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
- package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
- package/test/logic/102.2-unique-collation.sqllogic +181 -0
- package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
- package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
- package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
- package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
- package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
- package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
- package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
- package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
- package/test/logic/108-cardinality-estimation.sqllogic +146 -0
- package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
- package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
- package/test/logic/11-joins.sqllogic +86 -0
- package/test/logic/11.1-join-using.sqllogic +267 -0
- package/test/logic/11.2-comma-join.sqllogic +35 -0
- package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
- package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
- package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
- package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
- package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
- package/test/logic/12-empty-primary-key.sqllogic +124 -0
- package/test/logic/12-join_padding_order.sqllogic +58 -0
- package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
- package/test/logic/13-cte.sqllogic +137 -0
- package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
- package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
- package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
- package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
- package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
- package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
- package/test/logic/13.4-cte-extras.sqllogic +98 -0
- package/test/logic/13.5-cte-join-order.sqllogic +166 -0
- package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
- package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
- package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
- package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
- package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
- package/test/logic/14-utilities.sqllogic +168 -0
- package/test/logic/15-timespan.sqllogic +279 -0
- package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
- package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
- package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
- package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
- package/test/logic/16-epoch.sqllogic +187 -0
- package/test/logic/17-weekday-modifier.sqllogic +78 -0
- package/test/logic/18-json-string-escapes.sqllogic +86 -0
- package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
- package/test/logic/20-empty-single-row.sqllogic +261 -0
- package/test/logic/21-null-edge-cases.sqllogic +227 -0
- package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
- package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
- package/test/logic/21.2-between-edges.sqllogic +157 -0
- package/test/logic/22-boundary-values.sqllogic +175 -0
- package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
- package/test/logic/24-builtin-branches.sqllogic +611 -0
- package/test/logic/24.1-substr-extras.sqllogic +75 -0
- package/test/logic/24.2-random-extras.sqllogic +39 -0
- package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
- package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
- package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
- package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
- package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
- package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
- package/test/logic/26-join-edge-cases.sqllogic +333 -0
- package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
- package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
- package/test/logic/26.3-join-on-constants.sqllogic +61 -0
- package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
- package/test/logic/27-window-edge-cases.sqllogic +206 -0
- package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
- package/test/logic/27.2-window-exclude.sqllogic +13 -0
- package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
- package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
- package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
- package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
- package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
- package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
- package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
- package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
- package/test/logic/40-constraints.sqllogic +418 -0
- package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
- package/test/logic/40.2-check-extras.sqllogic +683 -0
- package/test/logic/41-alter-table.sqllogic +191 -0
- package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
- package/test/logic/41-fk-cross-schema.sqllogic +155 -0
- package/test/logic/41-fk-extended-targets.sqllogic +173 -0
- package/test/logic/41-foreign-keys.sqllogic +1001 -0
- package/test/logic/41-generated-column-errors.sqllogic +225 -0
- package/test/logic/41-generated-column-extras.sqllogic +598 -0
- package/test/logic/41-generated-column-scope.sqllogic +329 -0
- package/test/logic/41-generated-columns.sqllogic +361 -0
- package/test/logic/41.1-alter-pk.sqllogic +230 -0
- package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
- package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
- package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
- package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
- package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
- package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
- package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
- package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
- package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
- package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
- package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
- package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
- package/test/logic/41.2-alter-column.sqllogic +382 -0
- package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
- package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
- package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
- package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
- package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
- package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
- package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
- package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
- package/test/logic/41.5-alter-misc.sqllogic +48 -0
- package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
- package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
- package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
- package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
- package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
- package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
- package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
- package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
- package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
- package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
- package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
- package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
- package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
- package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
- package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
- package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
- package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
- package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
- package/test/logic/42-committed-snapshot.sqllogic +254 -0
- package/test/logic/42-returning.sqllogic +159 -0
- package/test/logic/42.1-returning-extras.sqllogic +232 -0
- package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
- package/test/logic/43-default-nullability.sqllogic +131 -0
- package/test/logic/43-transition-constraints.sqllogic +341 -0
- package/test/logic/43.1-default-collation.sqllogic +140 -0
- package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
- package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
- package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
- package/test/logic/44-determinism-validation.sqllogic +164 -0
- package/test/logic/44-orthogonality.sqllogic +146 -0
- package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
- package/test/logic/45-udf-determinism.sqllogic +39 -0
- package/test/logic/46-mutation-context.sqllogic +595 -0
- package/test/logic/47-upsert.sqllogic +255 -0
- package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
- package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
- package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
- package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
- package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
- package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
- package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
- package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
- package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
- package/test/logic/49-reference-graph.sqllogic +84 -0
- package/test/logic/50-declarative-schema.sqllogic +2550 -0
- package/test/logic/50-metadata-tags.sqllogic +1033 -0
- package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
- package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
- package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
- package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +173 -0
- package/test/logic/50.3-declare-schema-duplicate-names.sqllogic +280 -0
- package/test/logic/50.4-declare-schema-apply-restore.sqllogic +192 -0
- package/test/logic/51-lens-foundation.sqllogic +147 -0
- package/test/logic/51-materialized-views.sqllogic +376 -0
- package/test/logic/51.5-materialized-views-coarsened-key.sqllogic +198 -0
- package/test/logic/51.7-maintained-table-attach-detach.sqllogic +468 -0
- package/test/logic/51.8-maintained-table-declared-constraints.sqllogic +440 -0
- package/test/logic/51.85-maintained-table-parent-fk.sqllogic +103 -0
- package/test/logic/51.9-maintained-table-secondary-unique.sqllogic +237 -0
- package/test/logic/51.9.1-maintained-table-partial-unique.sqllogic +36 -0
- package/test/logic/52-lens-overrides.sqllogic +566 -0
- package/test/logic/53-materialized-views-rowtime.sqllogic +1601 -0
- package/test/logic/53-reserved-tags.sqllogic +252 -0
- package/test/logic/53.1-materialized-view-write-through.sqllogic +329 -0
- package/test/logic/53.2-materialized-view-rename-propagation.sqllogic +483 -0
- package/test/logic/53.3-materialized-view-constraint-only-ddl.sqllogic +409 -0
- package/test/logic/53.3.1-materialized-view-index-ddl-irrelevance.sqllogic +29 -0
- package/test/logic/53.4-materialized-view-structural-alter-restore.sqllogic +436 -0
- package/test/logic/54-covering-mv-enforcement.sqllogic +314 -0
- package/test/logic/54.1-covering-mv-partial-enforcement.sqllogic +34 -0
- package/test/logic/55-internal-eviction-reporting.sqllogic +89 -0
- package/test/logic/55-lens-prover.sqllogic +202 -0
- package/test/logic/55.1-eviction-restrict-fk.sqllogic +148 -0
- package/test/logic/55.5-lens-authored-inverse.sqllogic +1468 -0
- package/test/logic/80-grow-retrieve-pass.sqllogic +79 -0
- package/test/logic/81-quickpick.sqllogic +24 -0
- package/test/logic/82-bloom-join.sqllogic +185 -0
- package/test/logic/83-merge-join.sqllogic +280 -0
- package/test/logic/84-asof-scan.sqllogic +238 -0
- package/test/logic/84-key-cardinality.sqllogic +50 -0
- package/test/logic/85-relational-const-folding.sqllogic +51 -0
- package/test/logic/86-scalar-cse.sqllogic +42 -0
- package/test/logic/90-error_paths.sqllogic +114 -0
- package/test/logic/90.1-parse-errors.sqllogic +77 -0
- package/test/logic/90.2-alter-table-errors.sqllogic +53 -0
- package/test/logic/90.2.1-alter-extra-errors.sqllogic +51 -0
- package/test/logic/90.3-expression-errors.sqllogic +43 -0
- package/test/logic/90.4-dml-errors.sqllogic +47 -0
- package/test/logic/90.5-unsupported-join-types.sqllogic +37 -0
- package/test/logic/90.5.1-right-full-join-read.sqllogic +157 -0
- package/test/logic/90.6-select-error-paths.sqllogic +57 -0
- package/test/logic/91-merge-join-edge-cases.sqllogic +159 -0
- package/test/logic/92-hash-aggregate-edge-cases.sqllogic +139 -0
- package/test/logic/93-ddl-view-edge-cases.sqllogic +104 -0
- package/test/logic/93.1-view-error-paths.sqllogic +74 -0
- package/test/logic/93.2-view-mutation-pending.sqllogic +108 -0
- package/test/logic/93.3-view-mutation-or-clause.sqllogic +60 -0
- package/test/logic/93.4-view-mutation.sqllogic +4881 -0
- package/test/logic/93.4.1-view-mutation-partial-unique-cardinality.sqllogic +31 -0
- package/test/logic/93.5-authored-inverse.sqllogic +415 -0
- package/test/logic/93.6-set-op-flagless-write.sqllogic +862 -0
- package/test/logic/94-tvf-edge-cases.sqllogic +58 -0
- package/test/logic/94.1-limit-offset-edge-cases.sqllogic +109 -0
- package/test/logic/94.2-limit-offset-extras.sqllogic +98 -0
- package/test/logic/95-assertions.sqllogic +1417 -0
- package/test/logic/96-subquery-edge-cases.sqllogic +276 -0
- package/test/logic/97-json-function-edge-cases.sqllogic +633 -0
- package/test/logic/97.1-json-blob-and-special-values.sqllogic +92 -0
- package/test/logic/98-temporal-edge-cases.sqllogic +515 -0
- package/test/logic/99-conversion-edge-cases.sqllogic +325 -0
- package/test/logic/99.0.1-schema-index-listing.sqllogic +21 -0
- package/test/logic/99.1-cast-syntax-extras.sqllogic +167 -0
- package/test/logic/drop-unique-index.sqllogic +88 -0
- package/test/logic/pushdown-test.sqllogic +36 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
-- 108-cardinality-estimation.sqllogic
|
|
2
|
+
-- Exercises ANALYZE (initial run, re-run after data changes) over skewed data
|
|
3
|
+
-- and checks that results stay correct throughout — row counts, GROUP BY
|
|
4
|
+
-- distribution, equality/range filters, and joins. It does NOT assert plan
|
|
5
|
+
-- shape, index selection, or access method; nothing here fails if ANALYZE's
|
|
6
|
+
-- statistics are ignored by the optimizer. Cost-based plan-shape assertions
|
|
7
|
+
-- driven by ANALYZE statistics live in test/where-conjunct-ordering.spec.ts
|
|
8
|
+
-- and test/optimizer/*.spec.ts.
|
|
9
|
+
|
|
10
|
+
-- ═══════════════════════════════════════════════════════════════════════
|
|
11
|
+
-- Setup: table with skewed data distribution
|
|
12
|
+
-- ═══════════════════════════════════════════════════════════════════════
|
|
13
|
+
|
|
14
|
+
CREATE TABLE ce_products (
|
|
15
|
+
id INTEGER PRIMARY KEY,
|
|
16
|
+
category TEXT,
|
|
17
|
+
price REAL,
|
|
18
|
+
name TEXT
|
|
19
|
+
) USING memory;
|
|
20
|
+
|
|
21
|
+
-- 40 rows: 4 categories (high selectivity equality), spread prices
|
|
22
|
+
-- Category distribution: 10 electronics, 10 books, 10 clothing, 10 food
|
|
23
|
+
-- Price distribution: 9.99 to 399.60
|
|
24
|
+
|
|
25
|
+
-- Insert rows (one per statement)
|
|
26
|
+
INSERT INTO ce_products VALUES (1, 'electronics', 9.99, 'item_1');
|
|
27
|
+
INSERT INTO ce_products VALUES (2, 'books', 19.98, 'item_2');
|
|
28
|
+
INSERT INTO ce_products VALUES (3, 'clothing', 29.97, 'item_3');
|
|
29
|
+
INSERT INTO ce_products VALUES (4, 'food', 39.96, 'item_4');
|
|
30
|
+
INSERT INTO ce_products VALUES (5, 'electronics', 49.95, 'item_5');
|
|
31
|
+
INSERT INTO ce_products VALUES (6, 'books', 59.94, 'item_6');
|
|
32
|
+
INSERT INTO ce_products VALUES (7, 'clothing', 69.93, 'item_7');
|
|
33
|
+
INSERT INTO ce_products VALUES (8, 'food', 79.92, 'item_8');
|
|
34
|
+
INSERT INTO ce_products VALUES (9, 'electronics', 89.91, 'item_9');
|
|
35
|
+
INSERT INTO ce_products VALUES (10, 'books', 99.90, 'item_10');
|
|
36
|
+
INSERT INTO ce_products VALUES (11, 'clothing', 109.89, 'item_11');
|
|
37
|
+
INSERT INTO ce_products VALUES (12, 'food', 119.88, 'item_12');
|
|
38
|
+
INSERT INTO ce_products VALUES (13, 'electronics', 129.87, 'item_13');
|
|
39
|
+
INSERT INTO ce_products VALUES (14, 'books', 139.86, 'item_14');
|
|
40
|
+
INSERT INTO ce_products VALUES (15, 'clothing', 149.85, 'item_15');
|
|
41
|
+
INSERT INTO ce_products VALUES (16, 'food', 159.84, 'item_16');
|
|
42
|
+
INSERT INTO ce_products VALUES (17, 'electronics', 169.83, 'item_17');
|
|
43
|
+
INSERT INTO ce_products VALUES (18, 'books', 179.82, 'item_18');
|
|
44
|
+
INSERT INTO ce_products VALUES (19, 'clothing', 189.81, 'item_19');
|
|
45
|
+
INSERT INTO ce_products VALUES (20, 'food', 199.80, 'item_20');
|
|
46
|
+
INSERT INTO ce_products VALUES (21, 'electronics', 209.79, 'item_21');
|
|
47
|
+
INSERT INTO ce_products VALUES (22, 'books', 219.78, 'item_22');
|
|
48
|
+
INSERT INTO ce_products VALUES (23, 'clothing', 229.77, 'item_23');
|
|
49
|
+
INSERT INTO ce_products VALUES (24, 'food', 239.76, 'item_24');
|
|
50
|
+
INSERT INTO ce_products VALUES (25, 'electronics', 249.75, 'item_25');
|
|
51
|
+
INSERT INTO ce_products VALUES (26, 'books', 259.74, 'item_26');
|
|
52
|
+
INSERT INTO ce_products VALUES (27, 'clothing', 269.73, 'item_27');
|
|
53
|
+
INSERT INTO ce_products VALUES (28, 'food', 279.72, 'item_28');
|
|
54
|
+
INSERT INTO ce_products VALUES (29, 'electronics', 289.71, 'item_29');
|
|
55
|
+
INSERT INTO ce_products VALUES (30, 'books', 299.70, 'item_30');
|
|
56
|
+
INSERT INTO ce_products VALUES (31, 'clothing', 309.69, 'item_31');
|
|
57
|
+
INSERT INTO ce_products VALUES (32, 'food', 319.68, 'item_32');
|
|
58
|
+
INSERT INTO ce_products VALUES (33, 'electronics', 329.67, 'item_33');
|
|
59
|
+
INSERT INTO ce_products VALUES (34, 'books', 339.66, 'item_34');
|
|
60
|
+
INSERT INTO ce_products VALUES (35, 'clothing', 349.65, 'item_35');
|
|
61
|
+
INSERT INTO ce_products VALUES (36, 'food', 359.64, 'item_36');
|
|
62
|
+
INSERT INTO ce_products VALUES (37, 'electronics', 369.63, 'item_37');
|
|
63
|
+
INSERT INTO ce_products VALUES (38, 'books', 379.62, 'item_38');
|
|
64
|
+
INSERT INTO ce_products VALUES (39, 'clothing', 389.61, 'item_39');
|
|
65
|
+
INSERT INTO ce_products VALUES (40, 'food', 399.60, 'item_40');
|
|
66
|
+
|
|
67
|
+
-- Run ANALYZE to collect statistics
|
|
68
|
+
ANALYZE ce_products;
|
|
69
|
+
|
|
70
|
+
-- ═══════════════════════════════════════════════════════════════════════
|
|
71
|
+
-- Verify ANALYZE produces valid output
|
|
72
|
+
-- ═══════════════════════════════════════════════════════════════════════
|
|
73
|
+
|
|
74
|
+
-- Correctness: verify data is intact after ANALYZE
|
|
75
|
+
SELECT count(*) AS cnt FROM ce_products;
|
|
76
|
+
→ [{"cnt":40}]
|
|
77
|
+
|
|
78
|
+
-- Correctness: category distribution
|
|
79
|
+
SELECT category, count(*) AS cnt FROM ce_products GROUP BY category ORDER BY category;
|
|
80
|
+
→ [{"category":"books","cnt":10},{"category":"clothing","cnt":10},{"category":"electronics","cnt":10},{"category":"food","cnt":10}]
|
|
81
|
+
|
|
82
|
+
-- ═══════════════════════════════════════════════════════════════════════
|
|
83
|
+
-- Equality filter correctness (benefits from NDV statistics)
|
|
84
|
+
-- ═══════════════════════════════════════════════════════════════════════
|
|
85
|
+
|
|
86
|
+
SELECT count(*) AS cnt FROM ce_products WHERE category = 'electronics';
|
|
87
|
+
→ [{"cnt":10}]
|
|
88
|
+
|
|
89
|
+
SELECT count(*) AS cnt FROM ce_products WHERE category = 'books';
|
|
90
|
+
→ [{"cnt":10}]
|
|
91
|
+
|
|
92
|
+
-- ═══════════════════════════════════════════════════════════════════════
|
|
93
|
+
-- Range filter correctness (benefits from histogram statistics)
|
|
94
|
+
-- ═══════════════════════════════════════════════════════════════════════
|
|
95
|
+
|
|
96
|
+
SELECT count(*) AS cnt FROM ce_products WHERE price < 100;
|
|
97
|
+
→ [{"cnt":10}]
|
|
98
|
+
|
|
99
|
+
SELECT count(*) AS cnt FROM ce_products WHERE price >= 200 AND price < 300;
|
|
100
|
+
→ [{"cnt":10}]
|
|
101
|
+
|
|
102
|
+
-- ═══════════════════════════════════════════════════════════════════════
|
|
103
|
+
-- Setup second table for join tests
|
|
104
|
+
-- ═══════════════════════════════════════════════════════════════════════
|
|
105
|
+
|
|
106
|
+
CREATE TABLE ce_orders (
|
|
107
|
+
order_id INTEGER PRIMARY KEY,
|
|
108
|
+
product_id INTEGER,
|
|
109
|
+
quantity INTEGER
|
|
110
|
+
) USING memory;
|
|
111
|
+
|
|
112
|
+
INSERT INTO ce_orders VALUES (1, 1, 2);
|
|
113
|
+
INSERT INTO ce_orders VALUES (2, 1, 1);
|
|
114
|
+
INSERT INTO ce_orders VALUES (3, 5, 3);
|
|
115
|
+
INSERT INTO ce_orders VALUES (4, 10, 1);
|
|
116
|
+
INSERT INTO ce_orders VALUES (5, 20, 5);
|
|
117
|
+
|
|
118
|
+
ANALYZE ce_orders;
|
|
119
|
+
|
|
120
|
+
-- Join correctness: inner join
|
|
121
|
+
SELECT count(*) AS cnt FROM ce_products JOIN ce_orders ON ce_products.id = ce_orders.product_id;
|
|
122
|
+
→ [{"cnt":5}]
|
|
123
|
+
|
|
124
|
+
-- Join correctness: left join (product 1 has 2 orders, so 36 + 2 + 1 + 1 + 1 = 41)
|
|
125
|
+
SELECT count(*) AS cnt FROM ce_products LEFT JOIN ce_orders ON ce_products.id = ce_orders.product_id;
|
|
126
|
+
→ [{"cnt":41}]
|
|
127
|
+
|
|
128
|
+
-- ═══════════════════════════════════════════════════════════════════════
|
|
129
|
+
-- Re-ANALYZE after data changes
|
|
130
|
+
-- ═══════════════════════════════════════════════════════════════════════
|
|
131
|
+
|
|
132
|
+
INSERT INTO ce_products VALUES (41, 'electronics', 409.59, 'item_41');
|
|
133
|
+
INSERT INTO ce_products VALUES (42, 'books', 419.58, 'item_42');
|
|
134
|
+
INSERT INTO ce_products VALUES (43, 'clothing', 429.57, 'item_43');
|
|
135
|
+
INSERT INTO ce_products VALUES (44, 'food', 439.56, 'item_44');
|
|
136
|
+
INSERT INTO ce_products VALUES (45, 'electronics', 449.55, 'item_45');
|
|
137
|
+
|
|
138
|
+
ANALYZE ce_products;
|
|
139
|
+
|
|
140
|
+
-- Verify updated row count
|
|
141
|
+
SELECT count(*) AS cnt FROM ce_products;
|
|
142
|
+
→ [{"cnt":45}]
|
|
143
|
+
|
|
144
|
+
-- Queries still work correctly after re-ANALYZE
|
|
145
|
+
SELECT count(*) AS cnt FROM ce_products WHERE category = 'electronics';
|
|
146
|
+
→ [{"cnt":12}]
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
-- 108.1-analyze-name-resolution.sqllogic
|
|
2
|
+
-- ANALYZE on a name that resolves to nothing used to succeed quietly with zero
|
|
3
|
+
-- rows (through both the emitter's table lookup and the schema-only lookup).
|
|
4
|
+
-- It now resolves the target at build time, the same way every other
|
|
5
|
+
-- name-taking statement does, and errors when the name does not exist.
|
|
6
|
+
|
|
7
|
+
create table t (id integer primary key, v integer);
|
|
8
|
+
insert into t values (1, 10), (2, 20);
|
|
9
|
+
|
|
10
|
+
create view v_t as select * from t;
|
|
11
|
+
|
|
12
|
+
create materialized view mv_t as select * from t;
|
|
13
|
+
|
|
14
|
+
create table temp.tt (id integer primary key, v integer);
|
|
15
|
+
insert into temp.tt values (1, 100);
|
|
16
|
+
|
|
17
|
+
-- ===================================
|
|
18
|
+
-- Real table: unchanged
|
|
19
|
+
-- ===================================
|
|
20
|
+
|
|
21
|
+
analyze t;
|
|
22
|
+
→ [{"table":"t","rows":2}]
|
|
23
|
+
|
|
24
|
+
-- ===================================
|
|
25
|
+
-- Unresolvable names now error instead of silently returning nothing
|
|
26
|
+
-- ===================================
|
|
27
|
+
|
|
28
|
+
analyze nosuchtable;
|
|
29
|
+
-- error: Table 'nosuchtable' not found in schema path: main
|
|
30
|
+
|
|
31
|
+
analyze main.nosuchtable;
|
|
32
|
+
-- error: Table not found: main.nosuchtable
|
|
33
|
+
|
|
34
|
+
analyze nosuchschema.t;
|
|
35
|
+
-- error: Table not found: nosuchschema.t
|
|
36
|
+
|
|
37
|
+
analyze nosuchschema.*;
|
|
38
|
+
-- error: Schema not found: nosuchschema
|
|
39
|
+
|
|
40
|
+
-- ===================================
|
|
41
|
+
-- A plain view has no stored rows to collect statistics from
|
|
42
|
+
-- ===================================
|
|
43
|
+
|
|
44
|
+
analyze v_t;
|
|
45
|
+
-- error: Cannot ANALYZE view 'main.v_t': a view has no stored rows to collect statistics from.
|
|
46
|
+
|
|
47
|
+
-- ===================================
|
|
48
|
+
-- `temp.` now parses as a schema qualifier (was a parse error before this fix)
|
|
49
|
+
-- ===================================
|
|
50
|
+
|
|
51
|
+
analyze temp.tt;
|
|
52
|
+
→ [{"table":"tt","rows":1}]
|
|
53
|
+
|
|
54
|
+
analyze temp.*;
|
|
55
|
+
→ [{"table":"tt","rows":1}]
|
|
56
|
+
|
|
57
|
+
-- ===================================
|
|
58
|
+
-- An unqualified name follows the session search path, the way it does for
|
|
59
|
+
-- every other statement — the emitter's old lookup hardcoded `main`.
|
|
60
|
+
-- ===================================
|
|
61
|
+
|
|
62
|
+
analyze tt;
|
|
63
|
+
-- error: Table 'tt' not found in schema path: main
|
|
64
|
+
|
|
65
|
+
PRAGMA schema_path = 'main,temp';
|
|
66
|
+
-- run
|
|
67
|
+
|
|
68
|
+
analyze tt;
|
|
69
|
+
→ [{"table":"tt","rows":1}]
|
|
70
|
+
|
|
71
|
+
PRAGMA schema_path = 'main';
|
|
72
|
+
-- run
|
|
73
|
+
|
|
74
|
+
-- ===================================
|
|
75
|
+
-- The `committed` pseudo-schema resolves through the search path, so both the
|
|
76
|
+
-- table arm and the view rejection see the same name a plain reference would.
|
|
77
|
+
-- ===================================
|
|
78
|
+
|
|
79
|
+
analyze committed.t;
|
|
80
|
+
→ [{"table":"t","rows":2}]
|
|
81
|
+
|
|
82
|
+
analyze committed.v_t;
|
|
83
|
+
-- error: Cannot ANALYZE view 'main.v_t': a view has no stored rows to collect statistics from.
|
|
84
|
+
|
|
85
|
+
-- ===================================
|
|
86
|
+
-- Materialized view: real backing table, unchanged
|
|
87
|
+
-- ===================================
|
|
88
|
+
|
|
89
|
+
analyze mv_t;
|
|
90
|
+
→ [{"table":"mv_t","rows":2}]
|
|
91
|
+
|
|
92
|
+
-- ===================================
|
|
93
|
+
-- Bare ANALYZE: unchanged, still allowed to report nothing for an empty schema
|
|
94
|
+
-- ===================================
|
|
95
|
+
|
|
96
|
+
analyze;
|
|
97
|
+
-- run
|
|
98
|
+
|
|
99
|
+
drop materialized view mv_t;
|
|
100
|
+
drop view v_t;
|
|
101
|
+
drop table t;
|
|
102
|
+
drop table temp.tt;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
-- aggregate-physical-selection.sqllogic
|
|
2
|
+
-- Validates physical aggregate operator selection across decision branches
|
|
3
|
+
-- of ruleAggregatePhysical
|
|
4
|
+
|
|
5
|
+
-- Setup: table with single PK (sorted by id)
|
|
6
|
+
CREATE TABLE aps_single (id INTEGER PRIMARY KEY, grp TEXT, val INTEGER) USING memory;
|
|
7
|
+
INSERT INTO aps_single VALUES (1,'a',10),(2,'b',20),(3,'a',30),(4,'b',40),(5,'c',50);
|
|
8
|
+
|
|
9
|
+
-- Setup: table with composite PK (sorted by a, b)
|
|
10
|
+
CREATE TABLE aps_comp (a INTEGER, b INTEGER, c INTEGER, PRIMARY KEY (a, b)) USING memory;
|
|
11
|
+
INSERT INTO aps_comp VALUES (1,1,10),(1,2,20),(2,1,30),(2,2,40),(3,1,50);
|
|
12
|
+
|
|
13
|
+
-- ===== Scalar aggregate → StreamAggregate =====
|
|
14
|
+
|
|
15
|
+
-- Plan: scalar aggregate uses StreamAggregate
|
|
16
|
+
SELECT 1 AS ok FROM query_plan('SELECT count(*), sum(val) FROM aps_single')
|
|
17
|
+
WHERE op = 'STREAMAGGREGATE' LIMIT 1;
|
|
18
|
+
→ [{"ok":1}]
|
|
19
|
+
|
|
20
|
+
-- Plan: scalar aggregate does not use HashAggregate
|
|
21
|
+
SELECT count(*) AS cnt FROM query_plan('SELECT count(*), sum(val) FROM aps_single')
|
|
22
|
+
WHERE op = 'HASHAGGREGATE';
|
|
23
|
+
→ [{"cnt":0}]
|
|
24
|
+
|
|
25
|
+
-- Correctness: scalar aggregate
|
|
26
|
+
SELECT count(*) AS c, sum(val) AS s FROM aps_single;
|
|
27
|
+
→ [{"c":5,"s":150}]
|
|
28
|
+
|
|
29
|
+
-- ===== Already-sorted → StreamAggregate without Sort =====
|
|
30
|
+
|
|
31
|
+
-- Plan: GROUP BY PK uses StreamAggregate
|
|
32
|
+
SELECT 1 AS ok FROM query_plan('SELECT id, count(*) FROM aps_single GROUP BY id')
|
|
33
|
+
WHERE op = 'STREAMAGGREGATE' LIMIT 1;
|
|
34
|
+
→ [{"ok":1}]
|
|
35
|
+
|
|
36
|
+
-- Plan: GROUP BY PK does not insert Sort
|
|
37
|
+
SELECT count(*) AS cnt FROM query_plan('SELECT id, count(*) FROM aps_single GROUP BY id')
|
|
38
|
+
WHERE op = 'SORT';
|
|
39
|
+
→ [{"cnt":0}]
|
|
40
|
+
|
|
41
|
+
-- Plan: GROUP BY full composite PK uses StreamAggregate
|
|
42
|
+
SELECT 1 AS ok FROM query_plan('SELECT a, b, count(*) FROM aps_comp GROUP BY a, b')
|
|
43
|
+
WHERE op = 'STREAMAGGREGATE' LIMIT 1;
|
|
44
|
+
→ [{"ok":1}]
|
|
45
|
+
|
|
46
|
+
-- Plan: GROUP BY composite PK prefix uses StreamAggregate
|
|
47
|
+
SELECT 1 AS ok FROM query_plan('SELECT a, count(*) FROM aps_comp GROUP BY a')
|
|
48
|
+
WHERE op = 'STREAMAGGREGATE' LIMIT 1;
|
|
49
|
+
→ [{"ok":1}]
|
|
50
|
+
|
|
51
|
+
-- ===== Unsorted → HashAggregate =====
|
|
52
|
+
|
|
53
|
+
-- Plan: GROUP BY non-PK column uses HashAggregate
|
|
54
|
+
SELECT 1 AS ok FROM query_plan('SELECT grp, count(*) FROM aps_single GROUP BY grp')
|
|
55
|
+
WHERE op = 'HASHAGGREGATE' LIMIT 1;
|
|
56
|
+
→ [{"ok":1}]
|
|
57
|
+
|
|
58
|
+
-- Correctness: grouped aggregate on non-sorted column
|
|
59
|
+
SELECT grp, count(*) AS cnt FROM aps_single GROUP BY grp ORDER BY grp;
|
|
60
|
+
→ [{"grp":"a","cnt":2},{"grp":"b","cnt":2},{"grp":"c","cnt":1}]
|
|
61
|
+
|
|
62
|
+
-- ===== isOrderedForGrouping edge cases =====
|
|
63
|
+
|
|
64
|
+
-- Expression grouping (non-column-ref) → HashAggregate
|
|
65
|
+
SELECT 1 AS ok FROM query_plan('SELECT id + 1, count(*) FROM aps_single GROUP BY id + 1')
|
|
66
|
+
WHERE op = 'HASHAGGREGATE' LIMIT 1;
|
|
67
|
+
→ [{"ok":1}]
|
|
68
|
+
|
|
69
|
+
-- Reversed composite PK order → HashAggregate (prefix mismatch)
|
|
70
|
+
SELECT 1 AS ok FROM query_plan('SELECT b, a, count(*) FROM aps_comp GROUP BY b, a')
|
|
71
|
+
WHERE op = 'HASHAGGREGATE' LIMIT 1;
|
|
72
|
+
→ [{"ok":1}]
|
|
73
|
+
|
|
74
|
+
-- More grouping keys than PK columns: GROUP-BY FD simplification drops the
|
|
75
|
+
-- PK-determined column (`c` is functionally determined by the PK `(a, b)`)
|
|
76
|
+
-- and rewrites the aggregate over `GROUP BY a, b` with a MIN(c) picker.
|
|
77
|
+
-- The resulting GROUP BY is a prefix of the source ordering, so we land on
|
|
78
|
+
-- StreamAggregate (no Sort needed).
|
|
79
|
+
SELECT 1 AS ok FROM query_plan('SELECT a, b, c, count(*) FROM aps_comp GROUP BY a, b, c')
|
|
80
|
+
WHERE op = 'STREAMAGGREGATE' LIMIT 1;
|
|
81
|
+
→ [{"ok":1}]
|
|
82
|
+
|
|
83
|
+
-- Second key only (not prefix) → HashAggregate
|
|
84
|
+
SELECT 1 AS ok FROM query_plan('SELECT b, count(*) FROM aps_comp GROUP BY b')
|
|
85
|
+
WHERE op = 'HASHAGGREGATE' LIMIT 1;
|
|
86
|
+
→ [{"ok":1}]
|
|
87
|
+
|
|
88
|
+
-- First PK key + non-PK key → HashAggregate (column mismatch at position 1)
|
|
89
|
+
SELECT 1 AS ok FROM query_plan('SELECT a, c, count(*) FROM aps_comp GROUP BY a, c')
|
|
90
|
+
WHERE op = 'HASHAGGREGATE' LIMIT 1;
|
|
91
|
+
→ [{"ok":1}]
|
|
92
|
+
|
|
93
|
+
-- Correctness: expression GROUP BY
|
|
94
|
+
SELECT id + 1 AS e, count(*) AS cnt FROM aps_single GROUP BY id + 1 ORDER BY id + 1;
|
|
95
|
+
→ [{"e":2,"cnt":1},{"e":3,"cnt":1},{"e":4,"cnt":1},{"e":5,"cnt":1},{"e":6,"cnt":1}]
|
|
96
|
+
|
|
97
|
+
-- Correctness: composite PK grouped aggregate
|
|
98
|
+
SELECT a, b, count(*) AS c FROM aps_comp GROUP BY a, b ORDER BY a, b;
|
|
99
|
+
→ [{"a":1,"b":1,"c":1},{"a":1,"b":2,"c":1},{"a":2,"b":1,"c":1},{"a":2,"b":2,"c":1},{"a":3,"b":1,"c":1}]
|
|
100
|
+
|
|
101
|
+
-- Correctness: prefix GROUP BY on composite PK
|
|
102
|
+
SELECT a, sum(c) AS total FROM aps_comp GROUP BY a ORDER BY a;
|
|
103
|
+
→ [{"a":1,"total":30},{"a":2,"total":70},{"a":3,"total":50}]
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
-- joins.sqllogic - Testing JOIN clauses
|
|
2
|
+
|
|
3
|
+
-- Setup tables
|
|
4
|
+
CREATE TABLE t_left (id INTEGER PRIMARY KEY, val_l TEXT);
|
|
5
|
+
CREATE TABLE t_right (id INTEGER PRIMARY KEY, val_r TEXT, left_id INTEGER);
|
|
6
|
+
|
|
7
|
+
INSERT INTO t_left VALUES (1, 'L1'), (2, 'L2'), (3, 'L3');
|
|
8
|
+
INSERT INTO t_right VALUES (10, 'R1', 1), (20, 'R2', 2), (40, 'R4', 4);
|
|
9
|
+
|
|
10
|
+
-- INNER JOIN
|
|
11
|
+
SELECT l.id, l.val_l, r.id, r.val_r FROM t_left l JOIN t_right r ON l.id = r.left_id ORDER BY l.id;
|
|
12
|
+
→ [{"id":1,"val_l":"L1","id:1":10,"val_r":"R1"},{"id":2,"val_l":"L2","id:1":20,"val_r":"R2"}]
|
|
13
|
+
|
|
14
|
+
-- INNER JOIN with aliases
|
|
15
|
+
SELECT l.id as left_id, r.id as right_id FROM t_left l JOIN t_right r ON l.id = r.left_id ORDER BY left_id;
|
|
16
|
+
→ [{"left_id":1,"right_id":10},{"left_id":2,"right_id":20}]
|
|
17
|
+
|
|
18
|
+
-- LEFT JOIN
|
|
19
|
+
SELECT l.id, l.val_l, r.id, r.val_r FROM t_left l LEFT JOIN t_right r ON l.id = r.left_id ORDER BY l.id;
|
|
20
|
+
→ [{"id":1,"val_l":"L1","id:1":10,"val_r":"R1"},{"id":2,"val_l":"L2","id:1":20,"val_r":"R2"},{"id":3,"val_l":"L3","id:1":null,"val_r":null}]
|
|
21
|
+
|
|
22
|
+
-- CROSS JOIN
|
|
23
|
+
SELECT count(*) FROM t_left CROSS JOIN t_right;
|
|
24
|
+
→ [{"count(*)":9}]
|
|
25
|
+
SELECT l.id, r.id FROM t_left l CROSS JOIN t_right r ORDER BY l.id, r.id LIMIT 2;
|
|
26
|
+
→ [{"id":1,"id:1":10},{"id":1,"id:1":20}]
|
|
27
|
+
|
|
28
|
+
-- JOIN with WHERE clause
|
|
29
|
+
SELECT l.id, r.val_r FROM t_left l JOIN t_right r ON l.id = r.left_id WHERE r.id = 10;
|
|
30
|
+
→ [{"id":1,"val_r":"R1"}]
|
|
31
|
+
|
|
32
|
+
-- Multiple JOINs (requires a third table setup)
|
|
33
|
+
CREATE TABLE t_extra (id INTEGER PRIMARY KEY, right_id INTEGER, val_e TEXT);
|
|
34
|
+
INSERT INTO t_extra VALUES (100, 10, 'E1'), (200, 20, 'E2');
|
|
35
|
+
SELECT l.id, r.id, e.id FROM t_left l JOIN t_right r ON l.id = r.left_id JOIN t_extra e ON r.id = e.right_id ORDER BY l.id;
|
|
36
|
+
→ [{"id":1,"id:1":10,"id:2":100},{"id":2,"id:1":20,"id:2":200}]
|
|
37
|
+
|
|
38
|
+
DROP TABLE t_extra;
|
|
39
|
+
-- run
|
|
40
|
+
|
|
41
|
+
-- RIGHT JOIN: every right row appears; r.id=40 (left_id=4) has no left match → null-left.
|
|
42
|
+
SELECT l.id, r.id FROM t_left l RIGHT JOIN t_right r ON l.id = r.left_id ORDER BY r.id;
|
|
43
|
+
→ [{"id":1,"id:1":10},{"id":2,"id:1":20},{"id":null,"id:1":40}]
|
|
44
|
+
|
|
45
|
+
-- FULL JOIN: matched rows plus l.id=3 (no right) null-right and r.id=40 (no left) null-left.
|
|
46
|
+
SELECT l.id, r.id FROM t_left l FULL JOIN t_right r ON l.id = r.left_id ORDER BY coalesce(l.id, r.id);
|
|
47
|
+
→ [{"id":1,"id:1":10},{"id":2,"id:1":20},{"id":3,"id:1":null},{"id":null,"id:1":40}]
|
|
48
|
+
|
|
49
|
+
DROP TABLE t_left;
|
|
50
|
+
DROP TABLE t_right;
|
|
51
|
+
|
|
52
|
+
-- ===================================================================
|
|
53
|
+
-- Join elimination - FK→PK
|
|
54
|
+
-- Regression coverage for rule-join-elimination: rewritten plans must
|
|
55
|
+
-- produce the same rows as the un-rewritten queries.
|
|
56
|
+
-- ===================================================================
|
|
57
|
+
|
|
58
|
+
CREATE TABLE je_customers (id INTEGER PRIMARY KEY, name TEXT, region TEXT);
|
|
59
|
+
CREATE TABLE je_orders (
|
|
60
|
+
order_id INTEGER PRIMARY KEY,
|
|
61
|
+
customer_id INTEGER NOT NULL REFERENCES je_customers(id),
|
|
62
|
+
total REAL
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
INSERT INTO je_customers VALUES (1, 'Acme', 'EU'), (2, 'Beta', 'US');
|
|
66
|
+
INSERT INTO je_orders VALUES (10, 1, 99.0), (11, 2, 49.5), (12, 1, 12.0);
|
|
67
|
+
|
|
68
|
+
-- LEFT JOIN eliminable: no right-side columns selected
|
|
69
|
+
SELECT order_id, total FROM je_orders LEFT JOIN je_customers ON je_orders.customer_id = je_customers.id ORDER BY order_id;
|
|
70
|
+
→ [{"order_id":10,"total":99.0},{"order_id":11,"total":49.5},{"order_id":12,"total":12.0}]
|
|
71
|
+
|
|
72
|
+
-- INNER JOIN eliminable: NOT NULL FK
|
|
73
|
+
SELECT order_id FROM je_orders JOIN je_customers ON je_orders.customer_id = je_customers.id ORDER BY order_id;
|
|
74
|
+
→ [{"order_id":10},{"order_id":11},{"order_id":12}]
|
|
75
|
+
|
|
76
|
+
-- Eliminable view: outer query selects only FK-side columns
|
|
77
|
+
CREATE VIEW je_order_view AS
|
|
78
|
+
SELECT o.order_id, o.total, c.name AS cust_name
|
|
79
|
+
FROM je_orders o LEFT JOIN je_customers c ON o.customer_id = c.id;
|
|
80
|
+
|
|
81
|
+
SELECT order_id, total FROM je_order_view ORDER BY order_id;
|
|
82
|
+
→ [{"order_id":10,"total":99.0},{"order_id":11,"total":49.5},{"order_id":12,"total":12.0}]
|
|
83
|
+
|
|
84
|
+
DROP VIEW je_order_view;
|
|
85
|
+
DROP TABLE je_orders;
|
|
86
|
+
DROP TABLE je_customers;
|