@quereus/quereus 4.20.1 → 4.20.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (377) hide show
  1. package/README.md +2 -0
  2. package/package.json +7 -4
  3. package/test/README.md +173 -0
  4. package/test/logic/01-basic.sqllogic +39 -0
  5. package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
  6. package/test/logic/01.2-strings.sqllogic +43 -0
  7. package/test/logic/01.5-insert-select.sqllogic +237 -0
  8. package/test/logic/01.6-update-extras.sqllogic +118 -0
  9. package/test/logic/01.7-update-from.sqllogic +67 -0
  10. package/test/logic/01.8-delete-extras.sqllogic +122 -0
  11. package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
  12. package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
  13. package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
  14. package/test/logic/01.9-query-expr-values.sqllogic +111 -0
  15. package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
  16. package/test/logic/02-filters.sqllogic +54 -0
  17. package/test/logic/02-smoke.sqllogic +62 -0
  18. package/test/logic/02.1-bind-parameters.sqllogic +223 -0
  19. package/test/logic/03-expressions.sqllogic +190 -0
  20. package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
  21. package/test/logic/03.4-defaults.sqllogic +554 -0
  22. package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
  23. package/test/logic/03.5-tvf.sqllogic +61 -0
  24. package/test/logic/03.6-type-system.sqllogic +544 -0
  25. package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
  26. package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
  27. package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
  28. package/test/logic/03.8-not-precedence.sqllogic +255 -0
  29. package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
  30. package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
  31. package/test/logic/04-order-by.sqllogic +38 -0
  32. package/test/logic/04-transactions.sqllogic +239 -0
  33. package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
  34. package/test/logic/05-vtab_memory.sqllogic +50 -0
  35. package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
  36. package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
  37. package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
  38. package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
  39. package/test/logic/06-builtin_functions.sqllogic +149 -0
  40. package/test/logic/06.1-string-functions.sqllogic +92 -0
  41. package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
  42. package/test/logic/06.2-math-functions.sqllogic +82 -0
  43. package/test/logic/06.3-schema.sqllogic +48 -0
  44. package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
  45. package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
  46. package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
  47. package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
  48. package/test/logic/06.3.4-view-info.sqllogic +378 -0
  49. package/test/logic/06.3.5-column-info.sqllogic +347 -0
  50. package/test/logic/06.3.6-schema-views.sqllogic +29 -0
  51. package/test/logic/06.4-schema-search-path.sqllogic +354 -0
  52. package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
  53. package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
  54. package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
  55. package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
  56. package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
  57. package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
  58. package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
  59. package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
  60. package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
  61. package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
  62. package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
  63. package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
  64. package/test/logic/06.7-json-extended.sqllogic +53 -0
  65. package/test/logic/06.8-json-path-operators.sqllogic +99 -0
  66. package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
  67. package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
  68. package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
  69. package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
  70. package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
  71. package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
  72. package/test/logic/07-aggregates.sqllogic +193 -0
  73. package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
  74. package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
  75. package/test/logic/07.3-group-by-extras.sqllogic +602 -0
  76. package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
  77. package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
  78. package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
  79. package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
  80. package/test/logic/07.5-window.sqllogic +1941 -0
  81. package/test/logic/07.5.1-window-named.sqllogic +13 -0
  82. package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
  83. package/test/logic/07.6-subqueries.sqllogic +78 -0
  84. package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
  85. package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
  86. package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
  87. package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
  88. package/test/logic/07.7.1-in-extras.sqllogic +158 -0
  89. package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
  90. package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
  91. package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
  92. package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
  93. package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
  94. package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
  95. package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
  96. package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
  97. package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
  98. package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
  99. package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
  100. package/test/logic/07.9-in-value-list.sqllogic +154 -0
  101. package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
  102. package/test/logic/08-views.sqllogic +64 -0
  103. package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
  104. package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
  105. package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
  106. package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
  107. package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
  108. package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
  109. package/test/logic/09-set_operations.sqllogic +244 -0
  110. package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
  111. package/test/logic/10-distinct_datatypes.sqllogic +127 -0
  112. package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
  113. package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
  114. package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
  115. package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
  116. package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
  117. package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
  118. package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
  119. package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
  120. package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
  121. package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
  122. package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
  123. package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
  124. package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
  125. package/test/logic/10.2-column-features.sqllogic +365 -0
  126. package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
  127. package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
  128. package/test/logic/10.3-function-features.sqllogic +247 -0
  129. package/test/logic/10.4-schema-scale.sqllogic +168 -0
  130. package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
  131. package/test/logic/10.5-indexes.sqllogic +164 -0
  132. package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
  133. package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
  134. package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
  135. package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
  136. package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
  137. package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
  138. package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
  139. package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
  140. package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
  141. package/test/logic/100.1-where-extras.sqllogic +163 -0
  142. package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
  143. package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
  144. package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
  145. package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
  146. package/test/logic/102-unique-constraints.sqllogic +145 -0
  147. package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
  148. package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
  149. package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
  150. package/test/logic/102.2-unique-collation.sqllogic +181 -0
  151. package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
  152. package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
  153. package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
  154. package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
  155. package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
  156. package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
  157. package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
  158. package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
  159. package/test/logic/108-cardinality-estimation.sqllogic +146 -0
  160. package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
  161. package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
  162. package/test/logic/11-joins.sqllogic +86 -0
  163. package/test/logic/11.1-join-using.sqllogic +267 -0
  164. package/test/logic/11.2-comma-join.sqllogic +35 -0
  165. package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
  166. package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
  167. package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
  168. package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
  169. package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
  170. package/test/logic/12-empty-primary-key.sqllogic +124 -0
  171. package/test/logic/12-join_padding_order.sqllogic +58 -0
  172. package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
  173. package/test/logic/13-cte.sqllogic +137 -0
  174. package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
  175. package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
  176. package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
  177. package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
  178. package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
  179. package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
  180. package/test/logic/13.4-cte-extras.sqllogic +98 -0
  181. package/test/logic/13.5-cte-join-order.sqllogic +166 -0
  182. package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
  183. package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
  184. package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
  185. package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
  186. package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
  187. package/test/logic/14-utilities.sqllogic +168 -0
  188. package/test/logic/15-timespan.sqllogic +279 -0
  189. package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
  190. package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
  191. package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
  192. package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
  193. package/test/logic/16-epoch.sqllogic +187 -0
  194. package/test/logic/17-weekday-modifier.sqllogic +78 -0
  195. package/test/logic/18-json-string-escapes.sqllogic +86 -0
  196. package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
  197. package/test/logic/20-empty-single-row.sqllogic +261 -0
  198. package/test/logic/21-null-edge-cases.sqllogic +227 -0
  199. package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
  200. package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
  201. package/test/logic/21.2-between-edges.sqllogic +157 -0
  202. package/test/logic/22-boundary-values.sqllogic +175 -0
  203. package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
  204. package/test/logic/24-builtin-branches.sqllogic +611 -0
  205. package/test/logic/24.1-substr-extras.sqllogic +75 -0
  206. package/test/logic/24.2-random-extras.sqllogic +39 -0
  207. package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
  208. package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
  209. package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
  210. package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
  211. package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
  212. package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
  213. package/test/logic/26-join-edge-cases.sqllogic +333 -0
  214. package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
  215. package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
  216. package/test/logic/26.3-join-on-constants.sqllogic +61 -0
  217. package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
  218. package/test/logic/27-window-edge-cases.sqllogic +206 -0
  219. package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
  220. package/test/logic/27.2-window-exclude.sqllogic +13 -0
  221. package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
  222. package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
  223. package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
  224. package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
  225. package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
  226. package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
  227. package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
  228. package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
  229. package/test/logic/40-constraints.sqllogic +418 -0
  230. package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
  231. package/test/logic/40.2-check-extras.sqllogic +683 -0
  232. package/test/logic/41-alter-table.sqllogic +191 -0
  233. package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
  234. package/test/logic/41-fk-cross-schema.sqllogic +155 -0
  235. package/test/logic/41-fk-extended-targets.sqllogic +173 -0
  236. package/test/logic/41-foreign-keys.sqllogic +1001 -0
  237. package/test/logic/41-generated-column-errors.sqllogic +225 -0
  238. package/test/logic/41-generated-column-extras.sqllogic +598 -0
  239. package/test/logic/41-generated-column-scope.sqllogic +329 -0
  240. package/test/logic/41-generated-columns.sqllogic +361 -0
  241. package/test/logic/41.1-alter-pk.sqllogic +230 -0
  242. package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
  243. package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
  244. package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
  245. package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
  246. package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
  247. package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
  248. package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
  249. package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
  250. package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
  251. package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
  252. package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
  253. package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
  254. package/test/logic/41.2-alter-column.sqllogic +382 -0
  255. package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
  256. package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
  257. package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
  258. package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
  259. package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
  260. package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
  261. package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
  262. package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
  263. package/test/logic/41.5-alter-misc.sqllogic +48 -0
  264. package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
  265. package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
  266. package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
  267. package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
  268. package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
  269. package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
  270. package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
  271. package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
  272. package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
  273. package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
  274. package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
  275. package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
  276. package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
  277. package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
  278. package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
  279. package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
  280. package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
  281. package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
  282. package/test/logic/42-committed-snapshot.sqllogic +254 -0
  283. package/test/logic/42-returning.sqllogic +159 -0
  284. package/test/logic/42.1-returning-extras.sqllogic +232 -0
  285. package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
  286. package/test/logic/43-default-nullability.sqllogic +131 -0
  287. package/test/logic/43-transition-constraints.sqllogic +341 -0
  288. package/test/logic/43.1-default-collation.sqllogic +140 -0
  289. package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
  290. package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
  291. package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
  292. package/test/logic/44-determinism-validation.sqllogic +164 -0
  293. package/test/logic/44-orthogonality.sqllogic +146 -0
  294. package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
  295. package/test/logic/45-udf-determinism.sqllogic +39 -0
  296. package/test/logic/46-mutation-context.sqllogic +595 -0
  297. package/test/logic/47-upsert.sqllogic +255 -0
  298. package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
  299. package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
  300. package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
  301. package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
  302. package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
  303. package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
  304. package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
  305. package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
  306. package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
  307. package/test/logic/49-reference-graph.sqllogic +84 -0
  308. package/test/logic/50-declarative-schema.sqllogic +2550 -0
  309. package/test/logic/50-metadata-tags.sqllogic +1033 -0
  310. package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
  311. package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
  312. package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
  313. package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +173 -0
  314. package/test/logic/50.3-declare-schema-duplicate-names.sqllogic +280 -0
  315. package/test/logic/50.4-declare-schema-apply-restore.sqllogic +192 -0
  316. package/test/logic/51-lens-foundation.sqllogic +147 -0
  317. package/test/logic/51-materialized-views.sqllogic +376 -0
  318. package/test/logic/51.5-materialized-views-coarsened-key.sqllogic +198 -0
  319. package/test/logic/51.7-maintained-table-attach-detach.sqllogic +468 -0
  320. package/test/logic/51.8-maintained-table-declared-constraints.sqllogic +440 -0
  321. package/test/logic/51.85-maintained-table-parent-fk.sqllogic +103 -0
  322. package/test/logic/51.9-maintained-table-secondary-unique.sqllogic +237 -0
  323. package/test/logic/51.9.1-maintained-table-partial-unique.sqllogic +36 -0
  324. package/test/logic/52-lens-overrides.sqllogic +566 -0
  325. package/test/logic/53-materialized-views-rowtime.sqllogic +1601 -0
  326. package/test/logic/53-reserved-tags.sqllogic +252 -0
  327. package/test/logic/53.1-materialized-view-write-through.sqllogic +329 -0
  328. package/test/logic/53.2-materialized-view-rename-propagation.sqllogic +483 -0
  329. package/test/logic/53.3-materialized-view-constraint-only-ddl.sqllogic +409 -0
  330. package/test/logic/53.3.1-materialized-view-index-ddl-irrelevance.sqllogic +29 -0
  331. package/test/logic/53.4-materialized-view-structural-alter-restore.sqllogic +436 -0
  332. package/test/logic/54-covering-mv-enforcement.sqllogic +314 -0
  333. package/test/logic/54.1-covering-mv-partial-enforcement.sqllogic +34 -0
  334. package/test/logic/55-internal-eviction-reporting.sqllogic +89 -0
  335. package/test/logic/55-lens-prover.sqllogic +202 -0
  336. package/test/logic/55.1-eviction-restrict-fk.sqllogic +148 -0
  337. package/test/logic/55.5-lens-authored-inverse.sqllogic +1468 -0
  338. package/test/logic/80-grow-retrieve-pass.sqllogic +79 -0
  339. package/test/logic/81-quickpick.sqllogic +24 -0
  340. package/test/logic/82-bloom-join.sqllogic +185 -0
  341. package/test/logic/83-merge-join.sqllogic +280 -0
  342. package/test/logic/84-asof-scan.sqllogic +238 -0
  343. package/test/logic/84-key-cardinality.sqllogic +50 -0
  344. package/test/logic/85-relational-const-folding.sqllogic +51 -0
  345. package/test/logic/86-scalar-cse.sqllogic +42 -0
  346. package/test/logic/90-error_paths.sqllogic +114 -0
  347. package/test/logic/90.1-parse-errors.sqllogic +77 -0
  348. package/test/logic/90.2-alter-table-errors.sqllogic +53 -0
  349. package/test/logic/90.2.1-alter-extra-errors.sqllogic +51 -0
  350. package/test/logic/90.3-expression-errors.sqllogic +43 -0
  351. package/test/logic/90.4-dml-errors.sqllogic +47 -0
  352. package/test/logic/90.5-unsupported-join-types.sqllogic +37 -0
  353. package/test/logic/90.5.1-right-full-join-read.sqllogic +157 -0
  354. package/test/logic/90.6-select-error-paths.sqllogic +57 -0
  355. package/test/logic/91-merge-join-edge-cases.sqllogic +159 -0
  356. package/test/logic/92-hash-aggregate-edge-cases.sqllogic +139 -0
  357. package/test/logic/93-ddl-view-edge-cases.sqllogic +104 -0
  358. package/test/logic/93.1-view-error-paths.sqllogic +74 -0
  359. package/test/logic/93.2-view-mutation-pending.sqllogic +108 -0
  360. package/test/logic/93.3-view-mutation-or-clause.sqllogic +60 -0
  361. package/test/logic/93.4-view-mutation.sqllogic +4881 -0
  362. package/test/logic/93.4.1-view-mutation-partial-unique-cardinality.sqllogic +31 -0
  363. package/test/logic/93.5-authored-inverse.sqllogic +415 -0
  364. package/test/logic/93.6-set-op-flagless-write.sqllogic +862 -0
  365. package/test/logic/94-tvf-edge-cases.sqllogic +58 -0
  366. package/test/logic/94.1-limit-offset-edge-cases.sqllogic +109 -0
  367. package/test/logic/94.2-limit-offset-extras.sqllogic +98 -0
  368. package/test/logic/95-assertions.sqllogic +1417 -0
  369. package/test/logic/96-subquery-edge-cases.sqllogic +276 -0
  370. package/test/logic/97-json-function-edge-cases.sqllogic +633 -0
  371. package/test/logic/97.1-json-blob-and-special-values.sqllogic +92 -0
  372. package/test/logic/98-temporal-edge-cases.sqllogic +515 -0
  373. package/test/logic/99-conversion-edge-cases.sqllogic +325 -0
  374. package/test/logic/99.0.1-schema-index-listing.sqllogic +21 -0
  375. package/test/logic/99.1-cast-syntax-extras.sqllogic +167 -0
  376. package/test/logic/drop-unique-index.sqllogic +88 -0
  377. package/test/logic/pushdown-test.sqllogic +36 -0
@@ -0,0 +1,145 @@
1
+ -- Tests for non-PK UNIQUE constraint enforcement
2
+
3
+ -- === Basic UNIQUE column enforcement ===
4
+
5
+ CREATE TABLE t_uc (id INTEGER PRIMARY KEY, email TEXT UNIQUE, name TEXT);
6
+ INSERT INTO t_uc VALUES (1, 'alice@test.com', 'Alice');
7
+ INSERT INTO t_uc VALUES (2, 'bob@test.com', 'Bob');
8
+ -- run
9
+
10
+ SELECT * FROM t_uc ORDER BY id;
11
+ → [{"id":1,"email":"alice@test.com","name":"Alice"},{"id":2,"email":"bob@test.com","name":"Bob"}]
12
+
13
+ -- Duplicate UNIQUE value should fail
14
+ INSERT INTO t_uc VALUES (3, 'alice@test.com', 'Eve');
15
+ -- error: UNIQUE constraint failed
16
+
17
+ -- Original data unchanged after failed insert
18
+ SELECT count(*) as cnt FROM t_uc;
19
+ → [{"cnt":2}]
20
+
21
+ -- === INSERT OR IGNORE with UNIQUE violation ===
22
+
23
+ INSERT OR IGNORE INTO t_uc VALUES (4, 'alice@test.com', 'Ignored');
24
+ SELECT count(*) as cnt FROM t_uc;
25
+ → [{"cnt":2}]
26
+
27
+ -- === INSERT OR REPLACE with UNIQUE violation ===
28
+
29
+ INSERT OR REPLACE INTO t_uc VALUES (5, 'alice@test.com', 'Replaced');
30
+ SELECT * FROM t_uc ORDER BY id;
31
+ → [{"id":2,"email":"bob@test.com","name":"Bob"},{"id":5,"email":"alice@test.com","name":"Replaced"}]
32
+
33
+ -- The old row (id=1) with the conflicting email was deleted
34
+ SELECT count(*) as cnt FROM t_uc WHERE id = 1;
35
+ → [{"cnt":0}]
36
+
37
+ DROP TABLE t_uc;
38
+ -- run
39
+
40
+ -- === NULL values in UNIQUE columns ===
41
+
42
+ CREATE TABLE t_uc_null (id INTEGER PRIMARY KEY, code TEXT NULL UNIQUE);
43
+ INSERT INTO t_uc_null VALUES (1, null);
44
+ INSERT INTO t_uc_null VALUES (2, null);
45
+ INSERT INTO t_uc_null VALUES (3, 'abc');
46
+ -- run
47
+
48
+ -- Multiple NULLs are allowed per SQL standard
49
+ SELECT count(*) as cnt FROM t_uc_null;
50
+ → [{"cnt":3}]
51
+
52
+ -- But duplicate non-NULL values still fail
53
+ INSERT INTO t_uc_null VALUES (4, 'abc');
54
+ -- error: UNIQUE constraint failed
55
+
56
+ DROP TABLE t_uc_null;
57
+ -- run
58
+
59
+ -- === UPDATE changing UNIQUE column to conflicting value ===
60
+
61
+ CREATE TABLE t_uc_upd (id INTEGER PRIMARY KEY, tag TEXT UNIQUE, val INTEGER);
62
+ INSERT INTO t_uc_upd VALUES (1, 'alpha', 10);
63
+ INSERT INTO t_uc_upd VALUES (2, 'beta', 20);
64
+ -- run
65
+
66
+ -- Updating to a conflicting UNIQUE value should fail
67
+ UPDATE t_uc_upd SET tag = 'alpha' WHERE id = 2;
68
+ -- error: UNIQUE constraint failed
69
+
70
+ -- Data unchanged
71
+ SELECT * FROM t_uc_upd ORDER BY id;
72
+ → [{"id":1,"tag":"alpha","val":10},{"id":2,"tag":"beta","val":20}]
73
+
74
+ -- Updating non-UNIQUE column is fine
75
+ UPDATE t_uc_upd SET val = 99 WHERE id = 2;
76
+ -- run
77
+
78
+ SELECT * FROM t_uc_upd ORDER BY id;
79
+ → [{"id":1,"tag":"alpha","val":10},{"id":2,"tag":"beta","val":99}]
80
+
81
+ -- Updating UNIQUE column to its own value is fine (no conflict)
82
+ UPDATE t_uc_upd SET tag = 'beta' WHERE id = 2;
83
+ -- run
84
+
85
+ SELECT * FROM t_uc_upd ORDER BY id;
86
+ → [{"id":1,"tag":"alpha","val":10},{"id":2,"tag":"beta","val":99}]
87
+
88
+ -- Updating UNIQUE column to a new value is fine
89
+ UPDATE t_uc_upd SET tag = 'gamma' WHERE id = 2;
90
+ -- run
91
+
92
+ SELECT * FROM t_uc_upd ORDER BY id;
93
+ → [{"id":1,"tag":"alpha","val":10},{"id":2,"tag":"gamma","val":99}]
94
+
95
+ DROP TABLE t_uc_upd;
96
+ -- run
97
+
98
+ -- === Composite UNIQUE constraint ===
99
+
100
+ CREATE TABLE t_uc_comp (
101
+ id INTEGER PRIMARY KEY,
102
+ a TEXT,
103
+ b INTEGER,
104
+ UNIQUE (a, b)
105
+ );
106
+ INSERT INTO t_uc_comp VALUES (1, 'x', 1);
107
+ INSERT INTO t_uc_comp VALUES (2, 'x', 2);
108
+ INSERT INTO t_uc_comp VALUES (3, 'y', 1);
109
+ -- run
110
+
111
+ -- Same combination should fail
112
+ INSERT INTO t_uc_comp VALUES (4, 'x', 1);
113
+ -- error: UNIQUE constraint failed
114
+
115
+ -- Different combinations are fine
116
+ SELECT count(*) as cnt FROM t_uc_comp;
117
+ → [{"cnt":3}]
118
+
119
+ DROP TABLE t_uc_comp;
120
+ -- run
121
+
122
+ -- === UNIQUE with PK-change UPDATE ===
123
+
124
+ CREATE TABLE t_uc_pkchg (id INTEGER PRIMARY KEY, code TEXT UNIQUE);
125
+ INSERT INTO t_uc_pkchg VALUES (1, 'aaa');
126
+ INSERT INTO t_uc_pkchg VALUES (2, 'bbb');
127
+ -- run
128
+
129
+ -- PK-change update that also conflicts on UNIQUE should fail
130
+ UPDATE t_uc_pkchg SET id = 3, code = 'aaa' WHERE id = 2;
131
+ -- error: UNIQUE constraint failed
132
+
133
+ -- Old row should be preserved after failed PK-change update
134
+ SELECT * FROM t_uc_pkchg ORDER BY id;
135
+ → [{"id":1,"code":"aaa"},{"id":2,"code":"bbb"}]
136
+
137
+ -- PK-change update without UNIQUE conflict should succeed
138
+ UPDATE t_uc_pkchg SET id = 3, code = 'ccc' WHERE id = 2;
139
+ -- run
140
+
141
+ SELECT * FROM t_uc_pkchg ORDER BY id;
142
+ → [{"id":1,"code":"aaa"},{"id":3,"code":"ccc"}]
143
+
144
+ DROP TABLE t_uc_pkchg;
145
+ -- run
@@ -0,0 +1,32 @@
1
+ -- 102.0.1-schema-catalog-indexed-table.sqllogic
2
+ --
3
+ -- requires-capability: standalone-index-ddl
4
+ --
5
+ -- Carved out of 102-schema-catalog-edge-cases: that file's DDL round-trips,
6
+ -- multi-schema search-path handling, table_info(), views, assertions and window
7
+ -- coverage need no index DDL. This one section round-trips a table that carries
8
+ -- secondary indexes, so it moves here rather than costing a backend without
9
+ -- first-class CREATE INDEX the whole catalog file.
10
+ --
11
+ -- Subject: a table created with two secondary indexes stays queryable through the
12
+ -- indexed columns, and both indexes drop cleanly.
13
+
14
+ -- ===================================
15
+ -- Table with indexes
16
+ -- ===================================
17
+
18
+ CREATE TABLE rt_indexed (id INTEGER PRIMARY KEY, name TEXT, category TEXT);
19
+ CREATE INDEX idx_name ON rt_indexed (name);
20
+ CREATE INDEX idx_cat ON rt_indexed (category);
21
+ INSERT INTO rt_indexed VALUES (1, 'Alice', 'A'), (2, 'Bob', 'B');
22
+
23
+ -- Verify indexes are used (data accessible via indexed columns)
24
+ SELECT id FROM rt_indexed WHERE name = 'Alice';
25
+ → [{"id": 1}]
26
+
27
+ SELECT id FROM rt_indexed WHERE category = 'B';
28
+ → [{"id": 2}]
29
+
30
+ DROP INDEX idx_name;
31
+ DROP INDEX idx_cat;
32
+ DROP TABLE rt_indexed;
@@ -0,0 +1,111 @@
1
+ -- adapted from SQLite test/unique.test, test/unique2.test
2
+ -- UNIQUE constraint scenarios beyond 102-unique-constraints.sqllogic.
3
+
4
+ -- ===================================
5
+ -- 1. COLLATE with the LOWERCASE spelling `nocase` is NORMALIZED at DDL.
6
+ -- SQLite treats collation names case-insensitively; Quereus normalizes the
7
+ -- requested name to its canonical uppercase form in columnDefToSchema and
8
+ -- validates against TEXT_TYPE.supportedCollations = ['BINARY','NOCASE','RTRIM']
9
+ -- case-insensitively, so lowercase `nocase` is equivalent to `NOCASE`. A
10
+ -- `collate nocase unique` column is therefore accepted and enforces
11
+ -- case-insensitively (see unique-constraint-honors-column-collation /
12
+ -- 102.2-unique-collation.sqllogic). An UNKNOWN collation is still rejected,
13
+ -- now with explicit "Unknown collation" wording (pinned below).
14
+ -- ===================================
15
+
16
+ create table t_uci (id integer primary key, email text collate nocase unique);
17
+ insert into t_uci values (1, 'abc');
18
+
19
+ -- the lowercase `nocase` spelling normalizes to NOCASE, so a case-variant
20
+ -- duplicate is a UNIQUE violation under case-insensitive comparison
21
+ insert into t_uci values (2, 'ABC');
22
+ -- error: UNIQUE constraint failed: t_uci (email)
23
+
24
+ select count(*) as n from t_uci;
25
+ → [{"n":1}]
26
+
27
+ -- a value that is NOT NOCASE-equal still inserts
28
+ insert into t_uci values (3, 'abd');
29
+ select id, email from t_uci order by id;
30
+ → [{"id":1,"email":"abc"},{"id":3,"email":"abd"}]
31
+
32
+ drop table t_uci;
33
+
34
+ -- composite UNIQUE with the lowercase `nocase` spelling on a TEXT member is
35
+ -- likewise accepted; the `a` member folds case under the normalized NOCASE
36
+ create table t_uci2 (
37
+ id integer primary key,
38
+ a text collate nocase,
39
+ b text,
40
+ unique (a, b)
41
+ );
42
+ insert into t_uci2 values (1, 'abc', 'x');
43
+
44
+ -- 'a' matches case-insensitively and 'b' matches under BINARY -> composite conflict
45
+ insert into t_uci2 values (2, 'ABC', 'x');
46
+ -- error: UNIQUE constraint failed: t_uci2
47
+
48
+ select count(*) as n from t_uci2;
49
+ → [{"n":1}]
50
+
51
+ -- a genuinely distinct 'a' still inserts (proves no over-matching)
52
+ insert into t_uci2 values (3, 'xyz', 'x');
53
+ select count(*) as n from t_uci2;
54
+ → [{"n":2}]
55
+
56
+ drop table t_uci2;
57
+
58
+ -- an UNKNOWN collation name is still rejected at DDL, now with explicit wording
59
+ create table t_ucbad (id integer primary key, x text collate frobnicate);
60
+ -- error: Unknown collation
61
+
62
+ drop table if exists t_ucbad;
63
+
64
+ -- ===================================
65
+ -- 2. UNIQUE constraint error message identifies the violated column
66
+ -- ===================================
67
+
68
+ create table t_ue (id integer primary key, email text unique, code text unique);
69
+ insert into t_ue values (1, 'a@x', 'AAA');
70
+
71
+ -- conflict on email reports email
72
+ insert into t_ue values (2, 'a@x', 'BBB');
73
+ -- error: t_ue (email)
74
+
75
+ -- conflict on code reports code
76
+ insert into t_ue values (3, 'b@x', 'AAA');
77
+ -- error: t_ue (code)
78
+
79
+ drop table t_ue;
80
+
81
+ -- composite UNIQUE error names the offending column(s)
82
+ create table t_uec (id integer primary key, a text, b text, unique (a, b));
83
+ insert into t_uec values (1, 'x', 'y');
84
+
85
+ insert into t_uec values (2, 'x', 'y');
86
+ -- error: t_uec
87
+
88
+ drop table t_uec;
89
+
90
+ -- ===================================
91
+ -- 3. CREATE UNIQUE INDEX rejected when data already has duplicates
92
+ -- ===================================
93
+ -- Lives in 102.1.1-unique-index-creation-edge-cases: adding a UNIQUE after rows
94
+ -- exist requires a standalone `create unique index`.
95
+
96
+ -- ===================================
97
+ -- 4. PRIMARY KEY / UNIQUE referencing non-existent column rejected at DDL
98
+ -- ===================================
99
+
100
+ create table u2_bad1 (a integer not null, b integer not null, primary key (nope));
101
+ -- error:
102
+
103
+ drop table if exists u2_bad1;
104
+
105
+ create table u2_bad2 (id integer primary key, a integer not null, unique (missing));
106
+ -- error:
107
+
108
+ drop table if exists u2_bad2;
109
+
110
+ -- The CREATE UNIQUE INDEX form of the same rejection lives in
111
+ -- 102.1.1-unique-index-creation-edge-cases § 2.
@@ -0,0 +1,75 @@
1
+ -- 102.1.1-unique-index-creation-edge-cases.sqllogic
2
+ --
3
+ -- requires-capability: standalone-index-ddl
4
+ --
5
+ -- Carved out of 102.1-unique-edge-cases: the rest of that file establishes UNIQUE
6
+ -- through inline or table-level constraints (collation normalization, duplicate
7
+ -- rejection, missing-column DDL errors) and needs no index DDL. These sections build
8
+ -- the constraint with a standalone `create unique index` instead, which is the only
9
+ -- way to add one AFTER rows exist — so they move here rather than making the whole
10
+ -- UNIQUE edge-case file unrunnable on a backend without first-class CREATE INDEX.
11
+ --
12
+ -- Subject: post-hoc CREATE UNIQUE INDEX — rejected over already-duplicated data,
13
+ -- accepted after dedup and then enforcing, NULL-tolerant on nullable columns, and
14
+ -- rejected outright when it names a column that does not exist.
15
+
16
+ -- ===================================
17
+ -- 1. CREATE UNIQUE INDEX rejected when data already has duplicates
18
+ -- ===================================
19
+
20
+ create table u2_a (k text primary key, x text not null);
21
+ insert into u2_a values ('r1', 'dup'), ('r2', 'dup');
22
+
23
+ create unique index u2_a_x on u2_a(x);
24
+ -- error: UNIQUE
25
+
26
+ -- after dedup, the index creates fine and rejects new duplicates
27
+ delete from u2_a where k = 'r2';
28
+
29
+ create unique index u2_a_x on u2_a(x);
30
+
31
+ insert into u2_a values ('r3', 'dup');
32
+ -- error: UNIQUE
33
+
34
+ drop table u2_a;
35
+
36
+ -- post-hoc CREATE UNIQUE INDEX on already-unique data subsequently rejects
37
+ -- inserts that would violate the new unique constraint. Use `-- run` markers
38
+ -- to run each step as its own implicit transaction; otherwise the CREATE
39
+ -- UNIQUE INDEX would land in the same implicit transaction as the prior
40
+ -- INSERTs, whose rows live in an uncommitted layer that the index's seed
41
+ -- scan does not see (a known schema-change-mid-transaction limitation).
42
+ create table u2_b (k integer primary key, x text not null);
43
+ -- run
44
+ insert into u2_b values (1, 'a'), (2, 'b');
45
+ -- run
46
+ create unique index u2_b_x on u2_b(x);
47
+ -- run
48
+
49
+ insert into u2_b values (3, 'a');
50
+ -- error: UNIQUE
51
+
52
+ drop table u2_b;
53
+
54
+ -- nullable indexed columns: multiple NULL allowed
55
+ create table u2_c (k integer primary key, y text null, z text null);
56
+ insert into u2_c values (1, null, null), (2, null, null);
57
+
58
+ create unique index u2_c_yz on u2_c(y, z);
59
+
60
+ select count(*) as cnt from u2_c;
61
+ → [{"cnt":2}]
62
+
63
+ drop table u2_c;
64
+
65
+ -- ===================================
66
+ -- 2. CREATE UNIQUE INDEX referencing a non-existent column rejected at DDL
67
+ -- ===================================
68
+ -- (the PRIMARY KEY / table-level UNIQUE forms of the same rejection stay in
69
+ -- 102.1-unique-edge-cases § 4)
70
+
71
+ create table u2_bad3 (id integer primary key, b integer not null);
72
+ create unique index u2_bad3_idx on u2_bad3(no_such_col);
73
+ -- error: not found
74
+
75
+ drop table u2_bad3;
@@ -0,0 +1,181 @@
1
+ -- 102.2-unique-collation.sqllogic — a UNIQUE constraint over a column declared
2
+ -- with a non-binary collation (e.g. `text collate NOCASE`) must enforce under that
3
+ -- collation, not BINARY (unique-constraint-honors-column-collation). The auto-built
4
+ -- UNIQUE index carries the column's declared collation, and every conflict validator
5
+ -- (auto-index path, cold scan, and the row-time covering-MV path) re-compares with the
6
+ -- column collation. Uses the canonical UPPERCASE spelling `NOCASE` / `RTRIM` — the
7
+ -- lowercase spelling is rejected at DDL by a separate collation-name case-sensitivity
8
+ -- quirk documented in 102.1-unique-edge-cases.sqllogic.
9
+ --
10
+ -- Runs under BOTH the memory module (`yarn test`) and the store module
11
+ -- (`yarn test:store`); §4 additionally exercises the MV-backed enforcement path on
12
+ -- each module, using a non-derived NOCASE column through a row-time covering MV.
13
+ --
14
+ -- Every section here declares its UNIQUE inline or table-level, so the enforcement
15
+ -- collation is always the column's. The counterpart shapes — where the collation
16
+ -- comes from an explicit `create unique index … collate …` instead — live in
17
+ -- 102.2.1-unique-collation-index-derived (former §§9-13), split out because they
18
+ -- need standalone index DDL.
19
+
20
+ -- ===================================
21
+ -- 1. Table-level `unique (x)` over a NOCASE column — auto-index enforcement.
22
+ -- ===================================
23
+
24
+ create table ta (id integer primary key, x text collate NOCASE, unique (x));
25
+ insert into ta values (1, 'abc');
26
+
27
+ -- a case-insensitive duplicate is a UNIQUE violation under NOCASE (was silently
28
+ -- accepted as a distinct value under the old BINARY enforcement)
29
+ insert into ta values (2, 'ABC');
30
+ -- error: UNIQUE constraint failed: ta (x)
31
+
32
+ select count(*) as n from ta;
33
+ → [{"n":1}]
34
+
35
+ -- a value that is NOT NOCASE-equal still inserts (guard against over-matching)
36
+ insert into ta values (3, 'abd');
37
+ select id, x from ta order by id;
38
+ → [{"id":1,"x":"abc"},{"id":3,"x":"abd"}]
39
+
40
+ -- ===================================
41
+ -- 2. Column-level inline `x text collate NOCASE unique` — same enforcement.
42
+ -- ===================================
43
+
44
+ create table tb (id integer primary key, x text collate NOCASE unique);
45
+ insert into tb values (1, 'abc');
46
+
47
+ insert into tb values (2, 'ABC');
48
+ -- error: UNIQUE constraint failed: tb (x)
49
+
50
+ select count(*) as n from tb;
51
+ → [{"n":1}]
52
+
53
+ -- ===================================
54
+ -- 3. OR IGNORE / OR REPLACE interplay on a NOCASE duplicate.
55
+ -- ===================================
56
+
57
+ create table tc (id integer primary key, x text collate NOCASE unique);
58
+ insert into tc values (1, 'abc');
59
+
60
+ -- OR IGNORE: the case-insensitive duplicate is silently skipped
61
+ insert or ignore into tc values (2, 'ABC');
62
+ select id, x from tc order by id;
63
+ → [{"id":1,"x":"abc"}]
64
+
65
+ -- OR REPLACE: the case-insensitive duplicate (id=1) is evicted, the new row lands
66
+ insert or replace into tc values (3, 'ABC');
67
+ select id, x from tc order by id;
68
+ → [{"id":3,"x":"ABC"}]
69
+
70
+ -- ===================================
71
+ -- 4. Row-time covering MV over a NOCASE column — MV-backed enforcement path.
72
+ -- `findIndexForConstraint` prefers the covering MV over the auto-index, so this
73
+ -- drives `checkUniqueViaMaterializedView` (memory) / `findUniqueConflictViaCoveringMv`
74
+ -- (store). Mirrors 54-covering-mv-enforcement.sqllogic.
75
+ -- ===================================
76
+
77
+ create table tm (id integer primary key, x text collate NOCASE, unique (x));
78
+ create materialized view tm_ix as select x, id from tm order by x;
79
+ insert into tm values (1, 'abc');
80
+
81
+ -- default ABORT through the covering MV: a NOCASE duplicate with a different PK is rejected
82
+ insert into tm values (2, 'ABC');
83
+ -- error: UNIQUE constraint failed: tm (x)
84
+
85
+ select count(*) as n from tm;
86
+ → [{"n":1}]
87
+
88
+ -- OR REPLACE through the covering MV: id=1 evicted, id=10 lands
89
+ insert or replace into tm values (10, 'ABC');
90
+ select id, x from tm order by id;
91
+ → [{"id":10,"x":"ABC"}]
92
+
93
+ -- a non-NOCASE-equal value still inserts through the covering path
94
+ insert into tm values (11, 'abd');
95
+ select id, x from tm order by id;
96
+ → [{"id":10,"x":"ABC"},{"id":11,"x":"abd"}]
97
+
98
+ -- ===================================
99
+ -- 5. Generality with a second collation: `collate RTRIM` ignores trailing spaces.
100
+ -- ===================================
101
+
102
+ create table tr (id integer primary key, x text collate RTRIM, unique (x));
103
+ insert into tr values (1, 'abc');
104
+
105
+ -- a trailing-space-only variant collides under RTRIM
106
+ insert into tr values (2, 'abc ');
107
+ -- error: UNIQUE constraint failed: tr (x)
108
+
109
+ select count(*) as n from tr;
110
+ → [{"n":1}]
111
+
112
+ -- a genuinely different value still inserts
113
+ insert into tr values (3, 'abcd');
114
+ select id, x from tr order by id;
115
+ → [{"id":1,"x":"abc"},{"id":3,"x":"abcd"}]
116
+
117
+ -- ===================================
118
+ -- 6. Composite UNIQUE with a mix of NOCASE + BINARY members — each member is
119
+ -- compared under its OWN declared collation (per-column threading), not a
120
+ -- single table-wide collation. The NOCASE member folds case; the BINARY
121
+ -- member does not.
122
+ -- ===================================
123
+
124
+ create table tcomp (id integer primary key, a text collate NOCASE, b text collate BINARY, unique (a, b));
125
+ insert into tcomp values (1, 'abc', 'xyz');
126
+
127
+ -- both members match under their own collations (a: NOCASE-equal, b: BINARY-equal) → conflict
128
+ insert into tcomp values (2, 'ABC', 'xyz');
129
+ -- error: UNIQUE constraint failed: tcomp
130
+
131
+ select count(*) as n from tcomp;
132
+ → [{"n":1}]
133
+
134
+ -- a matches under NOCASE but b differs under BINARY ('XYZ' != 'xyz'), so the composite
135
+ -- key is distinct and the row inserts — proves the BINARY member is NOT case-folded
136
+ insert into tcomp values (3, 'ABC', 'XYZ');
137
+ select id, a, b from tcomp order by id;
138
+ → [{"id":1,"a":"abc","b":"xyz"},{"id":3,"a":"ABC","b":"XYZ"}]
139
+
140
+ -- ===================================
141
+ -- 7. UPDATE onto a NOCASE-equal value is rejected (the conflict validators back
142
+ -- UPDATE as well as INSERT). Guards the UPDATE path, not just INSERT.
143
+ -- ===================================
144
+
145
+ create table tu (id integer primary key, x text collate NOCASE, unique (x));
146
+ insert into tu values (1, 'abc');
147
+ insert into tu values (2, 'def');
148
+
149
+ -- moving id=2's value onto a NOCASE-equal of id=1's value collides
150
+ update tu set x = 'ABC' where id = 2;
151
+ -- error: UNIQUE constraint failed: tu
152
+
153
+ -- the aborted UPDATE left both rows unchanged
154
+ select id, x from tu order by id;
155
+ → [{"id":1,"x":"abc"},{"id":2,"x":"def"}]
156
+
157
+ -- updating onto a genuinely distinct value still succeeds
158
+ update tu set x = 'xyz' where id = 2;
159
+ select id, x from tu order by id;
160
+ → [{"id":1,"x":"abc"},{"id":2,"x":"xyz"}]
161
+
162
+ -- ===================================
163
+ -- 8. The LOWERCASE collation spelling `collate nocase` normalizes to NOCASE and
164
+ -- enforces identically to the uppercase form (DDL case-insensitivity fix).
165
+ -- ===================================
166
+
167
+ create table tl (id integer primary key, x text collate nocase unique);
168
+ insert into tl values (1, 'abc');
169
+
170
+ -- a case-variant duplicate collides under the normalized NOCASE collation
171
+ insert into tl values (2, 'ABC');
172
+ -- error: UNIQUE constraint failed: tl (x)
173
+
174
+ select count(*) as n from tl;
175
+ → [{"n":1}]
176
+
177
+ -- a non-NOCASE-equal value still inserts
178
+ insert into tl values (3, 'abd');
179
+ select id, x from tl order by id;
180
+ → [{"id":1,"x":"abc"},{"id":3,"x":"abd"}]
181
+