@quereus/quereus 4.20.0 → 4.20.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. package/README.md +2 -0
  2. package/dist/src/common/types.d.ts +4 -4
  3. package/dist/src/index.d.ts +1 -1
  4. package/dist/src/index.d.ts.map +1 -1
  5. package/dist/src/index.js +3 -2
  6. package/dist/src/index.js.map +1 -1
  7. package/dist/src/schema/catalog-rendering.js +13 -1
  8. package/dist/src/schema/catalog-rendering.js.map +1 -1
  9. package/dist/src/schema/catalog.d.ts +35 -2
  10. package/dist/src/schema/catalog.d.ts.map +1 -1
  11. package/dist/src/schema/catalog.js +42 -33
  12. package/dist/src/schema/catalog.js.map +1 -1
  13. package/dist/src/schema/schema-differ.d.ts +1 -1
  14. package/dist/src/schema/schema-differ.d.ts.map +1 -1
  15. package/dist/src/schema/schema-differ.js +195 -33
  16. package/dist/src/schema/schema-differ.js.map +1 -1
  17. package/dist/src/schema/unique-enforcement.d.ts +23 -1
  18. package/dist/src/schema/unique-enforcement.d.ts.map +1 -1
  19. package/dist/src/schema/unique-enforcement.js +43 -1
  20. package/dist/src/schema/unique-enforcement.js.map +1 -1
  21. package/dist/src/vtab/memory/layer/manager.d.ts +15 -12
  22. package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
  23. package/dist/src/vtab/memory/layer/manager.js +87 -100
  24. package/dist/src/vtab/memory/layer/manager.js.map +1 -1
  25. package/package.json +7 -4
  26. package/test/README.md +173 -0
  27. package/test/logic/01-basic.sqllogic +39 -0
  28. package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
  29. package/test/logic/01.2-strings.sqllogic +43 -0
  30. package/test/logic/01.5-insert-select.sqllogic +237 -0
  31. package/test/logic/01.6-update-extras.sqllogic +118 -0
  32. package/test/logic/01.7-update-from.sqllogic +67 -0
  33. package/test/logic/01.8-delete-extras.sqllogic +122 -0
  34. package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
  35. package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
  36. package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
  37. package/test/logic/01.9-query-expr-values.sqllogic +111 -0
  38. package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
  39. package/test/logic/02-filters.sqllogic +54 -0
  40. package/test/logic/02-smoke.sqllogic +62 -0
  41. package/test/logic/02.1-bind-parameters.sqllogic +223 -0
  42. package/test/logic/03-expressions.sqllogic +190 -0
  43. package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
  44. package/test/logic/03.4-defaults.sqllogic +554 -0
  45. package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
  46. package/test/logic/03.5-tvf.sqllogic +61 -0
  47. package/test/logic/03.6-type-system.sqllogic +544 -0
  48. package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
  49. package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
  50. package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
  51. package/test/logic/03.8-not-precedence.sqllogic +255 -0
  52. package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
  53. package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
  54. package/test/logic/04-order-by.sqllogic +38 -0
  55. package/test/logic/04-transactions.sqllogic +239 -0
  56. package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
  57. package/test/logic/05-vtab_memory.sqllogic +50 -0
  58. package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
  59. package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
  60. package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
  61. package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
  62. package/test/logic/06-builtin_functions.sqllogic +149 -0
  63. package/test/logic/06.1-string-functions.sqllogic +92 -0
  64. package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
  65. package/test/logic/06.2-math-functions.sqllogic +82 -0
  66. package/test/logic/06.3-schema.sqllogic +48 -0
  67. package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
  68. package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
  69. package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
  70. package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
  71. package/test/logic/06.3.4-view-info.sqllogic +378 -0
  72. package/test/logic/06.3.5-column-info.sqllogic +347 -0
  73. package/test/logic/06.3.6-schema-views.sqllogic +29 -0
  74. package/test/logic/06.4-schema-search-path.sqllogic +354 -0
  75. package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
  76. package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
  77. package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
  78. package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
  79. package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
  80. package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
  81. package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
  82. package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
  83. package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
  84. package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
  85. package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
  86. package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
  87. package/test/logic/06.7-json-extended.sqllogic +53 -0
  88. package/test/logic/06.8-json-path-operators.sqllogic +99 -0
  89. package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
  90. package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
  91. package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
  92. package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
  93. package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
  94. package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
  95. package/test/logic/07-aggregates.sqllogic +193 -0
  96. package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
  97. package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
  98. package/test/logic/07.3-group-by-extras.sqllogic +602 -0
  99. package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
  100. package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
  101. package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
  102. package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
  103. package/test/logic/07.5-window.sqllogic +1941 -0
  104. package/test/logic/07.5.1-window-named.sqllogic +13 -0
  105. package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
  106. package/test/logic/07.6-subqueries.sqllogic +78 -0
  107. package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
  108. package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
  109. package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
  110. package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
  111. package/test/logic/07.7.1-in-extras.sqllogic +158 -0
  112. package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
  113. package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
  114. package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
  115. package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
  116. package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
  117. package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
  118. package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
  119. package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
  120. package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
  121. package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
  122. package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
  123. package/test/logic/07.9-in-value-list.sqllogic +154 -0
  124. package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
  125. package/test/logic/08-views.sqllogic +64 -0
  126. package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
  127. package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
  128. package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
  129. package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
  130. package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
  131. package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
  132. package/test/logic/09-set_operations.sqllogic +244 -0
  133. package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
  134. package/test/logic/10-distinct_datatypes.sqllogic +127 -0
  135. package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
  136. package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
  137. package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
  138. package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
  139. package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
  140. package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
  141. package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
  142. package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
  143. package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
  144. package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
  145. package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
  146. package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
  147. package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
  148. package/test/logic/10.2-column-features.sqllogic +365 -0
  149. package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
  150. package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
  151. package/test/logic/10.3-function-features.sqllogic +247 -0
  152. package/test/logic/10.4-schema-scale.sqllogic +168 -0
  153. package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
  154. package/test/logic/10.5-indexes.sqllogic +164 -0
  155. package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
  156. package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
  157. package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
  158. package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
  159. package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
  160. package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
  161. package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
  162. package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
  163. package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
  164. package/test/logic/100.1-where-extras.sqllogic +163 -0
  165. package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
  166. package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
  167. package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
  168. package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
  169. package/test/logic/102-unique-constraints.sqllogic +145 -0
  170. package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
  171. package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
  172. package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
  173. package/test/logic/102.2-unique-collation.sqllogic +181 -0
  174. package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
  175. package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
  176. package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
  177. package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
  178. package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
  179. package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
  180. package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
  181. package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
  182. package/test/logic/108-cardinality-estimation.sqllogic +146 -0
  183. package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
  184. package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
  185. package/test/logic/11-joins.sqllogic +86 -0
  186. package/test/logic/11.1-join-using.sqllogic +267 -0
  187. package/test/logic/11.2-comma-join.sqllogic +35 -0
  188. package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
  189. package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
  190. package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
  191. package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
  192. package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
  193. package/test/logic/12-empty-primary-key.sqllogic +124 -0
  194. package/test/logic/12-join_padding_order.sqllogic +58 -0
  195. package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
  196. package/test/logic/13-cte.sqllogic +137 -0
  197. package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
  198. package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
  199. package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
  200. package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
  201. package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
  202. package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
  203. package/test/logic/13.4-cte-extras.sqllogic +98 -0
  204. package/test/logic/13.5-cte-join-order.sqllogic +166 -0
  205. package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
  206. package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
  207. package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
  208. package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
  209. package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
  210. package/test/logic/14-utilities.sqllogic +168 -0
  211. package/test/logic/15-timespan.sqllogic +279 -0
  212. package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
  213. package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
  214. package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
  215. package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
  216. package/test/logic/16-epoch.sqllogic +187 -0
  217. package/test/logic/17-weekday-modifier.sqllogic +78 -0
  218. package/test/logic/18-json-string-escapes.sqllogic +86 -0
  219. package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
  220. package/test/logic/20-empty-single-row.sqllogic +261 -0
  221. package/test/logic/21-null-edge-cases.sqllogic +227 -0
  222. package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
  223. package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
  224. package/test/logic/21.2-between-edges.sqllogic +157 -0
  225. package/test/logic/22-boundary-values.sqllogic +175 -0
  226. package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
  227. package/test/logic/24-builtin-branches.sqllogic +611 -0
  228. package/test/logic/24.1-substr-extras.sqllogic +75 -0
  229. package/test/logic/24.2-random-extras.sqllogic +39 -0
  230. package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
  231. package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
  232. package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
  233. package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
  234. package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
  235. package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
  236. package/test/logic/26-join-edge-cases.sqllogic +333 -0
  237. package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
  238. package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
  239. package/test/logic/26.3-join-on-constants.sqllogic +61 -0
  240. package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
  241. package/test/logic/27-window-edge-cases.sqllogic +206 -0
  242. package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
  243. package/test/logic/27.2-window-exclude.sqllogic +13 -0
  244. package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
  245. package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
  246. package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
  247. package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
  248. package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
  249. package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
  250. package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
  251. package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
  252. package/test/logic/40-constraints.sqllogic +418 -0
  253. package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
  254. package/test/logic/40.2-check-extras.sqllogic +683 -0
  255. package/test/logic/41-alter-table.sqllogic +191 -0
  256. package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
  257. package/test/logic/41-fk-cross-schema.sqllogic +155 -0
  258. package/test/logic/41-fk-extended-targets.sqllogic +173 -0
  259. package/test/logic/41-foreign-keys.sqllogic +1001 -0
  260. package/test/logic/41-generated-column-errors.sqllogic +225 -0
  261. package/test/logic/41-generated-column-extras.sqllogic +598 -0
  262. package/test/logic/41-generated-column-scope.sqllogic +329 -0
  263. package/test/logic/41-generated-columns.sqllogic +361 -0
  264. package/test/logic/41.1-alter-pk.sqllogic +230 -0
  265. package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
  266. package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
  267. package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
  268. package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
  269. package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
  270. package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
  271. package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
  272. package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
  273. package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
  274. package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
  275. package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
  276. package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
  277. package/test/logic/41.2-alter-column.sqllogic +382 -0
  278. package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
  279. package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
  280. package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
  281. package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
  282. package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
  283. package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
  284. package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
  285. package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
  286. package/test/logic/41.5-alter-misc.sqllogic +48 -0
  287. package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
  288. package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
  289. package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
  290. package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
  291. package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
  292. package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
  293. package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
  294. package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
  295. package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
  296. package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
  297. package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
  298. package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
  299. package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
  300. package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
  301. package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
  302. package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
  303. package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
  304. package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
  305. package/test/logic/42-committed-snapshot.sqllogic +254 -0
  306. package/test/logic/42-returning.sqllogic +159 -0
  307. package/test/logic/42.1-returning-extras.sqllogic +232 -0
  308. package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
  309. package/test/logic/43-default-nullability.sqllogic +131 -0
  310. package/test/logic/43-transition-constraints.sqllogic +341 -0
  311. package/test/logic/43.1-default-collation.sqllogic +140 -0
  312. package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
  313. package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
  314. package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
  315. package/test/logic/44-determinism-validation.sqllogic +164 -0
  316. package/test/logic/44-orthogonality.sqllogic +146 -0
  317. package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
  318. package/test/logic/45-udf-determinism.sqllogic +39 -0
  319. package/test/logic/46-mutation-context.sqllogic +595 -0
  320. package/test/logic/47-upsert.sqllogic +255 -0
  321. package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
  322. package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
  323. package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
  324. package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
  325. package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
  326. package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
  327. package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
  328. package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
  329. package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
  330. package/test/logic/49-reference-graph.sqllogic +84 -0
  331. package/test/logic/50-declarative-schema.sqllogic +2550 -0
  332. package/test/logic/50-metadata-tags.sqllogic +1033 -0
  333. package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
  334. package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
  335. package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
  336. package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +173 -0
  337. package/test/logic/50.3-declare-schema-duplicate-names.sqllogic +280 -0
  338. package/test/logic/50.4-declare-schema-apply-restore.sqllogic +192 -0
  339. package/test/logic/51-lens-foundation.sqllogic +147 -0
  340. package/test/logic/51-materialized-views.sqllogic +376 -0
  341. package/test/logic/51.5-materialized-views-coarsened-key.sqllogic +198 -0
  342. package/test/logic/51.7-maintained-table-attach-detach.sqllogic +468 -0
  343. package/test/logic/51.8-maintained-table-declared-constraints.sqllogic +440 -0
  344. package/test/logic/51.85-maintained-table-parent-fk.sqllogic +103 -0
  345. package/test/logic/51.9-maintained-table-secondary-unique.sqllogic +237 -0
  346. package/test/logic/51.9.1-maintained-table-partial-unique.sqllogic +36 -0
  347. package/test/logic/52-lens-overrides.sqllogic +566 -0
  348. package/test/logic/53-materialized-views-rowtime.sqllogic +1601 -0
  349. package/test/logic/53-reserved-tags.sqllogic +252 -0
  350. package/test/logic/53.1-materialized-view-write-through.sqllogic +329 -0
  351. package/test/logic/53.2-materialized-view-rename-propagation.sqllogic +483 -0
  352. package/test/logic/53.3-materialized-view-constraint-only-ddl.sqllogic +409 -0
  353. package/test/logic/53.3.1-materialized-view-index-ddl-irrelevance.sqllogic +29 -0
  354. package/test/logic/53.4-materialized-view-structural-alter-restore.sqllogic +436 -0
  355. package/test/logic/54-covering-mv-enforcement.sqllogic +314 -0
  356. package/test/logic/54.1-covering-mv-partial-enforcement.sqllogic +34 -0
  357. package/test/logic/55-internal-eviction-reporting.sqllogic +89 -0
  358. package/test/logic/55-lens-prover.sqllogic +202 -0
  359. package/test/logic/55.1-eviction-restrict-fk.sqllogic +148 -0
  360. package/test/logic/55.5-lens-authored-inverse.sqllogic +1468 -0
  361. package/test/logic/80-grow-retrieve-pass.sqllogic +79 -0
  362. package/test/logic/81-quickpick.sqllogic +24 -0
  363. package/test/logic/82-bloom-join.sqllogic +185 -0
  364. package/test/logic/83-merge-join.sqllogic +280 -0
  365. package/test/logic/84-asof-scan.sqllogic +238 -0
  366. package/test/logic/84-key-cardinality.sqllogic +50 -0
  367. package/test/logic/85-relational-const-folding.sqllogic +51 -0
  368. package/test/logic/86-scalar-cse.sqllogic +42 -0
  369. package/test/logic/90-error_paths.sqllogic +114 -0
  370. package/test/logic/90.1-parse-errors.sqllogic +77 -0
  371. package/test/logic/90.2-alter-table-errors.sqllogic +53 -0
  372. package/test/logic/90.2.1-alter-extra-errors.sqllogic +51 -0
  373. package/test/logic/90.3-expression-errors.sqllogic +43 -0
  374. package/test/logic/90.4-dml-errors.sqllogic +47 -0
  375. package/test/logic/90.5-unsupported-join-types.sqllogic +37 -0
  376. package/test/logic/90.5.1-right-full-join-read.sqllogic +157 -0
  377. package/test/logic/90.6-select-error-paths.sqllogic +57 -0
  378. package/test/logic/91-merge-join-edge-cases.sqllogic +159 -0
  379. package/test/logic/92-hash-aggregate-edge-cases.sqllogic +139 -0
  380. package/test/logic/93-ddl-view-edge-cases.sqllogic +104 -0
  381. package/test/logic/93.1-view-error-paths.sqllogic +74 -0
  382. package/test/logic/93.2-view-mutation-pending.sqllogic +108 -0
  383. package/test/logic/93.3-view-mutation-or-clause.sqllogic +60 -0
  384. package/test/logic/93.4-view-mutation.sqllogic +4881 -0
  385. package/test/logic/93.4.1-view-mutation-partial-unique-cardinality.sqllogic +31 -0
  386. package/test/logic/93.5-authored-inverse.sqllogic +415 -0
  387. package/test/logic/93.6-set-op-flagless-write.sqllogic +862 -0
  388. package/test/logic/94-tvf-edge-cases.sqllogic +58 -0
  389. package/test/logic/94.1-limit-offset-edge-cases.sqllogic +109 -0
  390. package/test/logic/94.2-limit-offset-extras.sqllogic +98 -0
  391. package/test/logic/95-assertions.sqllogic +1417 -0
  392. package/test/logic/96-subquery-edge-cases.sqllogic +276 -0
  393. package/test/logic/97-json-function-edge-cases.sqllogic +633 -0
  394. package/test/logic/97.1-json-blob-and-special-values.sqllogic +92 -0
  395. package/test/logic/98-temporal-edge-cases.sqllogic +515 -0
  396. package/test/logic/99-conversion-edge-cases.sqllogic +325 -0
  397. package/test/logic/99.0.1-schema-index-listing.sqllogic +21 -0
  398. package/test/logic/99.1-cast-syntax-extras.sqllogic +167 -0
  399. package/test/logic/drop-unique-index.sqllogic +88 -0
  400. package/test/logic/pushdown-test.sqllogic +36 -0
@@ -0,0 +1,293 @@
1
+ -- ALTER COLUMN — value-REWRITING change re-validates UNIQUE over the CONVERTED values.
2
+ --
3
+ -- Two families of ALTER COLUMN rewrite the stored values at one column, and either can
4
+ -- collapse two rows that were distinct onto the same value:
5
+ --
6
+ -- * `set data type` — '1' and '01' are distinct text but both convert to the integer 1;
7
+ -- '1.0' and '1.00' both convert to the real 1.0.
8
+ -- * `set not null` with a DEFAULT — SQL UNIQUE treats several NULLs as mutually
9
+ -- distinct, so backfilling them all to the same DEFAULT literal collides.
10
+ --
11
+ -- Every uniqueness-enforcing structure covering the altered column is therefore
12
+ -- re-validated over the converted values, before anything is mutated: a collision
13
+ -- rejects the ALTER with CONSTRAINT and leaves the table, its type and the transaction
14
+ -- exactly as they were. The judged rows are the DDL transaction's EFFECTIVE rows, so a
15
+ -- collision only among rows it has DELETED does not block the change, while one among
16
+ -- rows it has INSERTED but not committed does reject it.
17
+ --
18
+ -- Cross-module: the memory backend probes the converted rows before replacing its base
19
+ -- tree, and the store backend defers its value rewrite (`mapRowsAtIndex`) until after the
20
+ -- same probe — so on both, a rejection leaves the stored values AND the declared type at
21
+ -- their old form (the `table_info` checks below pin the declared-type half).
22
+ --
23
+ -- NOTE: a bare `v text` column is NOT NULL in this engine; the NULL sections below
24
+ -- declare `v text null` so they can hold NULLs at all.
25
+
26
+ -- ===================================
27
+ -- 1. text → integer collision under an explicit `create unique index` → rejected,
28
+ -- and the rejection changes nothing.
29
+ -- ===================================
30
+ -- Lives in 41.7.3.2-alter-column-retype-unique-index (it needs standalone index DDL);
31
+ -- § 2 below is the same collision seen through a table-level `unique (v)`.
32
+
33
+ -- ===================================
34
+ -- 2. Same collision under a table-level `unique (v)` constraint, caught through the
35
+ -- auto-built covering index rather than a user-created one.
36
+ -- ===================================
37
+
38
+ create table ru (id integer primary key, v text unique);
39
+ insert into ru values (1, '1'), (2, '01');
40
+ -- run
41
+
42
+ alter table ru alter column v set data type integer;
43
+ -- error: UNIQUE constraint failed
44
+
45
+ select id, v, typeof(v) from ru order by id;
46
+ → [{"id":1,"v":"1","typeof(v)":"text"},{"id":2,"v":"01","typeof(v)":"text"}]
47
+
48
+ drop table ru;
49
+
50
+ -- ===================================
51
+ -- 3. text → real collision — '1.0' and '1.00' are distinct text, one real. The probe
52
+ -- compares under the NEW logical type, which is what makes this reachable.
53
+ -- ===================================
54
+
55
+ create table rr (id integer primary key, v text unique);
56
+ insert into rr values (1, '1.0'), (2, '1.00');
57
+ -- run
58
+
59
+ alter table rr alter column v set data type real;
60
+ -- error: UNIQUE constraint failed
61
+
62
+ select id, v, typeof(v) from rr order by id;
63
+ → [{"id":1,"v":"1.0","typeof(v)":"text"},{"id":2,"v":"1.00","typeof(v)":"text"}]
64
+
65
+ drop table rr;
66
+
67
+ -- ===================================
68
+ -- 4. `set not null` DEFAULT backfill collision — two legal NULLs become two copies of
69
+ -- the same DEFAULT literal → rejected, and the column stays nullable.
70
+ -- ===================================
71
+
72
+ create table rn (id integer primary key, v text null, unique (v));
73
+ insert into rn (id, v) values (1, null), (2, null);
74
+ -- run
75
+
76
+ alter table rn alter column v set default 'x';
77
+ -- run
78
+
79
+ alter table rn alter column v set not null;
80
+ -- error: UNIQUE constraint failed
81
+
82
+ -- rolled back: both NULLs survive and the column is still nullable
83
+ select id, v from rn order by id;
84
+ → [{"id":1,"v":null},{"id":2,"v":null}]
85
+
86
+ insert into rn (id, v) values (3, null);
87
+ select count(*) as n from rn where v is null;
88
+ → [{"n":3}]
89
+
90
+ drop table rn;
91
+
92
+ -- 4b. A backfill that collides with an EXISTING non-null row is rejected too: one NULL
93
+ -- plus a row already holding the DEFAULT value.
94
+ create table rn2 (id integer primary key, v text null, unique (v));
95
+ insert into rn2 (id, v) values (1, 'x'), (2, null);
96
+ -- run
97
+
98
+ alter table rn2 alter column v set default 'x';
99
+ -- run
100
+
101
+ alter table rn2 alter column v set not null;
102
+ -- error: UNIQUE constraint failed
103
+
104
+ select id, v from rn2 order by id;
105
+ → [{"id":1,"v":"x"},{"id":2,"v":null}]
106
+
107
+ drop table rn2;
108
+
109
+ -- 4c. A single NULL with no colliding partner backfills fine (the guard must not
110
+ -- reject every backfill).
111
+ create table rn3 (id integer primary key, v text null, unique (v));
112
+ insert into rn3 (id, v) values (1, 'a'), (2, null);
113
+ -- run
114
+
115
+ alter table rn3 alter column v set default 'x';
116
+ -- run
117
+
118
+ alter table rn3 alter column v set not null;
119
+ -- run
120
+
121
+ select id, v from rn3 order by id;
122
+ → [{"id":1,"v":"a"},{"id":2,"v":"x"}]
123
+
124
+ drop table rn3;
125
+
126
+ -- ===================================
127
+ -- 5. ACCEPTED: a non-colliding retype still succeeds, the values are physically
128
+ -- rewritten, and an index-backed lookup finds rows by the NEW value.
129
+ -- ===================================
130
+
131
+ create table ok1 (id integer primary key, v text, unique (v));
132
+ insert into ok1 values (1, '10'), (2, '9');
133
+ -- run
134
+
135
+ alter table ok1 alter column v set data type integer;
136
+ -- run
137
+
138
+ select id, v, typeof(v) from ok1 order by id;
139
+ → [{"id":1,"v":10,"typeof(v)":"integer"},{"id":2,"v":9,"typeof(v)":"integer"}]
140
+
141
+ -- the accepted retype updates the declared type in lockstep with the values
142
+ select name, type from table_info('ok1') where name = 'v';
143
+ → [{"name":"v","type":"INTEGER"}]
144
+
145
+ -- index-backed lookup by the new numeric value
146
+ select id from ok1 where v = 9;
147
+ → [{"id":2}]
148
+
149
+ -- the unique index still enforces after the successful retype
150
+ insert into ok1 values (3, 9);
151
+ -- error: UNIQUE constraint failed
152
+
153
+ drop table ok1;
154
+
155
+ -- ===================================
156
+ -- 6. ACCEPTED: NULLs stay mutually distinct under UNIQUE, so retyping a column holding
157
+ -- several of them is not a collision.
158
+ -- ===================================
159
+
160
+ create table ok2 (id integer primary key, v text null, unique (v));
161
+ insert into ok2 (id, v) values (1, null), (2, null), (3, '7');
162
+ -- run
163
+
164
+ alter table ok2 alter column v set data type integer;
165
+ -- run
166
+
167
+ select id, v, typeof(v) from ok2 order by id;
168
+ → [{"id":1,"v":null,"typeof(v)":"null"},{"id":2,"v":null,"typeof(v)":"null"},{"id":3,"v":7,"typeof(v)":"integer"}]
169
+
170
+ -- more NULLs still allowed; a duplicate of the converted value is not
171
+ insert into ok2 (id, v) values (4, null);
172
+ select count(*) as n from ok2 where v is null;
173
+ → [{"n":3}]
174
+
175
+ insert into ok2 (id, v) values (5, 7);
176
+ -- error: UNIQUE constraint failed
177
+
178
+ drop table ok2;
179
+
180
+ -- ===================================
181
+ -- 7. COMPOSITE `unique (a, v)` — only the pair matters. A retype of `v` that makes two
182
+ -- rows share a `v` value is accepted when they still differ in `a`.
183
+ -- ===================================
184
+
185
+ create table ok3 (id integer primary key, a integer, v text, unique (a, v));
186
+ insert into ok3 values (1, 1, '1'), (2, 2, '01');
187
+ -- run
188
+
189
+ alter table ok3 alter column v set data type integer;
190
+ -- run
191
+
192
+ -- v collapses to 1 in both rows, but a (1 vs 2) still distinguishes them
193
+ select id, a, v, typeof(v) from ok3 order by id;
194
+ → [{"id":1,"a":1,"v":1,"typeof(v)":"integer"},{"id":2,"a":2,"v":1,"typeof(v)":"integer"}]
195
+
196
+ -- the composite now enforces on the converted values
197
+ insert into ok3 values (3, 1, 1);
198
+ -- error: UNIQUE constraint failed
199
+
200
+ drop table ok3;
201
+
202
+ -- 7b. The same shape where `a` matches too → the pair collides → rejected.
203
+ create table rc (id integer primary key, a integer, v text, unique (a, v));
204
+ insert into rc values (1, 1, '1'), (2, 1, '01');
205
+ -- run
206
+
207
+ alter table rc alter column v set data type integer;
208
+ -- error: UNIQUE constraint failed
209
+
210
+ select id, a, v, typeof(v) from rc order by id;
211
+ → [{"id":1,"a":1,"v":"1","typeof(v)":"text"},{"id":2,"a":1,"v":"01","typeof(v)":"text"}]
212
+
213
+ drop table rc;
214
+
215
+ -- ===================================
216
+ -- 8. EFFECTIVE rows, not committed rows: a collision only among rows the open
217
+ -- transaction has DELETED must NOT block the retype.
218
+ -- ===================================
219
+
220
+ create table tx1 (id integer primary key, v text, unique (v));
221
+ insert into tx1 values (1, '1'), (2, '01'), (3, '5');
222
+ -- run
223
+
224
+ begin;
225
+ -- run
226
+ delete from tx1 where id = 2;
227
+ -- run
228
+ alter table tx1 alter column v set data type integer;
229
+ -- run
230
+ commit;
231
+ -- run
232
+
233
+ select id, v, typeof(v) from tx1 order by id;
234
+ → [{"id":1,"v":1,"typeof(v)":"integer"},{"id":3,"v":5,"typeof(v)":"integer"}]
235
+
236
+ drop table tx1;
237
+
238
+ -- ===================================
239
+ -- 9. …and a collision among rows the transaction has INSERTED but not committed MUST
240
+ -- reject the retype.
241
+ -- ===================================
242
+
243
+ create table tx2 (id integer primary key, v text, unique (v));
244
+ insert into tx2 values (1, '1');
245
+ -- run
246
+
247
+ begin;
248
+ -- run
249
+ insert into tx2 values (2, '01');
250
+ -- run
251
+ alter table tx2 alter column v set data type integer;
252
+ -- error: UNIQUE constraint failed
253
+ rollback;
254
+ -- run
255
+
256
+ -- the rolled-back transaction left nothing behind, and the column is still text
257
+ select id, v, typeof(v) from tx2 order by id;
258
+ → [{"id":1,"v":"1","typeof(v)":"text"}]
259
+
260
+ drop table tx2;
261
+
262
+ -- ===================================
263
+ -- 10. A rejected retype leaves the transaction USABLE: removing the offending row and
264
+ -- retrying inside the same transaction succeeds, and the whole thing commits.
265
+ -- (The variant where the transaction also INSERTS a row the retry must convert
266
+ -- lives in 41.7.3.1-…-memory.sqllogic until the isolation layer converts staged
267
+ -- rows — bug-isolation-retype-leaves-staged-rows-unconverted.)
268
+ -- ===================================
269
+
270
+ create table tx3 (id integer primary key, v text, unique (v));
271
+ insert into tx3 values (1, '1');
272
+ -- run
273
+
274
+ begin;
275
+ -- run
276
+ insert into tx3 values (2, '01');
277
+ -- run
278
+
279
+ alter table tx3 alter column v set data type integer;
280
+ -- error: UNIQUE constraint failed
281
+
282
+ -- still writable after the rejection, and the retry now passes
283
+ delete from tx3 where id = 2;
284
+ -- run
285
+ alter table tx3 alter column v set data type integer;
286
+ -- run
287
+ commit;
288
+ -- run
289
+
290
+ select id, v, typeof(v) from tx3 order by id;
291
+ → [{"id":1,"v":1,"typeof(v)":"integer"}]
292
+
293
+ drop table tx3;
@@ -0,0 +1,41 @@
1
+ -- ALTER COLUMN SET DATA TYPE inside a transaction that has also INSERTED rows: the
2
+ -- accepted retype must convert the transaction's own staged rows, so after COMMIT every
3
+ -- row holds a value of the new declared type.
4
+ --
5
+ -- MEMORY-ONLY (listed in MEMORY_ONLY_FILES) for now: under the isolation wrapper the
6
+ -- store backend runs behind, staged rows live in the wrapper's overlay and the overlay's
7
+ -- ALTER migration does not yet convert them — an accepted retype commits the staged row
8
+ -- still holding the OLD type. Fixed by bug-isolation-retype-leaves-staged-rows-unconverted,
9
+ -- which removes this entry. The rejection/retry half of this scenario (without a staged
10
+ -- insert surviving to commit) runs cross-module in 41.7.3 § 10.
11
+
12
+ -- The UNIQUE is declared inline rather than through `create unique index`: the staged-row
13
+ -- conversion this file is about is identical either way, and an inline constraint keeps the
14
+ -- file runnable on backends without standalone index DDL.
15
+ create table tx3 (id integer primary key, v text unique);
16
+ insert into tx3 values (1, '1');
17
+ -- run
18
+
19
+ begin;
20
+ -- run
21
+ insert into tx3 values (2, '01');
22
+ -- run
23
+
24
+ alter table tx3 alter column v set data type integer;
25
+ -- error: UNIQUE constraint failed
26
+
27
+ -- still writable after the rejection, and the retry now passes — converting the
28
+ -- transaction's staged insert (3, '7') along with the committed rows
29
+ delete from tx3 where id = 2;
30
+ -- run
31
+ insert into tx3 values (3, '7');
32
+ -- run
33
+ alter table tx3 alter column v set data type integer;
34
+ -- run
35
+ commit;
36
+ -- run
37
+
38
+ select id, v, typeof(v) from tx3 order by id;
39
+ → [{"id":1,"v":1,"typeof(v)":"integer"},{"id":3,"v":7,"typeof(v)":"integer"}]
40
+
41
+ drop table tx3;
@@ -0,0 +1,72 @@
1
+ -- 41.7.3.2-alter-column-retype-unique-index.sqllogic
2
+ --
3
+ -- requires-capability: standalone-index-ddl
4
+ --
5
+ -- Carved out of 41.7.3-alter-column-retype-unique. That file proves that a
6
+ -- value-REWRITING ALTER COLUMN (`set data type`, or `set not null` with a DEFAULT)
7
+ -- re-validates uniqueness over the CONVERTED values before mutating anything; it makes
8
+ -- every one of those points through inline / table-level `unique`, which needs no index
9
+ -- DDL. The index-derived vehicle is a separate enforcement path (the parent's § 1 and § 2
10
+ -- were deliberately the same collision seen through each), so it lives here.
11
+ --
12
+ -- Cross-module: the memory backend probes the converted rows before replacing its base
13
+ -- tree, and the store backend defers its value rewrite (`mapRowsAtIndex`) until after the
14
+ -- same probe.
15
+ --
16
+ -- Subject: a UNIQUE derived from `create unique index` is re-validated on retype exactly
17
+ -- as a declared one is — rejecting on collision with nothing changed, and rebuilding over
18
+ -- the converted values when it succeeds.
19
+
20
+ -- ===================================
21
+ -- 1. text → integer collision under an explicit `create unique index` → rejected,
22
+ -- and the rejection changes nothing: values, type and writability all survive.
23
+ -- ===================================
24
+
25
+ create table ri (id integer primary key, v text);
26
+ create unique index ri_v on ri (v);
27
+ insert into ri values (1, '1'), (2, '01');
28
+ -- run
29
+
30
+ alter table ri alter column v set data type integer;
31
+ -- error: UNIQUE constraint failed
32
+
33
+ -- rolled back: both rows survive as their original TEXT values
34
+ select id, v, typeof(v) from ri order by id;
35
+ → [{"id":1,"v":"1","typeof(v)":"text"},{"id":2,"v":"01","typeof(v)":"text"}]
36
+
37
+ -- ...and the DECLARED type is unchanged too — a rejection must not leave rewritten values
38
+ -- behind a stale catalog type, nor a changed catalog over old values
39
+ select name, type from table_info('ri') where name = 'v';
40
+ → [{"name":"v","type":"TEXT"}]
41
+
42
+ -- the table is still writable, and the index still enforces under the unchanged type
43
+ insert into ri values (3, '001');
44
+ select count(*) as n from ri;
45
+ → [{"n":3}]
46
+
47
+ insert into ri values (4, '1');
48
+ -- error: UNIQUE constraint failed
49
+
50
+ drop table ri;
51
+
52
+ -- ===================================
53
+ -- 2. ACCEPTED: a non-colliding retype rebuilds the index over the CONVERTED values, so
54
+ -- a later duplicate of a converted value is caught by the index.
55
+ -- ===================================
56
+
57
+ create table ok1 (id integer primary key, v text);
58
+ create unique index ok1_v on ok1 (v);
59
+ insert into ok1 values (1, '10'), (2, '9');
60
+ -- run
61
+
62
+ alter table ok1 alter column v set data type integer;
63
+ -- run
64
+
65
+ select id, v, typeof(v) from ok1 order by id;
66
+ → [{"id":1,"v":10,"typeof(v)":"integer"},{"id":2,"v":9,"typeof(v)":"integer"}]
67
+
68
+ -- the rebuilt index enforces over the converted values
69
+ insert into ok1 values (3, 10);
70
+ -- error: UNIQUE constraint failed
71
+
72
+ drop table ok1;