@quereus/quereus 4.20.1 → 4.20.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (377) hide show
  1. package/README.md +2 -0
  2. package/package.json +7 -4
  3. package/test/README.md +173 -0
  4. package/test/logic/01-basic.sqllogic +39 -0
  5. package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
  6. package/test/logic/01.2-strings.sqllogic +43 -0
  7. package/test/logic/01.5-insert-select.sqllogic +237 -0
  8. package/test/logic/01.6-update-extras.sqllogic +118 -0
  9. package/test/logic/01.7-update-from.sqllogic +67 -0
  10. package/test/logic/01.8-delete-extras.sqllogic +122 -0
  11. package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
  12. package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
  13. package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
  14. package/test/logic/01.9-query-expr-values.sqllogic +111 -0
  15. package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
  16. package/test/logic/02-filters.sqllogic +54 -0
  17. package/test/logic/02-smoke.sqllogic +62 -0
  18. package/test/logic/02.1-bind-parameters.sqllogic +223 -0
  19. package/test/logic/03-expressions.sqllogic +190 -0
  20. package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
  21. package/test/logic/03.4-defaults.sqllogic +554 -0
  22. package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
  23. package/test/logic/03.5-tvf.sqllogic +61 -0
  24. package/test/logic/03.6-type-system.sqllogic +544 -0
  25. package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
  26. package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
  27. package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
  28. package/test/logic/03.8-not-precedence.sqllogic +255 -0
  29. package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
  30. package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
  31. package/test/logic/04-order-by.sqllogic +38 -0
  32. package/test/logic/04-transactions.sqllogic +239 -0
  33. package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
  34. package/test/logic/05-vtab_memory.sqllogic +50 -0
  35. package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
  36. package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
  37. package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
  38. package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
  39. package/test/logic/06-builtin_functions.sqllogic +149 -0
  40. package/test/logic/06.1-string-functions.sqllogic +92 -0
  41. package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
  42. package/test/logic/06.2-math-functions.sqllogic +82 -0
  43. package/test/logic/06.3-schema.sqllogic +48 -0
  44. package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
  45. package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
  46. package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
  47. package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
  48. package/test/logic/06.3.4-view-info.sqllogic +378 -0
  49. package/test/logic/06.3.5-column-info.sqllogic +347 -0
  50. package/test/logic/06.3.6-schema-views.sqllogic +29 -0
  51. package/test/logic/06.4-schema-search-path.sqllogic +354 -0
  52. package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
  53. package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
  54. package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
  55. package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
  56. package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
  57. package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
  58. package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
  59. package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
  60. package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
  61. package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
  62. package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
  63. package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
  64. package/test/logic/06.7-json-extended.sqllogic +53 -0
  65. package/test/logic/06.8-json-path-operators.sqllogic +99 -0
  66. package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
  67. package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
  68. package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
  69. package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
  70. package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
  71. package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
  72. package/test/logic/07-aggregates.sqllogic +193 -0
  73. package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
  74. package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
  75. package/test/logic/07.3-group-by-extras.sqllogic +602 -0
  76. package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
  77. package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
  78. package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
  79. package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
  80. package/test/logic/07.5-window.sqllogic +1941 -0
  81. package/test/logic/07.5.1-window-named.sqllogic +13 -0
  82. package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
  83. package/test/logic/07.6-subqueries.sqllogic +78 -0
  84. package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
  85. package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
  86. package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
  87. package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
  88. package/test/logic/07.7.1-in-extras.sqllogic +158 -0
  89. package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
  90. package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
  91. package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
  92. package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
  93. package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
  94. package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
  95. package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
  96. package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
  97. package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
  98. package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
  99. package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
  100. package/test/logic/07.9-in-value-list.sqllogic +154 -0
  101. package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
  102. package/test/logic/08-views.sqllogic +64 -0
  103. package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
  104. package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
  105. package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
  106. package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
  107. package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
  108. package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
  109. package/test/logic/09-set_operations.sqllogic +244 -0
  110. package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
  111. package/test/logic/10-distinct_datatypes.sqllogic +127 -0
  112. package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
  113. package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
  114. package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
  115. package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
  116. package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
  117. package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
  118. package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
  119. package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
  120. package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
  121. package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
  122. package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
  123. package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
  124. package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
  125. package/test/logic/10.2-column-features.sqllogic +365 -0
  126. package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
  127. package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
  128. package/test/logic/10.3-function-features.sqllogic +247 -0
  129. package/test/logic/10.4-schema-scale.sqllogic +168 -0
  130. package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
  131. package/test/logic/10.5-indexes.sqllogic +164 -0
  132. package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
  133. package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
  134. package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
  135. package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
  136. package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
  137. package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
  138. package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
  139. package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
  140. package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
  141. package/test/logic/100.1-where-extras.sqllogic +163 -0
  142. package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
  143. package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
  144. package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
  145. package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
  146. package/test/logic/102-unique-constraints.sqllogic +145 -0
  147. package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
  148. package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
  149. package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
  150. package/test/logic/102.2-unique-collation.sqllogic +181 -0
  151. package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
  152. package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
  153. package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
  154. package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
  155. package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
  156. package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
  157. package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
  158. package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
  159. package/test/logic/108-cardinality-estimation.sqllogic +146 -0
  160. package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
  161. package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
  162. package/test/logic/11-joins.sqllogic +86 -0
  163. package/test/logic/11.1-join-using.sqllogic +267 -0
  164. package/test/logic/11.2-comma-join.sqllogic +35 -0
  165. package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
  166. package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
  167. package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
  168. package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
  169. package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
  170. package/test/logic/12-empty-primary-key.sqllogic +124 -0
  171. package/test/logic/12-join_padding_order.sqllogic +58 -0
  172. package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
  173. package/test/logic/13-cte.sqllogic +137 -0
  174. package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
  175. package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
  176. package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
  177. package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
  178. package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
  179. package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
  180. package/test/logic/13.4-cte-extras.sqllogic +98 -0
  181. package/test/logic/13.5-cte-join-order.sqllogic +166 -0
  182. package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
  183. package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
  184. package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
  185. package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
  186. package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
  187. package/test/logic/14-utilities.sqllogic +168 -0
  188. package/test/logic/15-timespan.sqllogic +279 -0
  189. package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
  190. package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
  191. package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
  192. package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
  193. package/test/logic/16-epoch.sqllogic +187 -0
  194. package/test/logic/17-weekday-modifier.sqllogic +78 -0
  195. package/test/logic/18-json-string-escapes.sqllogic +86 -0
  196. package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
  197. package/test/logic/20-empty-single-row.sqllogic +261 -0
  198. package/test/logic/21-null-edge-cases.sqllogic +227 -0
  199. package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
  200. package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
  201. package/test/logic/21.2-between-edges.sqllogic +157 -0
  202. package/test/logic/22-boundary-values.sqllogic +175 -0
  203. package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
  204. package/test/logic/24-builtin-branches.sqllogic +611 -0
  205. package/test/logic/24.1-substr-extras.sqllogic +75 -0
  206. package/test/logic/24.2-random-extras.sqllogic +39 -0
  207. package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
  208. package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
  209. package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
  210. package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
  211. package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
  212. package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
  213. package/test/logic/26-join-edge-cases.sqllogic +333 -0
  214. package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
  215. package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
  216. package/test/logic/26.3-join-on-constants.sqllogic +61 -0
  217. package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
  218. package/test/logic/27-window-edge-cases.sqllogic +206 -0
  219. package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
  220. package/test/logic/27.2-window-exclude.sqllogic +13 -0
  221. package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
  222. package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
  223. package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
  224. package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
  225. package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
  226. package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
  227. package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
  228. package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
  229. package/test/logic/40-constraints.sqllogic +418 -0
  230. package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
  231. package/test/logic/40.2-check-extras.sqllogic +683 -0
  232. package/test/logic/41-alter-table.sqllogic +191 -0
  233. package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
  234. package/test/logic/41-fk-cross-schema.sqllogic +155 -0
  235. package/test/logic/41-fk-extended-targets.sqllogic +173 -0
  236. package/test/logic/41-foreign-keys.sqllogic +1001 -0
  237. package/test/logic/41-generated-column-errors.sqllogic +225 -0
  238. package/test/logic/41-generated-column-extras.sqllogic +598 -0
  239. package/test/logic/41-generated-column-scope.sqllogic +329 -0
  240. package/test/logic/41-generated-columns.sqllogic +361 -0
  241. package/test/logic/41.1-alter-pk.sqllogic +230 -0
  242. package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
  243. package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
  244. package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
  245. package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
  246. package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
  247. package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
  248. package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
  249. package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
  250. package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
  251. package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
  252. package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
  253. package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
  254. package/test/logic/41.2-alter-column.sqllogic +382 -0
  255. package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
  256. package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
  257. package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
  258. package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
  259. package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
  260. package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
  261. package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
  262. package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
  263. package/test/logic/41.5-alter-misc.sqllogic +48 -0
  264. package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
  265. package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
  266. package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
  267. package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
  268. package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
  269. package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
  270. package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
  271. package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
  272. package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
  273. package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
  274. package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
  275. package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
  276. package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
  277. package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
  278. package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
  279. package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
  280. package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
  281. package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
  282. package/test/logic/42-committed-snapshot.sqllogic +254 -0
  283. package/test/logic/42-returning.sqllogic +159 -0
  284. package/test/logic/42.1-returning-extras.sqllogic +232 -0
  285. package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
  286. package/test/logic/43-default-nullability.sqllogic +131 -0
  287. package/test/logic/43-transition-constraints.sqllogic +341 -0
  288. package/test/logic/43.1-default-collation.sqllogic +140 -0
  289. package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
  290. package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
  291. package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
  292. package/test/logic/44-determinism-validation.sqllogic +164 -0
  293. package/test/logic/44-orthogonality.sqllogic +146 -0
  294. package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
  295. package/test/logic/45-udf-determinism.sqllogic +39 -0
  296. package/test/logic/46-mutation-context.sqllogic +595 -0
  297. package/test/logic/47-upsert.sqllogic +255 -0
  298. package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
  299. package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
  300. package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
  301. package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
  302. package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
  303. package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
  304. package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
  305. package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
  306. package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
  307. package/test/logic/49-reference-graph.sqllogic +84 -0
  308. package/test/logic/50-declarative-schema.sqllogic +2550 -0
  309. package/test/logic/50-metadata-tags.sqllogic +1033 -0
  310. package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
  311. package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
  312. package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
  313. package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +173 -0
  314. package/test/logic/50.3-declare-schema-duplicate-names.sqllogic +280 -0
  315. package/test/logic/50.4-declare-schema-apply-restore.sqllogic +192 -0
  316. package/test/logic/51-lens-foundation.sqllogic +147 -0
  317. package/test/logic/51-materialized-views.sqllogic +376 -0
  318. package/test/logic/51.5-materialized-views-coarsened-key.sqllogic +198 -0
  319. package/test/logic/51.7-maintained-table-attach-detach.sqllogic +468 -0
  320. package/test/logic/51.8-maintained-table-declared-constraints.sqllogic +440 -0
  321. package/test/logic/51.85-maintained-table-parent-fk.sqllogic +103 -0
  322. package/test/logic/51.9-maintained-table-secondary-unique.sqllogic +237 -0
  323. package/test/logic/51.9.1-maintained-table-partial-unique.sqllogic +36 -0
  324. package/test/logic/52-lens-overrides.sqllogic +566 -0
  325. package/test/logic/53-materialized-views-rowtime.sqllogic +1601 -0
  326. package/test/logic/53-reserved-tags.sqllogic +252 -0
  327. package/test/logic/53.1-materialized-view-write-through.sqllogic +329 -0
  328. package/test/logic/53.2-materialized-view-rename-propagation.sqllogic +483 -0
  329. package/test/logic/53.3-materialized-view-constraint-only-ddl.sqllogic +409 -0
  330. package/test/logic/53.3.1-materialized-view-index-ddl-irrelevance.sqllogic +29 -0
  331. package/test/logic/53.4-materialized-view-structural-alter-restore.sqllogic +436 -0
  332. package/test/logic/54-covering-mv-enforcement.sqllogic +314 -0
  333. package/test/logic/54.1-covering-mv-partial-enforcement.sqllogic +34 -0
  334. package/test/logic/55-internal-eviction-reporting.sqllogic +89 -0
  335. package/test/logic/55-lens-prover.sqllogic +202 -0
  336. package/test/logic/55.1-eviction-restrict-fk.sqllogic +148 -0
  337. package/test/logic/55.5-lens-authored-inverse.sqllogic +1468 -0
  338. package/test/logic/80-grow-retrieve-pass.sqllogic +79 -0
  339. package/test/logic/81-quickpick.sqllogic +24 -0
  340. package/test/logic/82-bloom-join.sqllogic +185 -0
  341. package/test/logic/83-merge-join.sqllogic +280 -0
  342. package/test/logic/84-asof-scan.sqllogic +238 -0
  343. package/test/logic/84-key-cardinality.sqllogic +50 -0
  344. package/test/logic/85-relational-const-folding.sqllogic +51 -0
  345. package/test/logic/86-scalar-cse.sqllogic +42 -0
  346. package/test/logic/90-error_paths.sqllogic +114 -0
  347. package/test/logic/90.1-parse-errors.sqllogic +77 -0
  348. package/test/logic/90.2-alter-table-errors.sqllogic +53 -0
  349. package/test/logic/90.2.1-alter-extra-errors.sqllogic +51 -0
  350. package/test/logic/90.3-expression-errors.sqllogic +43 -0
  351. package/test/logic/90.4-dml-errors.sqllogic +47 -0
  352. package/test/logic/90.5-unsupported-join-types.sqllogic +37 -0
  353. package/test/logic/90.5.1-right-full-join-read.sqllogic +157 -0
  354. package/test/logic/90.6-select-error-paths.sqllogic +57 -0
  355. package/test/logic/91-merge-join-edge-cases.sqllogic +159 -0
  356. package/test/logic/92-hash-aggregate-edge-cases.sqllogic +139 -0
  357. package/test/logic/93-ddl-view-edge-cases.sqllogic +104 -0
  358. package/test/logic/93.1-view-error-paths.sqllogic +74 -0
  359. package/test/logic/93.2-view-mutation-pending.sqllogic +108 -0
  360. package/test/logic/93.3-view-mutation-or-clause.sqllogic +60 -0
  361. package/test/logic/93.4-view-mutation.sqllogic +4881 -0
  362. package/test/logic/93.4.1-view-mutation-partial-unique-cardinality.sqllogic +31 -0
  363. package/test/logic/93.5-authored-inverse.sqllogic +415 -0
  364. package/test/logic/93.6-set-op-flagless-write.sqllogic +862 -0
  365. package/test/logic/94-tvf-edge-cases.sqllogic +58 -0
  366. package/test/logic/94.1-limit-offset-edge-cases.sqllogic +109 -0
  367. package/test/logic/94.2-limit-offset-extras.sqllogic +98 -0
  368. package/test/logic/95-assertions.sqllogic +1417 -0
  369. package/test/logic/96-subquery-edge-cases.sqllogic +276 -0
  370. package/test/logic/97-json-function-edge-cases.sqllogic +633 -0
  371. package/test/logic/97.1-json-blob-and-special-values.sqllogic +92 -0
  372. package/test/logic/98-temporal-edge-cases.sqllogic +515 -0
  373. package/test/logic/99-conversion-edge-cases.sqllogic +325 -0
  374. package/test/logic/99.0.1-schema-index-listing.sqllogic +21 -0
  375. package/test/logic/99.1-cast-syntax-extras.sqllogic +167 -0
  376. package/test/logic/drop-unique-index.sqllogic +88 -0
  377. package/test/logic/pushdown-test.sqllogic +36 -0
@@ -0,0 +1,118 @@
1
+ -- adapted from SQLite test/update.test, test/update2.test
2
+ -- UPDATE feature variants beyond the simple form covered in 01-basic / 42-returning.
3
+ -- Quereus has no rowids, no UPDATE LIMIT/ORDER BY, no INDEXED BY.
4
+
5
+ -- ===================================
6
+ -- 1. UPDATE all rows (no WHERE)
7
+ -- ===================================
8
+
9
+ create table all_rows (id integer primary key, status text);
10
+ insert into all_rows values (1, 'pending'), (2, 'pending'), (3, 'pending');
11
+
12
+ update all_rows set status = 'complete';
13
+
14
+ select count(*) as cnt from all_rows where status = 'complete';
15
+ → [{"cnt":3}]
16
+
17
+ drop table all_rows;
18
+
19
+ -- ===================================
20
+ -- 2. UPDATE with subquery in SET (scalar subquery)
21
+ -- ===================================
22
+
23
+ create table src_lookup (id integer primary key, val text);
24
+ create table tgt_lookup (id integer primary key, name text null);
25
+ insert into src_lookup values (1, 'alpha'), (2, 'beta');
26
+ insert into tgt_lookup values (1, null), (2, null);
27
+
28
+ update tgt_lookup set name = (select val from src_lookup where src_lookup.id = tgt_lookup.id);
29
+ select id, name from tgt_lookup order by id;
30
+ → [{"id":1,"name":"alpha"},{"id":2,"name":"beta"}]
31
+
32
+ drop table tgt_lookup;
33
+ drop table src_lookup;
34
+
35
+ -- ===================================
36
+ -- 3. UPDATE with multiple columns in SET, mixed expressions
37
+ -- ===================================
38
+
39
+ create table multi_set (id integer primary key, x integer, y integer);
40
+ insert into multi_set values (1, 10, 20), (2, 30, 40);
41
+
42
+ update multi_set set x = x + 1, y = y * 2 where id = 1;
43
+
44
+ select id, x, y from multi_set order by id;
45
+ → [{"id":1,"x":11,"y":40},{"id":2,"x":30,"y":40}]
46
+
47
+ drop table multi_set;
48
+
49
+ -- ===================================
50
+ -- 4. UPDATE with column-list assignment from subquery: (a, b) = (select x, y)
51
+ -- ===================================
52
+
53
+ create table col_list (id integer primary key, a text, b text);
54
+ insert into col_list values (1, 'x', 'y');
55
+
56
+ -- column-list SET assignment is not supported by the parser
57
+ update col_list set (a, b) = (select 'new_a', 'new_b') where id = 1;
58
+ -- error: Expected column name
59
+
60
+ drop table col_list;
61
+
62
+ -- ===================================
63
+ -- 5. UPDATE with NOT condition in WHERE
64
+ -- ===================================
65
+
66
+ create table neg_pred (id integer primary key, n integer);
67
+ insert into neg_pred values (1, 10), (2, 20), (3, 30), (4, 40), (5, 50);
68
+
69
+ update neg_pred set n = 0 where not (id <= 3);
70
+
71
+ select id, n from neg_pred order by id;
72
+ → [{"id":1,"n":10},{"id":2,"n":20},{"id":3,"n":30},{"id":4,"n":0},{"id":5,"n":0}]
73
+
74
+ drop table neg_pred;
75
+
76
+ -- ===================================
77
+ -- 6. UPDATE with OR conditions in WHERE
78
+ -- ===================================
79
+
80
+ create table or_pred (id integer primary key, a integer, b integer);
81
+ insert into or_pred values (1, 5, 100), (2, 10, 50), (3, 50, 5), (4, 1, 1);
82
+
83
+ update or_pred set a = a + 1000 where a > 8 or b > 80;
84
+
85
+ select id, a from or_pred order by id;
86
+ → [{"id":1,"a":1005},{"id":2,"a":1010},{"id":3,"a":1050},{"id":4,"a":1}]
87
+
88
+ drop table or_pred;
89
+
90
+ -- ===================================
91
+ -- 7. UPDATE on PRIMARY KEY column (key change)
92
+ -- ===================================
93
+
94
+ create table pk_change (id integer primary key, name text);
95
+ insert into pk_change values (1, 'one'), (2, 'two');
96
+
97
+ update pk_change set id = 99 where name = 'two';
98
+
99
+ select id, name from pk_change order by id;
100
+ → [{"id":1,"name":"one"},{"id":99,"name":"two"}]
101
+
102
+ drop table pk_change;
103
+
104
+ -- ===================================
105
+ -- 8. UPDATE assigning the same column twice is rejected (no silent last-wins)
106
+ -- ===================================
107
+
108
+ create table dup_set (id integer primary key, b integer);
109
+ insert into dup_set values (1, 10);
110
+
111
+ update dup_set set b = 1, b = 2 where id = 1;
112
+ -- error: duplicate assignment
113
+
114
+ -- the rejected UPDATE made no change.
115
+ select id, b from dup_set order by id;
116
+ → [{"id":1,"b":10}]
117
+
118
+ drop table dup_set;
@@ -0,0 +1,67 @@
1
+ -- UPDATE ... FROM (PostgreSQL/SQLite-3.33+ syntax) is not supported by Quereus.
2
+ -- The parser rejects the FROM clause after SET. This file pins that rejection.
3
+
4
+ -- ===================================
5
+ -- 1. UPDATE ... FROM single table (basic equi-join) — not supported
6
+ -- ===================================
7
+
8
+ create table tgt (id integer primary key, val text);
9
+ create table src (id integer primary key, newval text);
10
+ insert into tgt values (1, 'old1'), (2, 'old2'), (3, 'unchanged');
11
+ insert into src values (1, 'new1'), (2, 'new2');
12
+
13
+ update tgt set val = src.newval from src where tgt.id = src.id;
14
+ -- error: Expected statement type
15
+
16
+ drop table src;
17
+ drop table tgt;
18
+
19
+ -- ===================================
20
+ -- 2. UPDATE ... FROM with subquery in FROM — not supported
21
+ -- ===================================
22
+
23
+ create table grades (student_id integer primary key, total integer);
24
+ create table scores (id integer primary key, student_id integer, exam integer);
25
+ insert into grades values (1, 0), (2, 0), (3, 0);
26
+ insert into scores values (1, 1, 80), (2, 1, 90), (3, 2, 75), (4, 2, 85), (5, 3, 60);
27
+
28
+ update grades set total = s.tot
29
+ from (select student_id, sum(exam) as tot from scores group by student_id) s
30
+ where grades.student_id = s.student_id;
31
+ -- error: Expected statement type
32
+
33
+ drop table scores;
34
+ drop table grades;
35
+
36
+ -- ===================================
37
+ -- 3. UPDATE ... FROM with CTE — not supported
38
+ -- ===================================
39
+
40
+ create table sales (id integer primary key, amount integer, multiplier real null);
41
+ insert into sales values (1, 100, null), (2, 200, null), (3, 300, null);
42
+
43
+ with mult(id, m) as (values (1, 1.5), (2, 2.0), (3, 3.0))
44
+ update sales set multiplier = mult.m from mult where sales.id = mult.id;
45
+ -- error: Expected statement type
46
+
47
+ drop table sales;
48
+
49
+ -- ===================================
50
+ -- 4. UPDATE ... FROM with multi-table join in FROM — not supported
51
+ -- ===================================
52
+
53
+ create table emp (id integer primary key, dept_id integer, salary integer);
54
+ create table dept (id integer primary key, region_id integer);
55
+ create table region (id integer primary key, bonus_pct integer);
56
+ insert into emp values (1, 10, 1000), (2, 10, 2000), (3, 20, 3000);
57
+ insert into dept values (10, 100), (20, 200);
58
+ insert into region values (100, 10), (200, 20);
59
+
60
+ update emp set salary = salary + (salary * region.bonus_pct / 100)
61
+ from dept, region
62
+ where emp.dept_id = dept.id and dept.region_id = region.id;
63
+ -- error: Expected statement type
64
+
65
+ drop table region;
66
+ drop table dept;
67
+ drop table emp;
@@ -0,0 +1,122 @@
1
+ -- adapted from SQLite test/delete.test, test/delete4.test
2
+ -- DELETE feature variants beyond the simple form covered in 01-basic / 02-smoke.
3
+ -- Quereus has no rowids and no DELETE LIMIT/ORDER BY; the rowid-bound DELETE
4
+ -- variants from SQLite are n/a — the multi-row delete via PK is the surface here.
5
+
6
+ -- ===================================
7
+ -- 1. DELETE with EXISTS subquery
8
+ -- ===================================
9
+
10
+ create table del_parent (id integer primary key, val text);
11
+ create table del_child (id integer primary key, parent_id integer);
12
+ insert into del_parent values (1, 'a'), (2, 'b'), (3, 'c');
13
+ insert into del_child values (10, 1), (20, 2);
14
+
15
+ delete from del_parent where exists (select 1 from del_child where del_child.parent_id = del_parent.id);
16
+ select id, val from del_parent order by id;
17
+ → [{"id":3,"val":"c"}]
18
+
19
+ drop table del_child;
20
+ drop table del_parent;
21
+
22
+ -- ===================================
23
+ -- 2. DELETE with NOT EXISTS subquery
24
+ -- ===================================
25
+
26
+ create table orders (id integer primary key, customer_id integer);
27
+ create table customers (id integer primary key, active integer);
28
+ insert into customers values (1, 1), (2, 0);
29
+ insert into orders values (10, 1), (20, 1), (30, 2);
30
+
31
+ delete from orders where not exists (select 1 from customers where customers.id = orders.customer_id and customers.active = 1);
32
+ select id, customer_id from orders order by id;
33
+ → [{"id":10,"customer_id":1},{"id":20,"customer_id":1}]
34
+
35
+ drop table orders;
36
+ drop table customers;
37
+
38
+ -- ===================================
39
+ -- 3. DELETE with NOT condition in WHERE
40
+ -- ===================================
41
+
42
+ create table del_neg (vkey integer primary key, c1 integer);
43
+ insert into del_neg values (1, 10), (2, 20), (3, 30), (4, 40), (5, 50);
44
+
45
+ delete from del_neg where not (vkey <= 3);
46
+
47
+ select vkey from del_neg order by vkey;
48
+ → [{"vkey":1},{"vkey":2},{"vkey":3}]
49
+
50
+ drop table del_neg;
51
+
52
+ -- ===================================
53
+ -- 4. DELETE with OR conditions across columns
54
+ -- ===================================
55
+
56
+ create table del_or (id integer primary key, a text, b text);
57
+ insert into del_or values (1, 'one', 'i'), (2, 'two', 'ii'), (3, 'three', 'iii'), (4, 'four', 'iv');
58
+
59
+ delete from del_or where a = 'two' or b = 'iv';
60
+
61
+ select id from del_or order by id;
62
+ → [{"id":1},{"id":3}]
63
+
64
+ drop table del_or;
65
+
66
+ -- ===================================
67
+ -- 5. DELETE with multi-column AND on non-PK columns
68
+ -- ===================================
69
+
70
+ create table inventory (id integer primary key, loc text not null, sku text not null, qty integer);
71
+ insert into inventory values (1, 'W1', 'A1', 10), (2, 'W1', 'A2', 20), (3, 'W2', 'A1', 30);
72
+
73
+ delete from inventory where loc = 'W1' and sku = 'A1';
74
+
75
+ select id from inventory order by id;
76
+ → [{"id":2},{"id":3}]
77
+
78
+ drop table inventory;
79
+
80
+ -- ===================================
81
+ -- 6. DELETE with self-referential EXISTS (delete rows that have a "next" sibling)
82
+ -- ===================================
83
+
84
+ create table seq (x integer primary key);
85
+ insert into seq values (1), (2), (3), (4), (5);
86
+
87
+ delete from seq where exists (select 1 from seq as s2 where s2.x = seq.x + 1);
88
+ select x from seq order by x;
89
+ → [{"x":5}]
90
+
91
+ drop table seq;
92
+
93
+ -- ===================================
94
+ -- 7. DELETE all rows from a composite-PK table
95
+ -- ===================================
96
+
97
+ create table comp_pk (a integer, b integer, val text, primary key (a, b));
98
+ insert into comp_pk values (1, 2, 'p'), (1, 3, 'q'), (2, 4, 'r'), (3, 5, 's');
99
+
100
+ delete from comp_pk;
101
+
102
+ select count(*) as cnt from comp_pk;
103
+ → [{"cnt":0}]
104
+
105
+ drop table comp_pk;
106
+
107
+ -- ===================================
108
+ -- 8. DELETE with subquery driving the IN list
109
+ -- ===================================
110
+
111
+ create table flag_table (id integer primary key, flag integer);
112
+ create table data_table (id integer primary key, val text);
113
+ insert into flag_table values (1, 0), (2, 1), (3, 0), (4, 1);
114
+ insert into data_table values (1, 'a'), (2, 'b'), (3, 'c'), (4, 'd');
115
+
116
+ delete from data_table where id in (select id from flag_table where flag = 1);
117
+
118
+ select id, val from data_table order by id;
119
+ → [{"id":1,"val":"a"},{"id":3,"val":"c"}]
120
+
121
+ drop table flag_table;
122
+ drop table data_table;
@@ -0,0 +1,115 @@
1
+ -- Regression for the silent under-delete on a non-front-anchored range DELETE.
2
+ -- Root cause was an inheritree copy-on-write delete bug: deleting a key that triggers
3
+ -- a sibling borrow/merge during rebalance orphaned the freshly-cloned node, dropping
4
+ -- deletions and producing phantom-repeated keys. See delete-range-predicate-under-deletes.
5
+ --
6
+ -- A front-anchored `id <= k` delete only ever merges/borrows with a RIGHT sibling and so
7
+ -- dodged the bug; these cases therefore use tail / interleaved / between predicates, and
8
+ -- a table big enough (n = 200, well past the 64-entry node capacity) that the delete set
9
+ -- forces a real b-tree structural change mid-delete.
10
+ --
11
+ -- Each case asserts matched == deleted via the surviving count, and guards against the
12
+ -- phantom-repeated-key corruption two ways: count(*) == count(distinct id), and a
13
+ -- payload-integrity probe (`v` must equal `id * 10` for every surviving row — a phantom
14
+ -- alias would surface a mismatched payload).
15
+
16
+ -- ===================================
17
+ -- 1. Tail predicate: delete id > 100
18
+ -- ===================================
19
+
20
+ create table cow_tail (id integer primary key, v integer);
21
+ insert into cow_tail select value, value * 10 from generate_series(1, 200);
22
+
23
+ delete from cow_tail where id > 100;
24
+
25
+ select count(*) as cnt, count(distinct id) as dist, min(id) as mn, max(id) as mx, sum(id) as s from cow_tail;
26
+ → [{"cnt":100,"dist":100,"mn":1,"mx":100,"s":5050}]
27
+
28
+ -- No survivor carries a mismatched payload (phantom alias guard).
29
+ select count(*) as bad from cow_tail where v <> id * 10;
30
+ → [{"bad":0}]
31
+
32
+ -- Every deleted key is actually gone.
33
+ select count(*) as still_there from cow_tail where id > 100;
34
+ → [{"still_there":0}]
35
+
36
+ drop table cow_tail;
37
+
38
+ -- ===================================
39
+ -- 2. Interleaved predicate: delete id % 2 = 0
40
+ -- ===================================
41
+
42
+ create table cow_even (id integer primary key, v integer);
43
+ insert into cow_even select value, value * 10 from generate_series(1, 200);
44
+
45
+ delete from cow_even where id % 2 = 0;
46
+
47
+ -- Survivors are the 100 odd ids 1,3,..,199; sum of first 100 odds = 100^2 = 10000.
48
+ select count(*) as cnt, count(distinct id) as dist, min(id) as mn, max(id) as mx, sum(id) as s from cow_even;
49
+ → [{"cnt":100,"dist":100,"mn":1,"mx":199,"s":10000}]
50
+
51
+ select count(*) as bad from cow_even where v <> id * 10;
52
+ → [{"bad":0}]
53
+
54
+ -- No surviving id is even.
55
+ select count(*) as evens_left from cow_even where id % 2 = 0;
56
+ → [{"evens_left":0}]
57
+
58
+ drop table cow_even;
59
+
60
+ -- ===================================
61
+ -- 3. Between predicate: delete id between 51 and 150
62
+ -- ===================================
63
+
64
+ create table cow_band (id integer primary key, v integer);
65
+ insert into cow_band select value, value * 10 from generate_series(1, 200);
66
+
67
+ delete from cow_band where id between 51 and 150;
68
+
69
+ -- Survivors are 1..50 and 151..200 (100 rows); sum = 20100 - sum(51..150) = 20100 - 10050.
70
+ select count(*) as cnt, count(distinct id) as dist, min(id) as mn, max(id) as mx, sum(id) as s from cow_band;
71
+ → [{"cnt":100,"dist":100,"mn":1,"mx":200,"s":10050}]
72
+
73
+ select count(*) as bad from cow_band where v <> id * 10;
74
+ → [{"bad":0}]
75
+
76
+ -- The whole deleted band is gone.
77
+ select count(*) as band_left from cow_band where id between 51 and 150;
78
+ → [{"band_left":0}]
79
+
80
+ drop table cow_band;
81
+
82
+ -- ===================================
83
+ -- 4. Scattered predicate: delete id % 3 = 0 (66 keys spread across the tree)
84
+ -- ===================================
85
+
86
+ create table cow_third (id integer primary key, v integer);
87
+ insert into cow_third select value, value * 10 from generate_series(1, 200);
88
+
89
+ delete from cow_third where id % 3 = 0;
90
+
91
+ -- 66 multiples of 3 in 1..200 are removed, leaving 134.
92
+ select count(*) as cnt, count(distinct id) as dist from cow_third;
93
+ → [{"cnt":134,"dist":134}]
94
+
95
+ select count(*) as bad from cow_third where v <> id * 10;
96
+ → [{"bad":0}]
97
+
98
+ select count(*) as thirds_left from cow_third where id % 3 = 0;
99
+ → [{"thirds_left":0}]
100
+
101
+ drop table cow_third;
102
+
103
+ -- ===================================
104
+ -- 5. No-match predicate over a large table is a clean no-op
105
+ -- ===================================
106
+
107
+ create table cow_nomatch (id integer primary key, v integer);
108
+ insert into cow_nomatch select value, value * 10 from generate_series(1, 200);
109
+
110
+ delete from cow_nomatch where id > 1000;
111
+
112
+ select count(*) as cnt, count(distinct id) as dist, sum(id) as s from cow_nomatch;
113
+ → [{"cnt":200,"dist":200,"s":20100}]
114
+
115
+ drop table cow_nomatch;
@@ -0,0 +1,32 @@
1
+ -- query-expr-dml-gates.sqllogic — pins the remaining gates around DML in
2
+ -- relation positions after the dml-in-expression-position ticket landed.
3
+ --
4
+ -- The parser-side gate (DML in a non-top-level relation position must carry
5
+ -- RETURNING) survives untouched. The planner-side gate that blocked DML in
6
+ -- scalar / IN / EXISTS / compound-leg / CTE-body positions is gone — those
7
+ -- positions now execute under full-drain + run-once semantics (see the
8
+ -- companion 01.9-query-expr-dml.sqllogic file for executable cases).
9
+ -- The only remaining planner-side gate is "DML as a view body", which is
10
+ -- permanently rejected (a view re-evaluates per reference; replaying writes
11
+ -- on every read is incoherent with view semantics).
12
+
13
+ create table t (id integer primary key, name text);
14
+
15
+ -- ===================================
16
+ -- Parser-side gate: DML in a relation position without RETURNING
17
+ -- ===================================
18
+
19
+ select * from (insert into t values (1, 'a')) as s;
20
+ -- error: must have a RETURNING clause
21
+
22
+ select 1 + (insert into t values (2, 'b'));
23
+ -- error: must have a RETURNING clause
24
+
25
+ -- ===================================
26
+ -- Planner-side gate: DML as a view body is rejected at creation time
27
+ -- ===================================
28
+
29
+ create view v_dml as insert into t values (6, 'f') returning id;
30
+ -- error: cannot be used as a view body
31
+
32
+ drop table t;
@@ -0,0 +1,171 @@
1
+ -- query-expr-dml.sqllogic — exercises DML with RETURNING in every relation
2
+ -- position that the dml-in-expression-position ticket unlocked: scalar / IN /
3
+ -- EXISTS / compound-leg / CTE-body / FROM-source / INSERT-source.
4
+ --
5
+ -- Two contracts the emitters apply on impure (DML-bearing) inners:
6
+ -- - full-drain: every row of the inner is consumed, so every write fires
7
+ -- (no short-circuit on first row, on match, or on EXISTS=true).
8
+ -- - run-once: when an outer expression is re-evaluated (correlated
9
+ -- subquery / per-row scan), the inner DML executes exactly once per
10
+ -- statement execution. The memoized result is replayed thereafter.
11
+
12
+ -- ===================================
13
+ -- 1. EXISTS over a DML inner: fully drains (no short-circuit on first row)
14
+ -- ===================================
15
+
16
+ create table log_e (v integer);
17
+ select exists (insert into log_e values (1), (2), (3) returning v);
18
+ → [{"exists (insert into log_e values (1), (2), (3) returning v)":true}]
19
+ select count(*) as c from log_e;
20
+ → [{"c":3}]
21
+ drop table log_e;
22
+
23
+ -- ===================================
24
+ -- 2. IN over a DML inner: fully drains (no short-circuit on first match)
25
+ -- ===================================
26
+
27
+ create table log_i (v integer);
28
+ select 1 in (insert into log_i values (1), (2), (3) returning v) as found;
29
+ → [{"found":true}]
30
+ select count(*) as c from log_i;
31
+ → [{"c":3}]
32
+ drop table log_i;
33
+
34
+ -- ===================================
35
+ -- 3. Scalar subquery over a DML inner: drains every row, scalar = first
36
+ -- ===================================
37
+
38
+ create table log_s (v integer);
39
+ select (insert into log_s values (10), (20), (30) returning v) as first_v;
40
+ → [{"first_v":10}]
41
+ select count(*) as c, sum(v) as total from log_s;
42
+ → [{"c":3,"total":60}]
43
+ drop table log_s;
44
+
45
+ -- ===================================
46
+ -- 4. Run-once fence: correlated outer evaluating per row fires DML once
47
+ -- ===================================
48
+ -- Without the run-once fence the EXISTS inner would re-fire per outer row.
49
+ -- With it, the inner DML runs exactly once regardless of outer cardinality.
50
+
51
+ create table outer_t (o integer);
52
+ insert into outer_t values (1), (2), (3), (4), (5);
53
+ create table log_o (v integer);
54
+
55
+ select o, exists (insert into log_o values (100) returning v) as ex
56
+ from outer_t order by o;
57
+ → [{"o":1,"ex":true},{"o":2,"ex":true},{"o":3,"ex":true},{"o":4,"ex":true},{"o":5,"ex":true}]
58
+ select count(*) as c from log_o;
59
+ → [{"c":1}]
60
+ drop table outer_t;
61
+ drop table log_o;
62
+
63
+ -- ===================================
64
+ -- 5. DML in a compound-set leg: VALUES UNION ALL (insert … returning …)
65
+ -- ===================================
66
+
67
+ create table log_c (v integer);
68
+ values (1) union all (insert into log_c values (2) returning v);
69
+ → [{"column_0":1},{"column_0":2}]
70
+ select v from log_c;
71
+ → [{"v":2}]
72
+ drop table log_c;
73
+
74
+ -- ===================================
75
+ -- 6. DML in a CTE body
76
+ -- ===================================
77
+
78
+ create table log_cte (v integer);
79
+ with x(v) as (insert into log_cte values (1), (2) returning v)
80
+ select v from x order by v;
81
+ → [{"v":1},{"v":2}]
82
+ select count(*) as c from log_cte;
83
+ → [{"c":2}]
84
+ drop table log_cte;
85
+
86
+ -- ===================================
87
+ -- 7. DML as INSERT source (outer insert consumes inner RETURNING rows)
88
+ -- ===================================
89
+
90
+ create table src_t (v integer);
91
+ create table dst_t (v integer);
92
+ insert into src_t values (10), (20), (30);
93
+ insert into dst_t insert into src_t values (1), (2) returning v;
94
+ select v from dst_t order by v;
95
+ → [{"v":1},{"v":2}]
96
+ select v from src_t order by v;
97
+ → [{"v":1},{"v":2},{"v":10},{"v":20},{"v":30}]
98
+ drop table src_t;
99
+ drop table dst_t;
100
+
101
+ -- ===================================
102
+ -- 8. Conflict-resolution scoping: outer OR REPLACE does NOT propagate inward
103
+ -- ===================================
104
+ -- The outer INSERT's OR REPLACE applies only to the outer's conflicts. The
105
+ -- inner INSERT carries its own (default) conflict resolution. We pin this by
106
+ -- running an inner INSERT whose values would conflict with a pre-existing row
107
+ -- in the inner table; the inner must error with its own default (ABORT),
108
+ -- regardless of the outer OR REPLACE.
109
+
110
+ create table inner_pk (id integer primary key, v text);
111
+ create table outer_pk (id integer primary key, v text);
112
+ insert into inner_pk values (1, 'pre');
113
+
114
+ insert or replace into outer_pk
115
+ insert into inner_pk values (1, 'dup') returning id, v;
116
+ -- error: constraint
117
+
118
+ select v from inner_pk where id = 1;
119
+ → [{"v":"pre"}]
120
+ drop table inner_pk;
121
+ drop table outer_pk;
122
+
123
+ -- ===================================
124
+ -- 8b. UPDATE in EXISTS position fires its writes (parallel to case 1)
125
+ -- ===================================
126
+
127
+ create table upd_e (id integer primary key, v integer);
128
+ insert into upd_e values (1, 10), (2, 20), (3, 30);
129
+ select exists (update upd_e set v = v + 1 returning v) as ex;
130
+ → [{"ex":true}]
131
+ select v from upd_e order by id;
132
+ → [{"v":11},{"v":21},{"v":31}]
133
+ drop table upd_e;
134
+
135
+ -- ===================================
136
+ -- 8c. DELETE as scalar subquery returns the deleted row's value
137
+ -- ===================================
138
+ -- Single-row DELETE keeps the scalar deterministic without relying on order
139
+ -- of returned rows for multi-row DML in scalar position.
140
+
141
+ create table del_s (id integer primary key, v integer);
142
+ insert into del_s values (1, 100), (2, 200), (3, 300);
143
+ select (delete from del_s where id = 2 returning v) as deleted;
144
+ → [{"deleted":200}]
145
+ select v from del_s order by id;
146
+ → [{"v":100},{"v":300}]
147
+ drop table del_s;
148
+
149
+ -- ===================================
150
+ -- 9. View bodied as VALUES is unupdateable (FD-driven path)
151
+ -- ===================================
152
+
153
+ create view v_vals as values (1, 'a'), (2, 'b');
154
+ select * from v_vals order by column_0;
155
+ → [{"column_0":1,"column_1":"a"},{"column_0":2,"column_1":"b"}]
156
+ insert into v_vals values (3, 'c');
157
+ -- error:
158
+ drop view v_vals;
159
+
160
+ -- ===================================
161
+ -- 10. DML in CHECK constraint is rejected by the determinism enforcer
162
+ -- ===================================
163
+ -- Constraint validation is lazy (built on first INSERT planning), so the
164
+ -- CREATE TABLE itself succeeds; the INSERT triggers the determinism check.
165
+
166
+ create table src_d (v integer);
167
+ create table t_check (id integer primary key, x integer check ((select v from (insert into src_d values (1) returning v)) is not null));
168
+ insert into t_check values (1, 1);
169
+ -- error: non-deterministic
170
+ drop table t_check;
171
+ drop table src_d;