@quereus/quereus 4.20.1 → 4.20.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (380) hide show
  1. package/README.md +2 -0
  2. package/dist/src/schema/schema-differ.d.ts.map +1 -1
  3. package/dist/src/schema/schema-differ.js +17 -69
  4. package/dist/src/schema/schema-differ.js.map +1 -1
  5. package/package.json +7 -4
  6. package/test/README.md +173 -0
  7. package/test/logic/01-basic.sqllogic +39 -0
  8. package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
  9. package/test/logic/01.2-strings.sqllogic +43 -0
  10. package/test/logic/01.5-insert-select.sqllogic +237 -0
  11. package/test/logic/01.6-update-extras.sqllogic +118 -0
  12. package/test/logic/01.7-update-from.sqllogic +67 -0
  13. package/test/logic/01.8-delete-extras.sqllogic +122 -0
  14. package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
  15. package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
  16. package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
  17. package/test/logic/01.9-query-expr-values.sqllogic +111 -0
  18. package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
  19. package/test/logic/02-filters.sqllogic +54 -0
  20. package/test/logic/02-smoke.sqllogic +62 -0
  21. package/test/logic/02.1-bind-parameters.sqllogic +223 -0
  22. package/test/logic/03-expressions.sqllogic +190 -0
  23. package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
  24. package/test/logic/03.4-defaults.sqllogic +554 -0
  25. package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
  26. package/test/logic/03.5-tvf.sqllogic +61 -0
  27. package/test/logic/03.6-type-system.sqllogic +544 -0
  28. package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
  29. package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
  30. package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
  31. package/test/logic/03.8-not-precedence.sqllogic +255 -0
  32. package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
  33. package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
  34. package/test/logic/04-order-by.sqllogic +38 -0
  35. package/test/logic/04-transactions.sqllogic +239 -0
  36. package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
  37. package/test/logic/05-vtab_memory.sqllogic +50 -0
  38. package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
  39. package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
  40. package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
  41. package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
  42. package/test/logic/06-builtin_functions.sqllogic +149 -0
  43. package/test/logic/06.1-string-functions.sqllogic +92 -0
  44. package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
  45. package/test/logic/06.2-math-functions.sqllogic +82 -0
  46. package/test/logic/06.3-schema.sqllogic +48 -0
  47. package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
  48. package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
  49. package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
  50. package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
  51. package/test/logic/06.3.4-view-info.sqllogic +378 -0
  52. package/test/logic/06.3.5-column-info.sqllogic +347 -0
  53. package/test/logic/06.3.6-schema-views.sqllogic +29 -0
  54. package/test/logic/06.4-schema-search-path.sqllogic +354 -0
  55. package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
  56. package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
  57. package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
  58. package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
  59. package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
  60. package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
  61. package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
  62. package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
  63. package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
  64. package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
  65. package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
  66. package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
  67. package/test/logic/06.7-json-extended.sqllogic +53 -0
  68. package/test/logic/06.8-json-path-operators.sqllogic +99 -0
  69. package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
  70. package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
  71. package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
  72. package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
  73. package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
  74. package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
  75. package/test/logic/07-aggregates.sqllogic +193 -0
  76. package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
  77. package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
  78. package/test/logic/07.3-group-by-extras.sqllogic +602 -0
  79. package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
  80. package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
  81. package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
  82. package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
  83. package/test/logic/07.5-window.sqllogic +1941 -0
  84. package/test/logic/07.5.1-window-named.sqllogic +13 -0
  85. package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
  86. package/test/logic/07.6-subqueries.sqllogic +78 -0
  87. package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
  88. package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
  89. package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
  90. package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
  91. package/test/logic/07.7.1-in-extras.sqllogic +158 -0
  92. package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
  93. package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
  94. package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
  95. package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
  96. package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
  97. package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
  98. package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
  99. package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
  100. package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
  101. package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
  102. package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
  103. package/test/logic/07.9-in-value-list.sqllogic +154 -0
  104. package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
  105. package/test/logic/08-views.sqllogic +64 -0
  106. package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
  107. package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
  108. package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
  109. package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
  110. package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
  111. package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
  112. package/test/logic/09-set_operations.sqllogic +244 -0
  113. package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
  114. package/test/logic/10-distinct_datatypes.sqllogic +127 -0
  115. package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
  116. package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
  117. package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
  118. package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
  119. package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
  120. package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
  121. package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
  122. package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
  123. package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
  124. package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
  125. package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
  126. package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
  127. package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
  128. package/test/logic/10.2-column-features.sqllogic +365 -0
  129. package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
  130. package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
  131. package/test/logic/10.3-function-features.sqllogic +247 -0
  132. package/test/logic/10.4-schema-scale.sqllogic +168 -0
  133. package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
  134. package/test/logic/10.5-indexes.sqllogic +164 -0
  135. package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
  136. package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
  137. package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
  138. package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
  139. package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
  140. package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
  141. package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
  142. package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
  143. package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
  144. package/test/logic/100.1-where-extras.sqllogic +163 -0
  145. package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
  146. package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
  147. package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
  148. package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
  149. package/test/logic/102-unique-constraints.sqllogic +145 -0
  150. package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
  151. package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
  152. package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
  153. package/test/logic/102.2-unique-collation.sqllogic +181 -0
  154. package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
  155. package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
  156. package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
  157. package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
  158. package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
  159. package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
  160. package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
  161. package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
  162. package/test/logic/108-cardinality-estimation.sqllogic +146 -0
  163. package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
  164. package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
  165. package/test/logic/11-joins.sqllogic +86 -0
  166. package/test/logic/11.1-join-using.sqllogic +267 -0
  167. package/test/logic/11.2-comma-join.sqllogic +35 -0
  168. package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
  169. package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
  170. package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
  171. package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
  172. package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
  173. package/test/logic/12-empty-primary-key.sqllogic +124 -0
  174. package/test/logic/12-join_padding_order.sqllogic +58 -0
  175. package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
  176. package/test/logic/13-cte.sqllogic +137 -0
  177. package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
  178. package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
  179. package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
  180. package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
  181. package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
  182. package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
  183. package/test/logic/13.4-cte-extras.sqllogic +98 -0
  184. package/test/logic/13.5-cte-join-order.sqllogic +166 -0
  185. package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
  186. package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
  187. package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
  188. package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
  189. package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
  190. package/test/logic/14-utilities.sqllogic +168 -0
  191. package/test/logic/15-timespan.sqllogic +279 -0
  192. package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
  193. package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
  194. package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
  195. package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
  196. package/test/logic/16-epoch.sqllogic +187 -0
  197. package/test/logic/17-weekday-modifier.sqllogic +78 -0
  198. package/test/logic/18-json-string-escapes.sqllogic +86 -0
  199. package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
  200. package/test/logic/20-empty-single-row.sqllogic +261 -0
  201. package/test/logic/21-null-edge-cases.sqllogic +227 -0
  202. package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
  203. package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
  204. package/test/logic/21.2-between-edges.sqllogic +157 -0
  205. package/test/logic/22-boundary-values.sqllogic +175 -0
  206. package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
  207. package/test/logic/24-builtin-branches.sqllogic +611 -0
  208. package/test/logic/24.1-substr-extras.sqllogic +75 -0
  209. package/test/logic/24.2-random-extras.sqllogic +39 -0
  210. package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
  211. package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
  212. package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
  213. package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
  214. package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
  215. package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
  216. package/test/logic/26-join-edge-cases.sqllogic +333 -0
  217. package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
  218. package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
  219. package/test/logic/26.3-join-on-constants.sqllogic +61 -0
  220. package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
  221. package/test/logic/27-window-edge-cases.sqllogic +206 -0
  222. package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
  223. package/test/logic/27.2-window-exclude.sqllogic +13 -0
  224. package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
  225. package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
  226. package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
  227. package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
  228. package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
  229. package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
  230. package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
  231. package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
  232. package/test/logic/40-constraints.sqllogic +418 -0
  233. package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
  234. package/test/logic/40.2-check-extras.sqllogic +683 -0
  235. package/test/logic/41-alter-table.sqllogic +191 -0
  236. package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
  237. package/test/logic/41-fk-cross-schema.sqllogic +155 -0
  238. package/test/logic/41-fk-extended-targets.sqllogic +173 -0
  239. package/test/logic/41-foreign-keys.sqllogic +1001 -0
  240. package/test/logic/41-generated-column-errors.sqllogic +225 -0
  241. package/test/logic/41-generated-column-extras.sqllogic +598 -0
  242. package/test/logic/41-generated-column-scope.sqllogic +329 -0
  243. package/test/logic/41-generated-columns.sqllogic +361 -0
  244. package/test/logic/41.1-alter-pk.sqllogic +230 -0
  245. package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
  246. package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
  247. package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
  248. package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
  249. package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
  250. package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
  251. package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
  252. package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
  253. package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
  254. package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
  255. package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
  256. package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
  257. package/test/logic/41.2-alter-column.sqllogic +382 -0
  258. package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
  259. package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
  260. package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
  261. package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
  262. package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
  263. package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
  264. package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
  265. package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
  266. package/test/logic/41.5-alter-misc.sqllogic +48 -0
  267. package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
  268. package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
  269. package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
  270. package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
  271. package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
  272. package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
  273. package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
  274. package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
  275. package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
  276. package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
  277. package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
  278. package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
  279. package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
  280. package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
  281. package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
  282. package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
  283. package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
  284. package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
  285. package/test/logic/42-committed-snapshot.sqllogic +254 -0
  286. package/test/logic/42-returning.sqllogic +159 -0
  287. package/test/logic/42.1-returning-extras.sqllogic +232 -0
  288. package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
  289. package/test/logic/43-default-nullability.sqllogic +131 -0
  290. package/test/logic/43-transition-constraints.sqllogic +341 -0
  291. package/test/logic/43.1-default-collation.sqllogic +140 -0
  292. package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
  293. package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
  294. package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
  295. package/test/logic/44-determinism-validation.sqllogic +164 -0
  296. package/test/logic/44-orthogonality.sqllogic +146 -0
  297. package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
  298. package/test/logic/45-udf-determinism.sqllogic +39 -0
  299. package/test/logic/46-mutation-context.sqllogic +595 -0
  300. package/test/logic/47-upsert.sqllogic +255 -0
  301. package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
  302. package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
  303. package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
  304. package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
  305. package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
  306. package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
  307. package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
  308. package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
  309. package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
  310. package/test/logic/49-reference-graph.sqllogic +84 -0
  311. package/test/logic/50-declarative-schema.sqllogic +2550 -0
  312. package/test/logic/50-metadata-tags.sqllogic +1033 -0
  313. package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
  314. package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
  315. package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
  316. package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +210 -0
  317. package/test/logic/50.3-declare-schema-duplicate-names.sqllogic +280 -0
  318. package/test/logic/50.4-declare-schema-apply-restore.sqllogic +192 -0
  319. package/test/logic/51-lens-foundation.sqllogic +147 -0
  320. package/test/logic/51-materialized-views.sqllogic +376 -0
  321. package/test/logic/51.5-materialized-views-coarsened-key.sqllogic +198 -0
  322. package/test/logic/51.7-maintained-table-attach-detach.sqllogic +468 -0
  323. package/test/logic/51.8-maintained-table-declared-constraints.sqllogic +440 -0
  324. package/test/logic/51.85-maintained-table-parent-fk.sqllogic +103 -0
  325. package/test/logic/51.9-maintained-table-secondary-unique.sqllogic +237 -0
  326. package/test/logic/51.9.1-maintained-table-partial-unique.sqllogic +36 -0
  327. package/test/logic/52-lens-overrides.sqllogic +566 -0
  328. package/test/logic/53-materialized-views-rowtime.sqllogic +1601 -0
  329. package/test/logic/53-reserved-tags.sqllogic +252 -0
  330. package/test/logic/53.1-materialized-view-write-through.sqllogic +329 -0
  331. package/test/logic/53.2-materialized-view-rename-propagation.sqllogic +483 -0
  332. package/test/logic/53.3-materialized-view-constraint-only-ddl.sqllogic +409 -0
  333. package/test/logic/53.3.1-materialized-view-index-ddl-irrelevance.sqllogic +29 -0
  334. package/test/logic/53.4-materialized-view-structural-alter-restore.sqllogic +436 -0
  335. package/test/logic/54-covering-mv-enforcement.sqllogic +314 -0
  336. package/test/logic/54.1-covering-mv-partial-enforcement.sqllogic +34 -0
  337. package/test/logic/55-internal-eviction-reporting.sqllogic +89 -0
  338. package/test/logic/55-lens-prover.sqllogic +202 -0
  339. package/test/logic/55.1-eviction-restrict-fk.sqllogic +148 -0
  340. package/test/logic/55.5-lens-authored-inverse.sqllogic +1468 -0
  341. package/test/logic/80-grow-retrieve-pass.sqllogic +79 -0
  342. package/test/logic/81-quickpick.sqllogic +24 -0
  343. package/test/logic/82-bloom-join.sqllogic +185 -0
  344. package/test/logic/83-merge-join.sqllogic +280 -0
  345. package/test/logic/84-asof-scan.sqllogic +238 -0
  346. package/test/logic/84-key-cardinality.sqllogic +50 -0
  347. package/test/logic/85-relational-const-folding.sqllogic +51 -0
  348. package/test/logic/86-scalar-cse.sqllogic +42 -0
  349. package/test/logic/90-error_paths.sqllogic +114 -0
  350. package/test/logic/90.1-parse-errors.sqllogic +77 -0
  351. package/test/logic/90.2-alter-table-errors.sqllogic +53 -0
  352. package/test/logic/90.2.1-alter-extra-errors.sqllogic +51 -0
  353. package/test/logic/90.3-expression-errors.sqllogic +43 -0
  354. package/test/logic/90.4-dml-errors.sqllogic +47 -0
  355. package/test/logic/90.5-unsupported-join-types.sqllogic +37 -0
  356. package/test/logic/90.5.1-right-full-join-read.sqllogic +157 -0
  357. package/test/logic/90.6-select-error-paths.sqllogic +57 -0
  358. package/test/logic/91-merge-join-edge-cases.sqllogic +159 -0
  359. package/test/logic/92-hash-aggregate-edge-cases.sqllogic +139 -0
  360. package/test/logic/93-ddl-view-edge-cases.sqllogic +104 -0
  361. package/test/logic/93.1-view-error-paths.sqllogic +74 -0
  362. package/test/logic/93.2-view-mutation-pending.sqllogic +108 -0
  363. package/test/logic/93.3-view-mutation-or-clause.sqllogic +60 -0
  364. package/test/logic/93.4-view-mutation.sqllogic +4881 -0
  365. package/test/logic/93.4.1-view-mutation-partial-unique-cardinality.sqllogic +31 -0
  366. package/test/logic/93.5-authored-inverse.sqllogic +415 -0
  367. package/test/logic/93.6-set-op-flagless-write.sqllogic +862 -0
  368. package/test/logic/94-tvf-edge-cases.sqllogic +58 -0
  369. package/test/logic/94.1-limit-offset-edge-cases.sqllogic +109 -0
  370. package/test/logic/94.2-limit-offset-extras.sqllogic +98 -0
  371. package/test/logic/95-assertions.sqllogic +1417 -0
  372. package/test/logic/96-subquery-edge-cases.sqllogic +276 -0
  373. package/test/logic/97-json-function-edge-cases.sqllogic +633 -0
  374. package/test/logic/97.1-json-blob-and-special-values.sqllogic +92 -0
  375. package/test/logic/98-temporal-edge-cases.sqllogic +515 -0
  376. package/test/logic/99-conversion-edge-cases.sqllogic +325 -0
  377. package/test/logic/99.0.1-schema-index-listing.sqllogic +21 -0
  378. package/test/logic/99.1-cast-syntax-extras.sqllogic +167 -0
  379. package/test/logic/drop-unique-index.sqllogic +88 -0
  380. package/test/logic/pushdown-test.sqllogic +36 -0
@@ -0,0 +1,119 @@
1
+ -- adapted from SQLite test/distinct.test, test/distinct2.test, test/select1.test
2
+ -- DISTINCT edge cases not covered in 10-distinct_datatypes: select-all
3
+ -- wildcards, joins, recursive CTEs, reordered SELECT lists, and explicit
4
+ -- COLLATE in the projection.
5
+
6
+ create table dt (id integer primary key, grp text, val integer);
7
+ insert into dt values
8
+ (1, 'A', 100),
9
+ (2, 'A', 100),
10
+ (3, 'B', 200),
11
+ (4, 'A', 100);
12
+
13
+ -- DISTINCT * — full row deduplication
14
+ select distinct * from dt order by id;
15
+ → [{"id":1,"grp":"A","val":100},{"id":2,"grp":"A","val":100},{"id":3,"grp":"B","val":200},{"id":4,"grp":"A","val":100}]
16
+
17
+ -- DISTINCT * after dropping the unique key — duplicate rows collapse
18
+ select distinct grp, val from dt order by grp, val;
19
+ → [{"grp":"A","val":100},{"grp":"B","val":200}]
20
+
21
+ -- DISTINCT with WHERE filter
22
+ select distinct * from dt where grp = 'A' order by id;
23
+ → [{"id":1,"grp":"A","val":100},{"id":2,"grp":"A","val":100},{"id":4,"grp":"A","val":100}]
24
+
25
+ -- DISTINCT preserves dedup regardless of SELECT-list order
26
+ select distinct val, grp from dt order by val, grp;
27
+ → [{"val":100,"grp":"A"},{"val":200,"grp":"B"}]
28
+
29
+ drop table dt;
30
+
31
+ -- =============================================================================
32
+ -- DISTINCT across CROSS JOIN — Cartesian product then dedup
33
+ -- =============================================================================
34
+
35
+ create table cj_a (id integer primary key, x integer);
36
+ create table cj_b (id integer primary key, y integer);
37
+ insert into cj_a values (1, 1), (2, 2);
38
+ insert into cj_b values (1, 10), (2, 20), (3, 10);
39
+
40
+ select distinct cj_a.x, cj_b.y
41
+ from cj_a cross join cj_b
42
+ order by cj_a.x, cj_b.y;
43
+ → [{"x":1,"y":10},{"x":1,"y":20},{"x":2,"y":10},{"x":2,"y":20}]
44
+
45
+ drop table cj_b;
46
+ drop table cj_a;
47
+
48
+ -- =============================================================================
49
+ -- DISTINCT across LEFT JOIN — NULL-padded rows participate in dedup
50
+ -- =============================================================================
51
+
52
+ create table lj_l (id integer primary key, cat text);
53
+ create table lj_r (id integer primary key, lj_l_id integer, tag text);
54
+ insert into lj_l values (1, 'A'), (2, 'B'), (3, 'A');
55
+ insert into lj_r values (10, 1, 'x'), (20, 2, 'y');
56
+
57
+ -- DISTINCT on the parent column: LEFT JOIN's NULL-padded right side doesn't
58
+ -- duplicate the parent — categories collapse to A, B.
59
+ select distinct lj_l.cat
60
+ from lj_l left join lj_r on lj_l.id = lj_r.lj_l_id
61
+ order by lj_l.cat;
62
+ → [{"cat":"A"},{"cat":"B"}]
63
+
64
+ -- DISTINCT including the joined column — NULL appears once for unmatched parent (lj_l.id=3)
65
+ select distinct lj_l.cat, lj_r.tag
66
+ from lj_l left join lj_r on lj_l.id = lj_r.lj_l_id
67
+ order by lj_l.cat, lj_r.tag;
68
+ → [{"cat":"A","tag":null},{"cat":"A","tag":"x"},{"cat":"B","tag":"y"}]
69
+
70
+ drop table lj_r;
71
+ drop table lj_l;
72
+
73
+ -- =============================================================================
74
+ -- DISTINCT inside a recursive CTE
75
+ -- =============================================================================
76
+
77
+ with recursive cnt(n) as (
78
+ select 1
79
+ union all
80
+ select n + 1 from cnt where n < 4
81
+ )
82
+ select distinct n from cnt order by n;
83
+ → [{"n":1},{"n":2},{"n":3},{"n":4}]
84
+
85
+ -- DISTINCT applied to the body of a non-recursive CTE that emits dups
86
+ with src(v) as (
87
+ select 1 union all select 2 union all select 1 union all select 3 union all select 2
88
+ )
89
+ select distinct v from src order by v;
90
+ → [{"v":1},{"v":2},{"v":3}]
91
+
92
+ -- =============================================================================
93
+ -- DISTINCT with explicit COLLATE in the projection
94
+ -- =============================================================================
95
+
96
+ create table cs (id integer primary key, name text);
97
+ insert into cs values (1, 'Bob'), (2, 'bob'), (3, 'Alice'), (4, 'BOB');
98
+
99
+ -- COLLATE BINARY (default) keeps case-distinct values
100
+ select distinct name from cs order by name;
101
+ → [{"name":"Alice"},{"name":"BOB"},{"name":"Bob"},{"name":"bob"}]
102
+
103
+ -- COLLATE NOCASE in the projection collapses case-equivalent strings
104
+ select distinct name collate nocase as name from cs order by name collate nocase;
105
+ → [{"name":"Alice"},{"name":"Bob"}]
106
+
107
+ drop table cs;
108
+
109
+ -- =============================================================================
110
+ -- DISTINCT with duplicate column reference — same column projected twice
111
+ -- =============================================================================
112
+
113
+ create table dc (id integer primary key, x integer);
114
+ insert into dc values (1, 100), (2, 100), (3, 200);
115
+
116
+ select distinct x, x from dc order by x;
117
+ → [{"x":100,"x:1":100},{"x":200,"x:1":200}]
118
+
119
+ drop table dc;
@@ -0,0 +1,238 @@
1
+ -- predicate-normalization-edge-cases.sqllogic
2
+ -- Tests for predicate normalization: De Morgan, double/triple negation,
3
+ -- NOT on comparisons, OR flattening, OR-to-IN collapse, BETWEEN, IS NULL, etc.
4
+
5
+ -- =============================================================================
6
+ -- Setup
7
+ -- =============================================================================
8
+
9
+ create table norm (id integer primary key, a integer null, b integer null, c text null);
10
+ insert into norm values (1, 10, 100, 'alpha'), (2, 20, 200, 'beta'), (3, 30, 300, null), (4, null, 400, 'delta'), (5, 50, null, 'epsilon');
11
+
12
+ -- =============================================================================
13
+ -- De Morgan's laws
14
+ -- =============================================================================
15
+
16
+ -- De Morgan with AND: NOT (a > 10 AND b > 200) → a <= 10 OR b <= 200
17
+ -- id=1: not(false and false)=true; id=2: not(true and false)=true;
18
+ -- id=3: not(true and true)=false; id=4: not(null and true)=not(null)=null; id=5: not(true and null)=not(null)=null
19
+ select id from norm where not (a > 10 and b > 200) order by id;
20
+ → [{"id":1},{"id":2}]
21
+
22
+ -- De Morgan with OR: NOT (a = 10 OR a = 20) → a != 10 AND a != 20
23
+ -- id=3: a=30 passes; id=5: a=50 passes; id=4: a=null → null
24
+ select id from norm where not (a = 10 or a = 20) order by id;
25
+ → [{"id":3},{"id":5}]
26
+
27
+ -- =============================================================================
28
+ -- Double and triple negation
29
+ -- =============================================================================
30
+
31
+ -- Double negation: NOT NOT (a > 20) → a > 20
32
+ select id from norm where not not (a > 20) order by id;
33
+ → [{"id":3},{"id":5}]
34
+
35
+ -- Triple negation: NOT NOT NOT (a > 20) → NOT (a > 20) → a <= 20
36
+ select id from norm where not not not (a > 20) order by id;
37
+ → [{"id":1},{"id":2}]
38
+
39
+ -- =============================================================================
40
+ -- NOT on comparison operators
41
+ -- =============================================================================
42
+
43
+ -- NOT (a > 20) → a <= 20
44
+ select id from norm where not (a > 20) order by id;
45
+ → [{"id":1},{"id":2}]
46
+
47
+ -- NOT (a >= 20) → a < 20
48
+ select id from norm where not (a >= 20) order by id;
49
+ → [{"id":1}]
50
+
51
+ -- NOT (a < 30) → a >= 30
52
+ select id from norm where not (a < 30) order by id;
53
+ → [{"id":3},{"id":5}]
54
+
55
+ -- NOT (a <= 20) → a > 20
56
+ select id from norm where not (a <= 20) order by id;
57
+ → [{"id":3},{"id":5}]
58
+
59
+ -- =============================================================================
60
+ -- OR flattening and OR-to-IN collapse
61
+ -- =============================================================================
62
+
63
+ -- OR flattening: nested OR groups flatten into a single OR
64
+ select id from norm where (a = 10 or a = 20) or a = 30 order by id;
65
+ → [{"id":1},{"id":2},{"id":3}]
66
+
67
+ -- OR-to-IN collapse: a = 10 OR a = 20 OR a = 30 → a IN (10,20,30)
68
+ select id from norm where a = 10 or a = 20 or a = 30 order by id;
69
+ → [{"id":1},{"id":2},{"id":3}]
70
+
71
+ -- =============================================================================
72
+ -- BETWEEN and NOT BETWEEN
73
+ -- =============================================================================
74
+
75
+ -- BETWEEN: a between 20 and 30 → a >= 20 AND a <= 30
76
+ select id from norm where a between 20 and 30 order by id;
77
+ → [{"id":2},{"id":3}]
78
+
79
+ -- NOT BETWEEN: not (a between 20 and 40) → a < 20 OR a > 40
80
+ -- id=1: a=10 outside; id=5: a=50 outside; id=4: a=null → null
81
+ select id from norm where not (a between 20 and 40) order by id;
82
+ → [{"id":1},{"id":5}]
83
+
84
+ -- =============================================================================
85
+ -- NOT on IS NULL / IS NOT NULL
86
+ -- =============================================================================
87
+
88
+ -- NOT IS NULL → IS NOT NULL
89
+ select id from norm where not (c is null) order by id;
90
+ → [{"id":1},{"id":2},{"id":4},{"id":5}]
91
+
92
+ -- NOT IS NOT NULL → IS NULL
93
+ select id from norm where not (c is not null) order by id;
94
+ → [{"id":3}]
95
+
96
+ -- =============================================================================
97
+ -- Complex nested predicates
98
+ -- =============================================================================
99
+
100
+ -- NOT ((a > 10 AND b < 300) OR c IS NULL)
101
+ -- id=1: not((false and true) or false) = not(false) = true
102
+ -- id=2: not((true and true) or false) = not(true) = false
103
+ -- id=3: not((true and false) or true) = not(true) = false
104
+ -- id=4: not((null and false) or false) = not(false) = true
105
+ -- id=5: not((true and null) or false) = not(null) = null
106
+ select id from norm where not ((a > 10 and b < 300) or c is null) order by id;
107
+ → [{"id":1},{"id":4}]
108
+
109
+ -- Mixed NOT with AND/OR: NOT (a = 10) AND NOT (b = 200)
110
+ -- Only id=3 passes (a=30≠10, b=300≠200); id=4 and id=5 have NULLs
111
+ select id from norm where not (a = 10) and not (b = 200) order by id;
112
+ → [{"id":3}]
113
+
114
+ -- =============================================================================
115
+ -- Reversed operand order
116
+ -- =============================================================================
117
+
118
+ -- OR with reversed operands: literal = column pattern
119
+ select id from norm where 10 = a or 20 = a order by id;
120
+ → [{"id":1},{"id":2}]
121
+
122
+ -- =============================================================================
123
+ -- Deeply nested AND flattening
124
+ -- =============================================================================
125
+
126
+ -- Nested AND: a > 5 AND (b > 50 AND (a < 100 AND b < 500)) flattens to four ANDs
127
+ -- id=1: all true; id=2: all true; id=3: all true; id=4: a=null; id=5: b=null
128
+ select id from norm where a > 5 and (b > 50 and (a < 100 and b < 500)) order by id;
129
+ → [{"id":1},{"id":2},{"id":3}]
130
+
131
+ -- =============================================================================
132
+ -- OR-to-IN with mixed operand order (lit=col and col=lit)
133
+ -- =============================================================================
134
+
135
+ -- Mixed literal=column and column=literal patterns should all resolve correctly
136
+ -- id=1: 10=a true; id=2: a=20 true; id=3: 30=a true
137
+ select id from norm where 10 = a or a = 20 or 30 = a order by id;
138
+ → [{"id":1},{"id":2},{"id":3}]
139
+
140
+ -- =============================================================================
141
+ -- OR-to-IN with different columns should NOT collapse
142
+ -- =============================================================================
143
+
144
+ -- Different columns in OR disjuncts: no IN collapse, but correct results
145
+ -- id=1: a=10 true; id=2: b=200 true; others: a≠10 and b≠200 or null
146
+ select id from norm where a = 10 or b = 200 order by id;
147
+ → [{"id":1},{"id":2}]
148
+
149
+ -- =============================================================================
150
+ -- OR-to-IN with non-equality operators
151
+ -- =============================================================================
152
+
153
+ -- Non-equality (>) should not trigger IN collapse
154
+ -- id=2: a=20>10; id=3: a=30>10; id=5: a=50>10; id=4: a=null
155
+ select id from norm where a > 10 or a > 20 order by id;
156
+ → [{"id":2},{"id":3},{"id":5}]
157
+
158
+ -- =============================================================================
159
+ -- OR-to-IN with non-binary disjunct (BETWEEN)
160
+ -- =============================================================================
161
+
162
+ -- BETWEEN is not a BinaryOp; should not trigger IN collapse
163
+ -- id=1: a=10 true; id=2: a=20 in [20,30]; id=3: a=30 in [20,30]
164
+ select id from norm where a = 10 or a between 20 and 30 order by id;
165
+ → [{"id":1},{"id":2},{"id":3}]
166
+
167
+ -- =============================================================================
168
+ -- Deeply nested OR flattening (4-level)
169
+ -- =============================================================================
170
+
171
+ -- Four nested ORs: ((a=10 OR a=20) OR (a=30 OR a=50)) flattens completely
172
+ select id from norm where ((a = 10 or a = 20) or (a = 30 or a = 50)) order by id;
173
+ → [{"id":1},{"id":2},{"id":3},{"id":5}]
174
+
175
+ -- =============================================================================
176
+ -- NOT over IS NOT NULL
177
+ -- =============================================================================
178
+
179
+ -- NOT (a IS NOT NULL) should behave like IS NULL
180
+ -- id=4: a=null
181
+ select id from norm where not (a is not null) order by id;
182
+ → [{"id":4}]
183
+
184
+ -- NOT (b IS NOT NULL) should behave like IS NULL
185
+ -- id=5: b=null
186
+ select id from norm where not (b is not null) order by id;
187
+ → [{"id":5}]
188
+
189
+ -- =============================================================================
190
+ -- NOT over non-invertible binary (LIKE)
191
+ -- =============================================================================
192
+
193
+ -- NOT (c LIKE 'alpha') should negate the LIKE result
194
+ -- id=2: beta≠alpha; id=3: null→null; id=4: delta≠alpha; id=5: epsilon≠alpha
195
+ select id from norm where not (c like 'alpha') order by id;
196
+ → [{"id":2},{"id":4},{"id":5}]
197
+
198
+ -- =============================================================================
199
+ -- OR-to-IN boundary: 33 disjuncts (exceeds 32 limit)
200
+ -- =============================================================================
201
+
202
+ -- 33 disjuncts should not collapse to IN but still return correct results
203
+ -- Only a=10 (id=1), a=20 (id=2), a=30 (id=3), a=50 (id=5) match from our data
204
+ select id from norm where a=1 or a=2 or a=3 or a=4 or a=5 or a=6 or a=7 or a=8 or a=9 or a=10 or a=11 or a=12 or a=13 or a=14 or a=15 or a=16 or a=17 or a=18 or a=19 or a=20 or a=21 or a=22 or a=23 or a=24 or a=25 or a=26 or a=27 or a=28 or a=29 or a=30 or a=31 or a=32 or a=33 order by id;
205
+ → [{"id":1},{"id":2},{"id":3}]
206
+
207
+ -- =============================================================================
208
+ -- NOT BETWEEN double toggle
209
+ -- =============================================================================
210
+
211
+ -- NOT NOT BETWEEN: double NOT on BETWEEN should cancel out
212
+ -- Equivalent to a BETWEEN 20 AND 30
213
+ select id from norm where not not (a between 20 and 30) order by id;
214
+ → [{"id":2},{"id":3}]
215
+
216
+ -- =============================================================================
217
+ -- De Morgan with nested OR-to-IN
218
+ -- =============================================================================
219
+
220
+ -- NOT (a = 10 AND b = 100): De Morgan → a != 10 OR b != 100
221
+ -- id=1: a=10,b=100 → false; id=2: a≠10 → true; id=3: a≠10 → true; id=4: b≠100 → true; id=5: a≠10 → true
222
+ select id from norm where not (a = 10 and b = 100) order by id;
223
+ → [{"id":2},{"id":3},{"id":4},{"id":5}]
224
+
225
+ -- =============================================================================
226
+ -- Mixed operand order with more values
227
+ -- =============================================================================
228
+
229
+ -- Alternating lit=col and col=lit patterns
230
+ -- id=1: 10=a; id=2: a=20; id=5: 50=a
231
+ select id from norm where 10 = a or a = 20 or 50 = a order by id;
232
+ → [{"id":1},{"id":2},{"id":5}]
233
+
234
+ -- =============================================================================
235
+ -- Cleanup
236
+ -- =============================================================================
237
+
238
+ drop table norm;
@@ -0,0 +1,163 @@
1
+ -- where-extras.sqllogic - WHERE-clause shapes not exercised by 100-predicate-normalization
2
+ -- Distilled from SQLite test/where.test, where4.test, where7.test, where8.test, where9.test
3
+
4
+ create table we (id integer primary key, a integer null, b integer null, c integer null);
5
+ insert into we values
6
+ (1, 10, 100, 1),
7
+ (2, 20, 200, 2),
8
+ (3, 30, 300, 3),
9
+ (4, 40, 400, 4),
10
+ (5, 50, 500, 5),
11
+ (6, null, null, null);
12
+
13
+ -- =============================================================================
14
+ -- Constant WHERE: short-circuit always-true / always-false predicates
15
+ -- =============================================================================
16
+
17
+ select count(*) as cnt from we where 1;
18
+ → [{"cnt":6}]
19
+
20
+ select count(*) as cnt from we where 0;
21
+ → [{"cnt":0}]
22
+
23
+ select count(*) as cnt from we where true;
24
+ → [{"cnt":6}]
25
+
26
+ select count(*) as cnt from we where false;
27
+ → [{"cnt":0}]
28
+
29
+ select count(*) as cnt from we where 1 = 1;
30
+ → [{"cnt":6}]
31
+
32
+ select count(*) as cnt from we where 1 = 0;
33
+ → [{"cnt":0}]
34
+
35
+ -- Constant comparison combined with column predicate
36
+ select id from we where 1 = 1 and a > 30 order by id;
37
+ → [{"id":4},{"id":5}]
38
+
39
+ select id from we where 1 = 0 or a = 10 order by id;
40
+ → [{"id":1}]
41
+
42
+ -- =============================================================================
43
+ -- AND combined with multi-branch OR (x AND (y OR z))
44
+ -- =============================================================================
45
+
46
+ select id from we where a > 15 and (b = 200 or b = 400) order by id;
47
+ → [{"id":2},{"id":4}]
48
+
49
+ select id from we where a > 15 and (b = 200 or c >= 4) order by id;
50
+ → [{"id":2},{"id":4},{"id":5}]
51
+
52
+ -- (x OR y) AND z: distributes correctly
53
+ select id from we where (a = 10 or a = 30) and b > 50 order by id;
54
+ → [{"id":1},{"id":3}]
55
+
56
+ -- =============================================================================
57
+ -- Composite OR over (a AND b) tuples
58
+ -- =============================================================================
59
+
60
+ select id from we where (a = 10 and b = 100) or (a = 30 and b = 300) order by id;
61
+ → [{"id":1},{"id":3}]
62
+
63
+ -- Tuple OR where one disjunct fails the b test
64
+ select id from we where (a = 10 and b = 999) or (a = 30 and b = 300) order by id;
65
+ → [{"id":3}]
66
+
67
+ -- =============================================================================
68
+ -- Multi-range OR (BETWEEN inside OR)
69
+ -- =============================================================================
70
+
71
+ select id from we where a between 10 and 20 or a between 40 and 50 order by id;
72
+ → [{"id":1},{"id":2},{"id":4},{"id":5}]
73
+
74
+ select id from we where (a between 10 and 20) or (b between 300 and 400) order by id;
75
+ → [{"id":1},{"id":2},{"id":3},{"id":4}]
76
+
77
+ -- BETWEEN inside OR mixed with equality
78
+ select id from we where a = 50 or a between 15 and 25 order by id;
79
+ → [{"id":2},{"id":5}]
80
+
81
+ -- =============================================================================
82
+ -- Three-column AND/OR composite
83
+ -- =============================================================================
84
+
85
+ select id from we where a > 10 and (b = 100 or b = 200 or c >= 4) order by id;
86
+ → [{"id":2},{"id":4},{"id":5}]
87
+
88
+ select id from we where a > 10 and (b > 250 and c < 5) order by id;
89
+ → [{"id":3},{"id":4}]
90
+
91
+ -- =============================================================================
92
+ -- OR with IS NULL: non-null disjunct wins, null rows kept via IS NULL
93
+ -- =============================================================================
94
+
95
+ select id from we where a > 25 or a is null order by id;
96
+ → [{"id":3},{"id":4},{"id":5},{"id":6}]
97
+
98
+ -- IS NULL combined with AND
99
+ select id from we where a is null or (b > 100 and c < 4) order by id;
100
+ → [{"id":2},{"id":3},{"id":6}]
101
+
102
+ -- =============================================================================
103
+ -- IN list deduplication: duplicate values produce no duplicate rows
104
+ -- =============================================================================
105
+
106
+ select id from we where a in (10, 10, 30, 30, 30) order by id;
107
+ → [{"id":1},{"id":3}]
108
+
109
+ -- =============================================================================
110
+ -- Reordered ON-clause conjunction equivalence (LEFT JOIN)
111
+ -- =============================================================================
112
+
113
+ create table wj_l (id integer primary key, k integer);
114
+ create table wj_r (id integer primary key, k integer, tag integer);
115
+ insert into wj_l values (1, 1), (2, 2);
116
+ insert into wj_r values (10, 1, 1), (20, 1, 3), (30, 2, 1), (40, 2, 3);
117
+
118
+ -- ON term order should not affect result
119
+ select wj_l.id as lid, wj_r.id as rid from wj_l left join wj_r on wj_l.k = wj_r.k and wj_r.tag = 1 order by lid, rid;
120
+ → [{"lid":1,"rid":10},{"lid":2,"rid":30}]
121
+
122
+ select wj_l.id as lid, wj_r.id as rid from wj_l left join wj_r on wj_r.tag = 1 and wj_r.k = wj_l.k order by lid, rid;
123
+ → [{"lid":1,"rid":10},{"lid":2,"rid":30}]
124
+
125
+ -- The indexed variant of this equivalence (an index on the ON columns must not
126
+ -- change the answer) lives in 100.1.1-where-join-on-order-indexed.
127
+
128
+ drop table wj_l;
129
+ drop table wj_r;
130
+
131
+ drop table we;
132
+
133
+ -- =============================================================================
134
+ -- same-table column-column equality: must not crash (regression: seek crash)
135
+ -- A col = same_col predicate is a per-row filter, never a seek key.
136
+ -- =============================================================================
137
+
138
+ create table samecolpk (b text primary key, c text);
139
+ insert into samecolpk values ('u', 'u'), ('v', 'w'), ('x', 'x');
140
+
141
+ -- simple PK: matching rows returned, no crash
142
+ select b from samecolpk where b = c order by b;
143
+ → [{"b":"u"},{"b":"x"}]
144
+
145
+ -- with inequality too
146
+ select b from samecolpk where b = c and c != 'x';
147
+ → [{"b":"u"}]
148
+
149
+ drop table samecolpk;
150
+
151
+ -- composite PK: b=c with the other key column pinned must not crash
152
+ create table samecolcomp (b text, c text, x integer, primary key (b, x));
153
+ insert into samecolcomp values ('u','u',1), ('u','u',2), ('v','v',1), ('w','v',1);
154
+
155
+ -- both pk columns specified but b=c is still a per-row filter
156
+ select b, c, x from samecolcomp where b = c and x = 1 order by b;
157
+ → [{"b":"u","c":"u","x":1},{"b":"v","c":"v","x":1}]
158
+
159
+ -- without x pin: b=c alone as filter
160
+ select b, c, x from samecolcomp where b = c order by b, x;
161
+ → [{"b":"u","c":"u","x":1},{"b":"u","c":"u","x":2},{"b":"v","c":"v","x":1}]
162
+
163
+ drop table samecolcomp;
@@ -0,0 +1,35 @@
1
+ -- 100.1.1-where-join-on-order-indexed.sqllogic
2
+ --
3
+ -- requires-capability: standalone-index-ddl
4
+ --
5
+ -- Carved out of 100.1-where-extras: that file's subject is WHERE-predicate shapes,
6
+ -- and its reordered-ON-clause section already proves term-order equivalence without
7
+ -- any index. The one create/drop index pair below is a robustness check — "an index
8
+ -- on the ON columns must not change the answer" — not index behavior, so it moves
9
+ -- here rather than making the whole WHERE file unrunnable on a backend without
10
+ -- first-class CREATE INDEX.
11
+ --
12
+ -- Subject: a LEFT JOIN whose ON conjunction can be served by a composite index on
13
+ -- the right-hand table returns the same rows as the unindexed plan.
14
+
15
+ create table wj_l (id integer primary key, k integer);
16
+ create table wj_r (id integer primary key, k integer, tag integer);
17
+ insert into wj_l values (1, 1), (2, 2);
18
+ insert into wj_r values (10, 1, 1), (20, 1, 3), (30, 2, 1), (40, 2, 3);
19
+
20
+ -- Baseline: unindexed, both ON term orders.
21
+ select wj_l.id as lid, wj_r.id as rid from wj_l left join wj_r on wj_l.k = wj_r.k and wj_r.tag = 1 order by lid, rid;
22
+ → [{"lid":1,"rid":10},{"lid":2,"rid":30}]
23
+
24
+ -- Index presence on the ON columns must not change results
25
+ create index wj_r_k_tag on wj_r(k, tag);
26
+
27
+ select wj_l.id as lid, wj_r.id as rid from wj_l left join wj_r on wj_l.k = wj_r.k and wj_r.tag = 1 order by lid, rid;
28
+ → [{"lid":1,"rid":10},{"lid":2,"rid":30}]
29
+
30
+ select wj_l.id as lid, wj_r.id as rid from wj_l left join wj_r on wj_r.tag = 1 and wj_r.k = wj_l.k order by lid, rid;
31
+ → [{"lid":1,"rid":10},{"lid":2,"rid":30}]
32
+
33
+ drop index wj_r_k_tag;
34
+ drop table wj_l;
35
+ drop table wj_r;