@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,255 @@
1
+ -- 03.8-not-precedence.sqllogic — Prefix-NOT precedence matrix.
2
+ --
3
+ -- Regression lock for github.com/gotchoices/quereus/issues/22: prefix `not`
4
+ -- must bind above every predicate (comparison, IN, BETWEEN, LIKE,
5
+ -- IS [NOT] NULL, EXISTS) but below AND/OR. Each block asserts that
6
+ -- A. `not v <predicate>` (prefix form, parser must group correctly),
7
+ -- B. `v not <predicate>` (postfix form, where SQL exposes one), and
8
+ -- C. `not (v <predicate>)` (explicit parenthesisation)
9
+ -- are semantically identical. If a new predicate is added to the grammar
10
+ -- without recursing under prefix-NOT, the corresponding A row diverges
11
+ -- from B/C and fails loudly.
12
+ --
13
+ -- Probe relation seeds NULL once, so every block also exercises the
14
+ -- three-valued-logic rules: `not (NULL = x)` is NULL (not false),
15
+ -- `not NULL in (...)` is NULL, `not NULL is null` is false.
16
+
17
+ -- Quereus requires an explicit primary key; `id` is incidental and not
18
+ -- referenced in any predicate below.
19
+ create table p (id integer primary key, v any null);
20
+ insert into p values (1, 5), (2, 10), (3, null);
21
+
22
+ -- ---------------------------------------------------------------------------
23
+ -- Comparison operators (=, ==, <>, !=, <, <=, >, >=).
24
+ -- No postfix form exists for these. Two assertions per operator (A vs C).
25
+ -- The null row is always excluded — `not (null op 5)` is `not null` = null,
26
+ -- which the WHERE filter treats as not-true.
27
+ -- ---------------------------------------------------------------------------
28
+
29
+ -- = 5: only v=10 survives `not (v = 5)`.
30
+ select v from p where not v = 5 order by v;
31
+ → [{"v":10}]
32
+
33
+ select v from p where not (v = 5) order by v;
34
+ → [{"v":10}]
35
+
36
+ -- == 5: synonym of =.
37
+ select v from p where not v == 5 order by v;
38
+ → [{"v":10}]
39
+
40
+ select v from p where not (v == 5) order by v;
41
+ → [{"v":10}]
42
+
43
+ -- <> 5: only v=5 survives `not (v <> 5)`.
44
+ select v from p where not v <> 5 order by v;
45
+ → [{"v":5}]
46
+
47
+ select v from p where not (v <> 5) order by v;
48
+ → [{"v":5}]
49
+
50
+ -- != 5: synonym of <>.
51
+ select v from p where not v != 5 order by v;
52
+ → [{"v":5}]
53
+
54
+ select v from p where not (v != 5) order by v;
55
+ → [{"v":5}]
56
+
57
+ -- < 5: both non-null rows fail v<5, so `not (v<5)` keeps both.
58
+ select v from p where not v < 5 order by v;
59
+ → [{"v":5},{"v":10}]
60
+
61
+ select v from p where not (v < 5) order by v;
62
+ → [{"v":5},{"v":10}]
63
+
64
+ -- <= 5: v=5 satisfies v<=5 (excluded); v=10 does not (included).
65
+ select v from p where not v <= 5 order by v;
66
+ → [{"v":10}]
67
+
68
+ select v from p where not (v <= 5) order by v;
69
+ → [{"v":10}]
70
+
71
+ -- > 5: v=10 satisfies v>5 (excluded); v=5 does not (included).
72
+ select v from p where not v > 5 order by v;
73
+ → [{"v":5}]
74
+
75
+ select v from p where not (v > 5) order by v;
76
+ → [{"v":5}]
77
+
78
+ -- >= 5: both v=5 and v=10 satisfy v>=5 (both excluded); null is excluded.
79
+ select v from p where not v >= 5 order by v;
80
+ → []
81
+
82
+ select v from p where not (v >= 5) order by v;
83
+ → []
84
+
85
+ -- ---------------------------------------------------------------------------
86
+ -- IN value list.
87
+ -- ---------------------------------------------------------------------------
88
+
89
+ -- not v in (5,7) — without the precedence fix this would parse as
90
+ -- (not v) in (5,7), which evaluates `not 5`=false / `not 10`=false /
91
+ -- `not null`=null and returns []. Correct: only v=10 survives.
92
+ select v from p where not v in (5, 7) order by v;
93
+ → [{"v":10}]
94
+
95
+ select v from p where v not in (5, 7) order by v;
96
+ → [{"v":10}]
97
+
98
+ select v from p where not (v in (5, 7)) order by v;
99
+ → [{"v":10}]
100
+
101
+ -- ---------------------------------------------------------------------------
102
+ -- IN subquery.
103
+ -- ---------------------------------------------------------------------------
104
+
105
+ select v from p where not v in (select 5 union all select 7) order by v;
106
+ → [{"v":10}]
107
+
108
+ select v from p where v not in (select 5 union all select 7) order by v;
109
+ → [{"v":10}]
110
+
111
+ select v from p where not (v in (select 5 union all select 7)) order by v;
112
+ → [{"v":10}]
113
+
114
+ -- ---------------------------------------------------------------------------
115
+ -- BETWEEN.
116
+ -- ---------------------------------------------------------------------------
117
+
118
+ -- v=5 is inside [3,7] (excluded); v=10 outside (included); null excluded.
119
+ select v from p where not v between 3 and 7 order by v;
120
+ → [{"v":10}]
121
+
122
+ select v from p where v not between 3 and 7 order by v;
123
+ → [{"v":10}]
124
+
125
+ select v from p where not (v between 3 and 7) order by v;
126
+ → [{"v":10}]
127
+
128
+ -- ---------------------------------------------------------------------------
129
+ -- LIKE — cast(v as text) so the probe relation stays homogeneous. The cast
130
+ -- of null yields null, and `null like '5'` is null, so the null row is still
131
+ -- excluded by `not`.
132
+ -- ---------------------------------------------------------------------------
133
+
134
+ select v from p where not cast(v as text) like '5' order by v;
135
+ → [{"v":10}]
136
+
137
+ select v from p where cast(v as text) not like '5' order by v;
138
+ → [{"v":10}]
139
+
140
+ select v from p where not (cast(v as text) like '5') order by v;
141
+ → [{"v":10}]
142
+
143
+ -- ---------------------------------------------------------------------------
144
+ -- GLOB / REGEXP — not currently exposed by the parser (no GLOB/REGEXP
145
+ -- token in lexer.ts; comparison() in parser.ts only matches LIKE among
146
+ -- pattern operators). If/when added, mirror the LIKE block above with the
147
+ -- same three-form pattern.
148
+ -- ---------------------------------------------------------------------------
149
+
150
+ -- ---------------------------------------------------------------------------
151
+ -- IS NULL.
152
+ -- ---------------------------------------------------------------------------
153
+
154
+ -- not v is null: both non-null rows pass, null row fails.
155
+ select v from p where not v is null order by v;
156
+ → [{"v":5},{"v":10}]
157
+
158
+ select v from p where v is not null order by v;
159
+ → [{"v":5},{"v":10}]
160
+
161
+ select v from p where not (v is null) order by v;
162
+ → [{"v":5},{"v":10}]
163
+
164
+ -- ---------------------------------------------------------------------------
165
+ -- IS NOT NULL.
166
+ -- The postfix-equivalent of `not v is not null` is `v is null`
167
+ -- (double-negation). Unlike the other predicates, the null row IS the
168
+ -- surviving row here because IS NULL returns true/false (never unknown).
169
+ -- ---------------------------------------------------------------------------
170
+
171
+ select v from p where not v is not null order by v;
172
+ → [{"v":null}]
173
+
174
+ select v from p where v is null order by v;
175
+ → [{"v":null}]
176
+
177
+ select v from p where not (v is not null) order by v;
178
+ → [{"v":null}]
179
+
180
+ -- ---------------------------------------------------------------------------
181
+ -- EXISTS — no postfix form. The fix matters for `not exists ... and X`
182
+ -- style scoping rather than EXISTS itself, but include the two forms for
183
+ -- completeness.
184
+ -- ---------------------------------------------------------------------------
185
+
186
+ -- inner select hits v=5 → exists=true → not=false.
187
+ select (not exists (select 1 from p where v = 5)) as r;
188
+ → [{"r":false}]
189
+
190
+ select (not (exists (select 1 from p where v = 5))) as r;
191
+ → [{"r":false}]
192
+
193
+ -- inner select hits nothing → exists=false → not=true.
194
+ select (not exists (select 1 from p where v = 99)) as r;
195
+ → [{"r":true}]
196
+
197
+ select (not (exists (select 1 from p where v = 99))) as r;
198
+ → [{"r":true}]
199
+
200
+ -- ---------------------------------------------------------------------------
201
+ -- Stacked NOT — `not not p` must reduce to `p`. Smoke for the two predicate
202
+ -- shapes most affected by the fix (comparison and IN-list).
203
+ -- ---------------------------------------------------------------------------
204
+
205
+ select v from p where not not v = 5 order by v;
206
+ → [{"v":5}]
207
+
208
+ select v from p where v = 5 order by v;
209
+ → [{"v":5}]
210
+
211
+ select v from p where not not v in (5, 7) order by v;
212
+ → [{"v":5}]
213
+
214
+ select v from p where v in (5, 7) order by v;
215
+ → [{"v":5}]
216
+
217
+ -- ---------------------------------------------------------------------------
218
+ -- NOT bound by AND — the fix puts prefix-NOT below AND, so
219
+ -- `not v = 5 and v < 5` must parse as `(not v = 5) and (v < 5)`, NOT as
220
+ -- `not (v = 5 and v < 5)`. The two parses disagree on v=10:
221
+ -- correct: not(false) AND false = true AND false = false → excluded
222
+ -- wrong: not(false AND false) = not(false) = true → included
223
+ -- Choosing `v < 5` as the second conjunct makes the discriminator sharp:
224
+ -- correct parse keeps nothing, wrong parse would keep two rows.
225
+ -- ---------------------------------------------------------------------------
226
+
227
+ -- Correct precedence: `(not v = 5) AND (v < 5)`. v=5 fails left, v=10 fails
228
+ -- right, null fails (three-valued AND of nulls). Count = 0.
229
+ select count(*) as c from p where not v = 5 and v < 5;
230
+ → [{"c":0}]
231
+
232
+ -- Explicit parenthesised form must match.
233
+ select count(*) as c from p where (not v = 5) and v < 5;
234
+ → [{"c":0}]
235
+
236
+ -- Wrong parse equivalent (kept here to prove the discriminator has bite):
237
+ -- `not (v = 5 AND v < 5)` includes v=5 and v=10 (both make the inner AND
238
+ -- false, NOT flips to true). Null row excluded. Count = 2.
239
+ select count(*) as c from p where not (v = 5 and v < 5);
240
+ → [{"c":2}]
241
+
242
+ -- ---------------------------------------------------------------------------
243
+ -- De Morgan — `not (A or B)` ≡ `(not A) and (not B)`. Using bare prefix
244
+ -- forms on the right exercises the fix on both A and B in one assertion.
245
+ -- Every non-null row hits one branch (v=5 hits the IN, v=10 hits the =10),
246
+ -- so both forms return []. The null row is null on both sides → excluded.
247
+ -- ---------------------------------------------------------------------------
248
+
249
+ select v from p where not (v in (5, 7) or v = 10) order by v;
250
+ → []
251
+
252
+ select v from p where (not v in (5, 7)) and not v = 10 order by v;
253
+ → []
254
+
255
+ drop table p;
@@ -0,0 +1,150 @@
1
+ -- 03.9-is-bool-predicate.sqllogic — `expr IS [NOT] TRUE/FALSE` boolean tests.
2
+ --
3
+ -- These four postfix unary predicates are SQLite-compatible and TOTAL: they
4
+ -- never return NULL. Operand truthiness routes through the engine's isTruthy
5
+ -- (same as FilterNode / NOT / logical ops), so non-boolean operands behave
6
+ -- consistently. The defining feature vs `= true/false` is the NULL row:
7
+ -- x = true on NULL ⇒ NULL x IS TRUE on NULL ⇒ false
8
+ -- The 4×3 matrix below pins NULL totality; the non-boolean block pins that
9
+ -- truthiness goes through isTruthy (NOT JS truthiness).
10
+
11
+ -- ===========================================================================
12
+ -- Totality matrix: {IS TRUE, IS NOT TRUE, IS FALSE, IS NOT FALSE} × {true,
13
+ -- false, null}. Scalar form (aliased) so results are unambiguous booleans.
14
+ -- ===========================================================================
15
+
16
+ -- IS TRUE: true→true, false→false, null→false.
17
+ select (true is true) as r;
18
+ → [{"r":true}]
19
+
20
+ select (false is true) as r;
21
+ → [{"r":false}]
22
+
23
+ select (null is true) as r;
24
+ → [{"r":false}]
25
+
26
+ -- IS NOT TRUE (≡ NOT (x IS TRUE)): true→false, false→true, null→true.
27
+ select (true is not true) as r;
28
+ → [{"r":false}]
29
+
30
+ select (false is not true) as r;
31
+ → [{"r":true}]
32
+
33
+ select (null is not true) as r;
34
+ → [{"r":true}]
35
+
36
+ -- IS FALSE: true→false, false→true, null→false.
37
+ select (true is false) as r;
38
+ → [{"r":false}]
39
+
40
+ select (false is false) as r;
41
+ → [{"r":true}]
42
+
43
+ select (null is false) as r;
44
+ → [{"r":false}]
45
+
46
+ -- IS NOT FALSE (≡ NOT (x IS FALSE)): true→true, false→false, null→true.
47
+ select (true is not false) as r;
48
+ → [{"r":true}]
49
+
50
+ select (false is not false) as r;
51
+ → [{"r":false}]
52
+
53
+ select (null is not false) as r;
54
+ → [{"r":true}]
55
+
56
+ -- ===========================================================================
57
+ -- Non-boolean operands must route through isTruthy, NOT JS truthiness.
58
+ -- A regression to JS truthiness would make '0' IS TRUE → true and
59
+ -- 'abc' IS TRUE → true; both must be false here.
60
+ -- ===========================================================================
61
+
62
+ -- Text: numeric-string conversion ('1'→1 truthy, '0'→0 falsey).
63
+ select ('1' is true) as r;
64
+ → [{"r":true}]
65
+
66
+ select ('0' is true) as r;
67
+ → [{"r":false}]
68
+
69
+ -- Non-numeric text converts to 0 (falsey) — a JS-truthiness regression catcher.
70
+ select ('abc' is true) as r;
71
+ → [{"r":false}]
72
+
73
+ select ('abc' is false) as r;
74
+ → [{"r":true}]
75
+
76
+ -- Numeric: 0 falsey, non-zero truthy.
77
+ select (2 is true) as r;
78
+ → [{"r":true}]
79
+
80
+ select (0 is false) as r;
81
+ → [{"r":true}]
82
+
83
+ select (2 is not false) as r;
84
+ → [{"r":true}]
85
+
86
+ -- ===========================================================================
87
+ -- Column-reference path over a boolean column with a NULL row.
88
+ -- ===========================================================================
89
+
90
+ create table feat (id integer primary key, name text, flag any null);
91
+ insert into feat values (1, 'alpha', true);
92
+ insert into feat values (2, 'beta', false);
93
+ insert into feat values (3, 'gamma', null);
94
+ insert into feat values (4, 'delta', true);
95
+
96
+ -- IS TRUE keeps only the true rows.
97
+ select id from feat where flag is true order by id;
98
+ → [{"id":1},{"id":4}]
99
+
100
+ -- IS NOT TRUE keeps false + null rows (totality: null flips into the NOT bucket).
101
+ select id from feat where flag is not true order by id;
102
+ → [{"id":2},{"id":3}]
103
+
104
+ -- IS FALSE keeps only the false row (null excluded — never returns true).
105
+ select id from feat where flag is false order by id;
106
+ → [{"id":2}]
107
+
108
+ -- IS NOT FALSE keeps true + null rows.
109
+ select id from feat where flag is not false order by id;
110
+ → [{"id":1},{"id":3},{"id":4}]
111
+
112
+ -- ===========================================================================
113
+ -- Precedence: prefix NOT binds ABOVE the IS predicate, so
114
+ -- `not flag is true` parses as `NOT (flag IS TRUE)` — identical to the
115
+ -- explicit-parenthesis form and to `flag IS NOT TRUE` (double negation).
116
+ -- A precedence inversion to `(not flag) is true` would diverge here.
117
+ -- ===========================================================================
118
+
119
+ select id from feat where not flag is true order by id;
120
+ → [{"id":2},{"id":3}]
121
+
122
+ select id from feat where not (flag is true) order by id;
123
+ → [{"id":2},{"id":3}]
124
+
125
+ -- The partial-index compilation smoke test for these four operators lives in
126
+ -- 03.9.1-is-bool-predicate-partial-index (it needs standalone CREATE INDEX).
127
+
128
+ drop table feat;
129
+
130
+ -- ===========================================================================
131
+ -- CHECK constraint using a boolean-test predicate. check-extraction /
132
+ -- assertion-classifier don't special-case these operators (they fall through
133
+ -- to "residual / not specially analyzed"); the constraint is still enforced by
134
+ -- general expression evaluation, and no analysis path throws on the new
135
+ -- operator string. `c IS NOT FALSE` admits true + null, rejects false.
136
+ -- ===========================================================================
137
+
138
+ create table chk (id integer primary key, c any null, check (c is not false));
139
+
140
+ insert into chk values (1, true);
141
+ insert into chk values (2, null);
142
+
143
+ select id from chk order by id;
144
+ → [{"id":1},{"id":2}]
145
+
146
+ -- false → `c is not false` is false → violates the CHECK.
147
+ insert into chk values (3, false);
148
+ -- error: CHECK constraint failed
149
+
150
+ drop table chk;
@@ -0,0 +1,34 @@
1
+ -- 03.9.1-is-bool-predicate-partial-index.sqllogic — `IS [NOT] TRUE/FALSE` inside a partial-index WHERE.
2
+ --
3
+ -- requires-capability: standalone-index-ddl
4
+ --
5
+ -- Carved out of 03.9-is-bool-predicate: that file's subject is the four postfix
6
+ -- boolean-test predicates themselves (totality over NULL, isTruthy routing,
7
+ -- precedence, CHECK usage), none of which needs an index. This one block used
8
+ -- standalone `create index ... where` only as a second compilation site for the
9
+ -- same operators, so a backend without first-class CREATE INDEX would have lost
10
+ -- the whole predicate file over it.
11
+ --
12
+ -- Subject: all four operators must compile in a partial-index WHERE clause
13
+ -- (exercises compileUnary in vtab/memory/utils/predicate.ts), and queries must
14
+ -- stay correct regardless of which rows the index covers.
15
+
16
+ create table feat (id integer primary key, name text, flag any null);
17
+ insert into feat values (1, 'alpha', true);
18
+ insert into feat values (2, 'beta', false);
19
+ insert into feat values (3, 'gamma', null);
20
+ insert into feat values (4, 'delta', true);
21
+
22
+ create index ix_feat_t on feat(name) where flag is true;
23
+ create index ix_feat_nt on feat(name) where flag is not true;
24
+ create index ix_feat_f on feat(name) where flag is false;
25
+ create index ix_feat_nf on feat(name) where flag is not false;
26
+
27
+ -- Re-query through the now-indexed table; results must be unchanged.
28
+ select id from feat where flag is true order by id;
29
+ → [{"id":1},{"id":4}]
30
+
31
+ select id from feat where flag is false order by id;
32
+ → [{"id":2}]
33
+
34
+ drop table feat;
@@ -0,0 +1,38 @@
1
+ -- Coverage for ORDER BY FD pruning (see rules/sort/rule-orderby-fd-pruning.ts).
2
+ -- The optimizer drops trailing ORDER BY keys functionally determined by the
3
+ -- preceding bare-column keys; result rows must match the pre-pruned reference
4
+ -- output.
5
+
6
+ -- =============================================================================
7
+ -- PK-driven: trailing keys after a PK column add nothing
8
+ -- =============================================================================
9
+
10
+ create table pkdriven (pk integer primary key, name text, email text);
11
+ insert into pkdriven values
12
+ (1, 'beta', 'b@x'),
13
+ (2, 'alpha', 'a@x'),
14
+ (3, 'gamma', 'g@x');
15
+
16
+ -- ORDER BY pk, name → pruned to ORDER BY pk; result is by pk.
17
+ select pk, name from pkdriven order by pk, name;
18
+ → [{"pk":1,"name":"beta"},{"pk":2,"name":"alpha"},{"pk":3,"name":"gamma"}]
19
+
20
+ -- ORDER BY pk, name, email → pruned to ORDER BY pk; result still by pk.
21
+ select pk, name, email from pkdriven order by pk, name, email;
22
+ → [{"pk":1,"name":"beta","email":"b@x"},{"pk":2,"name":"alpha","email":"a@x"},{"pk":3,"name":"gamma","email":"g@x"}]
23
+
24
+ drop table pkdriven;
25
+
26
+ -- =============================================================================
27
+ -- EC-driven: a WHERE a = b filter equates the columns, so the second key
28
+ -- functions as a tiebreaker that can never re-order.
29
+ -- =============================================================================
30
+
31
+ create table ecdriven (a integer, b integer);
32
+ insert into ecdriven values
33
+ (3, 3), (1, 1), (2, 2);
34
+
35
+ select a, b from ecdriven where a = b order by a, b;
36
+ → [{"a":1,"b":1},{"a":2,"b":2},{"a":3,"b":3}]
37
+
38
+ drop table ecdriven;