@quereus/quereus 4.20.1 → 4.20.3

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 (380) hide show
  1. package/README.md +2 -0
  2. package/dist/src/schema/schema-differ.d.ts.map +1 -1
  3. package/dist/src/schema/schema-differ.js +17 -69
  4. package/dist/src/schema/schema-differ.js.map +1 -1
  5. package/package.json +7 -4
  6. package/test/README.md +173 -0
  7. package/test/logic/01-basic.sqllogic +39 -0
  8. package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
  9. package/test/logic/01.2-strings.sqllogic +43 -0
  10. package/test/logic/01.5-insert-select.sqllogic +237 -0
  11. package/test/logic/01.6-update-extras.sqllogic +118 -0
  12. package/test/logic/01.7-update-from.sqllogic +67 -0
  13. package/test/logic/01.8-delete-extras.sqllogic +122 -0
  14. package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
  15. package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
  16. package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
  17. package/test/logic/01.9-query-expr-values.sqllogic +111 -0
  18. package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
  19. package/test/logic/02-filters.sqllogic +54 -0
  20. package/test/logic/02-smoke.sqllogic +62 -0
  21. package/test/logic/02.1-bind-parameters.sqllogic +223 -0
  22. package/test/logic/03-expressions.sqllogic +190 -0
  23. package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
  24. package/test/logic/03.4-defaults.sqllogic +554 -0
  25. package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
  26. package/test/logic/03.5-tvf.sqllogic +61 -0
  27. package/test/logic/03.6-type-system.sqllogic +544 -0
  28. package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
  29. package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
  30. package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
  31. package/test/logic/03.8-not-precedence.sqllogic +255 -0
  32. package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
  33. package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
  34. package/test/logic/04-order-by.sqllogic +38 -0
  35. package/test/logic/04-transactions.sqllogic +239 -0
  36. package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
  37. package/test/logic/05-vtab_memory.sqllogic +50 -0
  38. package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
  39. package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
  40. package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
  41. package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
  42. package/test/logic/06-builtin_functions.sqllogic +149 -0
  43. package/test/logic/06.1-string-functions.sqllogic +92 -0
  44. package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
  45. package/test/logic/06.2-math-functions.sqllogic +82 -0
  46. package/test/logic/06.3-schema.sqllogic +48 -0
  47. package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
  48. package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
  49. package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
  50. package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
  51. package/test/logic/06.3.4-view-info.sqllogic +378 -0
  52. package/test/logic/06.3.5-column-info.sqllogic +347 -0
  53. package/test/logic/06.3.6-schema-views.sqllogic +29 -0
  54. package/test/logic/06.4-schema-search-path.sqllogic +354 -0
  55. package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
  56. package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
  57. package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
  58. package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
  59. package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
  60. package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
  61. package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
  62. package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
  63. package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
  64. package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
  65. package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
  66. package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
  67. package/test/logic/06.7-json-extended.sqllogic +53 -0
  68. package/test/logic/06.8-json-path-operators.sqllogic +99 -0
  69. package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
  70. package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
  71. package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
  72. package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
  73. package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
  74. package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
  75. package/test/logic/07-aggregates.sqllogic +193 -0
  76. package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
  77. package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
  78. package/test/logic/07.3-group-by-extras.sqllogic +602 -0
  79. package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
  80. package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
  81. package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
  82. package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
  83. package/test/logic/07.5-window.sqllogic +1941 -0
  84. package/test/logic/07.5.1-window-named.sqllogic +13 -0
  85. package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
  86. package/test/logic/07.6-subqueries.sqllogic +78 -0
  87. package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
  88. package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
  89. package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
  90. package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
  91. package/test/logic/07.7.1-in-extras.sqllogic +158 -0
  92. package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
  93. package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
  94. package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
  95. package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
  96. package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
  97. package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
  98. package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
  99. package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
  100. package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
  101. package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
  102. package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
  103. package/test/logic/07.9-in-value-list.sqllogic +154 -0
  104. package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
  105. package/test/logic/08-views.sqllogic +64 -0
  106. package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
  107. package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
  108. package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
  109. package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
  110. package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
  111. package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
  112. package/test/logic/09-set_operations.sqllogic +244 -0
  113. package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
  114. package/test/logic/10-distinct_datatypes.sqllogic +127 -0
  115. package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
  116. package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
  117. package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
  118. package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
  119. package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
  120. package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
  121. package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
  122. package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
  123. package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
  124. package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
  125. package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
  126. package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
  127. package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
  128. package/test/logic/10.2-column-features.sqllogic +365 -0
  129. package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
  130. package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
  131. package/test/logic/10.3-function-features.sqllogic +247 -0
  132. package/test/logic/10.4-schema-scale.sqllogic +168 -0
  133. package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
  134. package/test/logic/10.5-indexes.sqllogic +164 -0
  135. package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
  136. package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
  137. package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
  138. package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
  139. package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
  140. package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
  141. package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
  142. package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
  143. package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
  144. package/test/logic/100.1-where-extras.sqllogic +163 -0
  145. package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
  146. package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
  147. package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
  148. package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
  149. package/test/logic/102-unique-constraints.sqllogic +145 -0
  150. package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
  151. package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
  152. package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
  153. package/test/logic/102.2-unique-collation.sqllogic +181 -0
  154. package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
  155. package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
  156. package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
  157. package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
  158. package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
  159. package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
  160. package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
  161. package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
  162. package/test/logic/108-cardinality-estimation.sqllogic +146 -0
  163. package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
  164. package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
  165. package/test/logic/11-joins.sqllogic +86 -0
  166. package/test/logic/11.1-join-using.sqllogic +267 -0
  167. package/test/logic/11.2-comma-join.sqllogic +35 -0
  168. package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
  169. package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
  170. package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
  171. package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
  172. package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
  173. package/test/logic/12-empty-primary-key.sqllogic +124 -0
  174. package/test/logic/12-join_padding_order.sqllogic +58 -0
  175. package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
  176. package/test/logic/13-cte.sqllogic +137 -0
  177. package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
  178. package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
  179. package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
  180. package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
  181. package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
  182. package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
  183. package/test/logic/13.4-cte-extras.sqllogic +98 -0
  184. package/test/logic/13.5-cte-join-order.sqllogic +166 -0
  185. package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
  186. package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
  187. package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
  188. package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
  189. package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
  190. package/test/logic/14-utilities.sqllogic +168 -0
  191. package/test/logic/15-timespan.sqllogic +279 -0
  192. package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
  193. package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
  194. package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
  195. package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
  196. package/test/logic/16-epoch.sqllogic +187 -0
  197. package/test/logic/17-weekday-modifier.sqllogic +78 -0
  198. package/test/logic/18-json-string-escapes.sqllogic +86 -0
  199. package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
  200. package/test/logic/20-empty-single-row.sqllogic +261 -0
  201. package/test/logic/21-null-edge-cases.sqllogic +227 -0
  202. package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
  203. package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
  204. package/test/logic/21.2-between-edges.sqllogic +157 -0
  205. package/test/logic/22-boundary-values.sqllogic +175 -0
  206. package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
  207. package/test/logic/24-builtin-branches.sqllogic +611 -0
  208. package/test/logic/24.1-substr-extras.sqllogic +75 -0
  209. package/test/logic/24.2-random-extras.sqllogic +39 -0
  210. package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
  211. package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
  212. package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
  213. package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
  214. package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
  215. package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
  216. package/test/logic/26-join-edge-cases.sqllogic +333 -0
  217. package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
  218. package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
  219. package/test/logic/26.3-join-on-constants.sqllogic +61 -0
  220. package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
  221. package/test/logic/27-window-edge-cases.sqllogic +206 -0
  222. package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
  223. package/test/logic/27.2-window-exclude.sqllogic +13 -0
  224. package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
  225. package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
  226. package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
  227. package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
  228. package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
  229. package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
  230. package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
  231. package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
  232. package/test/logic/40-constraints.sqllogic +418 -0
  233. package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
  234. package/test/logic/40.2-check-extras.sqllogic +683 -0
  235. package/test/logic/41-alter-table.sqllogic +191 -0
  236. package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
  237. package/test/logic/41-fk-cross-schema.sqllogic +155 -0
  238. package/test/logic/41-fk-extended-targets.sqllogic +173 -0
  239. package/test/logic/41-foreign-keys.sqllogic +1001 -0
  240. package/test/logic/41-generated-column-errors.sqllogic +225 -0
  241. package/test/logic/41-generated-column-extras.sqllogic +598 -0
  242. package/test/logic/41-generated-column-scope.sqllogic +329 -0
  243. package/test/logic/41-generated-columns.sqllogic +361 -0
  244. package/test/logic/41.1-alter-pk.sqllogic +230 -0
  245. package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
  246. package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
  247. package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
  248. package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
  249. package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
  250. package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
  251. package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
  252. package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
  253. package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
  254. package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
  255. package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
  256. package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
  257. package/test/logic/41.2-alter-column.sqllogic +382 -0
  258. package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
  259. package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
  260. package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
  261. package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
  262. package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
  263. package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
  264. package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
  265. package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
  266. package/test/logic/41.5-alter-misc.sqllogic +48 -0
  267. package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
  268. package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
  269. package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
  270. package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
  271. package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
  272. package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
  273. package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
  274. package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
  275. package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
  276. package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
  277. package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
  278. package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
  279. package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
  280. package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
  281. package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
  282. package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
  283. package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
  284. package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
  285. package/test/logic/42-committed-snapshot.sqllogic +254 -0
  286. package/test/logic/42-returning.sqllogic +159 -0
  287. package/test/logic/42.1-returning-extras.sqllogic +232 -0
  288. package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
  289. package/test/logic/43-default-nullability.sqllogic +131 -0
  290. package/test/logic/43-transition-constraints.sqllogic +341 -0
  291. package/test/logic/43.1-default-collation.sqllogic +140 -0
  292. package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
  293. package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
  294. package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
  295. package/test/logic/44-determinism-validation.sqllogic +164 -0
  296. package/test/logic/44-orthogonality.sqllogic +146 -0
  297. package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
  298. package/test/logic/45-udf-determinism.sqllogic +39 -0
  299. package/test/logic/46-mutation-context.sqllogic +595 -0
  300. package/test/logic/47-upsert.sqllogic +255 -0
  301. package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
  302. package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
  303. package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
  304. package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
  305. package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
  306. package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
  307. package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
  308. package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
  309. package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
  310. package/test/logic/49-reference-graph.sqllogic +84 -0
  311. package/test/logic/50-declarative-schema.sqllogic +2550 -0
  312. package/test/logic/50-metadata-tags.sqllogic +1033 -0
  313. package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
  314. package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
  315. package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
  316. package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +210 -0
  317. package/test/logic/50.3-declare-schema-duplicate-names.sqllogic +280 -0
  318. package/test/logic/50.4-declare-schema-apply-restore.sqllogic +192 -0
  319. package/test/logic/51-lens-foundation.sqllogic +147 -0
  320. package/test/logic/51-materialized-views.sqllogic +376 -0
  321. package/test/logic/51.5-materialized-views-coarsened-key.sqllogic +198 -0
  322. package/test/logic/51.7-maintained-table-attach-detach.sqllogic +468 -0
  323. package/test/logic/51.8-maintained-table-declared-constraints.sqllogic +440 -0
  324. package/test/logic/51.85-maintained-table-parent-fk.sqllogic +103 -0
  325. package/test/logic/51.9-maintained-table-secondary-unique.sqllogic +237 -0
  326. package/test/logic/51.9.1-maintained-table-partial-unique.sqllogic +36 -0
  327. package/test/logic/52-lens-overrides.sqllogic +566 -0
  328. package/test/logic/53-materialized-views-rowtime.sqllogic +1601 -0
  329. package/test/logic/53-reserved-tags.sqllogic +252 -0
  330. package/test/logic/53.1-materialized-view-write-through.sqllogic +329 -0
  331. package/test/logic/53.2-materialized-view-rename-propagation.sqllogic +483 -0
  332. package/test/logic/53.3-materialized-view-constraint-only-ddl.sqllogic +409 -0
  333. package/test/logic/53.3.1-materialized-view-index-ddl-irrelevance.sqllogic +29 -0
  334. package/test/logic/53.4-materialized-view-structural-alter-restore.sqllogic +436 -0
  335. package/test/logic/54-covering-mv-enforcement.sqllogic +314 -0
  336. package/test/logic/54.1-covering-mv-partial-enforcement.sqllogic +34 -0
  337. package/test/logic/55-internal-eviction-reporting.sqllogic +89 -0
  338. package/test/logic/55-lens-prover.sqllogic +202 -0
  339. package/test/logic/55.1-eviction-restrict-fk.sqllogic +148 -0
  340. package/test/logic/55.5-lens-authored-inverse.sqllogic +1468 -0
  341. package/test/logic/80-grow-retrieve-pass.sqllogic +79 -0
  342. package/test/logic/81-quickpick.sqllogic +24 -0
  343. package/test/logic/82-bloom-join.sqllogic +185 -0
  344. package/test/logic/83-merge-join.sqllogic +280 -0
  345. package/test/logic/84-asof-scan.sqllogic +238 -0
  346. package/test/logic/84-key-cardinality.sqllogic +50 -0
  347. package/test/logic/85-relational-const-folding.sqllogic +51 -0
  348. package/test/logic/86-scalar-cse.sqllogic +42 -0
  349. package/test/logic/90-error_paths.sqllogic +114 -0
  350. package/test/logic/90.1-parse-errors.sqllogic +77 -0
  351. package/test/logic/90.2-alter-table-errors.sqllogic +53 -0
  352. package/test/logic/90.2.1-alter-extra-errors.sqllogic +51 -0
  353. package/test/logic/90.3-expression-errors.sqllogic +43 -0
  354. package/test/logic/90.4-dml-errors.sqllogic +47 -0
  355. package/test/logic/90.5-unsupported-join-types.sqllogic +37 -0
  356. package/test/logic/90.5.1-right-full-join-read.sqllogic +157 -0
  357. package/test/logic/90.6-select-error-paths.sqllogic +57 -0
  358. package/test/logic/91-merge-join-edge-cases.sqllogic +159 -0
  359. package/test/logic/92-hash-aggregate-edge-cases.sqllogic +139 -0
  360. package/test/logic/93-ddl-view-edge-cases.sqllogic +104 -0
  361. package/test/logic/93.1-view-error-paths.sqllogic +74 -0
  362. package/test/logic/93.2-view-mutation-pending.sqllogic +108 -0
  363. package/test/logic/93.3-view-mutation-or-clause.sqllogic +60 -0
  364. package/test/logic/93.4-view-mutation.sqllogic +4881 -0
  365. package/test/logic/93.4.1-view-mutation-partial-unique-cardinality.sqllogic +31 -0
  366. package/test/logic/93.5-authored-inverse.sqllogic +415 -0
  367. package/test/logic/93.6-set-op-flagless-write.sqllogic +862 -0
  368. package/test/logic/94-tvf-edge-cases.sqllogic +58 -0
  369. package/test/logic/94.1-limit-offset-edge-cases.sqllogic +109 -0
  370. package/test/logic/94.2-limit-offset-extras.sqllogic +98 -0
  371. package/test/logic/95-assertions.sqllogic +1417 -0
  372. package/test/logic/96-subquery-edge-cases.sqllogic +276 -0
  373. package/test/logic/97-json-function-edge-cases.sqllogic +633 -0
  374. package/test/logic/97.1-json-blob-and-special-values.sqllogic +92 -0
  375. package/test/logic/98-temporal-edge-cases.sqllogic +515 -0
  376. package/test/logic/99-conversion-edge-cases.sqllogic +325 -0
  377. package/test/logic/99.0.1-schema-index-listing.sqllogic +21 -0
  378. package/test/logic/99.1-cast-syntax-extras.sqllogic +167 -0
  379. package/test/logic/drop-unique-index.sqllogic +88 -0
  380. package/test/logic/pushdown-test.sqllogic +36 -0
@@ -0,0 +1,436 @@
1
+ -- 53.4-materialized-view-structural-alter-restore.sqllogic — a STRUCTURAL source
2
+ -- ALTER (ADD COLUMN / DROP COLUMN / ALTER COLUMN SET DATA TYPE / SET·DROP NOT NULL /
3
+ -- SET COLLATE) keeps a dependent MV LIVE when the MV body provably never reads the
4
+ -- altered column, instead of always marking it stale. This generalizes the
5
+ -- constraint-only recompile of 53.3: the listener re-derives the backing shape AND —
6
+ -- for a value-semantics ALTER (type/collation) — proves the change is DISJOINT from
7
+ -- every source column the body reads (directly, in a WHERE/join/group/order position,
8
+ -- or transitively through a generated column). Shape identity does NOT imply content
9
+ -- identity for a structural ALTER, so the disjointness proof is what makes keep-live
10
+ -- sound. Any failure falls back to today's mark-stale path; a stale MV serves its
11
+ -- frozen snapshot (writes stop propagating) until REFRESH or drop-and-recreate.
12
+
13
+ -- ===================================
14
+ -- 1. ADD COLUMN unreferenced → live (the new column is invisible to the body)
15
+ -- ===================================
16
+
17
+ create table t1 (id integer primary key, u integer not null, v integer not null);
18
+ insert into t1 values (1, 10, 100);
19
+ create materialized view mv1 as select id, u from t1;
20
+
21
+ alter table t1 add column w integer default 0;
22
+
23
+ -- still live: the write propagates and the new column never reaches the MV
24
+ insert into t1 (id, u, v) values (2, 20, 200);
25
+ select * from mv1 order by id;
26
+ → [{"id":1,"u":10},{"id":2,"u":20}]
27
+
28
+ drop materialized view mv1;
29
+ drop table t1;
30
+
31
+ -- ===================================
32
+ -- 2. ADD COLUMN with a `select *` body → frozen; REFRESH reshapes
33
+ -- ===================================
34
+
35
+ create table t2 (id integer primary key, v integer not null);
36
+ insert into t2 values (1, 10);
37
+ create materialized view mv2 as select * from t2;
38
+
39
+ alter table t2 add column w integer default 0;
40
+
41
+ -- frozen: `select *` re-derives to 3 columns ⇒ shape mismatch ⇒ stale
42
+ insert into t2 (id, v) values (2, 20);
43
+ select * from mv2 order by id;
44
+ → [{"id":1,"v":10}]
45
+
46
+ -- REFRESH reshapes the backing to the wider body (the added column backfilled to 0)
47
+ refresh materialized view mv2;
48
+ select * from mv2 order by id;
49
+ → [{"id":1,"v":10,"w":0},{"id":2,"v":20,"w":0}]
50
+
51
+ drop materialized view mv2;
52
+ drop table t2;
53
+
54
+ -- ===================================
55
+ -- 3. DROP COLUMN unreferenced → live
56
+ -- ===================================
57
+
58
+ create table t3 (id integer primary key, u integer not null, v integer not null);
59
+ insert into t3 values (1, 10, 100);
60
+ create materialized view mv3 as select id, u from t3;
61
+
62
+ alter table t3 drop column v;
63
+
64
+ -- still live: the body reads id,u (never v); re-derives the identical shape
65
+ insert into t3 (id, u) values (2, 20);
66
+ select * from mv3 order by id;
67
+ → [{"id":1,"u":10},{"id":2,"u":20}]
68
+
69
+ drop materialized view mv3;
70
+ drop table t3;
71
+
72
+ -- ===================================
73
+ -- 4. DROP COLUMN referenced (in projection) → frozen; recover via drop-and-recreate
74
+ -- ===================================
75
+
76
+ create table t4 (id integer primary key, u integer not null, v integer not null);
77
+ insert into t4 values (1, 10, 100);
78
+ create materialized view mv4 as select id, v from t4;
79
+
80
+ alter table t4 drop column v;
81
+ insert into t4 (id, u) values (2, 20);
82
+
83
+ -- stale: the body references the dropped column, so the next reference re-validates
84
+ -- the body, which no longer plans (v is gone) → the staleness diagnostic
85
+ select id from mv4 order by id;
86
+ -- error: drop and recreate
87
+
88
+ -- drop-and-recreate (over a body that no longer names v) recovers
89
+ drop materialized view mv4;
90
+ create materialized view mv4 as select id, u from t4;
91
+ select * from mv4 order by id;
92
+ → [{"id":1,"u":10},{"id":2,"u":20}]
93
+
94
+ drop materialized view mv4;
95
+ drop table t4;
96
+
97
+ -- ===================================
98
+ -- 5. DROP COLUMN with a `select *` body → frozen
99
+ -- ===================================
100
+
101
+ create table t5 (id integer primary key, v integer not null, x integer);
102
+ insert into t5 values (1, 10, 1000);
103
+ create materialized view mv5 as select * from t5;
104
+
105
+ alter table t5 drop column x;
106
+
107
+ -- frozen: `select *` re-derives to fewer columns ⇒ shape mismatch ⇒ stale
108
+ insert into t5 (id, v) values (2, 20);
109
+ select id, v from mv5 order by id;
110
+ → [{"id":1,"v":10}]
111
+
112
+ drop materialized view mv5;
113
+ drop table t5;
114
+
115
+ -- ===================================
116
+ -- 6. ALTER COLUMN SET DATA TYPE on an unprojected, UNREFERENCED column → live
117
+ -- ===================================
118
+
119
+ create table t6 (id integer primary key, u integer not null, v integer not null);
120
+ insert into t6 values (1, 10, 100);
121
+ create materialized view mv6 as select id, u from t6;
122
+
123
+ alter table t6 alter column v set data type real;
124
+
125
+ -- live: v is neither projected nor read ⇒ value-semantics change is disjoint
126
+ insert into t6 (id, u, v) values (2, 20, 200);
127
+ select * from mv6 order by id;
128
+ → [{"id":1,"u":10},{"id":2,"u":20}]
129
+
130
+ drop materialized view mv6;
131
+ drop table t6;
132
+
133
+ -- ===================================
134
+ -- 7. ALTER COLUMN SET DATA TYPE on a PROJECTED column → frozen; REFRESH reshapes
135
+ -- (parity with case 8 of 53.3 — the output column type shifts)
136
+ -- ===================================
137
+
138
+ create table t7 (id integer primary key, v integer not null);
139
+ insert into t7 values (1, 5);
140
+ create materialized view mv7 as select id, v from t7;
141
+
142
+ alter table t7 alter column v set data type real;
143
+
144
+ -- frozen: the projected column's output type shifts ⇒ shape mismatch ⇒ stale
145
+ insert into t7 values (2, 6);
146
+ select id from mv7 order by id;
147
+ → [{"id":1}]
148
+
149
+ -- REFRESH reshapes the backing column to the new type
150
+ refresh materialized view mv7;
151
+ select id from mv7 order by id;
152
+ → [{"id":1},{"id":2}]
153
+
154
+ drop materialized view mv7;
155
+ drop table t7;
156
+
157
+ -- ===================================
158
+ -- 8. ALTER COLUMN SET DATA TYPE on an unprojected WHERE column → frozen
159
+ -- (shape identical, but the content-stability gate proves it is READ)
160
+ -- ===================================
161
+
162
+ create table t8 (id integer primary key, u integer not null, v integer not null);
163
+ insert into t8 values (1, 10, 5), (2, 20, 50);
164
+ create materialized view mv8 as select id, u from t8 where v > 10;
165
+ select * from mv8 order by id;
166
+ → [{"id":2,"u":20}]
167
+
168
+ alter table t8 alter column v set data type real;
169
+
170
+ -- frozen: v is unprojected (shape unchanged) but READ in WHERE ⇒ disjointness fails
171
+ insert into t8 (id, u, v) values (3, 30, 100);
172
+ select * from mv8 order by id;
173
+ → [{"id":2,"u":20}]
174
+
175
+ drop materialized view mv8;
176
+ drop table t8;
177
+
178
+ -- ===================================
179
+ -- 9. ALTER COLUMN SET COLLATE on an unprojected WHERE column → frozen
180
+ -- (NOCASE flips which rows the predicate admits — the canonical
181
+ -- content-changes-but-shape-doesn't proof). REFRESH recovers under the new collation.
182
+ -- ===================================
183
+
184
+ create table t9 (id integer primary key, u integer not null, name text not null);
185
+ insert into t9 values (1, 10, 'apple'), (2, 20, 'APPLE');
186
+ create materialized view mv9 as select id, u from t9 where name = 'apple';
187
+ -- under BINARY only the exact-case row matches
188
+ select * from mv9 order by id;
189
+ → [{"id":1,"u":10}]
190
+
191
+ alter table t9 alter column name set collate nocase;
192
+
193
+ -- frozen: name is unprojected (shape unchanged) but READ in WHERE ⇒ disjointness fails.
194
+ -- The keep-live path would have served the BINARY-era row set even as the predicate's
195
+ -- meaning changed — the divergence the proof prevents.
196
+ insert into t9 (id, u, name) values (3, 30, 'apple');
197
+ select * from mv9 order by id;
198
+ → [{"id":1,"u":10}]
199
+
200
+ -- REFRESH re-derives under NOCASE: now 'apple', 'APPLE', and 'apple' all match
201
+ refresh materialized view mv9;
202
+ select * from mv9 order by id;
203
+ → [{"id":1,"u":10},{"id":2,"u":20},{"id":3,"u":30}]
204
+
205
+ drop materialized view mv9;
206
+ drop table t9;
207
+
208
+ -- ===================================
209
+ -- 10. ALTER COLUMN SET COLLATE on a fully UNREFERENCED column → live
210
+ -- ===================================
211
+
212
+ create table t10 (id integer primary key, u integer not null, name text not null);
213
+ insert into t10 values (1, 10, 'apple');
214
+ create materialized view mv10 as select id, u from t10;
215
+
216
+ alter table t10 alter column name set collate nocase;
217
+
218
+ -- live: name is neither projected nor read ⇒ disjoint ⇒ writes keep propagating
219
+ insert into t10 (id, u, name) values (2, 20, 'BANANA');
220
+ select * from mv10 order by id;
221
+ → [{"id":1,"u":10},{"id":2,"u":20}]
222
+
223
+ drop materialized view mv10;
224
+ drop table t10;
225
+
226
+ -- ===================================
227
+ -- 11. ALTER COLUMN DROP NOT NULL on an unprojected column → live
228
+ -- (NOT NULL is content-irrelevant; the value-semantics-changed set is empty)
229
+ -- ===================================
230
+
231
+ create table t11 (id integer primary key, u integer not null, v integer not null);
232
+ insert into t11 values (1, 10, 100);
233
+ create materialized view mv11 as select id, u from t11;
234
+
235
+ alter table t11 alter column v drop not null;
236
+
237
+ -- live: a NOT NULL change cannot alter an existing value; v unprojected/unread
238
+ insert into t11 (id, u) values (2, 20);
239
+ select * from mv11 order by id;
240
+ → [{"id":1,"u":10},{"id":2,"u":20}]
241
+
242
+ drop materialized view mv11;
243
+ drop table t11;
244
+
245
+ -- ===================================
246
+ -- 12. ALTER COLUMN SET NOT NULL on a PROJECTED column → frozen
247
+ -- (output nullability shifts ⇒ shape mismatch)
248
+ -- ===================================
249
+
250
+ create table t12 (id integer primary key, v integer null);
251
+ insert into t12 values (1, 5);
252
+ create materialized view mv12 as select id, v from t12;
253
+
254
+ alter table t12 alter column v set not null;
255
+
256
+ -- frozen: the projected column's output nullability shifts ⇒ shape mismatch ⇒ stale
257
+ insert into t12 values (2, 6);
258
+ select id from mv12 order by id;
259
+ → [{"id":1}]
260
+
261
+ drop materialized view mv12;
262
+ drop table t12;
263
+
264
+ -- ===================================
265
+ -- 13. Generated-column indirection: body projects g (generated from v) but never
266
+ -- names v; ALTER COLUMN v type → frozen via the transitive-closure proof.
267
+ -- Without the closure this would be UNSOUND (live with stale g values).
268
+ -- ===================================
269
+
270
+ create table t13 (id integer primary key, v integer not null, g integer generated always as (v * 2) stored);
271
+ insert into t13 (id, v) values (1, 5);
272
+ create materialized view mv13 as select id, g from t13;
273
+ select * from mv13 order by id;
274
+ → [{"id":1,"g":10}]
275
+
276
+ alter table t13 alter column v set data type real;
277
+
278
+ -- frozen: v is read transitively through the generated column g ⇒ disjointness fails
279
+ insert into t13 (id, v) values (2, 6);
280
+ select id from mv13 order by id;
281
+ → [{"id":1}]
282
+
283
+ drop materialized view mv13;
284
+ drop table t13;
285
+
286
+ -- ===================================
287
+ -- 14. Self-join over the altered source, altered column read via one alias → frozen
288
+ -- ===================================
289
+
290
+ create table t14 (id integer primary key, u integer not null, v integer not null);
291
+ insert into t14 values (1, 10, 2), (2, 20, 1);
292
+ create materialized view mv14 as select a.id, a.u from t14 a join t14 b on a.v = b.id;
293
+ select * from mv14 order by id;
294
+ → [{"id":1,"u":10},{"id":2,"u":20}]
295
+
296
+ alter table t14 alter column v set data type real;
297
+
298
+ -- frozen: v is read via alias `a` in the join predicate (union over self-join occurrences)
299
+ insert into t14 (id, u, v) values (3, 30, 1);
300
+ select * from mv14 order by id;
301
+ → [{"id":1,"u":10},{"id":2,"u":20}]
302
+
303
+ drop materialized view mv14;
304
+ drop table t14;
305
+
306
+ -- ===================================
307
+ -- 15. Multi-dependent independence: one ALTER, two dependents — the one that reads
308
+ -- the altered column freezes, the sibling that does not stays live.
309
+ -- ===================================
310
+
311
+ create table t15 (id integer primary key, u integer not null, v integer not null);
312
+ insert into t15 values (1, 10, 100);
313
+ create materialized view mv15_reads as select id, u from t15 where v > 50;
314
+ create materialized view mv15_noreads as select id, u from t15;
315
+
316
+ alter table t15 alter column v set data type real;
317
+ insert into t15 (id, u, v) values (2, 20, 200);
318
+
319
+ -- the WHERE-v dependent froze
320
+ select * from mv15_reads order by id;
321
+ → [{"id":1,"u":10}]
322
+
323
+ -- the sibling that never reads v stayed live
324
+ select * from mv15_noreads order by id;
325
+ → [{"id":1,"u":10},{"id":2,"u":20}]
326
+
327
+ drop materialized view mv15_reads;
328
+ drop materialized view mv15_noreads;
329
+ drop table t15;
330
+
331
+ -- ===================================
332
+ -- 16. Pre-existing staleness is never cleared by a structural ALTER:
333
+ -- a projected retype stales the MV; a later (disjoint) ADD COLUMN must NOT
334
+ -- revive it — only REFRESH recovers (mirror of case 8 of 53.3).
335
+ -- ===================================
336
+
337
+ create table t16 (id integer primary key, v integer not null);
338
+ insert into t16 values (1, 5);
339
+ create materialized view mv16 as select id, v from t16;
340
+
341
+ alter table t16 alter column v set data type real;
342
+
343
+ -- frozen: the write does not propagate
344
+ insert into t16 values (2, 6);
345
+ select id from mv16 order by id;
346
+ → [{"id":1}]
347
+
348
+ -- a disjoint structural ALTER (ADD COLUMN) must NOT revive a pre-existing stale flag
349
+ alter table t16 add column w integer default 0;
350
+ insert into t16 (id, v) values (3, 7);
351
+ select id from mv16 order by id;
352
+ → [{"id":1}]
353
+
354
+ -- REFRESH recovers (reshapes the backing to the retyped column)
355
+ refresh materialized view mv16;
356
+ select id from mv16 order by id;
357
+ → [{"id":1},{"id":2},{"id":3}]
358
+
359
+ drop materialized view mv16;
360
+ drop table t16;
361
+
362
+ -- ===================================
363
+ -- 17a. MV-over-MV: a structural ALTER on the base that keeps the producer LIVE keeps
364
+ -- BOTH levels live (the keep-live path emits no backing invalidation, so the
365
+ -- consumer never sees a spurious staleness cascade).
366
+ -- ===================================
367
+
368
+ create table b17 (id integer primary key, u integer not null, v integer not null);
369
+ insert into b17 values (1, 10, 100);
370
+ create materialized view mv17a as select id, u from b17;
371
+ create materialized view mv17b as select id, u from mv17a;
372
+
373
+ alter table b17 alter column v set data type real;
374
+
375
+ insert into b17 (id, u, v) values (2, 20, 200);
376
+ select * from mv17a order by id;
377
+ → [{"id":1,"u":10},{"id":2,"u":20}]
378
+ select * from mv17b order by id;
379
+ → [{"id":1,"u":10},{"id":2,"u":20}]
380
+
381
+ drop materialized view mv17b;
382
+ drop materialized view mv17a;
383
+ drop table b17;
384
+
385
+ -- ===================================
386
+ -- 17b. MV-over-MV: a structural ALTER that STALES the producer cascades to the
387
+ -- consumer via emitBackingInvalidation. The synthetic same-object table_modified
388
+ -- is deliberately NOT intercepted by the keep-live recompile (the
389
+ -- `oldObject !== newObject` guard) — THE load-bearing constraint. Both freeze.
390
+ -- ===================================
391
+
392
+ create table b18 (id integer primary key, v integer not null);
393
+ insert into b18 values (1, 5);
394
+ create materialized view mv18a as select id, v from b18;
395
+ create materialized view mv18b as select id, v from mv18a;
396
+
397
+ alter table b18 alter column v set data type real;
398
+
399
+ insert into b18 values (2, 6);
400
+ select id from mv18a order by id;
401
+ → [{"id":1}]
402
+ select id from mv18b order by id;
403
+ → [{"id":1}]
404
+
405
+ drop materialized view mv18b;
406
+ drop materialized view mv18a;
407
+ drop table b18;
408
+
409
+ -- ===================================
410
+ -- 18. Content gate reaches a NESTED relation: the altered column is read ONLY
411
+ -- inside a correlated subquery (neither projected nor in a top-level WHERE).
412
+ -- The read-set walk must recurse through `getRelations` into the subquery to
413
+ -- see the correlated reference — otherwise the MV would be wrongly kept live
414
+ -- (unsound: serving the pre-ALTER row set). Mirror of case 14 for nesting
415
+ -- rather than a self-join.
416
+ -- ===================================
417
+
418
+ create table t19 (id integer primary key, u integer not null, v integer not null);
419
+ create table keys19 (k integer primary key);
420
+ insert into t19 values (1, 10, 5), (2, 20, 6);
421
+ insert into keys19 values (5);
422
+ create materialized view mv19 as select id, u from t19 where exists (select 1 from keys19 where keys19.k = t19.v);
423
+ select * from mv19 order by id;
424
+ → [{"id":1,"u":10}]
425
+
426
+ alter table t19 alter column v set data type real;
427
+
428
+ -- frozen: t19.v is read only via the correlated reference inside the EXISTS subquery,
429
+ -- reached through the read-set walk's recursion into nested relations ⇒ disjointness fails
430
+ insert into t19 (id, u, v) values (3, 30, 5);
431
+ select * from mv19 order by id;
432
+ → [{"id":1,"u":10}]
433
+
434
+ drop materialized view mv19;
435
+ drop table keys19;
436
+ drop table t19;