@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,105 @@
1
+ -- ALTER TABLE ALTER COLUMN ... SET COLLATE — change a column's collation in place.
2
+ -- This file covers the query-layer semantics that derive purely from the column
3
+ -- schema collation (ORDER BY / `=` follow the new collation), the table_info
4
+ -- round-trip, unknown-collation rejection, set-back-to-BINARY, and idempotent
5
+ -- re-apply. All of these update + re-register the column schema, so they run under
6
+ -- BOTH the memory module (`yarn test`) and the store module (`yarn test:store`).
7
+ --
8
+ -- Structure re-sort + existing-row uniqueness re-validation (memory-specific) live
9
+ -- in 41.7.1-alter-column-collate-unique.sqllogic.
10
+
11
+ -- ===================================
12
+ -- 1. SET COLLATE NOCASE changes `=` semantics on a non-key column.
13
+ -- ===================================
14
+
15
+ create table t_eq (id integer primary key, name text);
16
+ insert into t_eq values (1, 'abc'), (2, 'ABC'), (3, 'abd');
17
+
18
+ -- Under BINARY, only the exact 'ABC' matches.
19
+ select count(*) as n from t_eq where name = 'ABC';
20
+ → [{"n":1}]
21
+
22
+ alter table t_eq alter column name set collate nocase;
23
+
24
+ -- Under NOCASE, both 'abc' and 'ABC' equal 'ABC'.
25
+ select count(*) as n from t_eq where name = 'ABC';
26
+ → [{"n":2}]
27
+
28
+ drop table t_eq;
29
+
30
+ -- ===================================
31
+ -- 2. SET COLLATE NOCASE changes ORDER BY on a non-key column.
32
+ -- ===================================
33
+
34
+ create table t_ord (id integer primary key, name text);
35
+ insert into t_ord values (1, 'b'), (2, 'A'), (3, 'C');
36
+
37
+ -- BINARY: all uppercase sort before lowercase → A, C, b
38
+ select name from t_ord order by name;
39
+ → [{"name":"A"},{"name":"C"},{"name":"b"}]
40
+
41
+ alter table t_ord alter column name set collate nocase;
42
+
43
+ -- NOCASE: case-folded order → A, b, C
44
+ select name from t_ord order by name;
45
+ → [{"name":"A"},{"name":"b"},{"name":"C"}]
46
+
47
+ drop table t_ord;
48
+
49
+ -- ===================================
50
+ -- 3. table_info round-trip; set-back-to-BINARY clears it.
51
+ -- ===================================
52
+
53
+ create table t_ti (id integer primary key, name text);
54
+
55
+ select name, collation from table_info('t_ti') order by cid;
56
+ → [{"name":"id","collation":"BINARY"},{"name":"name","collation":"BINARY"}]
57
+
58
+ alter table t_ti alter column name set collate nocase;
59
+ select name, collation from table_info('t_ti') order by cid;
60
+ → [{"name":"id","collation":"BINARY"},{"name":"name","collation":"NOCASE"}]
61
+
62
+ -- the canonical UPPERCASE spelling round-trips identically
63
+ alter table t_ti alter column name set collate RTRIM;
64
+ select name, collation from table_info('t_ti') order by cid;
65
+ → [{"name":"id","collation":"BINARY"},{"name":"name","collation":"RTRIM"}]
66
+
67
+ -- SET COLLATE BINARY restores the default
68
+ alter table t_ti alter column name set collate binary;
69
+ select name, collation from table_info('t_ti') order by cid;
70
+ → [{"name":"id","collation":"BINARY"},{"name":"name","collation":"BINARY"}]
71
+
72
+ drop table t_ti;
73
+
74
+ -- ===================================
75
+ -- 4. Unknown / unsupported collation rejected (same error shape as CREATE TABLE).
76
+ -- ===================================
77
+
78
+ create table t_bad (id integer primary key, name text);
79
+ -- run
80
+
81
+ alter table t_bad alter column name set collate nosuchcollation;
82
+ -- error: Unknown collation 'nosuchcollation' for type 'TEXT'
83
+
84
+ -- the rejected ALTER left the column untouched
85
+ select name, collation from table_info('t_bad') order by cid;
86
+ → [{"name":"id","collation":"BINARY"},{"name":"name","collation":"BINARY"}]
87
+
88
+ drop table t_bad;
89
+
90
+ -- ===================================
91
+ -- 5. Idempotent: re-applying the same collation is a harmless no-op.
92
+ -- ===================================
93
+
94
+ create table t_idem (id integer primary key, name text);
95
+ insert into t_idem values (1, 'a'), (2, 'B');
96
+ alter table t_idem alter column name set collate nocase;
97
+ alter table t_idem alter column name set collate nocase;
98
+
99
+ select name, collation from table_info('t_idem') order by cid;
100
+ → [{"name":"id","collation":"BINARY"},{"name":"name","collation":"NOCASE"}]
101
+
102
+ select name from t_idem order by name;
103
+ → [{"name":"a"},{"name":"B"}]
104
+
105
+ drop table t_idem;
@@ -0,0 +1,45 @@
1
+ -- ALTER COLUMN ... SET COLLATE — PRIMARY KEY re-key collision (cross-module).
2
+ --
3
+ -- CROSS-MODULE (NOT in MEMORY_ONLY_FILES): runs in both memory and store modes.
4
+ -- Both modules enforce PRIMARY KEY uniqueness/ordering under a PER-COLUMN collation
5
+ -- and re-key the primary structure on an ALTER COLUMN SET COLLATE of a PK member —
6
+ -- memory re-keys its primary tree, the store physically re-encodes its data-store
7
+ -- keys (and rebuilds dependent secondary indexes). So a PK pair distinct under
8
+ -- BINARY but colliding under NOCASE rejects the ALTER with CONSTRAINT on both,
9
+ -- leaving the table unchanged and still BINARY.
10
+ --
11
+ -- The PK column is declared `collate binary` EXPLICITLY: the store's table-level
12
+ -- default key collation K is NOCASE, so an undecorated text PK would be keyed NOCASE
13
+ -- and could not even hold the 'a'/'A' pair. The explicit BINARY declaration is
14
+ -- honored natively by the store's per-column key encoding (ticket
15
+ -- store-pk-collate-physical-rekey), which is what makes this fixture runnable
16
+ -- cross-module. On memory `collate binary` matches its BINARY column default, so the
17
+ -- declaration is a no-op there.
18
+ --
19
+ -- The non-PK UNIQUE / CREATE UNIQUE INDEX sections (identical across both modules)
20
+ -- live in 41.7.2-alter-column-collate-unique-store.sqllogic, which also covers a
21
+ -- divergent PK collation change that is HONORED (re-keyed, non-colliding). The
22
+ -- cross-module query-layer behavior lives in 41.7-alter-column-collate.sqllogic.
23
+
24
+ -- ===================================
25
+ -- 1. PK column collation change re-keys the primary structure; a PK that is
26
+ -- unique under BINARY but collides under NOCASE is rejected, all-or-nothing.
27
+ -- ===================================
28
+
29
+ create table pkc (k text collate binary primary key);
30
+ insert into pkc values ('a'), ('A');
31
+ -- run
32
+
33
+ alter table pkc alter column k set collate nocase;
34
+ -- error: UNIQUE constraint failed
35
+
36
+ -- rollback: both rows survive, column still BINARY (BINARY order: A before a)
37
+ select k from pkc order by k;
38
+ → [{"k":"A"},{"k":"a"}]
39
+
40
+ -- the table is still writable after the failed ALTER
41
+ insert into pkc values ('B');
42
+ select count(*) as n from pkc;
43
+ → [{"n":3}]
44
+
45
+ drop table pkc;
@@ -0,0 +1,208 @@
1
+ -- ALTER COLUMN ... SET COLLATE — cross-module existing-row re-validation.
2
+ --
3
+ -- CROSS-MODULE (NOT in MEMORY_ONLY_FILES): runs in both memory and store modes.
4
+ -- Sections 1-8: a per-column collation change is re-validated against existing rows
5
+ -- for every non-PK UNIQUE constraint covering the altered column (inline / table-level
6
+ -- here; the CREATE UNIQUE INDEX-derived cases are in
7
+ -- 41.7.2.1-alter-column-collate-unique-index-store): a value set distinct under BINARY but colliding under
8
+ -- NOCASE rejects the ALTER with CONSTRAINT (schema unchanged), and a distinct set
9
+ -- succeeds and then enforces under the new collation. The store reaches end-to-end
10
+ -- parity with memory here because the constrained column is row DATA keyed by the
11
+ -- integer PK, so the store's fixed-table-collation KEY encoding is irrelevant — both
12
+ -- modules behave identically.
13
+ --
14
+ -- Section 9: a PRIMARY KEY column's collation change runs cross-module. Both modules
15
+ -- key the PK per-column and re-key the primary structure on SET COLLATE — memory
16
+ -- re-keys its primary tree, the store physically re-encodes its data-store keys and
17
+ -- rebuilds dependent secondary indexes (ticket store-pk-collate-physical-rekey). §9
18
+ -- exercises a NON-colliding divergent change (NOCASE→BINARY) that is HONORED: a
19
+ -- case-distinct PK that NOCASE collapsed now coexists, and ordering/uniqueness follow
20
+ -- BINARY. The COLLIDING divergent case ('a'/'A' under BINARY→NOCASE rejects with
21
+ -- CONSTRAINT, all-or-nothing) lives cross-module in
22
+ -- 41.7.1-alter-column-collate-unique.sqllogic. The cross-module query-layer behavior
23
+ -- lives in 41.7-alter-column-collate.sqllogic.
24
+
25
+ -- ===================================
26
+ -- 1. UNIQUE column, values distinct under BOTH collations → ALTER succeeds, and a
27
+ -- subsequent NOCASE-colliding insert is then rejected under the new collation.
28
+ -- ===================================
29
+
30
+ create table us (id integer primary key, email text unique);
31
+ insert into us values (1, 'a@x'), (2, 'b@x');
32
+
33
+ alter table us alter column email set collate nocase;
34
+ -- run
35
+
36
+ -- the change took effect: a case-only duplicate now collides under NOCASE
37
+ insert into us values (3, 'A@X');
38
+ -- error: UNIQUE constraint failed
39
+
40
+ select id, email from us order by id;
41
+ → [{"id":1,"email":"a@x"},{"id":2,"email":"b@x"}]
42
+
43
+ -- a genuinely distinct value still inserts
44
+ insert into us values (4, 'c@x');
45
+ select id, email from us order by id;
46
+ → [{"id":1,"email":"a@x"},{"id":2,"email":"b@x"},{"id":4,"email":"c@x"}]
47
+
48
+ drop table us;
49
+
50
+ -- ===================================
51
+ -- 2. UNIQUE column, values distinct under BINARY but COLLIDING under NOCASE →
52
+ -- the ALTER is rejected with CONSTRAINT and the table is left unchanged.
53
+ -- ===================================
54
+
55
+ create table uc (id integer primary key, email text unique);
56
+ insert into uc values (1, 'a@x'), (2, 'A@x');
57
+ -- run
58
+
59
+ alter table uc alter column email set collate nocase;
60
+ -- error: UNIQUE constraint failed
61
+
62
+ -- the rejected ALTER rolled back: both rows survive and the column is still BINARY,
63
+ -- so the two case-distinct values remain valid
64
+ select id, email from uc order by id;
65
+ → [{"id":1,"email":"a@x"},{"id":2,"email":"A@x"}]
66
+
67
+ select name, collation from table_info('uc') order by cid;
68
+ → [{"name":"id","collation":"BINARY"},{"name":"email","collation":"BINARY"}]
69
+
70
+ -- and the table is still writable after the failed ALTER
71
+ insert into uc values (3, 'B@x');
72
+ select count(*) as n from uc;
73
+ → [{"n":3}]
74
+
75
+ drop table uc;
76
+
77
+ -- ===================================
78
+ -- 3-4. EXPLICIT `create unique index` (not an inline UNIQUE), re-validated by the
79
+ -- same existing-row scan — rejecting on collision, honoring when distinct.
80
+ -- ===================================
81
+ -- Lives in 41.7.2.1-alter-column-collate-unique-index-store; needs standalone index DDL.
82
+
83
+ -- ===================================
84
+ -- 5. COMPOSITE UNIQUE (a, b) where only member `a`'s collation changes. Each member
85
+ -- is normalized by its OWN column collation: after `a`→NOCASE, rows that differ
86
+ -- only by the case of `a` collide; the still-BINARY `b` keeps distinguishing rows
87
+ -- that differ in `b`'s case.
88
+ -- ===================================
89
+
90
+ -- 5a. distinct under BINARY (a: x vs X), colliding once `a` is NOCASE → ALTER rejected.
91
+ create table cc (id integer primary key, a text, b text, unique (a, b));
92
+ insert into cc values (1, 'x', 'y'), (2, 'X', 'y');
93
+ -- run
94
+
95
+ alter table cc alter column a set collate nocase;
96
+ -- error: UNIQUE constraint failed
97
+
98
+ -- rollback: both rows survive, `a` still BINARY
99
+ select id, a, b from cc order by id;
100
+ → [{"id":1,"a":"x","b":"y"},{"id":2,"a":"X","b":"y"}]
101
+
102
+ drop table cc;
103
+
104
+ -- 5b. `a` differs only by case BUT `b` differs by case too → under (NOCASE a, BINARY b)
105
+ -- the rows stay distinct (b is still BINARY) → ALTER succeeds, and the composite
106
+ -- then enforces with `a` NOCASE / `b` BINARY.
107
+ create table cd (id integer primary key, a text, b text, unique (a, b));
108
+ insert into cd values (1, 'x', 'y'), (2, 'X', 'Y');
109
+
110
+ alter table cd alter column a set collate nocase;
111
+ -- run
112
+
113
+ -- ('x','y') vs ('X','Y'): a collides under NOCASE, b ('y' vs 'Y') still distinguishes → OK
114
+ select id, a, b from cd order by id;
115
+ → [{"id":1,"a":"x","b":"y"},{"id":2,"a":"X","b":"Y"}]
116
+
117
+ -- now a NOCASE-on-a + exact-on-b duplicate collides
118
+ insert into cd values (3, 'X', 'y');
119
+ -- error: UNIQUE constraint failed
120
+
121
+ -- but a row distinguished by b (still BINARY, value distinct from both rows) inserts fine
122
+ insert into cd values (4, 'x', 'z');
123
+ select count(*) as n from cd;
124
+ → [{"n":3}]
125
+
126
+ drop table cd;
127
+
128
+ -- ===================================
129
+ -- 6. PARTIAL unique index — only rows the predicate accepts are re-validated.
130
+ -- ===================================
131
+ -- Lives in 41.7.2.1-alter-column-collate-unique-index-store: a partial UNIQUE can only
132
+ -- be spelled as `create unique index … where …`, so it needs standalone index DDL.
133
+
134
+ -- ===================================
135
+ -- 7. NULL handling — SQL UNIQUE allows multiple NULLs, so existing NULL rows never
136
+ -- count as collisions during the re-validation scan.
137
+ -- ===================================
138
+
139
+ create table nn (id integer primary key, email text null unique);
140
+ insert into nn values (1, null), (2, null), (3, 'a@x');
141
+ -- run
142
+
143
+ alter table nn alter column email set collate nocase;
144
+ -- run
145
+
146
+ select name, collation from table_info('nn') where name = 'email';
147
+ → [{"name":"email","collation":"NOCASE"}]
148
+
149
+ -- multiple NULLs still allowed after the change; a NOCASE duplicate still rejected
150
+ insert into nn values (4, null);
151
+ insert into nn values (5, 'A@X');
152
+ -- error: UNIQUE constraint failed
153
+
154
+ select count(*) as n from nn;
155
+ → [{"n":4}]
156
+
157
+ drop table nn;
158
+
159
+ -- ===================================
160
+ -- 8. NO-OP guard — setting the collation to the value it already has is a no-op that
161
+ -- neither scans nor rejects (re-applying NOCASE after it is already NOCASE), even
162
+ -- when existing rows would collide under some OTHER collation.
163
+ -- ===================================
164
+
165
+ create table nopg (id integer primary key, email text collate nocase unique);
166
+ -- two rows distinct under NOCASE
167
+ insert into nopg values (1, 'a@x'), (2, 'b@x');
168
+ -- run
169
+
170
+ -- idempotent re-apply: already NOCASE → returns the existing schema, no scan
171
+ alter table nopg alter column email set collate nocase;
172
+ -- run
173
+
174
+ select name, collation from table_info('nopg') where name = 'email';
175
+ → [{"name":"email","collation":"NOCASE"}]
176
+
177
+ -- still enforcing NOCASE afterward
178
+ insert into nopg values (3, 'A@X');
179
+ -- error: UNIQUE constraint failed
180
+
181
+ drop table nopg;
182
+
183
+ -- ===================================
184
+ -- 9. PRIMARY KEY column, DIVERGENT collation change (NOCASE → BINARY) is HONORED
185
+ -- cross-module via a physical re-key. The column is declared `collate nocase`
186
+ -- EXPLICITLY so both modules start NOCASE-keyed (the store honors the explicit
187
+ -- NOCASE per-column; memory keys NOCASE too). After re-keying to BINARY a
188
+ -- case-distinct PK that NOCASE collapsed now coexists, and ordering/uniqueness
189
+ -- follow BINARY. (The store re-keys per-column instead of rejecting the divergent
190
+ -- change — ticket store-pk-collate-physical-rekey.)
191
+ -- ===================================
192
+
193
+ create table pkb (k text collate nocase primary key);
194
+ insert into pkb values ('alpha'), ('beta');
195
+
196
+ alter table pkb alter column k set collate binary;
197
+ -- run
198
+
199
+ -- under BINARY a case-distinct value now coexists (it would collide under NOCASE)
200
+ insert into pkb values ('ALPHA');
201
+ select k from pkb order by k;
202
+ → [{"k":"ALPHA"},{"k":"alpha"},{"k":"beta"}]
203
+
204
+ -- an exact-duplicate PK still collides under BINARY
205
+ insert into pkb values ('beta');
206
+ -- error: UNIQUE constraint failed
207
+
208
+ drop table pkb;
@@ -0,0 +1,114 @@
1
+ -- 41.7.2.1-alter-column-collate-unique-index-store.sqllogic
2
+ --
3
+ -- requires-capability: standalone-index-ddl
4
+ --
5
+ -- ALTER COLUMN ... SET COLLATE re-validation where the UNIQUE comes from a standalone
6
+ -- `create unique index`.
7
+ --
8
+ -- CROSS-MODULE (NOT in MEMORY_ONLY_FILES): runs in both memory and store modes, for the
9
+ -- same reason as its parent — the constrained column is row DATA keyed by the integer PK,
10
+ -- so the store's fixed-table-collation KEY encoding is irrelevant.
11
+ --
12
+ -- Carved out of 41.7.2-alter-column-collate-unique-store: sections 1, 2, 5, 7, 8 and 9
13
+ -- there make the same re-validation points (reject on collision, honor when distinct,
14
+ -- composite members, NULLs, no-op guard, PK re-key) with inline / table-level UNIQUE and
15
+ -- need no index DDL. These sections need an explicit index — §1/§2 below because the
16
+ -- constraint is index-derived rather than declared, §3 because a PARTIAL unique
17
+ -- constraint has no declarative spelling in this engine.
18
+ --
19
+ -- Subject: an index-derived UNIQUE (including a partial one) is re-validated by the same
20
+ -- existing-row scan on SET COLLATE, and afterwards enforces under the resulting collation.
21
+
22
+ -- ===================================
23
+ -- 1. EXPLICIT `create unique index` (not an inline UNIQUE) is re-validated by the
24
+ -- same existing-row scan. A value set distinct under BINARY but colliding under
25
+ -- NOCASE rejects the ALTER and rolls back; the table stays writable and the index
26
+ -- keeps enforcing under the original collation.
27
+ -- ===================================
28
+ create table xi (id integer primary key, email text);
29
+ create unique index xi_email on xi(email);
30
+ insert into xi values (1, 'a@x'), (2, 'A@x');
31
+ -- run
32
+
33
+ alter table xi alter column email set collate nocase;
34
+ -- error: UNIQUE constraint failed
35
+
36
+ -- rollback: both rows survive, column still BINARY
37
+ select id, email from xi order by id;
38
+ → [{"id":1,"email":"a@x"},{"id":2,"email":"A@x"}]
39
+
40
+ select name, collation from table_info('xi') order by cid;
41
+ → [{"name":"id","collation":"BINARY"},{"name":"email","collation":"BINARY"}]
42
+
43
+ -- the explicit unique index still enforces (under the original BINARY collation):
44
+ -- a case-distinct value is still allowed, an exact duplicate is rejected.
45
+ insert into xi values (3, 'B@x');
46
+ select count(*) as n from xi;
47
+ → [{"n":3}]
48
+
49
+ insert into xi values (4, 'a@x');
50
+ -- error: UNIQUE constraint failed
51
+
52
+ drop table xi;
53
+
54
+ -- ===================================
55
+ -- 2. EXPLICIT `create unique index`, distinct under BOTH collations → ALTER
56
+ -- succeeds and the index then enforces under the NEW collation.
57
+ -- ===================================
58
+
59
+ create table xj (id integer primary key, email text);
60
+ create unique index xj_email on xj(email);
61
+ insert into xj values (1, 'a@x'), (2, 'b@x');
62
+
63
+ alter table xj alter column email set collate nocase;
64
+ -- run
65
+
66
+ -- the index now enforces under NOCASE: a case-only duplicate collides
67
+ insert into xj values (3, 'A@X');
68
+ -- error: UNIQUE constraint failed
69
+
70
+ select id, email from xj order by id;
71
+ → [{"id":1,"email":"a@x"},{"id":2,"email":"b@x"}]
72
+
73
+ drop table xj;
74
+
75
+ -- ===================================
76
+ -- 3. PARTIAL unique index — only rows the predicate accepts are re-validated. A
77
+ -- case-collision among EXCLUDED rows must NOT block the ALTER; a collision among
78
+ -- INCLUDED rows must.
79
+ -- ===================================
80
+
81
+ -- 3a. the colliding pair is excluded by the predicate → ALTER succeeds.
82
+ create table pp (id integer primary key, code text, active integer);
83
+ create unique index pp_code on pp(code) where active = 1;
84
+ insert into pp values (1, 'a', 0), (2, 'A', 0);
85
+ -- run
86
+
87
+ alter table pp alter column code set collate nocase;
88
+ -- run
89
+
90
+ -- the change took effect and the partial index now enforces NOCASE for active rows
91
+ select name, collation from table_info('pp') where name = 'code';
92
+ → [{"name":"code","collation":"NOCASE"}]
93
+
94
+ insert into pp values (3, 'a', 1);
95
+ insert into pp values (4, 'A', 1);
96
+ -- error: UNIQUE constraint failed
97
+
98
+ drop table pp;
99
+
100
+ -- 3b. the colliding pair is INCLUDED by the predicate → ALTER rejected, rollback.
101
+ create table pq (id integer primary key, code text, active integer);
102
+ create unique index pq_code on pq(code) where active = 1;
103
+ insert into pq values (1, 'a', 1), (2, 'A', 1);
104
+ -- run
105
+
106
+ alter table pq alter column code set collate nocase;
107
+ -- error: UNIQUE constraint failed
108
+
109
+ select name, collation from table_info('pq') where name = 'code';
110
+ → [{"name":"code","collation":"BINARY"}]
111
+
112
+ drop table pq;
113
+
114
+ -- ===================================