@quereus/quereus 4.20.0 → 4.20.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. package/README.md +2 -0
  2. package/dist/src/common/types.d.ts +4 -4
  3. package/dist/src/index.d.ts +1 -1
  4. package/dist/src/index.d.ts.map +1 -1
  5. package/dist/src/index.js +3 -2
  6. package/dist/src/index.js.map +1 -1
  7. package/dist/src/schema/catalog-rendering.js +13 -1
  8. package/dist/src/schema/catalog-rendering.js.map +1 -1
  9. package/dist/src/schema/catalog.d.ts +35 -2
  10. package/dist/src/schema/catalog.d.ts.map +1 -1
  11. package/dist/src/schema/catalog.js +42 -33
  12. package/dist/src/schema/catalog.js.map +1 -1
  13. package/dist/src/schema/schema-differ.d.ts +1 -1
  14. package/dist/src/schema/schema-differ.d.ts.map +1 -1
  15. package/dist/src/schema/schema-differ.js +195 -33
  16. package/dist/src/schema/schema-differ.js.map +1 -1
  17. package/dist/src/schema/unique-enforcement.d.ts +23 -1
  18. package/dist/src/schema/unique-enforcement.d.ts.map +1 -1
  19. package/dist/src/schema/unique-enforcement.js +43 -1
  20. package/dist/src/schema/unique-enforcement.js.map +1 -1
  21. package/dist/src/vtab/memory/layer/manager.d.ts +15 -12
  22. package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
  23. package/dist/src/vtab/memory/layer/manager.js +87 -100
  24. package/dist/src/vtab/memory/layer/manager.js.map +1 -1
  25. package/package.json +7 -4
  26. package/test/README.md +173 -0
  27. package/test/logic/01-basic.sqllogic +39 -0
  28. package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
  29. package/test/logic/01.2-strings.sqllogic +43 -0
  30. package/test/logic/01.5-insert-select.sqllogic +237 -0
  31. package/test/logic/01.6-update-extras.sqllogic +118 -0
  32. package/test/logic/01.7-update-from.sqllogic +67 -0
  33. package/test/logic/01.8-delete-extras.sqllogic +122 -0
  34. package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
  35. package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
  36. package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
  37. package/test/logic/01.9-query-expr-values.sqllogic +111 -0
  38. package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
  39. package/test/logic/02-filters.sqllogic +54 -0
  40. package/test/logic/02-smoke.sqllogic +62 -0
  41. package/test/logic/02.1-bind-parameters.sqllogic +223 -0
  42. package/test/logic/03-expressions.sqllogic +190 -0
  43. package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
  44. package/test/logic/03.4-defaults.sqllogic +554 -0
  45. package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
  46. package/test/logic/03.5-tvf.sqllogic +61 -0
  47. package/test/logic/03.6-type-system.sqllogic +544 -0
  48. package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
  49. package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
  50. package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
  51. package/test/logic/03.8-not-precedence.sqllogic +255 -0
  52. package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
  53. package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
  54. package/test/logic/04-order-by.sqllogic +38 -0
  55. package/test/logic/04-transactions.sqllogic +239 -0
  56. package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
  57. package/test/logic/05-vtab_memory.sqllogic +50 -0
  58. package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
  59. package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
  60. package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
  61. package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
  62. package/test/logic/06-builtin_functions.sqllogic +149 -0
  63. package/test/logic/06.1-string-functions.sqllogic +92 -0
  64. package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
  65. package/test/logic/06.2-math-functions.sqllogic +82 -0
  66. package/test/logic/06.3-schema.sqllogic +48 -0
  67. package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
  68. package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
  69. package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
  70. package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
  71. package/test/logic/06.3.4-view-info.sqllogic +378 -0
  72. package/test/logic/06.3.5-column-info.sqllogic +347 -0
  73. package/test/logic/06.3.6-schema-views.sqllogic +29 -0
  74. package/test/logic/06.4-schema-search-path.sqllogic +354 -0
  75. package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
  76. package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
  77. package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
  78. package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
  79. package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
  80. package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
  81. package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
  82. package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
  83. package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
  84. package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
  85. package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
  86. package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
  87. package/test/logic/06.7-json-extended.sqllogic +53 -0
  88. package/test/logic/06.8-json-path-operators.sqllogic +99 -0
  89. package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
  90. package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
  91. package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
  92. package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
  93. package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
  94. package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
  95. package/test/logic/07-aggregates.sqllogic +193 -0
  96. package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
  97. package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
  98. package/test/logic/07.3-group-by-extras.sqllogic +602 -0
  99. package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
  100. package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
  101. package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
  102. package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
  103. package/test/logic/07.5-window.sqllogic +1941 -0
  104. package/test/logic/07.5.1-window-named.sqllogic +13 -0
  105. package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
  106. package/test/logic/07.6-subqueries.sqllogic +78 -0
  107. package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
  108. package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
  109. package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
  110. package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
  111. package/test/logic/07.7.1-in-extras.sqllogic +158 -0
  112. package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
  113. package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
  114. package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
  115. package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
  116. package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
  117. package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
  118. package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
  119. package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
  120. package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
  121. package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
  122. package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
  123. package/test/logic/07.9-in-value-list.sqllogic +154 -0
  124. package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
  125. package/test/logic/08-views.sqllogic +64 -0
  126. package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
  127. package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
  128. package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
  129. package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
  130. package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
  131. package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
  132. package/test/logic/09-set_operations.sqllogic +244 -0
  133. package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
  134. package/test/logic/10-distinct_datatypes.sqllogic +127 -0
  135. package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
  136. package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
  137. package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
  138. package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
  139. package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
  140. package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
  141. package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
  142. package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
  143. package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
  144. package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
  145. package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
  146. package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
  147. package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
  148. package/test/logic/10.2-column-features.sqllogic +365 -0
  149. package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
  150. package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
  151. package/test/logic/10.3-function-features.sqllogic +247 -0
  152. package/test/logic/10.4-schema-scale.sqllogic +168 -0
  153. package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
  154. package/test/logic/10.5-indexes.sqllogic +164 -0
  155. package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
  156. package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
  157. package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
  158. package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
  159. package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
  160. package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
  161. package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
  162. package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
  163. package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
  164. package/test/logic/100.1-where-extras.sqllogic +163 -0
  165. package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
  166. package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
  167. package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
  168. package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
  169. package/test/logic/102-unique-constraints.sqllogic +145 -0
  170. package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
  171. package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
  172. package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
  173. package/test/logic/102.2-unique-collation.sqllogic +181 -0
  174. package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
  175. package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
  176. package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
  177. package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
  178. package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
  179. package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
  180. package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
  181. package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
  182. package/test/logic/108-cardinality-estimation.sqllogic +146 -0
  183. package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
  184. package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
  185. package/test/logic/11-joins.sqllogic +86 -0
  186. package/test/logic/11.1-join-using.sqllogic +267 -0
  187. package/test/logic/11.2-comma-join.sqllogic +35 -0
  188. package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
  189. package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
  190. package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
  191. package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
  192. package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
  193. package/test/logic/12-empty-primary-key.sqllogic +124 -0
  194. package/test/logic/12-join_padding_order.sqllogic +58 -0
  195. package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
  196. package/test/logic/13-cte.sqllogic +137 -0
  197. package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
  198. package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
  199. package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
  200. package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
  201. package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
  202. package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
  203. package/test/logic/13.4-cte-extras.sqllogic +98 -0
  204. package/test/logic/13.5-cte-join-order.sqllogic +166 -0
  205. package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
  206. package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
  207. package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
  208. package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
  209. package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
  210. package/test/logic/14-utilities.sqllogic +168 -0
  211. package/test/logic/15-timespan.sqllogic +279 -0
  212. package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
  213. package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
  214. package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
  215. package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
  216. package/test/logic/16-epoch.sqllogic +187 -0
  217. package/test/logic/17-weekday-modifier.sqllogic +78 -0
  218. package/test/logic/18-json-string-escapes.sqllogic +86 -0
  219. package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
  220. package/test/logic/20-empty-single-row.sqllogic +261 -0
  221. package/test/logic/21-null-edge-cases.sqllogic +227 -0
  222. package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
  223. package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
  224. package/test/logic/21.2-between-edges.sqllogic +157 -0
  225. package/test/logic/22-boundary-values.sqllogic +175 -0
  226. package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
  227. package/test/logic/24-builtin-branches.sqllogic +611 -0
  228. package/test/logic/24.1-substr-extras.sqllogic +75 -0
  229. package/test/logic/24.2-random-extras.sqllogic +39 -0
  230. package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
  231. package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
  232. package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
  233. package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
  234. package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
  235. package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
  236. package/test/logic/26-join-edge-cases.sqllogic +333 -0
  237. package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
  238. package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
  239. package/test/logic/26.3-join-on-constants.sqllogic +61 -0
  240. package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
  241. package/test/logic/27-window-edge-cases.sqllogic +206 -0
  242. package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
  243. package/test/logic/27.2-window-exclude.sqllogic +13 -0
  244. package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
  245. package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
  246. package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
  247. package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
  248. package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
  249. package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
  250. package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
  251. package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
  252. package/test/logic/40-constraints.sqllogic +418 -0
  253. package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
  254. package/test/logic/40.2-check-extras.sqllogic +683 -0
  255. package/test/logic/41-alter-table.sqllogic +191 -0
  256. package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
  257. package/test/logic/41-fk-cross-schema.sqllogic +155 -0
  258. package/test/logic/41-fk-extended-targets.sqllogic +173 -0
  259. package/test/logic/41-foreign-keys.sqllogic +1001 -0
  260. package/test/logic/41-generated-column-errors.sqllogic +225 -0
  261. package/test/logic/41-generated-column-extras.sqllogic +598 -0
  262. package/test/logic/41-generated-column-scope.sqllogic +329 -0
  263. package/test/logic/41-generated-columns.sqllogic +361 -0
  264. package/test/logic/41.1-alter-pk.sqllogic +230 -0
  265. package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
  266. package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
  267. package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
  268. package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
  269. package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
  270. package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
  271. package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
  272. package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
  273. package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
  274. package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
  275. package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
  276. package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
  277. package/test/logic/41.2-alter-column.sqllogic +382 -0
  278. package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
  279. package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
  280. package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
  281. package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
  282. package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
  283. package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
  284. package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
  285. package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
  286. package/test/logic/41.5-alter-misc.sqllogic +48 -0
  287. package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
  288. package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
  289. package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
  290. package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
  291. package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
  292. package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
  293. package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
  294. package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
  295. package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
  296. package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
  297. package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
  298. package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
  299. package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
  300. package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
  301. package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
  302. package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
  303. package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
  304. package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
  305. package/test/logic/42-committed-snapshot.sqllogic +254 -0
  306. package/test/logic/42-returning.sqllogic +159 -0
  307. package/test/logic/42.1-returning-extras.sqllogic +232 -0
  308. package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
  309. package/test/logic/43-default-nullability.sqllogic +131 -0
  310. package/test/logic/43-transition-constraints.sqllogic +341 -0
  311. package/test/logic/43.1-default-collation.sqllogic +140 -0
  312. package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
  313. package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
  314. package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
  315. package/test/logic/44-determinism-validation.sqllogic +164 -0
  316. package/test/logic/44-orthogonality.sqllogic +146 -0
  317. package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
  318. package/test/logic/45-udf-determinism.sqllogic +39 -0
  319. package/test/logic/46-mutation-context.sqllogic +595 -0
  320. package/test/logic/47-upsert.sqllogic +255 -0
  321. package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
  322. package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
  323. package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
  324. package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
  325. package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
  326. package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
  327. package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
  328. package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
  329. package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
  330. package/test/logic/49-reference-graph.sqllogic +84 -0
  331. package/test/logic/50-declarative-schema.sqllogic +2550 -0
  332. package/test/logic/50-metadata-tags.sqllogic +1033 -0
  333. package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
  334. package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
  335. package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
  336. package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +173 -0
  337. package/test/logic/50.3-declare-schema-duplicate-names.sqllogic +280 -0
  338. package/test/logic/50.4-declare-schema-apply-restore.sqllogic +192 -0
  339. package/test/logic/51-lens-foundation.sqllogic +147 -0
  340. package/test/logic/51-materialized-views.sqllogic +376 -0
  341. package/test/logic/51.5-materialized-views-coarsened-key.sqllogic +198 -0
  342. package/test/logic/51.7-maintained-table-attach-detach.sqllogic +468 -0
  343. package/test/logic/51.8-maintained-table-declared-constraints.sqllogic +440 -0
  344. package/test/logic/51.85-maintained-table-parent-fk.sqllogic +103 -0
  345. package/test/logic/51.9-maintained-table-secondary-unique.sqllogic +237 -0
  346. package/test/logic/51.9.1-maintained-table-partial-unique.sqllogic +36 -0
  347. package/test/logic/52-lens-overrides.sqllogic +566 -0
  348. package/test/logic/53-materialized-views-rowtime.sqllogic +1601 -0
  349. package/test/logic/53-reserved-tags.sqllogic +252 -0
  350. package/test/logic/53.1-materialized-view-write-through.sqllogic +329 -0
  351. package/test/logic/53.2-materialized-view-rename-propagation.sqllogic +483 -0
  352. package/test/logic/53.3-materialized-view-constraint-only-ddl.sqllogic +409 -0
  353. package/test/logic/53.3.1-materialized-view-index-ddl-irrelevance.sqllogic +29 -0
  354. package/test/logic/53.4-materialized-view-structural-alter-restore.sqllogic +436 -0
  355. package/test/logic/54-covering-mv-enforcement.sqllogic +314 -0
  356. package/test/logic/54.1-covering-mv-partial-enforcement.sqllogic +34 -0
  357. package/test/logic/55-internal-eviction-reporting.sqllogic +89 -0
  358. package/test/logic/55-lens-prover.sqllogic +202 -0
  359. package/test/logic/55.1-eviction-restrict-fk.sqllogic +148 -0
  360. package/test/logic/55.5-lens-authored-inverse.sqllogic +1468 -0
  361. package/test/logic/80-grow-retrieve-pass.sqllogic +79 -0
  362. package/test/logic/81-quickpick.sqllogic +24 -0
  363. package/test/logic/82-bloom-join.sqllogic +185 -0
  364. package/test/logic/83-merge-join.sqllogic +280 -0
  365. package/test/logic/84-asof-scan.sqllogic +238 -0
  366. package/test/logic/84-key-cardinality.sqllogic +50 -0
  367. package/test/logic/85-relational-const-folding.sqllogic +51 -0
  368. package/test/logic/86-scalar-cse.sqllogic +42 -0
  369. package/test/logic/90-error_paths.sqllogic +114 -0
  370. package/test/logic/90.1-parse-errors.sqllogic +77 -0
  371. package/test/logic/90.2-alter-table-errors.sqllogic +53 -0
  372. package/test/logic/90.2.1-alter-extra-errors.sqllogic +51 -0
  373. package/test/logic/90.3-expression-errors.sqllogic +43 -0
  374. package/test/logic/90.4-dml-errors.sqllogic +47 -0
  375. package/test/logic/90.5-unsupported-join-types.sqllogic +37 -0
  376. package/test/logic/90.5.1-right-full-join-read.sqllogic +157 -0
  377. package/test/logic/90.6-select-error-paths.sqllogic +57 -0
  378. package/test/logic/91-merge-join-edge-cases.sqllogic +159 -0
  379. package/test/logic/92-hash-aggregate-edge-cases.sqllogic +139 -0
  380. package/test/logic/93-ddl-view-edge-cases.sqllogic +104 -0
  381. package/test/logic/93.1-view-error-paths.sqllogic +74 -0
  382. package/test/logic/93.2-view-mutation-pending.sqllogic +108 -0
  383. package/test/logic/93.3-view-mutation-or-clause.sqllogic +60 -0
  384. package/test/logic/93.4-view-mutation.sqllogic +4881 -0
  385. package/test/logic/93.4.1-view-mutation-partial-unique-cardinality.sqllogic +31 -0
  386. package/test/logic/93.5-authored-inverse.sqllogic +415 -0
  387. package/test/logic/93.6-set-op-flagless-write.sqllogic +862 -0
  388. package/test/logic/94-tvf-edge-cases.sqllogic +58 -0
  389. package/test/logic/94.1-limit-offset-edge-cases.sqllogic +109 -0
  390. package/test/logic/94.2-limit-offset-extras.sqllogic +98 -0
  391. package/test/logic/95-assertions.sqllogic +1417 -0
  392. package/test/logic/96-subquery-edge-cases.sqllogic +276 -0
  393. package/test/logic/97-json-function-edge-cases.sqllogic +633 -0
  394. package/test/logic/97.1-json-blob-and-special-values.sqllogic +92 -0
  395. package/test/logic/98-temporal-edge-cases.sqllogic +515 -0
  396. package/test/logic/99-conversion-edge-cases.sqllogic +325 -0
  397. package/test/logic/99.0.1-schema-index-listing.sqllogic +21 -0
  398. package/test/logic/99.1-cast-syntax-extras.sqllogic +167 -0
  399. package/test/logic/drop-unique-index.sqllogic +88 -0
  400. package/test/logic/pushdown-test.sqllogic +36 -0
@@ -0,0 +1,440 @@
1
+ -- 51.8-maintained-table-declared-constraints.sqllogic — declared CHECK and
2
+ -- child-side FK constraints on a `create table … maintained as` table are
3
+ -- validated against the rows the DERIVATION writes: the create-fill, the
4
+ -- attach/re-attach reconcile, and steady-state row-time maintenance. The
5
+ -- writing statement fails with a diagnostic attributed to the maintained
6
+ -- table (the statement itself targeted a different table). A `delete` delta
7
+ -- writes no row image and is never CHECK-validated.
8
+
9
+ -- ===================================
10
+ -- 1. create-fill validates declared CHECK (bulk scan), rolls back cleanly
11
+ -- ===================================
12
+
13
+ create table src (id integer primary key, v text not null);
14
+ insert into src values (1, 'bad');
15
+
16
+ create table mt (id integer primary key, v text not null check (v <> 'bad')) maintained as select id, v from src;
17
+ -- error: row derived into maintained table 'main.mt'
18
+
19
+ -- the failed create left nothing behind: the name is free for a plain create
20
+ create table mt (id integer primary key);
21
+ drop table mt;
22
+
23
+ -- ===================================
24
+ -- 2. steady-state maintenance validates the delta (insert and update images)
25
+ -- ===================================
26
+
27
+ update src set v = 'ok' where id = 1;
28
+ create table mt (id integer primary key, v text not null check (v <> 'bad')) maintained as select id, v from src;
29
+
30
+ insert into src values (2, 'bad');
31
+ -- error: row derived into maintained table 'main.mt'
32
+
33
+ -- the violating source statement rolled back whole
34
+ select count(*) as n from src;
35
+ → [{"n":1}]
36
+ select * from mt order by id;
37
+ → [{"id":1,"v":"ok"}]
38
+
39
+ -- a derived UPDATE image is validated too
40
+ insert into src values (2, 'fine');
41
+ update src set v = 'bad' where id = 2;
42
+ -- error: row derived into maintained table 'main.mt'
43
+ select v from mt where id = 2;
44
+ → [{"v":"fine"}]
45
+
46
+ -- deletes write no row image: removing a source row never CHECK-validates
47
+ delete from src where id = 2;
48
+ select count(*) as n from mt;
49
+ → [{"n":1}]
50
+
51
+ -- conforming maintenance still flows
52
+ insert into src values (3, 'good');
53
+ select count(*) as n from mt;
54
+ → [{"n":2}]
55
+
56
+ -- ===================================
57
+ -- 3. child-side FK existence: create-fill, steady state, MATCH SIMPLE, pragma
58
+ -- ===================================
59
+
60
+ create table parent (pid integer primary key);
61
+ insert into parent values (1);
62
+ create table csrc (id integer primary key, ref integer null);
63
+ insert into csrc values (10, 2);
64
+
65
+ -- create-fill: a derived row referencing a missing parent fails the create
66
+ create table mfk (id integer primary key, ref integer null references parent(pid)) maintained as select id, ref from csrc;
67
+ -- error: row derived into maintained table 'main.mfk' references a missing 'main.parent'
68
+
69
+ update csrc set ref = 1 where id = 10;
70
+ create table mfk (id integer primary key, ref integer null references parent(pid)) maintained as select id, ref from csrc;
71
+
72
+ -- MATCH SIMPLE: a NULL FK column is admitted regardless of parent presence
73
+ insert into csrc values (11, null);
74
+ select count(*) as n from mfk;
75
+ → [{"n":2}]
76
+
77
+ -- steady state: an orphan-producing source write fails (deferred to the
78
+ -- statement's autocommit, exactly as on an ordinary table)
79
+ insert into csrc values (12, 99);
80
+ -- error: row derived into maintained table 'main.mfk' references a missing 'main.parent'
81
+ select count(*) as n from csrc;
82
+ → [{"n":2}]
83
+
84
+ -- pragma off: the orphan is admitted (FK evaluation is gated at eval time)
85
+ pragma foreign_keys = false;
86
+ insert into csrc values (13, 77);
87
+ select count(*) as n from mfk;
88
+ → [{"n":3}]
89
+
90
+ -- pragma back on: the NEW delta validates; the pre-existing orphan (13) is
91
+ -- NOT retro-validated (matches ordinary tables — no retro-check on pragma flip)
92
+ pragma foreign_keys = true;
93
+ insert into csrc values (14, 88);
94
+ -- error: row derived into maintained table 'main.mfk' references a missing 'main.parent'
95
+ delete from csrc where id = 13;
96
+
97
+ -- ===================================
98
+ -- 4. subquery-bearing CHECK defers to commit with maintained-table attribution
99
+ -- ===================================
100
+
101
+ create table quota (k integer primary key, lim integer not null);
102
+ insert into quota values (1, 1);
103
+ create table qsrc (id integer primary key, n integer not null);
104
+ insert into qsrc values (1, 1);
105
+
106
+ create table mq (id integer primary key, n integer not null check (n <= (select lim from quota where k = 1))) maintained as select id, n from qsrc;
107
+
108
+ insert into qsrc values (2, 5);
109
+ -- error: row derived into maintained table 'main.mq'
110
+ select count(*) as n from qsrc;
111
+ → [{"n":1}]
112
+
113
+ -- ===================================
114
+ -- 5. CHECK op-mask collapse: a derived row image is neither a user INSERT nor
115
+ -- UPDATE, so any CHECK touching insert|update applies to every written image
116
+ -- ===================================
117
+
118
+ create table usrc (id integer primary key, v text not null);
119
+ create table mu (id integer primary key, v text not null check on update (v <> 'nope')) maintained as select id, v from usrc;
120
+ -- an `on update` CHECK fires on a derived INSERT image
121
+ insert into usrc values (1, 'nope');
122
+ -- error: row derived into maintained table 'main.mu'
123
+
124
+ create table isrc (id integer primary key, v text not null);
125
+ insert into isrc values (1, 'fine');
126
+ create table mi (id integer primary key, v text not null check on insert (v <> 'nope')) maintained as select id, v from isrc;
127
+ -- an `on insert` CHECK fires on a derived UPDATE image
128
+ update isrc set v = 'nope' where id = 1;
129
+ -- error: row derived into maintained table 'main.mi'
130
+
131
+ -- a delete-only CHECK never applies to derivation writes
132
+ create table dsrc (id integer primary key, v text not null);
133
+ create table md (id integer primary key, v text not null check on delete (v <> 'x')) maintained as select id, v from dsrc;
134
+ insert into dsrc values (1, 'x');
135
+ select count(*) as n from md;
136
+ → [{"n":1}]
137
+
138
+ -- ===================================
139
+ -- 6. attach / re-attach reconcile validation
140
+ -- ===================================
141
+
142
+ -- a violating PRE-EXISTING row the derivation does not reproduce is simply
143
+ -- deleted by the derived-wins reconcile and never validated. (It slipped in
144
+ -- via an op-masked `check on update`, which user INSERT does not evaluate.)
145
+ create table b1 (id integer primary key, v text not null);
146
+ insert into b1 values (1, 'ok');
147
+ create table tgt (id integer primary key, v text not null check on update (v <> 'stale-bad'));
148
+ insert into tgt values (1, 'ok'), (9, 'stale-bad');
149
+ alter table tgt set maintained as select id, v from b1;
150
+ select * from tgt order by id;
151
+ → [{"id":1,"v":"ok"}]
152
+
153
+ -- a derivation that REPRODUCES a violator fails the attach (the op-mask
154
+ -- collapse validates the derived image against the on-update CHECK too)
155
+ alter table tgt drop maintained;
156
+ create table b2 (id integer primary key, v text not null);
157
+ insert into b2 values (9, 'stale-bad');
158
+ alter table tgt set maintained as select id, v from b2;
159
+ -- error: row derived into maintained table 'main.tgt'
160
+
161
+ -- the failed attach left the table plain and intact
162
+ insert into tgt values (2, 'still writable');
163
+ select count(*) as n from tgt;
164
+ → [{"n":2}]
165
+
166
+ -- re-attach failure restores the PRIOR derivation (and its row-time plan)
167
+ create table a1 (id integer primary key, v text not null);
168
+ insert into a1 values (1, 'good');
169
+ create table a2 (id integer primary key, v text not null);
170
+ insert into a2 values (1, 'evil');
171
+ create table mr (id integer primary key, v text not null check (v <> 'evil')) maintained as select id, v from a1;
172
+ alter table mr set maintained as select id, v from a2;
173
+ -- error: row derived into maintained table 'main.mr'
174
+ select * from mr;
175
+ → [{"id":1,"v":"good"}]
176
+ -- the prior derivation is still live: an a1 write maintains mr
177
+ insert into a1 values (2, 'more');
178
+ select count(*) as n from mr;
179
+ → [{"n":2}]
180
+
181
+ -- ===================================
182
+ -- 7. MV-over-MV cascade: each level validates with its OWN evaluator
183
+ -- ===================================
184
+
185
+ create table base (id integer primary key, v text not null);
186
+ insert into base values (1, 'ok');
187
+ create table mt1 (id integer primary key, v text not null) maintained as select id, v from base;
188
+ create table mt2 (id integer primary key, v text not null check (v <> 'poison')) maintained as select id, v from mt1;
189
+
190
+ insert into base values (2, 'poison');
191
+ -- error: row derived into maintained table 'main.mt2'
192
+ select count(*) as n from base;
193
+ → [{"n":1}]
194
+ select count(*) as n from mt2;
195
+ → [{"n":1}]
196
+
197
+ -- ===================================
198
+ -- 8. full-rebuild floor: the rebuild diff validates once at the statement flush
199
+ -- ===================================
200
+
201
+ -- (integer PK: a text PK would collate NOCASE under the store backend and fail
202
+ -- the attach shape check before validation is ever reached)
203
+ create table fsrc (id integer primary key, n integer not null);
204
+ insert into fsrc values (1, 10);
205
+ -- DISTINCT falls to the full-rebuild arm
206
+ create table mfr (n integer not null primary key check (n < 100)) maintained as select distinct n from fsrc;
207
+
208
+ insert into fsrc values (2, 500), (3, 20);
209
+ -- error: row derived into maintained table 'main.mfr'
210
+ select count(*) as n from fsrc;
211
+ → [{"n":1}]
212
+ select * from mfr order by n;
213
+ → [{"n":10}]
214
+
215
+ -- ===================================
216
+ -- 9. detach: every committed row already satisfies the constraints, which
217
+ -- become user-enforced — no stranded violators
218
+ -- ===================================
219
+
220
+ alter table mt drop maintained;
221
+ update mt set v = 'bad' where id = 1;
222
+ -- error: CHECK constraint failed
223
+ update mt set v = 'still ok' where id = 1;
224
+ select v from mt where id = 1;
225
+ → [{"v":"still ok"}]
226
+
227
+ -- ===================================
228
+ -- 10. zero-overhead regression: constraint-less maintained tables and the
229
+ -- MV sugar behave exactly as before
230
+ -- ===================================
231
+
232
+ create table z (id integer primary key, v text not null);
233
+ insert into z values (1, 'zz');
234
+ create table mz (id integer primary key, v text not null) maintained as select id, v from z;
235
+ create materialized view vz as select id, v from z;
236
+ insert into z values (2, 'yy');
237
+ select count(*) as n from mz;
238
+ → [{"n":2}]
239
+ select count(*) as n from vz;
240
+ → [{"n":2}]
241
+
242
+ -- ===================================
243
+ -- 11. a CHECK referencing OLD/NEW row images is rejected at registration:
244
+ -- a derived row has no OLD image (a transition CHECK would be vacuous) and
245
+ -- NEW is the row itself (expressible unqualified)
246
+ -- ===================================
247
+
248
+ create table osrc (id integer primary key, v integer not null);
249
+ create table mo (id integer primary key, v integer not null, check on update (new.v > old.v)) maintained as select id, v from osrc;
250
+ -- error: references OLD/NEW row images
251
+
252
+ -- the failed create left the name free
253
+ create table mo (id integer primary key);
254
+ drop table mo;
255
+
256
+ -- the attach form rejects too, restoring the plain table (still writable,
257
+ -- and its qualified CHECK still enforces on user DML)
258
+ create table mo2 (id integer primary key, v integer not null, check (new.v > 0));
259
+ alter table mo2 set maintained as select id, v from osrc;
260
+ -- error: references OLD/NEW row images
261
+ insert into mo2 values (1, 5);
262
+ insert into mo2 values (2, -1);
263
+ -- error: CHECK constraint failed
264
+ select count(*) as n from mo2;
265
+ → [{"n":1}]
266
+
267
+ -- a delete-only CHECK with image qualifiers is exempt (never fires on
268
+ -- derivation writes)
269
+ create table mo3 (id integer primary key, v integer not null, check on delete (old.v < 100)) maintained as select id, v from osrc;
270
+ insert into osrc values (1, 500);
271
+ select count(*) as n from mo3;
272
+ → [{"n":1}]
273
+
274
+ -- ===================================
275
+ -- 12. constraint-dependency DDL: rename/drop/re-create of a CONSTRAINT-ONLY
276
+ -- dependency (FK parent / subquery-CHECK target — neither a derivation source)
277
+ -- rebuilds the compiled derived-row validator. Before the fix the once-compiled
278
+ -- validator went stale and maintenance writes failed with an internal
279
+ -- "Module 'memory' connect failed … not found" error.
280
+ -- ===================================
281
+
282
+ -- FK parent RENAME: the maintained table's own FK is rewritten in place; the
283
+ -- rebuilt validator resolves existence against the renamed parent
284
+ create table rparent (pid integer primary key);
285
+ create table rsrc (id integer primary key, ref integer null);
286
+ create table rmt (id integer primary key, ref integer null references rparent(pid)) maintained as select id, ref from rsrc;
287
+ insert into rparent values (10);
288
+ alter table rparent rename to rparent2;
289
+ insert into rsrc values (1, 10);
290
+ select * from rmt order by id;
291
+ → [{"id":1,"ref":10}]
292
+ -- an orphan fails with the FK attribution against the RENAMED parent (not internal)
293
+ insert into rsrc values (2, 99);
294
+ -- error: row derived into maintained table 'main.rmt' references a missing 'main.rparent2'
295
+ select count(*) as n from rmt;
296
+ → [{"n":1}]
297
+
298
+ -- FK parent DROP: the rebuild emits the absent-parent null-guards fallback — a
299
+ -- non-NULL ref fails the maintained-table FK CONSTRAINT (NOT an internal connect
300
+ -- error), a NULL ref is admitted under MATCH SIMPLE
301
+ create table xparent (pid integer primary key);
302
+ create table xsrc (id integer primary key, ref integer null);
303
+ create table xmt (id integer primary key, ref integer null references xparent(pid)) maintained as select id, ref from xsrc;
304
+ drop table xparent;
305
+ insert into xsrc values (1, 5);
306
+ -- error: row derived into maintained table 'main.xmt' references a missing 'main.xparent'
307
+ insert into xsrc values (2, null);
308
+ select * from xmt order by id;
309
+ → [{"id":2,"ref":null}]
310
+
311
+ -- subquery-CHECK target DROP: REFUSED. A maintained table's declared CHECK is a
312
+ -- stored expression like any other, so dropping the table its subquery reads is
313
+ -- refused naming the maintained table and the constraint
314
+ -- (41.10.4-drop-object-expression-dependents). This used to be accepted and left
315
+ -- the validator poisoned — the next write failed with a bare
316
+ -- `Table 'fquota' not found`, naming neither the maintained table nor the CHECK.
317
+ -- The poisoned-validator fallback the rebuild carries is now defensive only: no
318
+ -- user-facing DDL statement can reach it.
319
+ create table fquota (k integer primary key, lim integer not null);
320
+ insert into fquota values (1, 100);
321
+ create table fqsrc (id integer primary key, n integer not null);
322
+ create table fmq (id integer primary key, n integer not null check (n <= (select lim from fquota where k = 1))) maintained as select id, n from fqsrc;
323
+ drop table fquota;
324
+ -- error: it is referenced by CHECK constraint '_check_n' on table 'fmq'
325
+
326
+ -- Nothing was applied, so the CHECK still compiles and still enforces.
327
+ insert into fqsrc values (1, 5);
328
+ select * from fmq order by id;
329
+ → [{"id":1,"n":5}]
330
+ insert into fqsrc values (2, 500);
331
+ -- error: row derived into maintained table 'main.fmq'
332
+ select count(*) as n from fmq;
333
+ → [{"n":1}]
334
+
335
+ -- Escape hatch: drop the maintained table (which takes its CHECK with it), then
336
+ -- the target goes freely.
337
+ drop table fmq;
338
+ drop table fquota;
339
+ -- run
340
+
341
+ -- subquery-CHECK target RENAME: the CHECK AST is rewritten in place and the
342
+ -- rebuilt validator re-resolves against the renamed target
343
+ create table gquota (k integer primary key, lim integer not null);
344
+ insert into gquota values (1, 100);
345
+ create table gqsrc (id integer primary key, n integer not null);
346
+ create table gmq (id integer primary key, n integer not null check (n <= (select lim from gquota where k = 1))) maintained as select id, n from gqsrc;
347
+ alter table gquota rename to gquota2;
348
+ insert into gqsrc values (1, 5);
349
+ select * from gmq order by id;
350
+ → [{"id":1,"n":5}]
351
+ insert into gqsrc values (2, 500);
352
+ -- error: row derived into maintained table 'main.gmq'
353
+ select count(*) as n from gmq;
354
+ → [{"n":1}]
355
+
356
+ -- No self-heal case here any more. It used to read `drop table hquota;` followed by a
357
+ -- re-`create table hquota`, asserting that the `table_added` rebuild restored healthy
358
+ -- validation. Both halves are unreachable from SQL now: the drop is refused
359
+ -- (41.10.4-drop-object-expression-dependents), and the maintained table cannot be
360
+ -- declared against an absent CHECK target either — `create table … check ((select lim
361
+ -- from hquota …)) maintained as …` fails at build time with `Table 'hquota' not found`.
362
+ -- The rebuild-on-`table_added` path stays in the code as a defensive fallback for
363
+ -- internal drop paths (rollback, catalog import), which no sqllogic file can drive.
364
+
365
+ -- ===================================
366
+ -- 13. CHECK truthiness: the derived-row validator must reject a bigint-0n / '0'
367
+ -- CHECK result exactly like write-time DML, not the old narrower
368
+ -- `value === false || value === 0` test that missed 0n. A bare-column `check (v)`
369
+ -- yields bigint 0n for an integer 0 at steady-state maintenance time.
370
+ -- ===================================
371
+
372
+ create table tsrc (id integer primary key, v any not null);
373
+ insert into tsrc values (1, 5);
374
+ create table tmt (id integer primary key, v any not null check (v)) maintained as select id, v from tsrc;
375
+
376
+ -- steady-state insert of v=0 → bigint 0n → must fail the derived-row CHECK.
377
+ insert into tsrc values (2, 0);
378
+ -- error: row derived into maintained table 'main.tmt'
379
+ select count(*) as n from tmt;
380
+ → [{"n":1}]
381
+
382
+ -- string '0' derives falsy under isTruthy's numeric conversion — also rejected.
383
+ insert into tsrc values (3, '0');
384
+ -- error: row derived into maintained table 'main.tmt'
385
+ select count(*) as n from tmt;
386
+ → [{"n":1}]
387
+
388
+ -- conforming steady-state maintenance still flows (truthy non-zero passes).
389
+ insert into tsrc values (4, 7);
390
+ select count(*) as n from tmt;
391
+ → [{"n":2}]
392
+
393
+ -- ===================================
394
+ -- 14. mutation-context variables on a maintained table are rejected at
395
+ -- declaration time: nobody ever writes to a maintained table directly (its
396
+ -- rows arrive from the derivation, not a user statement), so no statement
397
+ -- could ever supply a `with context` value for a declared variable. Left
398
+ -- unrejected this used to fail confusingly at DDL time with "Column not
399
+ -- found" once a CHECK tried to read the variable.
400
+ -- ===================================
401
+
402
+ create table ctxsrc (id integer primary key, v integer) using memory;
403
+
404
+ -- CREATE arm: declared together with a CHECK that reads the variable
405
+ create table ctxmt (
406
+ id integer primary key,
407
+ v integer,
408
+ constraint gate check (v <= cap)
409
+ ) using memory
410
+ maintained as select id, v from ctxsrc
411
+ with context (cap integer);
412
+ -- error: cannot create maintained table 'main.ctxmt'
413
+
414
+ -- the failed create left the name free
415
+ create table ctxmt (id integer primary key);
416
+ drop table ctxmt;
417
+
418
+ -- CREATE arm, declared-but-never-read: no constraint reads the variable, but
419
+ -- the declaration alone is rejected — the "unread" case gets no exemption
420
+ create table ctxmt2 (id integer primary key, v integer) using memory
421
+ maintained as select id, v from ctxsrc
422
+ with context (cap integer);
423
+ -- error: cannot create maintained table 'main.ctxmt2'
424
+
425
+ -- ALTER arm: a plain context-declaring table is accepted on its own...
426
+ create table ctxamt (id integer primary key, v integer check (v <= cap))
427
+ using memory with context (cap integer);
428
+ insert into ctxamt values (1, 5) with context cap = 10;
429
+ select * from ctxamt order by id;
430
+ → [{"id":1,"v":5}]
431
+
432
+ -- ...but making it maintained is rejected
433
+ alter table ctxamt set maintained as select id, v from ctxsrc;
434
+ -- error: cannot make table 'main.ctxamt' maintained
435
+
436
+ -- the failed alter left the table plain and still writable with a
437
+ -- `with context` value
438
+ insert into ctxamt values (2, 20) with context cap = 30;
439
+ select * from ctxamt order by id;
440
+ → [{"id":1,"v":5},{"id":2,"v":20}]
@@ -0,0 +1,103 @@
1
+ -- 51.85-maintained-table-parent-fk.sqllogic — parent-side FK enforcement for
2
+ -- maintained-table maintenance writes, exercised against the LevelDB store backend.
3
+ -- `enforceParentSideReferentialActions` is arm-agnostic; the inverse-projection arm
4
+ -- is sufficient to cover all four declared FK actions on the store backend.
5
+
6
+ pragma foreign_keys = true;
7
+
8
+ -- ===================================
9
+ -- 1. RESTRICT blocks a maintenance delete and rolls back the source write atomically
10
+ -- ===================================
11
+
12
+ create table src (id integer primary key, v text);
13
+ create table m (id integer primary key, v text) maintained as select id, v from src;
14
+ create table c (cid integer primary key, m_id integer,
15
+ foreign key (m_id) references m(id) on delete restrict);
16
+ insert into src values (1, 'a'), (2, 'b');
17
+ insert into c values (10, 1);
18
+
19
+ -- maintenance delete of m(1) blocked by RESTRICT FK on c
20
+ delete from src where id = 1;
21
+ -- error: violates RESTRICT from 'c'
22
+
23
+ -- atomic rollback: all three tables intact
24
+ select * from src order by id;
25
+ → [{"id":1,"v":"a"},{"id":2,"v":"b"}]
26
+ select * from m order by id;
27
+ → [{"id":1,"v":"a"},{"id":2,"v":"b"}]
28
+ select count(*) as n from c;
29
+ → [{"n":1}]
30
+
31
+ -- unreferenced row maintains cleanly
32
+ delete from src where id = 2;
33
+ select id from m;
34
+ → [{"id":1}]
35
+
36
+ drop table c;
37
+ drop table m;
38
+ drop table src;
39
+
40
+ -- ===================================
41
+ -- 2. CASCADE removes children on a maintenance delete
42
+ -- ===================================
43
+
44
+ create table src (id integer primary key, v text);
45
+ create table m (id integer primary key, v text) maintained as select id, v from src;
46
+ create table c (cid integer primary key, m_id integer,
47
+ foreign key (m_id) references m(id) on delete cascade);
48
+ insert into src values (1, 'a');
49
+ insert into c values (10, 1), (11, 1);
50
+
51
+ delete from src where id = 1;
52
+ select count(*) as n from m;
53
+ → [{"n":0}]
54
+ select count(*) as n from c;
55
+ → [{"n":0}]
56
+
57
+ drop table c;
58
+ drop table m;
59
+ drop table src;
60
+
61
+ -- ===================================
62
+ -- 3. SET NULL clears the child FK column on a maintenance delete
63
+ -- ===================================
64
+
65
+ create table src (id integer primary key, v text);
66
+ create table m (id integer primary key, v text) maintained as select id, v from src;
67
+ create table c (cid integer primary key, m_id integer null,
68
+ foreign key (m_id) references m(id) on delete set null);
69
+ insert into src values (1, 'a');
70
+ insert into c values (10, 1);
71
+
72
+ delete from src where id = 1;
73
+ select count(*) as n from m;
74
+ → [{"n":0}]
75
+ select * from c;
76
+ → [{"cid":10,"m_id":null}]
77
+
78
+ drop table c;
79
+ drop table m;
80
+ drop table src;
81
+
82
+ -- ===================================
83
+ -- 4. SET DEFAULT resets the child FK column to its default on a maintenance delete
84
+ -- (simple non-nested case: the default value points at the surviving parent row)
85
+ -- ===================================
86
+
87
+ create table src (id integer primary key);
88
+ create table m (id integer primary key) maintained as select id from src;
89
+ create table c (cid integer primary key, m_id integer default 99,
90
+ foreign key (m_id) references m(id) on delete set default);
91
+ insert into src values (1), (99);
92
+ insert into c values (10, 1);
93
+
94
+ -- delete src(1): m(1) removed, SET DEFAULT resets c.m_id to 99 (which still exists in m)
95
+ delete from src where id = 1;
96
+ select id from m;
97
+ → [{"id":99}]
98
+ select * from c;
99
+ → [{"cid":10,"m_id":99}]
100
+
101
+ drop table c;
102
+ drop table m;
103
+ drop table src;