@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,232 @@
1
+ -- adapted from SQLite test/returning1.test
2
+ -- RETURNING extras beyond 42-returning.sqllogic basics:
3
+ -- subqueries in RETURNING expressions, INSERT...SELECT with RETURNING,
4
+ -- generated columns, quoted identifiers, RETURNING on no-op upsert.
5
+
6
+ -- ===================================
7
+ -- 1. RETURNING with scalar subquery in expression list
8
+ -- ===================================
9
+
10
+ create table tally (id integer primary key, val integer);
11
+ insert into tally values (1, 100), (2, 200);
12
+
13
+ insert into tally (id, val) values (3, 150)
14
+ returning id, (select count(*) from tally where val > 150) as higher_count;
15
+ → [{"id":3,"higher_count":1}]
16
+
17
+ select count(*) as cnt from tally;
18
+ → [{"cnt":3}]
19
+
20
+ drop table tally;
21
+
22
+ -- ===================================
23
+ -- 2. INSERT ... SELECT with RETURNING (multi-row)
24
+ -- ===================================
25
+
26
+ create table src_xfer (id integer primary key, val integer);
27
+ create table dst_xfer (id integer primary key, val integer);
28
+ insert into src_xfer values (1, 100), (2, 200), (3, 300);
29
+
30
+ insert into dst_xfer select id, val from src_xfer returning id, val;
31
+ → [{"id":1,"val":100},{"id":2,"val":200},{"id":3,"val":300}]
32
+
33
+ select id, val from dst_xfer order by id;
34
+ → [{"id":1,"val":100},{"id":2,"val":200},{"id":3,"val":300}]
35
+
36
+ drop table dst_xfer;
37
+ drop table src_xfer;
38
+
39
+ -- ===================================
40
+ -- 3. RETURNING with quoted identifier and bracket-quoted column
41
+ -- ===================================
42
+
43
+ create table quoted_cols (id integer primary key, "Name" text);
44
+ insert into quoted_cols values (1, 'first') returning id, "Name" as name_out;
45
+ → [{"id":1,"name_out":"first"}]
46
+
47
+ -- bracket-quoted identifier [Name] in RETURNING projection preserves case
48
+ insert into quoted_cols values (2, 'second') returning id, [Name];
49
+ → [{"id":2,"Name":"second"}]
50
+
51
+ drop table quoted_cols;
52
+
53
+ -- ===================================
54
+ -- 4. RETURNING on no-op UPSERT (DO NOTHING) returns no row
55
+ -- ===================================
56
+
57
+ create table noop (id integer primary key, val text);
58
+ insert into noop values (1, 'a');
59
+
60
+ insert into noop values (1, 'b') on conflict do nothing returning id, val;
61
+ → []
62
+
63
+ -- existing row unchanged
64
+ select id, val from noop;
65
+ → [{"id":1,"val":"a"}]
66
+
67
+ drop table noop;
68
+
69
+ -- ===================================
70
+ -- 5. RETURNING on INSERT with computed expression and aggregate-style call
71
+ -- ===================================
72
+
73
+ create table greet (id integer primary key, name text);
74
+
75
+ insert into greet values (1, 'world')
76
+ returning id, 'hello, ' || name as msg, length(name) as n;
77
+ → [{"id":1,"msg":"hello, world","n":5}]
78
+
79
+ drop table greet;
80
+
81
+ -- ===================================
82
+ -- 6. RETURNING from generated-column table omits / includes generated col
83
+ -- ===================================
84
+
85
+ create table gen_t (id integer primary key, name text, display text generated always as (upper(name)));
86
+
87
+ -- baseline: stored columns return
88
+ insert into gen_t (id, name) values (1, 'alice') returning id, name;
89
+ → [{"id":1,"name":"alice"}]
90
+
91
+ -- generated column referenced in RETURNING projection
92
+ insert into gen_t (id, name) values (2, 'bob') returning id, name, display;
93
+ → [{"id":2,"name":"bob","display":"BOB"}]
94
+
95
+ drop table gen_t;
96
+
97
+ -- ===================================
98
+ -- 7. UPDATE OR <action> is intentionally not supported
99
+ -- ===================================
100
+ -- Per-statement conflict overrides on UPDATE are SQLite-only syntax; pinned closed.
101
+ -- See docs/sql.md §11.
102
+
103
+ create table or_ig (id integer primary key, code text unique);
104
+ insert into or_ig values (1, 'x'), (2, 'y');
105
+
106
+ update or ignore or_ig set code = 'x' where id = 2 returning id, code;
107
+ -- error: Expected table name
108
+
109
+ drop table or_ig;
110
+
111
+ -- ===================================
112
+ -- 8. RETURNING with two scalar subqueries that share a plan subtree.
113
+ -- (Regression: shared-subtree row-context collision under store mode —
114
+ -- see ticket serialize-emit-callbacks-returning-window. The cache rule
115
+ -- deduplicates the two textually-identical derived tables, so both
116
+ -- subqueries iterate the same inner scan; without serialized
117
+ -- evaluation they raced on the shared RowSlot under LevelDB.)
118
+ -- ===================================
119
+
120
+ create table tr (id integer primary key, v integer);
121
+ insert into tr values (1, 10), (2, 20), (3, 30);
122
+
123
+ insert into tr values (4, 40)
124
+ returning
125
+ (select count(*) from (select * from tr where v >= 20) sub1) as count,
126
+ (select sum(v) from (select * from tr where v >= 20) sub2) as sum;
127
+ → [{"count":3,"sum":90}]
128
+
129
+ drop table tr;
130
+
131
+ -- ===================================
132
+ -- 9. RETURNING * / table.* on a base-table INSERT / UPDATE / DELETE
133
+ -- ===================================
134
+ -- `*` expands to every target column in declaration order; the unqualified
135
+ -- symbols bind the statement's default image (NEW for INSERT/UPDATE, OLD for
136
+ -- DELETE). Output names are the bare column names regardless of qualifier.
137
+
138
+ create table star_t (id integer primary key, name text, value integer default 100);
139
+
140
+ -- INSERT ... RETURNING * → full row, declaration order; DEFAULT 100 surfaced.
141
+ insert into star_t (id, name) values (1, 'a') returning *;
142
+ → [{"id":1,"name":"a","value":100}]
143
+
144
+ -- INSERT ... RETURNING table.* (qualified by the target table name) → same as *.
145
+ insert into star_t (id, name, value) values (2, 'b', 200) returning star_t.*;
146
+ → [{"id":2,"name":"b","value":200}]
147
+
148
+ -- a wrong qualifier errors (not a generic crash, not a silent expand).
149
+ insert into star_t (id, name) values (3, 'c') returning bogus.*;
150
+ -- error: not found
151
+
152
+ -- the rejected insert made no row (id=3 absent).
153
+ select id from star_t order by id;
154
+ → [{"id":1},{"id":2}]
155
+
156
+ -- UPDATE ... RETURNING * → the NEW (post-update) image, full row.
157
+ update star_t set value = 101 where id = 1 returning *;
158
+ → [{"id":1,"name":"a","value":101}]
159
+
160
+ -- mixed projection, trailing: * expands in place, the extra `name` keeps its
161
+ -- position and is de-duplicated to `name:1`.
162
+ update star_t set value = 102 where id = 1 returning *, name;
163
+ → [{"id":1,"name":"a","value":102,"name:1":"a"}]
164
+
165
+ -- mixed projection, leading: a column before * keeps position (the star copy of
166
+ -- `id` de-duplicates to `id:1`).
167
+ update star_t set value = 103 where id = 1 returning id, *;
168
+ → [{"id":1,"id:1":1,"name":"a","value":103}]
169
+
170
+ -- OLD-qualified expression composes with * (which is the NEW image).
171
+ update star_t set value = 200 where id = 1 returning old.value, *;
172
+ → [{"old.value":103,"id":1,"name":"a","value":200}]
173
+
174
+ -- DELETE ... RETURNING * → the OLD (deleted) image, full row.
175
+ delete from star_t where id = 2 returning *;
176
+ → [{"id":2,"name":"b","value":200}]
177
+
178
+ -- zero-row mutations with * yield an empty result set, not an error.
179
+ update star_t set value = 0 where 1 = 0 returning *;
180
+ → []
181
+
182
+ delete from star_t where 1 = 0 returning *;
183
+ → []
184
+
185
+ -- relational orthogonality: RETURNING * makes the DML a relation usable in CTE
186
+ -- position (a wider projection). Insert form:
187
+ with ins as (insert into star_t (id, name, value) values (5, 'e', 50) returning *)
188
+ select count(*) as c from ins;
189
+ → [{"c":1}]
190
+
191
+ -- ...and delete form.
192
+ with d as (delete from star_t where id = 5 returning *)
193
+ select id, name, value from d;
194
+ → [{"id":5,"name":"e","value":50}]
195
+
196
+ -- interaction: a multi-row INSERT ... RETURNING * emits one expanded row per
197
+ -- inserted row (the star is the projection list; the executor supplies the rows).
198
+ insert into star_t (id, name, value) values (10, 'j', 1), (11, 'k', 2) returning *;
199
+ → [{"id":10,"name":"j","value":1},{"id":11,"name":"k","value":2}]
200
+
201
+ -- ...and a multi-row UPDATE ... RETURNING * emits one NEW image per updated row.
202
+ update star_t set value = value + 100 where id in (10, 11) returning *;
203
+ → [{"id":10,"name":"j","value":101},{"id":11,"name":"k","value":102}]
204
+
205
+ drop table star_t;
206
+
207
+ -- ===================================
208
+ -- 10. RETURNING * surfaces resolved DEFAULT and generated-column values
209
+ -- ===================================
210
+
211
+ create table gstar (id integer primary key, name text, qty integer default 7,
212
+ display text generated always as (upper(name)));
213
+
214
+ insert into gstar (id, name) values (1, 'alice') returning *;
215
+ → [{"id":1,"name":"alice","qty":7,"display":"ALICE"}]
216
+
217
+ drop table gstar;
218
+
219
+ -- ===================================
220
+ -- 11. RETURNING * over a collated column round-trips the stored value, and the
221
+ -- column's declared collation still drives the WHERE match (the * column
222
+ -- resolves through the same symbol a named column would).
223
+ -- ===================================
224
+
225
+ create table cstar (id integer primary key, name text collate nocase);
226
+ insert into cstar values (1, 'Hello'), (2, 'WORLD');
227
+
228
+ -- nocase WHERE matches 'hello' → 'Hello'; * returns the verbatim stored value.
229
+ update cstar set name = name where name = 'hello' returning *;
230
+ → [{"id":1,"name":"Hello"}]
231
+
232
+ drop table cstar;
@@ -0,0 +1,165 @@
1
+ -- 42.2-returning-stored-row.sqllogic — RETURNING must report the row the
2
+ -- storage layer actually STORED, not the raw values the statement proposed.
3
+ --
4
+ -- Coercion happens inside vtab.update(), below the DML executor: a `json`
5
+ -- column given the text '{"a":2}' stores a native JSON value, and an
6
+ -- `integer`-affinity column given the text '7' stores the number 7. The
7
+ -- executor used to build RETURNING (and change tracking, and materialized-view
8
+ -- maintenance) from the PRE-coercion row, so the same column had two
9
+ -- observable values depending on which door you looked through.
10
+ --
11
+ -- Every case below is a PARITY assertion: what `returning` reports must equal
12
+ -- what a following `select` reports — value AND typeof. typeof() is what makes
13
+ -- the assertion sharp; a raw '{"a":2}' would report 'text', the stored value
14
+ -- reports 'json'.
15
+
16
+ -- ===================================
17
+ -- 1. INSERT ... RETURNING reports the coerced row
18
+ -- ===================================
19
+
20
+ create table sr_ins (id integer primary key, j json, n integer);
21
+
22
+ insert into sr_ins values (1, '{"a":2}', '7')
23
+ returning j, typeof(j) as jt, n, typeof(n) as nt;
24
+ → [{"j":{"a":2},"jt":"json","n":7,"nt":"integer"}]
25
+
26
+ select j, typeof(j) as jt, n, typeof(n) as nt from sr_ins where id = 1;
27
+ → [{"j":{"a":2},"jt":"json","n":7,"nt":"integer"}]
28
+
29
+ -- RETURNING * takes the same path
30
+ insert into sr_ins values (2, '[1,2]', '8') returning *;
31
+ → [{"id":2,"j":[1,2],"n":8}]
32
+
33
+ select * from sr_ins where id = 2;
34
+ → [{"id":2,"j":[1,2],"n":8}]
35
+
36
+ -- multi-row INSERT: every emitted row is its own stored row
37
+ insert into sr_ins values (3, '{"b":1}', '9'), (4, '{"c":2}', '10')
38
+ returning id, j, typeof(j) as jt, n, typeof(n) as nt;
39
+ → [{"id":3,"j":{"b":1},"jt":"json","n":9,"nt":"integer"},{"id":4,"j":{"c":2},"jt":"json","n":10,"nt":"integer"}]
40
+
41
+ select id, j, typeof(j) as jt, n, typeof(n) as nt from sr_ins where id in (3, 4) order by id;
42
+ → [{"id":3,"j":{"b":1},"jt":"json","n":9,"nt":"integer"},{"id":4,"j":{"c":2},"jt":"json","n":10,"nt":"integer"}]
43
+
44
+ drop table sr_ins;
45
+
46
+ -- ===================================
47
+ -- 2. UPDATE ... RETURNING reports the coerced NEW row; OLD stays the stored
48
+ -- pre-update row.
49
+ -- ===================================
50
+
51
+ create table sr_upd (id integer primary key, j json, n integer);
52
+ insert into sr_upd values (1, '{"a":1}', 1);
53
+
54
+ update sr_upd set j = '{"a":2}', n = '7' where id = 1
55
+ returning j, typeof(j) as jt, n, typeof(n) as nt;
56
+ → [{"j":{"a":2},"jt":"json","n":7,"nt":"integer"}]
57
+
58
+ select j, typeof(j) as jt, n, typeof(n) as nt from sr_upd where id = 1;
59
+ → [{"j":{"a":2},"jt":"json","n":7,"nt":"integer"}]
60
+
61
+ -- OLD image is the stored row read from the source scan; NEW is the stored row
62
+ -- handed back by the substrate. Both sides coerced, in one projection.
63
+ update sr_upd set j = '{"a":3}', n = '11' where id = 1
64
+ returning old.j as oj, typeof(old.j) as ojt, j as nj, typeof(j) as njt,
65
+ old.n as on_, typeof(old.n) as ont, n as nn, typeof(n) as nnt;
66
+ → [{"oj":{"a":2},"ojt":"json","nj":{"a":3},"njt":"json","on_":7,"ont":"integer","nn":11,"nnt":"integer"}]
67
+
68
+ select j, n from sr_upd where id = 1;
69
+ → [{"j":{"a":3},"n":11}]
70
+
71
+ -- a no-op-valued UPDATE still reports the stored row (not the raw text)
72
+ update sr_upd set j = '{ "a" : 3 }' where id = 1 returning j, typeof(j) as jt;
73
+ → [{"j":{"a":3},"jt":"json"}]
74
+
75
+ select j, typeof(j) as jt from sr_upd where id = 1;
76
+ → [{"j":{"a":3},"jt":"json"}]
77
+
78
+ drop table sr_upd;
79
+
80
+ -- ===================================
81
+ -- 3. UPDATE that MOVES the primary key
82
+ -- ===================================
83
+ -- The key move takes the delete+insert arm of the executor; RETURNING must
84
+ -- still project the stored NEW row and the stored OLD key.
85
+
86
+ create table sr_move (id integer primary key, j json, n integer);
87
+ insert into sr_move values (1, '{"a":1}', 1);
88
+
89
+ update sr_move set id = 5, j = '{"a":9}', n = '42' where id = 1
90
+ returning old.id as old_id, id, j, typeof(j) as jt, n, typeof(n) as nt;
91
+ → [{"old_id":1,"id":5,"j":{"a":9},"jt":"json","n":42,"nt":"integer"}]
92
+
93
+ select id, j, typeof(j) as jt, n, typeof(n) as nt from sr_move;
94
+ → [{"id":5,"j":{"a":9},"jt":"json","n":42,"nt":"integer"}]
95
+
96
+ drop table sr_move;
97
+
98
+ -- ===================================
99
+ -- 4. INSERT ... ON CONFLICT DO UPDATE ... RETURNING
100
+ -- ===================================
101
+
102
+ create table sr_ups (id integer primary key, j json, n integer);
103
+ insert into sr_ups values (1, '{"a":1}', 1);
104
+
105
+ -- conflicting insert takes the DO UPDATE arm
106
+ insert into sr_ups values (1, '{"a":2}', '7')
107
+ on conflict (id) do update set j = excluded.j, n = excluded.n
108
+ returning id, j, typeof(j) as jt, n, typeof(n) as nt;
109
+ → [{"id":1,"j":{"a":2},"jt":"json","n":7,"nt":"integer"}]
110
+
111
+ select id, j, typeof(j) as jt, n, typeof(n) as nt from sr_ups;
112
+ → [{"id":1,"j":{"a":2},"jt":"json","n":7,"nt":"integer"}]
113
+
114
+ -- non-conflicting insert through the same statement shape takes the plain
115
+ -- insert arm, and is equally coerced
116
+ insert into sr_ups values (2, '{"b":3}', '8')
117
+ on conflict (id) do update set j = excluded.j
118
+ returning id, j, typeof(j) as jt, n, typeof(n) as nt;
119
+ → [{"id":2,"j":{"b":3},"jt":"json","n":8,"nt":"integer"}]
120
+
121
+ select id, j, typeof(j) as jt, n, typeof(n) as nt from sr_ups where id = 2;
122
+ → [{"id":2,"j":{"b":3},"jt":"json","n":8,"nt":"integer"}]
123
+
124
+ drop table sr_ups;
125
+
126
+ -- ===================================
127
+ -- 5. INSERT OR REPLACE ... RETURNING
128
+ -- ===================================
129
+
130
+ create table sr_repl (id integer primary key, j json, n integer);
131
+ insert into sr_repl values (1, '{"a":1}', 1);
132
+
133
+ insert or replace into sr_repl values (1, '{"a":2}', '7')
134
+ returning id, j, typeof(j) as jt, n, typeof(n) as nt;
135
+ → [{"id":1,"j":{"a":2},"jt":"json","n":7,"nt":"integer"}]
136
+
137
+ select id, j, typeof(j) as jt, n, typeof(n) as nt from sr_repl;
138
+ → [{"id":1,"j":{"a":2},"jt":"json","n":7,"nt":"integer"}]
139
+
140
+ drop table sr_repl;
141
+
142
+ -- ===================================
143
+ -- 6. INSERT OR IGNORE on a conflicting row yields NO row
144
+ -- ===================================
145
+ -- Negative pin: the "row was not written" short-circuit runs BEFORE any of the
146
+ -- stored-row plumbing, so an ignored conflict must still emit nothing at all.
147
+
148
+ create table sr_ign (id integer primary key, j json);
149
+ insert into sr_ign values (1, '{"a":1}');
150
+
151
+ insert or ignore into sr_ign values (1, '{"a":2}') returning id, j;
152
+ → []
153
+
154
+ -- the existing row is untouched
155
+ select id, j from sr_ign;
156
+ → [{"id":1,"j":{"a":1}}]
157
+
158
+ -- a non-conflicting OR IGNORE insert does emit its stored row
159
+ insert or ignore into sr_ign values (2, '{"a":2}') returning id, j, typeof(j) as jt;
160
+ → [{"id":2,"j":{"a":2},"jt":"json"}]
161
+
162
+ select id, j from sr_ign order by id;
163
+ → [{"id":1,"j":{"a":1}},{"id":2,"j":{"a":2}}]
164
+
165
+ drop table sr_ign;
@@ -0,0 +1,131 @@
1
+ -- 43-default-nullability.sqllogic - Testing default NOT NULL column behavior (Third Manifesto alignment)
2
+
3
+ -- Test default NOT NULL behavior
4
+ CREATE TABLE test_default_notnull (
5
+ id INTEGER PRIMARY KEY,
6
+ name TEXT,
7
+ age INTEGER
8
+ );
9
+
10
+ -- Valid insert - should succeed
11
+ INSERT INTO test_default_notnull VALUES (1, 'Alice', 30);
12
+ SELECT * FROM test_default_notnull WHERE id = 1;
13
+ → [{"id":1,"name":"Alice","age":30}]
14
+
15
+ -- Insert with NULL name - should fail (NOT NULL by default)
16
+ INSERT INTO test_default_notnull VALUES (2, NULL, 25);
17
+ -- error: NOT NULL constraint failed: test_default_notnull.name
18
+
19
+ -- Insert with NULL age - should fail (NOT NULL by default)
20
+ INSERT INTO test_default_notnull VALUES (3, 'Bob', NULL);
21
+ -- error: NOT NULL constraint failed: test_default_notnull.age
22
+
23
+ -- Verify only valid row was inserted
24
+ SELECT COUNT(*) FROM test_default_notnull;
25
+ → [{"count(*)":1}]
26
+
27
+ DROP TABLE test_default_notnull;
28
+
29
+ -- Test explicit NULL override
30
+ CREATE TABLE test_explicit_null (
31
+ id INTEGER PRIMARY KEY,
32
+ required_field TEXT,
33
+ optional_field TEXT NULL
34
+ );
35
+
36
+ -- Insert with NULL in required field - should fail
37
+ INSERT INTO test_explicit_null VALUES (1, NULL, 'optional');
38
+ -- error: NOT NULL constraint failed: test_explicit_null.required_field
39
+
40
+ -- Insert with NULL in optional field - should succeed
41
+ INSERT INTO test_explicit_null VALUES (2, 'required', NULL);
42
+ SELECT * FROM test_explicit_null WHERE id = 2;
43
+ → [{"id":2,"required_field":"required","optional_field":null}]
44
+
45
+ -- Insert with both fields populated - should succeed
46
+ INSERT INTO test_explicit_null VALUES (3, 'test', 'value');
47
+ SELECT * FROM test_explicit_null WHERE id = 3;
48
+ → [{"id":3,"required_field":"test","optional_field":"value"}]
49
+
50
+ DROP TABLE test_explicit_null;
51
+
52
+ -- Test pragma to revert to SQL standard nullable behavior
53
+ PRAGMA default_column_nullability='nullable';
54
+
55
+ PRAGMA default_column_nullability;
56
+ → [{"name": "default_column_nullability", "value": "nullable"}]
57
+
58
+ CREATE TABLE test_nullable_default (
59
+ id INTEGER PRIMARY KEY,
60
+ name TEXT,
61
+ value INTEGER
62
+ );
63
+
64
+ -- Insert with NULL values - should succeed with nullable pragma
65
+ INSERT INTO test_nullable_default VALUES (1, NULL, NULL);
66
+ SELECT * FROM test_nullable_default WHERE id = 1;
67
+ → [{"id":1,"name":null,"value":null}]
68
+
69
+ -- Insert with values - should also succeed
70
+ INSERT INTO test_nullable_default VALUES (2, 'test', 42);
71
+ SELECT * FROM test_nullable_default WHERE id = 2;
72
+ → [{"id":2,"name":"test","value":42}]
73
+
74
+ DROP TABLE test_nullable_default;
75
+
76
+ -- Restore default NOT NULL behavior
77
+ PRAGMA default_column_nullability='not_null';
78
+
79
+ PRAGMA default_column_nullability;
80
+ → [{"name": "default_column_nullability", "value": "not_null"}]
81
+
82
+ -- Test that explicit NOT NULL still works
83
+ CREATE TABLE test_explicit_notnull (
84
+ id INTEGER PRIMARY KEY,
85
+ name TEXT NOT NULL,
86
+ age INTEGER
87
+ );
88
+
89
+ -- Insert with NULL name - should fail
90
+ INSERT INTO test_explicit_notnull VALUES (1, NULL, 30);
91
+ -- error: NOT NULL constraint failed: test_explicit_notnull.name
92
+
93
+ -- Insert with NULL age - should fail (default NOT NULL)
94
+ INSERT INTO test_explicit_notnull VALUES (2, 'Alice', NULL);
95
+ -- error: NOT NULL constraint failed: test_explicit_notnull.age
96
+
97
+ -- Valid insert - should succeed
98
+ INSERT INTO test_explicit_notnull VALUES (3, 'Bob', 25);
99
+ SELECT * FROM test_explicit_notnull WHERE id = 3;
100
+ → [{"id":3,"name":"Bob","age":25}]
101
+
102
+ DROP TABLE test_explicit_notnull;
103
+
104
+ -- Test mixed NULL and NOT NULL columns
105
+ CREATE TABLE test_mixed (
106
+ id INTEGER PRIMARY KEY,
107
+ required_name TEXT NOT NULL,
108
+ optional_desc TEXT NULL,
109
+ required_count INTEGER,
110
+ optional_notes TEXT NULL
111
+ );
112
+
113
+ -- Insert with all required fields, NULL optionals - should succeed
114
+ INSERT INTO test_mixed VALUES (1, 'Item1', NULL, 5, NULL);
115
+ SELECT * FROM test_mixed WHERE id = 1;
116
+ → [{"id":1,"required_name":"Item1","optional_desc":null,"required_count":5,"optional_notes":null}]
117
+
118
+ -- Insert with NULL required field - should fail
119
+ INSERT INTO test_mixed VALUES (2, NULL, 'desc', 10, 'notes');
120
+ -- error: NOT NULL constraint failed: test_mixed.required_name
121
+
122
+ -- Insert with NULL required count - should fail
123
+ INSERT INTO test_mixed VALUES (3, 'Item3', 'desc', NULL, 'notes');
124
+ -- error: NOT NULL constraint failed: test_mixed.required_count
125
+
126
+ -- Valid insert with all fields - should succeed
127
+ INSERT INTO test_mixed VALUES (4, 'Item4', 'description', 20, 'some notes');
128
+ SELECT * FROM test_mixed WHERE id = 4;
129
+ → [{"id":4,"required_name":"Item4","optional_desc":"description","required_count":20,"optional_notes":"some notes"}]
130
+
131
+ DROP TABLE test_mixed;