@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,111 @@
1
+ -- query-expr-values.sqllogic — exercises the unified QueryExpr surface for
2
+ -- VALUES bodies at every relation site. These cases parse + execute under
3
+ -- the pure-VALUES portion of the orthogonality work; DML-as-relation cases
4
+ -- are gated until the follow-up dml-in-expression-position ticket lifts them.
5
+
6
+ -- ===================================
7
+ -- 1. VALUES as a CTE body (was a parser TODO; now first-class)
8
+ -- ===================================
9
+
10
+ with t(a, b) as (values (1, 'x'), (2, 'y'))
11
+ select a, b from t order by a;
12
+ → [{"a":1,"b":"x"},{"a":2,"b":"y"}]
13
+
14
+ -- ===================================
15
+ -- 2. VALUES as a compound-set leg (UNION ALL with another VALUES)
16
+ -- ===================================
17
+
18
+ values (1) union all values (2);
19
+ → [{"column_0":1},{"column_0":2}]
20
+
21
+ -- ===================================
22
+ -- 3. Mixed compound: SELECT against a subquery VALUES, then UNION ALL with VALUES
23
+ -- ===================================
24
+ -- Output column names follow the union output naming convention used by the
25
+ -- planner today; what we're pinning here is that the rows survive
26
+ -- end-to-end through the unified compound-leg parser.
27
+
28
+ select * from (values (1, 'x'), (2, 'y')) as t(a, b)
29
+ union all
30
+ values (3, 'z');
31
+ → [{"column_0":1,"column_1":"x"},{"column_0":2,"column_1":"y"},{"column_0":3,"column_1":"z"}]
32
+
33
+ -- ===================================
34
+ -- 4. VALUES as a CREATE VIEW body — names synthesized from the body
35
+ -- ===================================
36
+
37
+ create view v_unnamed as values (1, 'a'), (2, 'b');
38
+ select * from v_unnamed order by column_0;
39
+ → [{"column_0":1,"column_1":"a"},{"column_0":2,"column_1":"b"}]
40
+ drop view v_unnamed;
41
+
42
+ -- ===================================
43
+ -- 5. VALUES as a CREATE VIEW body — binding-site column names win
44
+ -- ===================================
45
+
46
+ create view v_named(a, b) as values (1, 'x'), (2, 'y');
47
+ select * from v_named order by a;
48
+ → [{"a":1,"b":"x"},{"a":2,"b":"y"}]
49
+ drop view v_named;
50
+
51
+ -- ===================================
52
+ -- 6. VALUES inside IN (already worked via Project(Values…); pinned here)
53
+ -- ===================================
54
+
55
+ select 2 in (values (1), (2), (3)) as found;
56
+ → [{"found":true}]
57
+
58
+ -- ===================================
59
+ -- 7. VALUES inside EXISTS
60
+ -- ===================================
61
+
62
+ select exists (values (1)) as ex;
63
+ → [{"ex":true}]
64
+
65
+ -- ===================================
66
+ -- 8. Scalar / row subquery with VALUES body
67
+ -- ===================================
68
+
69
+ select (values (42)) as v;
70
+ → [{"v":42}]
71
+
72
+ -- ===================================
73
+ -- 9. Three-leg compound chain of bare VALUES
74
+ -- ===================================
75
+ -- The right leg of a compound recurses through the VALUES wrapper so chains
76
+ -- longer than two legs work, not just `VALUES … UNION VALUES …`.
77
+
78
+ values (1) union all values (2) union all values (3);
79
+ → [{"column_0":1},{"column_0":2},{"column_0":3}]
80
+
81
+ -- ===================================
82
+ -- 10. Bare VALUES + ORDER BY at top level (no compound)
83
+ -- ===================================
84
+ -- The wrapper synthesizes whenever ORDER BY / LIMIT / OFFSET follow VALUES,
85
+ -- not just on compound. Result column names come from the inner VALUES
86
+ -- (synthetic `column_0`).
87
+
88
+ values (3), (1), (2) order by column_0;
89
+ → [{"column_0":1},{"column_0":2},{"column_0":3}]
90
+
91
+ -- ===================================
92
+ -- 11. Bare VALUES + LIMIT/OFFSET at top level
93
+ -- ===================================
94
+
95
+ values (1), (2), (3), (4) limit 2 offset 1;
96
+ → [{"column_0":2},{"column_0":3}]
97
+
98
+ -- ===================================
99
+ -- 12. Bare VALUES + ORDER BY/LIMIT inside a parenthesized subquery source
100
+ -- ===================================
101
+
102
+ select * from (values (3), (1), (2) order by column_0 limit 2) as v;
103
+ → [{"column_0":1},{"column_0":2}]
104
+
105
+ -- ===================================
106
+ -- 13. Bare VALUES + ORDER BY in a CTE body
107
+ -- ===================================
108
+
109
+ with c(a) as (values (3), (1), (2) order by column_0)
110
+ select a from c;
111
+ → [{"a":1},{"a":2},{"a":3}]
@@ -0,0 +1,119 @@
1
+ -- 01.9.1-limit-over-dml-subquery.sqllogic - a LIMIT never truncates a writing source
2
+ --
3
+ -- `select ... from (insert/update/delete ... returning ...) limit n` caps what the
4
+ -- QUERY returns, not what the STATEMENT writes: the data-modifying subquery runs to
5
+ -- completion and the LIMIT only decides how many of its RETURNING rows come back.
6
+ --
7
+ -- The LIMIT arm of 01.9-query-expr-dml.sqllogic, which pins the same full-drain rule for
8
+ -- a writing inner in scalar / IN / EXISTS / CTE-body / FROM-source position. It is also
9
+ -- the rule 13.6 pins for a data-modifying CTE under `limit 0`, and the answer PostgreSQL
10
+ -- gives for a data-modifying CTE. Before bug-limit-reads-one-row-too-many this case gave
11
+ -- a third answer — it wrote exactly one row more than it returned, an artifact of the
12
+ -- LIMIT reading one row past its last emitted one.
13
+ --
14
+ -- Scope: "runs to completion" means when the statement itself is run to completion.
15
+ -- Abandoning the result iteration early stops the writes with it, exactly as it does for
16
+ -- a DML FROM-subquery with no LIMIT at all — see docs/sql-select.md § Query expressions.
17
+ --
18
+ -- Every section asserts BOTH halves: the rows the query returned, and the rows that
19
+ -- landed in the target table.
20
+
21
+ -- ===== INSERT ... RETURNING under LIMIT 1 =====
22
+
23
+ create table srcq (k integer primary key);
24
+ insert into srcq values (1), (2), (3), (4);
25
+ create table d1 (k integer primary key);
26
+ -- run
27
+
28
+ select k from (insert into d1 select k from srcq returning k) limit 1;
29
+ → [{"k":1}]
30
+
31
+ -- All four rows written, not one and not two.
32
+ select count(*) as n from d1;
33
+ → [{"n":4}]
34
+
35
+ -- ===== INSERT ... RETURNING under LIMIT 0 =====
36
+ -- The strongest form: the query consumes nothing at all and the write still happens.
37
+
38
+ create table d2 (k integer primary key);
39
+ -- run
40
+
41
+ select k from (insert into d2 select k from srcq returning k) limit 0;
42
+ → []
43
+
44
+ select count(*) as n from d2;
45
+ → [{"n":4}]
46
+
47
+ -- ===== INSERT ... RETURNING under LIMIT with OFFSET =====
48
+
49
+ create table d3 (k integer primary key);
50
+ -- run
51
+
52
+ select k from (insert into d3 select k from srcq returning k) limit 2 offset 1;
53
+ → [{"k":2},{"k":3}]
54
+
55
+ select count(*) as n from d3;
56
+ → [{"n":4}]
57
+
58
+ -- ===== UPDATE ... RETURNING under LIMIT 1 =====
59
+ -- The silent-corruption shape: a partial update looks plausible in the output.
60
+
61
+ create table uq (k integer primary key, v integer);
62
+ insert into uq values (1, 0), (2, 0), (3, 0), (4, 0);
63
+ -- run
64
+
65
+ select k from (update uq set v = v + 1 returning k, v) limit 1;
66
+ → [{"k":1}]
67
+
68
+ -- Every row incremented, not just the one the LIMIT let through.
69
+ select k, v from uq order by k;
70
+ → [{"k":1,"v":1},{"k":2,"v":1},{"k":3,"v":1},{"k":4,"v":1}]
71
+
72
+ -- ===== DELETE ... RETURNING under LIMIT 1 =====
73
+
74
+ create table xq (k integer primary key);
75
+ insert into xq values (1), (2), (3), (4);
76
+ -- run
77
+
78
+ select k from (delete from xq where k >= 2 returning k) limit 1;
79
+ → [{"k":2}]
80
+
81
+ -- All three matching rows deleted, not just the returned one.
82
+ select k from xq order by k;
83
+ → [{"k":1}]
84
+
85
+ -- ===== Control: a read-only source IS truncated by the LIMIT =====
86
+ -- The drain rule is scoped to writing sources. A pure subquery still stops early —
87
+ -- that is the whole point of a LIMIT. (Row-level "stopped early, did not over-read"
88
+ -- counts are pinned in test/runtime/early-stop-consumption.spec.ts.)
89
+
90
+ select k from (select k from srcq) order by k limit 1;
91
+ → [{"k":1}]
92
+
93
+ select count(*) as n from srcq;
94
+ → [{"n":4}]
95
+
96
+ -- ===== A LIMIT above another LIMIT still drains =====
97
+ -- The drain gate asks whether the WHOLE subtree writes, not whether the immediate child
98
+ -- does, so an outer LIMIT over an inner LIMIT over a DML drains through both. Pinned
99
+ -- because narrowing the gate to "my direct child is a mutation" would silently
100
+ -- reintroduce the truncation one level up.
101
+
102
+ create table d4 (k integer primary key);
103
+ -- run
104
+
105
+ select k from (select k from (insert into d4 select k from srcq returning k) limit 3) limit 1;
106
+ → [{"k":1}]
107
+
108
+ select count(*) as n from d4;
109
+ → [{"n":4}]
110
+
111
+ -- Cleanup
112
+ drop table srcq;
113
+ drop table d4;
114
+ drop table d1;
115
+ drop table d2;
116
+ drop table d3;
117
+ drop table uq;
118
+ drop table xq;
119
+ -- run
@@ -0,0 +1,54 @@
1
+ -- 02-filters.sqllogic — Behavioural regression for WHERE-clause optimizer rules.
2
+ -- Initial focus: rulePredicateInferenceEquivalence (EC × constant binding → inferred eq).
3
+
4
+ -- ---------------------------------------------------------------------------
5
+ -- Predicate inference (EC × constant binding) — semantic equivalence.
6
+ -- ---------------------------------------------------------------------------
7
+
8
+ create table t (k int primary key, v text);
9
+ create table u (k int primary key, v text);
10
+
11
+ insert into t values (1, 'a'), (5, 'e'), (10, 'j');
12
+ insert into u values (5, 'E'), (7, 'G'), (10, 'J');
13
+
14
+ -- Literal: inference should produce u.k = 5 on the u-side; result is the
15
+ -- single matched row.
16
+ select t.v as tv, u.v as uv from t join u on t.k = u.k where t.k = 5;
17
+ → [{"tv":"e","uv":"E"}]
18
+
19
+ -- Parameter: inference threads the same parameter through to the u-side
20
+ -- access path. Result must match the literal form for the same value.
21
+ -- params: [10]
22
+ select t.v as tv, u.v as uv from t join u on t.k = u.k where t.k = ?;
23
+ → [{"tv":"j","uv":"J"}]
24
+
25
+ -- LEFT JOIN safety: outer's t.k = 5 must NOT propagate to the right side as
26
+ -- an EC-derived restriction (that would prune null-padded rows). Unmatched
27
+ -- left rows survive with NULL on the right.
28
+ select t.k as tk, u.k as uk from t left join u on t.k = u.k where t.k <= 5 order by t.k;
29
+ → [{"tk":1,"uk":null},{"tk":5,"uk":5}]
30
+
31
+ -- Multi-hop chain: a.x = 7 should propagate through both equi-joins so the
32
+ -- chain returns rows only when every joined side has x = 7.
33
+ create table ta (id int primary key, x int);
34
+ create table tb (id int primary key, x int);
35
+ create table tc (id int primary key, x int);
36
+
37
+ insert into ta values (1, 7), (2, 8);
38
+ insert into tb values (1, 7), (2, 8);
39
+ insert into tc values (1, 7), (2, 8);
40
+
41
+ select ta.x as ax, tb.x as bx, tc.x as cx
42
+ from ta join tb on ta.x = tb.x
43
+ join tc on tb.x = tc.x
44
+ where ta.x = 7;
45
+ → [{"ax":7,"bx":7,"cx":7}]
46
+
47
+ drop table tc;
48
+ drop table tb;
49
+ drop table ta;
50
+ drop table u;
51
+
52
+ -- Prefix-NOT precedence (issue #22) is covered by the full predicate
53
+ -- matrix in 03.8-not-precedence.sqllogic.
54
+ drop table t;
@@ -0,0 +1,62 @@
1
+ -- smoke.sqllogic - Basic sanity checks for core operations
2
+
3
+ -- Test basic operations
4
+
5
+ -- Set default VTab for subsequent CREATE TABLE
6
+ -- Create a table
7
+ CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT);
8
+ --SELECT name FROM schema() WHERE type = 'table' AND name = 't1';
9
+ --→ [{"name":"t1"}]
10
+
11
+ -- Insert some rows
12
+ INSERT INTO t1 VALUES (1, 'one');
13
+ INSERT INTO t1 (a, b) VALUES (2, 'two');
14
+ --SELECT count(*) FROM t1;
15
+ --→ [{"count(*)": 2}]
16
+
17
+ -- Select data with ordering
18
+ --SELECT * FROM t1 ORDER BY a;
19
+ --→ [{"a":1,"b":"one"},{"a":2,"b":"two"}]
20
+
21
+ -- Select specific columns
22
+ --SELECT b FROM t1 WHERE a = 1;
23
+ --→ [{"b":"one"}]
24
+
25
+ -- Update data
26
+ UPDATE t1 SET b = 'deux' WHERE a = 2;
27
+ --SELECT b FROM t1 WHERE a = 2;
28
+ --→ [{"b":"deux"}]
29
+ SELECT * FROM t1 ORDER BY a;
30
+ → [{"a":1,"b":"one"},{"a":2,"b":"deux"}]
31
+
32
+ -- Delete data
33
+ DELETE FROM t1 WHERE a = 1;
34
+ SELECT count(*) FROM t1;
35
+ → [{"count(*)": 1}]
36
+ SELECT * FROM t1;
37
+ → [{"a":2,"b":"deux"}]
38
+
39
+ -- Block 1: Drop the table
40
+ DROP TABLE t1;
41
+ -- No expected output for DROP
42
+
43
+ -- Block 2: Verify table is gone
44
+ SELECT name FROM schema() WHERE type = 'table' AND name = 't1';
45
+ → []
46
+
47
+ -- Test NULL handling (column val explicitly nullable for NULL testing)
48
+ CREATE TABLE t_null(id INTEGER PRIMARY KEY, val NUMERIC NULL);
49
+ INSERT INTO t_null VALUES (1, NULL), (2, 10), (3, 20.5);
50
+ SELECT * FROM t_null ORDER BY id;
51
+ → [{"id":1,"val":null},{"id":2,"val":10},{"id":3,"val":20.5}]
52
+ DROP TABLE t_null;
53
+
54
+ -- Test updating NULL column to non-NULL value (regression test)
55
+ CREATE TABLE items (id TEXT PRIMARY KEY, name TEXT, description TEXT NULL);
56
+ INSERT INTO items (id, name, description) VALUES ('item-1', 'Coffee', null);
57
+ SELECT description FROM items WHERE id = 'item-1';
58
+ → [{"description":null}]
59
+ UPDATE items SET description = 'dddd' WHERE id = 'item-1';
60
+ SELECT description FROM items WHERE id = 'item-1';
61
+ → [{"description":"dddd"}]
62
+ DROP TABLE items;
@@ -0,0 +1,223 @@
1
+ -- adapted from SQLite test/bind.test
2
+ -- Bind parameter syntax and binding semantics across statement types.
3
+ -- Quereus parameter forms: `?` (positional), `:name`, `:N` (numeric named),
4
+ -- `$name`, `$N` (numeric named). `@name` and `?N` are NOT supported.
5
+
6
+ create table bp (id integer primary key, val integer null, name text);
7
+ insert into bp values (1, 10, 'alpha'), (2, 20, 'beta'), (3, 30, 'gamma'), (4, null, 'delta');
8
+
9
+ -- ===================================
10
+ -- Positional `?` in basic SELECT
11
+ -- ===================================
12
+
13
+ -- params: [1]
14
+ select val from bp where id = ?;
15
+ → [{"val":10}]
16
+
17
+ -- Two positional parameters, both bound from one params array
18
+ -- params: [1, 25]
19
+ select id from bp where id = ? or val > ?;
20
+ → [{"id":1},{"id":3}]
21
+
22
+ -- ===================================
23
+ -- Named `:name` in basic SELECT
24
+ -- ===================================
25
+
26
+ -- params: {"id": 2}
27
+ select val from bp where id = :id;
28
+ → [{"val":20}]
29
+
30
+ -- params: {"min": 15, "name": "gamma"}
31
+ select id from bp where val >= :min and name = :name;
32
+ → [{"id":3}]
33
+
34
+ -- Same named parameter referenced twice
35
+ -- params: {"target": 2}
36
+ select id from bp where id = :target or id = :target + 1;
37
+ → [{"id":2},{"id":3}]
38
+
39
+ -- ===================================
40
+ -- Named `$name` in basic SELECT
41
+ -- ===================================
42
+
43
+ -- params: {"id": 3}
44
+ select val from bp where id = $id;
45
+ → [{"val":30}]
46
+
47
+ -- ===================================
48
+ -- Numeric named `:N` and `$N`
49
+ -- ===================================
50
+
51
+ -- params: {"1": 1}
52
+ select val from bp where id = :1;
53
+ → [{"val":10}]
54
+
55
+ -- params: {"1": 2}
56
+ select val from bp where id = $1;
57
+ → [{"val":20}]
58
+
59
+ -- ===================================
60
+ -- Parameter type variation
61
+ -- ===================================
62
+
63
+ -- Integer
64
+ -- params: [10]
65
+ select id from bp where val = ?;
66
+ → [{"id":1}]
67
+
68
+ -- Real
69
+ -- params: [20.0]
70
+ select id from bp where val = ?;
71
+ → [{"id":2}]
72
+
73
+ -- Text
74
+ -- params: ["alpha"]
75
+ select id from bp where name = ?;
76
+ → [{"id":1}]
77
+
78
+ -- NULL
79
+ -- IS-as-equality (val IS ?) is SQLite-only; Quereus restricts IS to IS NULL/IS NOT NULL.
80
+ -- Use explicit null check instead.
81
+ -- params: []
82
+ select id from bp where val is null;
83
+ → [{"id":4}]
84
+
85
+ -- ===================================
86
+ -- Parameter in INSERT / UPDATE / DELETE
87
+ -- ===================================
88
+
89
+ -- params: [5, 50, "epsilon"]
90
+ insert into bp (id, val, name) values (?, ?, ?);
91
+ → []
92
+
93
+ select val, name from bp where id = 5;
94
+ → [{"val":50,"name":"epsilon"}]
95
+
96
+ -- params: [99, 5]
97
+ update bp set val = ? where id = ?;
98
+ → []
99
+
100
+ select val from bp where id = 5;
101
+ → [{"val":99}]
102
+
103
+ -- params: [5]
104
+ delete from bp where id = ?;
105
+ → []
106
+
107
+ select count(*) as cnt from bp where id = 5;
108
+ → [{"cnt":0}]
109
+
110
+ -- ===================================
111
+ -- Parameter in expression contexts
112
+ -- ===================================
113
+
114
+ -- Arithmetic — text-order binding.
115
+ -- Positional `?` bind in SOURCE-TEXT order, NOT plan/resolution order. Here the
116
+ -- projection `?` (first in the text) takes 100 and the WHERE `?` (second) takes 1,
117
+ -- so we boost row id=1 (val 10) by 100. Under the OLD plan-order behaviour the
118
+ -- WHERE `?` would have bound first (=100, no such id) yielding []; this case pins
119
+ -- the text-order contract.
120
+ -- params: [100, 1]
121
+ select val + ? as boosted from bp where id = ?;
122
+ → [{"boosted":110}]
123
+
124
+ -- Discriminator — a projection `?` AND a WHERE `?` whose values differ, so the two
125
+ -- binding orders give visibly different results. Text order: projection `?`=7,
126
+ -- WHERE `?`=2 → boost row id=2 (val 20) → 27. Plan order would bind WHERE first
127
+ -- (=7, no row) → [].
128
+ -- params: [7, 2]
129
+ select val + ? as boosted from bp where id = ?;
130
+ → [{"boosted":27}]
131
+
132
+ -- Projection `?` mixed with a FROM/WHERE `in (?, ?)` — mirrors the codec import/
133
+ -- export shape (a TVF/aggregate projection arg preceding WHERE-list args). Text
134
+ -- order: tag `?`='T', then the in-list `?`s = 1, 3.
135
+ -- params: ["T", 1, 3]
136
+ select ? as tag, id from bp where id in (?, ?) order by id;
137
+ → [{"tag":"T","id":1},{"tag":"T","id":3}]
138
+
139
+ -- Function call
140
+ -- params: ["alp"]
141
+ select id from bp where name like ? || '%';
142
+ → [{"id":1}]
143
+
144
+ -- CASE expression
145
+ -- params: [2]
146
+ select case when id = ? then 'match' else 'miss' end as r from bp order by id;
147
+ → [{"r":"miss"},{"r":"match"},{"r":"miss"},{"r":"miss"}]
148
+
149
+ -- IN list with multiple parameters
150
+ -- params: [1, 3]
151
+ select id from bp where id in (?, ?) order by id;
152
+ → [{"id":1},{"id":3}]
153
+
154
+ -- ===================================
155
+ -- Single-placeholder IN over the PK
156
+ -- ===================================
157
+ -- Regression: `col in (?)` with exactly one placeholder over an indexed/PK column
158
+ -- reduced to a point-seek on Literal(undefined) and degraded to a full-index walk,
159
+ -- so the predicate silently matched (and, for DELETE, wiped) every row. It must
160
+ -- match exactly the bound row. See quereus-single-element-in-list-matches-all.
161
+
162
+ -- params: [2]
163
+ select id from bp where id in (?) order by id;
164
+ → [{"id":2}]
165
+
166
+ -- Re-bound with a different value (the placeholder must not be constant-folded)
167
+ -- params: [3]
168
+ select id from bp where id in (?) order by id;
169
+ → [{"id":3}]
170
+
171
+ -- One-, two-, three-placeholder IN and `= ?` agree on the bound rows
172
+ -- params: [1]
173
+ select id from bp where id = ? order by id;
174
+ → [{"id":1}]
175
+
176
+ -- params: [1, 4]
177
+ select id from bp where id in (?, ?) order by id;
178
+ → [{"id":1},{"id":4}]
179
+
180
+ -- params: [1, 2, 4]
181
+ select id from bp where id in (?, ?, ?) order by id;
182
+ → [{"id":1},{"id":2},{"id":4}]
183
+
184
+ -- A non-matching single placeholder matches nothing (not everything)
185
+ -- params: [99]
186
+ select id from bp where id in (?) order by id;
187
+ → []
188
+
189
+ -- ===================================
190
+ -- Parameter in LIMIT / OFFSET
191
+ -- ===================================
192
+
193
+ -- params: [2]
194
+ select id from bp order by id limit ?;
195
+ → [{"id":1},{"id":2}]
196
+
197
+ -- params: [2, 1]
198
+ select id from bp order by id limit ? offset ?;
199
+ → [{"id":2},{"id":3}]
200
+
201
+ -- ===================================
202
+ -- Repeated execution with different parameter values
203
+ -- ===================================
204
+ -- Same prepared shape, different bind values — verifies parameters are
205
+ -- not constant-folded into the plan.
206
+
207
+ -- params: [1]
208
+ select val from bp where id = ?;
209
+ → [{"val":10}]
210
+
211
+ -- params: [2]
212
+ select val from bp where id = ?;
213
+ → [{"val":20}]
214
+
215
+ -- params: [99]
216
+ select val from bp where id = ?;
217
+ → []
218
+
219
+ -- ===================================
220
+ -- Cleanup
221
+ -- ===================================
222
+
223
+ drop table bp;