@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,395 @@
1
+ -- transaction-edge-cases.sqllogic - Edge cases for savepoint nesting, empty txns, commit-after-fail
2
+
3
+ -- ===================================
4
+ -- Empty Transactions
5
+ -- ===================================
6
+
7
+ CREATE TABLE txe (id INTEGER PRIMARY KEY, val TEXT);
8
+ INSERT INTO txe VALUES (1, 'initial');
9
+
10
+ -- BEGIN + COMMIT with no mutations
11
+ BEGIN;
12
+ COMMIT;
13
+
14
+ SELECT val FROM txe WHERE id = 1;
15
+ → [{"val": "initial"}]
16
+
17
+ -- BEGIN + ROLLBACK with no mutations
18
+ BEGIN;
19
+ ROLLBACK;
20
+
21
+ SELECT val FROM txe WHERE id = 1;
22
+ → [{"val": "initial"}]
23
+
24
+ -- ===================================
25
+ -- Double BEGIN (should error)
26
+ -- ===================================
27
+
28
+ BEGIN;
29
+ INSERT INTO txe VALUES (2, 'in-txn');
30
+ COMMIT;
31
+ -- run
32
+
33
+ -- Second BEGIN while already in transaction
34
+ BEGIN;
35
+ BEGIN;
36
+ -- error: a transaction is already active
37
+
38
+ ROLLBACK;
39
+ -- run
40
+
41
+ SELECT val FROM txe WHERE id = 2;
42
+ → [{"val": "in-txn"}]
43
+
44
+ -- ===================================
45
+ -- Double COMMIT (second is no-op)
46
+ -- ===================================
47
+
48
+ BEGIN;
49
+ INSERT INTO txe VALUES (3, 'commit-twice');
50
+ COMMIT;
51
+ COMMIT;
52
+ -- run
53
+
54
+ SELECT val FROM txe WHERE id = 3;
55
+ → [{"val": "commit-twice"}]
56
+
57
+ -- ===================================
58
+ -- Double ROLLBACK (second is no-op)
59
+ -- ===================================
60
+
61
+ BEGIN;
62
+ INSERT INTO txe VALUES (99, 'will-rollback');
63
+ ROLLBACK;
64
+ ROLLBACK;
65
+ -- run
66
+
67
+ SELECT count(*) as cnt FROM txe WHERE id = 99;
68
+ → [{"cnt": 0}]
69
+
70
+ -- ===================================
71
+ -- Commit After Failed Statement
72
+ -- ===================================
73
+ -- A failed statement mid-transaction should not prevent subsequent operations
74
+
75
+ BEGIN;
76
+ INSERT INTO txe VALUES (4, 'before-fail');
77
+ -- run
78
+
79
+ -- This should fail (duplicate key)
80
+ INSERT INTO txe VALUES (1, 'duplicate');
81
+ -- error: UNIQUE constraint failed
82
+
83
+ -- Transaction should still be usable after the failed statement
84
+ INSERT INTO txe VALUES (5, 'after-fail');
85
+ COMMIT;
86
+ -- run
87
+
88
+ SELECT val FROM txe WHERE id = 4;
89
+ → [{"val": "before-fail"}]
90
+
91
+ SELECT val FROM txe WHERE id = 5;
92
+ → [{"val": "after-fail"}]
93
+
94
+ -- ===================================
95
+ -- Deeply Nested Savepoints (3+ levels)
96
+ -- ===================================
97
+
98
+ BEGIN;
99
+ INSERT INTO txe VALUES (10, 'base');
100
+ SAVEPOINT sp_a;
101
+ INSERT INTO txe VALUES (11, 'level-1');
102
+ SAVEPOINT sp_b;
103
+ INSERT INTO txe VALUES (12, 'level-2');
104
+ SAVEPOINT sp_c;
105
+ INSERT INTO txe VALUES (13, 'level-3');
106
+
107
+ -- Verify all visible within transaction
108
+ SELECT count(*) as cnt FROM txe WHERE id >= 10;
109
+ → [{"cnt": 4}]
110
+
111
+ -- Rollback innermost only
112
+ ROLLBACK TO SAVEPOINT sp_c;
113
+ SELECT count(*) as cnt FROM txe WHERE id >= 10;
114
+ → [{"cnt": 3}]
115
+
116
+ -- sp_c is preserved after rollback — can reuse
117
+ INSERT INTO txe VALUES (14, 'reuse-sp_c');
118
+ RELEASE SAVEPOINT sp_c;
119
+
120
+ -- Rollback to sp_b discards sp_c's released data plus sp_b's data
121
+ ROLLBACK TO SAVEPOINT sp_b;
122
+ SELECT count(*) as cnt FROM txe WHERE id >= 10;
123
+ → [{"cnt": 2}]
124
+
125
+ -- Release sp_b and sp_a, then commit
126
+ RELEASE SAVEPOINT sp_b;
127
+ RELEASE SAVEPOINT sp_a;
128
+ COMMIT;
129
+
130
+ -- Only base + level-1 should survive
131
+ SELECT val FROM txe WHERE id IN (10, 11) ORDER BY id;
132
+ → [{"val": "base"}, {"val": "level-1"}]
133
+
134
+ SELECT count(*) as cnt FROM txe WHERE id >= 12;
135
+ → [{"cnt": 0}]
136
+
137
+ -- ===================================
138
+ -- Release inner savepoint then rollback outer
139
+ -- ===================================
140
+
141
+ BEGIN;
142
+ INSERT INTO txe VALUES (20, 'outer');
143
+ SAVEPOINT sp_outer;
144
+ INSERT INTO txe VALUES (21, 'inner-pre');
145
+ SAVEPOINT sp_inner;
146
+ INSERT INTO txe VALUES (22, 'inner-post');
147
+ RELEASE SAVEPOINT sp_inner;
148
+
149
+ -- inner-post is now merged into sp_outer scope
150
+ SELECT count(*) as cnt FROM txe WHERE id >= 20;
151
+ → [{"cnt": 3}]
152
+
153
+ -- Rollback sp_outer undoes everything including released inner data
154
+ ROLLBACK TO SAVEPOINT sp_outer;
155
+ SELECT count(*) as cnt FROM txe WHERE id >= 20;
156
+ → [{"cnt": 1}]
157
+
158
+ RELEASE SAVEPOINT sp_outer;
159
+ COMMIT;
160
+
161
+ SELECT val FROM txe WHERE id = 20;
162
+ → [{"val": "outer"}]
163
+
164
+ SELECT count(*) as cnt FROM txe WHERE id IN (21, 22);
165
+ → [{"cnt": 0}]
166
+
167
+ -- ===================================
168
+ -- Savepoint with same name at different nesting levels
169
+ -- ===================================
170
+
171
+ BEGIN;
172
+ INSERT INTO txe VALUES (30, 'base');
173
+ SAVEPOINT dup;
174
+ INSERT INTO txe VALUES (31, 'dup-level-1');
175
+ SAVEPOINT dup;
176
+ INSERT INTO txe VALUES (32, 'dup-level-2');
177
+
178
+ -- ROLLBACK TO dup goes to the most recent (innermost) 'dup'
179
+ ROLLBACK TO SAVEPOINT dup;
180
+ SELECT count(*) as cnt FROM txe WHERE id = 32;
181
+ → [{"cnt": 0}]
182
+
183
+ -- level-1 data should still be visible
184
+ SELECT count(*) as cnt FROM txe WHERE id = 31;
185
+ → [{"cnt": 1}]
186
+
187
+ RELEASE SAVEPOINT dup;
188
+ RELEASE SAVEPOINT dup;
189
+ COMMIT;
190
+
191
+ SELECT val FROM txe WHERE id IN (30, 31) ORDER BY id;
192
+ → [{"val": "base"}, {"val": "dup-level-1"}]
193
+
194
+ -- ===================================
195
+ -- Mutation types across savepoints
196
+ -- ===================================
197
+ -- INSERT, UPDATE, DELETE across savepoint boundaries
198
+
199
+ BEGIN;
200
+ INSERT INTO txe VALUES (40, 'inserted');
201
+ SAVEPOINT sp_mut;
202
+ UPDATE txe SET val = 'updated' WHERE id = 40;
203
+ SAVEPOINT sp_del;
204
+ DELETE FROM txe WHERE id = 40;
205
+
206
+ -- Row is gone within innermost scope
207
+ SELECT count(*) as cnt FROM txe WHERE id = 40;
208
+ → [{"cnt": 0}]
209
+
210
+ -- Rollback the delete
211
+ ROLLBACK TO SAVEPOINT sp_del;
212
+ SELECT val FROM txe WHERE id = 40;
213
+ → [{"val": "updated"}]
214
+
215
+ -- Rollback the update too
216
+ ROLLBACK TO SAVEPOINT sp_mut;
217
+ SELECT val FROM txe WHERE id = 40;
218
+ → [{"val": "inserted"}]
219
+
220
+ RELEASE SAVEPOINT sp_mut;
221
+ COMMIT;
222
+
223
+ SELECT val FROM txe WHERE id = 40;
224
+ → [{"val": "inserted"}]
225
+
226
+ -- ===================================
227
+ -- Large transaction with many inserts
228
+ -- ===================================
229
+
230
+ BEGIN;
231
+ INSERT INTO txe VALUES (100, 'r100');
232
+ INSERT INTO txe VALUES (101, 'r101');
233
+ INSERT INTO txe VALUES (102, 'r102');
234
+ INSERT INTO txe VALUES (103, 'r103');
235
+ INSERT INTO txe VALUES (104, 'r104');
236
+ INSERT INTO txe VALUES (105, 'r105');
237
+ INSERT INTO txe VALUES (106, 'r106');
238
+ INSERT INTO txe VALUES (107, 'r107');
239
+ INSERT INTO txe VALUES (108, 'r108');
240
+ INSERT INTO txe VALUES (109, 'r109');
241
+ COMMIT;
242
+
243
+ SELECT count(*) as cnt FROM txe WHERE id >= 100;
244
+ → [{"cnt": 10}]
245
+
246
+ -- ===================================
247
+ -- Rollback large transaction
248
+ -- ===================================
249
+
250
+ BEGIN;
251
+ INSERT INTO txe VALUES (200, 'will-rollback');
252
+ INSERT INTO txe VALUES (201, 'will-rollback');
253
+ INSERT INTO txe VALUES (202, 'will-rollback');
254
+ INSERT INTO txe VALUES (203, 'will-rollback');
255
+ INSERT INTO txe VALUES (204, 'will-rollback');
256
+ ROLLBACK;
257
+
258
+ SELECT count(*) as cnt FROM txe WHERE id >= 200;
259
+ → [{"cnt": 0}]
260
+
261
+ -- ===================================
262
+ -- Implicit transaction auto-commits on success
263
+ -- ===================================
264
+
265
+ INSERT INTO txe VALUES (300, 'auto');
266
+
267
+ SELECT val FROM txe WHERE id = 300;
268
+ → [{"val": "auto"}]
269
+
270
+ -- ===================================
271
+ -- Savepoint without explicit BEGIN (creates implicit transaction)
272
+ -- ===================================
273
+
274
+ SAVEPOINT implicit_sp;
275
+ INSERT INTO txe VALUES (301, 'in-implicit-sp');
276
+ RELEASE SAVEPOINT implicit_sp;
277
+
278
+ SELECT val FROM txe WHERE id = 301;
279
+ → [{"val": "in-implicit-sp"}]
280
+
281
+ -- ===================================
282
+ -- Statement-level atomicity inside an explicit transaction (UPDATE)
283
+ -- ===================================
284
+ -- A multi-row UPDATE whose Nth row throws must roll back the WHOLE statement
285
+ -- (rows 1..N-1 included), mirroring SQLite's implicit-savepoint-per-statement.
286
+ -- The autocommit path is already atomic via implicit-transaction rollback, so
287
+ -- this MUST wrap in begin/rollback to exercise the statement savepoint. Without
288
+ -- it, id=1's update (x=11) would survive the aborted statement.
289
+
290
+ -- The preceding section upgraded an implicit savepoint to an explicit
291
+ -- transaction that is still open; commit it so our BEGIN starts clean
292
+ -- (a no-op if autocommit is already active).
293
+ COMMIT;
294
+ -- run
295
+
296
+ CREATE TABLE atom_u (id INTEGER PRIMARY KEY, x INTEGER NOT NULL);
297
+ INSERT INTO atom_u VALUES (1, 10), (2, 20), (3, 30);
298
+ -- run
299
+
300
+ -- Row id=1 updates to x=11 first, then id=2 violates NOT NULL (x -> NULL).
301
+ BEGIN;
302
+ UPDATE atom_u SET x = CASE WHEN id = 2 THEN NULL ELSE x + 1 END WHERE id IN (1, 2);
303
+ -- error: NOT NULL constraint failed: atom_u.x
304
+
305
+ -- Inside the still-open transaction: id=1's update must NOT have survived.
306
+ SELECT id, x FROM atom_u ORDER BY id;
307
+ → [{"id":1,"x":10},{"id":2,"x":20},{"id":3,"x":30}]
308
+ ROLLBACK;
309
+ -- run
310
+
311
+ -- After rollback nothing persisted either.
312
+ SELECT id, x FROM atom_u ORDER BY id;
313
+ → [{"id":1,"x":10},{"id":2,"x":20},{"id":3,"x":30}]
314
+
315
+ -- Same guarantee when the later row trips a UNIQUE collision rather than a
316
+ -- NOT NULL check: id=1's k moves to 15 (fine), then id=2's k -> 30 collides
317
+ -- with id=3. The whole statement must revert id=1's move.
318
+ CREATE TABLE atom_uq (id INTEGER PRIMARY KEY, k INTEGER UNIQUE);
319
+ INSERT INTO atom_uq VALUES (1, 10), (2, 20), (3, 30);
320
+ -- run
321
+
322
+ BEGIN;
323
+ UPDATE atom_uq SET k = CASE WHEN id = 1 THEN 15 WHEN id = 2 THEN 30 END WHERE id IN (1, 2);
324
+ -- error: constraint failed
325
+
326
+ SELECT id, k FROM atom_uq ORDER BY id;
327
+ → [{"id":1,"k":10},{"id":2,"k":20},{"id":3,"k":30}]
328
+ ROLLBACK;
329
+ -- run
330
+
331
+ -- ===================================
332
+ -- Statement-level atomicity inside an explicit transaction (DELETE)
333
+ -- ===================================
334
+ -- A multi-row DELETE whose Nth row throws (FK RESTRICT child reference) must
335
+ -- roll back the whole statement. id=1 (unreferenced) deletes first, then id=2
336
+ -- (referenced by a RESTRICT child) trips the parent-side FK check.
337
+
338
+ CREATE TABLE atom_dp (id INTEGER PRIMARY KEY);
339
+ CREATE TABLE atom_dc (id INTEGER PRIMARY KEY, pid INTEGER REFERENCES atom_dp(id) ON DELETE RESTRICT);
340
+ INSERT INTO atom_dp VALUES (1), (2), (3);
341
+ INSERT INTO atom_dc VALUES (100, 2);
342
+ -- run
343
+
344
+ BEGIN;
345
+ DELETE FROM atom_dp WHERE id IN (1, 2);
346
+ -- error: constraint failed
347
+
348
+ -- id=1's delete must NOT have survived the aborted statement.
349
+ SELECT id FROM atom_dp ORDER BY id;
350
+ → [{"id":1},{"id":2},{"id":3}]
351
+ ROLLBACK;
352
+ -- run
353
+
354
+ SELECT id FROM atom_dp ORDER BY id;
355
+ → [{"id":1},{"id":2},{"id":3}]
356
+
357
+ -- ===================================
358
+ -- Rolled-back statements must not corrupt UNIQUE enforcement state
359
+ -- ===================================
360
+ -- Regression (memory module): secondary-index entries are shared across
361
+ -- inherited layer trees, so a rolled-back transaction's index mutations must
362
+ -- be copy-on-written into the transaction's own tree, never applied in place
363
+ -- to the shared committed entry (MemoryIndex.ownedEntries). A leaked delete
364
+ -- silently un-enforced UNIQUE; a leaked insert left a phantom candidate.
365
+
366
+ CREATE TABLE rbk (id INTEGER PRIMARY KEY, v TEXT UNIQUE);
367
+ INSERT INTO rbk VALUES (1, 'x');
368
+
369
+ -- a rolled-back DELETE must leave UNIQUE enforcement intact
370
+ BEGIN;
371
+ DELETE FROM rbk WHERE id = 1;
372
+ ROLLBACK;
373
+
374
+ INSERT INTO rbk VALUES (2, 'x');
375
+ -- error: UNIQUE constraint failed
376
+
377
+ -- a rolled-back INSERT must not leave a phantom that blocks the value
378
+ BEGIN;
379
+ INSERT INTO rbk VALUES (3, 'y');
380
+ ROLLBACK;
381
+
382
+ INSERT INTO rbk VALUES (4, 'y');
383
+ SELECT id, v FROM rbk ORDER BY id;
384
+ → [{"id":1,"v":"x"},{"id":4,"v":"y"}]
385
+
386
+ -- ===================================
387
+ -- Cleanup
388
+ -- ===================================
389
+
390
+ DROP TABLE rbk;
391
+ DROP TABLE txe;
392
+ DROP TABLE atom_dc;
393
+ DROP TABLE atom_dp;
394
+ DROP TABLE atom_uq;
395
+ DROP TABLE atom_u;
@@ -0,0 +1,252 @@
1
+ -- schema-catalog-edge-cases.sqllogic - Multi-schema, DDL roundtrip, schema change events
2
+
3
+ -- ===================================
4
+ -- DDL Round-trip: Create → Export → Drop → Recreate → Verify
5
+ -- ===================================
6
+
7
+ -- Simple table DDL roundtrip: create, drop, recreate, verify identical behavior
8
+ CREATE TABLE rt_simple (id INTEGER PRIMARY KEY, name TEXT NOT NULL, active INTEGER);
9
+ INSERT INTO rt_simple VALUES (1, 'Alice', 1);
10
+
11
+ -- Verify table_info returns expected columns
12
+ SELECT name, type, pk FROM table_info('rt_simple') ORDER BY cid;
13
+ → [{"name": "id", "type": "INTEGER", "pk": 1}, {"name": "name", "type": "TEXT", "pk": 0}, {"name": "active", "type": "INTEGER", "pk": 0}]
14
+
15
+ SELECT * FROM rt_simple;
16
+ → [{"id": 1, "name": "Alice", "active": 1}]
17
+
18
+ DROP TABLE rt_simple;
19
+
20
+ -- Recreate the same table and verify it works identically
21
+ CREATE TABLE rt_simple (id INTEGER PRIMARY KEY, name TEXT NOT NULL, active INTEGER);
22
+ INSERT INTO rt_simple VALUES (1, 'Alice', 1);
23
+
24
+ SELECT * FROM rt_simple;
25
+ → [{"id": 1, "name": "Alice", "active": 1}]
26
+
27
+ DROP TABLE rt_simple;
28
+
29
+ -- ===================================
30
+ -- Composite primary key DDL
31
+ -- ===================================
32
+
33
+ CREATE TABLE rt_composite (a INTEGER, b TEXT, c REAL, PRIMARY KEY (a, b));
34
+ INSERT INTO rt_composite VALUES (1, 'x', 3.14), (1, 'y', 2.71), (2, 'x', 1.0);
35
+
36
+ SELECT * FROM rt_composite ORDER BY a, b;
37
+ → [{"a": 1, "b": "x", "c": 3.14}, {"a": 1, "b": "y", "c": 2.71}, {"a": 2, "b": "x", "c": 1.0}]
38
+
39
+ DROP TABLE rt_composite;
40
+
41
+ -- Recreate and verify
42
+ CREATE TABLE rt_composite (a INTEGER, b TEXT, c REAL, PRIMARY KEY (a, b));
43
+ INSERT INTO rt_composite VALUES (1, 'x', 3.14);
44
+
45
+ SELECT * FROM rt_composite;
46
+ → [{"a": 1, "b": "x", "c": 3.14}]
47
+
48
+ DROP TABLE rt_composite;
49
+
50
+ -- ===================================
51
+ -- Table with indexes
52
+ -- ===================================
53
+ -- Lives in 102.0.1-schema-catalog-indexed-table (it needs standalone CREATE INDEX).
54
+
55
+ -- ===================================
56
+ -- Table with CHECK constraints
57
+ -- ===================================
58
+
59
+ CREATE TABLE rt_checked (id INTEGER PRIMARY KEY, val INTEGER CHECK (val > 0), name TEXT CHECK (length(name) > 0));
60
+ INSERT INTO rt_checked VALUES (1, 10, 'valid');
61
+
62
+ SELECT * FROM rt_checked;
63
+ → [{"id": 1, "val": 10, "name": "valid"}]
64
+
65
+ -- Verify constraints work
66
+ INSERT INTO rt_checked VALUES (2, -1, 'test');
67
+ -- error: CHECK constraint failed
68
+
69
+ INSERT INTO rt_checked VALUES (3, 5, '');
70
+ -- error: CHECK constraint failed
71
+
72
+ DROP TABLE rt_checked;
73
+
74
+ -- ===================================
75
+ -- Multi-schema: declare and apply
76
+ -- ===================================
77
+
78
+ declare schema app1 {
79
+ table customers {
80
+ id INTEGER PRIMARY KEY,
81
+ name TEXT NOT NULL
82
+ }
83
+ }
84
+
85
+ apply schema app1;
86
+ -- run
87
+
88
+ INSERT INTO app1.customers VALUES (1, 'Acme'), (2, 'Beta');
89
+
90
+ SELECT * FROM app1.customers ORDER BY id;
91
+ → [{"id": 1, "name": "Acme"}, {"id": 2, "name": "Beta"}]
92
+
93
+ -- ===================================
94
+ -- Cross-schema queries
95
+ -- ===================================
96
+
97
+ CREATE TABLE main_data (id INTEGER PRIMARY KEY, val TEXT);
98
+ INSERT INTO main_data VALUES (1, 'main-val');
99
+
100
+ SELECT c.name, m.val FROM app1.customers AS c JOIN main_data AS m ON c.id = m.id;
101
+ → [{"name": "Acme", "val": "main-val"}]
102
+
103
+ -- ===================================
104
+ -- Schema search path resolution
105
+ -- ===================================
106
+
107
+ -- Set search path to include app1
108
+ PRAGMA schema_path = 'app1,main';
109
+
110
+ -- Unqualified 'customers' should resolve to app1.customers
111
+ SELECT * FROM customers ORDER BY id;
112
+ → [{"id": 1, "name": "Acme"}, {"id": 2, "name": "Beta"}]
113
+
114
+ -- Unqualified 'main_data' should resolve to main.main_data
115
+ SELECT * FROM main_data;
116
+ → [{"id": 1, "val": "main-val"}]
117
+
118
+ -- Reset search path
119
+ PRAGMA schema_path = 'main';
120
+ -- run
121
+
122
+ -- ===================================
123
+ -- table_info edge cases
124
+ -- ===================================
125
+
126
+ -- Table with many columns
127
+ CREATE TABLE wide_table (
128
+ a INTEGER PRIMARY KEY,
129
+ b TEXT,
130
+ c REAL,
131
+ d INTEGER,
132
+ e TEXT,
133
+ f REAL
134
+ );
135
+
136
+ SELECT count(*) as cnt FROM table_info('wide_table');
137
+ → [{"cnt": 6}]
138
+
139
+ -- Verify column order
140
+ SELECT name FROM table_info('wide_table') ORDER BY cid;
141
+ → [{"name": "a"}, {"name": "b"}, {"name": "c"}, {"name": "d"}, {"name": "e"}, {"name": "f"}]
142
+
143
+ DROP TABLE wide_table;
144
+
145
+ -- Table with no non-PK columns
146
+ CREATE TABLE pk_only (id INTEGER PRIMARY KEY);
147
+ INSERT INTO pk_only VALUES (1), (2), (3);
148
+
149
+ SELECT * FROM pk_only ORDER BY id;
150
+ → [{"id": 1}, {"id": 2}, {"id": 3}]
151
+
152
+ -- table_info on single-column table
153
+ SELECT name, type, pk FROM table_info('pk_only') ORDER BY cid;
154
+ → [{"name": "id", "type": "INTEGER", "pk": 1}]
155
+
156
+ DROP TABLE pk_only;
157
+
158
+ -- ===================================
159
+ -- Views
160
+ -- ===================================
161
+
162
+ CREATE TABLE v_source (id INTEGER PRIMARY KEY, name TEXT, active INTEGER);
163
+ INSERT INTO v_source VALUES (1, 'Alice', 1), (2, 'Bob', 0), (3, 'Charlie', 1);
164
+
165
+ CREATE VIEW active_items AS SELECT id, name FROM v_source WHERE active = 1;
166
+
167
+ SELECT * FROM active_items ORDER BY id;
168
+ → [{"id": 1, "name": "Alice"}, {"id": 3, "name": "Charlie"}]
169
+
170
+ -- Drop and recreate view
171
+ DROP VIEW active_items;
172
+
173
+ CREATE VIEW active_items AS SELECT id, name FROM v_source WHERE active = 1;
174
+
175
+ SELECT * FROM active_items ORDER BY id;
176
+ → [{"id": 1, "name": "Alice"}, {"id": 3, "name": "Charlie"}]
177
+
178
+ DROP VIEW active_items;
179
+ DROP TABLE v_source;
180
+
181
+ -- ===================================
182
+ -- DROP TABLE IF EXISTS
183
+ -- ===================================
184
+
185
+ -- Should not error on non-existent table
186
+ DROP TABLE IF EXISTS nonexistent_table;
187
+ -- run
188
+
189
+ -- Should work on existing table
190
+ CREATE TABLE temp_drop (id INTEGER PRIMARY KEY);
191
+ DROP TABLE IF EXISTS temp_drop;
192
+ -- run
193
+
194
+ -- Verify it was dropped
195
+ SELECT * FROM temp_drop;
196
+ -- error: not found
197
+
198
+ -- ===================================
199
+ -- Schema with assertions
200
+ -- ===================================
201
+
202
+ declare schema validated {
203
+ table accounts {
204
+ id INTEGER PRIMARY KEY,
205
+ balance REAL NOT NULL
206
+ }
207
+ assertion positive_balance check (not exists (select 1 from validated.accounts where balance < 0))
208
+ }
209
+
210
+ apply schema validated;
211
+ -- run
212
+
213
+ INSERT INTO validated.accounts VALUES (1, 100.0), (2, 50.0);
214
+
215
+ SELECT * FROM validated.accounts ORDER BY id;
216
+ → [{"id": 1, "balance": 100.0}, {"id": 2, "balance": 50.0}]
217
+
218
+ -- Negative balance should violate assertion
219
+ INSERT INTO validated.accounts VALUES (3, -10.0);
220
+ -- error: assertion
221
+
222
+ -- ===================================
223
+ -- Window functions in queries (verify schema supports them)
224
+ -- ===================================
225
+
226
+ CREATE TABLE wf_data (id INTEGER PRIMARY KEY, grp TEXT, val INTEGER);
227
+ INSERT INTO wf_data VALUES (1, 'A', 10), (2, 'A', 20), (3, 'B', 30), (4, 'B', 40), (5, 'B', 50);
228
+
229
+ SELECT id, grp, val, row_number() over (partition by grp order by val) as rn FROM wf_data ORDER BY grp, val;
230
+ → [{"id": 1, "grp": "A", "val": 10, "rn": 1}, {"id": 2, "grp": "A", "val": 20, "rn": 2}, {"id": 3, "grp": "B", "val": 30, "rn": 1}, {"id": 4, "grp": "B", "val": 40, "rn": 2}, {"id": 5, "grp": "B", "val": 50, "rn": 3}]
231
+
232
+ SELECT id, val, rank() over (order by val) as rnk FROM wf_data ORDER BY val;
233
+ → [{"id": 1, "val": 10, "rnk": 1}, {"id": 2, "val": 20, "rnk": 2}, {"id": 3, "val": 30, "rnk": 3}, {"id": 4, "val": 40, "rnk": 4}, {"id": 5, "val": 50, "rnk": 5}]
234
+
235
+ SELECT id, val, dense_rank() over (order by val) as drnk FROM wf_data ORDER BY val;
236
+ → [{"id": 1, "val": 10, "drnk": 1}, {"id": 2, "val": 20, "drnk": 2}, {"id": 3, "val": 30, "drnk": 3}, {"id": 4, "val": 40, "drnk": 4}, {"id": 5, "val": 50, "drnk": 5}]
237
+
238
+ SELECT id, grp, val, sum(val) over (partition by grp order by val) as running_sum FROM wf_data ORDER BY grp, val;
239
+ → [{"id": 1, "grp": "A", "val": 10, "running_sum": 10}, {"id": 2, "grp": "A", "val": 20, "running_sum": 30}, {"id": 3, "grp": "B", "val": 30, "running_sum": 30}, {"id": 4, "grp": "B", "val": 40, "running_sum": 70}, {"id": 5, "grp": "B", "val": 50, "running_sum": 120}]
240
+
241
+ DROP TABLE wf_data;
242
+
243
+ -- ===================================
244
+ -- Cleanup
245
+ -- ===================================
246
+
247
+ DROP TABLE app1.customers;
248
+ -- The assertion still names validated.accounts, so the table drop is refused
249
+ -- until the rule goes first.
250
+ DROP ASSERTION validated.positive_balance;
251
+ DROP TABLE validated.accounts;
252
+ DROP TABLE main_data;