@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,31 @@
1
+ -- 93.4.1-view-mutation-partial-unique-cardinality.sqllogic
2
+ --
3
+ -- requires-capability: standalone-index-ddl
4
+ --
5
+ -- Carved out of 93.4-view-mutation: that ~4400-line file is multi-source view
6
+ -- write-through, and this was its only index DDL. A PARTIAL unique key has no
7
+ -- declarative spelling in this engine — `create unique index … where …` is the only
8
+ -- way to express one — so this adversarial case is the file's single dependency on
9
+ -- standalone index DDL.
10
+ --
11
+ -- Subject: a cross-source `set` whose partner's only unique key on the join column is a
12
+ -- PARTIAL unique index is REJECTED at plan time. A partial unique key bounds uniqueness
13
+ -- only within its predicate scope, so it cannot prove the owner joins at most one
14
+ -- partner. Here xs1pp_p has TWO rows with pcode=500 (one, pv=-5, outside the partial
15
+ -- scope pv>0), so the child cid=1 genuinely joins both parents — the proof correctly
16
+ -- fails and the write is rejected at plan time rather than failing at runtime with
17
+ -- "more than one row". The non-partial (plain UNIQUE column) counterpart it contrasts
18
+ -- with stays in 93.4.
19
+
20
+ create table xs1pp_p (pid integer primary key, pcode integer, pv integer);
21
+ create table xs1pp_c (cid integer primary key, cref integer, cv integer);
22
+ create unique index xs1pp_ux on xs1pp_p(pcode) where pv > 0;
23
+ insert into xs1pp_p values (10, 500, 100), (20, 500, -5);
24
+ insert into xs1pp_c values (1, 500, 1);
25
+ create view xs1pp_v as
26
+ select c.cid as cid, c.cv as cv, p.pv as pv
27
+ from xs1pp_c c join xs1pp_p p on p.pcode = c.cref;
28
+ update xs1pp_v set cv = pv where cid = 1;
29
+ -- error: assigned side joins more than one
30
+ select cid, cv from xs1pp_c order by cid;
31
+ → [{"cid":1,"cv":1}]
@@ -0,0 +1,415 @@
1
+ -- Authored inverses (`with inverse (col = expr, …)`) — write-through consumption
2
+ -- (docs/vu-inverses.md § Authored inverses). The clause supplies authored
3
+ -- put expressions computing base columns from the written view row (`new.<col>`
4
+ -- refs), upgrading a computed (registry-opaque) column to writable + insertable.
5
+ -- Parser/AST round-trip is pinned by the parser ticket; this file pins the
6
+ -- build-time validation, lineage upgrade, and UPDATE/INSERT lowering.
7
+
8
+ -- ===================================
9
+ -- Worked example: a non-injective code collapse. Writes through the view store
10
+ -- the authored representative; reads (incl. RETURNING) normalize through the
11
+ -- forward expression — the PutGet observable (GetPut is intentionally lossy).
12
+ -- ===================================
13
+
14
+ create table ai_t (id integer primary key, code20 text not null);
15
+ insert into ai_t values (1, 'A2'), (2, 'B2');
16
+
17
+ create view ai_v as select id, case code20
18
+ when 'A1' then 'A' when 'A2' then 'A'
19
+ when 'B1' then 'B' when 'B2' then 'B'
20
+ else 'C' end as code
21
+ with inverse (code20 = case new.code when 'A' then 'A1' when 'B' then 'B1' else 'C1' end)
22
+ from ai_t;
23
+
24
+ select * from ai_v order by id;
25
+ → [{"id":1,"code":"A"},{"id":2,"code":"B"}]
26
+
27
+ -- UPDATE through the view stores the representative ('B' → 'B1', not the row's
28
+ -- original fine-grained value).
29
+ update ai_v set code = 'B' where id = 1;
30
+ select * from ai_t order by id;
31
+ → [{"id":1,"code20":"B1"},{"id":2,"code20":"B2"}]
32
+
33
+ -- INSERT through the view: the insertability gate is lifted for the authored
34
+ -- column (a registry-`inverse` / opaque computed column stays non-insertable).
35
+ insert into ai_v (id, code) values (3, 'A');
36
+ select * from ai_t where id = 3;
37
+ → [{"id":3,"code20":"A1"}]
38
+
39
+ -- RETURNING reads back through the FORWARD expression over the post-mutation
40
+ -- base value: writing 'C' stores 'C1', and the returned `code` is the normalized
41
+ -- representative 'C' (PutGet holds; the stored value is the representative).
42
+ update ai_v set code = 'C' where id = 3 returning id, code;
43
+ → [{"id":3,"code":"C"}]
44
+ select code20 from ai_t where id = 3;
45
+ → [{"code20":"C1"}]
46
+
47
+ -- Re-select normalizes identically. (`id` is projected alongside `code` to
48
+ -- sidestep a pre-existing planner bug — "No row context" when the WHERE
49
+ -- references a column the outer projection prunes; see tickets/.pre-existing-error.md.)
50
+ select id, code from ai_v where id = 3;
51
+ → [{"id":3,"code":"C"}]
52
+
53
+ -- view_info / column_info agree with the dynamic truth: the authored column is
54
+ -- updatable, with its (single-put) base trace, and the view is insertable.
55
+ select column_name, is_updatable, base_table, base_column from column_info('ai_v') order by cid;
56
+ → [{"column_name":"id","is_updatable":"YES","base_table":"ai_t","base_column":"id"},{"column_name":"code","is_updatable":"YES","base_table":"ai_t","base_column":"code20"}]
57
+ select is_updatable, is_insertable_into from view_info('ai_v');
58
+ → [{"is_updatable":"YES","is_insertable_into":"YES"}]
59
+
60
+ -- Conflict resolution: the lowered base values participate normally in
61
+ -- `insert or replace` (the id=3 row's code20 is replaced via the inverse).
62
+ insert or replace into ai_v (id, code) values (3, 'B');
63
+ select code20 from ai_t where id = 3;
64
+ → [{"code20":"B1"}]
65
+
66
+ -- ===================================
67
+ -- Build-time validation — position-independent (fails on a bare SELECT that is
68
+ -- never a write target, naming the result column and the offending target/ref).
69
+ -- ===================================
70
+
71
+ -- unknown assignment target (not a FROM-source column)
72
+ select id, code20 as c with inverse (nope = new.c) from ai_t;
73
+ -- error: WITH INVERSE target 'nope' does not resolve
74
+
75
+ -- a bare (non-new-qualified) base column ref in the inverse expression
76
+ select id, case code20 when 'A1' then 'A' else 'C' end as c
77
+ with inverse (code20 = code20 || new.c) from ai_t;
78
+ -- error: without the NEW qualifier
79
+
80
+ -- a new.<ref> to a non-output column
81
+ select id, code20 as c with inverse (code20 = new.zzz) from ai_t;
82
+ -- error: 'new.zzz' does not resolve to an output column
83
+
84
+ -- the same target across two result columns of one select
85
+ select code20 as a with inverse (code20 = new.a),
86
+ code20 as b with inverse (code20 = new.b) from ai_t;
87
+ -- error: both author a WITH INVERSE put to base column 'code20'
88
+
89
+ -- a duplicate target WITHIN one clause is a parse error (parser ticket)
90
+ select code20 as a with inverse (code20 = new.a, code20 = new.a) from ai_t;
91
+ -- error: Duplicate column 'code20' in WITH INVERSE
92
+
93
+ -- ===================================
94
+ -- Unused clause stays inert: a top-level select carrying the clause executes
95
+ -- identically to the same select without it, and the plan shape is unchanged
96
+ -- (the metadata must not block optimization).
97
+ -- ===================================
98
+
99
+ select id, code20 || '!' as bang with inverse (code20 = new.bang) from ai_t order by id;
100
+ → [{"id":1,"bang":"B1!"},{"id":2,"bang":"B2!"},{"id":3,"bang":"B1!"}]
101
+
102
+ select (select group_concat(node_type) from query_plan('select id, code20 || ''!'' as bang from ai_t'))
103
+ = (select group_concat(node_type) from query_plan('select id, code20 || ''!'' as bang with inverse (code20 = new.bang) from ai_t'))
104
+ as same_plan;
105
+ → [{"same_plan":true}]
106
+
107
+ -- ===================================
108
+ -- Authored wins over inferred: an authored inverse on an identity column
109
+ -- overrides the inferred verbatim put (writes normalize through the authored
110
+ -- expression), and on a registry-invertible column overrides the inferred
111
+ -- inverse entirely (the clause is total per column).
112
+ -- ===================================
113
+
114
+ create table aw_t (k integer primary key, name text null, n integer null);
115
+ insert into aw_t values (1, 'bob', 10);
116
+
117
+ -- identity column with an authored normalize-on-write
118
+ create view aw_v1 as select k, name with inverse (name = upper(new.name)) from aw_t;
119
+ update aw_v1 set name = 'carl' where k = 1;
120
+ select name from aw_t where k = 1;
121
+ → [{"name":"CARL"}]
122
+
123
+ -- insert through it normalizes too
124
+ insert into aw_v1 (k, name) values (2, 'dana');
125
+ select name from aw_t where k = 2;
126
+ → [{"name":"DANA"}]
127
+
128
+ -- registry-invertible (`n + 1`) overridden by an authored put: the registry
129
+ -- inverse would store w - 1; the authored put stores w * 10 instead.
130
+ create view aw_v2 as select k, n + 1 as np with inverse (n = new.np * 10) from aw_t;
131
+ update aw_v2 set np = 5 where k = 1;
132
+ select n from aw_t where k = 1;
133
+ → [{"n":50}]
134
+
135
+ -- ...and the authored column is insertable where the registry-inverse one is not.
136
+ insert into aw_v2 (k, np) values (3, 2);
137
+ select n from aw_t where k = 3;
138
+ → [{"n":20}]
139
+
140
+ -- ===================================
141
+ -- Self-referential inverse: target shares the output name; the target namespace
142
+ -- (base) and the new.-namespace (view output) stay distinct.
143
+ -- ===================================
144
+
145
+ create table sr_t (id integer primary key, x integer);
146
+ insert into sr_t values (1, 10);
147
+ create view sr_v as select id, x + 0 as x with inverse (x = new.x + 1) from sr_t;
148
+ update sr_v set x = 5 where id = 1;
149
+ select x from sr_t where id = 1;
150
+ → [{"x":6}]
151
+
152
+ -- ===================================
153
+ -- Multi-target puts: one view column fans out to two base columns (full-name
154
+ -- split), for UPDATE and INSERT alike.
155
+ -- ===================================
156
+
157
+ create table mt_t (id integer primary key, b text, c text);
158
+ insert into mt_t values (1, 'Ada', 'Lovelace');
159
+ create view mt_v as select id, b || ' ' || c as full_name
160
+ with inverse (b = substr(new.full_name, 1, instr(new.full_name, ' ') - 1),
161
+ c = substr(new.full_name, instr(new.full_name, ' ') + 1))
162
+ from mt_t;
163
+
164
+ update mt_v set full_name = 'Grace Hopper' where id = 1;
165
+ select * from mt_t where id = 1;
166
+ → [{"id":1,"b":"Grace","c":"Hopper"}]
167
+
168
+ insert into mt_v (id, full_name) values (2, 'Alan Turing');
169
+ select * from mt_t where id = 2;
170
+ → [{"id":2,"b":"Alan","c":"Turing"}]
171
+
172
+ -- a multi-target column reports updatable with NO single base trace
173
+ select column_name, is_updatable, base_table, base_column from column_info('mt_v') where column_name = 'full_name';
174
+ → [{"column_name":"full_name","is_updatable":"YES","base_table":null,"base_column":null}]
175
+
176
+ -- ===================================
177
+ -- Multi-target across two sides of a join: two child ops, atomic, ordered by
178
+ -- the existing FK-parent-first rule.
179
+ -- ===================================
180
+
181
+ create table j_pa (pid integer primary key, aval text);
182
+ create table j_pb (bid integer primary key, pid integer not null references j_pa(pid), bval text);
183
+ insert into j_pa values (1, 'x');
184
+ insert into j_pb values (10, 1, 'y');
185
+ create view j_v as select j_pa.pid as pid, j_pb.bid as bid, aval || '/' || bval as combo
186
+ with inverse (aval = substr(new.combo, 1, instr(new.combo, '/') - 1),
187
+ bval = substr(new.combo, instr(new.combo, '/') + 1))
188
+ from j_pa join j_pb on j_pa.pid = j_pb.pid;
189
+
190
+ select * from j_v;
191
+ → [{"pid":1,"bid":10,"combo":"x/y"}]
192
+
193
+ update j_v set combo = 'AA/BB' where pid = 1;
194
+ select * from j_pa;
195
+ → [{"pid":1,"aval":"AA"}]
196
+ select * from j_pb;
197
+ → [{"bid":10,"pid":1,"bval":"BB"}]
198
+
199
+ -- insert through the join envelope with an authored column is deferred (precise
200
+ -- diagnostic, not a silent mis-route)
201
+ insert into j_v (pid, bid, combo) values (2, 20, 'c/d');
202
+ -- error: authored inverse (WITH INVERSE); evaluating authored puts through a join view's insert envelope is deferred
203
+
204
+ -- ===================================
205
+ -- NULL flow: an authored expression producing NULL into a NOT NULL base column
206
+ -- is an ordinary constraint error sited at the base op.
207
+ -- ===================================
208
+
209
+ create table nn_t (id integer primary key, val text not null);
210
+ insert into nn_t values (1, 'a');
211
+ create view nn_v as select id, val || '' as v2 with inverse (val = new.v2) from nn_t;
212
+ update nn_v set v2 = null where id = 1;
213
+ -- error: NOT NULL constraint failed: nn_t.val
214
+ select val from nn_t where id = 1;
215
+ → [{"val":"a"}]
216
+
217
+ -- ===================================
218
+ -- Interaction with `with defaults`: an authored-inverse target column takes
219
+ -- the inverse-computed value ahead of the clause entry for that base column
220
+ -- (it is a supplied value, not an omission); an unrelated entry still fills.
221
+ -- ===================================
222
+
223
+ create table di_t (id integer primary key, code20 text not null, tag text);
224
+ create view di_v as select id, case code20 when 'A1' then 'A' else 'C' end as code
225
+ with inverse (code20 = case new.code when 'A' then 'A1' else 'C1' end)
226
+ from di_t
227
+ with defaults (code20 = 'X9', tag = 'defaulted');
228
+
229
+ insert into di_v (id, code) values (1, 'A');
230
+ select * from di_t where id = 1;
231
+ → [{"id":1,"code20":"A1","tag":"defaulted"}]
232
+
233
+ -- ===================================
234
+ -- ALTER … RENAME propagation. A rename of a FROM-table base column rewrites the
235
+ -- clause's target; a rename that shifts an UNALIASED projection's output name
236
+ -- retargets `new.<old>` refs; a renamed table inside an assignment's subquery
237
+ -- rewrites scope-aware.
238
+ -- ===================================
239
+
240
+ -- target rename: code20 → code_raw rewrites the inverse target alongside the body
241
+ alter table ai_t rename column code20 to code_raw;
242
+ update ai_v set code = 'A' where id = 1;
243
+ select code_raw from ai_t where id = 1;
244
+ → [{"code_raw":"A1"}]
245
+
246
+ -- output-name shift: `b` is projected bare (output name = b); renaming b → b2
247
+ -- shifts the output name, so `new.b` in the sibling clause must follow.
248
+ create table rn_t (id integer primary key, b text, c text);
249
+ insert into rn_t values (1, 'base', 'old');
250
+ create view rn_v as select id, b, b || '?' as e with inverse (c = new.b || '-' || new.e) from rn_t;
251
+ alter table rn_t rename column b to b2;
252
+ update rn_v set e = 'E!' where id = 1;
253
+ select c from rn_t where id = 1;
254
+ → [{"c":"base-E!"}]
255
+
256
+ -- table rename inside an assignment's subquery
257
+ create table lk_t (k text primary key, v text);
258
+ insert into lk_t values ('A', 'mapped-A');
259
+ create table tr_t (id integer primary key, raw text);
260
+ insert into tr_t values (1, 'orig');
261
+ create view tr_v as select id, raw || '' as r2
262
+ with inverse (raw = (select v from lk_t where k = new.r2)) from tr_t;
263
+ alter table lk_t rename to lk_t2;
264
+ update tr_v set r2 = 'A' where id = 1;
265
+ select raw from tr_t where id = 1;
266
+ → [{"raw":"mapped-A"}]
267
+
268
+ -- ===================================
269
+ -- Lens body: the clause inside a `declare lens` override flows through the
270
+ -- sparse-override merger per covered column (gap-filled columns never carry
271
+ -- one); writes through the logical table consume it. Full prover integration
272
+ -- is the authored-inverse-lens-prover ticket.
273
+ -- ===================================
274
+
275
+ declare schema aib {
276
+ table Core {
277
+ id integer primary key,
278
+ speed integer,
279
+ color text
280
+ }
281
+ }
282
+
283
+ -- run
284
+
285
+ apply schema aib;
286
+
287
+ -- run
288
+
289
+ insert into aib.Core values (1, 60, 'red');
290
+
291
+ -- run
292
+
293
+ declare logical schema aiapp {
294
+ table Car {
295
+ id integer primary key,
296
+ mph integer,
297
+ color text
298
+ }
299
+ }
300
+
301
+ -- run
302
+
303
+ declare lens for aiapp over aib {
304
+ view Car as select id, speed * 2 as mph with inverse (speed = new.mph / 2) from aib.Core
305
+ }
306
+
307
+ -- run
308
+
309
+ apply schema aiapp;
310
+
311
+ -- run
312
+
313
+ select * from aiapp.Car order by id;
314
+ → [{"id":1,"mph":120,"color":"red"}]
315
+
316
+ update aiapp.Car set mph = 200 where id = 1;
317
+ select speed from aib.Core where id = 1;
318
+ → [{"speed":100}]
319
+
320
+ -- run
321
+
322
+ -- ===================================
323
+ -- Written-row binding: `new.<x>` where `x` is ALSO assigned in the same UPDATE
324
+ -- binds that assignment's value (the written view row is the post-statement
325
+ -- image), order-independently; an unassigned `x` keeps its forward read image.
326
+ -- ===================================
327
+
328
+ create table ma_t (id integer primary key, a integer, b integer);
329
+ insert into ma_t values (1, 1, 2);
330
+ create view ma_v as select id, a, b + 0 as b2 with inverse (b = new.b2 + new.a) from ma_t;
331
+
332
+ -- co-assigned: new.a sees the NEW a (10), not the pre-update 1
333
+ update ma_v set b2 = 5, a = 10 where id = 1;
334
+ select a, b from ma_t where id = 1;
335
+ → [{"a":10,"b":15}]
336
+
337
+ -- assignment order does not matter (every embedded value reads the pre-update row)
338
+ update ma_v set a = 20, b2 = 7 where id = 1;
339
+ select a, b from ma_t where id = 1;
340
+ → [{"a":20,"b":27}]
341
+
342
+ -- unassigned sibling: new.a is the forward read image (current a = 20)
343
+ update ma_v set b2 = 1 where id = 1;
344
+ select b from ma_t where id = 1;
345
+ → [{"b":21}]
346
+
347
+ -- ...and the same written-row binding through a join view: new.av co-assigned
348
+ -- on the partner side substitutes the assigned value; unassigned it rides the
349
+ -- captured partner read.
350
+ create table mj_a (pid integer primary key, av text);
351
+ create table mj_b (bid integer primary key, pid integer not null references mj_a(pid), bv text);
352
+ insert into mj_a values (1, 'a');
353
+ insert into mj_b values (10, 1, 'b');
354
+ create view mj_v as select mj_a.pid as pid, mj_b.bid as bid, mj_a.av as av,
355
+ bv || '' as bv2 with inverse (bv = new.bv2 || '+' || new.av)
356
+ from mj_a join mj_b on mj_a.pid = mj_b.pid;
357
+
358
+ update mj_v set bv2 = 'x', av = 'NEWA' where pid = 1;
359
+ select av from mj_a;
360
+ → [{"av":"NEWA"}]
361
+ select bv from mj_b;
362
+ → [{"bv":"x+NEWA"}]
363
+
364
+ update mj_v set bv2 = 'y' where pid = 1;
365
+ select bv from mj_b;
366
+ → [{"bv":"y+NEWA"}]
367
+
368
+ -- ===================================
369
+ -- Explicit `create view v(a, b)` column list: output names rename positionally;
370
+ -- `new.<x>` refs (by SELECT-output name) stay bound through the index bridge on
371
+ -- UPDATE and INSERT alike.
372
+ -- ===================================
373
+
374
+ create table cl_t (id integer primary key, raw text);
375
+ create view cl_v (vid, vcode) as select id, raw || '~' as code with inverse (raw = new.code || '!') from cl_t;
376
+
377
+ insert into cl_v (vid, vcode) values (1, 'a');
378
+ select raw from cl_t where id = 1;
379
+ → [{"raw":"a!"}]
380
+
381
+ update cl_v set vcode = 'b' where vid = 1;
382
+ select raw from cl_t where id = 1;
383
+ → [{"raw":"b!"}]
384
+
385
+ select * from cl_v;
386
+ → [{"vid":1,"vcode":"b!~"}]
387
+
388
+ -- ===================================
389
+ -- An aggregate result column cannot carry the clause: the aggregate phase never
390
+ -- reaches the projection lineage the clause rides, so it is rejected loud
391
+ -- rather than silently dropped.
392
+ -- ===================================
393
+
394
+ select sum(x) as s with inverse (x = new.s) from sr_t;
395
+ -- error: WITH INVERSE cannot apply to an aggregate result column
396
+
397
+ -- a bare (non-new-qualified) ref inside a window operand of an inverse
398
+ -- expression is validated like any other in-scope reference
399
+ select id, x + 0 as x2 with inverse (x = sum(new.x2) over (partition by x)) from sr_t;
400
+ -- error: without the NEW qualifier
401
+
402
+ -- ===================================
403
+ -- RENAME propagation, star projection: `select *` exposes the renamed column's
404
+ -- output name, so a sibling clause's `new.<old>` refs retarget with it.
405
+ -- ===================================
406
+
407
+ create table st_t (id integer primary key, tag text, payload text);
408
+ insert into st_t values (1, 'T', 'p');
409
+ create view st_v as select *, payload || '' as p2
410
+ with inverse (payload = new.p2 || ':' || new.tag) from st_t;
411
+
412
+ alter table st_t rename column tag to tag2;
413
+ update st_v set p2 = 'q' where id = 1;
414
+ select payload from st_t where id = 1;
415
+ → [{"payload":"q:T"}]