@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,566 @@
1
+ -- ALTER TABLE ADD COLUMN ... GENERATED ALWAYS AS backfills the existing rows.
2
+ --
3
+ -- A generated column's value is a pure function of its row, so adding one to a
4
+ -- populated table must compute it for the rows that are already there — the same
5
+ -- value the identical declaration in CREATE TABLE would produce, and the same value
6
+ -- a fresh INSERT produces afterwards. Anything the recomputation cannot honour
7
+ -- (NOT NULL left NULL, an inline CHECK violated) rejects the whole ALTER and leaves
8
+ -- the table exactly as it was.
9
+ --
10
+ -- Runs under both the memory module (`yarn test`) and the store module
11
+ -- (`yarn test:store`).
12
+
13
+ -- ============================================================
14
+ -- 1. Every spelling backfills: bare, VIRTUAL, STORED
15
+ --
16
+ -- VIRTUAL and STORED are not distinguished by this engine — a generated column's
17
+ -- value is materialized at write time either way — so all three must agree.
18
+ -- ============================================================
19
+
20
+ create table t_bare (id integer primary key, v integer);
21
+ insert into t_bare values (1, 5);
22
+ -- run
23
+
24
+ alter table t_bare add column g integer generated always as (v * 2);
25
+ -- run
26
+
27
+ -- Row 2 arrives AFTER the ALTER, through the ordinary write path. The backfilled
28
+ -- row and the inserted row must agree.
29
+ insert into t_bare (id, v) values (2, 7);
30
+ -- run
31
+
32
+ select id, v, g from t_bare order by id;
33
+ → [{"id":1,"v":5,"g":10},{"id":2,"v":7,"g":14}]
34
+
35
+ drop table t_bare;
36
+ -- run
37
+
38
+ create table t_virtual (id integer primary key, v integer);
39
+ insert into t_virtual values (1, 5);
40
+ -- run
41
+
42
+ alter table t_virtual add column g integer null generated always as (v * 2) virtual;
43
+ -- run
44
+
45
+ insert into t_virtual (id, v) values (2, 7);
46
+ -- run
47
+
48
+ select id, v, g from t_virtual order by id;
49
+ → [{"id":1,"v":5,"g":10},{"id":2,"v":7,"g":14}]
50
+
51
+ drop table t_virtual;
52
+ -- run
53
+
54
+ create table t_stored (id integer primary key, v integer);
55
+ insert into t_stored values (1, 5);
56
+ -- run
57
+
58
+ alter table t_stored add column g integer null generated always as (v * 2) stored;
59
+ -- run
60
+
61
+ insert into t_stored (id, v) values (2, 7);
62
+ -- run
63
+
64
+ select id, v, g from t_stored order by id;
65
+ → [{"id":1,"v":5,"g":10},{"id":2,"v":7,"g":14}]
66
+
67
+ -- The column reports as generated in the catalog (1 = VIRTUAL, 2 = STORED). The
68
+ -- distinction is informational only — both spellings materialize at write time.
69
+ select name, "generated" from table_info('t_stored') where name = 'g';
70
+ → [{"name":"g","generated":2}]
71
+
72
+ drop table t_stored;
73
+ -- run
74
+
75
+ -- ============================================================
76
+ -- 2. A constant generated expression still backfills
77
+ --
78
+ -- A generated column has no DEFAULT to bulk-write, so the literal-folding
79
+ -- shortcut the DEFAULT path takes must NOT apply here — folding it would leave
80
+ -- every existing row NULL.
81
+ -- ============================================================
82
+
83
+ create table t_const (id integer primary key, v integer);
84
+ insert into t_const values (1, 5);
85
+ -- run
86
+
87
+ alter table t_const add column g integer null generated always as (2);
88
+ -- run
89
+
90
+ insert into t_const (id, v) values (2, 7);
91
+ -- run
92
+
93
+ select id, g from t_const order by id;
94
+ → [{"id":1,"g":2},{"id":2,"g":2}]
95
+
96
+ drop table t_const;
97
+ -- run
98
+
99
+ -- ============================================================
100
+ -- 3. A generated expression over an existing generated column
101
+ --
102
+ -- `h` is already materialized in every stored row, so `g` reads it during the
103
+ -- backfill exactly as it would during an INSERT.
104
+ -- ============================================================
105
+
106
+ create table t_chain (id integer primary key, v integer, h integer generated always as (v + 1));
107
+ insert into t_chain (id, v) values (1, 5);
108
+ -- run
109
+
110
+ alter table t_chain add column g integer null generated always as (h * 10);
111
+ -- run
112
+
113
+ insert into t_chain (id, v) values (2, 7);
114
+ -- run
115
+
116
+ select id, v, h, g from t_chain order by id;
117
+ → [{"id":1,"v":5,"h":6,"g":60},{"id":2,"v":7,"h":8,"g":80}]
118
+
119
+ drop table t_chain;
120
+ -- run
121
+
122
+ -- ============================================================
123
+ -- 4. Type conversion: the backfilled cell matches what an INSERT stores
124
+ -- ============================================================
125
+
126
+ create table t_coerce (id integer primary key, v text);
127
+ insert into t_coerce values (1, '7');
128
+ -- run
129
+
130
+ alter table t_coerce add column g integer null generated always as (v || '0');
131
+ -- run
132
+
133
+ insert into t_coerce (id, v) values (2, '2');
134
+ -- run
135
+
136
+ select id, g, typeof(g) as t from t_coerce order by id;
137
+ → [{"id":1,"g":70,"t":"integer"},{"id":2,"g":20,"t":"integer"}]
138
+
139
+ drop table t_coerce;
140
+ -- run
141
+
142
+ -- ============================================================
143
+ -- 5. NOT NULL generated: accepted when the expression is total ...
144
+ -- ============================================================
145
+
146
+ create table t_nn (id integer primary key, v integer);
147
+ insert into t_nn values (1, 5), (2, 7);
148
+ -- run
149
+
150
+ alter table t_nn add column g integer not null generated always as (v * 2);
151
+ -- run
152
+
153
+ insert into t_nn (id, v) values (3, 9);
154
+ -- run
155
+
156
+ select id, g from t_nn order by id;
157
+ → [{"id":1,"g":10},{"id":2,"g":14},{"id":3,"g":18}]
158
+
159
+ drop table t_nn;
160
+ -- run
161
+
162
+ -- ... and rejected, table untouched, when it yields NULL for an existing row.
163
+ create table t_nn_bad (id integer primary key, v integer null);
164
+ insert into t_nn_bad values (1, 5), (2, null);
165
+ -- run
166
+
167
+ alter table t_nn_bad add column g integer not null generated always as (v * 2);
168
+ -- error: NOT NULL constraint failed
169
+
170
+ -- The ALTER was reverted whole: the column is gone and the rows are unchanged.
171
+ select * from t_nn_bad order by id;
172
+ → [{"id":1,"v":5},{"id":2,"v":null}]
173
+
174
+ drop table t_nn_bad;
175
+ -- run
176
+
177
+ -- ============================================================
178
+ -- 6. An inline CHECK over the new column is enforced per backfilled row
179
+ --
180
+ -- Before the backfill existed the CHECK saw NULL and `not (null > 100)` is NULL,
181
+ -- so the violation went unnoticed. With a real value the ALTER must reject.
182
+ -- ============================================================
183
+
184
+ create table t_check (id integer primary key, v integer);
185
+ insert into t_check values (1, 5);
186
+ -- run
187
+
188
+ alter table t_check add column g integer null generated always as (v * 2) check (g > 100);
189
+ -- error: CHECK constraint failed
190
+
191
+ select * from t_check order by id;
192
+ → [{"id":1,"v":5}]
193
+
194
+ -- The same declaration whose values satisfy the CHECK is accepted.
195
+ alter table t_check add column g integer null generated always as (v * 2) check (g > 0);
196
+ -- run
197
+
198
+ select id, g from t_check order by id;
199
+ → [{"id":1,"g":10}]
200
+
201
+ drop table t_check;
202
+ -- run
203
+
204
+ -- ============================================================
205
+ -- 7. A non-deterministic generated expression is rejected at ALTER time
206
+ --
207
+ -- Matches the DEFAULT arm, which validates at plan-build regardless of row count,
208
+ -- rather than deferring the failure to the next INSERT.
209
+ -- ============================================================
210
+
211
+ create table t_nondet (id integer primary key, v integer);
212
+ insert into t_nondet values (1, 5);
213
+ -- run
214
+
215
+ alter table t_nondet add column g integer null generated always as (random());
216
+ -- error: Non-deterministic expression not allowed in GENERATED ALWAYS AS
217
+
218
+ select * from t_nondet order by id;
219
+ → [{"id":1,"v":5}]
220
+
221
+ drop table t_nondet;
222
+ -- run
223
+
224
+ -- Empty table: same rejection, so DDL acceptance does not depend on the data.
225
+ create table t_nondet_empty (id integer primary key, v integer);
226
+ -- run
227
+
228
+ alter table t_nondet_empty add column g integer null generated always as (random());
229
+ -- error: Non-deterministic expression not allowed in GENERATED ALWAYS AS
230
+
231
+ drop table t_nondet_empty;
232
+ -- run
233
+
234
+ -- ============================================================
235
+ -- 8. A bad generated expression is reported the way CREATE TABLE reports it
236
+ --
237
+ -- The expression is compiled against a scope holding only the EXISTING columns, so
238
+ -- without a pre-flight an unknown name — or the new column's own name — would surface
239
+ -- as a bare "Column not found". Both must keep naming the generated column.
240
+ -- ============================================================
241
+
242
+ create table t_badref (id integer primary key, v integer);
243
+ insert into t_badref values (1, 5);
244
+ -- run
245
+
246
+ alter table t_badref add column g integer null generated always as (nope * 2);
247
+ -- error: Column 'nope' referenced by generated column 'g' not found in table 't_badref'
248
+
249
+ alter table t_badref add column g integer null generated always as (g + 1);
250
+ -- error: Cyclic dependency in generated columns: 'g'
251
+
252
+ select * from t_badref order by id;
253
+ → [{"id":1,"v":5}]
254
+
255
+ drop table t_badref;
256
+ -- run
257
+
258
+ -- ============================================================
259
+ -- 9. The declarative route (declare schema + apply schema)
260
+ --
261
+ -- The differ emits the same ADD COLUMN through the same emitter, so a generated
262
+ -- column declared onto a populated table backfills identically.
263
+ -- ============================================================
264
+
265
+ declare schema main {
266
+ table t_decl {
267
+ id INTEGER PRIMARY KEY,
268
+ v INTEGER
269
+ }
270
+ }
271
+ -- run
272
+
273
+ apply schema main;
274
+ -- run
275
+
276
+ insert into t_decl values (1, 5);
277
+ -- run
278
+
279
+ declare schema main {
280
+ table t_decl {
281
+ id INTEGER PRIMARY KEY,
282
+ v INTEGER,
283
+ g INTEGER NULL GENERATED ALWAYS AS (v * 2)
284
+ }
285
+ }
286
+ -- run
287
+
288
+ apply schema main;
289
+ -- run
290
+
291
+ insert into t_decl (id, v) values (2, 7);
292
+ -- run
293
+
294
+ select id, v, g from t_decl order by id;
295
+ → [{"id":1,"v":5,"g":10},{"id":2,"v":7,"g":14}]
296
+
297
+ drop table t_decl;
298
+ -- run
299
+
300
+ -- ============================================================
301
+ -- 10. Rows staged in the open transaction backfill too
302
+ --
303
+ -- The ALTER runs while the transaction holds an uncommitted row. Both the committed
304
+ -- row and the staged one must carry the computed value, and the staged row must
305
+ -- still commit. (Memory stages in its transaction layers, the store in the isolation
306
+ -- overlay; both run the same evaluator over the staged rows.)
307
+ -- ============================================================
308
+
309
+ create table t_staged (id integer primary key, v integer);
310
+ insert into t_staged values (1, 5);
311
+ -- run
312
+
313
+ begin;
314
+ -- run
315
+
316
+ insert into t_staged values (2, 7);
317
+ -- run
318
+
319
+ alter table t_staged add column g integer null generated always as (v * 2);
320
+ -- run
321
+
322
+ select id, v, g from t_staged order by id;
323
+ → [{"id":1,"v":5,"g":10},{"id":2,"v":7,"g":14}]
324
+
325
+ insert into t_staged (id, v) values (3, 9);
326
+ -- run
327
+
328
+ commit;
329
+ -- run
330
+
331
+ select id, v, g from t_staged order by id;
332
+ → [{"id":1,"v":5,"g":10},{"id":2,"v":7,"g":14},{"id":3,"v":9,"g":18}]
333
+
334
+ drop table t_staged;
335
+ -- run
336
+
337
+ -- ============================================================
338
+ -- 11. An inline UNIQUE over the new column sees the backfilled values
339
+ --
340
+ -- The constraint-install loop runs after the backfill, so the covering structure is
341
+ -- built over real computed values — distinct ones are accepted, colliding ones reject
342
+ -- the whole ALTER.
343
+ -- ============================================================
344
+
345
+ create table t_uniq (id integer primary key, v integer);
346
+ insert into t_uniq values (1, 5), (2, 6);
347
+ -- run
348
+
349
+ alter table t_uniq add column g integer null generated always as (v * 2) unique;
350
+ -- run
351
+
352
+ select id, g from t_uniq order by id;
353
+ → [{"id":1,"g":10},{"id":2,"g":12}]
354
+
355
+ drop table t_uniq;
356
+ -- run
357
+
358
+ create table t_uniq_bad (id integer primary key, v integer);
359
+ insert into t_uniq_bad values (1, 5), (2, 5);
360
+ -- run
361
+
362
+ alter table t_uniq_bad add column g integer null generated always as (v * 2) unique;
363
+ -- error: UNIQUE constraint failed
364
+
365
+ -- Reverted whole: the column is gone and the rows are unchanged.
366
+ select * from t_uniq_bad order by id;
367
+ → [{"id":1,"v":5},{"id":2,"v":5}]
368
+
369
+ drop table t_uniq_bad;
370
+ -- run
371
+
372
+ -- ============================================================
373
+ -- 12. A generated column whose name is already taken is a DUPLICATE, not a cycle
374
+ --
375
+ -- The self-reference rejection in section 8 must not swallow this: `v` here resolves
376
+ -- to the existing sibling, and the real problem is that the table already has a `v`.
377
+ -- ============================================================
378
+
379
+ create table t_dup (id integer primary key, v integer);
380
+ insert into t_dup values (1, 5);
381
+ -- run
382
+
383
+ alter table t_dup add column v integer null generated always as (v * 2);
384
+ -- error: Column 'v' already exists in table 't_dup'
385
+
386
+ alter table t_dup add column v integer null generated always as (id + 1);
387
+ -- error: Column 'v' already exists in table 't_dup'
388
+
389
+ select * from t_dup order by id;
390
+ → [{"id":1,"v":5}]
391
+
392
+ drop table t_dup;
393
+ -- run
394
+
395
+ -- ============================================================
396
+ -- 13. The added column is a first-class generated column afterwards
397
+ --
398
+ -- Backfilling is only half the job: the ALTER must also register the column in the
399
+ -- table's generated-column graph, so UPDATEing a source column recomputes it and
400
+ -- writing to it directly is refused — exactly as for a CREATE TABLE-declared one.
401
+ -- ============================================================
402
+
403
+ create table t_after (id integer primary key, v integer);
404
+ insert into t_after values (1, 5);
405
+ -- run
406
+
407
+ alter table t_after add column g integer null generated always as (v * 2);
408
+ -- run
409
+
410
+ update t_after set v = 20 where id = 1;
411
+ -- run
412
+
413
+ select id, v, g from t_after order by id;
414
+ → [{"id":1,"v":20,"g":40}]
415
+
416
+ update t_after set g = 1 where id = 1;
417
+ -- error: Cannot UPDATE generated column 'g'
418
+
419
+ insert into t_after (id, v, g) values (2, 3, 99);
420
+ -- error: Cannot INSERT into generated column 'g'
421
+
422
+ select id, v, g from t_after order by id;
423
+ → [{"id":1,"v":20,"g":40}]
424
+
425
+ drop table t_after;
426
+ -- run
427
+
428
+ -- ============================================================
429
+ -- 14. Every accepted spelling backfills AND stays writable afterwards
430
+ --
431
+ -- The declaration this ALTER accepts must be one every subsequent INSERT accepts:
432
+ -- the backfill and the write path compile the same stored body, through the same
433
+ -- builder (`planner/building/generated-column-scope.ts`). `new.<col>` is the arm
434
+ -- that used to break — the ALTER accepted it and backfilled correctly, and then
435
+ -- every INSERT afterwards failed with `new.<col> isn't a column`, leaving a table
436
+ -- that could never gain another row.
437
+ --
438
+ -- Each arm: backfill an existing row, insert a new one, update the source column.
439
+ -- All three must agree. The CREATE TABLE side of the same matrix lives in
440
+ -- 41-generated-columns.sqllogic.
441
+ -- ============================================================
442
+
443
+ create table t_sp_bare (id integer primary key, a integer);
444
+ insert into t_sp_bare values (1, 3);
445
+ -- run
446
+
447
+ alter table t_sp_bare add column g integer generated always as (a + 1);
448
+ -- run
449
+
450
+ insert into t_sp_bare (id, a) values (2, 5);
451
+ update t_sp_bare set a = 10 where id = 1;
452
+ -- run
453
+
454
+ select id, a, g from t_sp_bare order by id;
455
+ → [{"id":1,"a":10,"g":11},{"id":2,"a":5,"g":6}]
456
+
457
+ drop table t_sp_bare;
458
+ -- run
459
+
460
+ create table t_sp_tbl (id integer primary key, a integer);
461
+ insert into t_sp_tbl values (1, 3);
462
+ -- run
463
+
464
+ alter table t_sp_tbl add column g integer generated always as (t_sp_tbl.a + 1);
465
+ -- run
466
+
467
+ insert into t_sp_tbl (id, a) values (2, 5);
468
+ update t_sp_tbl set a = 10 where id = 1;
469
+ -- run
470
+
471
+ select id, a, g from t_sp_tbl order by id;
472
+ → [{"id":1,"a":10,"g":11},{"id":2,"a":5,"g":6}]
473
+
474
+ drop table t_sp_tbl;
475
+ -- run
476
+
477
+ create table t_sp_sch (id integer primary key, a integer);
478
+ insert into t_sp_sch values (1, 3);
479
+ -- run
480
+
481
+ alter table t_sp_sch add column g integer generated always as (main.t_sp_sch.a + 1);
482
+ -- run
483
+
484
+ insert into t_sp_sch (id, a) values (2, 5);
485
+ update t_sp_sch set a = 10 where id = 1;
486
+ -- run
487
+
488
+ select id, a, g from t_sp_sch order by id;
489
+ → [{"id":1,"a":10,"g":11},{"id":2,"a":5,"g":6}]
490
+
491
+ drop table t_sp_sch;
492
+ -- run
493
+
494
+ create table t_sp_new (id integer primary key, a integer);
495
+ insert into t_sp_new values (1, 3);
496
+ -- run
497
+
498
+ alter table t_sp_new add column g integer generated always as (new.a + 1);
499
+ -- run
500
+
501
+ insert into t_sp_new (id, a) values (2, 5);
502
+ update t_sp_new set a = 10 where id = 1;
503
+ -- run
504
+
505
+ select id, a, g from t_sp_new order by id;
506
+ → [{"id":1,"a":10,"g":11},{"id":2,"a":5,"g":6}]
507
+
508
+ drop table t_sp_new;
509
+ -- run
510
+
511
+ -- ============================================================
512
+ -- 15. A second ADD COLUMN reading the first added generated column
513
+ --
514
+ -- `new.g1` names the freshly computed g1, exactly as a bare `g1` does — at
515
+ -- backfill time and on every write afterwards.
516
+ -- ============================================================
517
+
518
+ create table t_sp_chain (id integer primary key, a integer);
519
+ insert into t_sp_chain values (1, 5);
520
+ -- run
521
+
522
+ alter table t_sp_chain add column g1 integer generated always as (a * 2);
523
+ alter table t_sp_chain add column g2 integer generated always as (new.g1 + 1);
524
+ -- run
525
+
526
+ select id, a, g1, g2 from t_sp_chain order by id;
527
+ → [{"id":1,"a":5,"g1":10,"g2":11}]
528
+
529
+ insert into t_sp_chain (id, a) values (2, 7);
530
+ update t_sp_chain set a = 10 where id = 1;
531
+ -- run
532
+
533
+ select id, a, g1, g2 from t_sp_chain order by id;
534
+ → [{"id":1,"a":10,"g1":20,"g2":21},{"id":2,"a":7,"g1":14,"g2":15}]
535
+
536
+ drop table t_sp_chain;
537
+ -- run
538
+
539
+ -- ============================================================
540
+ -- 16. A declared COLLATE applies inside a backfilled generated body
541
+ --
542
+ -- The backfill compiles the body through the same builder the write paths use,
543
+ -- which resolves each column reference at its DECLARED type — collation
544
+ -- included. So an existing row backfills by the same comparison a later INSERT
545
+ -- computes with.
546
+ -- ============================================================
547
+
548
+ create table t_sp_coll (id integer primary key, a text collate nocase);
549
+ insert into t_sp_coll values (1, 'abc');
550
+ -- run
551
+
552
+ alter table t_sp_coll add column g integer generated always as (case when a = 'ABC' then 1 else 0 end);
553
+ -- run
554
+
555
+ select id, a, g from t_sp_coll order by id;
556
+ → [{"id":1,"a":"abc","g":1}]
557
+
558
+ insert into t_sp_coll (id, a) values (2, 'AbC');
559
+ insert into t_sp_coll (id, a) values (3, 'abd');
560
+ -- run
561
+
562
+ select id, g from t_sp_coll order by id;
563
+ → [{"id":1,"g":1},{"id":2,"g":1},{"id":3,"g":0}]
564
+
565
+ drop table t_sp_coll;
566
+ -- run
@@ -0,0 +1,129 @@
1
+ -- ALTER TABLE ADD COLUMN's DEFAULT / GENERATED ALWAYS AS / inline CHECK may read another
2
+ -- table (a correlated or uncorrelated subquery), and the backfill still runs per row.
3
+ --
4
+ -- Regression for bug-alter-add-column-relation-default-fails-to-emit: `AlterTableNode`
5
+ -- held the backfill and CHECK expressions off the child-node graph the optimizer walks
6
+ -- (`getChildren()`/`withChildren()`), so a subquery inside either reached the runtime
7
+ -- unphysicalized and the whole ALTER errored — a simple expression default (nothing to
8
+ -- rewrite) worked, so this was invisible until the default read another table.
9
+ --
10
+ -- Runs under both the memory module (`yarn test`) and the store module (`yarn
11
+ -- test:store`).
12
+
13
+ create table d (k integer);
14
+ insert into d values (1);
15
+ -- run
16
+
17
+ create table a1 (id integer primary key);
18
+ insert into a1 values (1);
19
+ -- run
20
+
21
+ -- 1. Uncorrelated aggregate subquery DEFAULT.
22
+ alter table a1 add column w integer default (select count(*) from d);
23
+ -- run
24
+
25
+ select id, w from a1 order by id;
26
+ → [{"id":1,"w":1}]
27
+
28
+ -- 2. Uncorrelated scalar subquery DEFAULT (LIMIT 1).
29
+ alter table a1 add column x integer default ((select k from d limit 1));
30
+ -- run
31
+
32
+ select id, x from a1 order by id;
33
+ → [{"id":1,"x":1}]
34
+
35
+ -- 3. GENERATED ALWAYS AS over a subquery — always a per-row backfill (a generated
36
+ -- column has no `defaultValue` for the module to bulk-write).
37
+ alter table a1 add column g integer generated always as ((select count(*) from d));
38
+ -- run
39
+
40
+ select id, g from a1 order by id;
41
+ → [{"id":1,"g":1}]
42
+
43
+ -- 4. A per-row DEFAULT (`new.id`) with an inline CHECK that itself reads another
44
+ -- table — accepted when the CHECK passes.
45
+ alter table a1 add column z integer default (new.id) check ((select count(*) from d) = 1);
46
+ -- run
47
+
48
+ select id, z from a1 order by id;
49
+ → [{"id":1,"z":1}]
50
+
51
+ -- 5. Same shape, CHECK fails against the backfilled row — the whole ALTER is
52
+ -- rejected and the table is left exactly as it was (no `zz` column).
53
+ alter table a1 add column zz integer default (new.id) check ((select count(*) from d) = 99);
54
+ -- error: CHECK constraint failed
55
+
56
+ select * from a1 order by id;
57
+ → [{"id":1,"w":1,"x":1,"g":1,"z":1}]
58
+
59
+ drop table a1;
60
+ -- run
61
+
62
+ -- ===== Multi-row, correlated =====
63
+ -- Every arm above has a single existing row, so it cannot tell a genuine per-row
64
+ -- evaluation from one evaluation replayed for every row. These use three rows and a
65
+ -- subquery correlated to the row being backfilled, so a once-only (or cached) evaluation
66
+ -- shows up as three identical values.
67
+
68
+ create table dd (k integer, v integer);
69
+ insert into dd values (1, 10), (2, 20), (3, 30);
70
+ -- run
71
+
72
+ create table a2 (id integer primary key);
73
+ insert into a2 values (1), (2), (3);
74
+ -- run
75
+
76
+ -- 6. Correlated subquery DEFAULT — a distinct value per existing row.
77
+ alter table a2 add column w integer default ((select v from dd where dd.k = new.id limit 1));
78
+ -- run
79
+
80
+ select id, w from a2 order by id;
81
+ → [{"id":1,"w":10},{"id":2,"w":20},{"id":3,"w":30}]
82
+
83
+ -- 7. Correlated subquery inside the CHECK, evaluated against each backfilled row.
84
+ alter table a2 add column x integer default (new.id) check ((select v from dd where dd.k = new.id limit 1) = new.id * 10);
85
+ -- run
86
+
87
+ select id, x from a2 order by id;
88
+ → [{"id":1,"x":1},{"id":2,"x":2},{"id":3,"x":3}]
89
+
90
+ -- 8. TWO inline CHECKs alongside the backfill — three optimizer children, so the
91
+ -- emitter's slot cursor (backfill, then each predicate in order) has to walk past more
92
+ -- than one predicate. The SECOND one fails, which a slot-order bug would misreport.
93
+ alter table a2 add column yy integer default (new.id) check ((select count(*) from dd) = 3) check ((select v from dd where dd.k = new.id limit 1) = 999);
94
+ -- error: CHECK constraint failed
95
+
96
+ -- 9. Same two CHECKs, both true — accepted.
97
+ alter table a2 add column y integer default (new.id) check ((select count(*) from dd) = 3) check ((select v from dd where dd.k = new.id limit 1) = new.id * 10);
98
+ -- run
99
+
100
+ select id, y from a2 order by id;
101
+ → [{"id":1,"y":1},{"id":2,"y":2},{"id":3,"y":3}]
102
+
103
+ -- 10. GENERATED ALWAYS AS over a correlated subquery, inner reference QUALIFIED (`dd.v`).
104
+ alter table a2 add column g integer generated always as ((select dd.v from dd where dd.k = id limit 1));
105
+ -- run
106
+
107
+ select id, g from a2 order by id;
108
+ → [{"id":1,"g":10},{"id":2,"g":20},{"id":3,"g":30}]
109
+
110
+ -- 11. Same shape, inner reference UNQUALIFIED (`v`): the subquery's own FROM binds it,
111
+ -- so the generated-column reference analysis leaves it to that source instead of
112
+ -- reading it as a (missing) column of this table.
113
+ alter table a2 add column h integer generated always as ((select v from dd where dd.k = id limit 1));
114
+ -- run
115
+
116
+ select id, h from a2 order by id;
117
+ → [{"id":1,"h":10},{"id":2,"h":20},{"id":3,"h":30}]
118
+
119
+ select * from a2 order by id;
120
+ → [{"id":1,"w":10,"x":1,"y":1,"g":10,"h":10},{"id":2,"w":20,"x":2,"y":2,"g":20,"h":20},{"id":3,"w":30,"x":3,"y":3,"g":30,"h":30}]
121
+
122
+ drop table a2;
123
+ -- run
124
+
125
+ drop table dd;
126
+ -- run
127
+
128
+ drop table d;
129
+ -- run