@quereus/quereus 4.20.0 → 4.20.2

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