@quereus/quereus 4.20.0 → 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 (400) hide show
  1. package/README.md +2 -0
  2. package/dist/src/common/types.d.ts +4 -4
  3. package/dist/src/index.d.ts +1 -1
  4. package/dist/src/index.d.ts.map +1 -1
  5. package/dist/src/index.js +3 -2
  6. package/dist/src/index.js.map +1 -1
  7. package/dist/src/schema/catalog-rendering.js +13 -1
  8. package/dist/src/schema/catalog-rendering.js.map +1 -1
  9. package/dist/src/schema/catalog.d.ts +35 -2
  10. package/dist/src/schema/catalog.d.ts.map +1 -1
  11. package/dist/src/schema/catalog.js +42 -33
  12. package/dist/src/schema/catalog.js.map +1 -1
  13. package/dist/src/schema/schema-differ.d.ts +1 -1
  14. package/dist/src/schema/schema-differ.d.ts.map +1 -1
  15. package/dist/src/schema/schema-differ.js +195 -33
  16. package/dist/src/schema/schema-differ.js.map +1 -1
  17. package/dist/src/schema/unique-enforcement.d.ts +23 -1
  18. package/dist/src/schema/unique-enforcement.d.ts.map +1 -1
  19. package/dist/src/schema/unique-enforcement.js +43 -1
  20. package/dist/src/schema/unique-enforcement.js.map +1 -1
  21. package/dist/src/vtab/memory/layer/manager.d.ts +15 -12
  22. package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
  23. package/dist/src/vtab/memory/layer/manager.js +87 -100
  24. package/dist/src/vtab/memory/layer/manager.js.map +1 -1
  25. package/package.json +7 -4
  26. package/test/README.md +173 -0
  27. package/test/logic/01-basic.sqllogic +39 -0
  28. package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
  29. package/test/logic/01.2-strings.sqllogic +43 -0
  30. package/test/logic/01.5-insert-select.sqllogic +237 -0
  31. package/test/logic/01.6-update-extras.sqllogic +118 -0
  32. package/test/logic/01.7-update-from.sqllogic +67 -0
  33. package/test/logic/01.8-delete-extras.sqllogic +122 -0
  34. package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
  35. package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
  36. package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
  37. package/test/logic/01.9-query-expr-values.sqllogic +111 -0
  38. package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
  39. package/test/logic/02-filters.sqllogic +54 -0
  40. package/test/logic/02-smoke.sqllogic +62 -0
  41. package/test/logic/02.1-bind-parameters.sqllogic +223 -0
  42. package/test/logic/03-expressions.sqllogic +190 -0
  43. package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
  44. package/test/logic/03.4-defaults.sqllogic +554 -0
  45. package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
  46. package/test/logic/03.5-tvf.sqllogic +61 -0
  47. package/test/logic/03.6-type-system.sqllogic +544 -0
  48. package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
  49. package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
  50. package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
  51. package/test/logic/03.8-not-precedence.sqllogic +255 -0
  52. package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
  53. package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
  54. package/test/logic/04-order-by.sqllogic +38 -0
  55. package/test/logic/04-transactions.sqllogic +239 -0
  56. package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
  57. package/test/logic/05-vtab_memory.sqllogic +50 -0
  58. package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
  59. package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
  60. package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
  61. package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
  62. package/test/logic/06-builtin_functions.sqllogic +149 -0
  63. package/test/logic/06.1-string-functions.sqllogic +92 -0
  64. package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
  65. package/test/logic/06.2-math-functions.sqllogic +82 -0
  66. package/test/logic/06.3-schema.sqllogic +48 -0
  67. package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
  68. package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
  69. package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
  70. package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
  71. package/test/logic/06.3.4-view-info.sqllogic +378 -0
  72. package/test/logic/06.3.5-column-info.sqllogic +347 -0
  73. package/test/logic/06.3.6-schema-views.sqllogic +29 -0
  74. package/test/logic/06.4-schema-search-path.sqllogic +354 -0
  75. package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
  76. package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
  77. package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
  78. package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
  79. package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
  80. package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
  81. package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
  82. package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
  83. package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
  84. package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
  85. package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
  86. package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
  87. package/test/logic/06.7-json-extended.sqllogic +53 -0
  88. package/test/logic/06.8-json-path-operators.sqllogic +99 -0
  89. package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
  90. package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
  91. package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
  92. package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
  93. package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
  94. package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
  95. package/test/logic/07-aggregates.sqllogic +193 -0
  96. package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
  97. package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
  98. package/test/logic/07.3-group-by-extras.sqllogic +602 -0
  99. package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
  100. package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
  101. package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
  102. package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
  103. package/test/logic/07.5-window.sqllogic +1941 -0
  104. package/test/logic/07.5.1-window-named.sqllogic +13 -0
  105. package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
  106. package/test/logic/07.6-subqueries.sqllogic +78 -0
  107. package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
  108. package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
  109. package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
  110. package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
  111. package/test/logic/07.7.1-in-extras.sqllogic +158 -0
  112. package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
  113. package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
  114. package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
  115. package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
  116. package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
  117. package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
  118. package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
  119. package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
  120. package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
  121. package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
  122. package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
  123. package/test/logic/07.9-in-value-list.sqllogic +154 -0
  124. package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
  125. package/test/logic/08-views.sqllogic +64 -0
  126. package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
  127. package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
  128. package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
  129. package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
  130. package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
  131. package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
  132. package/test/logic/09-set_operations.sqllogic +244 -0
  133. package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
  134. package/test/logic/10-distinct_datatypes.sqllogic +127 -0
  135. package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
  136. package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
  137. package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
  138. package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
  139. package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
  140. package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
  141. package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
  142. package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
  143. package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
  144. package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
  145. package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
  146. package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
  147. package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
  148. package/test/logic/10.2-column-features.sqllogic +365 -0
  149. package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
  150. package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
  151. package/test/logic/10.3-function-features.sqllogic +247 -0
  152. package/test/logic/10.4-schema-scale.sqllogic +168 -0
  153. package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
  154. package/test/logic/10.5-indexes.sqllogic +164 -0
  155. package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
  156. package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
  157. package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
  158. package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
  159. package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
  160. package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
  161. package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
  162. package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
  163. package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
  164. package/test/logic/100.1-where-extras.sqllogic +163 -0
  165. package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
  166. package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
  167. package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
  168. package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
  169. package/test/logic/102-unique-constraints.sqllogic +145 -0
  170. package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
  171. package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
  172. package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
  173. package/test/logic/102.2-unique-collation.sqllogic +181 -0
  174. package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
  175. package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
  176. package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
  177. package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
  178. package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
  179. package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
  180. package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
  181. package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
  182. package/test/logic/108-cardinality-estimation.sqllogic +146 -0
  183. package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
  184. package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
  185. package/test/logic/11-joins.sqllogic +86 -0
  186. package/test/logic/11.1-join-using.sqllogic +267 -0
  187. package/test/logic/11.2-comma-join.sqllogic +35 -0
  188. package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
  189. package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
  190. package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
  191. package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
  192. package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
  193. package/test/logic/12-empty-primary-key.sqllogic +124 -0
  194. package/test/logic/12-join_padding_order.sqllogic +58 -0
  195. package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
  196. package/test/logic/13-cte.sqllogic +137 -0
  197. package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
  198. package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
  199. package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
  200. package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
  201. package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
  202. package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
  203. package/test/logic/13.4-cte-extras.sqllogic +98 -0
  204. package/test/logic/13.5-cte-join-order.sqllogic +166 -0
  205. package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
  206. package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
  207. package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
  208. package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
  209. package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
  210. package/test/logic/14-utilities.sqllogic +168 -0
  211. package/test/logic/15-timespan.sqllogic +279 -0
  212. package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
  213. package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
  214. package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
  215. package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
  216. package/test/logic/16-epoch.sqllogic +187 -0
  217. package/test/logic/17-weekday-modifier.sqllogic +78 -0
  218. package/test/logic/18-json-string-escapes.sqllogic +86 -0
  219. package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
  220. package/test/logic/20-empty-single-row.sqllogic +261 -0
  221. package/test/logic/21-null-edge-cases.sqllogic +227 -0
  222. package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
  223. package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
  224. package/test/logic/21.2-between-edges.sqllogic +157 -0
  225. package/test/logic/22-boundary-values.sqllogic +175 -0
  226. package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
  227. package/test/logic/24-builtin-branches.sqllogic +611 -0
  228. package/test/logic/24.1-substr-extras.sqllogic +75 -0
  229. package/test/logic/24.2-random-extras.sqllogic +39 -0
  230. package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
  231. package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
  232. package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
  233. package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
  234. package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
  235. package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
  236. package/test/logic/26-join-edge-cases.sqllogic +333 -0
  237. package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
  238. package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
  239. package/test/logic/26.3-join-on-constants.sqllogic +61 -0
  240. package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
  241. package/test/logic/27-window-edge-cases.sqllogic +206 -0
  242. package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
  243. package/test/logic/27.2-window-exclude.sqllogic +13 -0
  244. package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
  245. package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
  246. package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
  247. package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
  248. package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
  249. package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
  250. package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
  251. package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
  252. package/test/logic/40-constraints.sqllogic +418 -0
  253. package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
  254. package/test/logic/40.2-check-extras.sqllogic +683 -0
  255. package/test/logic/41-alter-table.sqllogic +191 -0
  256. package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
  257. package/test/logic/41-fk-cross-schema.sqllogic +155 -0
  258. package/test/logic/41-fk-extended-targets.sqllogic +173 -0
  259. package/test/logic/41-foreign-keys.sqllogic +1001 -0
  260. package/test/logic/41-generated-column-errors.sqllogic +225 -0
  261. package/test/logic/41-generated-column-extras.sqllogic +598 -0
  262. package/test/logic/41-generated-column-scope.sqllogic +329 -0
  263. package/test/logic/41-generated-columns.sqllogic +361 -0
  264. package/test/logic/41.1-alter-pk.sqllogic +230 -0
  265. package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
  266. package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
  267. package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
  268. package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
  269. package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
  270. package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
  271. package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
  272. package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
  273. package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
  274. package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
  275. package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
  276. package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
  277. package/test/logic/41.2-alter-column.sqllogic +382 -0
  278. package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
  279. package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
  280. package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
  281. package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
  282. package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
  283. package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
  284. package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
  285. package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
  286. package/test/logic/41.5-alter-misc.sqllogic +48 -0
  287. package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
  288. package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
  289. package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
  290. package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
  291. package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
  292. package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
  293. package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
  294. package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
  295. package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
  296. package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
  297. package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
  298. package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
  299. package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
  300. package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
  301. package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
  302. package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
  303. package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
  304. package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
  305. package/test/logic/42-committed-snapshot.sqllogic +254 -0
  306. package/test/logic/42-returning.sqllogic +159 -0
  307. package/test/logic/42.1-returning-extras.sqllogic +232 -0
  308. package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
  309. package/test/logic/43-default-nullability.sqllogic +131 -0
  310. package/test/logic/43-transition-constraints.sqllogic +341 -0
  311. package/test/logic/43.1-default-collation.sqllogic +140 -0
  312. package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
  313. package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
  314. package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
  315. package/test/logic/44-determinism-validation.sqllogic +164 -0
  316. package/test/logic/44-orthogonality.sqllogic +146 -0
  317. package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
  318. package/test/logic/45-udf-determinism.sqllogic +39 -0
  319. package/test/logic/46-mutation-context.sqllogic +595 -0
  320. package/test/logic/47-upsert.sqllogic +255 -0
  321. package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
  322. package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
  323. package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
  324. package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
  325. package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
  326. package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
  327. package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
  328. package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
  329. package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
  330. package/test/logic/49-reference-graph.sqllogic +84 -0
  331. package/test/logic/50-declarative-schema.sqllogic +2550 -0
  332. package/test/logic/50-metadata-tags.sqllogic +1033 -0
  333. package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
  334. package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
  335. package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
  336. package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +173 -0
  337. package/test/logic/50.3-declare-schema-duplicate-names.sqllogic +280 -0
  338. package/test/logic/50.4-declare-schema-apply-restore.sqllogic +192 -0
  339. package/test/logic/51-lens-foundation.sqllogic +147 -0
  340. package/test/logic/51-materialized-views.sqllogic +376 -0
  341. package/test/logic/51.5-materialized-views-coarsened-key.sqllogic +198 -0
  342. package/test/logic/51.7-maintained-table-attach-detach.sqllogic +468 -0
  343. package/test/logic/51.8-maintained-table-declared-constraints.sqllogic +440 -0
  344. package/test/logic/51.85-maintained-table-parent-fk.sqllogic +103 -0
  345. package/test/logic/51.9-maintained-table-secondary-unique.sqllogic +237 -0
  346. package/test/logic/51.9.1-maintained-table-partial-unique.sqllogic +36 -0
  347. package/test/logic/52-lens-overrides.sqllogic +566 -0
  348. package/test/logic/53-materialized-views-rowtime.sqllogic +1601 -0
  349. package/test/logic/53-reserved-tags.sqllogic +252 -0
  350. package/test/logic/53.1-materialized-view-write-through.sqllogic +329 -0
  351. package/test/logic/53.2-materialized-view-rename-propagation.sqllogic +483 -0
  352. package/test/logic/53.3-materialized-view-constraint-only-ddl.sqllogic +409 -0
  353. package/test/logic/53.3.1-materialized-view-index-ddl-irrelevance.sqllogic +29 -0
  354. package/test/logic/53.4-materialized-view-structural-alter-restore.sqllogic +436 -0
  355. package/test/logic/54-covering-mv-enforcement.sqllogic +314 -0
  356. package/test/logic/54.1-covering-mv-partial-enforcement.sqllogic +34 -0
  357. package/test/logic/55-internal-eviction-reporting.sqllogic +89 -0
  358. package/test/logic/55-lens-prover.sqllogic +202 -0
  359. package/test/logic/55.1-eviction-restrict-fk.sqllogic +148 -0
  360. package/test/logic/55.5-lens-authored-inverse.sqllogic +1468 -0
  361. package/test/logic/80-grow-retrieve-pass.sqllogic +79 -0
  362. package/test/logic/81-quickpick.sqllogic +24 -0
  363. package/test/logic/82-bloom-join.sqllogic +185 -0
  364. package/test/logic/83-merge-join.sqllogic +280 -0
  365. package/test/logic/84-asof-scan.sqllogic +238 -0
  366. package/test/logic/84-key-cardinality.sqllogic +50 -0
  367. package/test/logic/85-relational-const-folding.sqllogic +51 -0
  368. package/test/logic/86-scalar-cse.sqllogic +42 -0
  369. package/test/logic/90-error_paths.sqllogic +114 -0
  370. package/test/logic/90.1-parse-errors.sqllogic +77 -0
  371. package/test/logic/90.2-alter-table-errors.sqllogic +53 -0
  372. package/test/logic/90.2.1-alter-extra-errors.sqllogic +51 -0
  373. package/test/logic/90.3-expression-errors.sqllogic +43 -0
  374. package/test/logic/90.4-dml-errors.sqllogic +47 -0
  375. package/test/logic/90.5-unsupported-join-types.sqllogic +37 -0
  376. package/test/logic/90.5.1-right-full-join-read.sqllogic +157 -0
  377. package/test/logic/90.6-select-error-paths.sqllogic +57 -0
  378. package/test/logic/91-merge-join-edge-cases.sqllogic +159 -0
  379. package/test/logic/92-hash-aggregate-edge-cases.sqllogic +139 -0
  380. package/test/logic/93-ddl-view-edge-cases.sqllogic +104 -0
  381. package/test/logic/93.1-view-error-paths.sqllogic +74 -0
  382. package/test/logic/93.2-view-mutation-pending.sqllogic +108 -0
  383. package/test/logic/93.3-view-mutation-or-clause.sqllogic +60 -0
  384. package/test/logic/93.4-view-mutation.sqllogic +4881 -0
  385. package/test/logic/93.4.1-view-mutation-partial-unique-cardinality.sqllogic +31 -0
  386. package/test/logic/93.5-authored-inverse.sqllogic +415 -0
  387. package/test/logic/93.6-set-op-flagless-write.sqllogic +862 -0
  388. package/test/logic/94-tvf-edge-cases.sqllogic +58 -0
  389. package/test/logic/94.1-limit-offset-edge-cases.sqllogic +109 -0
  390. package/test/logic/94.2-limit-offset-extras.sqllogic +98 -0
  391. package/test/logic/95-assertions.sqllogic +1417 -0
  392. package/test/logic/96-subquery-edge-cases.sqllogic +276 -0
  393. package/test/logic/97-json-function-edge-cases.sqllogic +633 -0
  394. package/test/logic/97.1-json-blob-and-special-values.sqllogic +92 -0
  395. package/test/logic/98-temporal-edge-cases.sqllogic +515 -0
  396. package/test/logic/99-conversion-edge-cases.sqllogic +325 -0
  397. package/test/logic/99.0.1-schema-index-listing.sqllogic +21 -0
  398. package/test/logic/99.1-cast-syntax-extras.sqllogic +167 -0
  399. package/test/logic/drop-unique-index.sqllogic +88 -0
  400. package/test/logic/pushdown-test.sqllogic +36 -0
@@ -0,0 +1,598 @@
1
+ -- adapted from SQLite test/gencol1.test
2
+ -- Generated-column scenarios beyond 41-generated-columns.sqllogic.
3
+
4
+ -- ===================================
5
+ -- 1. Chain — generated column referencing another generated column
6
+ -- ===================================
7
+
8
+ create table t_chain (
9
+ id integer primary key,
10
+ a integer not null,
11
+ m integer generated always as (a * 2) stored,
12
+ w integer generated always as (m * 5) stored
13
+ );
14
+
15
+ insert into t_chain (id, a) values (1, 3);
16
+
17
+ select a, m, w from t_chain where id = 1;
18
+ → [{"a":3,"m":6,"w":30}]
19
+
20
+ update t_chain set a = 4 where id = 1;
21
+
22
+ select a, m, w from t_chain where id = 1;
23
+ → [{"a":4,"m":8,"w":40}]
24
+
25
+ drop table t_chain;
26
+
27
+ -- ===================================
28
+ -- 1b. Reverse-declaration-order chain — `w` declared before its dependency `m`
29
+ -- ===================================
30
+
31
+ create table t_chain_rev (
32
+ id integer primary key,
33
+ a integer not null,
34
+ w integer generated always as (m * 5) stored,
35
+ m integer generated always as (a * 2) stored
36
+ );
37
+
38
+ insert into t_chain_rev (id, a) values (1, 3);
39
+
40
+ select a, m, w from t_chain_rev where id = 1;
41
+ → [{"a":3,"m":6,"w":30}]
42
+
43
+ update t_chain_rev set a = 4 where id = 1;
44
+
45
+ select a, m, w from t_chain_rev where id = 1;
46
+ → [{"a":4,"m":8,"w":40}]
47
+
48
+ drop table t_chain_rev;
49
+
50
+ -- ===================================
51
+ -- 2. Generated column used in WHERE / ORDER BY / GROUP BY
52
+ -- ===================================
53
+
54
+ create table t_q (
55
+ id integer primary key,
56
+ a integer not null,
57
+ b integer not null,
58
+ s integer generated always as (a + b) stored
59
+ );
60
+
61
+ insert into t_q (id, a, b) values (1, 1, 2), (2, 3, 1), (3, 2, 2);
62
+
63
+ -- WHERE on generated column
64
+ select id from t_q where s = 4 order by id;
65
+ → [{"id":2},{"id":3}]
66
+
67
+ -- GROUP BY on generated column
68
+ select s, count(*) as n from t_q group by s order by s;
69
+ → [{"s":3,"n":1},{"s":4,"n":2}]
70
+
71
+ -- ORDER BY on generated column
72
+ select id, s from t_q order by s desc, id;
73
+ → [{"id":2,"s":4},{"id":3,"s":4},{"id":1,"s":3}]
74
+
75
+ drop table t_q;
76
+
77
+ -- ===================================
78
+ -- 3. Type coercion via generated column
79
+ -- ===================================
80
+
81
+ create table t_typed (
82
+ id integer primary key,
83
+ c any null,
84
+ t text generated always as (typeof(c)) stored
85
+ );
86
+
87
+ insert into t_typed (id, c) values (1, 5), (2, 'abc'), (3, 5.5), (4, null);
88
+
89
+ select id, t from t_typed order by id;
90
+ → [{"id":1,"t":"integer"},{"id":2,"t":"text"},{"id":3,"t":"real"},{"id":4,"t":"null"}]
91
+
92
+ drop table t_typed;
93
+
94
+ -- ===================================
95
+ -- 4. Generated column with UNIQUE constraint
96
+ -- ===================================
97
+
98
+ create table t_u (
99
+ id integer primary key,
100
+ a integer not null,
101
+ b integer generated always as (a * 10) stored unique
102
+ );
103
+
104
+ insert into t_u (id, a) values (1, 1), (2, 2);
105
+
106
+ -- duplicate generated value should violate UNIQUE
107
+ insert into t_u (id, a) values (3, 1);
108
+ -- error: UNIQUE
109
+
110
+ drop table t_u;
111
+
112
+ -- ===================================
113
+ -- 5. Generated column as PRIMARY KEY
114
+ -- ===================================
115
+
116
+ create table t_pk (
117
+ a integer not null,
118
+ k integer generated always as (a + 100) stored primary key
119
+ );
120
+
121
+ insert into t_pk (a) values (1);
122
+
123
+ -- duplicate generated PK value should fail
124
+ insert into t_pk (a) values (1);
125
+ -- error:
126
+
127
+ select k from t_pk;
128
+ → [{"k":101}]
129
+
130
+ drop table t_pk;
131
+
132
+ -- ===================================
133
+ -- 6. Generated column whose expression is a scalar subquery
134
+ -- (deterministic within a statement, but the evaluator resolves ASYNCHRONOUSLY —
135
+ -- UPDATE's generated-column recompute must await it, not store the Promise)
136
+ -- ===================================
137
+
138
+ create table t_src (k integer primary key);
139
+
140
+ insert into t_src values (1), (2), (3);
141
+
142
+ create table t_sub (
143
+ id integer primary key,
144
+ w integer,
145
+ g integer generated always as ((select count(*) from t_src))
146
+ );
147
+
148
+ insert into t_sub (id, w) values (1, 1), (2, 2);
149
+
150
+ select id, w, g from t_sub order by id;
151
+ → [{"id":1,"w":1,"g":3},{"id":2,"w":2,"g":3}]
152
+
153
+ -- updating an unrelated column re-runs the generated expression
154
+ update t_sub set w = 5 where id = 1;
155
+
156
+ select id, w, g from t_sub order by id;
157
+ → [{"id":1,"w":5,"g":3},{"id":2,"w":2,"g":3}]
158
+
159
+ -- the subquery's source changes: a later update must recompute, not carry the old value
160
+ insert into t_src values (4), (5);
161
+
162
+ update t_sub set w = 6 where id = 1;
163
+
164
+ select id, w, g from t_sub order by id;
165
+ → [{"id":1,"w":6,"g":5},{"id":2,"w":2,"g":3}]
166
+
167
+ -- multi-row update (no WHERE) — exercises phase-2 context teardown across iterations
168
+ update t_sub set w = w + 10;
169
+
170
+ select id, w, g from t_sub order by id;
171
+ → [{"id":1,"w":16,"g":5},{"id":2,"w":12,"g":5}]
172
+
173
+ drop table t_sub;
174
+ drop table t_src;
175
+
176
+ -- ===================================
177
+ -- 7. Chain across the async path — a generated column feeding another
178
+ -- ===================================
179
+
180
+ create table t_src2 (k integer primary key);
181
+
182
+ insert into t_src2 values (1), (2);
183
+
184
+ create table t_sub_chain (
185
+ id integer primary key,
186
+ w integer,
187
+ g integer generated always as ((select count(*) from t_src2)) stored,
188
+ g2 integer generated always as (g * 2) stored
189
+ );
190
+
191
+ insert into t_sub_chain (id, w) values (1, 1);
192
+
193
+ select w, g, g2 from t_sub_chain;
194
+ → [{"w":1,"g":2,"g2":4}]
195
+
196
+ insert into t_src2 values (3);
197
+
198
+ update t_sub_chain set w = 9 where id = 1;
199
+
200
+ select w, g, g2 from t_sub_chain;
201
+ → [{"w":9,"g":3,"g2":6}]
202
+
203
+ drop table t_sub_chain;
204
+ drop table t_src2;
205
+
206
+ -- ===================================
207
+ -- 8. Correlated subquery generated column, multi-row UPDATE
208
+ -- Sections 6 and 7 use an UNCORRELATED subquery, which never reads the row
209
+ -- context UPDATE installs for its phase-2 recompute. This one does — the
210
+ -- subquery's `id` resolves against the row being updated — across several
211
+ -- rows in one statement, so the phase-2 context must be installed and torn
212
+ -- down correctly on every iteration, not just the first.
213
+ -- Note the other table's column is qualified (`t_src3.k`): an unqualified
214
+ -- name inside a generated expression is read as a reference to THIS table
215
+ -- and rejected at create time (see docs/sql-alter.md § ADD COLUMN).
216
+ -- ===================================
217
+
218
+ create table t_src3 (k integer primary key);
219
+
220
+ insert into t_src3 values (1), (2), (3);
221
+
222
+ create table t_corr (
223
+ id integer primary key,
224
+ w integer,
225
+ g integer generated always as ((select count(*) from t_src3 where t_src3.k <= id))
226
+ );
227
+
228
+ insert into t_corr (id, w) values (1, 10), (2, 20), (3, 30);
229
+
230
+ select id, w, g from t_corr order by id;
231
+ → [{"id":1,"w":10,"g":1},{"id":2,"w":20,"g":2},{"id":3,"w":30,"g":3}]
232
+
233
+ update t_corr set w = w + 1;
234
+
235
+ select id, w, g from t_corr order by id;
236
+ → [{"id":1,"w":11,"g":1},{"id":2,"w":21,"g":2},{"id":3,"w":31,"g":3}]
237
+
238
+ drop table t_corr;
239
+ drop table t_src3;
240
+
241
+ -- ===================================
242
+ -- 9. `on conflict … do update` recomputes generated columns
243
+ -- The DO UPDATE arm composes its row from the EXISTING row plus the SET
244
+ -- assignments and writes it directly, so it needs its own second-pass
245
+ -- recompute — the INSERT-side and UPDATE-side ones never run for it.
246
+ -- ===================================
247
+
248
+ create table t_up (
249
+ id integer primary key,
250
+ w integer,
251
+ g integer generated always as (w * 2) stored
252
+ );
253
+
254
+ insert into t_up (id, w) values (1, 1);
255
+
256
+ select id, w, g from t_up;
257
+ → [{"id":1,"w":1,"g":2}]
258
+
259
+ -- literal assignment: g derives from the POST-update w, not the old one
260
+ insert into t_up (id, w) values (1, 7) on conflict (id) do update set w = 7;
261
+
262
+ select id, w, g from t_up;
263
+ → [{"id":1,"w":7,"g":14}]
264
+
265
+ -- `excluded.` assignment (the proposed insert value)
266
+ insert into t_up (id, w) values (1, 20) on conflict (id) do update set w = excluded.w;
267
+
268
+ select id, w, g from t_up;
269
+ → [{"id":1,"w":20,"g":40}]
270
+
271
+ -- assignment reading the EXISTING row (unqualified `w` = 20)
272
+ insert into t_up (id, w) values (1, 0) on conflict (id) do update set w = w + 1;
273
+
274
+ select id, w, g from t_up;
275
+ → [{"id":1,"w":21,"g":42}]
276
+
277
+ -- assigning a generated column is rejected, exactly as `update t_up set g = 99` is
278
+ insert into t_up (id, w) values (1, 5) on conflict (id) do update set g = 99;
279
+ -- error: Cannot UPDATE generated column 'g'
280
+
281
+ -- rejected at plan time, so nothing was written
282
+ select id, w, g from t_up;
283
+ → [{"id":1,"w":21,"g":42}]
284
+
285
+ -- `on conflict … do nothing` writes nothing at all (control)
286
+ insert into t_up (id, w) values (1, 99) on conflict (id) do nothing;
287
+
288
+ select id, w, g from t_up;
289
+ → [{"id":1,"w":21,"g":42}]
290
+
291
+ drop table t_up;
292
+
293
+ -- ===================================
294
+ -- 9b. DO UPDATE across a generated-from-generated chain, declared in reverse
295
+ -- dependency order — the second pass must follow topological order, not
296
+ -- declaration order.
297
+ -- ===================================
298
+
299
+ create table t_up_chain (
300
+ id integer primary key,
301
+ a integer,
302
+ w integer generated always as (m * 5) stored,
303
+ m integer generated always as (a * 2) stored
304
+ );
305
+
306
+ insert into t_up_chain (id, a) values (1, 3);
307
+
308
+ select a, m, w from t_up_chain;
309
+ → [{"a":3,"m":6,"w":30}]
310
+
311
+ insert into t_up_chain (id, a) values (1, 4) on conflict (id) do update set a = excluded.a;
312
+
313
+ select a, m, w from t_up_chain;
314
+ → [{"a":4,"m":8,"w":40}]
315
+
316
+ drop table t_up_chain;
317
+
318
+ -- ===================================
319
+ -- 9c. DO UPDATE with a subquery-valued generated column
320
+ -- Its evaluator resolves ASYNCHRONOUSLY, so the second pass must await it
321
+ -- rather than store the Promise. The source table changes between the two
322
+ -- statements, so a carried-over value is visible in the result.
323
+ -- ===================================
324
+
325
+ create table t_up_src (k integer primary key);
326
+
327
+ insert into t_up_src values (1), (2), (3);
328
+
329
+ create table t_up_sub (
330
+ id integer primary key,
331
+ w integer,
332
+ g integer generated always as ((select count(*) from t_up_src))
333
+ );
334
+
335
+ insert into t_up_sub (id, w) values (1, 1);
336
+
337
+ select id, w, g from t_up_sub;
338
+ → [{"id":1,"w":1,"g":3}]
339
+
340
+ insert into t_up_src values (4), (5);
341
+
342
+ insert into t_up_sub (id, w) values (1, 2) on conflict (id) do update set w = excluded.w;
343
+
344
+ select id, w, g from t_up_sub;
345
+ → [{"id":1,"w":2,"g":5}]
346
+
347
+ drop table t_up_sub;
348
+ drop table t_up_src;
349
+
350
+ -- ===================================
351
+ -- 9d. DO UPDATE with a CORRELATED subquery generated column whose correlation
352
+ -- is on a column the SET clause changes — the second pass must bind the
353
+ -- post-assignment row, not the pre-update existing row.
354
+ -- ===================================
355
+
356
+ create table t_up_corr_src (k integer primary key);
357
+
358
+ insert into t_up_corr_src values (1), (2), (3), (4);
359
+
360
+ create table t_up_corr (
361
+ id integer primary key,
362
+ w integer,
363
+ c integer generated always as ((select count(*) from t_up_corr_src where t_up_corr_src.k <= w))
364
+ );
365
+
366
+ insert into t_up_corr (id, w) values (1, 1);
367
+
368
+ select id, w, c from t_up_corr;
369
+ → [{"id":1,"w":1,"c":1}]
370
+
371
+ insert into t_up_corr (id, w) values (1, 3) on conflict (id) do update set w = excluded.w;
372
+
373
+ select id, w, c from t_up_corr;
374
+ → [{"id":1,"w":3,"c":3}]
375
+
376
+ drop table t_up_corr;
377
+ drop table t_up_corr_src;
378
+
379
+ -- ===================================
380
+ -- 9e. Control — `insert or replace` (delete-then-insert) routes through the
381
+ -- INSERT path, which already recomputes. Pinned so a future change to the
382
+ -- upsert path cannot quietly regress it.
383
+ -- ===================================
384
+
385
+ create table t_rep (
386
+ id integer primary key,
387
+ w integer,
388
+ g integer generated always as (w * 2) stored
389
+ );
390
+
391
+ insert into t_rep (id, w) values (1, 1);
392
+
393
+ select id, w, g from t_rep;
394
+ → [{"id":1,"w":1,"g":2}]
395
+
396
+ insert or replace into t_rep (id, w) values (1, 9);
397
+
398
+ select id, w, g from t_rep;
399
+ → [{"id":1,"w":9,"g":18}]
400
+
401
+ drop table t_rep;
402
+
403
+ -- ===================================
404
+ -- 9f. Generated column that IS the primary key, relocated by the recompute.
405
+ -- The DO UPDATE arm issues its write with `oldKeyValues` taken from the
406
+ -- existing row, so the row must MOVE to the new key rather than duplicate
407
+ -- or be lost.
408
+ -- ===================================
409
+
410
+ create table t_pk_up (
411
+ a integer not null,
412
+ k integer generated always as (a + 100) stored primary key
413
+ );
414
+
415
+ insert into t_pk_up (a) values (1);
416
+
417
+ select a, k from t_pk_up;
418
+ → [{"a":1,"k":101}]
419
+
420
+ insert into t_pk_up (a) values (1) on conflict (k) do update set a = 2;
421
+
422
+ select a, k from t_pk_up order by k;
423
+ → [{"a":2,"k":102}]
424
+
425
+ drop table t_pk_up;
426
+
427
+ -- ===================================
428
+ -- 9g. RETURNING on the DO UPDATE arm reports the RECOMPUTED generated value.
429
+ -- The arm builds its returned row from the stored image, so a recompute the
430
+ -- second pass missed would surface here as the stale value.
431
+ -- ===================================
432
+
433
+ create table t_up_ret (
434
+ id integer primary key,
435
+ w integer,
436
+ g integer generated always as (w * 2) stored
437
+ );
438
+
439
+ insert into t_up_ret (id, w) values (1, 1);
440
+
441
+ insert into t_up_ret (id, w) values (1, 7) on conflict (id) do update set w = excluded.w returning id, w, g;
442
+ → [{"id":1,"w":7,"g":14}]
443
+
444
+ drop table t_up_ret;
445
+
446
+ -- ===================================
447
+ -- 9h. A DO UPDATE clause whose WHERE excludes the row writes nothing — the
448
+ -- recompute must not leak a value past the skipped write.
449
+ -- ===================================
450
+
451
+ create table t_up_where (
452
+ id integer primary key,
453
+ w integer,
454
+ g integer generated always as (w * 2) stored
455
+ );
456
+
457
+ insert into t_up_where (id, w) values (1, 1);
458
+
459
+ insert into t_up_where (id, w) values (1, 7) on conflict (id) do update set w = excluded.w where w > 100;
460
+
461
+ select id, w, g from t_up_where;
462
+ → [{"id":1,"w":1,"g":2}]
463
+
464
+ insert into t_up_where (id, w) values (1, 7) on conflict (id) do update set w = excluded.w where w < 100;
465
+
466
+ select id, w, g from t_up_where;
467
+ → [{"id":1,"w":7,"g":14}]
468
+
469
+ drop table t_up_where;
470
+
471
+ -- ===================================
472
+ -- 9i. TWO `on conflict` clauses on one generated-column table. The emit-side
473
+ -- split between user assignments and recomputes is built per clause, so each
474
+ -- clause needs its own working second pass.
475
+ -- ===================================
476
+
477
+ create table t_up_multi (
478
+ id integer primary key,
479
+ u integer unique,
480
+ w integer,
481
+ g integer generated always as (w * 2) stored
482
+ );
483
+
484
+ insert into t_up_multi (id, u, w) values (1, 10, 1);
485
+
486
+ select id, u, w, g from t_up_multi;
487
+ → [{"id":1,"u":10,"w":1,"g":2}]
488
+
489
+ -- conflicts on the PK -> first clause
490
+ insert into t_up_multi (id, u, w) values (1, 99, 3) on conflict (id) do update set w = 3 on conflict (u) do update set w = 4;
491
+
492
+ select id, u, w, g from t_up_multi;
493
+ → [{"id":1,"u":10,"w":3,"g":6}]
494
+
495
+ -- conflicts on the unique column only -> second clause
496
+ insert into t_up_multi (id, u, w) values (2, 10, 5) on conflict (id) do update set w = 3 on conflict (u) do update set w = 4;
497
+
498
+ select id, u, w, g from t_up_multi;
499
+ → [{"id":1,"u":10,"w":4,"g":8}]
500
+
501
+ drop table t_up_multi;
502
+
503
+ -- ===================================
504
+ -- 9j. MULTI-ROW DO UPDATE. Every other case here conflicts on one row; the
505
+ -- second pass composes its row per conflicting row, so a statement mixing
506
+ -- conflicting and non-conflicting rows must recompute each independently.
507
+ -- ===================================
508
+
509
+ create table t_up_many (id integer primary key, w integer, g integer generated always as (w * 2) stored);
510
+
511
+ insert into t_up_many (id, w) values (1, 1), (2, 2);
512
+
513
+ insert into t_up_many (id, w) values (1, 10), (2, 20), (3, 30) on conflict (id) do update set w = excluded.w;
514
+
515
+ select id, w, g from t_up_many order by id;
516
+ → [{"id":1,"w":10,"g":20},{"id":2,"w":20,"g":40},{"id":3,"w":30,"g":60}]
517
+
518
+ drop table t_up_many;
519
+
520
+ -- ===================================
521
+ -- 9k. A generated value whose expression type differs from the DECLARED column
522
+ -- type is converted on the DO UPDATE arm too — it lands in the same cell as
523
+ -- a user assignment, so it takes the same static-type coercion.
524
+ -- ===================================
525
+
526
+ create table t_up_coerce (
527
+ id integer primary key,
528
+ w integer,
529
+ g text generated always as (w * 2) stored
530
+ );
531
+
532
+ insert into t_up_coerce (id, w) values (1, 1);
533
+
534
+ select id, w, g, typeof(g) as t from t_up_coerce;
535
+ → [{"id":1,"w":1,"g":"2","t":"text"}]
536
+
537
+ insert into t_up_coerce (id, w) values (1, 5) on conflict (id) do update set w = excluded.w;
538
+
539
+ select id, w, g, typeof(g) as t from t_up_coerce;
540
+ → [{"id":1,"w":5,"g":"10","t":"text"}]
541
+
542
+ drop table t_up_coerce;
543
+
544
+ -- ===================================
545
+ -- 9l. A generated column whose dependency the SET clause does NOT touch keeps
546
+ -- its value — the recompute reads the composed row, not the proposed insert.
547
+ -- (`a` is 9 in the proposed row and 1 in the existing one; `g` must stay 10.)
548
+ -- ===================================
549
+
550
+ create table t_up_dep (id integer primary key, a integer, b integer, g integer generated always as (a * 10) stored);
551
+
552
+ insert into t_up_dep (id, a, b) values (1, 1, 1);
553
+
554
+ insert into t_up_dep (id, a, b) values (1, 9, 7) on conflict (id) do update set b = excluded.b;
555
+
556
+ select id, a, b, g from t_up_dep;
557
+ → [{"id":1,"a":1,"b":7,"g":10}]
558
+
559
+ drop table t_up_dep;
560
+
561
+ -- ===================================
562
+ -- 9m. Writing through a view whose basis table has a generated column. The
563
+ -- view-mutation decomposition re-plans some writes as synthesized
564
+ -- `on conflict … do update` statements, so the rejection above could in
565
+ -- principle fire on a lowered statement. It cannot: the view-write
566
+ -- classifier marks a projected generated column read-only and rejects
567
+ -- first, with its own diagnostic. Pinned so that ordering does not drift.
568
+ -- Writing the ORDINARY basis column through the same view still updates the
569
+ -- generated one (that write lowers to a plain member UPDATE, whose own
570
+ -- recompute covers it).
571
+ -- ===================================
572
+
573
+ create table gojp (pp integer primary key, base integer null, pv integer generated always as (base * 2) stored);
574
+
575
+ create table gojc (cc integer primary key, pr integer null, cv integer null);
576
+
577
+ create view gojv as select c.cc as cc, c.cv as cv, p.pv as pv, p.base as base from gojc c left join gojp p on p.pp = c.pr;
578
+
579
+ insert into gojp (pp, base) values (1, 10);
580
+ insert into gojc values (1, 1, 100);
581
+
582
+ select cc, cv, pv, base from gojv order by cc;
583
+ → [{"cc":1,"cv":100,"pv":20,"base":10}]
584
+
585
+ update gojv set pv = 777 where cc = 1;
586
+ -- error: is a computed (non-invertible) expression and is read-only
587
+
588
+ select cc, cv, pv, base from gojv order by cc;
589
+ → [{"cc":1,"cv":100,"pv":20,"base":10}]
590
+
591
+ update gojv set base = 50 where cc = 1;
592
+
593
+ select cc, cv, pv, base from gojv order by cc;
594
+ → [{"cc":1,"cv":100,"pv":100,"base":50}]
595
+
596
+ drop view gojv;
597
+ drop table gojc;
598
+ drop table gojp;