@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,347 @@
1
+ -- 06.3.5-column-info.sqllogic — column_info(name) per-column updateability surface.
2
+ -- The column-granular companion to view_info(): docs/view-updateability.md
3
+ -- § Information Schema Surface (information_schema.columns.is_updatable).
4
+ -- Columns: schema, name, cid, column_name, is_updatable ('YES'/'NO'),
5
+ -- base_table, base_column (both null for a read-only column). Resolves a base
6
+ -- table, a plain view, or a maintained table (materialized view — derivation-body
7
+ -- lineage, not plain base columns); throws not-found when neither matches.
8
+
9
+ -- ===================================================================
10
+ -- Base table, all columns updatable: every non-generated base column is a
11
+ -- trivially-updatable base write target tracing to itself.
12
+ -- ===================================================================
13
+
14
+ create table t (id integer primary key, name text);
15
+
16
+ select cid, column_name, is_updatable, base_table, base_column from column_info('t');
17
+ → [{"cid":0,"column_name":"id","is_updatable":"YES","base_table":"t","base_column":"id"},{"cid":1,"column_name":"name","is_updatable":"YES","base_table":"t","base_column":"name"}]
18
+
19
+ select schema, name from column_info('t');
20
+ → [{"schema":"main","name":"t"},{"schema":"main","name":"t"}]
21
+
22
+ -- Cardinality: one row per column.
23
+ select count(*) as c from column_info('t');
24
+ → [{"c":2}]
25
+
26
+ -- ===================================================================
27
+ -- Base table with a generated column: the generated column is read-only
28
+ -- (computed lineage) with null base trace; the rest are updatable.
29
+ -- ===================================================================
30
+
31
+ create table g (id integer primary key, a integer, b integer generated always as (a + 1));
32
+ select cid, column_name, is_updatable, base_table, base_column from column_info('g');
33
+ → [{"cid":0,"column_name":"id","is_updatable":"YES","base_table":"g","base_column":"id"},{"cid":1,"column_name":"a","is_updatable":"YES","base_table":"g","base_column":"a"},{"cid":2,"column_name":"b","is_updatable":"NO","base_table":null,"base_column":null}]
34
+
35
+ -- ===================================================================
36
+ -- Identity view: both columns updatable, tracing to the base table.
37
+ -- ===================================================================
38
+
39
+ create view v_identity as select id, name from t;
40
+ select cid, column_name, is_updatable, base_table, base_column from column_info('v_identity');
41
+ → [{"cid":0,"column_name":"id","is_updatable":"YES","base_table":"t","base_column":"id"},{"cid":1,"column_name":"name","is_updatable":"YES","base_table":"t","base_column":"name"}]
42
+
43
+ select schema, name from column_info('v_identity');
44
+ → [{"schema":"main","name":"v_identity"},{"schema":"main","name":"v_identity"}]
45
+
46
+ -- ===================================================================
47
+ -- Rename view: the alias renames the OUTPUT column (column_name), the trace
48
+ -- keeps the underlying base column (base_column).
49
+ -- ===================================================================
50
+
51
+ create view v_rename as select id as user_id, name as full_name from t;
52
+ select cid, column_name, is_updatable, base_table, base_column from column_info('v_rename');
53
+ → [{"cid":0,"column_name":"user_id","is_updatable":"YES","base_table":"t","base_column":"id"},{"cid":1,"column_name":"full_name","is_updatable":"YES","base_table":"t","base_column":"name"}]
54
+
55
+ -- ===================================================================
56
+ -- Computed column among passthroughs: the passthrough column is updatable, the
57
+ -- computed expression column is read-only with null trace.
58
+ -- ===================================================================
59
+
60
+ create view cv as select name, name || '!' as banner from t;
61
+ select cid, column_name, is_updatable, base_table, base_column from column_info('cv');
62
+ → [{"cid":0,"column_name":"name","is_updatable":"YES","base_table":"t","base_column":"name"},{"cid":1,"column_name":"banner","is_updatable":"NO","base_table":null,"base_column":null}]
63
+
64
+ -- ===================================================================
65
+ -- Single-source INVERSE-profile column: `bp = b + 1` is a non-identity invertible
66
+ -- projection of si.b. Its UpdateSite is `base` (si.b) WITH an inverse, which
67
+ -- baseSiteOf resolves like any base site → is_updatable='YES' tracing to the base
68
+ -- column. The opaque sibling `bo = b * 2` (multiplication has no inverse profile)
69
+ -- stays read-only. The single-source UPDATE path now consumes the threaded inverse
70
+ -- (a real write below stores the inverted base value), so static and dynamic agree.
71
+ -- docs § Scalar Invertibility.
72
+ -- ===================================================================
73
+
74
+ create table si (id integer primary key, b integer null);
75
+ create view si_v as select id, b + 1 as bp, b * 2 as bo from si;
76
+ select cid, column_name, is_updatable, base_table, base_column from column_info('si_v');
77
+ → [{"cid":0,"column_name":"id","is_updatable":"YES","base_table":"si","base_column":"id"},{"cid":1,"column_name":"bp","is_updatable":"YES","base_table":"si","base_column":"b"},{"cid":2,"column_name":"bo","is_updatable":"NO","base_table":null,"base_column":null}]
78
+
79
+ -- Dynamic agreement: writing the inverse column stores the inverted base value
80
+ -- (bp = 9 ⇒ b = 8), and the view reads it back through the forward transform.
81
+ insert into si values (1, 5);
82
+ update si_v set bp = 9 where id = 1;
83
+ select id, b from si;
84
+ → [{"id":1,"b":8}]
85
+ select id, bp, bo from si_v;
86
+ → [{"id":1,"bp":9,"bo":16}]
87
+
88
+ -- The opaque sibling stays read-only on the write path too.
89
+ update si_v set bo = 99 where id = 1;
90
+ -- error: read-only
91
+
92
+ -- ===================================================================
93
+ -- Single-source PASSTHROUGH-profile columns: `bc = b collate nocase` and
94
+ -- `nc = cast(n as integer)` (no-op, same logical type) are identity-ON-VALUE
95
+ -- transforms of one base column — their UpdateSite is `base` WITH NO inverse
96
+ -- (passthrough), which baseSiteOf resolves like any base site → is_updatable='YES'
97
+ -- tracing to the base column. The opaque sibling `bo = b || '!'` (concat has no
98
+ -- inverse profile) stays read-only. The single-source UPDATE path now routes the
99
+ -- FULL writable-base set (identity + passthrough + inverse), so a real write below
100
+ -- stores the value VERBATIM (no inverse to apply) and the view reads it back —
101
+ -- static and dynamic agree. docs § Scalar Invertibility.
102
+ -- ===================================================================
103
+
104
+ create table pt (id integer primary key, b text null, n integer null);
105
+ create view pt_v as select id, b collate nocase as bc, cast(n as integer) as nc, b || '!' as bo from pt;
106
+ select cid, column_name, is_updatable, base_table, base_column from column_info('pt_v');
107
+ → [{"cid":0,"column_name":"id","is_updatable":"YES","base_table":"pt","base_column":"id"},{"cid":1,"column_name":"bc","is_updatable":"YES","base_table":"pt","base_column":"b"},{"cid":2,"column_name":"nc","is_updatable":"YES","base_table":"pt","base_column":"n"},{"cid":3,"column_name":"bo","is_updatable":"NO","base_table":null,"base_column":null}]
108
+
109
+ -- Dynamic agreement: a passthrough write stores the value VERBATIM (no inverse to
110
+ -- apply), and the view reads it back through the value-preserving forward transform.
111
+ insert into pt values (1, 'hi', 5);
112
+ update pt_v set bc = 'yo' where id = 1;
113
+ select id, b from pt;
114
+ → [{"id":1,"b":"yo"}]
115
+ update pt_v set nc = 99 where id = 1;
116
+ select id, n from pt;
117
+ → [{"id":1,"n":99}]
118
+ select id, bc, nc from pt_v;
119
+ → [{"id":1,"bc":"yo","nc":99}]
120
+
121
+ -- The opaque sibling stays read-only on the write path too.
122
+ update pt_v set bo = 'X' where id = 1;
123
+ -- error: read-only
124
+
125
+ -- ===================================================================
126
+ -- Multi-source inner join: each output column traces to its own source base
127
+ -- table; all updatable. (cid/note from ms_child, label from ms_parent.)
128
+ -- ===================================================================
129
+
130
+ create table ms_parent (pid integer primary key, label text);
131
+ create table ms_child (cid integer primary key, pref integer, note text,
132
+ foreign key (pref) references ms_parent(pid));
133
+ create view ms_jv as
134
+ select c.cid as cid, c.note as note, p.label as label
135
+ from ms_child c join ms_parent p on p.pid = c.pref;
136
+ select cid, column_name, is_updatable, base_table, base_column from column_info('ms_jv');
137
+ → [{"cid":0,"column_name":"cid","is_updatable":"YES","base_table":"ms_child","base_column":"cid"},{"cid":1,"column_name":"note","is_updatable":"YES","base_table":"ms_child","base_column":"note"},{"cid":2,"column_name":"label","is_updatable":"YES","base_table":"ms_parent","base_column":"label"}]
138
+
139
+ -- ===================================================================
140
+ -- Multi-source inner join with an INVERSE-profile column: `nv1 = c.nv + 1` is a
141
+ -- non-identity invertible projection of iv_child.nv. Its UpdateSite is `base`
142
+ -- (iv_child.nv) WITH an inverse, which baseSiteOf resolves like any base site, so
143
+ -- it reports is_updatable='YES' tracing to the base column — consistent with the
144
+ -- multi-source UPDATE path, which now consumes the threaded inverse (a real write
145
+ -- below stores the inverted base value). docs § Scalar Invertibility, § Inner Join.
146
+ -- ===================================================================
147
+
148
+ create table iv_parent (pid integer primary key, label text);
149
+ create table iv_child (cid integer primary key, pref integer, nv integer,
150
+ foreign key (pref) references iv_parent(pid));
151
+ create view iv_jv as
152
+ select c.cid as cid, c.nv + 1 as nv1, p.label as label
153
+ from iv_child c join iv_parent p on p.pid = c.pref;
154
+ select cid, column_name, is_updatable, base_table, base_column from column_info('iv_jv');
155
+ → [{"cid":0,"column_name":"cid","is_updatable":"YES","base_table":"iv_child","base_column":"cid"},{"cid":1,"column_name":"nv1","is_updatable":"YES","base_table":"iv_child","base_column":"nv"},{"cid":2,"column_name":"label","is_updatable":"YES","base_table":"iv_parent","base_column":"label"}]
156
+
157
+ -- Dynamic agreement: writing the inverse column stores the inverted base value
158
+ -- (nv1 = 9 ⇒ nv = 8), and the view reads it back through the forward transform.
159
+ insert into iv_parent values (1, 'p1');
160
+ insert into iv_child values (10, 1, 5);
161
+ update iv_jv set nv1 = 9 where cid = 10;
162
+ select cid, pref, nv from iv_child;
163
+ → [{"cid":10,"pref":1,"nv":8}]
164
+ select cid, nv1, label from iv_jv;
165
+ → [{"cid":10,"nv1":9,"label":"p1"}]
166
+
167
+ -- ===================================================================
168
+ -- Wholly read-only bodies: every output column is_updatable='NO' with null
169
+ -- trace. Unlike view_info's single conservative row, column_info still emits
170
+ -- one row per output column.
171
+ -- ===================================================================
172
+
173
+ create view values_v as values (1, 2), (3, 4);
174
+ select cid, is_updatable, base_table, base_column from column_info('values_v');
175
+ → [{"cid":0,"is_updatable":"NO","base_table":null,"base_column":null},{"cid":1,"is_updatable":"NO","base_table":null,"base_column":null}]
176
+
177
+ create view agg_v as select count(*) as n from t;
178
+ select cid, column_name, is_updatable, base_table, base_column from column_info('agg_v');
179
+ → [{"cid":0,"column_name":"n","is_updatable":"NO","base_table":null,"base_column":null}]
180
+
181
+ -- ===================================================================
182
+ -- Outer-join body: PER-SIDE updatability. A LEFT outer join is writable on every base
183
+ -- column — the preserved side's columns (aid, av) report is_updatable='YES' with their
184
+ -- base trace, and the non-preserved (`null-extended`) side's column (bv) ALSO reports
185
+ -- 'YES' tracing to oj_b.bv: its UPDATE materializes per row (a matched row updates the
186
+ -- non-preserved base row, a null-extended row inserts one keyed by the EC join key —
187
+ -- `view-write-optional-member-transitions`), since the body has a preserved anchor.
188
+ -- column_info reads the same per-column `null-extended` lineage `view_info` does, so
189
+ -- the two surfaces agree with the dynamic truth.
190
+ -- ===================================================================
191
+
192
+ create table oj_a (aid integer primary key, av text);
193
+ create table oj_b (bid integer primary key, bv text);
194
+ insert into oj_a values (1, 'a1');
195
+ create view oj_left as
196
+ select a.aid as aid, a.av as av, b.bv as bv
197
+ from oj_a a left join oj_b b on b.bid = a.aid;
198
+ select cid, column_name, is_updatable, base_table, base_column from column_info('oj_left');
199
+ → [{"cid":0,"column_name":"aid","is_updatable":"YES","base_table":"oj_a","base_column":"aid"},{"cid":1,"column_name":"av","is_updatable":"YES","base_table":"oj_a","base_column":"av"},{"cid":2,"column_name":"bv","is_updatable":"YES","base_table":"oj_b","base_column":"bv"}]
200
+
201
+ -- Surface agrees with propagate(): both a preserved-side and a non-preserved-side
202
+ -- update are accepted — aid=1 has no oj_b match, so the bv update materializes
203
+ -- oj_b(bid=1, bv='z') via the EC join key (bid = aid) and the row reads back joined.
204
+ update oj_left set av = 'z' where aid = 1;
205
+ update oj_left set bv = 'z' where aid = 1;
206
+ select cid, column_name, is_updatable from column_info('oj_left');
207
+ → [{"cid":0,"column_name":"aid","is_updatable":"YES"},{"cid":1,"column_name":"av","is_updatable":"YES"},{"cid":2,"column_name":"bv","is_updatable":"YES"}]
208
+
209
+ -- RIGHT outer join: the exact mirror of oj_left. oj_b is preserved (the right operand of
210
+ -- a `right` join), oj_a is non-preserved. bid/bv (oj_b) report is_updatable='YES' with
211
+ -- their base trace; the non-preserved av (oj_a) ALSO reports 'YES' tracing oj_a.av — the
212
+ -- preserved oj_b anchor makes the non-preserved column updatable, exactly as oj_left's bv
213
+ -- does. column_info reads the same per-column `null-extended` lineage view_info does.
214
+ create view oj_right as
215
+ select a.av as av, b.bid as bid, b.bv as bv
216
+ from oj_a a right join oj_b b on b.bid = a.aid;
217
+ select cid, column_name, is_updatable, base_table, base_column from column_info('oj_right');
218
+ → [{"cid":0,"column_name":"av","is_updatable":"YES","base_table":"oj_a","base_column":"av"},{"cid":1,"column_name":"bid","is_updatable":"YES","base_table":"oj_b","base_column":"bid"},{"cid":2,"column_name":"bv","is_updatable":"YES","base_table":"oj_b","base_column":"bv"}]
219
+
220
+ -- Surface agrees with propagate(): both a preserved-side (bv) and a non-preserved-side
221
+ -- (av) update are accepted. bid=2 has no oj_a match, so the av update materializes
222
+ -- oj_a(aid=2, av='z2') via the EC join key (aid = bid).
223
+ insert into oj_b values (2, 'b2');
224
+ update oj_right set bv = 'z2' where bid = 2;
225
+ update oj_right set av = 'z2' where bid = 2;
226
+ select cid, column_name, is_updatable from column_info('oj_right');
227
+ → [{"cid":0,"column_name":"av","is_updatable":"YES"},{"cid":1,"column_name":"bid","is_updatable":"YES"},{"cid":2,"column_name":"bv","is_updatable":"YES"}]
228
+
229
+ -- ===================================================================
230
+ -- Non-inner join bodies (Divergence 3): a cross join never null-extends (only
231
+ -- LEFT/RIGHT/FULL do — deriveJoinUpdateLineage), so it carries strict-`base`
232
+ -- lineage and slips past the outer-join gate. propagate() rejects a cross join
233
+ -- (collectInnerJoinSources requires an ON/USING predicate), so column_info must
234
+ -- report every output column is_updatable='NO' with null trace, agreeing with
235
+ -- view_info()'s conservative row.
236
+ --
237
+ -- n-way (≥2) inner equi-joins — composite-PK sides and self-joins included — are
238
+ -- now DECOMPOSABLE (isDecomposableJoinBody accepts them), so column_info reports
239
+ -- each base column updatable with its trace, agreeing with propagate() accepting
240
+ -- the write (covered after the cross join).
241
+ --
242
+ -- Comma / implicit joins are NOT tested here: the SELECT builder rejects ANY
243
+ -- multiple-FROM-source body ("SELECT with multiple FROM sources (joins) not
244
+ -- supported"), so a comma-join view can never be created to reach column_info —
245
+ -- there is no buildable case.
246
+ -- ===================================================================
247
+
248
+ create table ra (aid integer primary key, av text);
249
+ create table rb (bid integer primary key, bv text);
250
+ create table rc (cid integer primary key, cv text);
251
+
252
+ -- Cross join (two-table, no ON): every column 'NO' / null.
253
+ create view cross_v as select a.aid as aid, a.av as av, b.bv as bv
254
+ from ra a cross join rb b;
255
+ select cid, column_name, is_updatable, base_table, base_column from column_info('cross_v');
256
+ → [{"cid":0,"column_name":"aid","is_updatable":"NO","base_table":null,"base_column":null},{"cid":1,"column_name":"av","is_updatable":"NO","base_table":null,"base_column":null},{"cid":2,"column_name":"bv","is_updatable":"NO","base_table":null,"base_column":null}]
257
+
258
+ -- Surface agrees with propagate(): a mutation through the cross-join view is rejected.
259
+ update cross_v set av = 'z' where aid = 1;
260
+ -- error: cannot write through view
261
+
262
+ -- 3-table inner join (> 2 base tables): now decomposable ⇒ each column traces to
263
+ -- its owning base, updatable.
264
+ create view three_v as select a.aid as aid, a.av as av, b.bv as bv, c.cv as cv
265
+ from ra a join rb b on b.bid = a.aid join rc c on c.cid = a.aid;
266
+ select cid, column_name, is_updatable, base_table, base_column from column_info('three_v');
267
+ → [{"cid":0,"column_name":"aid","is_updatable":"YES","base_table":"ra","base_column":"aid"},{"cid":1,"column_name":"av","is_updatable":"YES","base_table":"ra","base_column":"av"},{"cid":2,"column_name":"bv","is_updatable":"YES","base_table":"rb","base_column":"bv"},{"cid":3,"column_name":"cv","is_updatable":"YES","base_table":"rc","base_column":"cv"}]
268
+
269
+ -- Surface agrees with propagate(): a write through the 3-table-join view is accepted
270
+ -- (empty bases ⇒ clean no-op).
271
+ update three_v set av = 'z' where aid = 1;
272
+
273
+ -- Self-join (one table under two alias-bound sites): now decomposable ⇒ each column
274
+ -- traces to its owning alias's scan; both base_table values collapse to `ra`.
275
+ create view self_v as select a.aid as aid, b.av as bv
276
+ from ra a join ra b on b.aid = a.aid;
277
+ select cid, column_name, is_updatable, base_table, base_column from column_info('self_v');
278
+ → [{"cid":0,"column_name":"aid","is_updatable":"YES","base_table":"ra","base_column":"aid"},{"cid":1,"column_name":"bv","is_updatable":"YES","base_table":"ra","base_column":"av"}]
279
+
280
+ -- Surface agrees with propagate(): a write through the self-join view is accepted
281
+ -- (empty base ⇒ clean no-op).
282
+ update self_v set bv = 'z' where aid = 1;
283
+
284
+ -- ===================================================================
285
+ -- Maintained table (materialized view): per-column lineage comes from the SAME
286
+ -- derivation-body walk a plain view gets — NOT the trivially-all-updatable base
287
+ -- branch — because write-through inherits the view-updateability rules
288
+ -- (docs/materialized-views.md § Write boundary). A passthrough column (id) and a
289
+ -- renamed column (label = name) report their SOURCE base column with
290
+ -- is_updatable='YES'; an INVERSE-profile expression (vp = v + 1) stays 'YES'
291
+ -- tracing to its base column (same as a plain view — the write stores the
292
+ -- inverted value); a non-invertible expression (dbl = v * 2) is read-only with
293
+ -- null trace ('no-inverse' on write).
294
+ -- ===================================================================
295
+
296
+ create table mt (id integer primary key, v integer, name text);
297
+ insert into mt values (1, 5, 'a');
298
+ create materialized view mt_mv as select id, name as label, v + 1 as vp, v * 2 as dbl from mt;
299
+
300
+ select cid, column_name, is_updatable, base_table, base_column from column_info('mt_mv');
301
+ → [{"cid":0,"column_name":"id","is_updatable":"YES","base_table":"mt","base_column":"id"},{"cid":1,"column_name":"label","is_updatable":"YES","base_table":"mt","base_column":"name"},{"cid":2,"column_name":"vp","is_updatable":"YES","base_table":"mt","base_column":"v"},{"cid":3,"column_name":"dbl","is_updatable":"NO","base_table":null,"base_column":null}]
302
+
303
+ -- The object identity columns name the maintained table itself, in its schema.
304
+ select distinct schema, name from column_info('mt_mv');
305
+ → [{"schema":"main","name":"mt_mv"}]
306
+
307
+ -- Dynamic agreement with the write-through rewrite: the renamed column routes to
308
+ -- its base column; the inverse column stores the inverted base value (vp = 9 ⇒
309
+ -- v = 8); the non-invertible expression column rejects the write.
310
+ update mt_mv set label = 'z' where id = 1;
311
+ select id, v, name from mt;
312
+ → [{"id":1,"v":5,"name":"z"}]
313
+ update mt_mv set vp = 9 where id = 1;
314
+ select id, v, name from mt;
315
+ → [{"id":1,"v":8,"name":"z"}]
316
+ select id, label, vp, dbl from mt_mv;
317
+ → [{"id":1,"label":"z","vp":9,"dbl":16}]
318
+
319
+ update mt_mv set dbl = 99 where id = 1;
320
+ -- error: read-only
321
+
322
+ -- view_info keeps excluding maintained tables (its surface stays plain-view-only;
323
+ -- the per-column lineage story for an MV lives in column_info above).
324
+ select count(*) as c from view_info('mt_mv');
325
+ → [{"c":0}]
326
+
327
+ -- ===================================================================
328
+ -- MV-sugar column-rename form: the registered output names (mv(pk, dv)) DIFFER
329
+ -- from the body's attribute names (id, v). The maintained-table branch reports
330
+ -- the table's REGISTERED columns as the authoritative output names (positional
331
+ -- override) while the lineage trace still resolves to the SOURCE base column —
332
+ -- exercising the columnNames override that the alias-only MV above cannot.
333
+ -- ===================================================================
334
+
335
+ create table mt2 (id integer primary key, v integer);
336
+ insert into mt2 values (1, 5);
337
+ create materialized view mt2_mv (pk, dv) as select id, v from mt2;
338
+
339
+ select cid, column_name, is_updatable, base_table, base_column from column_info('mt2_mv');
340
+ → [{"cid":0,"column_name":"pk","is_updatable":"YES","base_table":"mt2","base_column":"id"},{"cid":1,"column_name":"dv","is_updatable":"YES","base_table":"mt2","base_column":"v"}]
341
+
342
+ -- ===================================================================
343
+ -- Unknown name throws (mirrors table_info's required-target posture).
344
+ -- ===================================================================
345
+
346
+ select * from column_info('nope');
347
+ -- error: not found
@@ -0,0 +1,29 @@
1
+ -- 06.3.6-schema-views.sqllogic - Testing schema() introspection for views
2
+ --
3
+ -- Carved out of 06.3-schema, which is annotated `requires-capability: standalone-index-ddl`
4
+ -- because its subject is schema() over INDEXES. These three view assertions sit at the end
5
+ -- of that file and need no index at all, so a backend skipping 06.3 would have lost them
6
+ -- for no reason.
7
+ --
8
+ -- Subject: a view appears in schema() with its own name as tbl_name, its `sql` text is
9
+ -- preserved verbatim, and `view` shows up in the distinct object-type list.
10
+
11
+ CREATE TABLE products (
12
+ id INTEGER PRIMARY KEY,
13
+ name TEXT,
14
+ category TEXT
15
+ );
16
+
17
+ CREATE VIEW active_products AS SELECT id, name FROM products WHERE category = 'active';
18
+
19
+ SELECT type, name, tbl_name FROM schema() WHERE type = 'view';
20
+ → [{"type":"view","name":"active_products","tbl_name":"active_products"}]
21
+
22
+ -- Verify view sql is preserved
23
+ SELECT sql FROM schema() WHERE name = 'active_products';
24
+ → [{"sql":"create view active_products as select id, name from products where category = 'active'"}]
25
+
26
+ -- Verify 'view' is in the list of schema object types
27
+ -- (the 'index' member of the same list is asserted in 06.3-schema)
28
+ SELECT DISTINCT type FROM schema() ORDER BY type;
29
+ → [{"type":"function"},{"type":"table"},{"type":"view"}]