@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,445 @@
1
+ -- ALTER COLUMN ... SET DATA TYPE into a type that COMPARES differently, when the physical
2
+ -- storage class does not change.
3
+ --
4
+ -- TEXT and TIMESPAN are both physically text, and every spelling below is already the new
5
+ -- type's canonical form, so the retype leaves the stored bytes alone (the rewrite pass
6
+ -- re-parses each value — '1 hour' WOULD become 'PT1H'; see 41.2 §12 — but ISO durations
7
+ -- round-trip unchanged). It does change how two values compare: TIMESPAN ranks by elapsed time, so 'PT1H',
8
+ -- 'PT60M' and 'PT3600S' are ONE value where text sees three. Every index over the column is
9
+ -- keyed by the column's logical type, so such a retype must be treated exactly like a
10
+ -- SET COLLATE: re-validate every uniqueness-enforcing structure covering the column BEFORE
11
+ -- mutating anything, and re-sort those structures when the change is accepted.
12
+ --
13
+ -- Without that, the change was silently accepted and left the indexes sorted the old way:
14
+ -- an index-backed lookup for another spelling of a stored duration found nothing, while an
15
+ -- INSERT of that same spelling was rejected as a duplicate — a value simultaneously absent
16
+ -- on SELECT and duplicate on INSERT (bug-retype-to-semantic-type-unique-and-query).
17
+ --
18
+ -- CROSS-MODULE (the `-memory` in the filename is historical): the store backend used to cover
19
+ -- only the TIMESPAN/JSON halves, via its own key-transform guard. It now gates its value rewrite
20
+ -- on logical-type identity like memory does (bug-retype-same-class-skips-value-validation), so
21
+ -- the DATE / TIME / DATETIME retypes of section 7b re-validate and rebuild there too, and this
22
+ -- file runs on both legs.
23
+
24
+ -- ===================================
25
+ -- 1. Colliding rows under an explicit `create unique index` → the ALTER is REJECTED.
26
+ -- ===================================
27
+ -- Lives in 41.7.4.1-alter-column-retype-semantic-index-memory (it needs standalone index
28
+ -- DDL); § 2 below is the same collision through an inline `v text unique`.
29
+
30
+ -- ===================================
31
+ -- 2. Same collision through an inline `v text unique` (the auto-built covering index
32
+ -- rather than a user-created one).
33
+ -- ===================================
34
+
35
+ create table sem2 (id integer primary key, v text unique);
36
+ insert into sem2 values (1, 'PT1H'), (2, 'PT60M');
37
+ -- run
38
+
39
+ alter table sem2 alter column v set data type timespan;
40
+ -- error: UNIQUE constraint failed
41
+
42
+ select name, type from table_info('sem2') where name = 'v';
43
+ → [{"name":"v","type":"TEXT"}]
44
+
45
+ select id, v from sem2 order by id;
46
+ → [{"id":1,"v":"PT1H"},{"id":2,"v":"PT60M"}]
47
+
48
+ drop table sem2;
49
+
50
+ -- ===================================
51
+ -- 3. ACCEPTED: no collision (one hour and two hours). The change must still re-sort the
52
+ -- index — this is the case the old code got wrong WITHOUT any uniqueness violation.
53
+ -- ===================================
54
+
55
+ create table sem3 (id integer primary key, v text, unique (v));
56
+ insert into sem3 values (1, 'PT1H'), (2, 'PT2H');
57
+ -- run
58
+
59
+ alter table sem3 alter column v set data type timespan;
60
+ -- run
61
+
62
+ select name, type from table_info('sem3') where name = 'v';
63
+ → [{"name":"v","type":"TIMESPAN"}]
64
+
65
+ -- the stored values survive byte-identical: both are already canonical ISO durations, so the
66
+ -- rewrite pass re-parses them to themselves
67
+ select id, v, typeof(v) from sem3 order by id;
68
+ → [{"id":1,"v":"PT1H","typeof(v)":"text"},{"id":2,"v":"PT2H","typeof(v)":"text"}]
69
+
70
+ -- an index-backed lookup by ANOTHER spelling of the stored duration finds the row
71
+ select id from sem3 where v = 'PT60M';
72
+ → [{"id":1}]
73
+
74
+ select id from sem3 where v = 'PT3600S';
75
+ → [{"id":1}]
76
+
77
+ -- ...and uniqueness now enforces semantically: 120 minutes duplicates the stored 'PT2H'
78
+ insert into sem3 values (3, 'PT120M');
79
+ -- error: UNIQUE constraint failed
80
+
81
+ -- a genuinely new duration is still accepted
82
+ insert into sem3 values (4, 'PT30M');
83
+ select id from sem3 where v = 'PT1800S';
84
+ → [{"id":4}]
85
+
86
+ drop table sem3;
87
+
88
+ -- ===================================
89
+ -- 4. Non-unique index: no uniqueness to violate, but the index still has to be re-sorted
90
+ -- or the lookup misses rows.
91
+ -- ===================================
92
+ -- The indexed legs (4 and 4c) live in 41.7.4.1-alter-column-retype-semantic-index-memory;
93
+ -- the unindexed leg stays here as the answer they must match.
94
+
95
+ -- 4b. the identical table with no index at all
96
+ create table sem4b (id integer primary key, v text);
97
+ insert into sem4b values (1, 'PT1H'), (2, 'PT60M'), (3, 'PT2H');
98
+ -- run
99
+
100
+ alter table sem4b alter column v set data type timespan;
101
+ -- run
102
+
103
+ select id from sem4b where v = 'PT3600S' order by id;
104
+ → [{"id":1},{"id":2}]
105
+
106
+ drop table sem4b;
107
+
108
+ -- ===================================
109
+ -- 5. Reverse direction, TIMESPAN → TEXT: comparison becomes textual again, so the spellings
110
+ -- separate and a duration that was a duplicate becomes insertable.
111
+ -- ===================================
112
+
113
+ create table sem5 (id integer primary key, v timespan, unique (v));
114
+ insert into sem5 values (1, 'PT1H'), (2, 'PT2H');
115
+ -- run
116
+
117
+ -- while TIMESPAN: another spelling finds the row and duplicates it
118
+ select id from sem5 where v = 'PT60M';
119
+ → [{"id":1}]
120
+
121
+ alter table sem5 alter column v set data type text;
122
+ -- run
123
+
124
+ select name, type from table_info('sem5') where name = 'v';
125
+ → [{"name":"v","type":"TEXT"}]
126
+
127
+ -- now purely textual: 'PT60M' is a different value from the stored 'PT1H'
128
+ select id from sem5 where v = 'PT60M';
129
+ → []
130
+
131
+ select id from sem5 where v = 'PT1H';
132
+ → [{"id":1}]
133
+
134
+ -- ...so it is no longer a duplicate
135
+ insert into sem5 values (3, 'PT60M');
136
+ select count(*) as n from sem5;
137
+ → [{"n":3}]
138
+
139
+ drop table sem5;
140
+
141
+ -- ===================================
142
+ -- 6. A retype into a type that compares IDENTICALLY stays a metadata-only no-op — the
143
+ -- guard must not re-validate or re-sort on every `text → varchar` widening.
144
+ -- ===================================
145
+
146
+ create table sem6 (id integer primary key, v text, unique (v));
147
+ insert into sem6 values (1, 'PT1H'), (2, 'PT60M');
148
+ -- run
149
+
150
+ -- both spellings survive: still two distinct TEXT values
151
+ alter table sem6 alter column v set data type varchar(50);
152
+ -- run
153
+
154
+ select id, v from sem6 order by id;
155
+ → [{"id":1,"v":"PT1H"},{"id":2,"v":"PT60M"}]
156
+
157
+ select id from sem6 where v = 'PT60M';
158
+ → [{"id":2}]
159
+
160
+ drop table sem6;
161
+
162
+ -- 6b. integer → bigint, likewise a no-op
163
+ create table sem6b (id integer primary key, n integer, unique (n));
164
+ insert into sem6b values (1, 10), (2, 9);
165
+ -- run
166
+
167
+ alter table sem6b alter column n set data type bigint;
168
+ -- run
169
+
170
+ select id, n from sem6b order by id;
171
+ → [{"id":1,"n":10},{"id":2,"n":9}]
172
+
173
+ select id from sem6b where n = 9;
174
+ → [{"id":2}]
175
+
176
+ drop table sem6b;
177
+
178
+ -- ===================================
179
+ -- 7. SET DATA TYPE keeps the column's existing collation, so the NEW type has to accept it.
180
+ -- DATE / TIME / DATETIME / TIMESPAN / JSON declare `supportedCollations: []` — they accept
181
+ -- BINARY only — so retyping a `collate nocase` column into any of them is REJECTED with
182
+ -- the same error `create table … (d date collate nocase)` gives. Otherwise the ALTER would
183
+ -- mint `d DATE COLLATE NOCASE`, a column shape no CREATE TABLE can produce and whose
184
+ -- canonical DDL does not re-parse (on a store-backed database the table is dropped on
185
+ -- reopen). Remedy is one extra statement: `set collate binary` first — see 7c.
186
+ --
187
+ -- The rejection is uniform: it does not matter whether the collation was written by the
188
+ -- user or inherited from `pragma default_collation`, because that distinction is not
189
+ -- persisted and would flip on a reopen.
190
+ -- ===================================
191
+
192
+ create table sem7 (id integer primary key, d text collate nocase, unique (d));
193
+ insert into sem7 values (1, '2024-01-01'), (2, '2024-02-01');
194
+ -- run
195
+
196
+ alter table sem7 alter column d set data type date;
197
+ -- error: Unknown collation
198
+
199
+ -- the rejection changed nothing: declared type, collation, rows and index all survive
200
+ select name, type from table_info('sem7') where name = 'd';
201
+ → [{"name":"d","type":"TEXT"}]
202
+
203
+ select name, collation from table_info('sem7') where name = 'd';
204
+ → [{"name":"d","collation":"NOCASE"}]
205
+
206
+ select id, d from sem7 order by id;
207
+ → [{"id":1,"d":"2024-01-01"},{"id":2,"d":"2024-02-01"}]
208
+
209
+ -- still writable, and the index still enforces NOCASE uniqueness under the unchanged type
210
+ insert into sem7 values (3, '2024-03-01');
211
+ select count(*) as n from sem7;
212
+ → [{"n":3}]
213
+
214
+ drop table sem7;
215
+
216
+ -- 7b. …and the collation-legal shape of the same retype (a plain BINARY `text` column, the
217
+ -- only collation DATE accepts). DATE compares exactly as BINARY text does, so this one
218
+ -- re-sorts into the order it was already in — the point is that it stays correct and stays
219
+ -- accepted. This is the surviving re-key coverage now that section 7 rejects.
220
+ create table sem7b (id integer primary key, d text, unique (d));
221
+ insert into sem7b values (1, '2024-02-01'), (2, '2024-01-01');
222
+ -- run
223
+
224
+ alter table sem7b alter column d set data type date;
225
+ -- run
226
+
227
+ select id, d from sem7b order by d;
228
+ → [{"id":2,"d":"2024-01-01"},{"id":1,"d":"2024-02-01"}]
229
+
230
+ select id from sem7b where d = '2024-02-01';
231
+ → [{"id":1}]
232
+
233
+ drop table sem7b;
234
+
235
+ -- 7c. …the remedy for section 7: drop the illegal collation first, then retype. Two statements,
236
+ -- both accepted, and the resulting column is a shape CREATE TABLE could have produced directly.
237
+ create table sem7c (id integer primary key, d text collate nocase, unique (d));
238
+ insert into sem7c values (1, '2024-02-01'), (2, '2024-01-01');
239
+ -- run
240
+
241
+ alter table sem7c alter column d set collate binary;
242
+ -- run
243
+ alter table sem7c alter column d set data type date;
244
+ -- run
245
+
246
+ select name, type, collation from table_info('sem7c') where name = 'd';
247
+ → [{"name":"d","type":"DATE","collation":"BINARY"}]
248
+
249
+ select id, d from sem7c order by d;
250
+ → [{"id":2,"d":"2024-01-01"},{"id":1,"d":"2024-02-01"}]
251
+
252
+ drop table sem7c;
253
+
254
+ -- 7d. Every collation-less type rejects, and the collation name is not special — RTRIM
255
+ -- rejects exactly as NOCASE does.
256
+ create table sem7d (id integer primary key, v text collate nocase);
257
+ insert into sem7d values (1, 'x');
258
+ -- run
259
+
260
+ alter table sem7d alter column v set data type date;
261
+ -- error: Unknown collation
262
+
263
+ alter table sem7d alter column v set data type time;
264
+ -- error: Unknown collation
265
+
266
+ alter table sem7d alter column v set data type datetime;
267
+ -- error: Unknown collation
268
+
269
+ alter table sem7d alter column v set data type timespan;
270
+ -- error: Unknown collation
271
+
272
+ alter table sem7d alter column v set data type json;
273
+ -- error: Unknown collation
274
+
275
+ select name, type, collation from table_info('sem7d') where name = 'v';
276
+ → [{"name":"v","type":"TEXT","collation":"NOCASE"}]
277
+
278
+ drop table sem7d;
279
+
280
+ create table sem7d2 (id integer primary key, v text collate rtrim);
281
+ insert into sem7d2 values (1, 'x');
282
+ -- run
283
+
284
+ alter table sem7d2 alter column v set data type timespan;
285
+ -- error: Unknown collation
286
+
287
+ select name, type, collation from table_info('sem7d2') where name = 'v';
288
+ → [{"name":"v","type":"TEXT","collation":"RTRIM"}]
289
+
290
+ drop table sem7d2;
291
+
292
+ -- 7e. …and the types that declare NO collation list (INTEGER / REAL / BLOB) must not regress
293
+ -- into rejecting: they accept any registered collation, so a NOCASE column still retypes.
294
+ create table sem7e (id integer primary key, v text collate nocase);
295
+ insert into sem7e values (1, '10');
296
+ -- run
297
+
298
+ alter table sem7e alter column v set data type integer;
299
+ -- run
300
+
301
+ select name, type, collation from table_info('sem7e') where name = 'v';
302
+ → [{"name":"v","type":"INTEGER","collation":"NOCASE"}]
303
+
304
+ drop table sem7e;
305
+
306
+ create table sem7e2 (id integer primary key, v text collate nocase);
307
+ insert into sem7e2 values (1, 'abc');
308
+ -- run
309
+
310
+ alter table sem7e2 alter column v set data type blob;
311
+ -- run
312
+
313
+ select name, type, collation from table_info('sem7e2') where name = 'v';
314
+ → [{"name":"v","type":"BLOB","collation":"NOCASE"}]
315
+
316
+ drop table sem7e2;
317
+
318
+ -- 7f. The rejection does not care where the collation came from: with a session default of
319
+ -- NOCASE the user never writes COLLATE, and the retype is still rejected. (`collationExplicit`
320
+ -- is not persisted, so keying the rule on user intent would flip on a reopen.)
321
+ pragma default_collation = 'nocase';
322
+ -- run
323
+
324
+ create table sem7f (id integer primary key, v text);
325
+ insert into sem7f values (1, '2024-01-01');
326
+ -- run
327
+
328
+ select name, collation from table_info('sem7f') where name = 'v';
329
+ → [{"name":"v","collation":"NOCASE"}]
330
+
331
+ alter table sem7f alter column v set data type date;
332
+ -- error: Unknown collation
333
+
334
+ drop table sem7f;
335
+
336
+ pragma default_collation = 'binary';
337
+ -- run
338
+
339
+ -- ===================================
340
+ -- 8. EFFECTIVE rows, not committed rows: a collision involving a row the open transaction
341
+ -- has staged but not committed MUST reject the retype, and the transaction stays usable.
342
+ -- ===================================
343
+
344
+ create table sem8 (id integer primary key, v text, unique (v));
345
+ insert into sem8 values (1, 'PT1H');
346
+ -- run
347
+
348
+ begin;
349
+ -- run
350
+ insert into sem8 values (2, 'PT60M');
351
+ -- run
352
+
353
+ alter table sem8 alter column v set data type timespan;
354
+ -- error: UNIQUE constraint failed
355
+
356
+ -- the transaction survived the rejection: removing the offending row lets the retry pass
357
+ delete from sem8 where id = 2;
358
+ -- run
359
+ alter table sem8 alter column v set data type timespan;
360
+ -- run
361
+ commit;
362
+ -- run
363
+
364
+ select id, v from sem8 order by id;
365
+ → [{"id":1,"v":"PT1H"}]
366
+
367
+ -- committed under the new type, so the re-sorted index answers semantically
368
+ select id from sem8 where v = 'PT3600S';
369
+ → [{"id":1}]
370
+
371
+ drop table sem8;
372
+
373
+ -- 8b. …and a collision only among rows the transaction has DELETED does NOT block it.
374
+ create table sem8b (id integer primary key, v text, unique (v));
375
+ insert into sem8b values (1, 'PT1H'), (2, 'PT60M'), (3, 'PT2H');
376
+ -- run
377
+
378
+ begin;
379
+ -- run
380
+ delete from sem8b where id = 2;
381
+ -- run
382
+ alter table sem8b alter column v set data type timespan;
383
+ -- run
384
+ commit;
385
+ -- run
386
+
387
+ select id from sem8b where v = 'PT3600S';
388
+ → [{"id":1}]
389
+
390
+ select id from sem8b where v = 'PT120M';
391
+ → [{"id":3}]
392
+
393
+ drop table sem8b;
394
+
395
+ -- ===================================
396
+ -- 9. JSON is the third same-storage-class type carrying its own comparison: it ranks by
397
+ -- canonical structure, so '{"a":1}' and '{ "a" : 1 }' are one document where text sees
398
+ -- two. Same contract as the TIMESPAN sections above.
399
+ -- ===================================
400
+
401
+ create table sem9 (id integer primary key, v text, unique (v));
402
+ insert into sem9 values (1, '{"a":1}'), (2, '{ "a" : 1 }');
403
+ -- run
404
+
405
+ alter table sem9 alter column v set data type json;
406
+ -- error: UNIQUE constraint failed
407
+
408
+ select id, v from sem9 order by id;
409
+ → [{"id":1,"v":"{\"a\":1}"},{"id":2,"v":"{ \"a\" : 1 }"}]
410
+
411
+ drop table sem9;
412
+
413
+ -- 9b. …the accepted case: distinct documents, so the retype lands and the index enforces
414
+ -- uniqueness by structure rather than by spelling. The retyped column must answer exactly as
415
+ -- a column declared `json` from the start does — which is what 9c pins.
416
+ create table sem9b (id integer primary key, v text, unique (v));
417
+ insert into sem9b values (1, '{"a":1}'), (2, '{"b":2}');
418
+ -- run
419
+
420
+ alter table sem9b alter column v set data type json;
421
+ -- run
422
+
423
+ insert into sem9b values (3, '{ "b":2 }');
424
+ -- error: UNIQUE constraint failed
425
+
426
+ -- A differently-spaced document is one document to the INDEX and to `=` alike: the text
427
+ -- operand is coerced to JSON at plan time, so equality compares structure. See
428
+ -- 06.9.2-json-structural-equality.sqllogic for the full contract.
429
+ select id from sem9b where v = '{ "a" : 1 }';
430
+ → [{"id":1}]
431
+
432
+ drop table sem9b;
433
+
434
+ -- 9c. …and the natively-declared column the retyped one has to match, spelling for spelling.
435
+ create table sem9c (id integer primary key, v json, unique (v));
436
+ insert into sem9c values (1, '{"a":1}'), (2, '{"b":2}');
437
+ -- run
438
+
439
+ insert into sem9c values (3, '{ "b":2 }');
440
+ -- error: UNIQUE constraint failed
441
+
442
+ select id from sem9c where v = '{ "a" : 1 }';
443
+ → [{"id":1}]
444
+
445
+ drop table sem9c;
@@ -0,0 +1,91 @@
1
+ -- 41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic
2
+ --
3
+ -- requires-capability: standalone-index-ddl
4
+ --
5
+ -- Carved out of 41.7.4-alter-column-retype-semantic-memory. That file's subject is
6
+ -- retype semantics for same-storage-class types that carry their own comparison
7
+ -- (text <-> timespan / json / date): the change must re-sort and re-validate under the
8
+ -- NEW type's compare. It makes every one of those points through inline / table-level
9
+ -- `unique` or through a plain scan, so it needs no index DDL. Two things there genuinely
10
+ -- do: an index-DERIVED unique (a distinct enforcement path from a declared one), and a
11
+ -- NON-unique secondary index, which has no declarative spelling at all.
12
+ --
13
+ -- Subject: (1) an index-derived UNIQUE rejects a retype whose converted values collide,
14
+ -- changing nothing; (2) a non-unique secondary index over the retyped column is re-sorted,
15
+ -- so a lookup through it answers exactly as the unindexed table and the natively-declared
16
+ -- column do.
17
+
18
+ -- ===================================
19
+ -- 1. Colliding rows under an explicit `create unique index` → the ALTER is REJECTED, and
20
+ -- the rejection changes nothing: values, declared type and writability all survive.
21
+ -- ===================================
22
+
23
+ create table sem1 (id integer primary key, v text);
24
+ create unique index sem1_v on sem1 (v);
25
+ insert into sem1 values (1, 'PT1H'), (2, 'PT60M');
26
+ -- run
27
+
28
+ alter table sem1 alter column v set data type timespan;
29
+ -- error: UNIQUE constraint failed
30
+
31
+ -- the declared type is unchanged — a rejected ALTER must not leave a new type over
32
+ -- structures still keyed the old way
33
+ select name, type from table_info('sem1') where name = 'v';
34
+ → [{"name":"v","type":"TEXT"}]
35
+
36
+ select id, v from sem1 order by id;
37
+ → [{"id":1,"v":"PT1H"},{"id":2,"v":"PT60M"}]
38
+
39
+ -- still writable, and the index still enforces TEXTUAL uniqueness under the unchanged type,
40
+ -- so a third spelling of the same duration is accepted
41
+ insert into sem1 values (3, 'PT3600S');
42
+ select count(*) as n from sem1;
43
+ → [{"n":3}]
44
+
45
+ insert into sem1 values (4, 'PT1H');
46
+ -- error: UNIQUE constraint failed
47
+
48
+ drop table sem1;
49
+
50
+ -- ===================================
51
+ -- 4. Non-unique index: no uniqueness to violate, but the index still has to be re-sorted or
52
+ -- the lookup misses rows. The answer must match the same table with NO index, and the
53
+ -- same table declared TIMESPAN from the start.
54
+ -- ===================================
55
+
56
+ create table sem4 (id integer primary key, v text);
57
+ create index sem4_v on sem4 (v);
58
+ insert into sem4 values (1, 'PT1H'), (2, 'PT60M'), (3, 'PT2H');
59
+ -- run
60
+
61
+ alter table sem4 alter column v set data type timespan;
62
+ -- run
63
+
64
+ select id from sem4 where v = 'PT3600S' order by id;
65
+ → [{"id":1},{"id":2}]
66
+
67
+ drop table sem4;
68
+
69
+ -- 4b. …the identical table with no index at all
70
+ create table sem4b (id integer primary key, v text);
71
+ insert into sem4b values (1, 'PT1H'), (2, 'PT60M'), (3, 'PT2H');
72
+ -- run
73
+
74
+ alter table sem4b alter column v set data type timespan;
75
+ -- run
76
+
77
+ select id from sem4b where v = 'PT3600S' order by id;
78
+ → [{"id":1},{"id":2}]
79
+
80
+ drop table sem4b;
81
+
82
+ -- 4c. …and the same rows under a natively-declared TIMESPAN column
83
+ create table sem4c (id integer primary key, v timespan);
84
+ create index sem4c_v on sem4c (v);
85
+ insert into sem4c values (1, 'PT1H'), (2, 'PT60M'), (3, 'PT2H');
86
+ -- run
87
+
88
+ select id from sem4c where v = 'PT3600S' order by id;
89
+ → [{"id":1},{"id":2}]
90
+
91
+ drop table sem4c;
@@ -0,0 +1,106 @@
1
+ -- ALTER COLUMN ... SET COLLATE on a PRIMARY KEY column, interleaved with rows the
2
+ -- transaction deleted, re-inserted, or staged at a case-variant key.
3
+ --
4
+ -- Cross-module: both backends ask the same two questions before mutating anything
5
+ -- (memory: MemoryTableManager.validateRekeyedPrimaryKey; store:
6
+ -- StoreTable.validateRekeyedPrimaryKey) — a collision the transaction can SEE is
7
+ -- CONSTRAINT, a collision confined to rows only a rollback could restore is BUSY, and
8
+ -- either refusal leaves the transaction usable. The PK declares `collate binary`
9
+ -- explicitly because the store defaults an undecorated text PK to NOCASE (see
10
+ -- 10.2.2-default-collation-memory.sqllogic), which would make the case-variant pairs
11
+ -- collide at INSERT before any ALTER runs. The isolation layer's own coverage of these
12
+ -- sequences lives in packages/quereus-isolation/test/isolation-layer.spec.ts
13
+ -- ("collapses overlay deletion markers").
14
+
15
+ -- ===================================
16
+ -- 1. Delete a row, re-insert a case-variant replacement, then re-key: the deleted row
17
+ -- must not block the change, and the replacement survives the commit.
18
+ -- ===================================
19
+
20
+ create table t_rk (k text collate binary primary key, v text);
21
+ insert into t_rk values ('A', 'x');
22
+
23
+ begin;
24
+ delete from t_rk where k = 'A';
25
+ insert into t_rk values ('a', 'y');
26
+ alter table t_rk alter column k set collate nocase;
27
+ commit;
28
+
29
+ select k, v from t_rk;
30
+ → [{"k":"a","v":"y"}]
31
+
32
+ drop table t_rk;
33
+
34
+ -- ===================================
35
+ -- 2. Rows inserted AND deleted inside one transaction leave the case-colliding pair in the
36
+ -- transaction's history; the re-key's conservative representability check refuses it as
37
+ -- retryable (BUSY), the transaction's own work still commits, and the retry succeeds.
38
+ -- ===================================
39
+
40
+ create table t_rk2 (k text collate binary primary key, v text);
41
+ -- run
42
+
43
+ begin;
44
+ insert into t_rk2 values ('A', 'x'), ('a', 'y');
45
+ delete from t_rk2 where k in ('A', 'a');
46
+ -- run
47
+
48
+ alter table t_rk2 alter column k set collate nocase;
49
+ -- error: still collide under the new key definition
50
+
51
+ commit;
52
+ select count(*) as n from t_rk2;
53
+ → [{"n":0}]
54
+
55
+ alter table t_rk2 alter column k set collate nocase;
56
+ select name, collation from table_info('t_rk2') order by cid;
57
+ → [{"name":"k","collation":"NOCASE"},{"name":"v","collation":"BINARY"}]
58
+
59
+ drop table t_rk2;
60
+
61
+ -- ===================================
62
+ -- 3. A staged row colliding with a COMMITTED row under the new collation is a duplicate
63
+ -- this transaction's own select would return: the change is invalid (CONSTRAINT), and
64
+ -- the refusal leaves the transaction untouched and usable.
65
+ -- ===================================
66
+
67
+ create table t_rk3 (k text collate binary primary key, v text);
68
+ insert into t_rk3 values ('A', 'x');
69
+ -- run
70
+
71
+ begin;
72
+ insert into t_rk3 values ('a', 'y');
73
+ -- run
74
+
75
+ alter table t_rk3 alter column k set collate nocase;
76
+ -- error: collides under the new key definition
77
+
78
+ rollback;
79
+ select k, v from t_rk3;
80
+ → [{"k":"A","v":"x"}]
81
+
82
+ drop table t_rk3;
83
+
84
+ -- ===================================
85
+ -- 4. A committed collider DELETED in this transaction is invisible to the transaction's
86
+ -- view but must survive a rollback, and a re-keyed structure cannot hold the pair:
87
+ -- refused as retryable (BUSY), transaction still usable, retry after commit succeeds.
88
+ -- ===================================
89
+
90
+ create table t_rk4 (k text collate binary primary key, v text);
91
+ insert into t_rk4 values ('A', 'x'), ('a', 'y');
92
+ -- run
93
+
94
+ begin;
95
+ delete from t_rk4 where k = 'a';
96
+ -- run
97
+
98
+ alter table t_rk4 alter column k set collate nocase;
99
+ -- error: still collide under the new key definition
100
+
101
+ commit;
102
+ alter table t_rk4 alter column k set collate nocase;
103
+ select k, v from t_rk4;
104
+ → [{"k":"A","v":"x"}]
105
+
106
+ drop table t_rk4;