@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.
Files changed (377) hide show
  1. package/README.md +2 -0
  2. package/package.json +7 -4
  3. package/test/README.md +173 -0
  4. package/test/logic/01-basic.sqllogic +39 -0
  5. package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
  6. package/test/logic/01.2-strings.sqllogic +43 -0
  7. package/test/logic/01.5-insert-select.sqllogic +237 -0
  8. package/test/logic/01.6-update-extras.sqllogic +118 -0
  9. package/test/logic/01.7-update-from.sqllogic +67 -0
  10. package/test/logic/01.8-delete-extras.sqllogic +122 -0
  11. package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
  12. package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
  13. package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
  14. package/test/logic/01.9-query-expr-values.sqllogic +111 -0
  15. package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
  16. package/test/logic/02-filters.sqllogic +54 -0
  17. package/test/logic/02-smoke.sqllogic +62 -0
  18. package/test/logic/02.1-bind-parameters.sqllogic +223 -0
  19. package/test/logic/03-expressions.sqllogic +190 -0
  20. package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
  21. package/test/logic/03.4-defaults.sqllogic +554 -0
  22. package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
  23. package/test/logic/03.5-tvf.sqllogic +61 -0
  24. package/test/logic/03.6-type-system.sqllogic +544 -0
  25. package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
  26. package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
  27. package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
  28. package/test/logic/03.8-not-precedence.sqllogic +255 -0
  29. package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
  30. package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
  31. package/test/logic/04-order-by.sqllogic +38 -0
  32. package/test/logic/04-transactions.sqllogic +239 -0
  33. package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
  34. package/test/logic/05-vtab_memory.sqllogic +50 -0
  35. package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
  36. package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
  37. package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
  38. package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
  39. package/test/logic/06-builtin_functions.sqllogic +149 -0
  40. package/test/logic/06.1-string-functions.sqllogic +92 -0
  41. package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
  42. package/test/logic/06.2-math-functions.sqllogic +82 -0
  43. package/test/logic/06.3-schema.sqllogic +48 -0
  44. package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
  45. package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
  46. package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
  47. package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
  48. package/test/logic/06.3.4-view-info.sqllogic +378 -0
  49. package/test/logic/06.3.5-column-info.sqllogic +347 -0
  50. package/test/logic/06.3.6-schema-views.sqllogic +29 -0
  51. package/test/logic/06.4-schema-search-path.sqllogic +354 -0
  52. package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
  53. package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
  54. package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
  55. package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
  56. package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
  57. package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
  58. package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
  59. package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
  60. package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
  61. package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
  62. package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
  63. package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
  64. package/test/logic/06.7-json-extended.sqllogic +53 -0
  65. package/test/logic/06.8-json-path-operators.sqllogic +99 -0
  66. package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
  67. package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
  68. package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
  69. package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
  70. package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
  71. package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
  72. package/test/logic/07-aggregates.sqllogic +193 -0
  73. package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
  74. package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
  75. package/test/logic/07.3-group-by-extras.sqllogic +602 -0
  76. package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
  77. package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
  78. package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
  79. package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
  80. package/test/logic/07.5-window.sqllogic +1941 -0
  81. package/test/logic/07.5.1-window-named.sqllogic +13 -0
  82. package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
  83. package/test/logic/07.6-subqueries.sqllogic +78 -0
  84. package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
  85. package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
  86. package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
  87. package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
  88. package/test/logic/07.7.1-in-extras.sqllogic +158 -0
  89. package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
  90. package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
  91. package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
  92. package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
  93. package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
  94. package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
  95. package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
  96. package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
  97. package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
  98. package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
  99. package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
  100. package/test/logic/07.9-in-value-list.sqllogic +154 -0
  101. package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
  102. package/test/logic/08-views.sqllogic +64 -0
  103. package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
  104. package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
  105. package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
  106. package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
  107. package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
  108. package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
  109. package/test/logic/09-set_operations.sqllogic +244 -0
  110. package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
  111. package/test/logic/10-distinct_datatypes.sqllogic +127 -0
  112. package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
  113. package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
  114. package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
  115. package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
  116. package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
  117. package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
  118. package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
  119. package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
  120. package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
  121. package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
  122. package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
  123. package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
  124. package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
  125. package/test/logic/10.2-column-features.sqllogic +365 -0
  126. package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
  127. package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
  128. package/test/logic/10.3-function-features.sqllogic +247 -0
  129. package/test/logic/10.4-schema-scale.sqllogic +168 -0
  130. package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
  131. package/test/logic/10.5-indexes.sqllogic +164 -0
  132. package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
  133. package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
  134. package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
  135. package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
  136. package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
  137. package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
  138. package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
  139. package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
  140. package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
  141. package/test/logic/100.1-where-extras.sqllogic +163 -0
  142. package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
  143. package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
  144. package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
  145. package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
  146. package/test/logic/102-unique-constraints.sqllogic +145 -0
  147. package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
  148. package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
  149. package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
  150. package/test/logic/102.2-unique-collation.sqllogic +181 -0
  151. package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
  152. package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
  153. package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
  154. package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
  155. package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
  156. package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
  157. package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
  158. package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
  159. package/test/logic/108-cardinality-estimation.sqllogic +146 -0
  160. package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
  161. package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
  162. package/test/logic/11-joins.sqllogic +86 -0
  163. package/test/logic/11.1-join-using.sqllogic +267 -0
  164. package/test/logic/11.2-comma-join.sqllogic +35 -0
  165. package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
  166. package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
  167. package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
  168. package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
  169. package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
  170. package/test/logic/12-empty-primary-key.sqllogic +124 -0
  171. package/test/logic/12-join_padding_order.sqllogic +58 -0
  172. package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
  173. package/test/logic/13-cte.sqllogic +137 -0
  174. package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
  175. package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
  176. package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
  177. package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
  178. package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
  179. package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
  180. package/test/logic/13.4-cte-extras.sqllogic +98 -0
  181. package/test/logic/13.5-cte-join-order.sqllogic +166 -0
  182. package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
  183. package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
  184. package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
  185. package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
  186. package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
  187. package/test/logic/14-utilities.sqllogic +168 -0
  188. package/test/logic/15-timespan.sqllogic +279 -0
  189. package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
  190. package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
  191. package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
  192. package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
  193. package/test/logic/16-epoch.sqllogic +187 -0
  194. package/test/logic/17-weekday-modifier.sqllogic +78 -0
  195. package/test/logic/18-json-string-escapes.sqllogic +86 -0
  196. package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
  197. package/test/logic/20-empty-single-row.sqllogic +261 -0
  198. package/test/logic/21-null-edge-cases.sqllogic +227 -0
  199. package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
  200. package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
  201. package/test/logic/21.2-between-edges.sqllogic +157 -0
  202. package/test/logic/22-boundary-values.sqllogic +175 -0
  203. package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
  204. package/test/logic/24-builtin-branches.sqllogic +611 -0
  205. package/test/logic/24.1-substr-extras.sqllogic +75 -0
  206. package/test/logic/24.2-random-extras.sqllogic +39 -0
  207. package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
  208. package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
  209. package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
  210. package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
  211. package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
  212. package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
  213. package/test/logic/26-join-edge-cases.sqllogic +333 -0
  214. package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
  215. package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
  216. package/test/logic/26.3-join-on-constants.sqllogic +61 -0
  217. package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
  218. package/test/logic/27-window-edge-cases.sqllogic +206 -0
  219. package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
  220. package/test/logic/27.2-window-exclude.sqllogic +13 -0
  221. package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
  222. package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
  223. package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
  224. package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
  225. package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
  226. package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
  227. package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
  228. package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
  229. package/test/logic/40-constraints.sqllogic +418 -0
  230. package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
  231. package/test/logic/40.2-check-extras.sqllogic +683 -0
  232. package/test/logic/41-alter-table.sqllogic +191 -0
  233. package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
  234. package/test/logic/41-fk-cross-schema.sqllogic +155 -0
  235. package/test/logic/41-fk-extended-targets.sqllogic +173 -0
  236. package/test/logic/41-foreign-keys.sqllogic +1001 -0
  237. package/test/logic/41-generated-column-errors.sqllogic +225 -0
  238. package/test/logic/41-generated-column-extras.sqllogic +598 -0
  239. package/test/logic/41-generated-column-scope.sqllogic +329 -0
  240. package/test/logic/41-generated-columns.sqllogic +361 -0
  241. package/test/logic/41.1-alter-pk.sqllogic +230 -0
  242. package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
  243. package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
  244. package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
  245. package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
  246. package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
  247. package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
  248. package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
  249. package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
  250. package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
  251. package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
  252. package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
  253. package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
  254. package/test/logic/41.2-alter-column.sqllogic +382 -0
  255. package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
  256. package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
  257. package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
  258. package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
  259. package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
  260. package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
  261. package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
  262. package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
  263. package/test/logic/41.5-alter-misc.sqllogic +48 -0
  264. package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
  265. package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
  266. package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
  267. package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
  268. package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
  269. package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
  270. package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
  271. package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
  272. package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
  273. package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
  274. package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
  275. package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
  276. package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
  277. package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
  278. package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
  279. package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
  280. package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
  281. package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
  282. package/test/logic/42-committed-snapshot.sqllogic +254 -0
  283. package/test/logic/42-returning.sqllogic +159 -0
  284. package/test/logic/42.1-returning-extras.sqllogic +232 -0
  285. package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
  286. package/test/logic/43-default-nullability.sqllogic +131 -0
  287. package/test/logic/43-transition-constraints.sqllogic +341 -0
  288. package/test/logic/43.1-default-collation.sqllogic +140 -0
  289. package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
  290. package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
  291. package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
  292. package/test/logic/44-determinism-validation.sqllogic +164 -0
  293. package/test/logic/44-orthogonality.sqllogic +146 -0
  294. package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
  295. package/test/logic/45-udf-determinism.sqllogic +39 -0
  296. package/test/logic/46-mutation-context.sqllogic +595 -0
  297. package/test/logic/47-upsert.sqllogic +255 -0
  298. package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
  299. package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
  300. package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
  301. package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
  302. package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
  303. package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
  304. package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
  305. package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
  306. package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
  307. package/test/logic/49-reference-graph.sqllogic +84 -0
  308. package/test/logic/50-declarative-schema.sqllogic +2550 -0
  309. package/test/logic/50-metadata-tags.sqllogic +1033 -0
  310. package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
  311. package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
  312. package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
  313. package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +173 -0
  314. package/test/logic/50.3-declare-schema-duplicate-names.sqllogic +280 -0
  315. package/test/logic/50.4-declare-schema-apply-restore.sqllogic +192 -0
  316. package/test/logic/51-lens-foundation.sqllogic +147 -0
  317. package/test/logic/51-materialized-views.sqllogic +376 -0
  318. package/test/logic/51.5-materialized-views-coarsened-key.sqllogic +198 -0
  319. package/test/logic/51.7-maintained-table-attach-detach.sqllogic +468 -0
  320. package/test/logic/51.8-maintained-table-declared-constraints.sqllogic +440 -0
  321. package/test/logic/51.85-maintained-table-parent-fk.sqllogic +103 -0
  322. package/test/logic/51.9-maintained-table-secondary-unique.sqllogic +237 -0
  323. package/test/logic/51.9.1-maintained-table-partial-unique.sqllogic +36 -0
  324. package/test/logic/52-lens-overrides.sqllogic +566 -0
  325. package/test/logic/53-materialized-views-rowtime.sqllogic +1601 -0
  326. package/test/logic/53-reserved-tags.sqllogic +252 -0
  327. package/test/logic/53.1-materialized-view-write-through.sqllogic +329 -0
  328. package/test/logic/53.2-materialized-view-rename-propagation.sqllogic +483 -0
  329. package/test/logic/53.3-materialized-view-constraint-only-ddl.sqllogic +409 -0
  330. package/test/logic/53.3.1-materialized-view-index-ddl-irrelevance.sqllogic +29 -0
  331. package/test/logic/53.4-materialized-view-structural-alter-restore.sqllogic +436 -0
  332. package/test/logic/54-covering-mv-enforcement.sqllogic +314 -0
  333. package/test/logic/54.1-covering-mv-partial-enforcement.sqllogic +34 -0
  334. package/test/logic/55-internal-eviction-reporting.sqllogic +89 -0
  335. package/test/logic/55-lens-prover.sqllogic +202 -0
  336. package/test/logic/55.1-eviction-restrict-fk.sqllogic +148 -0
  337. package/test/logic/55.5-lens-authored-inverse.sqllogic +1468 -0
  338. package/test/logic/80-grow-retrieve-pass.sqllogic +79 -0
  339. package/test/logic/81-quickpick.sqllogic +24 -0
  340. package/test/logic/82-bloom-join.sqllogic +185 -0
  341. package/test/logic/83-merge-join.sqllogic +280 -0
  342. package/test/logic/84-asof-scan.sqllogic +238 -0
  343. package/test/logic/84-key-cardinality.sqllogic +50 -0
  344. package/test/logic/85-relational-const-folding.sqllogic +51 -0
  345. package/test/logic/86-scalar-cse.sqllogic +42 -0
  346. package/test/logic/90-error_paths.sqllogic +114 -0
  347. package/test/logic/90.1-parse-errors.sqllogic +77 -0
  348. package/test/logic/90.2-alter-table-errors.sqllogic +53 -0
  349. package/test/logic/90.2.1-alter-extra-errors.sqllogic +51 -0
  350. package/test/logic/90.3-expression-errors.sqllogic +43 -0
  351. package/test/logic/90.4-dml-errors.sqllogic +47 -0
  352. package/test/logic/90.5-unsupported-join-types.sqllogic +37 -0
  353. package/test/logic/90.5.1-right-full-join-read.sqllogic +157 -0
  354. package/test/logic/90.6-select-error-paths.sqllogic +57 -0
  355. package/test/logic/91-merge-join-edge-cases.sqllogic +159 -0
  356. package/test/logic/92-hash-aggregate-edge-cases.sqllogic +139 -0
  357. package/test/logic/93-ddl-view-edge-cases.sqllogic +104 -0
  358. package/test/logic/93.1-view-error-paths.sqllogic +74 -0
  359. package/test/logic/93.2-view-mutation-pending.sqllogic +108 -0
  360. package/test/logic/93.3-view-mutation-or-clause.sqllogic +60 -0
  361. package/test/logic/93.4-view-mutation.sqllogic +4881 -0
  362. package/test/logic/93.4.1-view-mutation-partial-unique-cardinality.sqllogic +31 -0
  363. package/test/logic/93.5-authored-inverse.sqllogic +415 -0
  364. package/test/logic/93.6-set-op-flagless-write.sqllogic +862 -0
  365. package/test/logic/94-tvf-edge-cases.sqllogic +58 -0
  366. package/test/logic/94.1-limit-offset-edge-cases.sqllogic +109 -0
  367. package/test/logic/94.2-limit-offset-extras.sqllogic +98 -0
  368. package/test/logic/95-assertions.sqllogic +1417 -0
  369. package/test/logic/96-subquery-edge-cases.sqllogic +276 -0
  370. package/test/logic/97-json-function-edge-cases.sqllogic +633 -0
  371. package/test/logic/97.1-json-blob-and-special-values.sqllogic +92 -0
  372. package/test/logic/98-temporal-edge-cases.sqllogic +515 -0
  373. package/test/logic/99-conversion-edge-cases.sqllogic +325 -0
  374. package/test/logic/99.0.1-schema-index-listing.sqllogic +21 -0
  375. package/test/logic/99.1-cast-syntax-extras.sqllogic +167 -0
  376. package/test/logic/drop-unique-index.sqllogic +88 -0
  377. package/test/logic/pushdown-test.sqllogic +36 -0
@@ -0,0 +1,444 @@
1
+ -- 28-set-ops-sort-edge-cases.sqllogic
2
+ -- Edge-case tests for set operations (UNION/INTERSECT/EXCEPT/DIFF) and ORDER BY
3
+
4
+ -- ============================================================
5
+ -- Setup tables
6
+ -- ============================================================
7
+
8
+ CREATE TABLE sose_t (id INTEGER PRIMARY KEY, val TEXT);
9
+ INSERT INTO sose_t VALUES (1, 'alpha'), (2, 'beta'), (3, 'gamma');
10
+
11
+ -- ============================================================
12
+ -- SET OPERATIONS: Empty inputs
13
+ -- ============================================================
14
+
15
+ -- UNION: empty left, non-empty right
16
+ SELECT val FROM sose_t WHERE 1=0
17
+ UNION
18
+ SELECT val FROM sose_t
19
+ ORDER BY val;
20
+ → [{"val":"alpha"},{"val":"beta"},{"val":"gamma"}]
21
+
22
+ -- UNION: non-empty left, empty right
23
+ SELECT val FROM sose_t
24
+ UNION
25
+ SELECT val FROM sose_t WHERE 1=0
26
+ ORDER BY val;
27
+ → [{"val":"alpha"},{"val":"beta"},{"val":"gamma"}]
28
+
29
+ -- UNION: both sides empty
30
+ SELECT val FROM sose_t WHERE 1=0
31
+ UNION
32
+ SELECT val FROM sose_t WHERE 1=0;
33
+ → []
34
+
35
+ -- UNION ALL: empty left, non-empty right
36
+ SELECT val FROM sose_t WHERE 1=0
37
+ UNION ALL
38
+ SELECT val FROM sose_t
39
+ ORDER BY val;
40
+ → [{"val":"alpha"},{"val":"beta"},{"val":"gamma"}]
41
+
42
+ -- UNION ALL: non-empty left, empty right
43
+ SELECT val FROM sose_t
44
+ UNION ALL
45
+ SELECT val FROM sose_t WHERE 1=0
46
+ ORDER BY val;
47
+ → [{"val":"alpha"},{"val":"beta"},{"val":"gamma"}]
48
+
49
+ -- INTERSECT: empty left
50
+ SELECT val FROM sose_t WHERE 1=0
51
+ INTERSECT
52
+ SELECT val FROM sose_t;
53
+ → []
54
+
55
+ -- INTERSECT: empty right
56
+ SELECT val FROM sose_t
57
+ INTERSECT
58
+ SELECT val FROM sose_t WHERE 1=0;
59
+ → []
60
+
61
+ -- INTERSECT: both empty
62
+ SELECT val FROM sose_t WHERE 1=0
63
+ INTERSECT
64
+ SELECT val FROM sose_t WHERE 1=0;
65
+ → []
66
+
67
+ -- EXCEPT: empty left
68
+ SELECT val FROM sose_t WHERE 1=0
69
+ EXCEPT
70
+ SELECT val FROM sose_t;
71
+ → []
72
+
73
+ -- EXCEPT: empty right — should return all of left
74
+ SELECT val FROM sose_t
75
+ EXCEPT
76
+ SELECT val FROM sose_t WHERE 1=0
77
+ ORDER BY val;
78
+ → [{"val":"alpha"},{"val":"beta"},{"val":"gamma"}]
79
+
80
+ -- EXCEPT: both empty
81
+ SELECT val FROM sose_t WHERE 1=0
82
+ EXCEPT
83
+ SELECT val FROM sose_t WHERE 1=0;
84
+ → []
85
+
86
+ -- DIFF: empty left
87
+ SELECT val FROM sose_t WHERE 1=0
88
+ DIFF
89
+ SELECT val FROM sose_t
90
+ ORDER BY val;
91
+ → [{"val":"alpha"},{"val":"beta"},{"val":"gamma"}]
92
+
93
+ -- DIFF: empty right — should return all of left
94
+ SELECT val FROM sose_t
95
+ DIFF
96
+ SELECT val FROM sose_t WHERE 1=0
97
+ ORDER BY val;
98
+ → [{"val":"alpha"},{"val":"beta"},{"val":"gamma"}]
99
+
100
+ -- DIFF: both empty
101
+ SELECT val FROM sose_t WHERE 1=0
102
+ DIFF
103
+ SELECT val FROM sose_t WHERE 1=0;
104
+ → []
105
+
106
+ -- ============================================================
107
+ -- SET OPERATIONS: All-duplicate inputs
108
+ -- ============================================================
109
+
110
+ -- UNION on all-duplicate rows deduplicates to one
111
+ SELECT v FROM (VALUES ('dup'), ('dup'), ('dup')) AS t(v)
112
+ UNION
113
+ SELECT v FROM (VALUES ('dup'), ('dup')) AS t(v);
114
+ → [{"v":"dup"}]
115
+
116
+ -- UNION ALL preserves all duplicates
117
+ SELECT v FROM (VALUES ('dup'), ('dup'), ('dup')) AS t(v)
118
+ UNION ALL
119
+ SELECT v FROM (VALUES ('dup'), ('dup')) AS t(v);
120
+ → [{"v":"dup"},{"v":"dup"},{"v":"dup"},{"v":"dup"},{"v":"dup"}]
121
+
122
+ -- INTERSECT on all-duplicate rows returns one
123
+ SELECT v FROM (VALUES ('dup'), ('dup'), ('dup')) AS t(v)
124
+ INTERSECT
125
+ SELECT v FROM (VALUES ('dup'), ('dup')) AS t(v);
126
+ → [{"v":"dup"}]
127
+
128
+ -- EXCEPT on all-duplicate rows (both sides same) returns empty
129
+ SELECT v FROM (VALUES ('dup'), ('dup'), ('dup')) AS t(v)
130
+ EXCEPT
131
+ SELECT v FROM (VALUES ('dup')) AS t(v);
132
+ → []
133
+
134
+ -- ============================================================
135
+ -- SET OPERATIONS: Three-way / precedence
136
+ -- ============================================================
137
+
138
+ -- Parser is right-associative: A UNION B EXCEPT C = A UNION (B EXCEPT C)
139
+ -- A={1,2}, B={3,4}, C={2,3} → A UNION ({3,4} EXCEPT {2,3}) = {1,2} UNION {4} = {1,2,4}
140
+ SELECT v FROM (VALUES (1), (2)) AS a(v)
141
+ UNION
142
+ SELECT v FROM (VALUES (3), (4)) AS b(v)
143
+ EXCEPT
144
+ SELECT v FROM (VALUES (2), (3)) AS c(v)
145
+ ORDER BY v;
146
+ → [{"v":1},{"v":2},{"v":4}]
147
+
148
+ -- A EXCEPT B UNION C = A EXCEPT (B UNION C) (right-assoc)
149
+ -- A={1,2,3}, B={2}, C={4} → {1,2,3} EXCEPT ({2} UNION {4}) = {1,2,3} EXCEPT {2,4} = {1,3}
150
+ SELECT v FROM (VALUES (1), (2), (3)) AS a(v)
151
+ EXCEPT
152
+ SELECT v FROM (VALUES (2)) AS b(v)
153
+ UNION
154
+ SELECT v FROM (VALUES (4)) AS c(v)
155
+ ORDER BY v;
156
+ → [{"v":1},{"v":3}]
157
+
158
+ -- Explicit CTE to force left-to-right: (A EXCEPT B) UNION C
159
+ -- A={1,2,3}, B={2}, C={4} → {1,3} UNION {4} = {1,3,4}
160
+ WITH ab AS (
161
+ SELECT v FROM (VALUES (1), (2), (3)) AS a(v)
162
+ EXCEPT
163
+ SELECT v FROM (VALUES (2)) AS b(v)
164
+ )
165
+ SELECT v FROM ab
166
+ UNION
167
+ SELECT v FROM (VALUES (4)) AS c(v)
168
+ ORDER BY v;
169
+ → [{"v":1},{"v":3},{"v":4}]
170
+
171
+ -- A INTERSECT B UNION C = A INTERSECT (B UNION C) (right-assoc)
172
+ -- A={1,2,3}, B={2,3,4}, C={5} → {1,2,3} INTERSECT ({2,3,4} UNION {5}) = {1,2,3} INTERSECT {2,3,4,5} = {2,3}
173
+ SELECT v FROM (VALUES (1), (2), (3)) AS a(v)
174
+ INTERSECT
175
+ SELECT v FROM (VALUES (2), (3), (4)) AS b(v)
176
+ UNION
177
+ SELECT v FROM (VALUES (5)) AS c(v)
178
+ ORDER BY v;
179
+ → [{"v":2},{"v":3}]
180
+
181
+ -- ============================================================
182
+ -- SET OPERATIONS: Column count mismatch (error)
183
+ -- ============================================================
184
+
185
+ SELECT 1
186
+ UNION
187
+ SELECT 1, 2;
188
+ -- error: column count mismatch
189
+
190
+ SELECT 1, 2
191
+ INTERSECT
192
+ SELECT 1;
193
+ -- error: column count mismatch
194
+
195
+ -- ============================================================
196
+ -- SET OPERATIONS: ORDER BY on combined result
197
+ -- ============================================================
198
+
199
+ -- ORDER BY applies to the full result, not just the last branch
200
+ SELECT val FROM sose_t WHERE id = 3
201
+ UNION
202
+ SELECT val FROM sose_t WHERE id = 1
203
+ ORDER BY val;
204
+ → [{"val":"alpha"},{"val":"gamma"}]
205
+
206
+ -- ORDER BY with DESC on set operation result
207
+ SELECT val FROM sose_t WHERE id IN (1, 3)
208
+ UNION
209
+ SELECT val FROM sose_t WHERE id = 2
210
+ ORDER BY val DESC;
211
+ → [{"val":"gamma"},{"val":"beta"},{"val":"alpha"}]
212
+
213
+ -- ============================================================
214
+ -- SET OPERATIONS: ORDER BY ordinal (positional) over a compound
215
+ -- Regression: ticket compound-order-by-ordinal-reference. A bare
216
+ -- positional ordinal must order by the compound's Nth OUTPUT column,
217
+ -- not compile to a constant (a no-op).
218
+ -- ============================================================
219
+
220
+ -- Bare ordinal orders by output column 1 (was: input/union order — no-op)
221
+ SELECT v FROM (VALUES (3), (1), (2)) AS a(v)
222
+ UNION
223
+ SELECT v FROM (VALUES (3), (1), (2)) AS b(v)
224
+ ORDER BY 1;
225
+ → [{"v":1},{"v":2},{"v":3}]
226
+
227
+ -- Descending ordinal over UNION ALL (bag preserves all rows)
228
+ SELECT v FROM (VALUES (3), (1), (2)) AS a(v)
229
+ UNION ALL
230
+ SELECT v FROM (VALUES (3), (1), (2)) AS b(v)
231
+ ORDER BY 1 DESC;
232
+ → [{"v":3},{"v":3},{"v":2},{"v":2},{"v":1},{"v":1}]
233
+
234
+ -- Ordinal over INTERSECT
235
+ SELECT v FROM (VALUES (3), (1), (2)) AS a(v)
236
+ INTERSECT
237
+ SELECT v FROM (VALUES (2), (3)) AS b(v)
238
+ ORDER BY 1;
239
+ → [{"v":2},{"v":3}]
240
+
241
+ -- Ordinal over EXCEPT
242
+ SELECT v FROM (VALUES (3), (1), (2)) AS a(v)
243
+ EXCEPT
244
+ SELECT v FROM (VALUES (2)) AS b(v)
245
+ ORDER BY 1;
246
+ → [{"v":1},{"v":3}]
247
+
248
+ -- Ordinal over DIFF (symmetric difference: (A EXCEPT B) UNION (B EXCEPT A)).
249
+ -- The ordinal resolves over the outer UNION's output column, so positional
250
+ -- ordering works across the structural expansion.
251
+ SELECT v FROM (VALUES (1), (2), (3)) AS a(v)
252
+ DIFF
253
+ SELECT v FROM (VALUES (2), (3), (4)) AS b(v)
254
+ ORDER BY 1 DESC;
255
+ → [{"v":4},{"v":1}]
256
+
257
+ -- Mixed ordinal + column-name keys in one ORDER BY
258
+ SELECT a, b FROM (VALUES (2, 'x'), (1, 'y'), (1, 'a')) AS t(a, b)
259
+ UNION
260
+ SELECT a, b FROM (VALUES (2, 'x'), (1, 'y'), (1, 'a')) AS u(a, b)
261
+ ORDER BY 1, b DESC;
262
+ → [{"a":1,"b":"y"},{"a":1,"b":"a"},{"a":2,"b":"x"}]
263
+
264
+ -- Non-integer expression keeps expression semantics (NOT an ordinal):
265
+ -- `1 + 0` is a constant, so the secondary key `v` decides the order.
266
+ SELECT v FROM (VALUES (3), (1), (2)) AS a(v)
267
+ UNION
268
+ SELECT v FROM (VALUES (3), (1), (2)) AS b(v)
269
+ ORDER BY 1 + 0, v;
270
+ → [{"v":1},{"v":2},{"v":3}]
271
+
272
+ -- Out-of-range ordinal raises the standard prepare-time error
273
+ SELECT v FROM (VALUES (1)) AS a(v)
274
+ UNION
275
+ SELECT v FROM (VALUES (2)) AS b(v)
276
+ ORDER BY 2;
277
+ -- error: ORDER BY position 2 is not in the SELECT list
278
+
279
+ -- Zero ordinal raises the standard prepare-time error
280
+ SELECT v FROM (VALUES (1)) AS a(v)
281
+ UNION
282
+ SELECT v FROM (VALUES (2)) AS b(v)
283
+ ORDER BY 0;
284
+ -- error: ORDER BY position 0 is not in the SELECT list
285
+
286
+ -- ============================================================
287
+ -- SET OPERATIONS: Type preservation
288
+ -- ============================================================
289
+
290
+ -- integer union real: left-side type preserved for matching values;
291
+ -- non-matching values from right side keep their own type
292
+ -- Note: 3.0 has no fractional part, so JS normalizes it to integer
293
+ SELECT typeof(v) AS t, v FROM (
294
+ SELECT v FROM (VALUES (1), (2)) AS a(v)
295
+ UNION
296
+ SELECT v FROM (VALUES (1.0), (3.5)) AS b(v)
297
+ ) AS r
298
+ ORDER BY v;
299
+ → [{"t":"integer","v":1},{"t":"integer","v":2},{"t":"real","v":3.5}]
300
+
301
+ -- ============================================================
302
+ -- SET OPERATIONS: EXCEPT with no overlap (disjoint sets)
303
+ -- ============================================================
304
+
305
+ -- A and B are completely disjoint — EXCEPT should return all of A
306
+ SELECT v FROM (VALUES (1), (2), (3)) AS a(v)
307
+ EXCEPT
308
+ SELECT v FROM (VALUES (4), (5), (6)) AS b(v)
309
+ ORDER BY v;
310
+ → [{"v":1},{"v":2},{"v":3}]
311
+
312
+ -- ============================================================
313
+ -- SET OPERATIONS: DIFF identity properties
314
+ -- ============================================================
315
+
316
+ -- A DIFF A is always empty
317
+ SELECT v FROM (VALUES (1), (2), (3)) AS a(v)
318
+ DIFF
319
+ SELECT v FROM (VALUES (1), (2), (3)) AS b(v);
320
+ → []
321
+
322
+ -- A DIFF empty = A
323
+ SELECT v FROM (VALUES (10), (20)) AS a(v)
324
+ DIFF
325
+ SELECT v FROM (VALUES (99)) AS b(v) WHERE 1=0
326
+ ORDER BY v;
327
+ → [{"v":10},{"v":20}]
328
+
329
+ -- empty DIFF A = A (DIFF is symmetric)
330
+ SELECT v FROM (VALUES (99)) AS a(v) WHERE 1=0
331
+ DIFF
332
+ SELECT v FROM (VALUES (10), (20)) AS b(v)
333
+ ORDER BY v;
334
+ → [{"v":10},{"v":20}]
335
+
336
+ DROP TABLE sose_t;
337
+
338
+ -- ============================================================
339
+ -- SORT: Setup for sort edge cases
340
+ -- ============================================================
341
+
342
+ CREATE TABLE sort_t (id INTEGER PRIMARY KEY, key TEXT, seq INTEGER);
343
+ INSERT INTO sort_t VALUES (1, 'X', 10);
344
+ INSERT INTO sort_t VALUES (2, 'X', 20);
345
+ INSERT INTO sort_t VALUES (3, 'X', 30);
346
+ INSERT INTO sort_t VALUES (4, 'Y', 40);
347
+ INSERT INTO sort_t VALUES (5, 'Y', 50);
348
+ -- run
349
+
350
+ -- ============================================================
351
+ -- SORT: Stability with duplicate keys
352
+ -- ============================================================
353
+
354
+ -- Rows with identical sort key 'X' should retain insertion order (stable sort)
355
+ SELECT id, key FROM sort_t WHERE key = 'X' ORDER BY key;
356
+ → [{"id":1,"key":"X"},{"id":2,"key":"X"},{"id":3,"key":"X"}]
357
+
358
+ -- All rows sorted by key; within same key, insertion order preserved
359
+ SELECT id, key FROM sort_t ORDER BY key;
360
+ → [{"id":1,"key":"X"},{"id":2,"key":"X"},{"id":3,"key":"X"},{"id":4,"key":"Y"},{"id":5,"key":"Y"}]
361
+
362
+ -- ============================================================
363
+ -- SORT: Expression-based ORDER BY with NULLs
364
+ -- ============================================================
365
+
366
+ CREATE TABLE sort_nulls (id INTEGER PRIMARY KEY, x INTEGER NULL);
367
+ INSERT INTO sort_nulls VALUES (1, NULL);
368
+ INSERT INTO sort_nulls VALUES (2, 5);
369
+ INSERT INTO sort_nulls VALUES (3, NULL);
370
+ INSERT INTO sort_nulls VALUES (4, 1);
371
+ INSERT INTO sort_nulls VALUES (5, 10);
372
+ -- run
373
+
374
+ -- ORDER BY coalesce(x, 0) — NULLs become 0 and sort before positive values
375
+ SELECT id, x FROM sort_nulls ORDER BY coalesce(x, 0);
376
+ → [{"id":1,"x":null},{"id":3,"x":null},{"id":4,"x":1},{"id":2,"x":5},{"id":5,"x":10}]
377
+
378
+ -- ORDER BY expression: x IS NULL puts NULLs last (false=0 < true=1)
379
+ SELECT id, x FROM sort_nulls ORDER BY x IS NULL, x;
380
+ → [{"id":4,"x":1},{"id":2,"x":5},{"id":5,"x":10},{"id":1,"x":null},{"id":3,"x":null}]
381
+
382
+ -- ============================================================
383
+ -- SORT: ORDER BY on aliased expressions
384
+ -- ============================================================
385
+
386
+ SELECT x + 10 AS y FROM sort_nulls WHERE x IS NOT NULL ORDER BY y;
387
+ → [{"y":11},{"y":15},{"y":20}]
388
+
389
+ SELECT id, coalesce(x, -1) AS cx FROM sort_nulls ORDER BY cx;
390
+ → [{"id":1,"cx":-1},{"id":3,"cx":-1},{"id":4,"cx":1},{"id":2,"cx":5},{"id":5,"cx":10}]
391
+
392
+ -- ============================================================
393
+ -- SORT: Large multi-column sort with mixed directions and NULLS FIRST/LAST
394
+ -- ============================================================
395
+
396
+ CREATE TABLE sort_multi (
397
+ id INTEGER PRIMARY KEY,
398
+ a INTEGER,
399
+ b TEXT,
400
+ c INTEGER,
401
+ d TEXT,
402
+ e INTEGER NULL
403
+ );
404
+ INSERT INTO sort_multi VALUES (1, 1, 'x', 10, 'p', NULL);
405
+ INSERT INTO sort_multi VALUES (2, 1, 'x', 10, 'q', 5);
406
+ INSERT INTO sort_multi VALUES (3, 1, 'x', 20, 'p', 3);
407
+ INSERT INTO sort_multi VALUES (4, 1, 'y', 10, 'p', 1);
408
+ INSERT INTO sort_multi VALUES (5, 2, 'x', 10, 'p', NULL);
409
+ INSERT INTO sort_multi VALUES (6, 2, 'x', 10, 'p', 2);
410
+ INSERT INTO sort_multi VALUES (7, 2, 'y', 30, 'q', 4);
411
+ INSERT INTO sort_multi VALUES (8, 1, 'x', 10, 'p', 7);
412
+ -- run
413
+
414
+ -- 5-column ORDER BY: a ASC, b DESC, c ASC, d DESC, e ASC NULLS FIRST
415
+ -- a=1,b='y' first; then a=1,b='x': c=10,d='q'(id=2) before c=10,d='p'; NULLs first in e
416
+ SELECT id FROM sort_multi
417
+ ORDER BY a ASC, b DESC, c ASC, d DESC, e ASC NULLS FIRST;
418
+ → [{"id":4},{"id":2},{"id":1},{"id":8},{"id":3},{"id":7},{"id":5},{"id":6}]
419
+
420
+ -- ============================================================
421
+ -- SORT: ORDER BY in subquery vs outer — outer wins
422
+ -- ============================================================
423
+
424
+ -- Inner ORDER BY x DESC, outer ORDER BY id ASC — outer should win
425
+ SELECT id, x FROM (
426
+ SELECT id, x FROM sort_nulls WHERE x IS NOT NULL ORDER BY x DESC
427
+ ) AS sub
428
+ ORDER BY id;
429
+ → [{"id":2,"x":5},{"id":4,"x":1},{"id":5,"x":10}]
430
+
431
+ -- Inner ORDER BY id DESC, outer ORDER BY x ASC — outer should win
432
+ SELECT id, x FROM (
433
+ SELECT id, x FROM sort_nulls WHERE x IS NOT NULL ORDER BY id DESC
434
+ ) AS sub
435
+ ORDER BY x;
436
+ → [{"id":4,"x":1},{"id":2,"x":5},{"id":5,"x":10}]
437
+
438
+ -- ============================================================
439
+ -- Cleanup
440
+ -- ============================================================
441
+
442
+ DROP TABLE sort_t;
443
+ DROP TABLE sort_nulls;
444
+ DROP TABLE sort_multi;
@@ -0,0 +1,143 @@
1
+ -- adapted from SQLite test/select4.test, test/select8.test, test/select9.test,
2
+ -- test/selectA.test, test/limit.test
3
+ -- LIMIT / OFFSET applied to the result of a compound SELECT, plus VALUES
4
+ -- clauses appearing as compound operands and compound queries used as
5
+ -- derived tables.
6
+
7
+ create table c_left (id integer primary key, val text);
8
+ create table c_right (id integer primary key, val text);
9
+ insert into c_left values (1, 'a'), (2, 'b'), (3, 'c');
10
+ insert into c_right values (1, 'a'), (4, 'd'), (5, 'e');
11
+
12
+ -- LIMIT applies to the dedup'd UNION result, not to the final branch alone
13
+ select val from c_left union select val from c_right order by val limit 3;
14
+ → [{"val":"a"},{"val":"b"},{"val":"c"}]
15
+
16
+ -- LIMIT + OFFSET on UNION
17
+ select val from c_left union select val from c_right order by val limit 2 offset 1;
18
+ → [{"val":"b"},{"val":"c"}]
19
+
20
+ -- UNION ALL retains duplicates; LIMIT trims the merged stream
21
+ select val from c_left union all select val from c_right order by val limit 4;
22
+ → [{"val":"a"},{"val":"a"},{"val":"b"},{"val":"c"}]
23
+
24
+ -- UNION ALL with OFFSET past duplicates
25
+ select val from c_left union all select val from c_right order by val limit 100 offset 2;
26
+ → [{"val":"b"},{"val":"c"},{"val":"d"},{"val":"e"}]
27
+
28
+ -- INTERSECT with LIMIT
29
+ select val from c_left intersect select val from c_right limit 1;
30
+ → [{"val":"a"}]
31
+
32
+ -- EXCEPT with LIMIT — left-only values, ordered, capped
33
+ select val from c_left except select val from c_right order by val limit 2;
34
+ → [{"val":"b"},{"val":"c"}]
35
+
36
+ -- LIMIT 0 on a compound — empty result regardless of operands
37
+ select val from c_left union select val from c_right order by val limit 0;
38
+ → []
39
+
40
+ -- Compound + LIMIT in DESC direction
41
+ select val from c_left union select val from c_right order by val desc limit 2;
42
+ → [{"val":"e"},{"val":"d"}]
43
+
44
+ drop table c_right;
45
+ drop table c_left;
46
+
47
+ -- =============================================================================
48
+ -- VALUES clause as compound operand
49
+ -- =============================================================================
50
+
51
+ -- VALUES UNION VALUES — orthogonal QueryExpr surface now accepts bare
52
+ -- VALUES at top-level participating in a compound. Column names are
53
+ -- synthesized (`column_0`, `column_1`); a SELECT FROM (VALUES ...) form
54
+ -- below preserves user-chosen aliases.
55
+ values (1, 'x'), (2, 'y')
56
+ union
57
+ values (2, 'y'), (3, 'z')
58
+ order by column_0;
59
+ → [{"column_0":1,"column_1":"x"},{"column_0":2,"column_1":"y"},{"column_0":3,"column_1":"z"}]
60
+
61
+ -- Equivalent expressed via SELECT-FROM-VALUES wrapping with explicit aliases
62
+ select c1, c2 from (values (1, 'x'), (2, 'y')) as v(c1, c2)
63
+ union
64
+ select c1, c2 from (values (2, 'y'), (3, 'z')) as v(c1, c2)
65
+ order by c1;
66
+ → [{"c1":1,"c2":"x"},{"c1":2,"c2":"y"},{"c1":3,"c2":"z"}]
67
+
68
+ -- VALUES INTERSECT VALUES (wrapped form)
69
+ select c1 from (values (1), (2), (3)) as v(c1)
70
+ intersect
71
+ select c1 from (values (2), (4), (5)) as v(c1);
72
+ → [{"c1":2}]
73
+
74
+ -- VALUES EXCEPT VALUES (wrapped form)
75
+ select c1 from (values (1), (2), (3)) as v(c1)
76
+ except
77
+ select c1 from (values (2)) as v(c1)
78
+ order by c1;
79
+ → [{"c1":1},{"c1":3}]
80
+
81
+ -- Mixed: SELECT UNION VALUES (wrapped form)
82
+ create table v_t (id integer primary key, val integer);
83
+ insert into v_t values (1, 10), (2, 20);
84
+
85
+ select val from v_t
86
+ union
87
+ select c1 as val from (values (30), (10)) as v(c1)
88
+ order by val;
89
+ → [{"val":10},{"val":20},{"val":30}]
90
+
91
+ drop table v_t;
92
+
93
+ -- =============================================================================
94
+ -- Compound SELECT used as derived table; outer WHERE / DISTINCT / GROUP BY apply
95
+ -- =============================================================================
96
+
97
+ create table dt_a (id integer primary key, k integer);
98
+ create table dt_b (id integer primary key, k integer);
99
+ insert into dt_a values (1, 10), (2, 20), (3, 30);
100
+ insert into dt_b values (4, 20), (5, 30), (6, 40);
101
+
102
+ -- UNION ALL inside FROM clause; outer WHERE filters the merged stream
103
+ select k from (
104
+ select k from dt_a
105
+ union all
106
+ select k from dt_b
107
+ ) sub
108
+ where k >= 20
109
+ order by k;
110
+ → [{"k":20},{"k":20},{"k":30},{"k":30},{"k":40}]
111
+
112
+ -- DISTINCT applied to the compound result via the outer SELECT
113
+ select distinct k from (
114
+ select k from dt_a
115
+ union all
116
+ select k from dt_b
117
+ ) sub
118
+ order by k;
119
+ → [{"k":10},{"k":20},{"k":30},{"k":40}]
120
+
121
+ -- GROUP BY + COUNT(*) over compound merge
122
+ select k, count(*) as cnt from (
123
+ select k from dt_a
124
+ union all
125
+ select k from dt_b
126
+ ) sub
127
+ group by k
128
+ order by k;
129
+ → [{"k":10,"cnt":1},{"k":20,"cnt":2},{"k":30,"cnt":2},{"k":40,"cnt":1}]
130
+
131
+ -- LIMIT inside derived table is independent of the outer ORDER BY
132
+ select k from (
133
+ select k from dt_a
134
+ union all
135
+ select k from dt_b
136
+ order by k
137
+ limit 3
138
+ ) sub
139
+ order by k;
140
+ → [{"k":10},{"k":20},{"k":20}]
141
+
142
+ drop table dt_b;
143
+ drop table dt_a;