@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,230 @@
1
+ -- ALTER TABLE ... ALTER PRIMARY KEY tests
2
+
3
+ -- ===================================
4
+ -- 1. Rekey on empty table
5
+ -- ===================================
6
+
7
+ create table t_rekey_empty (a integer primary key, b integer not null);
8
+ -- run
9
+
10
+ alter table t_rekey_empty alter primary key (b);
11
+ -- run
12
+
13
+ -- Verify new PK via table_info: b should be pk, a should not
14
+ select name, pk from table_info('t_rekey_empty') order by name;
15
+ → [{"name": "a", "pk": 0}, {"name": "b", "pk": 1}]
16
+
17
+ -- Insert and verify the new key works
18
+ insert into t_rekey_empty values (1, 10), (2, 20);
19
+ -- run
20
+
21
+ select * from t_rekey_empty order by b;
22
+ → [{"a": 1, "b": 10}, {"a": 2, "b": 20}]
23
+
24
+ drop table t_rekey_empty;
25
+ -- run
26
+
27
+ -- ===================================
28
+ -- 2. Rekey on populated table
29
+ -- ===================================
30
+
31
+ create table t_rekey_pop (id integer primary key, code integer not null, name text);
32
+ insert into t_rekey_pop values (1, 100, 'Alice'), (2, 200, 'Bob'), (3, 300, 'Charlie');
33
+ -- run
34
+
35
+ alter table t_rekey_pop alter primary key (code);
36
+ -- run
37
+
38
+ -- Row count should be preserved
39
+ select count(*) as cnt from t_rekey_pop;
40
+ → [{"cnt": 3}]
41
+
42
+ -- Data should be intact
43
+ select * from t_rekey_pop order by code;
44
+ → [{"id": 1, "code": 100, "name": "Alice"}, {"id": 2, "code": 200, "name": "Bob"}, {"id": 3, "code": 300, "name": "Charlie"}]
45
+
46
+ -- Verify PK changed
47
+ select name, pk from table_info('t_rekey_pop') where pk > 0;
48
+ → [{"name": "code", "pk": 1}]
49
+
50
+ drop table t_rekey_pop;
51
+ -- run
52
+
53
+ -- ===================================
54
+ -- 3. Rekey that creates a duplicate-key violation
55
+ -- ===================================
56
+
57
+ create table t_rekey_dup (id integer primary key, category integer not null);
58
+ insert into t_rekey_dup values (1, 10), (2, 10), (3, 20);
59
+ -- run
60
+
61
+ -- Rekey to (category) — should fail because categories are not unique
62
+ alter table t_rekey_dup alter primary key (category);
63
+ -- error:
64
+
65
+ -- Table should be unchanged
66
+ select count(*) as cnt from t_rekey_dup;
67
+ → [{"cnt": 3}]
68
+
69
+ -- PK should still be id
70
+ select name, pk from table_info('t_rekey_dup') where pk > 0;
71
+ → [{"name": "id", "pk": 1}]
72
+
73
+ drop table t_rekey_dup;
74
+ -- run
75
+
76
+ -- ===================================
77
+ -- 4. Empty PK
78
+ -- ===================================
79
+
80
+ create table t_empty_pk (a integer not null, b text);
81
+ -- run
82
+
83
+ alter table t_empty_pk alter primary key ();
84
+ -- run
85
+
86
+ select count(*) as cnt from t_empty_pk;
87
+ → [{"cnt": 0}]
88
+
89
+ drop table t_empty_pk;
90
+ -- run
91
+
92
+ -- ===================================
93
+ -- 5. Rekey ONTO a nullable column succeeds — key membership does not imply NOT NULL
94
+ -- (docs/schema.md § "Primary-key nullability"). The column keeps its declared
95
+ -- nullability and NULL participates in the new key as a self-equal value, so a
96
+ -- second NULL key is a duplicate. Full coverage in 43.3-nullable-primary-key § 11.
97
+ -- ===================================
98
+
99
+ create table t_rekey_null (id integer primary key, val integer null);
100
+ insert into t_rekey_null values (1, 10), (2, 20);
101
+ -- run
102
+
103
+ alter table t_rekey_null alter primary key (val);
104
+ -- run
105
+
106
+ select name, "notnull", pk from table_info('t_rekey_null') order by cid;
107
+ → [{"name": "id", "notnull": 1, "pk": 0}, {"name": "val", "notnull": 0, "pk": 1}]
108
+
109
+ -- Existing rows survive the re-key and stay addressable under the new key.
110
+ select id from t_rekey_null where val = 20;
111
+ → [{"id": 2}]
112
+
113
+ insert into t_rekey_null values (3, null);
114
+ -- run
115
+
116
+ insert into t_rekey_null values (4, null);
117
+ -- error: UNIQUE constraint failed
118
+
119
+ select count(*) as cnt from t_rekey_null;
120
+ → [{"cnt": 3}]
121
+
122
+ drop table t_rekey_null;
123
+ -- run
124
+
125
+ -- ===================================
126
+ -- 6. Rekey with DESC direction
127
+ -- ===================================
128
+
129
+ create table t_rekey_dir (a integer primary key, b integer not null);
130
+ insert into t_rekey_dir values (1, 30), (2, 10), (3, 20);
131
+ -- run
132
+
133
+ alter table t_rekey_dir alter primary key (b desc);
134
+ -- run
135
+
136
+ select * from t_rekey_dir order by b desc;
137
+ → [{"a": 1, "b": 30}, {"a": 3, "b": 20}, {"a": 2, "b": 10}]
138
+
139
+ drop table t_rekey_dir;
140
+ -- run
141
+
142
+ -- ===================================
143
+ -- 7. Composite PK rekey
144
+ -- ===================================
145
+
146
+ create table t_rekey_comp (id integer primary key, a integer not null, b integer not null);
147
+ insert into t_rekey_comp values (1, 10, 100), (2, 20, 200), (3, 10, 200);
148
+ -- run
149
+
150
+ alter table t_rekey_comp alter primary key (a, b);
151
+ -- run
152
+
153
+ select count(*) as cnt from t_rekey_comp;
154
+ → [{"cnt": 3}]
155
+
156
+ -- Verify composite PK
157
+ select name, pk from table_info('t_rekey_comp') where pk > 0 order by name;
158
+ → [{"name": "a", "pk": 1}, {"name": "b", "pk": 1}]
159
+
160
+ drop table t_rekey_comp;
161
+ -- run
162
+
163
+ -- ===================================
164
+ -- 8. Nonexistent column in PK should fail
165
+ -- ===================================
166
+
167
+ create table t_rekey_noexist (id integer primary key, val text);
168
+ -- run
169
+
170
+ alter table t_rekey_noexist alter primary key (nonexistent);
171
+ -- error: not found
172
+
173
+ drop table t_rekey_noexist;
174
+ -- run
175
+
176
+ -- ===================================
177
+ -- 9. Duplicate column in PK should fail
178
+ -- ===================================
179
+
180
+ create table t_rekey_dupcolpk (id integer primary key, val integer not null);
181
+ -- run
182
+
183
+ alter table t_rekey_dupcolpk alter primary key (val, val);
184
+ -- error: Duplicate
185
+
186
+ drop table t_rekey_dupcolpk;
187
+ -- run
188
+
189
+ -- ===================================
190
+ -- 10a. Rekey preserves nullable columns (regression)
191
+ -- ===================================
192
+ -- Regression test: a nullable non-PK column with a NULL value must survive
193
+ -- the rebuild. (The MemoryTable path copies ColumnSchema directly and was
194
+ -- never affected; the non-memory path — rebuildViaShadowTable — omitted
195
+ -- explicit nullability and silently recreated nullable columns as NOT NULL.
196
+ -- See runtime/shadow-ddl.spec.ts for the pure-DDL coverage.)
197
+
198
+ create table t_rekey_nullable (id integer primary key, note text null, rate real default 1.0);
199
+ insert into t_rekey_nullable (id, note) values (1, null), (2, 'hi');
200
+ -- run
201
+
202
+ alter table t_rekey_nullable alter primary key (id);
203
+ -- run
204
+
205
+ -- Row with NULL in nullable column must survive:
206
+ select id, note, rate from t_rekey_nullable order by id;
207
+ → [{"id": 1, "note": null, "rate": 1.0}, {"id": 2, "note": "hi", "rate": 1.0}]
208
+
209
+ -- Nullability of the non-PK column must be preserved:
210
+ select name, "notnull" from table_info('t_rekey_nullable') where name = 'note';
211
+ → [{"name": "note", "notnull": 0}]
212
+
213
+ drop table t_rekey_nullable;
214
+ -- run
215
+
216
+ -- ===================================
217
+ -- 11. Parser round-trip via stringifier
218
+ -- ===================================
219
+
220
+ create table t_roundtrip (x integer primary key, y integer not null, z integer not null);
221
+ -- run
222
+
223
+ alter table t_roundtrip alter primary key (y, z desc);
224
+ -- run
225
+
226
+ select count(*) as cnt from t_roundtrip;
227
+ → [{"cnt": 0}]
228
+
229
+ drop table t_roundtrip;
230
+ -- run
@@ -0,0 +1,277 @@
1
+ -- 41.1 FOREIGN KEY collation-conflict detection at declaration time.
2
+ -- Ticket fk-collation-conflict-create-time-validation.
3
+ --
4
+ -- A FOREIGN KEY whose child column and parent key column declare same-rank
5
+ -- conflicting collations — the exact conflict the synthesized
6
+ -- `parent.k = NEW.ref` enforcement comparison raises at plan time — is rejected
7
+ -- at DECLARATION time (CREATE TABLE / ALTER ADD CONSTRAINT / ALTER ADD COLUMN)
8
+ -- through the SAME comparison-collation lattice, instead of being deferred to
9
+ -- the first DML against the child. The check is UNCONDITIONAL: a contradictory
10
+ -- declaration is malformed whether or not `pragma foreign_keys` is on.
11
+ --
12
+ -- Runs under both memory and store. The store cases pin the reconcile edge: an
13
+ -- implicit-default text PK reconciles to the store's NOCASE without marking the
14
+ -- column explicit (rank 1), so it must NOT falsely conflict with a defaulted or
15
+ -- declared child column.
16
+
17
+ -- =============================================================================
18
+ -- 1. CREATE TABLE conflict is UNCONDITIONAL: declared NOCASE child vs declared
19
+ -- RTRIM parent PK is rejected at CREATE even with foreign_keys OFF.
20
+ -- =============================================================================
21
+
22
+ pragma foreign_keys = false;
23
+
24
+ create table p_rt (k text collate rtrim primary key);
25
+ create table c_nc (id integer primary key, ref text collate nocase references p_rt(k));
26
+ -- error: conflicting collations
27
+ -- c_nc was never created; only the parent exists.
28
+ drop table p_rt;
29
+
30
+ -- =============================================================================
31
+ -- 2. Declared BINARY (rank 2) vs declared NOCASE (rank 2) → conflict. A declared
32
+ -- `collate binary` is a real preference, not the absence of one.
33
+ -- =============================================================================
34
+
35
+ create table p_bin (k text collate binary primary key);
36
+ create table c_db (id integer primary key, ref text collate nocase references p_bin(k));
37
+ -- error: conflicting collations
38
+ drop table p_bin;
39
+
40
+ -- =============================================================================
41
+ -- 3. Matching declared collations resolve — no conflict; the FK is live.
42
+ -- =============================================================================
43
+
44
+ pragma foreign_keys = true;
45
+
46
+ create table p_nc (k text collate nocase primary key);
47
+ create table c_nc2 (id integer primary key, ref text collate nocase references p_nc(k));
48
+ insert into p_nc values ('ABC');
49
+ -- case-variant child satisfied under the shared NOCASE collation.
50
+ insert into c_nc2 values (1, 'abc');
51
+ select count(*) as cnt from c_nc2;
52
+ → [{"cnt":1}]
53
+ -- a value with no case-folded parent is still rejected (FK enforced).
54
+ insert into c_nc2 values (2, 'nope');
55
+ -- error:
56
+ drop table c_nc2;
57
+ drop table p_nc;
58
+
59
+ -- =============================================================================
60
+ -- 4. One-sided declaration → no conflict. A declared NOCASE child vs an
61
+ -- implicit-default parent PK: the parent contributes the engine floor
62
+ -- (rank 1 — BINARY on memory, reconciled NOCASE on store), so the declared
63
+ -- NOCASE wins and resolves. Both backends create cleanly.
64
+ -- =============================================================================
65
+
66
+ create table os_parent (k text primary key);
67
+ create table os_child (id integer primary key, ref text collate nocase references os_parent(k));
68
+ insert into os_parent values ('ABC');
69
+ insert into os_child values (1, 'abc');
70
+ select count(*) as cnt from os_child;
71
+ → [{"cnt":1}]
72
+ drop table os_child;
73
+ drop table os_parent;
74
+
75
+ -- =============================================================================
76
+ -- 5. Store reconcile edge: an implicit-default text PK (reconciled to NOCASE,
77
+ -- rank 1, on store) must NOT falsely conflict with a DEFAULTED child column.
78
+ -- On memory both sides are rank-1 BINARY; on store the parent is rank-1
79
+ -- NOCASE and the child rank-1 BINARY — neither is a same-rank declared
80
+ -- conflict, so CREATE succeeds on both.
81
+ -- =============================================================================
82
+
83
+ create table ri_parent (k text primary key);
84
+ create table ri_child (id integer primary key, ref text references ri_parent(k));
85
+ insert into ri_parent values ('x');
86
+ insert into ri_child values (1, 'x');
87
+ select count(*) as cnt from ri_child;
88
+ → [{"cnt":1}]
89
+ drop table ri_child;
90
+ drop table ri_parent;
91
+
92
+ -- =============================================================================
93
+ -- 6. Self-referencing FK: a child column referencing a PK column on the SAME
94
+ -- table with a divergent declared collation is rejected at CREATE (the
95
+ -- validator resolves the parent against the table being declared, before it
96
+ -- is registered in the catalog).
97
+ -- =============================================================================
98
+
99
+ create table self_fk (
100
+ code text collate nocase primary key,
101
+ parent_code text collate rtrim references self_fk(code)
102
+ );
103
+ -- error: conflicting collations
104
+
105
+ -- =============================================================================
106
+ -- 7. Multi-column FK: a conflict on ANY one pair rejects, even when the other
107
+ -- pairs agree.
108
+ -- =============================================================================
109
+
110
+ create table mp_parent (
111
+ a text collate nocase,
112
+ b text collate nocase,
113
+ primary key (a, b)
114
+ );
115
+ create table mp_child (
116
+ id integer primary key,
117
+ fa text collate nocase,
118
+ fb text collate rtrim,
119
+ foreign key (fa, fb) references mp_parent(a, b)
120
+ );
121
+ -- error: conflicting collations
122
+ drop table mp_parent;
123
+
124
+ -- =============================================================================
125
+ -- 8. ALTER TABLE ADD CONSTRAINT: a conflicting FK added after the fact is
126
+ -- rejected at ALTER time. The collation check now runs as a PRE-validation,
127
+ -- BEFORE module.alterTable, so it is the single, authoritative rejection
128
+ -- point — before any module persistence side effect (on the store backend
129
+ -- alterTable's addConstraint arm saveTableDDL's the FK before returning, so a
130
+ -- post-call throw would leave the rejected FK on disk; see the store-reopen
131
+ -- spec fk-collation-conflict-reopen.spec.ts). The `foreign_keys` pragma is no
132
+ -- longer load-bearing for THIS rejection — it fires whether enforcement is on
133
+ -- or off — but we keep OFF here so the assertion isolates the pure
134
+ -- declaration-time check from the module's enforcement-time existing-row scan.
135
+ -- =============================================================================
136
+
137
+ pragma foreign_keys = false;
138
+
139
+ create table acp (k text collate rtrim primary key);
140
+ create table acc (id integer primary key, ref text collate nocase);
141
+ alter table acc add constraint fk_acc foreign key (ref) references acp(k);
142
+ -- error: conflicting collations
143
+ drop table acc;
144
+ drop table acp;
145
+
146
+ -- =============================================================================
147
+ -- 8.1. ALTER TABLE ADD CONSTRAINT, matching collations: a text FK whose child
148
+ -- and parent declare the SAME collation is NOT falsely rejected — the
149
+ -- validator only fires on a same-rank conflict. Proves the ALTER-time
150
+ -- check leaves valid declarations alone (regression guard for the
151
+ -- reference-based new-FK selection) and the added FK is live/enforced.
152
+ -- =============================================================================
153
+
154
+ pragma foreign_keys = true;
155
+
156
+ create table acp_ok (k text collate nocase primary key);
157
+ create table acc_ok (id integer primary key, ref text collate nocase);
158
+ alter table acc_ok add constraint fk_ok foreign key (ref) references acp_ok(k);
159
+ insert into acp_ok values ('ABC');
160
+ -- case-variant child satisfied under the shared NOCASE collation (FK enforced).
161
+ insert into acc_ok values (1, 'abc');
162
+ select count(*) as cnt from acc_ok;
163
+ → [{"cnt":1}]
164
+ -- a value with no case-folded parent is still rejected.
165
+ insert into acc_ok values (2, 'nope');
166
+ -- error:
167
+ drop table acc_ok;
168
+ drop table acp_ok;
169
+
170
+ -- =============================================================================
171
+ -- 8.2. ALTER TABLE ADD CONSTRAINT with foreign_keys ON: the conflict is caught
172
+ -- by the declaration-time PRE-validation (which runs BEFORE the module's
173
+ -- existing-row scan), so it surfaces as `conflicting collations` regardless
174
+ -- of the pragma state — NOT the enforcement-seam `ambiguous collation`
175
+ -- error the FK-ON existing-row query plan would otherwise raise. Locks the
176
+ -- cross-pragma message consistency the prevalidation reorder introduced
177
+ -- (§ 8 already pins the FK-OFF message). Empty child, so the existing-row
178
+ -- scan finds no orphan — the collation pre-check is the rejecting mechanism.
179
+ -- =============================================================================
180
+
181
+ pragma foreign_keys = true;
182
+
183
+ create table acp_on (k text collate rtrim primary key);
184
+ create table acc_on (id integer primary key, ref text collate nocase);
185
+ alter table acc_on add constraint fk_on foreign key (ref) references acp_on(k);
186
+ -- error: conflicting collations
187
+ drop table acc_on;
188
+ drop table acp_on;
189
+
190
+ -- =============================================================================
191
+ -- 8.3. Self-referencing ADD CONSTRAINT FK: a conflict against the SAME table's
192
+ -- PK column is rejected at ALTER time (the validator resolves the parent
193
+ -- against the already-registered table). Mirrors § 6 on the ADD CONSTRAINT
194
+ -- path, where the table — unlike at CREATE — is already in the catalog.
195
+ -- =============================================================================
196
+
197
+ create table self_ac (
198
+ code text collate nocase primary key,
199
+ parent_code text collate rtrim
200
+ );
201
+ alter table self_ac add constraint fk_self foreign key (parent_code) references self_ac(code);
202
+ -- error: conflicting collations
203
+ drop table self_ac;
204
+
205
+ -- =============================================================================
206
+ -- 8.4. Multi-column ADD CONSTRAINT FK: a conflict on ANY one pair rejects, even
207
+ -- when the other pairs agree. Mirrors § 7 on the ADD CONSTRAINT path.
208
+ -- =============================================================================
209
+
210
+ create table mpa_parent (
211
+ a text collate nocase,
212
+ b text collate nocase,
213
+ primary key (a, b)
214
+ );
215
+ create table mpa_child (
216
+ id integer primary key,
217
+ fa text collate nocase,
218
+ fb text collate rtrim
219
+ );
220
+ alter table mpa_child add constraint fk_multi foreign key (fa, fb) references mpa_parent(a, b);
221
+ -- error: conflicting collations
222
+ drop table mpa_child;
223
+ drop table mpa_parent;
224
+
225
+ pragma foreign_keys = false;
226
+
227
+ -- =============================================================================
228
+ -- 9. ALTER TABLE ADD COLUMN (column-level FK): a conflicting FK on the added
229
+ -- column is rejected, and the column is NOT added — the validate-before-swap
230
+ -- revert drops it, leaving the table untouched.
231
+ -- =============================================================================
232
+
233
+ create table alp (k text collate rtrim primary key);
234
+ create table alc (id integer primary key);
235
+ alter table alc add column ref text collate nocase references alp(k);
236
+ -- error: conflicting collations
237
+ -- The table is unchanged: only `id` remains (the rejected column was reverted).
238
+ insert into alc (id) values (1);
239
+ select * from alc;
240
+ → [{"id":1}]
241
+ drop table alc;
242
+ drop table alp;
243
+
244
+ -- =============================================================================
245
+ -- 9.1. ALTER TABLE ADD COLUMN, matching collations: a column-level FK whose
246
+ -- added column matches the parent collation is NOT rejected — the column
247
+ -- IS added (the validate-before-swap region only reverts on a conflict).
248
+ -- =============================================================================
249
+
250
+ create table alp_ok (k text collate nocase primary key);
251
+ create table alc_ok (id integer primary key);
252
+ alter table alc_ok add column ref text collate nocase null references alp_ok(k);
253
+ -- The column was added: both `id` and `ref` are present.
254
+ insert into alc_ok (id, ref) values (1, null);
255
+ select * from alc_ok;
256
+ → [{"id":1,"ref":null}]
257
+ drop table alc_ok;
258
+ drop table alp_ok;
259
+
260
+ -- =============================================================================
261
+ -- 10. Forward-declared parent residual: when the parent does not yet exist at
262
+ -- child-declare time, the validator cannot see the parent column types, so
263
+ -- the CREATE succeeds and the conflict remains caught at the first DML
264
+ -- (unchanged enforcement path). This is the one unavoidable residual.
265
+ -- =============================================================================
266
+
267
+ pragma foreign_keys = true;
268
+
269
+ create table fwd_child (id integer primary key, ref text collate nocase references fwd_parent(k));
270
+ create table fwd_parent (k text collate rtrim primary key);
271
+ insert into fwd_parent values ('a');
272
+ insert into fwd_child values (1, 'a');
273
+ -- error: ambiguous collation
274
+ drop table fwd_child;
275
+ drop table fwd_parent;
276
+
277
+ pragma foreign_keys = false;