@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,341 @@
1
+ -- transition-constraints.sqllogic - Testing transition constraints using committed.* pseudo-schema
2
+ -- These tests verify that CHECK constraints and assertions can reference committed.*
3
+ -- to express transition rules (comparing before/after state).
4
+
5
+ -- ===================================
6
+ -- CHECK constraint with committed subquery: auto-deferred
7
+ -- ===================================
8
+
9
+ CREATE TABLE accounts (
10
+ id INTEGER PRIMARY KEY,
11
+ balance INTEGER,
12
+ CONSTRAINT no_decrease CHECK (
13
+ balance >= coalesce((SELECT balance FROM committed.accounts ca WHERE ca.id = new.id), 0)
14
+ )
15
+ ) USING memory;
16
+
17
+ -- Insert initial data (no committed counterpart → COALESCE to 0)
18
+ INSERT INTO accounts VALUES (1, 100);
19
+ INSERT INTO accounts VALUES (2, 200);
20
+ COMMIT;
21
+
22
+ -- Valid: increase balance
23
+ BEGIN;
24
+ UPDATE accounts SET balance = 150 WHERE id = 1;
25
+ COMMIT;
26
+ -- run
27
+
28
+ SELECT balance FROM accounts WHERE id = 1;
29
+ → [{ "balance": 150 }]
30
+
31
+ -- Valid: balance stays the same
32
+ BEGIN;
33
+ UPDATE accounts SET balance = 150 WHERE id = 1;
34
+ COMMIT;
35
+ -- run
36
+
37
+ -- Invalid: decrease balance → CHECK fires at commit
38
+ BEGIN;
39
+ UPDATE accounts SET balance = 50 WHERE id = 1;
40
+ COMMIT;
41
+ -- error: CHECK constraint failed: no_decrease
42
+
43
+ -- Verify state unchanged
44
+ SELECT balance FROM accounts WHERE id = 1;
45
+ → [{ "balance": 150 }]
46
+
47
+ DROP TABLE accounts;
48
+ -- run
49
+
50
+ -- ===================================
51
+ -- CHECK constraint: new rows pass (no committed counterpart)
52
+ -- ===================================
53
+
54
+ CREATE TABLE items (
55
+ id INTEGER PRIMARY KEY,
56
+ score INTEGER,
57
+ CONSTRAINT score_no_decrease CHECK (
58
+ score >= coalesce((SELECT score FROM committed.items ci WHERE ci.id = new.id), 0)
59
+ )
60
+ ) USING memory;
61
+
62
+ -- New rows with positive score: OK (COALESCE to 0)
63
+ INSERT INTO items VALUES (1, 10);
64
+ INSERT INTO items VALUES (2, 20);
65
+ COMMIT;
66
+
67
+ SELECT score FROM items ORDER BY id;
68
+ → [{ "score": 10 }, { "score": 20 }]
69
+
70
+ -- New row with zero score: OK (COALESCE to 0)
71
+ INSERT INTO items VALUES (3, 0);
72
+ COMMIT;
73
+ -- run
74
+
75
+ -- New row with negative score: fails (< 0 default)
76
+ BEGIN;
77
+ INSERT INTO items VALUES (4, -5);
78
+ COMMIT;
79
+ -- error: CHECK constraint failed: score_no_decrease
80
+
81
+ SELECT count(*) FROM items;
82
+ → [{ "count(*)": 3 }]
83
+
84
+ DROP TABLE items;
85
+ -- run
86
+
87
+ -- ===================================
88
+ -- Assertion: count preservation (cardinality can only grow)
89
+ -- ===================================
90
+
91
+ CREATE TABLE entries (id INTEGER PRIMARY KEY, val TEXT);
92
+ INSERT INTO entries VALUES (1, 'a');
93
+ INSERT INTO entries VALUES (2, 'b');
94
+ COMMIT;
95
+
96
+ CREATE ASSERTION no_shrink CHECK (
97
+ (SELECT count(*) FROM entries) >= (SELECT count(*) FROM committed.entries)
98
+ );
99
+ -- run
100
+
101
+ -- Insert: count grows → OK
102
+ BEGIN;
103
+ INSERT INTO entries VALUES (3, 'c');
104
+ COMMIT;
105
+ -- run
106
+
107
+ SELECT count(*) FROM entries;
108
+ → [{ "count(*)": 3 }]
109
+
110
+ -- Delete: count shrinks → fails
111
+ BEGIN;
112
+ DELETE FROM entries WHERE id = 3;
113
+ COMMIT;
114
+ -- error: Integrity assertion failed: no_shrink
115
+
116
+ -- Verify state unchanged
117
+ SELECT count(*) FROM entries;
118
+ → [{ "count(*)": 3 }]
119
+
120
+ DROP ASSERTION no_shrink;
121
+ DROP TABLE entries;
122
+ -- run
123
+
124
+ -- ===================================
125
+ -- Assertion: multiple committed refs in same expression
126
+ -- ===================================
127
+
128
+ CREATE TABLE balances (id INTEGER PRIMARY KEY, amount INTEGER);
129
+ CREATE TABLE totals (id INTEGER PRIMARY KEY, total INTEGER);
130
+ INSERT INTO balances VALUES (1, 100);
131
+ INSERT INTO totals VALUES (1, 100);
132
+ COMMIT;
133
+
134
+ -- Assert both tables' counts can only increase
135
+ CREATE ASSERTION multi_committed CHECK (
136
+ (SELECT count(*) FROM balances) >= (SELECT count(*) FROM committed.balances)
137
+ AND
138
+ (SELECT count(*) FROM totals) >= (SELECT count(*) FROM committed.totals)
139
+ );
140
+ -- run
141
+
142
+ -- Valid: insert into both (count grows)
143
+ BEGIN;
144
+ INSERT INTO balances VALUES (2, 200);
145
+ INSERT INTO totals VALUES (2, 200);
146
+ COMMIT;
147
+ -- run
148
+
149
+ -- Invalid: delete from balances (count shrinks)
150
+ BEGIN;
151
+ DELETE FROM balances WHERE id = 2;
152
+ COMMIT;
153
+ -- error: Integrity assertion failed: multi_committed
154
+
155
+ -- Invalid: delete from totals (count shrinks)
156
+ BEGIN;
157
+ DELETE FROM totals WHERE id = 2;
158
+ COMMIT;
159
+ -- error: Integrity assertion failed: multi_committed
160
+
161
+ -- Verify state unchanged
162
+ SELECT count(*) FROM balances;
163
+ → [{ "count(*)": 2 }]
164
+ SELECT count(*) FROM totals;
165
+ → [{ "count(*)": 2 }]
166
+
167
+ DROP ASSERTION multi_committed;
168
+ DROP TABLE totals;
169
+ DROP TABLE balances;
170
+ -- run
171
+
172
+ -- ===================================
173
+ -- Assertion: deleted rows detection (exist in committed but not current)
174
+ -- ===================================
175
+
176
+ CREATE TABLE protected (id INTEGER PRIMARY KEY, val TEXT);
177
+ INSERT INTO protected VALUES (1, 'keep');
178
+ INSERT INTO protected VALUES (2, 'keep');
179
+ COMMIT;
180
+
181
+ -- Assert no rows are deleted
182
+ CREATE ASSERTION no_deletes CHECK (NOT EXISTS (
183
+ SELECT 1 FROM committed.protected cp
184
+ WHERE NOT EXISTS (SELECT 1 FROM protected p WHERE p.id = cp.id)
185
+ ));
186
+ -- run
187
+
188
+ -- Insert new row: OK (doesn't delete anything)
189
+ BEGIN;
190
+ INSERT INTO protected VALUES (3, 'new');
191
+ COMMIT;
192
+ -- run
193
+
194
+ -- Update existing row: OK
195
+ BEGIN;
196
+ UPDATE protected SET val = 'updated' WHERE id = 1;
197
+ COMMIT;
198
+ -- run
199
+
200
+ -- Delete a row: fails
201
+ BEGIN;
202
+ DELETE FROM protected WHERE id = 2;
203
+ COMMIT;
204
+ -- error: Integrity assertion failed: no_deletes
205
+
206
+ -- Verify state unchanged
207
+ SELECT count(*) FROM protected;
208
+ → [{ "count(*)": 3 }]
209
+
210
+ DROP ASSERTION no_deletes;
211
+ DROP TABLE protected;
212
+ -- run
213
+
214
+ -- ===================================
215
+ -- CHECK constraint + assertion together with committed refs
216
+ -- ===================================
217
+
218
+ CREATE TABLE ledger (
219
+ id INTEGER PRIMARY KEY,
220
+ amount INTEGER,
221
+ CONSTRAINT amount_no_decrease CHECK (
222
+ amount >= coalesce((SELECT amount FROM committed.ledger cl WHERE cl.id = new.id), 0)
223
+ )
224
+ ) USING memory;
225
+
226
+ INSERT INTO ledger VALUES (1, 50);
227
+ INSERT INTO ledger VALUES (2, 100);
228
+ COMMIT;
229
+
230
+ -- Also add an assertion for count preservation
231
+ CREATE ASSERTION ledger_no_deletes CHECK (
232
+ (SELECT count(*) FROM ledger) >= (SELECT count(*) FROM committed.ledger)
233
+ );
234
+ -- run
235
+
236
+ -- Valid: increase individual amounts
237
+ BEGIN;
238
+ UPDATE ledger SET amount = 75 WHERE id = 1;
239
+ COMMIT;
240
+ -- run
241
+
242
+ -- Invalid: decrease individual amount (CHECK catches it)
243
+ BEGIN;
244
+ UPDATE ledger SET amount = 10 WHERE id = 1;
245
+ COMMIT;
246
+ -- error: CHECK constraint failed: amount_no_decrease
247
+
248
+ -- Verify state
249
+ SELECT amount FROM ledger WHERE id = 1;
250
+ → [{ "amount": 75 }]
251
+
252
+ DROP ASSERTION ledger_no_deletes;
253
+ DROP TABLE ledger;
254
+ -- run
255
+
256
+ -- ===================================
257
+ -- Deferred CHECK across tables with datetime coercion (GitHub #25)
258
+ -- The deferred subquery compares new.* against an already-coerced stored row.
259
+ -- A datetime column rewrites its value on parse, so the comparison must run
260
+ -- coerced-vs-coerced or it spuriously fails.
261
+ -- ===================================
262
+
263
+ CREATE TABLE Parent (Id TEXT, TS datetime, PRIMARY KEY (Id, TS)) USING memory;
264
+ CREATE TABLE Child (
265
+ Id TEXT PRIMARY KEY,
266
+ ParentTS datetime,
267
+ CONSTRAINT ParentExists CHECK (
268
+ EXISTS (SELECT 1 FROM Parent P WHERE P.TS = new.ParentTS)
269
+ )
270
+ ) USING memory;
271
+
272
+ -- Parent.TS coerced from numeric literal to the datetime logical representation
273
+ INSERT INTO Parent VALUES ('p1', 1700000000000);
274
+ COMMIT;
275
+
276
+ -- Positive: matching parent (numeric literal coerces to the same value) → OK
277
+ BEGIN;
278
+ INSERT INTO Child VALUES ('c1', 1700000000000);
279
+ COMMIT;
280
+ -- run
281
+
282
+ SELECT count(*) FROM Child;
283
+ → [{ "count(*)": 1 }]
284
+
285
+ -- Negative: no matching parent → deferred CHECK still fires at commit
286
+ BEGIN;
287
+ INSERT INTO Child VALUES ('c2', 1800000000000);
288
+ COMMIT;
289
+ -- error: CHECK constraint failed: ParentExists
290
+
291
+ -- Verify the failed row did not land
292
+ SELECT count(*) FROM Child;
293
+ → [{ "count(*)": 1 }]
294
+
295
+ -- Alternate textual representation on both sides — Z-suffixed input now
296
+ -- canonicalizes through the column-type parse, so this exercises that path.
297
+ INSERT INTO Parent VALUES ('p2', '2023-11-14T22:13:20Z');
298
+ COMMIT;
299
+
300
+ BEGIN;
301
+ INSERT INTO Child VALUES ('c3', '2023-11-14T22:13:20Z');
302
+ COMMIT;
303
+ -- run
304
+
305
+ SELECT count(*) FROM Child;
306
+ → [{ "count(*)": 2 }]
307
+
308
+ -- UPDATE shares the deferred-queue call site, so NEW is coerced there too.
309
+ -- p3 stored from a numeric literal; the matching deferred-CHECK UPDATE below
310
+ -- uses a textual representation of the same instant. Since datetime coercion
311
+ -- is now canonical across input representations, the numeric-stored value
312
+ -- and the textual NEW compare equal.
313
+ INSERT INTO Parent VALUES ('p3', 1500000000000);
314
+ COMMIT;
315
+
316
+ BEGIN;
317
+ UPDATE Child SET ParentTS = 1500000000000 WHERE Id = 'c1';
318
+ COMMIT;
319
+ -- run
320
+
321
+ -- Textual-NEW vs numeric-stored UPDATE: 1600000000000 ms = 2020-09-13T12:26:40Z.
322
+ INSERT INTO Parent VALUES ('p4', 1600000000000);
323
+ COMMIT;
324
+
325
+ BEGIN;
326
+ UPDATE Child SET ParentTS = '2020-09-13T12:26:40Z' WHERE Id = 'c3';
327
+ COMMIT;
328
+ -- run
329
+
330
+ -- Negative UPDATE: no matching parent → deferred CHECK still fires at commit
331
+ BEGIN;
332
+ UPDATE Child SET ParentTS = 1900000000000 WHERE Id = 'c1';
333
+ COMMIT;
334
+ -- error: CHECK constraint failed: ParentExists
335
+
336
+ SELECT count(*) FROM Child;
337
+ → [{ "count(*)": 2 }]
338
+
339
+ DROP TABLE Child;
340
+ DROP TABLE Parent;
341
+ -- run
@@ -0,0 +1,140 @@
1
+ -- 43.1-default-collation.sqllogic - per-DB default_collation pragma.
2
+ -- Sets the declared collation a column with NO explicit COLLATE resolves to.
3
+ -- Defaults to BINARY (no behavior change). An explicit COLLATE always wins, and
4
+ -- the default applies only to types that support the collation (text); non-text
5
+ -- and empty-collation types (INTEGER/REAL/BLOB, JSON/temporal) fall back to BINARY.
6
+
7
+ -- ===================================
8
+ -- 0. Default is BINARY — out-of-box behavior unchanged.
9
+ -- ===================================
10
+
11
+ pragma default_collation;
12
+ → [{"name": "default_collation", "value": "BINARY"}]
13
+
14
+ create table t_base (id integer primary key, name text);
15
+ insert into t_base values (1, 'a');
16
+
17
+ -- BINARY: a case-different literal does NOT match.
18
+ select count(*) as n from t_base where name = 'A';
19
+ → [{"n":0}]
20
+
21
+ select name, collation from table_info('t_base') order by cid;
22
+ → [{"name":"id","collation":"BINARY"},{"name":"name","collation":"BINARY"}]
23
+
24
+ drop table t_base;
25
+
26
+ -- ===================================
27
+ -- 1. default_collation = NOCASE: an omitted-COLLATE text column resolves to NOCASE.
28
+ -- ===================================
29
+
30
+ pragma default_collation='nocase';
31
+ pragma default_collation;
32
+ → [{"name": "default_collation", "value": "nocase"}]
33
+
34
+ create table t_nc (id integer primary key, name text);
35
+ insert into t_nc values (1, 'a');
36
+
37
+ -- NOCASE: 'A' now matches the row inserted as 'a'.
38
+ select count(*) as n from t_nc where name = 'A';
39
+ → [{"n":1}]
40
+
41
+ -- table_info: id (INTEGER) falls back to BINARY; name (TEXT) is NOCASE.
42
+ select name, collation from table_info('t_nc') order by cid;
43
+ → [{"name":"id","collation":"BINARY"},{"name":"name","collation":"NOCASE"}]
44
+
45
+ drop table t_nc;
46
+
47
+ -- ===================================
48
+ -- 2. Non-text fallback: INTEGER / REAL / BLOB stay BINARY under a non-BINARY default.
49
+ -- ===================================
50
+
51
+ create table t_types (id integer primary key, amount real, payload blob, label text);
52
+ select name, collation from table_info('t_types') order by cid;
53
+ → [{"name":"id","collation":"BINARY"},{"name":"amount","collation":"BINARY"},{"name":"payload","collation":"BINARY"},{"name":"label","collation":"NOCASE"}]
54
+
55
+ drop table t_types;
56
+
57
+ -- ===================================
58
+ -- 3. Empty-collation types (JSON / temporal) stay BINARY under NOCASE.
59
+ -- ===================================
60
+
61
+ create table t_json (id integer primary key, doc json, created date);
62
+ select name, collation from table_info('t_json') order by cid;
63
+ → [{"name":"id","collation":"BINARY"},{"name":"doc","collation":"BINARY"},{"name":"created","collation":"BINARY"}]
64
+
65
+ drop table t_json;
66
+
67
+ -- `any` declares no supported-collation list either, so it stays BINARY too.
68
+ -- This matters since `ANY_TYPE.compare` began honoring its collation argument
69
+ -- (ticket any-type-compare-honors-collation): an undecorated `any` column must
70
+ -- keep comparing — and keying — BINARY, so only an explicit COLLATE moves it.
71
+ create table t_any (id integer primary key, v any);
72
+ select name, collation from table_info('t_any') order by cid;
73
+ → [{"name":"id","collation":"BINARY"},{"name":"v","collation":"BINARY"}]
74
+
75
+ insert into t_any values (1, 'a');
76
+ select count(*) as n from t_any where v = 'A';
77
+ → [{"n":0}]
78
+
79
+ drop table t_any;
80
+
81
+ -- ===================================
82
+ -- 4. Explicit COLLATE always wins over the default.
83
+ -- ===================================
84
+
85
+ -- Explicit COLLATE BINARY under a NOCASE default stays BINARY (case-sensitive).
86
+ create table t_expl (id integer primary key, name text collate binary);
87
+ insert into t_expl values (1, 'a');
88
+ select count(*) as n from t_expl where name = 'A';
89
+ → [{"n":0}]
90
+ select name, collation from table_info('t_expl') order by cid;
91
+ → [{"name":"id","collation":"BINARY"},{"name":"name","collation":"BINARY"}]
92
+ drop table t_expl;
93
+
94
+ -- Explicit COLLATE RTRIM under a NOCASE default stays RTRIM.
95
+ create table t_rt (id integer primary key, name text collate rtrim);
96
+ select name, collation from table_info('t_rt') order by cid;
97
+ → [{"name":"id","collation":"BINARY"},{"name":"name","collation":"RTRIM"}]
98
+ drop table t_rt;
99
+
100
+ -- ===================================
101
+ -- 5. ALTER TABLE ADD COLUMN honors default_collation (text → NOCASE, non-text → BINARY).
102
+ -- ===================================
103
+ -- Closes the CREATE-vs-ADD inconsistency: an ADD-COLUMN-ed text column gets NOCASE
104
+ -- like a CREATE-d one, while a non-text added column falls back to BINARY
105
+ -- (resolveDefaultCollation type-gate). Under test:store this also covers the store
106
+ -- addColumn path and a persisted-DDL reopen round-trip.
107
+
108
+ create table t_add (id integer primary key);
109
+ alter table t_add add column name text; -- text → NOCASE under the default
110
+ alter table t_add add column qty integer; -- non-text → BINARY
111
+ select name, collation from table_info('t_add') order by cid;
112
+ → [{"name":"id","collation":"BINARY"},{"name":"name","collation":"NOCASE"},{"name":"qty","collation":"BINARY"}]
113
+
114
+ -- The added text column compares case-insensitively (NOCASE semantics).
115
+ insert into t_add values (1, 'a', 10);
116
+ select count(*) as n from t_add where name = 'A';
117
+ → [{"n":1}]
118
+
119
+ drop table t_add;
120
+
121
+ -- ===================================
122
+ -- 6. Reset to BINARY restores out-of-box semantics.
123
+ -- ===================================
124
+
125
+ pragma default_collation='binary';
126
+ pragma default_collation;
127
+ → [{"name": "default_collation", "value": "binary"}]
128
+
129
+ create table t_reset (id integer primary key, name text);
130
+ insert into t_reset values (1, 'a');
131
+ select count(*) as n from t_reset where name = 'A';
132
+ → [{"n":0}]
133
+ select name, collation from table_info('t_reset') order by cid;
134
+ → [{"name":"id","collation":"BINARY"},{"name":"name","collation":"BINARY"}]
135
+ drop table t_reset;
136
+
137
+ -- Note: rejection of an unknown default_collation (and value rollback) is covered by
138
+ -- core-api-features.spec.ts — via the pragma path setOption errors are surfaced as the
139
+ -- generic "Unknown pragma" (the real cause is chained), so the precise message is asserted
140
+ -- at the API level instead.
@@ -0,0 +1,79 @@
1
+ -- adapted from SQLite test/notnull.test
2
+ -- INSERT/UPDATE OR IGNORE / OR REPLACE / OR ABORT semantics on NOT NULL columns.
3
+ -- Existing 102-unique-constraints covers the UNIQUE flavor; this covers NOT NULL.
4
+
5
+ -- ===================================
6
+ -- 1. INSERT OR IGNORE silently skips NOT NULL violations
7
+ -- ===================================
8
+
9
+ create table t_oi (id integer primary key, name text, score integer);
10
+ insert into t_oi values (1, 'Alice', 10);
11
+
12
+ -- NULL into NOT NULL column with OR IGNORE → row skipped, no error
13
+ insert or ignore into t_oi values (2, null, 20);
14
+
15
+ select count(*) as cnt from t_oi;
16
+ → [{"cnt":1}]
17
+
18
+ insert or ignore into t_oi values (3, 'Bob', null);
19
+
20
+ select count(*) as cnt from t_oi;
21
+ → [{"cnt":1}]
22
+
23
+ -- valid row inserted
24
+ insert or ignore into t_oi values (4, 'Carol', 40);
25
+
26
+ select count(*) as cnt from t_oi;
27
+ → [{"cnt":2}]
28
+
29
+ drop table t_oi;
30
+
31
+ -- ===================================
32
+ -- 2. INSERT OR REPLACE on NOT NULL with no DEFAULT → still errors
33
+ -- ===================================
34
+
35
+ create table t_or_no_def (id integer primary key, name text);
36
+
37
+ insert or replace into t_or_no_def values (1, null);
38
+ -- error: NOT NULL
39
+
40
+ drop table t_or_no_def;
41
+
42
+ -- ===================================
43
+ -- 3. INSERT OR REPLACE on NOT NULL with DEFAULT — substitutes the default
44
+ -- ===================================
45
+
46
+ create table t_or_def (id integer primary key, name text default 'unknown');
47
+
48
+ insert or replace into t_or_def values (1, null);
49
+
50
+ select * from t_or_def where id = 1;
51
+ → [{"id":1,"name":"unknown"}]
52
+
53
+ drop table t_or_def;
54
+
55
+ -- ===================================
56
+ -- 4. UPDATE OR IGNORE / OR REPLACE — intentionally not supported.
57
+ -- ===================================
58
+ -- Per-statement conflict overrides on UPDATE are SQLite-only syntax; pinned closed.
59
+ -- Schema-level ON CONFLICT on the NOT NULL constraint covers the IGNORE/REPLACE defaults.
60
+ -- See docs/sql.md §11.
61
+
62
+ -- ===================================
63
+ -- 5. INSERT...SELECT propagates a NOT NULL violation from source
64
+ -- ===================================
65
+
66
+ create table src (id integer primary key, name text null);
67
+ create table dst (id integer primary key, name text);
68
+
69
+ insert into src values (1, 'a'), (2, null), (3, 'c');
70
+
71
+ insert into dst select id, name from src;
72
+ -- error: NOT NULL
73
+
74
+ -- whole INSERT aborted; nothing committed
75
+ select count(*) as cnt from dst;
76
+ → [{"cnt":0}]
77
+
78
+ drop table dst;
79
+ drop table src;
@@ -0,0 +1,95 @@
1
+ -- 43.2-deferred-check-new-on-delete.sqllogic
2
+ -- Regression guard for "No row context found for column <col>" on DELETE.
3
+ --
4
+ -- A deferred CHECK constraint (deferred because it contains a subquery) that
5
+ -- fires `on delete` and references `new.<col>` — typically via
6
+ -- `coalesce(new.<col>, old.<col>)` — used to raise
7
+ -- "No row context found for column <col>"
8
+ -- because the DELETE plan tree ran ConstraintCheckNode against the bare
9
+ -- N-column source row instead of the flat 2N OLD/NEW layout that INSERT/UPDATE
10
+ -- produce. Resolving a NEW attribute (which lives at flat indices n..2n-1) then
11
+ -- indexed past the row. The fix expands the DELETE source row to 2N (OLD section
12
+ -- = values being removed, NEW section = all NULL) BEFORE the constraint check.
13
+ --
14
+ -- This is the quereus-local twin of the sereus CadrePeer `AuthorizedInsert`
15
+ -- check (`coalesce(new, old).PeerId`); see
16
+ -- packages/cadre-core/test/seed-bootstrap.spec.ts on the sereus side.
17
+
18
+ -- ===================================================================
19
+ -- Setup: a registry lookup + a guarded table whose deferred CHECK fires
20
+ -- on insert AND delete and reads coalesce(new.rkey, old.rkey).
21
+ -- rkey is intentionally a NON-PK column so the NEW reference exercises a
22
+ -- plain flat-row NEW slot rather than any PK-specific path.
23
+ -- ===================================================================
24
+
25
+ create table registry (rkey text primary key);
26
+
27
+ create table guarded (
28
+ id integer primary key,
29
+ rkey text,
30
+ constraint key_registered check on insert, delete (
31
+ exists (select 1 from registry r where r.rkey = coalesce(new.rkey, old.rkey))
32
+ )
33
+ );
34
+
35
+ insert into registry values ('alpha');
36
+ insert into guarded values (1, 'alpha');
37
+ commit;
38
+ -- run
39
+
40
+ select count(*) from guarded;
41
+ → [{"count(*)":1}]
42
+
43
+ -- ===================================================================
44
+ -- DELETE: the deferred CHECK references new.rkey, which is NULL in the
45
+ -- all-NULL NEW section on delete; coalesce falls back to old.rkey='alpha',
46
+ -- which IS registered, so the deferred check passes at commit and the row
47
+ -- is removed. Before the fix this raised "No row context found".
48
+ -- ===================================================================
49
+
50
+ begin;
51
+ delete from guarded where id = 1;
52
+ commit;
53
+ -- run
54
+
55
+ select count(*) from guarded;
56
+ → [{"count(*)":0}]
57
+
58
+ -- ===================================================================
59
+ -- insert→delete→insert cycle: re-insert the same row after the delete and
60
+ -- read it back, exercising the round-trip through the now-coherent flat
61
+ -- OLD/NEW layout (the same cycle the sereus regression test walks).
62
+ -- ===================================================================
63
+
64
+ begin;
65
+ insert into guarded values (1, 'alpha');
66
+ commit;
67
+ -- run
68
+
69
+ select id, rkey from guarded;
70
+ → [{"id":1,"rkey":"alpha"}]
71
+
72
+ -- ===================================================================
73
+ -- The deferred CHECK genuinely fires on DELETE (not silently skipped):
74
+ -- drop the registry entry first so coalesce(new.rkey, old.rkey)='alpha'
75
+ -- misses, and the deferred check rejects the delete at commit. This proves
76
+ -- NEW/OLD resolve to a real value on the DELETE path rather than the check
77
+ -- being bypassed (which would let scenario 1 pass vacuously).
78
+ -- ===================================================================
79
+
80
+ begin;
81
+ delete from registry where rkey = 'alpha';
82
+ delete from guarded where id = 1;
83
+ commit;
84
+ -- error: CHECK constraint failed: key_registered
85
+
86
+ -- Failed commit rolled the whole transaction back: both rows survive.
87
+ select id, rkey from guarded;
88
+ → [{"id":1,"rkey":"alpha"}]
89
+
90
+ select rkey from registry;
91
+ → [{"rkey":"alpha"}]
92
+
93
+ drop table guarded;
94
+ drop table registry;
95
+ -- run