@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,191 @@
1
+ -- ALTER TABLE operations: RENAME TABLE, RENAME COLUMN, ADD COLUMN, DROP COLUMN
2
+
3
+ -- ===================================
4
+ -- 1. ADD COLUMN (test first as simplest)
5
+ -- ===================================
6
+
7
+ create table t_addcol (id integer primary key, name text);
8
+ insert into t_addcol values (1, 'Alice'), (2, 'Bob');
9
+
10
+ -- Add column with NULL default (implicit)
11
+ alter table t_addcol add column age integer null;
12
+
13
+ -- Existing rows should get NULL for the new column
14
+ select * from t_addcol order by id;
15
+ → [{"id": 1, "name": "Alice", "age": null}, {"id": 2, "name": "Bob", "age": null}]
16
+
17
+ -- Can insert with new column
18
+ insert into t_addcol values (3, 'Charlie', 30);
19
+
20
+ select * from t_addcol where id = 3;
21
+ → [{"id": 3, "name": "Charlie", "age": 30}]
22
+
23
+ -- Add column with DEFAULT value
24
+ alter table t_addcol add column status text default 'active';
25
+
26
+ select status from t_addcol where id = 1;
27
+ → [{"status": "active"}]
28
+
29
+ -- Cannot add duplicate column
30
+ alter table t_addcol add column name text;
31
+ -- error: already exists
32
+
33
+ -- Cannot add PRIMARY KEY column
34
+ alter table t_addcol add column pk integer primary key;
35
+ -- error: PRIMARY KEY
36
+
37
+ drop table t_addcol;
38
+
39
+ -- ===================================
40
+ -- 2. DROP COLUMN
41
+ -- ===================================
42
+
43
+ create table t_dropcol (id integer primary key, name text, extra text);
44
+ insert into t_dropcol values (1, 'Alice', 'x'), (2, 'Bob', 'y');
45
+
46
+ alter table t_dropcol drop column extra;
47
+
48
+ -- Remaining columns should work
49
+ select * from t_dropcol order by id;
50
+ → [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]
51
+
52
+ -- Cannot drop PK column
53
+ alter table t_dropcol drop column id;
54
+ -- error: PRIMARY KEY
55
+
56
+ -- Cannot drop non-existent column
57
+ alter table t_dropcol drop column nonexistent;
58
+ -- error: not found
59
+
60
+ drop table t_dropcol;
61
+
62
+ -- ===================================
63
+ -- 3. RENAME COLUMN
64
+ -- ===================================
65
+
66
+ create table t_colrename (id integer primary key, old_name text);
67
+ insert into t_colrename values (1, 'hello'), (2, 'world');
68
+
69
+ alter table t_colrename rename column old_name to new_name;
70
+
71
+ -- New column name should work
72
+ select new_name from t_colrename where id = 1;
73
+ → [{"new_name": "hello"}]
74
+
75
+ -- Data preserved
76
+ select * from t_colrename order by id;
77
+ → [{"id": 1, "new_name": "hello"}, {"id": 2, "new_name": "world"}]
78
+
79
+ -- Cannot rename to existing column name
80
+ alter table t_colrename rename column new_name to id;
81
+ -- error: already exists
82
+
83
+ -- Cannot rename non-existent column
84
+ alter table t_colrename rename column nonexistent to something;
85
+ -- error: not found
86
+
87
+ drop table t_colrename;
88
+
89
+ -- ===================================
90
+ -- 4. RENAME TABLE
91
+ -- ===================================
92
+
93
+ create table t_rename (id integer primary key, val text);
94
+ insert into t_rename values (1, 'a'), (2, 'b');
95
+ alter table t_rename rename to t_renamed;
96
+ -- run
97
+
98
+ -- Old name should no longer work
99
+ select * from t_rename;
100
+ -- error: not found
101
+
102
+ -- New name should work and data preserved
103
+ select * from t_renamed order by id;
104
+ → [{"id": 1, "val": "a"}, {"id": 2, "val": "b"}]
105
+
106
+ -- Can insert into renamed table
107
+ insert into t_renamed values (3, 'c');
108
+
109
+ select count(*) as cnt from t_renamed;
110
+ → [{"cnt": 3}]
111
+
112
+ -- Cannot rename to existing table
113
+ create table t_conflict (x integer);
114
+ -- run
115
+
116
+ alter table t_renamed rename to t_conflict;
117
+ -- error: already exists
118
+
119
+ drop table t_renamed;
120
+ drop table t_conflict;
121
+
122
+ -- ===================================
123
+ -- 5. ADD COLUMN with NOT NULL + DEFAULT
124
+ -- ===================================
125
+
126
+ create table t_notnull (id integer primary key);
127
+ insert into t_notnull values (1), (2);
128
+ -- run
129
+
130
+ -- NOT NULL without DEFAULT should fail (table has rows)
131
+ alter table t_notnull add column required text not null;
132
+ -- error: NOT NULL
133
+
134
+ -- Error message should name the column and qualified table
135
+ alter table t_notnull add column rank integer not null;
136
+ -- error: 'rank'
137
+
138
+ alter table t_notnull add column rank integer not null;
139
+ -- error: main.t_notnull
140
+
141
+ -- NOT NULL with DEFAULT should succeed
142
+ alter table t_notnull add column required text not null default 'default_val';
143
+
144
+ select required from t_notnull where id = 1;
145
+ → [{"required": "default_val"}]
146
+
147
+ -- NULL (no DEFAULT) on non-empty table is allowed
148
+ alter table t_notnull add column nickname text null;
149
+ select nickname from t_notnull where id = 1;
150
+ → [{"nickname": null}]
151
+
152
+ drop table t_notnull;
153
+
154
+ -- NOT NULL without DEFAULT is allowed on an empty table
155
+ create table t_notnull_empty (id integer primary key, name text);
156
+ alter table t_notnull_empty add column rank integer not null;
157
+ insert into t_notnull_empty values (1, 'Alice', 10);
158
+ select * from t_notnull_empty;
159
+ → [{"id": 1, "name": "Alice", "rank": 10}]
160
+ drop table t_notnull_empty;
161
+
162
+ -- ===================================
163
+ -- 6. Combined operations
164
+ -- ===================================
165
+
166
+ create table t_combined (id integer primary key, a text, b text);
167
+ insert into t_combined values (1, 'x', 'y');
168
+
169
+ -- Add column, rename it, then use it
170
+ alter table t_combined add column c integer null;
171
+
172
+ alter table t_combined rename column c to score;
173
+
174
+ insert into t_combined values (2, 'p', 'q', 100);
175
+
176
+ select id, score from t_combined order by id;
177
+ → [{"id": 1, "score": null}, {"id": 2, "score": 100}]
178
+
179
+ -- Drop original column
180
+ alter table t_combined drop column b;
181
+
182
+ select * from t_combined order by id;
183
+ → [{"id": 1, "a": "x", "score": null}, {"id": 2, "a": "p", "score": 100}]
184
+
185
+ -- Rename table
186
+ alter table t_combined rename to t_final;
187
+
188
+ select * from t_final where id = 2;
189
+ → [{"id": 2, "a": "p", "score": 100}]
190
+
191
+ drop table t_final;
@@ -0,0 +1,263 @@
1
+ -- adapted from SQLite test/fkey1.test, test/fkey2.test, test/fkey3.test, test/fkey4.test
2
+ -- FK + ON CONFLICT, multi-row UPDATE cascade, self-referential composite,
3
+ -- DROP-table-with-children, and DEFERRABLE INITIALLY DEFERRED column FK.
4
+
5
+ pragma foreign_keys = true;
6
+
7
+ -- ===================================
8
+ -- 1. INSERT OR IGNORE on child silently skips FK violation
9
+ -- ===================================
10
+
11
+ create table p_oc (id integer primary key);
12
+ create table c_oc (id integer primary key, p_id integer null,
13
+ foreign key (p_id) references p_oc(id));
14
+
15
+ insert into p_oc values (1);
16
+
17
+ -- IGNORE: orphan row silently skipped, no error
18
+ insert or ignore into c_oc values (1, 99);
19
+
20
+ select count(*) as cnt from c_oc;
21
+ → [{"cnt":0}]
22
+
23
+ -- explicit ABORT raises
24
+ insert or abort into c_oc values (2, 99);
25
+ -- error:
26
+
27
+ -- valid insert
28
+ insert into c_oc values (10, 1);
29
+
30
+ -- IGNORE in multi-row VALUES: only orphans skipped
31
+ insert or ignore into c_oc values (11, 1), (12, 88), (13, 1);
32
+
33
+ select id from c_oc order by id;
34
+ → [{"id":10},{"id":11},{"id":13}]
35
+
36
+ drop table c_oc;
37
+ drop table p_oc;
38
+
39
+ -- ===================================
40
+ -- 2. UPDATE OR IGNORE / OR ABORT — intentionally not supported.
41
+ -- ===================================
42
+ -- Per-statement conflict overrides on UPDATE are SQLite-only syntax; pinned closed.
43
+ -- Schema-level ON CONFLICT on the constraint covers the IGNORE/ABORT defaults.
44
+ -- See docs/sql.md §11.
45
+
46
+ -- ===================================
47
+ -- 3. ON UPDATE CASCADE where the cascade collides with another FK
48
+ -- ===================================
49
+
50
+ create table fa (id integer primary key);
51
+ create table fb (id integer primary key,
52
+ foreign key (id) references fa(id) on update cascade);
53
+ create table fc (b_id integer primary key,
54
+ foreign key (b_id) references fb(id));
55
+
56
+ insert into fa values (1);
57
+ insert into fb values (1);
58
+ insert into fc values (1);
59
+
60
+ -- updating fa.id cascades to fb.id; fb is referenced by fc with default
61
+ -- (RESTRICT) action → end-to-end fails atomically
62
+ update fa set id = 2 where id = 1;
63
+ -- error:
64
+
65
+ -- nothing changed
66
+ select id from fa;
67
+ → [{"id":1}]
68
+ select id from fb;
69
+ → [{"id":1}]
70
+ select b_id from fc;
71
+ → [{"b_id":1}]
72
+
73
+ drop table fc;
74
+ drop table fb;
75
+ drop table fa;
76
+
77
+ -- ===================================
78
+ -- 4. Multi-row parent UPDATE cascades per-row
79
+ -- ===================================
80
+
81
+ create table mp (id integer primary key);
82
+ create table mc (id integer primary key, p_id integer null,
83
+ foreign key (p_id) references mp(id) on update cascade);
84
+
85
+ insert into mp values (1), (2), (3);
86
+ insert into mc values (10, 1), (11, 1), (20, 2), (21, 2), (30, 3);
87
+
88
+ -- single UPDATE rewriting many parent rows; all matching children cascade
89
+ update mp set id = id + 100;
90
+
91
+ select id, p_id from mc order by id;
92
+ → [{"id":10,"p_id":101},{"id":11,"p_id":101},{"id":20,"p_id":102},{"id":21,"p_id":102},{"id":30,"p_id":103}]
93
+
94
+ drop table mc;
95
+ drop table mp;
96
+
97
+ -- ===================================
98
+ -- 5. Self-referential FK with composite UNIQUE target
99
+ -- ===================================
100
+
101
+ create table tree (
102
+ id integer primary key,
103
+ pid integer not null,
104
+ tag text not null,
105
+ unique (id, tag),
106
+ foreign key (pid, tag) references tree(id, tag)
107
+ );
108
+
109
+ -- root self-match
110
+ insert into tree values (1, 1, 'a');
111
+
112
+ select * from tree;
113
+ → [{"id":1,"pid":1,"tag":"a"}]
114
+
115
+ -- valid child referencing existing (id, tag)
116
+ insert into tree values (2, 1, 'a');
117
+
118
+ -- invalid: (pid, tag) = (1, 'b') has no matching row
119
+ insert into tree values (3, 1, 'b');
120
+ -- error:
121
+
122
+ drop table tree;
123
+
124
+ -- ===================================
125
+ -- 6. DROP TABLE of a parent while a child still references it
126
+ -- ===================================
127
+
128
+ create table fk_drop_parent (x integer primary key, y integer null);
129
+ create table fk_drop_child (a integer primary key, b integer null references fk_drop_parent(x));
130
+
131
+ insert into fk_drop_parent values (100, 1);
132
+ insert into fk_drop_child values (1, 100);
133
+
134
+ -- dropping the referenced parent must fail
135
+ drop table fk_drop_parent;
136
+ -- error:
137
+
138
+ -- correct order (child first) succeeds
139
+ drop table fk_drop_child;
140
+ drop table fk_drop_parent;
141
+
142
+ -- ===================================
143
+ -- 7. DEFERRABLE INITIALLY DEFERRED column FK — auto-commit failure repeats cleanly
144
+ -- ===================================
145
+
146
+ create table t1 (a integer primary key, b integer null);
147
+ create table t2 (c integer null references t1 deferrable initially deferred, d integer null);
148
+
149
+ insert into t1 values (1, 2);
150
+ insert into t2 values (1, 3);
151
+
152
+ select * from t2;
153
+ → [{"c":1,"d":3}]
154
+
155
+ -- deferred FK still rejects on auto-commit (no enclosing tx)
156
+ insert into t2 values (2, 4);
157
+ -- error:
158
+
159
+ -- repeating it must fail the same way; no implicit tx left dangling
160
+ insert into t2 values (2, 4);
161
+ -- error:
162
+
163
+ select * from t2;
164
+ → [{"c":1,"d":3}]
165
+
166
+ drop table t2;
167
+ drop table t1;
168
+
169
+ -- ===================================
170
+ -- 8. Self-referential ON DELETE CASCADE — multi-level subtree
171
+ -- ===================================
172
+
173
+ create table sr_tree (
174
+ id integer primary key,
175
+ pid integer null,
176
+ foreign key (pid) references sr_tree(id) on delete cascade
177
+ );
178
+
179
+ -- Build:
180
+ -- 1 (root, pid=NULL)
181
+ -- ├─ 2 (pid=1)
182
+ -- │ ├─ 4 (pid=2)
183
+ -- │ └─ 5 (pid=2)
184
+ -- └─ 3 (pid=1)
185
+ -- └─ 6 (pid=3)
186
+ insert into sr_tree values (1, null);
187
+ insert into sr_tree values (2, 1), (3, 1);
188
+ insert into sr_tree values (4, 2), (5, 2), (6, 3);
189
+
190
+ select id from sr_tree order by id;
191
+ → [{"id":1},{"id":2},{"id":3},{"id":4},{"id":5},{"id":6}]
192
+
193
+ -- delete subtree rooted at 2 → cascades to 4 and 5
194
+ delete from sr_tree where id = 2;
195
+
196
+ select id from sr_tree order by id;
197
+ → [{"id":1},{"id":3},{"id":6}]
198
+
199
+ -- delete root → cascades the entire remaining tree
200
+ delete from sr_tree where id = 1;
201
+
202
+ select count(*) as cnt from sr_tree;
203
+ → [{"cnt":0}]
204
+
205
+ drop table sr_tree;
206
+
207
+ -- ===================================
208
+ -- 9. Self-referential ON UPDATE CASCADE — child's pid follows parent's id rename
209
+ -- ===================================
210
+
211
+ create table sru_tree (
212
+ id integer primary key,
213
+ pid integer null,
214
+ foreign key (pid) references sru_tree(id) on update cascade
215
+ );
216
+
217
+ insert into sru_tree values (1, null);
218
+ insert into sru_tree values (2, 1), (3, 1);
219
+ insert into sru_tree values (4, 2);
220
+
221
+ -- rename leaf parent: child 4 follows
222
+ update sru_tree set id = 200 where id = 2;
223
+
224
+ select id, pid from sru_tree order by id;
225
+ → [{"id":1,"pid":null},{"id":3,"pid":1},{"id":4,"pid":200},{"id":200,"pid":1}]
226
+
227
+ -- rename root: rows 3 and 200 follow (4's pid stays at 200 since 200 didn't move)
228
+ update sru_tree set id = 100 where id = 1;
229
+
230
+ select id, pid from sru_tree order by id;
231
+ → [{"id":3,"pid":100},{"id":4,"pid":200},{"id":100,"pid":null},{"id":200,"pid":100}]
232
+
233
+ drop table sru_tree;
234
+
235
+ -- ===================================
236
+ -- 10. Deferred self-referential FK — forward reference within a transaction
237
+ -- ===================================
238
+
239
+ create table sd_tree (
240
+ id integer primary key,
241
+ pid integer null references sd_tree(id) deferrable initially deferred
242
+ );
243
+
244
+ -- forward reference: insert child before parent in the same tx; commit must succeed
245
+ begin;
246
+ insert into sd_tree values (2, 1);
247
+ insert into sd_tree values (1, null);
248
+ commit;
249
+
250
+ select id, pid from sd_tree order by id;
251
+ → [{"id":1,"pid":null},{"id":2,"pid":1}]
252
+
253
+ -- if the parent never appears, commit must fail
254
+ begin;
255
+ insert into sd_tree values (3, 99);
256
+ commit;
257
+ -- error:
258
+
259
+ -- failed commit must leave no trace of row 3
260
+ select id from sd_tree order by id;
261
+ → [{"id":1},{"id":2}]
262
+
263
+ drop table sd_tree;
@@ -0,0 +1,155 @@
1
+ -- fk-cross-schema.sqllogic - FK parent-side check must respect schema boundaries
2
+ -- Regression: buildParentSideFKChecks matches by table name only, ignoring schema
3
+
4
+ PRAGMA foreign_keys = true;
5
+
6
+ -- ===================================================================
7
+ -- Setup: Two schemas, each with an identically-named "items" table.
8
+ -- Only s1 has a child table with FK referencing s1.items.
9
+ -- ===================================================================
10
+
11
+ declare schema s1 {
12
+ table items {
13
+ id INTEGER PRIMARY KEY,
14
+ name TEXT NOT NULL
15
+ }
16
+
17
+ table orders {
18
+ id INTEGER PRIMARY KEY,
19
+ item_id INTEGER,
20
+ FOREIGN KEY (item_id) REFERENCES items(id) ON DELETE RESTRICT
21
+ }
22
+ }
23
+
24
+ declare schema s2 {
25
+ table items {
26
+ id INTEGER PRIMARY KEY,
27
+ label TEXT
28
+ }
29
+ }
30
+
31
+ apply schema s1;
32
+ apply schema s2;
33
+
34
+ -- run
35
+
36
+ -- Seed both schemas
37
+ INSERT INTO s1.items VALUES (1, 'Widget'), (2, 'Gadget');
38
+ INSERT INTO s1.orders VALUES (100, 1), (200, 2);
39
+
40
+ INSERT INTO s2.items VALUES (1, 'Alpha'), (2, 'Beta'), (3, 'Gamma');
41
+
42
+ -- Verify setup
43
+ SELECT count(*) as cnt FROM s1.orders;
44
+ → [{"cnt":2}]
45
+
46
+ SELECT count(*) as cnt FROM s2.items;
47
+ → [{"cnt":3}]
48
+
49
+ -- ===================================================================
50
+ -- Test: DELETE from s2.items should succeed — no FK references s2.items
51
+ -- With the bug, it incorrectly matches s1.orders FK (which targets s1.items)
52
+ -- ===================================================================
53
+
54
+ DELETE FROM s2.items WHERE id = 3;
55
+
56
+ SELECT count(*) as cnt FROM s2.items;
57
+ → [{"cnt":2}]
58
+
59
+ -- DELETE from s1.items that IS referenced should fail (RESTRICT)
60
+ DELETE FROM s1.items WHERE id = 1;
61
+ -- error: constraint failed
62
+
63
+ -- Verify s1.items unchanged
64
+ SELECT count(*) as cnt FROM s1.items;
65
+ → [{"cnt":2}]
66
+
67
+ -- ===================================================================
68
+ -- Test: UPDATE on s2.items should also succeed
69
+ -- ===================================================================
70
+
71
+ UPDATE s2.items SET id = 99 WHERE id = 2;
72
+
73
+ SELECT id FROM s2.items ORDER BY id;
74
+ → [{"id":1},{"id":99}]
75
+
76
+ -- Cleanup
77
+ DROP TABLE s1.orders;
78
+ DROP TABLE s1.items;
79
+ DROP TABLE s2.items;
80
+
81
+ -- ===================================================================
82
+ -- Test: CASCADE/SET NULL/SET DEFAULT actions across schemas must
83
+ -- target the schema-qualified child table, not whichever 'children'
84
+ -- happens to live in the default schema.
85
+ -- Regression: executeSingleFKAction generated unqualified DELETE/UPDATE
86
+ -- which would target the wrong table when child is in a non-default schema.
87
+ -- ===================================================================
88
+
89
+ declare schema sa {
90
+ table parents {
91
+ id INTEGER PRIMARY KEY,
92
+ val TEXT NULL
93
+ }
94
+
95
+ table cascade_children {
96
+ id INTEGER PRIMARY KEY,
97
+ parent_id INTEGER NULL,
98
+ FOREIGN KEY (parent_id) REFERENCES parents(id) ON DELETE CASCADE ON UPDATE CASCADE
99
+ }
100
+
101
+ table setnull_children {
102
+ id INTEGER PRIMARY KEY,
103
+ parent_id INTEGER NULL,
104
+ FOREIGN KEY (parent_id) REFERENCES parents(id) ON DELETE SET NULL
105
+ }
106
+
107
+ table setdefault_children {
108
+ id INTEGER PRIMARY KEY,
109
+ parent_id INTEGER NULL DEFAULT 99,
110
+ FOREIGN KEY (parent_id) REFERENCES parents(id) ON DELETE SET DEFAULT
111
+ }
112
+ }
113
+
114
+ apply schema sa;
115
+
116
+ -- run
117
+
118
+ -- Seed: parent 99 acts as the default-target row for SET DEFAULT.
119
+ -- Each child references a distinct parent so that one action does not
120
+ -- cascade into another.
121
+ INSERT INTO sa.parents VALUES (1, 'one'), (2, 'two'), (3, 'three'), (4, 'four'), (99, 'default');
122
+ INSERT INTO sa.cascade_children VALUES (10, 1), (11, 1);
123
+ INSERT INTO sa.cascade_children VALUES (12, 2);
124
+ INSERT INTO sa.setnull_children VALUES (20, 3);
125
+ INSERT INTO sa.setdefault_children VALUES (30, 4);
126
+
127
+ -- CASCADE DELETE across schema
128
+ DELETE FROM sa.parents WHERE id = 1;
129
+
130
+ SELECT count(*) as cnt FROM sa.cascade_children WHERE parent_id = 1;
131
+ → [{"cnt":0}]
132
+
133
+ -- CASCADE UPDATE across schema
134
+ UPDATE sa.parents SET id = 222 WHERE id = 2;
135
+
136
+ SELECT parent_id FROM sa.cascade_children WHERE id = 12;
137
+ → [{"parent_id":222}]
138
+
139
+ -- SET NULL across schema
140
+ DELETE FROM sa.parents WHERE id = 3;
141
+
142
+ SELECT parent_id FROM sa.setnull_children WHERE id = 20;
143
+ → [{"parent_id":null}]
144
+
145
+ -- SET DEFAULT across schema
146
+ DELETE FROM sa.parents WHERE id = 4;
147
+
148
+ SELECT parent_id FROM sa.setdefault_children WHERE id = 30;
149
+ → [{"parent_id":99}]
150
+
151
+ DROP TABLE sa.cascade_children;
152
+ DROP TABLE sa.setnull_children;
153
+ DROP TABLE sa.setdefault_children;
154
+ DROP TABLE sa.parents;
155
+