@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,99 @@
1
+ -- Write-path scope/attribute collation conformance. Ticket
2
+ -- write-path-scope-collation-conformance. Expressions compiled over a table's
3
+ -- row image (DEFAULT expressions, OR REPLACE NOT NULL default substitution,
4
+ -- RETURNING projections, upsert SET) resolve declared column collations
5
+ -- exactly like a read-path query over the same schema. A literal contributes
6
+ -- no collation, so a declared NOCASE drives the comparison from either side.
7
+ -- Mirrors the CHECK collation section of 40.2-check-extras.
8
+
9
+ -- ===================================
10
+ -- 1. DEFAULT referencing a NOCASE sibling (row-expansion path): the
11
+ -- comparison inside the default resolves the sibling's declared collation.
12
+ -- ===================================
13
+
14
+ create table def_coll (id integer primary key, c text collate nocase, flag text default (case when new.c = 'abc' then 'match' else 'nomatch' end));
15
+ insert into def_coll (id, c) values (1, 'ABC');
16
+ insert into def_coll (id, c) values (2, 'xyz');
17
+ select id, flag from def_coll order by id;
18
+ → [{"id":1,"flag":"match"},{"id":2,"flag":"nomatch"}]
19
+ -- read path agrees: the same comparison matches the case-variant row.
20
+ select count(*) as cnt from def_coll where c = 'abc';
21
+ → [{"cnt":1}]
22
+ drop table def_coll;
23
+
24
+ -- ===================================
25
+ -- 2. OR REPLACE NOT NULL default substitution: the pre-built default plan
26
+ -- (buildNotNullDefaults) resolves the sibling's declared collation too.
27
+ -- ===================================
28
+
29
+ create table def_nn (id integer primary key, c text collate nocase, flag text not null default (case when new.c = 'abc' then 'match' else 'nomatch' end));
30
+ insert or replace into def_nn values (1, 'ABC', null);
31
+ select flag from def_nn where id = 1;
32
+ → [{"flag":"match"}]
33
+ insert or replace into def_nn values (2, 'xyz', null);
34
+ select flag from def_nn where id = 2;
35
+ → [{"flag":"nomatch"}]
36
+ drop table def_nn;
37
+
38
+ -- ===================================
39
+ -- 3. RETURNING comparisons against a NOCASE column (NEW on INSERT/UPDATE,
40
+ -- OLD on DELETE) match the read-path resolution of the same expression.
41
+ -- ===================================
42
+
43
+ create table ret_coll (id integer primary key, c text collate nocase);
44
+ insert into ret_coll values (1, 'ABC') returning c = 'abc' as eq;
45
+ → [{"eq":true}]
46
+ -- read path agrees.
47
+ select c = 'abc' as eq from ret_coll where id = 1;
48
+ → [{"eq":true}]
49
+
50
+ -- UPDATE RETURNING: both row images carry the declared collation, so a
51
+ -- case-variant rewrite still compares equal under NOCASE.
52
+ update ret_coll set c = 'abc' where id = 1 returning old.c = new.c as same;
53
+ → [{"same":true}]
54
+
55
+ -- DELETE RETURNING resolves OLD with the declared collation.
56
+ delete from ret_coll where id = 1 returning c = 'aBc' as eq;
57
+ → [{"eq":true}]
58
+ drop table ret_coll;
59
+
60
+ -- ===================================
61
+ -- 4. Upsert DO UPDATE: the conflicting (existing) row's columns resolve the
62
+ -- declared collation inside SET expressions.
63
+ -- ===================================
64
+
65
+ create table ups_coll (id integer primary key, c text collate nocase, note text null);
66
+ insert into ups_coll values (1, 'ABC', null);
67
+ insert into ups_coll values (1, 'zzz', null)
68
+ on conflict (id) do update set note = case when c = 'abc' then 'was-match' else 'was-nomatch' end;
69
+ select note from ups_coll where id = 1;
70
+ → [{"note":"was-match"}]
71
+ drop table ups_coll;
72
+
73
+ -- ===================================
74
+ -- 5. Foreign-key check scope: the synthesized parent-existence comparison
75
+ -- `parent.k = NEW.ref` resolves the child FK column's declared collation
76
+ -- (declared NOCASE outranks the parent column's defaulted BINARY in the
77
+ -- provenance lattice, mirroring read-path comparison resolution). A
78
+ -- NOCASE child column therefore matches a case-variant parent key, exactly
79
+ -- as a read-path join over the two columns would.
80
+ -- ===================================
81
+
82
+ pragma foreign_keys = true;
83
+ create table fk_parent (k text primary key);
84
+ create table fk_child (id integer primary key, ref text collate nocase references fk_parent(k));
85
+ insert into fk_parent values ('ABC');
86
+ -- Case-variant FK satisfied: NOCASE on the child column drives the parent lookup.
87
+ insert into fk_child values (1, 'abc');
88
+ select count(*) as cnt from fk_child where id = 1;
89
+ → [{"cnt":1}]
90
+ -- read path agrees: the same comparison (parent.k = child.ref, child side
91
+ -- declared NOCASE) matches across the case variance.
92
+ select count(*) as cnt from fk_parent as p join fk_child as c on p.k = c.ref;
93
+ → [{"cnt":1}]
94
+ -- A value with no case-folded parent match is still rejected (FK is enforced).
95
+ insert into fk_child values (2, 'nope');
96
+ -- error:
97
+ drop table fk_child;
98
+ drop table fk_parent;
99
+ pragma foreign_keys = false;
@@ -0,0 +1,342 @@
1
+ -- Comparison collation: provenance-ranked, symmetric resolution. Ticket
2
+ -- comparison-collation-provenance-and-precedence. Each operand contributes
3
+ -- (collation, rank) from its type's provenance: explicit COLLATE (rank 3) >
4
+ -- explicitly-declared column collation (rank 2) > defaulted collation (rank 1;
5
+ -- a defaulted BINARY contributes nothing) > BINARY floor. The highest rank
6
+ -- wins; same-rank explicit/declared conflicts error at prepare time;
7
+ -- same-rank default conflicts resolve to BINARY silently. Resolution is
8
+ -- symmetric — `a = b` and `b = a` always resolve identically — which
9
+ -- deliberately diverges from SQLite's left-operand precedence (docs/types.md
10
+ -- § Comparison collation resolution). IS [NOT] is parsed only in its unary
11
+ -- NULL/TRUE/FALSE forms, so binary IS never reaches comparison resolution.
12
+
13
+ -- =============================================================================
14
+ -- 1. Headline: declared NOCASE vs defaulted BINARY resolves NOCASE from
15
+ -- EITHER side (the defaulted BINARY of a plain column contributes nothing).
16
+ -- =============================================================================
17
+
18
+ create table t_dn (id integer primary key, b text, c text collate nocase);
19
+ insert into t_dn values (1, 'Bob', 'bob'), (2, 'xyz', 'zzz');
20
+
21
+ select id from t_dn where b = c;
22
+ → [{"id":1}]
23
+
24
+ -- flipped spelling: identical resolution (previously BINARY → no rows).
25
+ select id from t_dn where c = b;
26
+ → [{"id":1}]
27
+
28
+ -- ordering comparisons resolve through the same lattice.
29
+ select id from t_dn where b <= c order by id;
30
+ → [{"id":1},{"id":2}]
31
+ select id from t_dn where c >= b order by id;
32
+ → [{"id":1},{"id":2}]
33
+
34
+ -- =============================================================================
35
+ -- 2. explicit vs explicit: same name fine; different names error (both
36
+ -- spellings, and for ordering operators too); errors fire even for
37
+ -- statically non-textual operands (consistent strictness).
38
+ -- =============================================================================
39
+
40
+ select id from t_dn where b collate nocase = c collate nocase;
41
+ → [{"id":1}]
42
+
43
+ select id from t_dn where b collate nocase = c collate rtrim;
44
+ -- error: conflicting COLLATE clauses
45
+
46
+ select id from t_dn where c collate rtrim = b collate nocase;
47
+ -- error: conflicting COLLATE clauses
48
+
49
+ select id from t_dn where b collate rtrim < c collate nocase;
50
+ -- error: conflicting COLLATE clauses
51
+
52
+ select id from t_dn where id collate nocase = id collate rtrim;
53
+ -- error: conflicting COLLATE clauses
54
+
55
+ -- =============================================================================
56
+ -- 3. explicit BINARY (rank 3) beats declared NOCASE (rank 2): `collate binary`
57
+ -- is a real demand, not the absence of one.
58
+ -- =============================================================================
59
+
60
+ select id from t_dn where c = 'BOB';
61
+ → [{"id":1}]
62
+
63
+ select id from t_dn where c = 'BOB' collate binary;
64
+ → []
65
+
66
+ select id from t_dn where 'BOB' collate binary = c;
67
+ → []
68
+
69
+ -- =============================================================================
70
+ -- 4. declared vs declared: same name fine; different names are a prepare-time
71
+ -- error (both spellings); an explicit COLLATE disambiguates; a declared
72
+ -- `collate binary` column counts at rank 2 (conflicts with declared NOCASE)
73
+ -- while declared-binary vs plain resolves BINARY with no error.
74
+ -- =============================================================================
75
+
76
+ create table t_dd (id integer primary key, n1 text collate nocase, n2 text collate nocase, r text collate rtrim, bb text collate binary, p text);
77
+ insert into t_dd values (1, 'Ann', 'ANN', 'x ', 'q', 'Q');
78
+
79
+ select id from t_dd where n1 = n2;
80
+ → [{"id":1}]
81
+
82
+ select id from t_dd where n1 = r;
83
+ -- error: ambiguous collation
84
+
85
+ select id from t_dd where r = n1;
86
+ -- error: ambiguous collation
87
+
88
+ -- rank 3 outranks the conflicted pair.
89
+ select id from t_dd where n1 = r collate binary;
90
+ → []
91
+
92
+ -- declared BINARY vs declared NOCASE: a real rank-2 conflict.
93
+ select id from t_dd where bb = n1;
94
+ -- error: ambiguous collation
95
+
96
+ -- declared BINARY vs plain (defaulted) column: BINARY, silently. 'q' vs 'Q'
97
+ -- proves the comparison is BINARY (NOCASE would match).
98
+ select id from t_dd where bb = p;
99
+ → []
100
+ select id from t_dd where p = bb;
101
+ → []
102
+
103
+ drop table t_dd;
104
+
105
+ -- =============================================================================
106
+ -- 5. The error fires wherever the comparison compiles. CHECK predicates
107
+ -- compile when the enforcing DML plans (constraint-builder), so the
108
+ -- conflict surfaces at the first write against the table; WHERE-clause
109
+ -- conflicts surface at that statement's prepare. (The FK variant now also
110
+ -- validates at CREATE/ALTER — see § 10 and 41.1-fk-collation-conflict —
111
+ -- but CREATE-time detection of a conflicted CHECK is still unimplemented,
112
+ -- so a conflicted CHECK remains caught at the first write below.)
113
+ -- =============================================================================
114
+
115
+ create table t_chk_conflict (id integer primary key, a text collate nocase, b text collate rtrim, check (a = b));
116
+ insert into t_chk_conflict values (1, 'x', 'x');
117
+ -- error: ambiguous collation
118
+ drop table t_chk_conflict;
119
+
120
+ create table t_dml_conf (id integer primary key, a text collate nocase, b text collate rtrim);
121
+ insert into t_dml_conf values (1, 'x', 'x');
122
+ update t_dml_conf set a = 'y' where a = b;
123
+ -- error: ambiguous collation
124
+ drop table t_dml_conf;
125
+
126
+ -- =============================================================================
127
+ -- 6. Defaulted collations are preferences: a defaulted non-BINARY collation
128
+ -- wins over a defaulted BINARY, but two DIFFERENT defaulted collations
129
+ -- resolve to BINARY silently (no error). Tables created under different
130
+ -- session defaults.
131
+ -- =============================================================================
132
+
133
+ pragma default_collation='nocase';
134
+ create table t_def_nc (id integer primary key, v text);
135
+ pragma default_collation='rtrim';
136
+ create table t_def_rt (id integer primary key, w text);
137
+ pragma default_collation='binary';
138
+ create table t_def_b (id integer primary key, u text);
139
+
140
+ -- 'Bob'/'bob' would match under NOCASE; 'bob '/'bob' would match under RTRIM;
141
+ -- neither matches under BINARY — so 0 proves the defaults-conflict → BINARY rule.
142
+ insert into t_def_nc values (1, 'Bob'), (2, 'bob ');
143
+ insert into t_def_rt values (1, 'bob');
144
+ select count(*) as cnt from t_def_nc join t_def_rt on v = w;
145
+ → [{"cnt":0}]
146
+ select count(*) as cnt from t_def_rt join t_def_nc on w = v;
147
+ → [{"cnt":0}]
148
+
149
+ -- defaulted NOCASE vs defaulted BINARY: NOCASE wins (rank-1 BINARY contributes
150
+ -- nothing), from either side.
151
+ insert into t_def_b values (1, 'BOB');
152
+ select count(*) as cnt from t_def_nc join t_def_b on v = u;
153
+ → [{"cnt":1}]
154
+ select count(*) as cnt from t_def_b join t_def_nc on u = v;
155
+ → [{"cnt":1}]
156
+
157
+ drop table t_def_nc;
158
+ drop table t_def_rt;
159
+ drop table t_def_b;
160
+
161
+ -- =============================================================================
162
+ -- 7. Propagation through concat: provenance rides through `||` by rank; a
163
+ -- plain operand's defaulted BINARY no longer shadows a declared collation
164
+ -- on the other side, and a concat of two DIFFERENT declared collations
165
+ -- propagates no collation — the comparison falls back to BINARY.
166
+ -- =============================================================================
167
+
168
+ create table t_cc (id integer primary key, b text, c text collate nocase, r text collate rtrim);
169
+ insert into t_cc values (1, 'B', 'ob', 'OB');
170
+
171
+ -- declared NOCASE survives concat with a plain operand (previously the plain
172
+ -- side's defaulted BINARY shadowed it).
173
+ select count(*) as cnt from t_cc where b || c = 'bOB';
174
+ → [{"cnt":1}]
175
+
176
+ -- explicit COLLATE nested inside an operand propagates rank 3 through concat.
177
+ select count(*) as cnt from t_cc where (b collate nocase) || c = 'bOB';
178
+ → [{"cnt":1}]
179
+
180
+ -- concat-laundered declared conflict: no collation propagates; the comparison
181
+ -- is BINARY ('obOB' matches byte-exactly, the NOCASE-variant does not).
182
+ select count(*) as cnt from t_cc where c || r = 'obOB';
183
+ → [{"cnt":1}]
184
+ select count(*) as cnt from t_cc where c || r = 'OBob';
185
+ → [{"cnt":0}]
186
+
187
+ drop table t_cc;
188
+
189
+ -- =============================================================================
190
+ -- 8. BETWEEN: each bound is an independent comparison. Two differently-
191
+ -- collated explicit bounds are NOT a conflict with each other; a
192
+ -- declared-vs-declared conflict on ONE bound errors; NOT BETWEEN takes the
193
+ -- same path; an explicit COLLATE on the conflicted bound disambiguates.
194
+ -- =============================================================================
195
+
196
+ create table t_bt (id integer primary key, v text);
197
+ insert into t_bt values (1, 'm');
198
+
199
+ select id from t_bt where v between 'M' collate nocase and 'z ' collate rtrim;
200
+ → [{"id":1}]
201
+
202
+ drop table t_bt;
203
+
204
+ create table t_bt2 (id integer primary key, v text collate nocase, lo text collate rtrim);
205
+ insert into t_bt2 values (1, 'm', 'a');
206
+
207
+ select id from t_bt2 where v between lo and 'z';
208
+ -- error: ambiguous collation
209
+
210
+ select id from t_bt2 where v not between lo and 'z';
211
+ -- error: ambiguous collation
212
+
213
+ select id from t_bt2 where v between lo collate binary and 'z';
214
+ → [{"id":1}]
215
+
216
+ drop table t_bt2;
217
+
218
+ -- =============================================================================
219
+ -- 9. IN: the condition and every RHS value resolve to ONE collation through
220
+ -- the lattice. A declared-NOCASE element drives a plain condition; element
221
+ -- contributions conflict like operands; a subquery RHS contributes its
222
+ -- output column's collation.
223
+ -- =============================================================================
224
+
225
+ create table t_in (id integer primary key, a text, n text collate nocase);
226
+ insert into t_in values (1, 'BOB', 'bob');
227
+
228
+ -- condition declared NOCASE with a literal list: NOCASE (unchanged).
229
+ select id from t_in where n in ('BOB', 'x');
230
+ → [{"id":1}]
231
+
232
+ -- plain condition, declared-NOCASE element: NOCASE (new symmetric behavior;
233
+ -- previously the condition's defaulted BINARY drove the comparison).
234
+ select id from t_in where a in (n);
235
+ → [{"id":1}]
236
+
237
+ -- NOT IN resolves identically.
238
+ select id from t_in where a not in (n);
239
+ → []
240
+
241
+ -- list elements with conflicting explicit collations: error.
242
+ select id from t_in where a in ('x' collate nocase, 'y' collate rtrim);
243
+ -- error: conflicting COLLATE clauses
244
+
245
+ -- subquery RHS: declared-NOCASE output column vs plain condition → NOCASE.
246
+ create table t_in_src (v text collate nocase);
247
+ insert into t_in_src values ('bob');
248
+ select id from t_in where a in (select v from t_in_src);
249
+ → [{"id":1}]
250
+ drop table t_in_src;
251
+
252
+ -- condition and element with conflicting declared collations: error.
253
+ create table t_in2 (id integer primary key, n text collate nocase, r text collate rtrim);
254
+ insert into t_in2 values (1, 'x', 'x');
255
+ select id from t_in2 where n in (r);
256
+ -- error: ambiguous collation
257
+ drop table t_in2;
258
+
259
+ drop table t_in;
260
+ drop table t_dn;
261
+
262
+ -- =============================================================================
263
+ -- 10. FK with parent and child declaring DIFFERENT explicit collations: the
264
+ -- conflict is now rejected at CREATE TABLE (declaration time) through the
265
+ -- same lattice the synthesized parent-existence comparison uses — no longer
266
+ -- deferred to the first DML. Ticket fk-collation-conflict-create-time-
267
+ -- validation. (The DML-time error remains the residual for a forward-
268
+ -- declared parent; that path is covered in 41.1-fk-collation-conflict.)
269
+ -- =============================================================================
270
+
271
+ pragma foreign_keys = true;
272
+ create table fkp_conf (k text collate rtrim primary key);
273
+ create table fkc_conf (id integer primary key, ref text collate nocase references fkp_conf(k));
274
+ -- error: conflicting collations
275
+ drop table fkp_conf;
276
+ pragma foreign_keys = false;
277
+
278
+ -- =============================================================================
279
+ -- 11. SET COLLATE provenance (ticket collation-provenance-stability-set-collate-
280
+ -- and-reload). `ALTER COLUMN ... SET COLLATE` is a user declaration with the
281
+ -- same standing as a CREATE-time COLLATE clause: it marks the collation
282
+ -- explicit (rank 2 'declared') regardless of the column's creation history,
283
+ -- so the rank is a function of the current catalog column, not its past.
284
+ -- Runs under BOTH memory and store (SET COLLATE re-registers the schema on
285
+ -- each — see the 41.7 header). The same statement that previously diverged
286
+ -- (rank 1 vs rank 2 depending on whether the column happened to be created
287
+ -- with a COLLATE clause) now resolves identically.
288
+ -- =============================================================================
289
+
290
+ -- 11a. The reproduced bug, now fixed: SET COLLATE NOCASE on a column created
291
+ -- WITHOUT a COLLATE clause vs a declared RTRIM column ⇒ rank-2 vs rank-2,
292
+ -- ambiguous-collation error (was silently RTRIM — rank-1 lost to rank-2).
293
+ create table sc_r1 (id integer primary key, v text, r text collate rtrim);
294
+ insert into sc_r1 values (1, 'xx', 'xx');
295
+ alter table sc_r1 alter column v set collate nocase;
296
+ select id from sc_r1 where v = r;
297
+ -- error: ambiguous collation
298
+ drop table sc_r1;
299
+
300
+ -- 11b. History independence: the SAME SET COLLATE NOCASE statement on a column
301
+ -- created WITH `collate binary` yields the identical rank-2 result — the
302
+ -- same ambiguous-collation error against a declared RTRIM column. The rank
303
+ -- follows the current column, not whether it was once created with COLLATE.
304
+ create table sc_r1b (id integer primary key, v text collate binary, r text collate rtrim);
305
+ insert into sc_r1b values (1, 'xx', 'xx');
306
+ alter table sc_r1b alter column v set collate nocase;
307
+ select id from sc_r1b where v = r;
308
+ -- error: ambiguous collation
309
+ drop table sc_r1b;
310
+
311
+ -- 11c. SET COLLATE NOCASE on a plain column vs a declared BINARY column: a real
312
+ -- rank-2 vs rank-2 conflict (declared `collate binary` contributes at rank
313
+ -- 2), ambiguous-collation error.
314
+ create table sc_db (id integer primary key, v text, b text collate binary);
315
+ insert into sc_db values (1, 'xx', 'xx');
316
+ alter table sc_db alter column v set collate nocase;
317
+ select id from sc_db where v = b;
318
+ -- error: ambiguous collation
319
+ drop table sc_db;
320
+
321
+ -- 11d. SET COLLATE NOCASE on a plain column vs another plain (defaulted-BINARY)
322
+ -- column: rank-2 NOCASE wins over the rank-1 BINARY that contributes
323
+ -- nothing, so the comparison resolves NOCASE and the case-folded row matches.
324
+ create table sc_p (id integer primary key, v text, p text);
325
+ insert into sc_p values (1, 'AB', 'ab'), (2, 'xy', 'zz');
326
+ alter table sc_p alter column v set collate nocase;
327
+ select id from sc_p where v = p;
328
+ → [{"id":1}]
329
+ drop table sc_p;
330
+
331
+ -- 11e. SET COLLATE binary is rank 2 too (a real BINARY demand, not the absence of
332
+ -- one): on a defaulted-BINARY column it flips the column explicit, so a
333
+ -- conflict against a declared NOCASE column is an ambiguous-collation error
334
+ -- in-session (was silently NOCASE — rank-1 defaulted BINARY lost to rank-2).
335
+ -- This pins the "consistency argues yes" decision; no reopen assertion (the
336
+ -- flag does not survive a store reload, by design — BINARY DDL is elided).
337
+ create table sc_bin (id integer primary key, v text, n text collate nocase);
338
+ insert into sc_bin values (1, 'xx', 'xx');
339
+ alter table sc_bin alter column v set collate binary;
340
+ select id from sc_bin where v = n;
341
+ -- error: ambiguous collation
342
+ drop table sc_bin;
@@ -0,0 +1,92 @@
1
+ -- 06.4.5-any-collate-declared-keys.sqllogic
2
+ --
3
+ -- requires-capability: standalone-index-ddl
4
+ --
5
+ -- Subject: a declared COLLATE on an `any` column is honored by declared-key
6
+ -- structures (the PK BTree, secondary indexes) exactly as the generic comparison
7
+ -- path honors it (ticket any-type-compare-honors-collation): `ANY_TYPE.compare`
8
+ -- applies the collation it is handed, so creating an index never changes a
9
+ -- query's answer, and PK/UNIQUE enforcement agrees with the identity that
10
+ -- DISTINCT / GROUP BY / IN already use. Each section pins the before-index
11
+ -- answer as the oracle and asserts the after-index answer equals it.
12
+
13
+ -- Case 1: equality and range answers must not move when an index appears.
14
+ create table t1 (id integer primary key, v any collate nocase);
15
+ insert into t1 values (1, 'Bob'), (2, 'zed');
16
+ select id from t1 where v = 'BOB';
17
+ → [{"id":1}]
18
+ select id from t1 where v > 'a' order by id;
19
+ → [{"id":1},{"id":2}]
20
+ create index ix1 on t1 (v);
21
+ select id from t1 where v = 'BOB';
22
+ → [{"id":1}]
23
+ select id from t1 where v > 'a' order by id;
24
+ → [{"id":1},{"id":2}]
25
+ drop table t1;
26
+
27
+ -- Case 2: an index that supplies ORDER BY must reproduce the NOCASE order
28
+ -- (A, b, C), not BINARY byte order (A, C, b).
29
+ create table t2 (id integer primary key, v any collate nocase);
30
+ insert into t2 values (1, 'b'), (2, 'A'), (3, 'C');
31
+ select id from t2 order by v;
32
+ → [{"id":2},{"id":1},{"id":3}]
33
+ create index ix2 on t2 (v);
34
+ select id from t2 order by v;
35
+ → [{"id":2},{"id":1},{"id":3}]
36
+ drop table t2;
37
+
38
+ -- Case 3: an index COLLATE over an undecorated `any` column must be keyed under
39
+ -- that collation — the cover analysis serves the NOCASE demand from it.
40
+ create table t3 (id integer primary key, v any);
41
+ insert into t3 values (1, 'Bob'), (2, 'zed');
42
+ select id from t3 where v = 'BOB' collate nocase;
43
+ → [{"id":1}]
44
+ create index ix3 on t3 (v collate nocase);
45
+ select id from t3 where v = 'BOB' collate nocase;
46
+ → [{"id":1}]
47
+ -- The column itself still compares BINARY when no collation is demanded.
48
+ select id from t3 where v = 'BOB';
49
+ → []
50
+ drop table t3;
51
+
52
+ -- Case 4: PK and UNIQUE enforce under the declared collation — the same
53
+ -- identity DISTINCT already collapses (a dup DISTINCT merges must not be
54
+ -- admitted by UNIQUE).
55
+ create table pk4 (k any collate nocase primary key, n integer);
56
+ insert into pk4 values ('Bob', 1);
57
+ insert into pk4 values ('BOB', 2);
58
+ -- error: UNIQUE constraint failed
59
+ select n from pk4 where k = 'BOB';
60
+ → [{"n":1}]
61
+ drop table pk4;
62
+
63
+ create table u4 (id integer primary key, v any collate nocase, unique (v));
64
+ insert into u4 values (1, 'Bob');
65
+ insert into u4 values (2, 'BOB');
66
+ -- error: UNIQUE constraint failed
67
+ select count(*) as cnt from u4;
68
+ → [{"cnt":1}]
69
+ insert into u4 values (3, 'zed');
70
+ select count(distinct v) as dv from u4;
71
+ → [{"dv":2}]
72
+ drop table u4;
73
+
74
+ -- Case 5: the identity paths — row DISTINCT, GROUP BY, aggregate DISTINCT, min/max
75
+ -- — all collapse case variants of an `any collate nocase` column, and an index does
76
+ -- not move any of those answers either.
77
+ create table t5 (id integer primary key, v any collate nocase);
78
+ insert into t5 values (1, 'Bob'), (2, 'BOB'), (3, 'zed');
79
+ select distinct v from t5 order by v;
80
+ → [{"v":"Bob"},{"v":"zed"}]
81
+ select v, count(*) as n from t5 group by v order by v;
82
+ → [{"v":"Bob","n":2},{"v":"zed","n":1}]
83
+ select count(distinct v) as dv, min(v) as lo, max(v) as hi from t5;
84
+ → [{"dv":2,"lo":"Bob","hi":"zed"}]
85
+ create index ix5 on t5 (v);
86
+ select distinct v from t5 order by v;
87
+ → [{"v":"Bob"},{"v":"zed"}]
88
+ select v, count(*) as n from t5 group by v order by v;
89
+ → [{"v":"Bob","n":2},{"v":"zed","n":1}]
90
+ select count(distinct v) as dv, min(v) as lo, max(v) as hi from t5;
91
+ → [{"dv":2,"lo":"Bob","hi":"zed"}]
92
+ drop table t5;