@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,39 @@
|
|
|
1
|
+
-- random-extras.sqllogic - randomblob() observable surface and arity validation.
|
|
2
|
+
-- random() determinism rejection lives in 44-determinism-validation / 45-udf-determinism;
|
|
3
|
+
-- this file pins the value-shape contract for SELECTs that *do* use random*.
|
|
4
|
+
-- (Most of SQLite's test/random.test is statistical / reseed and n/a for Quereus.)
|
|
5
|
+
|
|
6
|
+
-- randomblob(N) returns a BLOB of length N
|
|
7
|
+
select typeof(randomblob(8));
|
|
8
|
+
→ [{"typeof(randomblob(8))":"blob"}]
|
|
9
|
+
|
|
10
|
+
select length(randomblob(16));
|
|
11
|
+
→ [{"length(randomblob(16))":16}]
|
|
12
|
+
|
|
13
|
+
-- randomblob(1) returns a one-byte BLOB
|
|
14
|
+
select length(randomblob(1));
|
|
15
|
+
→ [{"length(randomblob(1))":1}]
|
|
16
|
+
|
|
17
|
+
-- randomblob(0): empty BLOB
|
|
18
|
+
select length(randomblob(0));
|
|
19
|
+
→ [{"length(randomblob(0))":0}]
|
|
20
|
+
|
|
21
|
+
-- randomblob(-N): SQLite returns an empty (or null) blob; pin observable behavior
|
|
22
|
+
select length(randomblob(-5));
|
|
23
|
+
→ [{"length(randomblob(-5))":0}]
|
|
24
|
+
|
|
25
|
+
-- random() returns an integer in a plain SELECT
|
|
26
|
+
select typeof(random());
|
|
27
|
+
→ [{"typeof(random())":"integer"}]
|
|
28
|
+
|
|
29
|
+
-- Two consecutive random() calls — assert only the type contract
|
|
30
|
+
select typeof(random()) as t1, typeof(random()) as t2;
|
|
31
|
+
→ [{"t1":"integer","t2":"integer"}]
|
|
32
|
+
|
|
33
|
+
-- Arity: random() takes no arguments
|
|
34
|
+
select random(1);
|
|
35
|
+
-- error: random
|
|
36
|
+
|
|
37
|
+
-- Arity: randomblob() requires exactly one argument
|
|
38
|
+
select randomblob();
|
|
39
|
+
-- error: randomblob
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
-- 25-aggregate-edge-cases.sqllogic
|
|
2
|
+
-- Edge-case tests for the aggregate subsystem: type coercion, NULL-only groups,
|
|
3
|
+
-- HAVING eliminating all groups, group_concat separator edge cases,
|
|
4
|
+
-- nested aggregates over window output, json aggregate edge cases.
|
|
5
|
+
|
|
6
|
+
-- ============================================================
|
|
7
|
+
-- Setup
|
|
8
|
+
-- ============================================================
|
|
9
|
+
|
|
10
|
+
CREATE TABLE aec (id INTEGER PRIMARY KEY, grp TEXT, val INTEGER NULL);
|
|
11
|
+
INSERT INTO aec VALUES (1, 'a', 10), (2, 'a', 20), (3, 'b', 30), (4, 'b', 40), (5, 'c', null);
|
|
12
|
+
|
|
13
|
+
-- ============================================================
|
|
14
|
+
-- HAVING that eliminates all groups
|
|
15
|
+
-- ============================================================
|
|
16
|
+
|
|
17
|
+
-- Multiple groups exist but HAVING filters every one — zero rows, not an error
|
|
18
|
+
SELECT grp, sum(val) AS total FROM aec GROUP BY grp HAVING sum(val) > 9999;
|
|
19
|
+
→ []
|
|
20
|
+
|
|
21
|
+
-- HAVING with count(*) that eliminates all groups
|
|
22
|
+
SELECT grp, count(*) AS cnt FROM aec GROUP BY grp HAVING count(*) > 100;
|
|
23
|
+
→ []
|
|
24
|
+
|
|
25
|
+
-- HAVING on avg that eliminates all groups
|
|
26
|
+
SELECT grp, avg(val) AS a FROM aec GROUP BY grp HAVING avg(val) > 9999;
|
|
27
|
+
→ []
|
|
28
|
+
|
|
29
|
+
-- HAVING with complex expression eliminating all groups
|
|
30
|
+
SELECT grp FROM aec GROUP BY grp HAVING sum(val) * 2 + count(*) < 0;
|
|
31
|
+
→ []
|
|
32
|
+
|
|
33
|
+
DROP TABLE aec;
|
|
34
|
+
|
|
35
|
+
-- ============================================================
|
|
36
|
+
-- Type coercion in aggregates: string values that look numeric
|
|
37
|
+
-- ============================================================
|
|
38
|
+
|
|
39
|
+
CREATE TABLE aec_coerce (id INTEGER PRIMARY KEY, val TEXT NULL);
|
|
40
|
+
INSERT INTO aec_coerce VALUES (1, '10'), (2, '20'), (3, '30.5');
|
|
41
|
+
|
|
42
|
+
-- sum() should coerce numeric-looking strings
|
|
43
|
+
SELECT sum(val) AS s FROM aec_coerce;
|
|
44
|
+
→ [{"s":60.5}]
|
|
45
|
+
|
|
46
|
+
-- avg() should coerce numeric-looking strings
|
|
47
|
+
SELECT avg(val) AS a FROM aec_coerce;
|
|
48
|
+
→ [{"a":20.166666666666668}]
|
|
49
|
+
|
|
50
|
+
-- Non-numeric strings should be ignored by sum/avg (treated as 0 or skipped)
|
|
51
|
+
INSERT INTO aec_coerce VALUES (4, 'hello'), (5, 'world');
|
|
52
|
+
|
|
53
|
+
SELECT sum(val) AS s FROM aec_coerce;
|
|
54
|
+
→ [{"s":60.5}]
|
|
55
|
+
|
|
56
|
+
SELECT avg(val) AS a FROM aec_coerce;
|
|
57
|
+
→ [{"a":20.166666666666668}]
|
|
58
|
+
|
|
59
|
+
-- count(val) counts all non-null values regardless of coercion
|
|
60
|
+
SELECT count(val) AS c FROM aec_coerce;
|
|
61
|
+
→ [{"c":5}]
|
|
62
|
+
|
|
63
|
+
-- min/max on string values — min of numeric-looking strings may coerce
|
|
64
|
+
SELECT min(val) AS mn, max(val) AS mx FROM aec_coerce;
|
|
65
|
+
→ [{"mn":10,"mx":"world"}]
|
|
66
|
+
|
|
67
|
+
DROP TABLE aec_coerce;
|
|
68
|
+
|
|
69
|
+
-- ============================================================
|
|
70
|
+
-- Aggregate over empty GROUP BY with no matching rows
|
|
71
|
+
-- ============================================================
|
|
72
|
+
|
|
73
|
+
-- When GROUP BY is present but the source table has rows that are
|
|
74
|
+
-- all filtered out by WHERE, result should be zero rows
|
|
75
|
+
CREATE TABLE aec_empty (id INTEGER PRIMARY KEY, grp TEXT, val INTEGER);
|
|
76
|
+
INSERT INTO aec_empty VALUES (1, 'a', 10), (2, 'b', 20);
|
|
77
|
+
|
|
78
|
+
SELECT grp, count(*) AS cnt, sum(val) AS total
|
|
79
|
+
FROM aec_empty WHERE 1 = 0 GROUP BY grp;
|
|
80
|
+
→ []
|
|
81
|
+
|
|
82
|
+
SELECT grp, avg(val) AS a FROM aec_empty WHERE val > 9999 GROUP BY grp;
|
|
83
|
+
→ []
|
|
84
|
+
|
|
85
|
+
-- Contrast: without GROUP BY on empty result set → single row with defaults
|
|
86
|
+
SELECT count(*) AS cnt, sum(val) AS total FROM aec_empty WHERE 1 = 0;
|
|
87
|
+
→ [{"cnt":0,"total":null}]
|
|
88
|
+
|
|
89
|
+
DROP TABLE aec_empty;
|
|
90
|
+
|
|
91
|
+
-- ============================================================
|
|
92
|
+
-- NULL-only column fed to every aggregate type simultaneously
|
|
93
|
+
-- ============================================================
|
|
94
|
+
|
|
95
|
+
CREATE TABLE aec_nullonly (id INTEGER PRIMARY KEY, grp TEXT, x INTEGER NULL);
|
|
96
|
+
INSERT INTO aec_nullonly VALUES (1, 'a', null), (2, 'a', null), (3, 'b', null);
|
|
97
|
+
|
|
98
|
+
-- All-NULL column with GROUP BY: every aggregate except count(*) returns null
|
|
99
|
+
SELECT grp,
|
|
100
|
+
count(*) AS c_star,
|
|
101
|
+
count(x) AS c_x,
|
|
102
|
+
sum(x) AS s,
|
|
103
|
+
avg(x) AS a,
|
|
104
|
+
min(x) AS mn,
|
|
105
|
+
max(x) AS mx,
|
|
106
|
+
group_concat(x) AS gc
|
|
107
|
+
FROM aec_nullonly GROUP BY grp ORDER BY grp;
|
|
108
|
+
→ [{"grp":"a","c_star":2,"c_x":0,"s":null,"a":null,"mn":null,"mx":null,"gc":null},{"grp":"b","c_star":1,"c_x":0,"s":null,"a":null,"mn":null,"mx":null,"gc":null}]
|
|
109
|
+
|
|
110
|
+
-- total() returns 0.0 instead of null for all-NULL input
|
|
111
|
+
SELECT grp, total(x) AS t FROM aec_nullonly GROUP BY grp ORDER BY grp;
|
|
112
|
+
→ [{"grp":"a","t":0},{"grp":"b","t":0}]
|
|
113
|
+
|
|
114
|
+
DROP TABLE aec_nullonly;
|
|
115
|
+
|
|
116
|
+
-- ============================================================
|
|
117
|
+
-- Nested aggregates over window function output
|
|
118
|
+
-- ============================================================
|
|
119
|
+
|
|
120
|
+
CREATE TABLE aec_win (id INTEGER PRIMARY KEY, cat TEXT, val INTEGER);
|
|
121
|
+
INSERT INTO aec_win VALUES (1, 'x', 10), (2, 'x', 20), (3, 'y', 30), (4, 'y', 40);
|
|
122
|
+
|
|
123
|
+
-- Aggregate consuming row_number() from subquery
|
|
124
|
+
SELECT sum(rn) AS total_rn FROM (
|
|
125
|
+
SELECT row_number() OVER (ORDER BY id) AS rn FROM aec_win
|
|
126
|
+
);
|
|
127
|
+
→ [{"total_rn":10}]
|
|
128
|
+
|
|
129
|
+
-- Aggregate consuming rank() partitioned output
|
|
130
|
+
SELECT cat, sum(rnk) AS sum_rnk FROM (
|
|
131
|
+
SELECT cat, rank() OVER (PARTITION BY cat ORDER BY val) AS rnk FROM aec_win
|
|
132
|
+
) GROUP BY cat ORDER BY cat;
|
|
133
|
+
→ [{"cat":"x","sum_rnk":3},{"cat":"y","sum_rnk":3}]
|
|
134
|
+
|
|
135
|
+
-- avg of window output
|
|
136
|
+
SELECT avg(rn) AS avg_rn FROM (
|
|
137
|
+
SELECT row_number() OVER (ORDER BY id) AS rn FROM aec_win
|
|
138
|
+
);
|
|
139
|
+
→ [{"avg_rn":2.5}]
|
|
140
|
+
|
|
141
|
+
-- count distinct on window output
|
|
142
|
+
SELECT count(distinct rn) AS cd FROM (
|
|
143
|
+
SELECT row_number() OVER (PARTITION BY cat ORDER BY val) AS rn FROM aec_win
|
|
144
|
+
);
|
|
145
|
+
→ [{"cd":2}]
|
|
146
|
+
|
|
147
|
+
DROP TABLE aec_win;
|
|
148
|
+
|
|
149
|
+
-- ============================================================
|
|
150
|
+
-- group_concat: NULL separator behavior
|
|
151
|
+
-- ============================================================
|
|
152
|
+
|
|
153
|
+
CREATE TABLE aec_gc (id INTEGER PRIMARY KEY, val TEXT);
|
|
154
|
+
INSERT INTO aec_gc VALUES (1, 'a'), (2, 'b'), (3, 'c');
|
|
155
|
+
|
|
156
|
+
-- NULL separator falls back to default comma
|
|
157
|
+
SELECT group_concat(val, null) AS gc FROM aec_gc;
|
|
158
|
+
→ [{"gc":"a,b,c"}]
|
|
159
|
+
|
|
160
|
+
DROP TABLE aec_gc;
|
|
161
|
+
|
|
162
|
+
-- ============================================================
|
|
163
|
+
-- group_concat on empty groups within GROUP BY
|
|
164
|
+
-- ============================================================
|
|
165
|
+
|
|
166
|
+
CREATE TABLE aec_gc2 (id INTEGER PRIMARY KEY, grp TEXT, val TEXT NULL);
|
|
167
|
+
INSERT INTO aec_gc2 VALUES (1, 'a', 'x'), (2, 'a', null), (3, 'b', null), (4, 'b', null);
|
|
168
|
+
|
|
169
|
+
-- group 'a' has one non-null value; group 'b' has only nulls
|
|
170
|
+
SELECT grp, group_concat(val) AS gc FROM aec_gc2 GROUP BY grp ORDER BY grp;
|
|
171
|
+
→ [{"grp":"a","gc":"x"},{"grp":"b","gc":null}]
|
|
172
|
+
|
|
173
|
+
DROP TABLE aec_gc2;
|
|
174
|
+
|
|
175
|
+
-- ============================================================
|
|
176
|
+
-- json_group_array on empty input
|
|
177
|
+
-- ============================================================
|
|
178
|
+
|
|
179
|
+
CREATE TABLE aec_jga (id INTEGER PRIMARY KEY, val INTEGER NULL);
|
|
180
|
+
|
|
181
|
+
-- Empty table: json_group_array returns null (not empty array)
|
|
182
|
+
SELECT json_group_array(val) AS result FROM aec_jga;
|
|
183
|
+
→ [{"result":null}]
|
|
184
|
+
|
|
185
|
+
INSERT INTO aec_jga VALUES (1, 10), (2, null), (3, 30);
|
|
186
|
+
|
|
187
|
+
-- Includes NULLs in the array
|
|
188
|
+
SELECT json_group_array(val) AS result FROM aec_jga;
|
|
189
|
+
→ [{"result":[10,null,30]}]
|
|
190
|
+
|
|
191
|
+
DROP TABLE aec_jga;
|
|
192
|
+
|
|
193
|
+
-- ============================================================
|
|
194
|
+
-- json_group_object: all NULL keys → empty/null result
|
|
195
|
+
-- ============================================================
|
|
196
|
+
|
|
197
|
+
CREATE TABLE aec_jgo (id INTEGER PRIMARY KEY, k TEXT NULL, v INTEGER);
|
|
198
|
+
INSERT INTO aec_jgo VALUES (1, null, 10), (2, null, 20);
|
|
199
|
+
|
|
200
|
+
-- All keys are NULL → skipped → null result (no entries)
|
|
201
|
+
SELECT json_group_object(k, v) AS result FROM aec_jgo;
|
|
202
|
+
→ [{"result":null}]
|
|
203
|
+
|
|
204
|
+
-- Mix of NULL and non-NULL keys
|
|
205
|
+
INSERT INTO aec_jgo VALUES (3, 'a', 30);
|
|
206
|
+
|
|
207
|
+
SELECT json_group_object(k, v) AS result FROM aec_jgo;
|
|
208
|
+
→ [{"result":{"a":30}}]
|
|
209
|
+
|
|
210
|
+
DROP TABLE aec_jgo;
|
|
211
|
+
|
|
212
|
+
-- ============================================================
|
|
213
|
+
-- json_group_array / json_group_object with GROUP BY
|
|
214
|
+
-- ============================================================
|
|
215
|
+
|
|
216
|
+
CREATE TABLE aec_jg_grp (id INTEGER PRIMARY KEY, grp TEXT, val INTEGER NULL);
|
|
217
|
+
INSERT INTO aec_jg_grp VALUES (1, 'a', 10), (2, 'a', null), (3, 'b', 20), (4, 'b', 30);
|
|
218
|
+
|
|
219
|
+
SELECT grp, json_group_array(val) AS arr FROM aec_jg_grp GROUP BY grp ORDER BY grp;
|
|
220
|
+
→ [{"grp":"a","arr":[10,null]},{"grp":"b","arr":[20,30]}]
|
|
221
|
+
|
|
222
|
+
DROP TABLE aec_jg_grp;
|
|
223
|
+
|
|
224
|
+
-- ============================================================
|
|
225
|
+
-- Boolean coercion in aggregates
|
|
226
|
+
-- ============================================================
|
|
227
|
+
|
|
228
|
+
CREATE TABLE aec_bool (id INTEGER PRIMARY KEY, b INTEGER);
|
|
229
|
+
INSERT INTO aec_bool VALUES (1, 1), (2, 0), (3, 1), (4, 1);
|
|
230
|
+
|
|
231
|
+
-- sum/avg of boolean-ish values (0/1)
|
|
232
|
+
SELECT sum(b) AS s, avg(b) AS a FROM aec_bool;
|
|
233
|
+
→ [{"s":3,"a":0.75}]
|
|
234
|
+
|
|
235
|
+
DROP TABLE aec_bool;
|
|
236
|
+
|
|
237
|
+
-- ============================================================
|
|
238
|
+
-- Aggregate with ORDER BY in outer query (not GROUP BY column)
|
|
239
|
+
-- ============================================================
|
|
240
|
+
|
|
241
|
+
CREATE TABLE aec_ord (id INTEGER PRIMARY KEY, grp TEXT, val INTEGER);
|
|
242
|
+
INSERT INTO aec_ord VALUES (1, 'x', 50), (2, 'y', 10), (3, 'x', 30), (4, 'y', 40);
|
|
243
|
+
|
|
244
|
+
-- ORDER BY aggregate alias ascending
|
|
245
|
+
SELECT grp, sum(val) AS total FROM aec_ord GROUP BY grp ORDER BY total;
|
|
246
|
+
→ [{"grp":"y","total":50},{"grp":"x","total":80}]
|
|
247
|
+
|
|
248
|
+
-- ORDER BY aggregate alias descending
|
|
249
|
+
SELECT grp, sum(val) AS total FROM aec_ord GROUP BY grp ORDER BY total DESC;
|
|
250
|
+
→ [{"grp":"x","total":80},{"grp":"y","total":50}]
|
|
251
|
+
|
|
252
|
+
DROP TABLE aec_ord;
|
|
253
|
+
|
|
254
|
+
-- ============================================================
|
|
255
|
+
-- Multiple different aggregates with DISTINCT
|
|
256
|
+
-- ============================================================
|
|
257
|
+
|
|
258
|
+
CREATE TABLE aec_mdist (id INTEGER PRIMARY KEY, val INTEGER NULL);
|
|
259
|
+
INSERT INTO aec_mdist VALUES (1, 10), (2, 20), (3, 10), (4, 20), (5, null), (6, 30);
|
|
260
|
+
|
|
261
|
+
-- Mix of DISTINCT and non-DISTINCT aggregates in same query
|
|
262
|
+
SELECT count(*) AS c_star,
|
|
263
|
+
count(val) AS c_val,
|
|
264
|
+
count(distinct val) AS c_dval,
|
|
265
|
+
sum(val) AS s,
|
|
266
|
+
sum(distinct val) AS s_dist,
|
|
267
|
+
avg(val) AS a,
|
|
268
|
+
avg(distinct val) AS a_dist
|
|
269
|
+
FROM aec_mdist;
|
|
270
|
+
→ [{"c_star":6,"c_val":5,"c_dval":3,"s":90,"s_dist":60,"a":18,"a_dist":20}]
|
|
271
|
+
|
|
272
|
+
DROP TABLE aec_mdist;
|
|
273
|
+
|
|
274
|
+
-- ============================================================
|
|
275
|
+
-- Single-value groups: each group has exactly 1 row
|
|
276
|
+
-- ============================================================
|
|
277
|
+
|
|
278
|
+
CREATE TABLE aec_single (id INTEGER PRIMARY KEY, val INTEGER);
|
|
279
|
+
INSERT INTO aec_single VALUES (1, 100), (2, 200), (3, 300);
|
|
280
|
+
|
|
281
|
+
SELECT id, count(*) AS c, sum(val) AS s, avg(val) AS a, min(val) AS mn, max(val) AS mx
|
|
282
|
+
FROM aec_single GROUP BY id ORDER BY id;
|
|
283
|
+
→ [{"id":1,"c":1,"s":100,"a":100,"mn":100,"mx":100},{"id":2,"c":1,"s":200,"a":200,"mn":200,"mx":200},{"id":3,"c":1,"s":300,"a":300,"mn":300,"mx":300}]
|
|
284
|
+
|
|
285
|
+
-- var_samp returns NULL for single-value group (n-1 = 0)
|
|
286
|
+
SELECT id, var_samp(val) AS vs FROM aec_single GROUP BY id ORDER BY id;
|
|
287
|
+
→ [{"id":1,"vs":null},{"id":2,"vs":null},{"id":3,"vs":null}]
|
|
288
|
+
|
|
289
|
+
DROP TABLE aec_single;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
-- adapted from SQLite test/aggnested.test
|
|
2
|
+
-- Aggregates of aggregates via subquery / CTE composition. SQL forbids direct
|
|
3
|
+
-- nesting (sum(sum(x)) is illegal), so the legal pattern is to compute one
|
|
4
|
+
-- aggregate in a derived table and apply another in the outer query.
|
|
5
|
+
|
|
6
|
+
create table na (id integer primary key, grp text, val integer);
|
|
7
|
+
insert into na values
|
|
8
|
+
(1, 'a', 10),
|
|
9
|
+
(2, 'a', 20),
|
|
10
|
+
(3, 'b', 30),
|
|
11
|
+
(4, 'b', 40),
|
|
12
|
+
(5, 'c', 50);
|
|
13
|
+
|
|
14
|
+
-- Derived table aggregate, outer aggregate over it
|
|
15
|
+
select sum(s) as grand_total, max(s) as biggest_grp, min(s) as smallest_grp
|
|
16
|
+
from (select grp, sum(val) as s from na group by grp);
|
|
17
|
+
→ [{"grand_total":150,"biggest_grp":70,"smallest_grp":30}]
|
|
18
|
+
|
|
19
|
+
-- avg of per-group sums
|
|
20
|
+
select avg(s) as mean_grp_total
|
|
21
|
+
from (select grp, sum(val) as s from na group by grp);
|
|
22
|
+
→ [{"mean_grp_total":50}]
|
|
23
|
+
|
|
24
|
+
-- count of distinct group totals (over the per-group aggregate)
|
|
25
|
+
select count(distinct s) as distinct_totals
|
|
26
|
+
from (select grp, sum(val) as s from na group by grp);
|
|
27
|
+
→ [{"distinct_totals":3}]
|
|
28
|
+
|
|
29
|
+
-- CTE producing per-group aggregate, outer query aggregates over it
|
|
30
|
+
with grp_sums as (select grp, sum(val) as s from na group by grp)
|
|
31
|
+
select count(*) as num_groups, sum(s) as total, max(s) as max_total
|
|
32
|
+
from grp_sums;
|
|
33
|
+
→ [{"num_groups":3,"total":150,"max_total":70}]
|
|
34
|
+
|
|
35
|
+
-- CTE with WHERE filter applied between aggregation levels
|
|
36
|
+
with grp_stats as (
|
|
37
|
+
select grp, sum(val) as s, count(*) as cnt from na group by grp
|
|
38
|
+
)
|
|
39
|
+
select sum(s) as total_kept
|
|
40
|
+
from grp_stats where cnt > 1;
|
|
41
|
+
→ [{"total_kept":100}]
|
|
42
|
+
|
|
43
|
+
-- HAVING inside a derived-table feeding an outer aggregate filters groups correctly.
|
|
44
|
+
-- Group sums: a=30, b=70, c=50; threshold > 35 keeps b and c → outer sum = 120.
|
|
45
|
+
select sum(s) as total_above_threshold
|
|
46
|
+
from (select grp, sum(val) as s from na group by grp having sum(val) > 35);
|
|
47
|
+
→ [{"total_above_threshold":120}]
|
|
48
|
+
|
|
49
|
+
-- Two-level nesting: aggregate of an aggregate of an aggregate
|
|
50
|
+
select avg(g) as avg_grp_total from (
|
|
51
|
+
select grp, sum(v) as g from (
|
|
52
|
+
select grp, sum(val) as v from na group by grp
|
|
53
|
+
) group by grp
|
|
54
|
+
);
|
|
55
|
+
→ [{"avg_grp_total":50}]
|
|
56
|
+
|
|
57
|
+
drop table na;
|
|
58
|
+
|
|
59
|
+
-- Correlated subquery with aggregate inside outer aggregate
|
|
60
|
+
-- Outer aggregate counts groups whose subquery aggregate exceeds a threshold.
|
|
61
|
+
create table nb (id integer primary key, grp text, val integer);
|
|
62
|
+
insert into nb values
|
|
63
|
+
(1, 'a', 10),
|
|
64
|
+
(2, 'a', 20),
|
|
65
|
+
(3, 'b', 30),
|
|
66
|
+
(4, 'c', 5);
|
|
67
|
+
|
|
68
|
+
-- Number of groups whose own sum exceeds a fixed threshold
|
|
69
|
+
select count(*) as big_groups from (
|
|
70
|
+
select grp, sum(val) as s from nb group by grp
|
|
71
|
+
) where s >= 25;
|
|
72
|
+
→ [{"big_groups":2}]
|
|
73
|
+
|
|
74
|
+
drop table nb;
|