@quereus/quereus 4.20.1 → 4.20.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (377) hide show
  1. package/README.md +2 -0
  2. package/package.json +7 -4
  3. package/test/README.md +173 -0
  4. package/test/logic/01-basic.sqllogic +39 -0
  5. package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
  6. package/test/logic/01.2-strings.sqllogic +43 -0
  7. package/test/logic/01.5-insert-select.sqllogic +237 -0
  8. package/test/logic/01.6-update-extras.sqllogic +118 -0
  9. package/test/logic/01.7-update-from.sqllogic +67 -0
  10. package/test/logic/01.8-delete-extras.sqllogic +122 -0
  11. package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
  12. package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
  13. package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
  14. package/test/logic/01.9-query-expr-values.sqllogic +111 -0
  15. package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
  16. package/test/logic/02-filters.sqllogic +54 -0
  17. package/test/logic/02-smoke.sqllogic +62 -0
  18. package/test/logic/02.1-bind-parameters.sqllogic +223 -0
  19. package/test/logic/03-expressions.sqllogic +190 -0
  20. package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
  21. package/test/logic/03.4-defaults.sqllogic +554 -0
  22. package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
  23. package/test/logic/03.5-tvf.sqllogic +61 -0
  24. package/test/logic/03.6-type-system.sqllogic +544 -0
  25. package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
  26. package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
  27. package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
  28. package/test/logic/03.8-not-precedence.sqllogic +255 -0
  29. package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
  30. package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
  31. package/test/logic/04-order-by.sqllogic +38 -0
  32. package/test/logic/04-transactions.sqllogic +239 -0
  33. package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
  34. package/test/logic/05-vtab_memory.sqllogic +50 -0
  35. package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
  36. package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
  37. package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
  38. package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
  39. package/test/logic/06-builtin_functions.sqllogic +149 -0
  40. package/test/logic/06.1-string-functions.sqllogic +92 -0
  41. package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
  42. package/test/logic/06.2-math-functions.sqllogic +82 -0
  43. package/test/logic/06.3-schema.sqllogic +48 -0
  44. package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
  45. package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
  46. package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
  47. package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
  48. package/test/logic/06.3.4-view-info.sqllogic +378 -0
  49. package/test/logic/06.3.5-column-info.sqllogic +347 -0
  50. package/test/logic/06.3.6-schema-views.sqllogic +29 -0
  51. package/test/logic/06.4-schema-search-path.sqllogic +354 -0
  52. package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
  53. package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
  54. package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
  55. package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
  56. package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
  57. package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
  58. package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
  59. package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
  60. package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
  61. package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
  62. package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
  63. package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
  64. package/test/logic/06.7-json-extended.sqllogic +53 -0
  65. package/test/logic/06.8-json-path-operators.sqllogic +99 -0
  66. package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
  67. package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
  68. package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
  69. package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
  70. package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
  71. package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
  72. package/test/logic/07-aggregates.sqllogic +193 -0
  73. package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
  74. package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
  75. package/test/logic/07.3-group-by-extras.sqllogic +602 -0
  76. package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
  77. package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
  78. package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
  79. package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
  80. package/test/logic/07.5-window.sqllogic +1941 -0
  81. package/test/logic/07.5.1-window-named.sqllogic +13 -0
  82. package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
  83. package/test/logic/07.6-subqueries.sqllogic +78 -0
  84. package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
  85. package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
  86. package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
  87. package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
  88. package/test/logic/07.7.1-in-extras.sqllogic +158 -0
  89. package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
  90. package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
  91. package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
  92. package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
  93. package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
  94. package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
  95. package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
  96. package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
  97. package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
  98. package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
  99. package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
  100. package/test/logic/07.9-in-value-list.sqllogic +154 -0
  101. package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
  102. package/test/logic/08-views.sqllogic +64 -0
  103. package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
  104. package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
  105. package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
  106. package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
  107. package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
  108. package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
  109. package/test/logic/09-set_operations.sqllogic +244 -0
  110. package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
  111. package/test/logic/10-distinct_datatypes.sqllogic +127 -0
  112. package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
  113. package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
  114. package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
  115. package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
  116. package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
  117. package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
  118. package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
  119. package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
  120. package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
  121. package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
  122. package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
  123. package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
  124. package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
  125. package/test/logic/10.2-column-features.sqllogic +365 -0
  126. package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
  127. package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
  128. package/test/logic/10.3-function-features.sqllogic +247 -0
  129. package/test/logic/10.4-schema-scale.sqllogic +168 -0
  130. package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
  131. package/test/logic/10.5-indexes.sqllogic +164 -0
  132. package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
  133. package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
  134. package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
  135. package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
  136. package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
  137. package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
  138. package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
  139. package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
  140. package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
  141. package/test/logic/100.1-where-extras.sqllogic +163 -0
  142. package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
  143. package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
  144. package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
  145. package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
  146. package/test/logic/102-unique-constraints.sqllogic +145 -0
  147. package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
  148. package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
  149. package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
  150. package/test/logic/102.2-unique-collation.sqllogic +181 -0
  151. package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
  152. package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
  153. package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
  154. package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
  155. package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
  156. package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
  157. package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
  158. package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
  159. package/test/logic/108-cardinality-estimation.sqllogic +146 -0
  160. package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
  161. package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
  162. package/test/logic/11-joins.sqllogic +86 -0
  163. package/test/logic/11.1-join-using.sqllogic +267 -0
  164. package/test/logic/11.2-comma-join.sqllogic +35 -0
  165. package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
  166. package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
  167. package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
  168. package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
  169. package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
  170. package/test/logic/12-empty-primary-key.sqllogic +124 -0
  171. package/test/logic/12-join_padding_order.sqllogic +58 -0
  172. package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
  173. package/test/logic/13-cte.sqllogic +137 -0
  174. package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
  175. package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
  176. package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
  177. package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
  178. package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
  179. package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
  180. package/test/logic/13.4-cte-extras.sqllogic +98 -0
  181. package/test/logic/13.5-cte-join-order.sqllogic +166 -0
  182. package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
  183. package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
  184. package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
  185. package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
  186. package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
  187. package/test/logic/14-utilities.sqllogic +168 -0
  188. package/test/logic/15-timespan.sqllogic +279 -0
  189. package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
  190. package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
  191. package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
  192. package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
  193. package/test/logic/16-epoch.sqllogic +187 -0
  194. package/test/logic/17-weekday-modifier.sqllogic +78 -0
  195. package/test/logic/18-json-string-escapes.sqllogic +86 -0
  196. package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
  197. package/test/logic/20-empty-single-row.sqllogic +261 -0
  198. package/test/logic/21-null-edge-cases.sqllogic +227 -0
  199. package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
  200. package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
  201. package/test/logic/21.2-between-edges.sqllogic +157 -0
  202. package/test/logic/22-boundary-values.sqllogic +175 -0
  203. package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
  204. package/test/logic/24-builtin-branches.sqllogic +611 -0
  205. package/test/logic/24.1-substr-extras.sqllogic +75 -0
  206. package/test/logic/24.2-random-extras.sqllogic +39 -0
  207. package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
  208. package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
  209. package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
  210. package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
  211. package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
  212. package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
  213. package/test/logic/26-join-edge-cases.sqllogic +333 -0
  214. package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
  215. package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
  216. package/test/logic/26.3-join-on-constants.sqllogic +61 -0
  217. package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
  218. package/test/logic/27-window-edge-cases.sqllogic +206 -0
  219. package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
  220. package/test/logic/27.2-window-exclude.sqllogic +13 -0
  221. package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
  222. package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
  223. package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
  224. package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
  225. package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
  226. package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
  227. package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
  228. package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
  229. package/test/logic/40-constraints.sqllogic +418 -0
  230. package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
  231. package/test/logic/40.2-check-extras.sqllogic +683 -0
  232. package/test/logic/41-alter-table.sqllogic +191 -0
  233. package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
  234. package/test/logic/41-fk-cross-schema.sqllogic +155 -0
  235. package/test/logic/41-fk-extended-targets.sqllogic +173 -0
  236. package/test/logic/41-foreign-keys.sqllogic +1001 -0
  237. package/test/logic/41-generated-column-errors.sqllogic +225 -0
  238. package/test/logic/41-generated-column-extras.sqllogic +598 -0
  239. package/test/logic/41-generated-column-scope.sqllogic +329 -0
  240. package/test/logic/41-generated-columns.sqllogic +361 -0
  241. package/test/logic/41.1-alter-pk.sqllogic +230 -0
  242. package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
  243. package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
  244. package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
  245. package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
  246. package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
  247. package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
  248. package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
  249. package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
  250. package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
  251. package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
  252. package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
  253. package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
  254. package/test/logic/41.2-alter-column.sqllogic +382 -0
  255. package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
  256. package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
  257. package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
  258. package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
  259. package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
  260. package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
  261. package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
  262. package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
  263. package/test/logic/41.5-alter-misc.sqllogic +48 -0
  264. package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
  265. package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
  266. package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
  267. package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
  268. package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
  269. package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
  270. package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
  271. package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
  272. package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
  273. package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
  274. package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
  275. package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
  276. package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
  277. package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
  278. package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
  279. package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
  280. package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
  281. package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
  282. package/test/logic/42-committed-snapshot.sqllogic +254 -0
  283. package/test/logic/42-returning.sqllogic +159 -0
  284. package/test/logic/42.1-returning-extras.sqllogic +232 -0
  285. package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
  286. package/test/logic/43-default-nullability.sqllogic +131 -0
  287. package/test/logic/43-transition-constraints.sqllogic +341 -0
  288. package/test/logic/43.1-default-collation.sqllogic +140 -0
  289. package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
  290. package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
  291. package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
  292. package/test/logic/44-determinism-validation.sqllogic +164 -0
  293. package/test/logic/44-orthogonality.sqllogic +146 -0
  294. package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
  295. package/test/logic/45-udf-determinism.sqllogic +39 -0
  296. package/test/logic/46-mutation-context.sqllogic +595 -0
  297. package/test/logic/47-upsert.sqllogic +255 -0
  298. package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
  299. package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
  300. package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
  301. package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
  302. package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
  303. package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
  304. package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
  305. package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
  306. package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
  307. package/test/logic/49-reference-graph.sqllogic +84 -0
  308. package/test/logic/50-declarative-schema.sqllogic +2550 -0
  309. package/test/logic/50-metadata-tags.sqllogic +1033 -0
  310. package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
  311. package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
  312. package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
  313. package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +173 -0
  314. package/test/logic/50.3-declare-schema-duplicate-names.sqllogic +280 -0
  315. package/test/logic/50.4-declare-schema-apply-restore.sqllogic +192 -0
  316. package/test/logic/51-lens-foundation.sqllogic +147 -0
  317. package/test/logic/51-materialized-views.sqllogic +376 -0
  318. package/test/logic/51.5-materialized-views-coarsened-key.sqllogic +198 -0
  319. package/test/logic/51.7-maintained-table-attach-detach.sqllogic +468 -0
  320. package/test/logic/51.8-maintained-table-declared-constraints.sqllogic +440 -0
  321. package/test/logic/51.85-maintained-table-parent-fk.sqllogic +103 -0
  322. package/test/logic/51.9-maintained-table-secondary-unique.sqllogic +237 -0
  323. package/test/logic/51.9.1-maintained-table-partial-unique.sqllogic +36 -0
  324. package/test/logic/52-lens-overrides.sqllogic +566 -0
  325. package/test/logic/53-materialized-views-rowtime.sqllogic +1601 -0
  326. package/test/logic/53-reserved-tags.sqllogic +252 -0
  327. package/test/logic/53.1-materialized-view-write-through.sqllogic +329 -0
  328. package/test/logic/53.2-materialized-view-rename-propagation.sqllogic +483 -0
  329. package/test/logic/53.3-materialized-view-constraint-only-ddl.sqllogic +409 -0
  330. package/test/logic/53.3.1-materialized-view-index-ddl-irrelevance.sqllogic +29 -0
  331. package/test/logic/53.4-materialized-view-structural-alter-restore.sqllogic +436 -0
  332. package/test/logic/54-covering-mv-enforcement.sqllogic +314 -0
  333. package/test/logic/54.1-covering-mv-partial-enforcement.sqllogic +34 -0
  334. package/test/logic/55-internal-eviction-reporting.sqllogic +89 -0
  335. package/test/logic/55-lens-prover.sqllogic +202 -0
  336. package/test/logic/55.1-eviction-restrict-fk.sqllogic +148 -0
  337. package/test/logic/55.5-lens-authored-inverse.sqllogic +1468 -0
  338. package/test/logic/80-grow-retrieve-pass.sqllogic +79 -0
  339. package/test/logic/81-quickpick.sqllogic +24 -0
  340. package/test/logic/82-bloom-join.sqllogic +185 -0
  341. package/test/logic/83-merge-join.sqllogic +280 -0
  342. package/test/logic/84-asof-scan.sqllogic +238 -0
  343. package/test/logic/84-key-cardinality.sqllogic +50 -0
  344. package/test/logic/85-relational-const-folding.sqllogic +51 -0
  345. package/test/logic/86-scalar-cse.sqllogic +42 -0
  346. package/test/logic/90-error_paths.sqllogic +114 -0
  347. package/test/logic/90.1-parse-errors.sqllogic +77 -0
  348. package/test/logic/90.2-alter-table-errors.sqllogic +53 -0
  349. package/test/logic/90.2.1-alter-extra-errors.sqllogic +51 -0
  350. package/test/logic/90.3-expression-errors.sqllogic +43 -0
  351. package/test/logic/90.4-dml-errors.sqllogic +47 -0
  352. package/test/logic/90.5-unsupported-join-types.sqllogic +37 -0
  353. package/test/logic/90.5.1-right-full-join-read.sqllogic +157 -0
  354. package/test/logic/90.6-select-error-paths.sqllogic +57 -0
  355. package/test/logic/91-merge-join-edge-cases.sqllogic +159 -0
  356. package/test/logic/92-hash-aggregate-edge-cases.sqllogic +139 -0
  357. package/test/logic/93-ddl-view-edge-cases.sqllogic +104 -0
  358. package/test/logic/93.1-view-error-paths.sqllogic +74 -0
  359. package/test/logic/93.2-view-mutation-pending.sqllogic +108 -0
  360. package/test/logic/93.3-view-mutation-or-clause.sqllogic +60 -0
  361. package/test/logic/93.4-view-mutation.sqllogic +4881 -0
  362. package/test/logic/93.4.1-view-mutation-partial-unique-cardinality.sqllogic +31 -0
  363. package/test/logic/93.5-authored-inverse.sqllogic +415 -0
  364. package/test/logic/93.6-set-op-flagless-write.sqllogic +862 -0
  365. package/test/logic/94-tvf-edge-cases.sqllogic +58 -0
  366. package/test/logic/94.1-limit-offset-edge-cases.sqllogic +109 -0
  367. package/test/logic/94.2-limit-offset-extras.sqllogic +98 -0
  368. package/test/logic/95-assertions.sqllogic +1417 -0
  369. package/test/logic/96-subquery-edge-cases.sqllogic +276 -0
  370. package/test/logic/97-json-function-edge-cases.sqllogic +633 -0
  371. package/test/logic/97.1-json-blob-and-special-values.sqllogic +92 -0
  372. package/test/logic/98-temporal-edge-cases.sqllogic +515 -0
  373. package/test/logic/99-conversion-edge-cases.sqllogic +325 -0
  374. package/test/logic/99.0.1-schema-index-listing.sqllogic +21 -0
  375. package/test/logic/99.1-cast-syntax-extras.sqllogic +167 -0
  376. package/test/logic/drop-unique-index.sqllogic +88 -0
  377. package/test/logic/pushdown-test.sqllogic +36 -0
@@ -0,0 +1,173 @@
1
+ -- 50.2.1-declare-schema-index-renames.sqllogic
2
+ --
3
+ -- requires-capability: standalone-index-ddl
4
+ --
5
+ -- Carved out of 50.2-declare-schema-renames: the declarative-schema rename/diff engine
6
+ -- treats tables, views and indexes as three parallel object kinds, and 50.2 exercises the
7
+ -- whole engine (hint resolution, drop+create ordering, in-diff column and table renames,
8
+ -- rename policies, ambiguity guards) on the table and view kinds with no index DDL.
9
+ -- These four sections are the INDEX-kind instances, so they live here.
10
+ --
11
+ -- Section numbers keep their original 50.2 labels so cross-references still resolve.
12
+ --
13
+ -- Subject: a hinted index rename becomes DROP INDEX + recreate, orders correctly against
14
+ -- an in-diff column or table rename of its source, and does not trip the require-hint
15
+ -- guard.
16
+
17
+ -- ===================================
18
+ -- 17. Hinted INDEX rename, body unchanged → drop + recreate
19
+ -- ===================================
20
+
21
+ create table ir_t (id integer primary key, category text);
22
+ create index ix_old on ir_t (category);
23
+
24
+ declare schema main {
25
+ table ir_t {
26
+ id integer primary key,
27
+ category text
28
+ }
29
+
30
+ index ix_new on ir_t (category) with tags ("quereus.previous_name" = 'ix_old')
31
+ }
32
+
33
+ -- run
34
+
35
+ diff schema main;
36
+ → [{"ddl": "DROP INDEX IF EXISTS ix_old"}, {"ddl": "create index ix_new on ir_t (category) with tags (\"quereus.previous_name\" = 'ix_old')"}]
37
+
38
+ apply schema main;
39
+
40
+ -- run
41
+
42
+ select name, tbl_name from schema() where type = 'index';
43
+ → [{"name": "ix_new", "tbl_name": "ir_t"}]
44
+
45
+ diff schema main;
46
+ → []
47
+
48
+ drop index ix_new;
49
+ drop table ir_t;
50
+
51
+ -- ===================================
52
+ -- 20. Hinted INDEX rename + in-diff COLUMN rename of its table
53
+ -- ===================================
54
+
55
+ create table irc_t (id integer primary key, amount integer not null);
56
+ create index irc_old on irc_t (amount);
57
+
58
+ declare schema main {
59
+ table irc_t {
60
+ id integer primary key,
61
+ qty integer not null with tags ("quereus.previous_name" = 'amount')
62
+ }
63
+
64
+ index irc_new on irc_t (qty) with tags ("quereus.previous_name" = 'irc_old')
65
+ }
66
+
67
+ -- run
68
+
69
+ -- The recreate names the OLD column (RENAME COLUMN runs after creates); the
70
+ -- propagation rewrites the fresh index's columns.
71
+ diff schema main;
72
+ → [{"ddl": "DROP INDEX IF EXISTS irc_old"}, {"ddl": "create index irc_new on irc_t (amount) with tags (\"quereus.previous_name\" = 'irc_old')"}, {"ddl": "ALTER TABLE irc_t RENAME COLUMN amount TO qty"}]
73
+
74
+ apply schema main;
75
+
76
+ -- run
77
+
78
+ select name from schema() where type = 'index';
79
+ → [{"name": "irc_new"}]
80
+
81
+ diff schema main;
82
+ → []
83
+
84
+ drop index irc_new;
85
+ drop table irc_t;
86
+
87
+ -- ===================================
88
+ -- 21. require-hint: hinted view + index renames apply cleanly
89
+ -- ===================================
90
+
91
+ -- A hinted rename's drop+create pair is deliberate, not an ambiguous unhinted
92
+ -- rename — it must not trip the require-hint guard (excluded from the counts,
93
+ -- like the body-change recreates of §14).
94
+
95
+ create table rh2_t (id integer primary key, v integer);
96
+ create view rh2_vold as select id, v from rh2_t;
97
+ create index rh2_ixold on rh2_t (v);
98
+
99
+ declare schema main {
100
+ table rh2_t {
101
+ id integer primary key,
102
+ v integer
103
+ }
104
+
105
+ view rh2_vnew as select id, v from rh2_t with tags ("quereus.previous_name" = 'rh2_vold')
106
+
107
+ index rh2_ixnew on rh2_t (v) with tags ("quereus.previous_name" = 'rh2_ixold')
108
+ }
109
+
110
+ -- run
111
+
112
+ apply schema main options (rename_policy = 'require-hint');
113
+
114
+ -- run
115
+
116
+ diff schema main;
117
+ → []
118
+
119
+ select name from schema() where type = 'view';
120
+ → [{"name": "rh2_vnew"}]
121
+
122
+ select name from schema() where type = 'index';
123
+ → [{"name": "rh2_ixnew"}]
124
+
125
+ drop view rh2_vnew;
126
+ drop index rh2_ixnew;
127
+ drop table rh2_t;
128
+
129
+ -- ===================================
130
+ -- 22. Hinted VIEW + INDEX rename + in-diff TABLE rename of their source
131
+ -- ===================================
132
+
133
+ -- The recreates keep the DECLARED table name (no inverse table pass): table
134
+ -- renames emit FIRST in migration order, so the new name is live by the time
135
+ -- the view/index creates plan their bodies.
136
+
137
+ create table src_old (id integer primary key, v integer);
138
+ create view trv_old as select id, v from src_old;
139
+ create index tri_old on src_old (v);
140
+ insert into src_old values (1, 10);
141
+
142
+ declare schema main {
143
+ table src_new {
144
+ id integer primary key,
145
+ v integer
146
+ } with tags ("quereus.previous_name" = 'src_old')
147
+
148
+ view trv_new as select id, v from src_new with tags ("quereus.previous_name" = 'trv_old')
149
+
150
+ index tri_new on src_new (v) with tags ("quereus.previous_name" = 'tri_old')
151
+ }
152
+
153
+ -- run
154
+
155
+ diff schema main;
156
+ → [{"ddl": "ALTER TABLE src_old RENAME TO src_new"}, {"ddl": "DROP VIEW IF EXISTS trv_old"}, {"ddl": "DROP INDEX IF EXISTS tri_old"}, {"ddl": "create view trv_new as select id, v from src_new with tags (\"quereus.previous_name\" = 'trv_old')"}, {"ddl": "create index tri_new on src_new (v) with tags (\"quereus.previous_name\" = 'tri_old')"}]
157
+
158
+ apply schema main;
159
+
160
+ -- run
161
+
162
+ select * from trv_new order by id;
163
+ → [{"id": 1, "v": 10}]
164
+
165
+ select name, tbl_name from schema() where type = 'index';
166
+ → [{"name": "tri_new", "tbl_name": "src_new"}]
167
+
168
+ diff schema main;
169
+ → []
170
+
171
+ drop view trv_new;
172
+ drop index tri_new;
173
+ drop table src_new;
@@ -0,0 +1,280 @@
1
+ -- 50.3-declare-schema-duplicate-names.sqllogic
2
+ --
3
+ -- A declared schema names each object once (docs/invariants.md SCH-003).
4
+ -- Every `declared*` map in the differ's collection loop is keyed schema-wide by
5
+ -- lowercased name, so a repeated declaration used to silently last-writer-wins:
6
+ -- the first declaration never reached the migration and no diagnostic fired.
7
+
8
+ -- ===================================
9
+ -- 1. Same-kind duplicates
10
+ -- ===================================
11
+
12
+ declare schema dup_table using (default_vtab_module = 'memory') {
13
+ table t1 {
14
+ id integer primary key,
15
+ a text
16
+ }
17
+
18
+ table t1 {
19
+ id integer primary key,
20
+ b text
21
+ }
22
+ }
23
+
24
+ -- run
25
+
26
+ diff schema dup_table;
27
+ -- error: Table 't1' is declared more than once in schema 'dup_table'
28
+
29
+ -- `apply schema` surfaces the same rejection, before any DDL runs.
30
+ apply schema dup_table;
31
+ -- error: Table 't1' is declared more than once in schema 'dup_table'
32
+
33
+ -- Names compare case-insensitively.
34
+ declare schema dup_table_case using (default_vtab_module = 'memory') {
35
+ table T1 {
36
+ id integer primary key,
37
+ a text
38
+ }
39
+
40
+ table t1 {
41
+ id integer primary key,
42
+ b text
43
+ }
44
+ }
45
+
46
+ -- run
47
+
48
+ diff schema dup_table_case;
49
+ -- error: Table 't1' is declared more than once in schema 'dup_table_case'
50
+
51
+ declare schema dup_view using (default_vtab_module = 'memory') {
52
+ table t1 {
53
+ id integer primary key,
54
+ a text
55
+ }
56
+
57
+ view v as select id as x from t1
58
+
59
+ view v as select a as y from t1
60
+ }
61
+
62
+ -- run
63
+
64
+ diff schema dup_view;
65
+ -- error: View 'v' is declared more than once in schema 'dup_view'
66
+
67
+ -- Both materialized-view bodies are FROM-less on purpose: a `materialized view`
68
+ -- item written directly after an item whose body ends at a FROM source is
69
+ -- misparsed (`materialized` is taken as a table alias) — see ticket
70
+ -- bug-declare-schema-materialized-swallowed-as-table-alias.
71
+ declare schema dup_mv using (default_vtab_module = 'memory') {
72
+ materialized view mv as select 1 as one
73
+
74
+ materialized view mv as select 2 as two
75
+ }
76
+
77
+ -- run
78
+
79
+ diff schema dup_mv;
80
+ -- error: Materialized view 'mv' is declared more than once in schema 'dup_mv'
81
+
82
+ -- Assertions live in main.
83
+ declare schema main {
84
+ table dup_assert_t {
85
+ id integer primary key,
86
+ n integer
87
+ }
88
+
89
+ assertion ck check (not exists (select 1 from dup_assert_t where n < 0))
90
+
91
+ assertion ck check (not exists (select 1 from dup_assert_t where n < 1))
92
+ }
93
+
94
+ -- run
95
+
96
+ diff schema main;
97
+ -- error: Assertion 'ck' is declared more than once in schema 'main'
98
+
99
+ -- ===================================
100
+ -- 2. Cross-kind duplicates (table / view / materialized view share one namespace)
101
+ -- ===================================
102
+
103
+ -- `Schema.addView` rejects a view whose name a table already holds, so this
104
+ -- declaration could never apply — it used to emit both CREATEs, run the table
105
+ -- create, then fail deep in the migration loop leaving the table behind.
106
+ declare schema dup_cross using (default_vtab_module = 'memory') {
107
+ table dual {
108
+ id integer primary key
109
+ }
110
+
111
+ view dual as select 1 as one
112
+ }
113
+
114
+ -- run
115
+
116
+ diff schema dup_cross;
117
+ -- error: 'dual' is declared as both a table and a view in schema 'dup_cross'
118
+
119
+ -- Kinds are named in declaration order.
120
+ declare schema dup_cross_rev using (default_vtab_module = 'memory') {
121
+ view dual as select 1 as one
122
+
123
+ table dual {
124
+ id integer primary key
125
+ }
126
+ }
127
+
128
+ -- run
129
+
130
+ diff schema dup_cross_rev;
131
+ -- error: 'dual' is declared as both a view and a table in schema 'dup_cross_rev'
132
+
133
+ declare schema dup_cross_mv using (default_vtab_module = 'memory') {
134
+ table mv {
135
+ id integer primary key
136
+ }
137
+
138
+ materialized view mv as select 1 as one
139
+ }
140
+
141
+ -- run
142
+
143
+ diff schema dup_cross_mv;
144
+ -- error: 'mv' is declared as both a table and a materialized view in schema 'dup_cross_mv'
145
+
146
+ -- ===================================
147
+ -- 3. Duplicate seed blocks (rejected at declare time, not diff time)
148
+ -- ===================================
149
+
150
+ -- Seed rows are stored one block per table, so a second block for the same table
151
+ -- used to discard the first block's rows. The differ never sees seed items, so
152
+ -- the guard runs when the declaration is stored — nothing is stored at all.
153
+ declare schema dup_seed using (default_vtab_module = 'memory') {
154
+ table t {
155
+ id integer primary key,
156
+ n integer
157
+ }
158
+
159
+ seed t (
160
+ (1, 10)
161
+ )
162
+
163
+ seed t (
164
+ (2, 20)
165
+ )
166
+ }
167
+ -- error: Seed data for table 't' is declared more than once in schema 'dup_seed'
168
+
169
+ -- The rejected declaration was not stored.
170
+ diff schema dup_seed;
171
+ -- error: No declared schema found for 'dup_seed'
172
+
173
+ -- Target table names compare case-insensitively here too.
174
+ declare schema dup_seed_case using (default_vtab_module = 'memory') {
175
+ table t {
176
+ id integer primary key,
177
+ n integer
178
+ }
179
+
180
+ seed T (
181
+ (1, 10)
182
+ )
183
+
184
+ seed t (
185
+ (2, 20)
186
+ )
187
+ }
188
+ -- error: Seed data for table 't' is declared more than once in schema 'dup_seed_case'
189
+
190
+ -- A rejected declaration leaves an EARLIER good one for the same schema intact:
191
+ -- the guard runs before `clearSeedData` and `setDeclaredSchema`, so neither the
192
+ -- stored declaration nor the stored seed rows are touched.
193
+ declare schema seed_keep using (default_vtab_module = 'memory') {
194
+ table t {
195
+ id integer primary key,
196
+ n integer
197
+ }
198
+
199
+ seed t (
200
+ (1, 10)
201
+ )
202
+ }
203
+
204
+ -- run
205
+
206
+ apply schema seed_keep with seed;
207
+
208
+ -- run
209
+
210
+ declare schema seed_keep using (default_vtab_module = 'memory') {
211
+ table t {
212
+ id integer primary key,
213
+ n integer
214
+ }
215
+
216
+ seed t (
217
+ (2, 20)
218
+ )
219
+
220
+ seed t (
221
+ (3, 30)
222
+ )
223
+ }
224
+ -- error: Seed data for table 't' is declared more than once in schema 'seed_keep'
225
+
226
+ -- The prior declaration survives (the diff still converges) ...
227
+ diff schema seed_keep;
228
+ → []
229
+
230
+ -- ... and so do its stored seed rows: wipe the table and re-seed from the store.
231
+ delete from seed_keep.t;
232
+
233
+ -- run
234
+
235
+ apply schema seed_keep with seed;
236
+
237
+ -- run
238
+
239
+ select n from seed_keep.t;
240
+ → [{"n":10}]
241
+
242
+ -- ===================================
243
+ -- 4. Positive control — distinct names apply cleanly
244
+ -- ===================================
245
+
246
+ declare schema dup_ok using (default_vtab_module = 'memory') {
247
+ table t1 {
248
+ id integer primary key,
249
+ a text
250
+ }
251
+
252
+ table t2 {
253
+ id integer primary key,
254
+ b text
255
+ }
256
+
257
+ seed t1 (
258
+ (1, 'alpha')
259
+ )
260
+
261
+ seed t2 (
262
+ (2, 'beta')
263
+ )
264
+ }
265
+
266
+ -- run
267
+
268
+ apply schema dup_ok with seed;
269
+
270
+ -- run
271
+
272
+ select a from dup_ok.t1 where id = 1;
273
+ → [{"a":"alpha"}]
274
+
275
+ select b from dup_ok.t2 where id = 2;
276
+ → [{"b":"beta"}]
277
+
278
+ -- Re-applying stays clean: the declaration is unambiguous, so the diff converges.
279
+ diff schema dup_ok;
280
+ → []
@@ -0,0 +1,192 @@
1
+ -- Declarative schema: a migration that fails partway is unwound, so the catalog is back where
2
+ -- the apply found it. Tightening a named constraint whose new body the existing rows violate
3
+ -- is the motivating case: the plan is DROP CONSTRAINT + ADD CONSTRAINT, the re-add fails its
4
+ -- existing-row validation, and the undo journal re-adds the OLD constraint — which must not
5
+ -- only be back in the catalog but still be enforced. Runs on both backends
6
+ -- (see docs/schema.md § Failure and restoration; the executor is runBatchedMigrationLoop).
7
+
8
+ -- ===================================
9
+ -- 1. CHECK tightened against a violating row
10
+ -- ===================================
11
+
12
+ create table t_ck (id integer primary key, v integer, constraint ck_v check (v > 0));
13
+ insert into t_ck values (1, 5);
14
+
15
+ declare schema main {
16
+ table t_ck {
17
+ id integer primary key,
18
+ v integer,
19
+ constraint ck_v check (v > 10)
20
+ }
21
+ }
22
+
23
+ -- run
24
+
25
+ diff schema main;
26
+ → [{"ddl": "ALTER TABLE t_ck DROP CONSTRAINT ck_v"}, {"ddl": "ALTER TABLE t_ck ADD constraint ck_v check (v > 10)"}]
27
+
28
+ -- The re-add fails over the row v = 5; the DROP that preceded it is undone.
29
+ apply schema main;
30
+ -- error: ck_v
31
+
32
+ -- The row is untouched, the old rule is back, and it is still enforced.
33
+ select v from t_ck;
34
+ → [{"v": 5}]
35
+
36
+ insert into t_ck values (2, -1);
37
+ -- error: CHECK constraint failed
38
+
39
+ insert into t_ck values (2, 7);
40
+
41
+ -- run
42
+
43
+ -- Re-diffing produces the original plan again: nothing about the failure was cached.
44
+ diff schema main;
45
+ → [{"ddl": "ALTER TABLE t_ck DROP CONSTRAINT ck_v"}, {"ddl": "ALTER TABLE t_ck ADD constraint ck_v check (v > 10)"}]
46
+
47
+ drop table t_ck;
48
+
49
+ -- ===================================
50
+ -- 2. UNIQUE tightened against duplicate rows
51
+ -- ===================================
52
+
53
+ create table t_uq (id integer primary key, a integer, b integer, constraint uq_ab unique (a, b));
54
+ insert into t_uq values (1, 1, 1), (2, 1, 2);
55
+
56
+ declare schema main {
57
+ table t_uq {
58
+ id integer primary key,
59
+ a integer,
60
+ b integer,
61
+ constraint uq_ab unique (a)
62
+ }
63
+ }
64
+
65
+ -- run
66
+
67
+ apply schema main;
68
+ -- error: uq_ab
69
+
70
+ -- The old two-column rule is back: a duplicate (a, b) is refused, a duplicate a alone is not.
71
+ insert into t_uq values (3, 1, 1);
72
+ -- error: UNIQUE constraint failed
73
+
74
+ insert into t_uq values (3, 1, 3);
75
+
76
+ -- run
77
+
78
+ select count(*) as n from t_uq;
79
+ → [{"n": 3}]
80
+
81
+ drop table t_uq;
82
+
83
+ -- ===================================
84
+ -- 3. FOREIGN KEY re-targeted at a column the child rows do not match
85
+ -- ===================================
86
+
87
+ create table p (id integer primary key, alt integer, constraint uq_alt unique (alt));
88
+ insert into p values (1, 100);
89
+ create table c (id integer primary key, pid integer, constraint fk_p foreign key (pid) references p(id));
90
+ insert into c values (1, 1);
91
+
92
+ declare schema main {
93
+ table p {
94
+ id integer primary key,
95
+ alt integer,
96
+ constraint uq_alt unique (alt)
97
+ }
98
+ table c {
99
+ id integer primary key,
100
+ pid integer,
101
+ constraint fk_p foreign key (pid) references p(alt)
102
+ }
103
+ }
104
+
105
+ -- run
106
+
107
+ -- pid = 1 is a p.id, not a p.alt, so the re-add fails and the old reference is restored.
108
+ apply schema main;
109
+ -- error: fk_p
110
+
111
+ insert into c values (2, 999);
112
+ -- error: constraint failed: fk_p
113
+
114
+ insert into c values (2, 1);
115
+
116
+ -- run
117
+
118
+ select count(*) as n from c;
119
+ → [{"n": 2}]
120
+
121
+ drop table c;
122
+ drop table p;
123
+
124
+ -- ===================================
125
+ -- 4. A multi-step plan: the steps that landed before the failure are taken back
126
+ -- ===================================
127
+
128
+ create table t (id integer primary key, v text null);
129
+ insert into t values (1, 'a');
130
+
131
+ declare schema main {
132
+ table t {
133
+ id integer primary key,
134
+ v text null,
135
+ w integer not null
136
+ }
137
+ table n1 {
138
+ id integer primary key
139
+ }
140
+ }
141
+
142
+ -- run
143
+
144
+ -- create table n1 lands, then ALTER TABLE t ADD COLUMN w fails over the existing row.
145
+ diff schema main;
146
+ → [{"ddl": "create table n1 (id integer primary key)"}, {"ddl": "ALTER TABLE t ADD COLUMN w integer not null"}]
147
+
148
+ apply schema main;
149
+ -- error: NOT NULL constraint failed
150
+
151
+ -- n1 is gone again and t has no w.
152
+ select * from n1;
153
+ -- error: not found
154
+
155
+ select * from t;
156
+ → [{"id": 1, "v": "a"}]
157
+
158
+ diff schema main;
159
+ → [{"ddl": "create table n1 (id integer primary key)"}, {"ddl": "ALTER TABLE t ADD COLUMN w integer not null"}]
160
+
161
+ -- ===================================
162
+ -- 5. The same failure inside an explicit transaction: savepoint-like
163
+ -- ===================================
164
+
165
+ begin;
166
+ insert into t values (2, 'b');
167
+ apply schema main;
168
+ -- error: NOT NULL constraint failed
169
+
170
+ -- The transaction is still open and usable after the restored failure.
171
+ insert into t values (3, 'c');
172
+ commit;
173
+
174
+ -- run
175
+
176
+ select id from t order by id;
177
+ → [{"id": 1}, {"id": 2}, {"id": 3}]
178
+
179
+ select * from n1;
180
+ -- error: not found
181
+
182
+ -- Once the violating rows are gone the same declaration applies cleanly.
183
+ delete from t;
184
+ apply schema main;
185
+
186
+ -- run
187
+
188
+ diff schema main;
189
+ → []
190
+
191
+ drop table n1;
192
+ drop table t;