@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,602 @@
1
+ -- 41.10.4-drop-object-expression-dependents.sqllogic
2
+ --
3
+ -- Subject: `DROP TABLE` / `DROP VIEW` / `DROP MATERIALIZED VIEW` vs. a stored expression
4
+ -- on ANOTHER table that can still REACH the dropped object — a CHECK constraint, a column
5
+ -- DEFAULT, or a `GENERATED ALWAYS AS` body, each reaching it through a subquery, either
6
+ -- directly (§1-§9) or through any chain of view / materialized-view bodies (§10-§15).
7
+ --
8
+ -- This is the table-verb half of 41.10.2. Both verbs resolve at the same question the
9
+ -- catalog could not previously answer — "which stored table expressions reference this
10
+ -- object?" — and both now answer it the same way, so `drop table t` and
11
+ -- `alter table t drop column v` cannot disagree about the same constraint.
12
+ --
13
+ -- Left unguarded, the drop was accepted and the REFERENCING table became unwritable at
14
+ -- the next INSERT, with `Table 't' not found in schema path: main` — an error naming
15
+ -- neither the object the user dropped nor the constraint that broke.
16
+ --
17
+ -- Policy is REFUSE, matching the whole expression-dependent family (`assertion-drop-guard.ts`,
18
+ -- `drop-column-guards.ts`) and SQLite's position. What refuse does NOT extend to is the
19
+ -- referencing side of a plain VIEW: dropping a table out from under a view stays legal and
20
+ -- leaves the view broken (§5) — a broken view breaks queries OF that view, while a broken
21
+ -- CHECK makes a whole table unwritable.
22
+ --
23
+ -- No `-- requires-capability:` directive: the file uses no standalone index DDL, so it
24
+ -- runs under both the memory module (`yarn test`) and the store module (`yarn test:store`).
25
+
26
+ -- ===================================================================
27
+ -- 1. A CHECK on another table refuses the drop; drop the constraint to proceed
28
+ -- ===================================================================
29
+
30
+ create table DtSrc (id integer primary key, v integer);
31
+ insert into DtSrc values (1, 10);
32
+ create table DtRef (id integer primary key, n integer,
33
+ constraint ck_dt check (n < (select max(v) from DtSrc)));
34
+ -- run
35
+
36
+ drop table DtSrc;
37
+ -- error: it is referenced by CHECK constraint 'ck_dt' on table 'DtRef'
38
+
39
+ -- Nothing was applied: DtSrc is still there, and DtRef is still writable AND still
40
+ -- enforcing — the damage the refusal prevents.
41
+ insert into DtRef values (1, 1);
42
+ select n from DtRef;
43
+ → [{"n":1}]
44
+
45
+ insert into DtRef values (2, 99);
46
+ -- error: ck_dt
47
+
48
+ -- Escape hatch: remove the reference, then the drop goes through.
49
+ alter table DtRef drop constraint ck_dt;
50
+ drop table DtSrc;
51
+ -- run
52
+
53
+ insert into DtRef values (3, 99);
54
+ select count(*) as c from DtRef;
55
+ → [{"c":2}]
56
+
57
+ drop table DtRef;
58
+ -- run
59
+
60
+ -- ===================================================================
61
+ -- 2. An UNNAMED CHECK has no name to quote, so the message quotes its expression
62
+ -- ===================================================================
63
+ --
64
+ -- Accepted cost, exactly as in §2 of 41.10.2: `DROP CONSTRAINT` resolves by name only, so
65
+ -- the referenced table can only be dropped by rebuilding the REFERENCING one. The quoted
66
+ -- expression is the only handle the user has on it.
67
+
68
+ create table DtASrc (id integer primary key, v integer);
69
+ create table DtARef (id integer primary key, n integer, check (n < (select max(v) from DtASrc)));
70
+ -- run
71
+
72
+ drop table DtASrc;
73
+ -- error: it is referenced by the CHECK constraint (n < (select max(v) from DtASrc))
74
+
75
+ drop table DtARef;
76
+ drop table DtASrc;
77
+ -- run
78
+
79
+ -- ===================================================================
80
+ -- 3. A DEFAULT and a GENERATED body on another table refuse it too
81
+ -- ===================================================================
82
+
83
+ create table DtDSrc (id integer primary key, v integer);
84
+ insert into DtDSrc values (1, 11);
85
+ create table DtDRef (id integer primary key, w integer default ((select min(v) from DtDSrc)));
86
+ -- run
87
+
88
+ drop table DtDSrc;
89
+ -- error: it is referenced by the DEFAULT of column 'w' on table 'DtDRef'
90
+
91
+ insert into DtDRef (id) values (1);
92
+ select id, w from DtDRef;
93
+ → [{"id":1,"w":11}]
94
+
95
+ drop table DtDRef;
96
+ drop table DtDSrc;
97
+ -- run
98
+
99
+ create table DtGSrc (id integer primary key, v integer);
100
+ insert into DtGSrc values (1, 12);
101
+ create table DtGRef (id integer primary key,
102
+ g integer generated always as ((select max(DtGSrc.v) from DtGSrc)));
103
+ -- run
104
+
105
+ drop table DtGSrc;
106
+ -- error: it is referenced by the GENERATED expression of column 'g' on table 'DtGRef'
107
+
108
+ drop table DtGRef;
109
+ drop table DtGSrc;
110
+ -- run
111
+
112
+ -- ===================================================================
113
+ -- 4. A table's own SELF-referencing CHECK never blocks its own drop
114
+ -- ===================================================================
115
+ --
116
+ -- The constraint goes away with the table, so there is nothing left pointing at a missing
117
+ -- name. Refusing here would make every self-referencing table undroppable. (The COLUMN
118
+ -- verb is the opposite case and keeps the altered table in scope: dropping one column
119
+ -- leaves the rest of the table, and its CHECKs, behind.)
120
+
121
+ create table DtSelf (id integer primary key, v integer,
122
+ check (v <= (select max(v) from DtSelf)));
123
+ insert into DtSelf values (1, 1);
124
+ -- run
125
+
126
+ drop table DtSelf;
127
+ -- run
128
+
129
+ -- ===================================================================
130
+ -- 5. A plain VIEW over the table does NOT block the drop
131
+ -- ===================================================================
132
+ --
133
+ -- The engine's stated asymmetry, unchanged by this guard. A broken view breaks queries of
134
+ -- that view and nothing else, so the drop stays legal.
135
+
136
+ create table DtViewed (id integer primary key, v integer);
137
+ create view DtV as select id, v from DtViewed;
138
+ -- run
139
+
140
+ drop table DtViewed;
141
+ -- run
142
+
143
+ select id from DtV;
144
+ -- error: DtViewed
145
+
146
+ drop view DtV;
147
+ -- run
148
+
149
+ -- ===================================================================
150
+ -- 6. …but DROP VIEW is refused when a CHECK reads the VIEW
151
+ -- ===================================================================
152
+ --
153
+ -- The other side of §5, and the reason the guard is wired into all three DROP emitters: a
154
+ -- CHECK subquery can read a view exactly as it reads a base table, and losing the view
155
+ -- breaks the referencing table just as thoroughly.
156
+
157
+ create table DtVBase (id integer primary key, v integer);
158
+ insert into DtVBase values (1, 4);
159
+ create view DtVSrc as select id, v from DtVBase;
160
+ create table DtVRef (id integer primary key, n integer,
161
+ constraint ck_dtv check (n < (select max(v) from DtVSrc)));
162
+ -- run
163
+
164
+ drop view DtVSrc;
165
+ -- error: cannot drop view 'main.DtVSrc': it is referenced by CHECK constraint 'ck_dtv' on table 'DtVRef'
166
+
167
+ insert into DtVRef values (1, 1);
168
+ select n from DtVRef;
169
+ → [{"n":1}]
170
+
171
+ alter table DtVRef drop constraint ck_dtv;
172
+ drop view DtVSrc;
173
+ drop table DtVRef;
174
+ drop table DtVBase;
175
+ -- run
176
+
177
+ -- A materialized view is a table to a CHECK subquery, and gets the same refusal.
178
+ create table DtMBase (id integer primary key, v integer);
179
+ insert into DtMBase values (1, 6);
180
+ create materialized view DtMSrc as select id, v from DtMBase;
181
+ create table DtMRef (id integer primary key, n integer,
182
+ constraint ck_dtm check (n < (select max(v) from DtMSrc)));
183
+ -- run
184
+
185
+ drop materialized view DtMSrc;
186
+ -- error: cannot drop materialized view 'main.DtMSrc': it is referenced by CHECK constraint 'ck_dtm' on table 'DtMRef'
187
+
188
+ alter table DtMRef drop constraint ck_dtm;
189
+ drop materialized view DtMSrc;
190
+ drop table DtMRef;
191
+ drop table DtMBase;
192
+ -- run
193
+
194
+ -- ===================================================================
195
+ -- 7. `IF EXISTS` governs ABSENCE, not dependency, so it does not weaken the refusal
196
+ -- ===================================================================
197
+ --
198
+ -- Same position `assertNoAssertionDependsOn` takes. `IF EXISTS` says "it is fine if this
199
+ -- object is already gone"; it says nothing about dropping one that other objects need.
200
+
201
+ create table DtIfSrc (id integer primary key, v integer);
202
+ create table DtIfRef (id integer primary key, n integer,
203
+ constraint ck_dtif check (n < (select max(v) from DtIfSrc)));
204
+ -- run
205
+
206
+ drop table if exists DtIfSrc;
207
+ -- error: it is referenced by CHECK constraint 'ck_dtif' on table 'DtIfRef'
208
+
209
+ -- An absent object is still a clean no-op.
210
+ drop table if exists DtNeverExisted;
211
+ -- run
212
+
213
+ drop table DtIfRef;
214
+ drop table DtIfSrc;
215
+ -- run
216
+
217
+ -- ===================================================================
218
+ -- 8. Scope-aware, not a bare name match: a CTE or an alias that merely
219
+ -- SHADOWS the name is not a reference
220
+ -- ===================================================================
221
+ --
222
+ -- The walk is the read-only run of the one `ALTER TABLE … RENAME TO` uses, so the drop
223
+ -- refuses exactly the references a rename would have rewritten — a `with DtCte as (…)`
224
+ -- body names the CTE, not the real table of that name.
225
+
226
+ create table DtCte (id integer primary key, v integer);
227
+ insert into DtCte values (1, 3);
228
+ create table DtCteRef (id integer primary key, n integer,
229
+ check ((with DtCte as (select 1 as v) select max(v) from DtCte) >= 0));
230
+ -- run
231
+
232
+ drop table DtCte;
233
+ -- run
234
+
235
+ insert into DtCteRef values (1, 1);
236
+ select n from DtCteRef;
237
+ → [{"n":1}]
238
+
239
+ drop table DtCteRef;
240
+ -- run
241
+
242
+ -- A FROM alias binds the name just as a CTE does: `from DtAliased as DtAlias` makes
243
+ -- `DtAlias.v` a column of DtAliased, so the real DtAlias table is droppable.
244
+ create table DtAlias (id integer primary key, v integer);
245
+ create table DtAliased (k integer primary key, v integer);
246
+ insert into DtAliased values (1, 2);
247
+ create table DtAliasRef (id integer primary key, n integer,
248
+ check ((select max(DtAlias.v) from DtAliased as DtAlias) >= 0));
249
+ -- run
250
+
251
+ drop table DtAlias;
252
+ -- run
253
+
254
+ insert into DtAliasRef values (1, 1);
255
+ select n from DtAliasRef;
256
+ → [{"n":1}]
257
+
258
+ drop table DtAliasRef;
259
+ drop table DtAliased;
260
+ -- run
261
+
262
+ -- ===================================================================
263
+ -- 9. Cross-schema: a qualified reference from another schema is caught,
264
+ -- a bare name that resolves locally is not
265
+ -- ===================================================================
266
+ --
267
+ -- Mirror of §22 in 41.10.2 for the table verb, and of §48–§49 in
268
+ -- 41.3-alter-rename-propagation for the rename it is defined against.
269
+
270
+ create table main.DtCs (id integer primary key, v integer);
271
+ create table temp.DtCsRef (id integer primary key, n integer,
272
+ constraint ck_dtcs check (n < (select max(v) from main.DtCs)));
273
+ -- run
274
+
275
+ drop table main.DtCs;
276
+ -- error: it is referenced by CHECK constraint 'ck_dtcs' on table 'temp.DtCsRef'
277
+
278
+ drop table temp.DtCsRef;
279
+ drop table main.DtCs;
280
+ -- run
281
+
282
+ create table main.DtDup (id integer primary key, v integer);
283
+ create table temp.DtDup (id integer primary key, v integer);
284
+ -- The CHECK's home is temp, so its bare `DtDup` binds temp.DtDup and says nothing about
285
+ -- the main-schema table of the same name.
286
+ create table temp.DtDupRef (id integer primary key, n integer,
287
+ check (n < (select max(v) from DtDup)));
288
+ -- run
289
+
290
+ drop table main.DtDup;
291
+ -- run
292
+
293
+ drop table temp.DtDupRef;
294
+ drop table temp.DtDup;
295
+ -- run
296
+
297
+ -- ===================================================================
298
+ -- 10. A CHECK that reaches the table only THROUGH a view refuses the drop
299
+ -- ===================================================================
300
+ --
301
+ -- The referencing CHECK never spells `DtRvBase` at all — it reads a view whose body does.
302
+ -- Accepted, the drop left DtRvRef unwritable at the next INSERT, with an error naming
303
+ -- neither the dropped table, nor the view, nor the constraint that broke.
304
+ --
305
+ -- The message therefore names the CHAIN. A user told a constraint blocks the drop will
306
+ -- read its body, find no mention of the dropped table, and be stuck without it. Same
307
+ -- spelling the assertion guard uses (`95-assertions.sqllogic`), because both guards now
308
+ -- consume the same reachability closure.
309
+
310
+ create table DtRvBase (id integer primary key, v integer);
311
+ insert into DtRvBase values (1, 10);
312
+ create view DtRvV as select id, v from DtRvBase;
313
+ create table DtRvRef (id integer primary key, n integer,
314
+ constraint ck_dtrv check (n < (select max(DtRvV.v) from DtRvV)));
315
+ -- run
316
+
317
+ drop table DtRvBase;
318
+ -- error: cannot drop table 'main.DtRvBase': CHECK constraint 'ck_dtrv' on table 'DtRvRef' reaches it through view 'DtRvV' — drop or redefine it first
319
+
320
+ -- Nothing was applied: DtRvRef is still writable AND still enforcing through the view.
321
+ insert into DtRvRef values (1, 1);
322
+ select n from DtRvRef;
323
+ → [{"n":1}]
324
+
325
+ insert into DtRvRef values (2, 99);
326
+ -- error: ck_dtrv
327
+
328
+ -- Escape hatch, same as §1: remove the reference and the drop goes through.
329
+ alter table DtRvRef drop constraint ck_dtrv;
330
+ drop table DtRvBase;
331
+ drop view DtRvV;
332
+ drop table DtRvRef;
333
+ -- run
334
+
335
+ -- The CHECK need not qualify its column for the refusal to fire: the match is on the
336
+ -- VIEW's body, not the CHECK's, so how the CHECK spells the view's output is irrelevant.
337
+ create table DtRuBase (id integer primary key, v integer);
338
+ create view DtRuV as select id, v from DtRuBase;
339
+ create table DtRuRef (id integer primary key, n integer,
340
+ check (n < (select max(v) from DtRuV)));
341
+ -- run
342
+
343
+ drop table DtRuBase;
344
+ -- error: reaches it through view 'DtRuV'
345
+
346
+ drop table DtRuRef;
347
+ drop view DtRuV;
348
+ drop table DtRuBase;
349
+ -- run
350
+
351
+ -- ===================================================================
352
+ -- 11. Chains of any depth, and the MIDDLE link of one
353
+ -- ===================================================================
354
+ --
355
+ -- One-hop expansion is the natural under-fix, so the chain is pinned two views deep and
356
+ -- the refusal renders the whole path with `->`.
357
+
358
+ create table DtChBase (id integer primary key, v integer);
359
+ create view DtCh1 as select id, v from DtChBase;
360
+ create view DtCh2 as select id, v from DtCh1;
361
+ create table DtChRef (id integer primary key, n integer,
362
+ constraint ck_dtch check (n < (select max(DtCh2.v) from DtCh2)));
363
+ -- run
364
+
365
+ drop table DtChBase;
366
+ -- error: CHECK constraint 'ck_dtch' on table 'DtChRef' reaches it through view 'DtCh2' -> view 'DtCh1'
367
+
368
+ -- The MIDDLE view is protected too, and its path is the shorter prefix. Losing DtCh1
369
+ -- breaks DtChRef exactly as thoroughly as losing the base table would.
370
+ drop view DtCh1;
371
+ -- error: cannot drop view 'main.DtCh1': CHECK constraint 'ck_dtch' on table 'DtChRef' reaches it through view 'DtCh2'
372
+
373
+ -- ...and the view the CHECK names DIRECTLY keeps the direct wording (§6's shape, in a
374
+ -- chain): a direct match carries no path, so no `through` clause is added.
375
+ drop view DtCh2;
376
+ -- error: cannot drop view 'main.DtCh2': it is referenced by CHECK constraint 'ck_dtch' on table 'DtChRef'
377
+
378
+ alter table DtChRef drop constraint ck_dtch;
379
+ drop view DtCh2;
380
+ drop view DtCh1;
381
+ drop table DtChBase;
382
+ drop table DtChRef;
383
+ -- run
384
+
385
+ -- ===================================================================
386
+ -- 12. A materialized view in the chain reads as one
387
+ -- ===================================================================
388
+ --
389
+ -- A materialized view is a table in the catalog, so its body has to be followed like a
390
+ -- view's — and named as what the user declared, or `drop materialized view` is not
391
+ -- obviously the fix.
392
+
393
+ create table DtMvBase (id integer primary key, v integer);
394
+ insert into DtMvBase values (1, 6);
395
+ create materialized view DtMvM as select id, v from DtMvBase;
396
+ create table DtMvRef (id integer primary key, n integer,
397
+ constraint ck_dtmv check (n < (select max(DtMvM.v) from DtMvM)));
398
+ -- run
399
+
400
+ drop table DtMvBase;
401
+ -- error: CHECK constraint 'ck_dtmv' on table 'DtMvRef' reaches it through materialized view 'DtMvM'
402
+
403
+ alter table DtMvRef drop constraint ck_dtmv;
404
+ drop materialized view DtMvM;
405
+ drop table DtMvBase;
406
+ drop table DtMvRef;
407
+ -- run
408
+
409
+ -- The `materialized view` VERB refuses indirectly too, not only the table verb through a
410
+ -- materialized view. §6 pins its DIRECT refusal, §11 pins the middle-link refusal for a
411
+ -- plain view; this is the remaining cell of that verb × directness matrix, and the one
412
+ -- where the object being protected is itself a maintained table rather than a view.
413
+ create table DtMwBase (id integer primary key, v integer);
414
+ create materialized view DtMwM as select id, v from DtMwBase;
415
+ create view DtMwV as select id, v from DtMwM;
416
+ create table DtMwRef (id integer primary key, n integer,
417
+ constraint ck_dtmw check (n < (select max(DtMwV.v) from DtMwV)));
418
+ -- run
419
+
420
+ drop materialized view DtMwM;
421
+ -- error: cannot drop materialized view 'main.DtMwM': CHECK constraint 'ck_dtmw' on table 'DtMwRef' reaches it through view 'DtMwV' — drop or redefine it first
422
+
423
+ alter table DtMwRef drop constraint ck_dtmw;
424
+ drop view DtMwV;
425
+ drop materialized view DtMwM;
426
+ drop table DtMwBase;
427
+ drop table DtMwRef;
428
+ -- run
429
+
430
+ -- ===================================================================
431
+ -- 13. DEFAULT and GENERATED bodies follow chains too
432
+ -- ===================================================================
433
+ --
434
+ -- All three arms run the same probe, so widening one without the others would let
435
+ -- `drop table` disagree with itself depending on which expression kind holds the reference.
436
+
437
+ create table DtDvBase (id integer primary key, v integer);
438
+ insert into DtDvBase values (1, 11);
439
+ create view DtDvV as select id, v from DtDvBase;
440
+ create table DtDvRef (id integer primary key, w integer default ((select min(DtDvV.v) from DtDvV)));
441
+ -- run
442
+
443
+ drop table DtDvBase;
444
+ -- error: the DEFAULT of column 'w' on table 'DtDvRef' reaches it through view 'DtDvV'
445
+
446
+ insert into DtDvRef (id) values (1);
447
+ select id, w from DtDvRef;
448
+ → [{"id":1,"w":11}]
449
+
450
+ drop table DtDvRef;
451
+ drop view DtDvV;
452
+ drop table DtDvBase;
453
+ -- run
454
+
455
+ create table DtGvBase (id integer primary key, v integer);
456
+ insert into DtGvBase values (1, 12);
457
+ create view DtGvV as select id, v from DtGvBase;
458
+ create table DtGvRef (id integer primary key,
459
+ g integer generated always as ((select max(DtGvV.v) from DtGvV)));
460
+ -- run
461
+
462
+ drop table DtGvBase;
463
+ -- error: the GENERATED expression of column 'g' on table 'DtGvRef' reaches it through view 'DtGvV'
464
+
465
+ drop table DtGvRef;
466
+ drop view DtGvV;
467
+ drop table DtGvBase;
468
+ -- run
469
+
470
+ -- ===================================================================
471
+ -- 14. Cross-schema chains: each body resolves under ITS OWN home schema
472
+ -- ===================================================================
473
+ --
474
+ -- The composition of §9 with §10, and the only shape that proves each reached body is
475
+ -- walked under its own resolver rather than the root expression's.
476
+
477
+ create table main.DtXv (id integer primary key, v integer);
478
+ create view temp.DtXvV as select id, v from main.DtXv;
479
+ create table temp.DtXvRef (id integer primary key, n integer,
480
+ constraint ck_dtxv check (n < (select max(DtXvV.v) from DtXvV)));
481
+ -- run
482
+
483
+ drop table main.DtXv;
484
+ -- error: CHECK constraint 'ck_dtxv' on table 'temp.DtXvRef' reaches it through view 'DtXvV'
485
+
486
+ drop table temp.DtXvRef;
487
+ drop view temp.DtXvV;
488
+ drop table main.DtXv;
489
+ -- run
490
+
491
+ -- The other direction: a bare name inside a `temp` view body that `temp` itself holds
492
+ -- binds temp's table, and says nothing about main's like-named one.
493
+ create table main.DtXd (id integer primary key, v integer);
494
+ create table temp.DtXd (id integer primary key, v integer);
495
+ create view temp.DtXdV as select id, v from DtXd;
496
+ create table temp.DtXdRef (id integer primary key, n integer,
497
+ check (n < (select max(DtXdV.v) from DtXdV)));
498
+ insert into main.DtXd values (1, 7);
499
+ -- run
500
+
501
+ drop table main.DtXd;
502
+ select count(*) as c from temp.DtXdRef;
503
+ → [{"c":0}]
504
+
505
+ drop table temp.DtXdRef;
506
+ drop view temp.DtXdV;
507
+ drop table temp.DtXd;
508
+ -- run
509
+
510
+ -- ===================================================================
511
+ -- 15. The widening must not start false-refusing
512
+ -- ===================================================================
513
+ --
514
+ -- These are the shapes a name-collecting second walk would have broken. The closure is
515
+ -- scope-aware by construction — it is the read-only run of the walker
516
+ -- `ALTER TABLE … RENAME TO` uses — so each stays allowed.
517
+ --
518
+ -- §5 already pins the first control: a plain view over the table, with nothing reading
519
+ -- the view, does NOT block the drop. Chains change nothing about that.
520
+
521
+ -- A CTE inside the VIEW's body that merely SHADOWS the name is not a reference: the view
522
+ -- really reads DtScSrc, so DtSc is droppable and DtScSrc is not.
523
+ create table DtSc (id integer primary key, v integer);
524
+ create table DtScSrc (id integer primary key, v integer);
525
+ create view DtScV as with DtSc as (select id, v from DtScSrc) select id, v from DtSc;
526
+ create table DtScRef (id integer primary key, n integer,
527
+ check (n < (select max(DtScV.v) from DtScV)));
528
+ -- run
529
+
530
+ drop table DtSc;
531
+ -- run
532
+
533
+ drop table DtScSrc;
534
+ -- error: reaches it through view 'DtScV'
535
+
536
+ drop table DtScRef;
537
+ drop view DtScV;
538
+ drop table DtScSrc;
539
+ -- run
540
+
541
+ -- The row image is not a table: a CHECK's bare `new.` names the row being written, so a
542
+ -- real table called "new" is droppable even though the CHECK's text mentions `new`. The
543
+ -- flag is applied to the ROOT expression only — without it, rooting the closure at a
544
+ -- CHECK would put `new` in the reach and false-refuse its own drop.
545
+ create table "new" (a integer primary key);
546
+ create table DtNwRef (id integer primary key, n integer, check (new.n > 0));
547
+ -- run
548
+
549
+ drop table "new";
550
+ -- run
551
+
552
+ -- ...and a real "new" reached through a view IS still protected, so the suppression is
553
+ -- the row-image qualifier and not the name.
554
+ create table "new" (a integer primary key);
555
+ create view DtNwV as select a from "new";
556
+ create table DtNwRef2 (id integer primary key, n integer,
557
+ check (new.n > (select max(DtNwV.a) from DtNwV)));
558
+ -- run
559
+
560
+ drop table "new";
561
+ -- error: reaches it through view 'DtNwV'
562
+
563
+ drop table DtNwRef2;
564
+ drop view DtNwV;
565
+ drop table "new";
566
+ drop table DtNwRef;
567
+ -- run
568
+
569
+ -- ===================================================================
570
+ -- 16. A `with inverse` expression in a REACHED view body is not a reference
571
+ -- to a table called "new"
572
+ -- ===================================================================
573
+ --
574
+ -- §15 pins the root-body suppression. This is the reached-body pin the closure's
575
+ -- root-only flag used to argue could not exist: `CREATE VIEW` ACCEPTS a body whose
576
+ -- `with inverse (…)` expression holds a bare `new.<x>` (it names an output column of
577
+ -- the enclosing select — docs/sql-select.md § Result-column inverses), so a CHECK
578
+ -- whose reach includes such a view walks a reached body containing an unbound `new.`
579
+ -- qualifier. The walker suppresses the `with inverse` subtree itself, wherever the
580
+ -- walk entered, so the table "new" does not land in the reach and stays droppable.
581
+
582
+ create table "new" (id integer primary key, v integer);
583
+ create table DtIvSrc (id integer primary key, code5 text);
584
+ create view DtIvV as
585
+ select id, case code5 when 'A1' then 'A' end as v
586
+ with inverse (code5 = case new.v when 'A' then 'A1' end)
587
+ from DtIvSrc;
588
+ create table DtIvRef (id integer primary key, n integer,
589
+ constraint ck_dtiv check (n < (select count(*) from DtIvV) + 10));
590
+ -- run
591
+
592
+ drop table "new";
593
+ -- run
594
+
595
+ -- ...and the table the view really reads IS still protected through the chain.
596
+ drop table DtIvSrc;
597
+ -- error: reaches it through view 'DtIvV'
598
+
599
+ drop table DtIvRef;
600
+ drop view DtIvV;
601
+ drop table DtIvSrc;
602
+ -- run