@quereus/quereus 4.20.1 → 4.20.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (380) hide show
  1. package/README.md +2 -0
  2. package/dist/src/schema/schema-differ.d.ts.map +1 -1
  3. package/dist/src/schema/schema-differ.js +17 -69
  4. package/dist/src/schema/schema-differ.js.map +1 -1
  5. package/package.json +7 -4
  6. package/test/README.md +173 -0
  7. package/test/logic/01-basic.sqllogic +39 -0
  8. package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
  9. package/test/logic/01.2-strings.sqllogic +43 -0
  10. package/test/logic/01.5-insert-select.sqllogic +237 -0
  11. package/test/logic/01.6-update-extras.sqllogic +118 -0
  12. package/test/logic/01.7-update-from.sqllogic +67 -0
  13. package/test/logic/01.8-delete-extras.sqllogic +122 -0
  14. package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
  15. package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
  16. package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
  17. package/test/logic/01.9-query-expr-values.sqllogic +111 -0
  18. package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
  19. package/test/logic/02-filters.sqllogic +54 -0
  20. package/test/logic/02-smoke.sqllogic +62 -0
  21. package/test/logic/02.1-bind-parameters.sqllogic +223 -0
  22. package/test/logic/03-expressions.sqllogic +190 -0
  23. package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
  24. package/test/logic/03.4-defaults.sqllogic +554 -0
  25. package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
  26. package/test/logic/03.5-tvf.sqllogic +61 -0
  27. package/test/logic/03.6-type-system.sqllogic +544 -0
  28. package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
  29. package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
  30. package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
  31. package/test/logic/03.8-not-precedence.sqllogic +255 -0
  32. package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
  33. package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
  34. package/test/logic/04-order-by.sqllogic +38 -0
  35. package/test/logic/04-transactions.sqllogic +239 -0
  36. package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
  37. package/test/logic/05-vtab_memory.sqllogic +50 -0
  38. package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
  39. package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
  40. package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
  41. package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
  42. package/test/logic/06-builtin_functions.sqllogic +149 -0
  43. package/test/logic/06.1-string-functions.sqllogic +92 -0
  44. package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
  45. package/test/logic/06.2-math-functions.sqllogic +82 -0
  46. package/test/logic/06.3-schema.sqllogic +48 -0
  47. package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
  48. package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
  49. package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
  50. package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
  51. package/test/logic/06.3.4-view-info.sqllogic +378 -0
  52. package/test/logic/06.3.5-column-info.sqllogic +347 -0
  53. package/test/logic/06.3.6-schema-views.sqllogic +29 -0
  54. package/test/logic/06.4-schema-search-path.sqllogic +354 -0
  55. package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
  56. package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
  57. package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
  58. package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
  59. package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
  60. package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
  61. package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
  62. package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
  63. package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
  64. package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
  65. package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
  66. package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
  67. package/test/logic/06.7-json-extended.sqllogic +53 -0
  68. package/test/logic/06.8-json-path-operators.sqllogic +99 -0
  69. package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
  70. package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
  71. package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
  72. package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
  73. package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
  74. package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
  75. package/test/logic/07-aggregates.sqllogic +193 -0
  76. package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
  77. package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
  78. package/test/logic/07.3-group-by-extras.sqllogic +602 -0
  79. package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
  80. package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
  81. package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
  82. package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
  83. package/test/logic/07.5-window.sqllogic +1941 -0
  84. package/test/logic/07.5.1-window-named.sqllogic +13 -0
  85. package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
  86. package/test/logic/07.6-subqueries.sqllogic +78 -0
  87. package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
  88. package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
  89. package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
  90. package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
  91. package/test/logic/07.7.1-in-extras.sqllogic +158 -0
  92. package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
  93. package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
  94. package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
  95. package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
  96. package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
  97. package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
  98. package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
  99. package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
  100. package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
  101. package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
  102. package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
  103. package/test/logic/07.9-in-value-list.sqllogic +154 -0
  104. package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
  105. package/test/logic/08-views.sqllogic +64 -0
  106. package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
  107. package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
  108. package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
  109. package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
  110. package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
  111. package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
  112. package/test/logic/09-set_operations.sqllogic +244 -0
  113. package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
  114. package/test/logic/10-distinct_datatypes.sqllogic +127 -0
  115. package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
  116. package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
  117. package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
  118. package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
  119. package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
  120. package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
  121. package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
  122. package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
  123. package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
  124. package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
  125. package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
  126. package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
  127. package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
  128. package/test/logic/10.2-column-features.sqllogic +365 -0
  129. package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
  130. package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
  131. package/test/logic/10.3-function-features.sqllogic +247 -0
  132. package/test/logic/10.4-schema-scale.sqllogic +168 -0
  133. package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
  134. package/test/logic/10.5-indexes.sqllogic +164 -0
  135. package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
  136. package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
  137. package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
  138. package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
  139. package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
  140. package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
  141. package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
  142. package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
  143. package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
  144. package/test/logic/100.1-where-extras.sqllogic +163 -0
  145. package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
  146. package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
  147. package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
  148. package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
  149. package/test/logic/102-unique-constraints.sqllogic +145 -0
  150. package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
  151. package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
  152. package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
  153. package/test/logic/102.2-unique-collation.sqllogic +181 -0
  154. package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
  155. package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
  156. package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
  157. package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
  158. package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
  159. package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
  160. package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
  161. package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
  162. package/test/logic/108-cardinality-estimation.sqllogic +146 -0
  163. package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
  164. package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
  165. package/test/logic/11-joins.sqllogic +86 -0
  166. package/test/logic/11.1-join-using.sqllogic +267 -0
  167. package/test/logic/11.2-comma-join.sqllogic +35 -0
  168. package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
  169. package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
  170. package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
  171. package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
  172. package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
  173. package/test/logic/12-empty-primary-key.sqllogic +124 -0
  174. package/test/logic/12-join_padding_order.sqllogic +58 -0
  175. package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
  176. package/test/logic/13-cte.sqllogic +137 -0
  177. package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
  178. package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
  179. package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
  180. package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
  181. package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
  182. package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
  183. package/test/logic/13.4-cte-extras.sqllogic +98 -0
  184. package/test/logic/13.5-cte-join-order.sqllogic +166 -0
  185. package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
  186. package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
  187. package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
  188. package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
  189. package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
  190. package/test/logic/14-utilities.sqllogic +168 -0
  191. package/test/logic/15-timespan.sqllogic +279 -0
  192. package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
  193. package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
  194. package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
  195. package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
  196. package/test/logic/16-epoch.sqllogic +187 -0
  197. package/test/logic/17-weekday-modifier.sqllogic +78 -0
  198. package/test/logic/18-json-string-escapes.sqllogic +86 -0
  199. package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
  200. package/test/logic/20-empty-single-row.sqllogic +261 -0
  201. package/test/logic/21-null-edge-cases.sqllogic +227 -0
  202. package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
  203. package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
  204. package/test/logic/21.2-between-edges.sqllogic +157 -0
  205. package/test/logic/22-boundary-values.sqllogic +175 -0
  206. package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
  207. package/test/logic/24-builtin-branches.sqllogic +611 -0
  208. package/test/logic/24.1-substr-extras.sqllogic +75 -0
  209. package/test/logic/24.2-random-extras.sqllogic +39 -0
  210. package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
  211. package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
  212. package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
  213. package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
  214. package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
  215. package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
  216. package/test/logic/26-join-edge-cases.sqllogic +333 -0
  217. package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
  218. package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
  219. package/test/logic/26.3-join-on-constants.sqllogic +61 -0
  220. package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
  221. package/test/logic/27-window-edge-cases.sqllogic +206 -0
  222. package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
  223. package/test/logic/27.2-window-exclude.sqllogic +13 -0
  224. package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
  225. package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
  226. package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
  227. package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
  228. package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
  229. package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
  230. package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
  231. package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
  232. package/test/logic/40-constraints.sqllogic +418 -0
  233. package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
  234. package/test/logic/40.2-check-extras.sqllogic +683 -0
  235. package/test/logic/41-alter-table.sqllogic +191 -0
  236. package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
  237. package/test/logic/41-fk-cross-schema.sqllogic +155 -0
  238. package/test/logic/41-fk-extended-targets.sqllogic +173 -0
  239. package/test/logic/41-foreign-keys.sqllogic +1001 -0
  240. package/test/logic/41-generated-column-errors.sqllogic +225 -0
  241. package/test/logic/41-generated-column-extras.sqllogic +598 -0
  242. package/test/logic/41-generated-column-scope.sqllogic +329 -0
  243. package/test/logic/41-generated-columns.sqllogic +361 -0
  244. package/test/logic/41.1-alter-pk.sqllogic +230 -0
  245. package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
  246. package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
  247. package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
  248. package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
  249. package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
  250. package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
  251. package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
  252. package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
  253. package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
  254. package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
  255. package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
  256. package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
  257. package/test/logic/41.2-alter-column.sqllogic +382 -0
  258. package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
  259. package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
  260. package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
  261. package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
  262. package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
  263. package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
  264. package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
  265. package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
  266. package/test/logic/41.5-alter-misc.sqllogic +48 -0
  267. package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
  268. package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
  269. package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
  270. package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
  271. package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
  272. package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
  273. package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
  274. package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
  275. package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
  276. package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
  277. package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
  278. package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
  279. package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
  280. package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
  281. package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
  282. package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
  283. package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
  284. package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
  285. package/test/logic/42-committed-snapshot.sqllogic +254 -0
  286. package/test/logic/42-returning.sqllogic +159 -0
  287. package/test/logic/42.1-returning-extras.sqllogic +232 -0
  288. package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
  289. package/test/logic/43-default-nullability.sqllogic +131 -0
  290. package/test/logic/43-transition-constraints.sqllogic +341 -0
  291. package/test/logic/43.1-default-collation.sqllogic +140 -0
  292. package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
  293. package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
  294. package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
  295. package/test/logic/44-determinism-validation.sqllogic +164 -0
  296. package/test/logic/44-orthogonality.sqllogic +146 -0
  297. package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
  298. package/test/logic/45-udf-determinism.sqllogic +39 -0
  299. package/test/logic/46-mutation-context.sqllogic +595 -0
  300. package/test/logic/47-upsert.sqllogic +255 -0
  301. package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
  302. package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
  303. package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
  304. package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
  305. package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
  306. package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
  307. package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
  308. package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
  309. package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
  310. package/test/logic/49-reference-graph.sqllogic +84 -0
  311. package/test/logic/50-declarative-schema.sqllogic +2550 -0
  312. package/test/logic/50-metadata-tags.sqllogic +1033 -0
  313. package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
  314. package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
  315. package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
  316. package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +210 -0
  317. package/test/logic/50.3-declare-schema-duplicate-names.sqllogic +280 -0
  318. package/test/logic/50.4-declare-schema-apply-restore.sqllogic +192 -0
  319. package/test/logic/51-lens-foundation.sqllogic +147 -0
  320. package/test/logic/51-materialized-views.sqllogic +376 -0
  321. package/test/logic/51.5-materialized-views-coarsened-key.sqllogic +198 -0
  322. package/test/logic/51.7-maintained-table-attach-detach.sqllogic +468 -0
  323. package/test/logic/51.8-maintained-table-declared-constraints.sqllogic +440 -0
  324. package/test/logic/51.85-maintained-table-parent-fk.sqllogic +103 -0
  325. package/test/logic/51.9-maintained-table-secondary-unique.sqllogic +237 -0
  326. package/test/logic/51.9.1-maintained-table-partial-unique.sqllogic +36 -0
  327. package/test/logic/52-lens-overrides.sqllogic +566 -0
  328. package/test/logic/53-materialized-views-rowtime.sqllogic +1601 -0
  329. package/test/logic/53-reserved-tags.sqllogic +252 -0
  330. package/test/logic/53.1-materialized-view-write-through.sqllogic +329 -0
  331. package/test/logic/53.2-materialized-view-rename-propagation.sqllogic +483 -0
  332. package/test/logic/53.3-materialized-view-constraint-only-ddl.sqllogic +409 -0
  333. package/test/logic/53.3.1-materialized-view-index-ddl-irrelevance.sqllogic +29 -0
  334. package/test/logic/53.4-materialized-view-structural-alter-restore.sqllogic +436 -0
  335. package/test/logic/54-covering-mv-enforcement.sqllogic +314 -0
  336. package/test/logic/54.1-covering-mv-partial-enforcement.sqllogic +34 -0
  337. package/test/logic/55-internal-eviction-reporting.sqllogic +89 -0
  338. package/test/logic/55-lens-prover.sqllogic +202 -0
  339. package/test/logic/55.1-eviction-restrict-fk.sqllogic +148 -0
  340. package/test/logic/55.5-lens-authored-inverse.sqllogic +1468 -0
  341. package/test/logic/80-grow-retrieve-pass.sqllogic +79 -0
  342. package/test/logic/81-quickpick.sqllogic +24 -0
  343. package/test/logic/82-bloom-join.sqllogic +185 -0
  344. package/test/logic/83-merge-join.sqllogic +280 -0
  345. package/test/logic/84-asof-scan.sqllogic +238 -0
  346. package/test/logic/84-key-cardinality.sqllogic +50 -0
  347. package/test/logic/85-relational-const-folding.sqllogic +51 -0
  348. package/test/logic/86-scalar-cse.sqllogic +42 -0
  349. package/test/logic/90-error_paths.sqllogic +114 -0
  350. package/test/logic/90.1-parse-errors.sqllogic +77 -0
  351. package/test/logic/90.2-alter-table-errors.sqllogic +53 -0
  352. package/test/logic/90.2.1-alter-extra-errors.sqllogic +51 -0
  353. package/test/logic/90.3-expression-errors.sqllogic +43 -0
  354. package/test/logic/90.4-dml-errors.sqllogic +47 -0
  355. package/test/logic/90.5-unsupported-join-types.sqllogic +37 -0
  356. package/test/logic/90.5.1-right-full-join-read.sqllogic +157 -0
  357. package/test/logic/90.6-select-error-paths.sqllogic +57 -0
  358. package/test/logic/91-merge-join-edge-cases.sqllogic +159 -0
  359. package/test/logic/92-hash-aggregate-edge-cases.sqllogic +139 -0
  360. package/test/logic/93-ddl-view-edge-cases.sqllogic +104 -0
  361. package/test/logic/93.1-view-error-paths.sqllogic +74 -0
  362. package/test/logic/93.2-view-mutation-pending.sqllogic +108 -0
  363. package/test/logic/93.3-view-mutation-or-clause.sqllogic +60 -0
  364. package/test/logic/93.4-view-mutation.sqllogic +4881 -0
  365. package/test/logic/93.4.1-view-mutation-partial-unique-cardinality.sqllogic +31 -0
  366. package/test/logic/93.5-authored-inverse.sqllogic +415 -0
  367. package/test/logic/93.6-set-op-flagless-write.sqllogic +862 -0
  368. package/test/logic/94-tvf-edge-cases.sqllogic +58 -0
  369. package/test/logic/94.1-limit-offset-edge-cases.sqllogic +109 -0
  370. package/test/logic/94.2-limit-offset-extras.sqllogic +98 -0
  371. package/test/logic/95-assertions.sqllogic +1417 -0
  372. package/test/logic/96-subquery-edge-cases.sqllogic +276 -0
  373. package/test/logic/97-json-function-edge-cases.sqllogic +633 -0
  374. package/test/logic/97.1-json-blob-and-special-values.sqllogic +92 -0
  375. package/test/logic/98-temporal-edge-cases.sqllogic +515 -0
  376. package/test/logic/99-conversion-edge-cases.sqllogic +325 -0
  377. package/test/logic/99.0.1-schema-index-listing.sqllogic +21 -0
  378. package/test/logic/99.1-cast-syntax-extras.sqllogic +167 -0
  379. package/test/logic/drop-unique-index.sqllogic +88 -0
  380. 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;