@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,554 @@
1
+ -- Test default value expressions
2
+ CREATE TABLE t_defaults(
3
+ id INTEGER PRIMARY KEY,
4
+ name TEXT DEFAULT 'unnamed',
5
+ created_timestamp INTEGER DEFAULT (1000 + 500),
6
+ computed TEXT DEFAULT ('prefix_' || 'suffix')
7
+ );
8
+
9
+ -- Insert with all columns - should not use defaults
10
+ INSERT INTO t_defaults VALUES (1, 'test1', 9999, 'custom');
11
+ SELECT * FROM t_defaults WHERE id = 1;
12
+ → [{"id":1,"name":"test1","created_timestamp":9999,"computed":"custom"}]
13
+
14
+ -- Insert with some columns omitted - should use default expressions
15
+ INSERT INTO t_defaults (id, name) VALUES (2, 'test2');
16
+ SELECT * FROM t_defaults WHERE id = 2;
17
+ → [{"id":2,"name":"test2","created_timestamp":1500,"computed":"prefix_suffix"}]
18
+
19
+ -- Insert with different columns omitted
20
+ INSERT INTO t_defaults (id, created_timestamp) VALUES (3, 2000);
21
+ SELECT * FROM t_defaults WHERE id = 3;
22
+ → [{"id":3,"name":"unnamed","created_timestamp":2000,"computed":"prefix_suffix"}]
23
+
24
+ -- Insert with only primary key - should use all defaults
25
+ INSERT INTO t_defaults (id) VALUES (4);
26
+ SELECT * FROM t_defaults WHERE id = 4;
27
+ → [{"id":4,"name":"unnamed","created_timestamp":1500,"computed":"prefix_suffix"}]
28
+
29
+ -- Verify all rows
30
+ SELECT * FROM t_defaults ORDER BY id;
31
+ → [{"id":1,"name":"test1","created_timestamp":9999,"computed":"custom"},{"id":2,"name":"test2","created_timestamp":1500,"computed":"prefix_suffix"},{"id":3,"name":"unnamed","created_timestamp":2000,"computed":"prefix_suffix"},{"id":4,"name":"unnamed","created_timestamp":1500,"computed":"prefix_suffix"}]
32
+
33
+ DROP TABLE t_defaults;
34
+
35
+ -- ===================================
36
+ -- DEFAULT deriving from a populated sibling via new.<column>
37
+ -- A default may read a value the INSERT actually supplies; only INSERT-supplied
38
+ -- columns are visible, so a default never depends on another column's default
39
+ -- (which would impose an evaluation-order race).
40
+ -- ===================================
41
+
42
+ CREATE TABLE t_newref (
43
+ id INTEGER PRIMARY KEY,
44
+ base INTEGER,
45
+ title TEXT,
46
+ doubled INTEGER DEFAULT (new.base * 2),
47
+ slug TEXT DEFAULT (lower(new.title))
48
+ );
49
+
50
+ -- Siblings populated → the defaults derive from them
51
+ INSERT INTO t_newref (id, base, title) VALUES (1, 10, 'Hello');
52
+ SELECT id, base, title, doubled, slug FROM t_newref WHERE id = 1;
53
+ → [{"id":1,"base":10,"title":"Hello","doubled":20,"slug":"hello"}]
54
+
55
+ -- An explicitly supplied value overrides the default (new.* unused)
56
+ INSERT INTO t_newref (id, base, title, doubled) VALUES (2, 10, 'X', 999);
57
+ SELECT doubled FROM t_newref WHERE id = 2;
58
+ → [{"doubled":999}]
59
+
60
+ -- Referencing a column the INSERT did not supply → clear resolution error
61
+ -- (here `title` is omitted, so `new.title` in slug's default has no value).
62
+ INSERT INTO t_newref (id, base) VALUES (3, 7);
63
+ -- error: isn't a column
64
+
65
+ DROP TABLE t_newref;
66
+
67
+ -- ===================================
68
+ -- new.<column> NOT NULL default — error attribution
69
+ -- A NOT NULL violation is always reported against the FIRST NOT-NULL column (in
70
+ -- declaration order) whose effective NEW value is NULL — independent of which
71
+ -- column any DEFAULT references. These cases run through the materialised-row
72
+ -- (buildNotNullDefaults) path via OR REPLACE / explicit values, NOT the
73
+ -- row-expansion `isn't a column` path above. They lock in that attribution
74
+ -- across the nullable / not-null sibling matrix so the historical
75
+ -- "misattribution" concern is not re-filed.
76
+ -- ===================================
77
+
78
+ -- A BARE sibling is itself NOT NULL (default_column_nullability='not_null', the
79
+ -- engine default — see 43-default-nullability.sqllogic). Omitting `a` makes IT
80
+ -- the first NOT-NULL violator, so the message names the sibling `a`, NOT the
81
+ -- defaulted column `b`. This is CORRECT: `a` violates its OWN NOT NULL and is
82
+ -- checked before `b`. (REPLACE form: `a` has no DEFAULT to substitute.)
83
+ create table c1 (id integer primary key, a integer, b integer not null default (new.a));
84
+ insert or replace into c1 (id, b) values (1, null);
85
+ -- error: NOT NULL constraint failed: c1.a
86
+
87
+ -- Plain INSERT/ABORT throws via a different site (throwForAction) but names the
88
+ -- same column.
89
+ insert into c1 (id, b) values (1, null);
90
+ -- error: NOT NULL constraint failed: c1.a
91
+
92
+ DROP TABLE c1;
93
+
94
+ -- When the sibling is EXPLICITLY nullable, NULL-ing it no longer makes it a
95
+ -- violator, so the defaulted NOT NULL column `b` is named instead.
96
+ create table c2 (id integer primary key, a integer null, b integer not null default (new.a));
97
+
98
+ -- OR REPLACE substitutes b's DEFAULT (new.a); the sibling is NULL (omitted), so
99
+ -- the substituted value is still NULL → names the defaulted column b.
100
+ insert or replace into c2 (id, b) values (1, null);
101
+ -- error: NOT NULL constraint failed: c2.b
102
+
103
+ -- Plain INSERT with explicit NULL for b: no substitution, b stays NULL → names b.
104
+ insert into c2 (id, b) values (2, null);
105
+ -- error: NOT NULL constraint failed: c2.b
106
+
107
+ -- Sibling supplied non-NULL → OR REPLACE substitutes new.a successfully, so b
108
+ -- takes the substituted sibling value (assert the STORED value, not just success).
109
+ insert or replace into c2 (id, a, b) values (3, 7, null);
110
+ select a, b from c2 where id = 3;
111
+ → [{"a":7,"b":7}]
112
+
113
+ -- Both sibling and defaulted column explicitly NULL → the default resolves to
114
+ -- NULL → names the defaulted column b.
115
+ insert or replace into c2 (id, a, b) values (4, null, null);
116
+ -- error: NOT NULL constraint failed: c2.b
117
+
118
+ -- IGNORE: the defaulted column is NULL with no usable default → the row is
119
+ -- silently skipped (IGNORE is handled before DEFAULT substitution), no error and
120
+ -- no row inserted.
121
+ insert or ignore into c2 (id, b) values (5, null);
122
+ select id from c2 where id = 5;
123
+ → []
124
+
125
+ -- IGNORE asymmetry — substitution is REPLACE-only. Here the DEFAULT *could*
126
+ -- satisfy NOT NULL (a=7 ⇒ new.a=7), yet OR IGNORE still skips the row: it bails
127
+ -- on the NOT NULL violation BEFORE attempting substitution. The id=5 case above
128
+ -- can't distinguish this from "substitute then re-check" (new.a is NULL there
129
+ -- regardless); a non-NULL sibling makes the row's absence the proof.
130
+ insert or ignore into c2 (id, a, b) values (6, 7, null);
131
+ select id from c2 where id = 6;
132
+ → []
133
+
134
+ DROP TABLE c2;
135
+
136
+ -- Column ordering — first violator wins. The NOT NULL DEFAULTED column `b` is
137
+ -- declared BEFORE its referenced sibling `a` (a is bare ⇒ also NOT NULL). With
138
+ -- both explicitly NULL, BOTH violate, but the message names `b` because it is
139
+ -- first in declaration order (matches SQLite's first-violation reporting).
140
+ -- Contrast c1, where the sibling came first and was named. Explicit NULLs keep
141
+ -- this on the materialised-row path; omitting both would instead raise the
142
+ -- row-expansion `isn't a column` resolution error.
143
+ create table c_ord (id integer primary key, b integer not null default (new.a), a integer);
144
+ insert or replace into c_ord (id, a, b) values (1, null, null);
145
+ -- error: NOT NULL constraint failed: c_ord.b
146
+
147
+ DROP TABLE c_ord;
148
+
149
+ -- ===================================
150
+ -- new.<column> through a single-source VIEW insert
151
+ -- A view INSERT re-plans through the same row-expansion path, so the default
152
+ -- still derives from the supplied sibling.
153
+ -- ===================================
154
+
155
+ CREATE TABLE base_nv (
156
+ id INTEGER PRIMARY KEY,
157
+ base INTEGER,
158
+ doubled INTEGER DEFAULT (new.base * 2)
159
+ );
160
+ CREATE VIEW v_nv AS SELECT id, base, doubled FROM base_nv;
161
+
162
+ INSERT INTO v_nv (id, base) VALUES (1, 10);
163
+ SELECT base, doubled FROM base_nv WHERE id = 1;
164
+ → [{"base":10,"doubled":20}]
165
+
166
+ DROP VIEW v_nv;
167
+ DROP TABLE base_nv;
168
+
169
+ -- ===================================
170
+ -- new.<column> nested inside a subquery in a DEFAULT resolves as a correlated
171
+ -- read of the row being inserted.
172
+ -- ===================================
173
+
174
+ CREATE TABLE t_sub (
175
+ id INTEGER PRIMARY KEY,
176
+ x INTEGER,
177
+ y INTEGER DEFAULT (coalesce((SELECT new.x), 0))
178
+ );
179
+ INSERT INTO t_sub (id, x) VALUES (1, 7);
180
+ SELECT y FROM t_sub WHERE id = 1;
181
+ → [{"y":7}]
182
+
183
+ DROP TABLE t_sub;
184
+
185
+ -- ===================================
186
+ -- new.<column> alongside GENERATED columns
187
+ -- A `new.` default coexists with generated columns (the two-pass expansion is
188
+ -- unaffected); but `new.<generated_col>` is NOT a source-supplied value, so it
189
+ -- raises a resolution error.
190
+ -- ===================================
191
+
192
+ CREATE TABLE t_gen (
193
+ id INTEGER PRIMARY KEY,
194
+ base INTEGER,
195
+ dbl INTEGER DEFAULT (new.base * 2),
196
+ g INTEGER GENERATED ALWAYS AS (base + 1) STORED
197
+ );
198
+ INSERT INTO t_gen (id, base) VALUES (1, 10);
199
+ SELECT dbl, g FROM t_gen WHERE id = 1;
200
+ → [{"dbl":20,"g":11}]
201
+
202
+ DROP TABLE t_gen;
203
+
204
+ CREATE TABLE t_gen_ref (
205
+ id INTEGER PRIMARY KEY,
206
+ x INTEGER,
207
+ g INTEGER GENERATED ALWAYS AS (x * 2) STORED,
208
+ y INTEGER DEFAULT (new.g)
209
+ );
210
+ INSERT INTO t_gen_ref (id, x) VALUES (1, 5);
211
+ -- error: isn't a column
212
+
213
+ DROP TABLE t_gen_ref;
214
+
215
+ -- ===================================
216
+ -- Identity-resolving default: new.<column> inside a correlated subquery over
217
+ -- ANOTHER base table resolves an existing parent row's key from a supplied
218
+ -- value (the PK-is-FK extension-table / lens basis pattern). The default reads
219
+ -- new.value and looks the matching parent rowId up, rather than minting a fresh
220
+ -- surrogate.
221
+ -- ===================================
222
+
223
+ CREATE TABLE h0_users_id (
224
+ rowId INTEGER PRIMARY KEY,
225
+ value INTEGER
226
+ );
227
+ INSERT INTO h0_users_id (rowId, value) VALUES (10, 100), (20, 200);
228
+
229
+ CREATE TABLE h2_uprof (
230
+ rowId INTEGER PRIMARY KEY DEFAULT (SELECT rowId FROM h0_users_id h0 WHERE h0.value = new.value),
231
+ value INTEGER
232
+ );
233
+
234
+ -- value=200 resolves the parent's rowId=20 through the correlated subquery
235
+ INSERT INTO h2_uprof (value) VALUES (200);
236
+ SELECT rowId, value FROM h2_uprof WHERE value = 200;
237
+ → [{"rowId":20,"value":200}]
238
+
239
+ -- a second resolution against a different supplied value
240
+ INSERT INTO h2_uprof (value) VALUES (100);
241
+ SELECT rowId, value FROM h2_uprof ORDER BY rowId;
242
+ → [{"rowId":10,"value":100},{"rowId":20,"value":200}]
243
+
244
+ DROP TABLE h2_uprof;
245
+ DROP TABLE h0_users_id;
246
+
247
+ -- ===================================
248
+ -- ALTER COLUMN SET DEFAULT routes through the same DDL validator CREATE TABLE uses,
249
+ -- so the stored default is consistent with what INSERT will accept: `new.<column>`
250
+ -- is accepted (deferred to INSERT time); a bare column / non-deterministic default
251
+ -- is rejected at ALTER time (closing the previously-silent-accept gap).
252
+ -- ===================================
253
+
254
+ create table sd_t (id integer primary key, x integer, y integer);
255
+
256
+ -- a `new.<col>` SET DEFAULT is accepted (build/determinism deferred to INSERT).
257
+ alter table sd_t alter column y set default (new.x * 10);
258
+
259
+ -- and is exercised by a later insert that supplies the sibling.
260
+ insert into sd_t (id, x) values (1, 4);
261
+ select x, y from sd_t where id = 1;
262
+ → [{"x":4,"y":40}]
263
+
264
+ -- supplying y directly overrides the default.
265
+ insert into sd_t (id, x, y) values (2, 4, 99);
266
+ select x, y from sd_t where id = 2;
267
+ → [{"x":4,"y":99}]
268
+
269
+ -- omitting the sibling the default reads → the same resolution error as the
270
+ -- single-source path (new.x has no supplied value).
271
+ insert into sd_t (id) values (3);
272
+ -- error: isn't a column
273
+
274
+ DROP TABLE sd_t;
275
+
276
+ -- a bare-column SET DEFAULT is now rejected at ALTER time (no mutation context).
277
+ create table sd_bare (id integer primary key, a integer, b integer);
278
+ alter table sd_bare alter column b set default (a + 1);
279
+ -- error: bare column
280
+ DROP TABLE sd_bare;
281
+
282
+ -- a non-deterministic SET DEFAULT is rejected at ALTER time.
283
+ create table sd_nd (id integer primary key, v integer);
284
+ alter table sd_nd alter column v set default (random());
285
+ -- error: non-deterministic
286
+ DROP TABLE sd_nd;
287
+
288
+ -- DROP DEFAULT needs no validation and still works.
289
+ create table sd_drop (id integer primary key, w integer null default 7);
290
+ insert into sd_drop (id) values (1);
291
+ select w from sd_drop where id = 1;
292
+ → [{"w":7}]
293
+ alter table sd_drop alter column w drop default;
294
+ insert into sd_drop (id) values (2);
295
+ select w from sd_drop where id = 2;
296
+ → [{"w":null}]
297
+ DROP TABLE sd_drop;
298
+
299
+ -- ===================================
300
+ -- ALTER TABLE ADD COLUMN with a new.<column> DEFAULT backfills existing rows
301
+ -- per-row from their OWN sibling, and a later insert derives the column from the
302
+ -- INSERT-supplied sibling (parity with the single-source path).
303
+ -- ===================================
304
+
305
+ create table ac_t (id integer primary key, base integer);
306
+ insert into ac_t (id, base) values (1, 10), (2, 5), (3, 0);
307
+
308
+ -- new.<col> default: each existing row backfills from its own base.
309
+ alter table ac_t add column doubled integer default (new.base * 2);
310
+ select id, base, doubled from ac_t order by id;
311
+ → [{"id":1,"base":10,"doubled":20},{"id":2,"base":5,"doubled":10},{"id":3,"base":0,"doubled":0}]
312
+
313
+ -- a later insert supplying base derives doubled.
314
+ insert into ac_t (id, base) values (4, 7);
315
+ select doubled from ac_t where id = 4;
316
+ → [{"doubled":14}]
317
+
318
+ -- an explicitly supplied value still overrides the default.
319
+ insert into ac_t (id, base, doubled) values (5, 7, 999);
320
+ select doubled from ac_t where id = 5;
321
+ → [{"doubled":999}]
322
+
323
+ -- omitting the sibling the default reads → the same resolution error as the
324
+ -- single-source insert path (new.base has no supplied value).
325
+ insert into ac_t (id) values (6);
326
+ -- error: isn't a column
327
+
328
+ DROP TABLE ac_t;
329
+
330
+ -- A literal-folding ADD COLUMN default still bulk-backfills (fast path unchanged).
331
+ create table ac_lit (id integer primary key, a integer);
332
+ insert into ac_lit (id, a) values (1, 1), (2, 2);
333
+ alter table ac_lit add column c integer default (3 + 4);
334
+ select id, c from ac_lit order by id;
335
+ → [{"id":1,"c":7},{"id":2,"c":7}]
336
+ DROP TABLE ac_lit;
337
+
338
+ -- ADD COLUMN NOT NULL whose per-row backfill is non-null for every row succeeds.
339
+ create table ac_nn2 (id integer primary key, base integer not null);
340
+ insert into ac_nn2 (id, base) values (1, 10), (2, 4);
341
+ alter table ac_nn2 add column doubled integer not null default (new.base * 2);
342
+ select id, base, doubled from ac_nn2 order by id;
343
+ → [{"id":1,"base":10,"doubled":20},{"id":2,"base":4,"doubled":8}]
344
+ DROP TABLE ac_nn2;
345
+
346
+ -- ADD COLUMN NOT NULL whose per-row backfill yields NULL for some row is rejected,
347
+ -- and the table is left unchanged (the new column was not added).
348
+ create table ac_nn (id integer primary key, base integer null);
349
+ insert into ac_nn (id, base) values (1, 10), (2, null);
350
+ alter table ac_nn add column doubled integer not null default (new.base * 2);
351
+ -- error:
352
+ select * from ac_nn order by id;
353
+ → [{"id":1,"base":10},{"id":2,"base":null}]
354
+ DROP TABLE ac_nn;
355
+
356
+ -- ADD COLUMN with BOTH a non-foldable (per-row) DEFAULT and a CHECK on the new
357
+ -- column enforces the CHECK against every backfilled row, evaluated per-row inside
358
+ -- the backfill hook (mirrors the NOT NULL per-row path). A passing CHECK adds the
359
+ -- column and backfills; a violating row aborts the ALTER and leaves the table
360
+ -- unchanged on both the memory and store modules. The literal-default + CHECK path
361
+ -- (see 90.2.1 §3) is unaffected and still validates/reverts via the post-backfill scan.
362
+
363
+ -- Passing CHECK: every backfilled row satisfies it → column added with derived values.
364
+ create table ac_chk_ok (id integer primary key, base integer null);
365
+ insert into ac_chk_ok (id, base) values (1, 5), (2, 3);
366
+ alter table ac_chk_ok add column c integer default (new.base * 2) check (c > 0);
367
+ select id, base, c from ac_chk_ok order by id;
368
+ → [{"id":1,"base":5,"c":10},{"id":2,"base":3,"c":6}]
369
+ DROP TABLE ac_chk_ok;
370
+
371
+ -- A CHECK referencing BOTH the new column and an existing sibling resolves both.
372
+ create table ac_chk_ref (id integer primary key, base integer null);
373
+ insert into ac_chk_ref (id, base) values (1, 5), (2, 3);
374
+ alter table ac_chk_ref add column c integer default (new.base * 2) check (c > base);
375
+ select id, base, c from ac_chk_ref order by id;
376
+ → [{"id":1,"base":5,"c":10},{"id":2,"base":3,"c":6}]
377
+ DROP TABLE ac_chk_ref;
378
+
379
+ -- One backfilled row violates the CHECK (base=-3 → c=-6, fails c > 0): the ALTER aborts
380
+ -- and the table is left unchanged (no `c` column).
381
+ create table ac_chk_bad (id integer primary key, base integer null);
382
+ insert into ac_chk_bad (id, base) values (1, 5), (2, -3);
383
+ alter table ac_chk_bad add column c integer default (new.base * 2) check (c > 0);
384
+ -- error:
385
+ select * from ac_chk_bad order by id;
386
+ → [{"id":1,"base":5},{"id":2,"base":-3}]
387
+ DROP TABLE ac_chk_bad;
388
+
389
+ -- ALL rows violate the CHECK (the original silent-admission scenario): still rejected and
390
+ -- the table is left unchanged.
391
+ create table ac_chk_all (id integer primary key, base integer null);
392
+ insert into ac_chk_all (id, base) values (1, 5), (2, 3);
393
+ alter table ac_chk_all add column c integer default (new.base * 2) check (c > 1000000);
394
+ -- error:
395
+ select * from ac_chk_all order by id;
396
+ → [{"id":1,"base":5},{"id":2,"base":3}]
397
+ DROP TABLE ac_chk_all;
398
+
399
+ -- MULTIPLE CHECKs on one ADD COLUMN, all satisfied → column added (each predicate
400
+ -- compiled and evaluated per backfilled row).
401
+ create table ac_chk_multi_ok (id integer primary key, base integer null);
402
+ insert into ac_chk_multi_ok (id, base) values (1, 5), (2, 3);
403
+ alter table ac_chk_multi_ok add column c integer default (new.base * 2) check (c > 0) check (c < 100);
404
+ select id, base, c from ac_chk_multi_ok order by id;
405
+ → [{"id":1,"base":5,"c":10},{"id":2,"base":3,"c":6}]
406
+ DROP TABLE ac_chk_multi_ok;
407
+
408
+ -- MULTIPLE CHECKs where the SECOND fails for one row (row 1: c=10 fails c < 8): the ALTER
409
+ -- aborts and the table is left unchanged — confirms every predicate is enforced, not just
410
+ -- the first.
411
+ create table ac_chk_multi_bad (id integer primary key, base integer null);
412
+ insert into ac_chk_multi_bad (id, base) values (1, 5), (2, 3);
413
+ alter table ac_chk_multi_bad add column c integer default (new.base * 2) check (c > 0) check (c < 8);
414
+ -- error:
415
+ select * from ac_chk_multi_bad order by id;
416
+ → [{"id":1,"base":5},{"id":2,"base":3}]
417
+ DROP TABLE ac_chk_multi_bad;
418
+
419
+ -- After a successful per-row CHECK ADD COLUMN, the CHECK is merged into the table-level
420
+ -- constraint set, so a FUTURE insert violating it is rejected (the backfill enforcement
421
+ -- and write-time enforcement share the same predicate).
422
+ create table ac_chk_future (id integer primary key, base integer null);
423
+ insert into ac_chk_future (id, base) values (1, 5);
424
+ alter table ac_chk_future add column c integer default (new.base * 2) check (c > 0);
425
+ insert into ac_chk_future (id, base, c) values (2, 1, -5);
426
+ -- error:
427
+ select id, base, c from ac_chk_future order by id;
428
+ → [{"id":1,"base":5,"c":10}]
429
+ DROP TABLE ac_chk_future;
430
+
431
+ -- TRUTHINESS: a bare-column CHECK yields bigint 0n for a backfilled 0 (integer
432
+ -- literals lex to bigint at runtime). The old backfill test `result === false ||
433
+ -- result === 0` missed 0n and silently admitted the row; the shared isTruthy rule
434
+ -- rejects it. base=0 → c=0n → CHECK fails → ALTER aborts, table unchanged.
435
+ create table ac_chk_truthy (id integer primary key, base integer null);
436
+ insert into ac_chk_truthy (id, base) values (1, 5), (2, 0);
437
+ alter table ac_chk_truthy add column c integer default (new.base) check (c);
438
+ -- error:
439
+ select * from ac_chk_truthy order by id;
440
+ → [{"id":1,"base":5},{"id":2,"base":0}]
441
+ DROP TABLE ac_chk_truthy;
442
+
443
+ -- TRUTHINESS control: all backfilled values truthy → column added.
444
+ create table ac_chk_truthy_ok (id integer primary key, base integer null);
445
+ insert into ac_chk_truthy_ok (id, base) values (1, 5), (2, 3);
446
+ alter table ac_chk_truthy_ok add column c integer default (new.base) check (c);
447
+ select id, base, c from ac_chk_truthy_ok order by id;
448
+ → [{"id":1,"base":5,"c":5},{"id":2,"base":3,"c":3}]
449
+ DROP TABLE ac_chk_truthy_ok;
450
+
451
+ -- COLLATION parity: a `collate nocase` new column with a CHECK comparing it to a lowercase
452
+ -- literal. The backfilled value 'ABC' equals 'abc' only under NOCASE — so this passes iff the
453
+ -- new column's declared collation drives the backfill-time CHECK (matching write-time).
454
+ create table ac_chk_coll (id integer primary key, name text);
455
+ insert into ac_chk_coll (id, name) values (1, 'ABC');
456
+ alter table ac_chk_coll add column c text collate nocase default (new.name) check (c = 'abc');
457
+ select id, name, c from ac_chk_coll order by id;
458
+ → [{"id":1,"name":"ABC","c":"ABC"}]
459
+ DROP TABLE ac_chk_coll;
460
+
461
+ -- ADD COLUMN with a new.<col> default on an EMPTY table: no rows to backfill, so
462
+ -- even a NOT NULL per-row default adds cleanly; future inserts derive the value.
463
+ create table ac_empty (id integer primary key, base integer);
464
+ alter table ac_empty add column doubled integer not null default (new.base * 2);
465
+ insert into ac_empty (id, base) values (1, 4);
466
+ select id, base, doubled from ac_empty order by id;
467
+ → [{"id":1,"base":4,"doubled":8}]
468
+ DROP TABLE ac_empty;
469
+
470
+ -- A default reading MULTIPLE new.<col> siblings backfills each existing row from its own.
471
+ create table ac_multi (id integer primary key, a integer, b integer);
472
+ insert into ac_multi (id, a, b) values (1, 2, 3), (2, 10, 1);
473
+ alter table ac_multi add column s integer default (new.a + new.b);
474
+ select id, s from ac_multi order by id;
475
+ → [{"id":1,"s":5},{"id":2,"s":11}]
476
+ DROP TABLE ac_multi;
477
+
478
+ -- ===================================
479
+ -- Identity-resolving default through a DECOMPOSITION fan-out. The anchor key
480
+ -- column's surrogate `default` correlates on a SIBLING supplied logical column
481
+ -- (`new.value`) the anchor's own base table does NOT carry — it lives on another
482
+ -- member. The produced row's NEW context now threads into every member insert, so
483
+ -- the engine's own fan-out resolves the parent surrogate per produced row and
484
+ -- EC-threads it across the members (the multi-member dual of the single-source
485
+ -- identity-resolving default above). Before this, the fan-out's buildNotNullDefaults
486
+ -- raised `new.value isn't a column` from buildDecompositionMemberInsert.
487
+ -- ===================================
488
+
489
+ create table hd_parent (pid integer primary key, value integer);
490
+
491
+ -- run
492
+
493
+ insert into hd_parent (pid, value) values (10, 100), (20, 200), (30, 300);
494
+
495
+ -- run
496
+
497
+ -- Per-column decomposition of logical T(value): anchor hd_anchor holds ONLY the
498
+ -- surrogate key rowId, whose default resolves the parent's pid from the inserted
499
+ -- value (`new.value`); member hd_value carries the value column. The resolved rowId
500
+ -- threads from the anchor default into hd_value via the shared key.
501
+ create table hd_anchor (
502
+ rowId integer primary key default (select pid from hd_parent p where p.value = new.value)
503
+ ) with tags (
504
+ "quereus.lens.decomp.logical.dT" = 'T',
505
+ "quereus.lens.decomp.role.dT" = 'primary-storage',
506
+ "quereus.lens.decomp.anchor.dT" = 'hd_anchor',
507
+ "quereus.lens.decomp.presence.dT" = 'mandatory',
508
+ "quereus.lens.decomp.keykind.dT" = 'surrogate',
509
+ "quereus.lens.decomp.key.dT" = 'rowId'
510
+ );
511
+
512
+ create table hd_value (rowId integer primary key, value integer) with tags (
513
+ "quereus.lens.decomp.logical.dT" = 'T',
514
+ "quereus.lens.decomp.role.dT" = 'primary-storage',
515
+ "quereus.lens.decomp.anchor.dT" = 'hd_anchor',
516
+ "quereus.lens.decomp.presence.dT" = 'mandatory',
517
+ "quereus.lens.decomp.keykind.dT" = 'surrogate',
518
+ "quereus.lens.decomp.key.dT" = 'rowId',
519
+ "quereus.lens.decomp.col.dT.value" = 'value'
520
+ );
521
+
522
+ -- run
523
+
524
+ declare logical schema xd { table T { value integer } }
525
+
526
+ -- run
527
+
528
+ apply schema xd;
529
+
530
+ -- run
531
+
532
+ -- value=200 resolves the parent pid=20 via the anchor default and threads that
533
+ -- surrogate into the value member (no longer throws `new.value isn't a column`).
534
+ insert into xd.T (value) values (200);
535
+ select rowId, value from hd_value;
536
+ → [{"rowId":20,"value":200}]
537
+
538
+ -- the identical surrogate landed on the anchor member.
539
+ select rowId from hd_anchor;
540
+ → [{"rowId":20}]
541
+
542
+ -- Multi-row in ONE statement: each produced row resolves its OWN parent from its
543
+ -- supplied value (the NEW context is per produced row, not once per statement).
544
+ insert into xd.T (value) values (100), (300);
545
+ select rowId, value from hd_value order by rowId;
546
+ → [{"rowId":10,"value":100},{"rowId":20,"value":200},{"rowId":30,"value":300}]
547
+
548
+ -- the view reads back the full logical image (anchor ⋈ value on the shared key).
549
+ select value from xd.T order by value;
550
+ → [{"value":100},{"value":200},{"value":300}]
551
+
552
+ DROP TABLE hd_value;
553
+ DROP TABLE hd_anchor;
554
+ DROP TABLE hd_parent;
@@ -0,0 +1,99 @@
1
+ -- adapted from SQLite test/default.test
2
+ -- DEFAULT expression edge cases beyond 03.4-defaults.sqllogic.
3
+ -- Quereus rejects non-deterministic defaults (CURRENT_TIMESTAMP, random()),
4
+ -- so those scenarios are excluded by design — see 44-determinism-validation.
5
+
6
+ -- ===================================
7
+ -- 1. Negative integer literal default
8
+ -- ===================================
9
+
10
+ create table t_neg (id integer primary key, n integer default -42);
11
+ insert into t_neg (id) values (1);
12
+
13
+ select n from t_neg where id = 1;
14
+ → [{"n":-42}]
15
+
16
+ drop table t_neg;
17
+
18
+ -- ===================================
19
+ -- 2. Boundary integer literal defaults
20
+ -- ===================================
21
+
22
+ create table t_bounds (
23
+ id integer primary key,
24
+ a integer default 2147483647,
25
+ b integer default 2147483648,
26
+ c integer default 9223372036854775807,
27
+ d integer default -2147483648,
28
+ e integer default -9223372036854775808
29
+ );
30
+
31
+ insert into t_bounds (id) values (1);
32
+
33
+ select a, b, c, d, e from t_bounds where id = 1;
34
+ → [{"a":2147483647,"b":2147483648,"c":9223372036854775807,"d":-2147483648,"e":-9223372036854775808}]
35
+
36
+ drop table t_bounds;
37
+
38
+ -- ===================================
39
+ -- 3. REAL literal default
40
+ -- ===================================
41
+
42
+ create table t_real (id integer primary key, r real default 4.36);
43
+ insert into t_real (id) values (1);
44
+
45
+ select typeof(r), r from t_real where id = 1;
46
+ → [{"typeof(r)":"real","r":4.36}]
47
+
48
+ drop table t_real;
49
+
50
+ -- ===================================
51
+ -- 4. INSERT DEFAULT VALUES — Quereus requires explicit VALUES or SELECT
52
+ -- ===================================
53
+
54
+ create table t_dv (
55
+ id integer primary key default 1,
56
+ a integer default 7,
57
+ b text default 'x'
58
+ );
59
+
60
+ insert into t_dv default values;
61
+ -- error: Expected VALUES, SELECT, or DML
62
+
63
+ drop table t_dv;
64
+
65
+ -- ===================================
66
+ -- 5. DEFAULT combined with NOT NULL + UNIQUE + CHECK
67
+ -- ===================================
68
+
69
+ create table t_combo (
70
+ id integer primary key,
71
+ b integer default 12345 unique not null check (b >= 0 and b < 99999)
72
+ );
73
+
74
+ insert into t_combo (id) values (1);
75
+
76
+ select b from t_combo where id = 1;
77
+ → [{"b":12345}]
78
+
79
+ -- second insert reuses default → UNIQUE conflict
80
+ insert into t_combo (id) values (2);
81
+ -- error:
82
+
83
+ drop table t_combo;
84
+
85
+ -- ===================================
86
+ -- 6. Bind parameter in DEFAULT rejected at DDL time
87
+ -- ===================================
88
+
89
+ create table t_param (id integer primary key, b text default (:xyz));
90
+ -- error: bind parameters
91
+ drop table if exists t_param;
92
+
93
+ -- ===================================
94
+ -- 7. Column reference inside DEFAULT rejected
95
+ -- ===================================
96
+
97
+ create table t_colref (id integer primary key, x integer not null, y integer default (x + 1));
98
+ -- error: generated column
99
+ drop table if exists t_colref;