@quereus/quereus 4.20.1 → 4.20.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (377) hide show
  1. package/README.md +2 -0
  2. package/package.json +7 -4
  3. package/test/README.md +173 -0
  4. package/test/logic/01-basic.sqllogic +39 -0
  5. package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
  6. package/test/logic/01.2-strings.sqllogic +43 -0
  7. package/test/logic/01.5-insert-select.sqllogic +237 -0
  8. package/test/logic/01.6-update-extras.sqllogic +118 -0
  9. package/test/logic/01.7-update-from.sqllogic +67 -0
  10. package/test/logic/01.8-delete-extras.sqllogic +122 -0
  11. package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
  12. package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
  13. package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
  14. package/test/logic/01.9-query-expr-values.sqllogic +111 -0
  15. package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
  16. package/test/logic/02-filters.sqllogic +54 -0
  17. package/test/logic/02-smoke.sqllogic +62 -0
  18. package/test/logic/02.1-bind-parameters.sqllogic +223 -0
  19. package/test/logic/03-expressions.sqllogic +190 -0
  20. package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
  21. package/test/logic/03.4-defaults.sqllogic +554 -0
  22. package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
  23. package/test/logic/03.5-tvf.sqllogic +61 -0
  24. package/test/logic/03.6-type-system.sqllogic +544 -0
  25. package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
  26. package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
  27. package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
  28. package/test/logic/03.8-not-precedence.sqllogic +255 -0
  29. package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
  30. package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
  31. package/test/logic/04-order-by.sqllogic +38 -0
  32. package/test/logic/04-transactions.sqllogic +239 -0
  33. package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
  34. package/test/logic/05-vtab_memory.sqllogic +50 -0
  35. package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
  36. package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
  37. package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
  38. package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
  39. package/test/logic/06-builtin_functions.sqllogic +149 -0
  40. package/test/logic/06.1-string-functions.sqllogic +92 -0
  41. package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
  42. package/test/logic/06.2-math-functions.sqllogic +82 -0
  43. package/test/logic/06.3-schema.sqllogic +48 -0
  44. package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
  45. package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
  46. package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
  47. package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
  48. package/test/logic/06.3.4-view-info.sqllogic +378 -0
  49. package/test/logic/06.3.5-column-info.sqllogic +347 -0
  50. package/test/logic/06.3.6-schema-views.sqllogic +29 -0
  51. package/test/logic/06.4-schema-search-path.sqllogic +354 -0
  52. package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
  53. package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
  54. package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
  55. package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
  56. package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
  57. package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
  58. package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
  59. package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
  60. package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
  61. package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
  62. package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
  63. package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
  64. package/test/logic/06.7-json-extended.sqllogic +53 -0
  65. package/test/logic/06.8-json-path-operators.sqllogic +99 -0
  66. package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
  67. package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
  68. package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
  69. package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
  70. package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
  71. package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
  72. package/test/logic/07-aggregates.sqllogic +193 -0
  73. package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
  74. package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
  75. package/test/logic/07.3-group-by-extras.sqllogic +602 -0
  76. package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
  77. package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
  78. package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
  79. package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
  80. package/test/logic/07.5-window.sqllogic +1941 -0
  81. package/test/logic/07.5.1-window-named.sqllogic +13 -0
  82. package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
  83. package/test/logic/07.6-subqueries.sqllogic +78 -0
  84. package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
  85. package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
  86. package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
  87. package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
  88. package/test/logic/07.7.1-in-extras.sqllogic +158 -0
  89. package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
  90. package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
  91. package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
  92. package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
  93. package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
  94. package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
  95. package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
  96. package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
  97. package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
  98. package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
  99. package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
  100. package/test/logic/07.9-in-value-list.sqllogic +154 -0
  101. package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
  102. package/test/logic/08-views.sqllogic +64 -0
  103. package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
  104. package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
  105. package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
  106. package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
  107. package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
  108. package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
  109. package/test/logic/09-set_operations.sqllogic +244 -0
  110. package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
  111. package/test/logic/10-distinct_datatypes.sqllogic +127 -0
  112. package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
  113. package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
  114. package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
  115. package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
  116. package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
  117. package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
  118. package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
  119. package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
  120. package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
  121. package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
  122. package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
  123. package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
  124. package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
  125. package/test/logic/10.2-column-features.sqllogic +365 -0
  126. package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
  127. package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
  128. package/test/logic/10.3-function-features.sqllogic +247 -0
  129. package/test/logic/10.4-schema-scale.sqllogic +168 -0
  130. package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
  131. package/test/logic/10.5-indexes.sqllogic +164 -0
  132. package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
  133. package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
  134. package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
  135. package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
  136. package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
  137. package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
  138. package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
  139. package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
  140. package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
  141. package/test/logic/100.1-where-extras.sqllogic +163 -0
  142. package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
  143. package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
  144. package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
  145. package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
  146. package/test/logic/102-unique-constraints.sqllogic +145 -0
  147. package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
  148. package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
  149. package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
  150. package/test/logic/102.2-unique-collation.sqllogic +181 -0
  151. package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
  152. package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
  153. package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
  154. package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
  155. package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
  156. package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
  157. package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
  158. package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
  159. package/test/logic/108-cardinality-estimation.sqllogic +146 -0
  160. package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
  161. package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
  162. package/test/logic/11-joins.sqllogic +86 -0
  163. package/test/logic/11.1-join-using.sqllogic +267 -0
  164. package/test/logic/11.2-comma-join.sqllogic +35 -0
  165. package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
  166. package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
  167. package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
  168. package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
  169. package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
  170. package/test/logic/12-empty-primary-key.sqllogic +124 -0
  171. package/test/logic/12-join_padding_order.sqllogic +58 -0
  172. package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
  173. package/test/logic/13-cte.sqllogic +137 -0
  174. package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
  175. package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
  176. package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
  177. package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
  178. package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
  179. package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
  180. package/test/logic/13.4-cte-extras.sqllogic +98 -0
  181. package/test/logic/13.5-cte-join-order.sqllogic +166 -0
  182. package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
  183. package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
  184. package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
  185. package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
  186. package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
  187. package/test/logic/14-utilities.sqllogic +168 -0
  188. package/test/logic/15-timespan.sqllogic +279 -0
  189. package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
  190. package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
  191. package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
  192. package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
  193. package/test/logic/16-epoch.sqllogic +187 -0
  194. package/test/logic/17-weekday-modifier.sqllogic +78 -0
  195. package/test/logic/18-json-string-escapes.sqllogic +86 -0
  196. package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
  197. package/test/logic/20-empty-single-row.sqllogic +261 -0
  198. package/test/logic/21-null-edge-cases.sqllogic +227 -0
  199. package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
  200. package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
  201. package/test/logic/21.2-between-edges.sqllogic +157 -0
  202. package/test/logic/22-boundary-values.sqllogic +175 -0
  203. package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
  204. package/test/logic/24-builtin-branches.sqllogic +611 -0
  205. package/test/logic/24.1-substr-extras.sqllogic +75 -0
  206. package/test/logic/24.2-random-extras.sqllogic +39 -0
  207. package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
  208. package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
  209. package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
  210. package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
  211. package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
  212. package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
  213. package/test/logic/26-join-edge-cases.sqllogic +333 -0
  214. package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
  215. package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
  216. package/test/logic/26.3-join-on-constants.sqllogic +61 -0
  217. package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
  218. package/test/logic/27-window-edge-cases.sqllogic +206 -0
  219. package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
  220. package/test/logic/27.2-window-exclude.sqllogic +13 -0
  221. package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
  222. package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
  223. package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
  224. package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
  225. package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
  226. package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
  227. package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
  228. package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
  229. package/test/logic/40-constraints.sqllogic +418 -0
  230. package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
  231. package/test/logic/40.2-check-extras.sqllogic +683 -0
  232. package/test/logic/41-alter-table.sqllogic +191 -0
  233. package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
  234. package/test/logic/41-fk-cross-schema.sqllogic +155 -0
  235. package/test/logic/41-fk-extended-targets.sqllogic +173 -0
  236. package/test/logic/41-foreign-keys.sqllogic +1001 -0
  237. package/test/logic/41-generated-column-errors.sqllogic +225 -0
  238. package/test/logic/41-generated-column-extras.sqllogic +598 -0
  239. package/test/logic/41-generated-column-scope.sqllogic +329 -0
  240. package/test/logic/41-generated-columns.sqllogic +361 -0
  241. package/test/logic/41.1-alter-pk.sqllogic +230 -0
  242. package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
  243. package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
  244. package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
  245. package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
  246. package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
  247. package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
  248. package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
  249. package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
  250. package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
  251. package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
  252. package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
  253. package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
  254. package/test/logic/41.2-alter-column.sqllogic +382 -0
  255. package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
  256. package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
  257. package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
  258. package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
  259. package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
  260. package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
  261. package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
  262. package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
  263. package/test/logic/41.5-alter-misc.sqllogic +48 -0
  264. package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
  265. package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
  266. package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
  267. package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
  268. package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
  269. package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
  270. package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
  271. package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
  272. package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
  273. package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
  274. package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
  275. package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
  276. package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
  277. package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
  278. package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
  279. package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
  280. package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
  281. package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
  282. package/test/logic/42-committed-snapshot.sqllogic +254 -0
  283. package/test/logic/42-returning.sqllogic +159 -0
  284. package/test/logic/42.1-returning-extras.sqllogic +232 -0
  285. package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
  286. package/test/logic/43-default-nullability.sqllogic +131 -0
  287. package/test/logic/43-transition-constraints.sqllogic +341 -0
  288. package/test/logic/43.1-default-collation.sqllogic +140 -0
  289. package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
  290. package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
  291. package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
  292. package/test/logic/44-determinism-validation.sqllogic +164 -0
  293. package/test/logic/44-orthogonality.sqllogic +146 -0
  294. package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
  295. package/test/logic/45-udf-determinism.sqllogic +39 -0
  296. package/test/logic/46-mutation-context.sqllogic +595 -0
  297. package/test/logic/47-upsert.sqllogic +255 -0
  298. package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
  299. package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
  300. package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
  301. package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
  302. package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
  303. package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
  304. package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
  305. package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
  306. package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
  307. package/test/logic/49-reference-graph.sqllogic +84 -0
  308. package/test/logic/50-declarative-schema.sqllogic +2550 -0
  309. package/test/logic/50-metadata-tags.sqllogic +1033 -0
  310. package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
  311. package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
  312. package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
  313. package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +173 -0
  314. package/test/logic/50.3-declare-schema-duplicate-names.sqllogic +280 -0
  315. package/test/logic/50.4-declare-schema-apply-restore.sqllogic +192 -0
  316. package/test/logic/51-lens-foundation.sqllogic +147 -0
  317. package/test/logic/51-materialized-views.sqllogic +376 -0
  318. package/test/logic/51.5-materialized-views-coarsened-key.sqllogic +198 -0
  319. package/test/logic/51.7-maintained-table-attach-detach.sqllogic +468 -0
  320. package/test/logic/51.8-maintained-table-declared-constraints.sqllogic +440 -0
  321. package/test/logic/51.85-maintained-table-parent-fk.sqllogic +103 -0
  322. package/test/logic/51.9-maintained-table-secondary-unique.sqllogic +237 -0
  323. package/test/logic/51.9.1-maintained-table-partial-unique.sqllogic +36 -0
  324. package/test/logic/52-lens-overrides.sqllogic +566 -0
  325. package/test/logic/53-materialized-views-rowtime.sqllogic +1601 -0
  326. package/test/logic/53-reserved-tags.sqllogic +252 -0
  327. package/test/logic/53.1-materialized-view-write-through.sqllogic +329 -0
  328. package/test/logic/53.2-materialized-view-rename-propagation.sqllogic +483 -0
  329. package/test/logic/53.3-materialized-view-constraint-only-ddl.sqllogic +409 -0
  330. package/test/logic/53.3.1-materialized-view-index-ddl-irrelevance.sqllogic +29 -0
  331. package/test/logic/53.4-materialized-view-structural-alter-restore.sqllogic +436 -0
  332. package/test/logic/54-covering-mv-enforcement.sqllogic +314 -0
  333. package/test/logic/54.1-covering-mv-partial-enforcement.sqllogic +34 -0
  334. package/test/logic/55-internal-eviction-reporting.sqllogic +89 -0
  335. package/test/logic/55-lens-prover.sqllogic +202 -0
  336. package/test/logic/55.1-eviction-restrict-fk.sqllogic +148 -0
  337. package/test/logic/55.5-lens-authored-inverse.sqllogic +1468 -0
  338. package/test/logic/80-grow-retrieve-pass.sqllogic +79 -0
  339. package/test/logic/81-quickpick.sqllogic +24 -0
  340. package/test/logic/82-bloom-join.sqllogic +185 -0
  341. package/test/logic/83-merge-join.sqllogic +280 -0
  342. package/test/logic/84-asof-scan.sqllogic +238 -0
  343. package/test/logic/84-key-cardinality.sqllogic +50 -0
  344. package/test/logic/85-relational-const-folding.sqllogic +51 -0
  345. package/test/logic/86-scalar-cse.sqllogic +42 -0
  346. package/test/logic/90-error_paths.sqllogic +114 -0
  347. package/test/logic/90.1-parse-errors.sqllogic +77 -0
  348. package/test/logic/90.2-alter-table-errors.sqllogic +53 -0
  349. package/test/logic/90.2.1-alter-extra-errors.sqllogic +51 -0
  350. package/test/logic/90.3-expression-errors.sqllogic +43 -0
  351. package/test/logic/90.4-dml-errors.sqllogic +47 -0
  352. package/test/logic/90.5-unsupported-join-types.sqllogic +37 -0
  353. package/test/logic/90.5.1-right-full-join-read.sqllogic +157 -0
  354. package/test/logic/90.6-select-error-paths.sqllogic +57 -0
  355. package/test/logic/91-merge-join-edge-cases.sqllogic +159 -0
  356. package/test/logic/92-hash-aggregate-edge-cases.sqllogic +139 -0
  357. package/test/logic/93-ddl-view-edge-cases.sqllogic +104 -0
  358. package/test/logic/93.1-view-error-paths.sqllogic +74 -0
  359. package/test/logic/93.2-view-mutation-pending.sqllogic +108 -0
  360. package/test/logic/93.3-view-mutation-or-clause.sqllogic +60 -0
  361. package/test/logic/93.4-view-mutation.sqllogic +4881 -0
  362. package/test/logic/93.4.1-view-mutation-partial-unique-cardinality.sqllogic +31 -0
  363. package/test/logic/93.5-authored-inverse.sqllogic +415 -0
  364. package/test/logic/93.6-set-op-flagless-write.sqllogic +862 -0
  365. package/test/logic/94-tvf-edge-cases.sqllogic +58 -0
  366. package/test/logic/94.1-limit-offset-edge-cases.sqllogic +109 -0
  367. package/test/logic/94.2-limit-offset-extras.sqllogic +98 -0
  368. package/test/logic/95-assertions.sqllogic +1417 -0
  369. package/test/logic/96-subquery-edge-cases.sqllogic +276 -0
  370. package/test/logic/97-json-function-edge-cases.sqllogic +633 -0
  371. package/test/logic/97.1-json-blob-and-special-values.sqllogic +92 -0
  372. package/test/logic/98-temporal-edge-cases.sqllogic +515 -0
  373. package/test/logic/99-conversion-edge-cases.sqllogic +325 -0
  374. package/test/logic/99.0.1-schema-index-listing.sqllogic +21 -0
  375. package/test/logic/99.1-cast-syntax-extras.sqllogic +167 -0
  376. package/test/logic/drop-unique-index.sqllogic +88 -0
  377. package/test/logic/pushdown-test.sqllogic +36 -0
@@ -0,0 +1,48 @@
1
+ -- adapted from SQLite test/alter.test
2
+ -- ALTER TABLE: UTF-8 identifier handling and transaction interaction.
3
+
4
+ -- ===================================
5
+ -- 1. RENAME / ADD COLUMN with non-ASCII identifiers
6
+ -- ===================================
7
+
8
+ create table t_utf (id integer primary key, "naïve" text null);
9
+ insert into t_utf values (1, 'x');
10
+
11
+ alter table t_utf rename column "naïve" to "café";
12
+
13
+ select "café" from t_utf where id = 1;
14
+ → [{"café":"x"}]
15
+
16
+ alter table t_utf rename to "tüble";
17
+
18
+ select count(*) as cnt from "tüble";
19
+ → [{"cnt":1}]
20
+
21
+ drop table "tüble";
22
+
23
+ -- ===================================
24
+ -- 2. ALTER inside an explicit transaction
25
+ -- ===================================
26
+ -- Quereus DDL changes are applied immediately and are NOT rolled back by
27
+ -- transaction rollback (see 10.1-ddl-lifecycle).
28
+
29
+ create table t_tx (id integer primary key, a integer null);
30
+ insert into t_tx values (1, 10);
31
+
32
+ begin;
33
+ alter table t_tx add column b integer default 0;
34
+ insert into t_tx (id, a, b) values (2, 20, 200);
35
+ commit;
36
+
37
+ select * from t_tx order by id;
38
+ → [{"id":1,"a":10,"b":0},{"id":2,"a":20,"b":200}]
39
+
40
+ -- rollback path: schema change persists per documented Quereus DDL semantics
41
+ begin;
42
+ alter table t_tx rename column a to alpha;
43
+ rollback;
44
+
45
+ select alpha from t_tx where id = 1;
46
+ → [{"alpha":10}]
47
+
48
+ drop table t_tx;
@@ -0,0 +1,253 @@
1
+ -- 41.5-cross-schema-foreign-keys.sqllogic — a FOREIGN KEY whose parent table
2
+ -- lives in a different schema than the child, end to end: child-side EXISTS,
3
+ -- parent-side RESTRICT / CASCADE / SET NULL / SET DEFAULT, a maintained-table
4
+ -- parent, and FK introspection of the parent schema. Same-schema FK behaviour is
5
+ -- unchanged and stays covered by 41-foreign-keys.sqllogic.
6
+
7
+ pragma foreign_keys = true;
8
+
9
+ -- Register an auxiliary physical schema `s2`. Child / parent tables are created
10
+ -- imperatively below so each scenario reads like an ordinary CREATE TABLE.
11
+ declare schema s2 {}
12
+ apply schema s2;
13
+ -- run
14
+
15
+ -- ===================================================================
16
+ -- Child in s2 → parent in main: child-side INSERT validation
17
+ -- The synthesized EXISTS resolves the parent via its own (main) schema even
18
+ -- though the constraint is built under the child's (s2) schema.
19
+ -- ===================================================================
20
+
21
+ create table m (id integer primary key, label text);
22
+ insert into m values (1, 'one'), (2, 'two');
23
+
24
+ create table s2.child (
25
+ id integer primary key,
26
+ m_id integer null,
27
+ foreign key (m_id) references main.m(id) on delete restrict
28
+ );
29
+
30
+ -- parent row exists → ok
31
+ insert into s2.child values (1, 1);
32
+ select * from s2.child;
33
+ → [{"id":1,"m_id":1}]
34
+
35
+ -- NULL FK column passes MATCH SIMPLE even across schemas
36
+ insert into s2.child values (2, null);
37
+ select id, m_id from s2.child order by id;
38
+ → [{"id":1,"m_id":1},{"id":2,"m_id":null}]
39
+
40
+ -- orphan (no parent row 99 in main.m) → child-side EXISTS fails
41
+ insert into s2.child values (3, 99);
42
+ -- error: constraint failed
43
+
44
+ select count(*) as n from s2.child;
45
+ → [{"n":2}]
46
+
47
+ -- ===================================================================
48
+ -- Parent-side RESTRICT: deleting / updating a referenced main.m row is blocked
49
+ -- by the cross-schema child in s2 (NOT EXISTS resolves the child via its schema).
50
+ -- ===================================================================
51
+
52
+ -- delete a referenced parent row → blocked
53
+ delete from m where id = 1;
54
+ -- error: constraint failed
55
+
56
+ select count(*) as n from m;
57
+ → [{"n":2}]
58
+
59
+ -- delete an unreferenced parent row → ok
60
+ delete from m where id = 2;
61
+ select id from m order by id;
62
+ → [{"id":1}]
63
+
64
+ drop table s2.child;
65
+ drop table m;
66
+
67
+ -- ===================================================================
68
+ -- ON DELETE CASCADE across schemas: deleting the main parent removes the s2 child
69
+ -- ===================================================================
70
+
71
+ create table mp (id integer primary key, v text);
72
+ create table s2.cc (
73
+ cid integer primary key,
74
+ p_id integer,
75
+ foreign key (p_id) references main.mp(id) on delete cascade
76
+ );
77
+ insert into mp values (1, 'a'), (2, 'b');
78
+ insert into s2.cc values (10, 1), (11, 1), (20, 2);
79
+
80
+ select count(*) as n from s2.cc;
81
+ → [{"n":3}]
82
+
83
+ delete from mp where id = 1;
84
+
85
+ select count(*) as n from mp where id = 1;
86
+ → [{"n":0}]
87
+
88
+ -- child rows referencing the deleted parent are gone
89
+ select cid from s2.cc order by cid;
90
+ → [{"cid":20}]
91
+
92
+ drop table s2.cc;
93
+ drop table mp;
94
+
95
+ -- ===================================================================
96
+ -- ON DELETE SET NULL across schemas
97
+ -- ===================================================================
98
+
99
+ create table msn (id integer primary key, v text);
100
+ create table s2.csn (
101
+ cid integer primary key,
102
+ p_id integer null,
103
+ foreign key (p_id) references main.msn(id) on delete set null
104
+ );
105
+ insert into msn values (1, 'x'), (2, 'y');
106
+ insert into s2.csn values (1, 1), (2, 1), (3, 2);
107
+
108
+ delete from msn where id = 1;
109
+
110
+ select cid, p_id from s2.csn order by cid;
111
+ → [{"cid":1,"p_id":null},{"cid":2,"p_id":null},{"cid":3,"p_id":2}]
112
+
113
+ drop table s2.csn;
114
+ drop table msn;
115
+
116
+ -- ===================================================================
117
+ -- ON DELETE SET DEFAULT across schemas
118
+ -- ===================================================================
119
+
120
+ create table msd (id integer primary key, v text);
121
+ create table s2.csd (
122
+ cid integer primary key,
123
+ p_id integer default 0,
124
+ foreign key (p_id) references main.msd(id) on delete set default
125
+ );
126
+ insert into msd values (0, 'default'), (1, 'one'), (2, 'two');
127
+ insert into s2.csd values (1, 1), (2, 1), (3, 2);
128
+
129
+ delete from msd where id = 1;
130
+
131
+ select cid, p_id from s2.csd order by cid;
132
+ → [{"cid":1,"p_id":0},{"cid":2,"p_id":0},{"cid":3,"p_id":2}]
133
+
134
+ drop table s2.csd;
135
+ drop table msd;
136
+
137
+ -- ===================================================================
138
+ -- Maintained-table parent in main, child in s2: a maintenance delete of the
139
+ -- parent row must fire the cross-schema child's RESTRICT through the reverse-FK
140
+ -- index (keyed under the parent's schema, main).
141
+ -- ===================================================================
142
+
143
+ create table src (id integer primary key, v text);
144
+ create table mm (id integer primary key, v text) maintained as select id, v from src;
145
+ create table s2.cmm (
146
+ cid integer primary key,
147
+ m_id integer,
148
+ foreign key (m_id) references main.mm(id) on delete restrict
149
+ );
150
+ insert into src values (1, 'a'), (2, 'b');
151
+ insert into s2.cmm values (10, 1);
152
+
153
+ -- maintenance delete of mm(1) blocked by the cross-schema RESTRICT child
154
+ delete from src where id = 1;
155
+ -- error: violates RESTRICT
156
+
157
+ -- atomic rollback: source + maintained parent + child all intact
158
+ select id from mm order by id;
159
+ → [{"id":1},{"id":2}]
160
+ select count(*) as n from s2.cmm;
161
+ → [{"n":1}]
162
+
163
+ -- deleting the unreferenced parent row maintains cleanly
164
+ delete from src where id = 2;
165
+ select id from mm order by id;
166
+ → [{"id":1}]
167
+
168
+ drop table s2.cmm;
169
+ drop table mm;
170
+ drop table src;
171
+
172
+ -- ===================================================================
173
+ -- Self-referencing FK declared with an explicit own-schema qualifier
174
+ -- (`references s2.tree` from s2.tree): resolves against the child's own schema,
175
+ -- validates at CREATE (table not yet registered), and enforces + cascades.
176
+ -- ===================================================================
177
+
178
+ create table s2.tree (
179
+ id integer primary key,
180
+ parent_id integer null,
181
+ foreign key (parent_id) references s2.tree(id) on delete cascade
182
+ );
183
+
184
+ -- root with NULL parent into an empty table → ok (MATCH SIMPLE)
185
+ insert into s2.tree values (1, null);
186
+ insert into s2.tree values (2, 1), (3, 1);
187
+ select id, parent_id from s2.tree order by id;
188
+ → [{"id":1,"parent_id":null},{"id":2,"parent_id":1},{"id":3,"parent_id":1}]
189
+
190
+ -- orphan child → fails
191
+ insert into s2.tree values (4, 99);
192
+ -- error: constraint failed
193
+
194
+ -- cascade delete of the root removes its children
195
+ delete from s2.tree where id = 1;
196
+ select count(*) as n from s2.tree;
197
+ → [{"n":0}]
198
+
199
+ drop table s2.tree;
200
+
201
+ -- ===================================================================
202
+ -- FK introspection across schemas (the reverse direction: child in main,
203
+ -- parent in s2). foreign_key_info surfaces the true parent schema. This also
204
+ -- exercises the child-side EXISTS against an s2 parent from a main child.
205
+ -- ===================================================================
206
+
207
+ create table s2.par (id integer primary key, label text);
208
+ create table mchild (
209
+ id integer primary key,
210
+ p_id integer,
211
+ foreign key (p_id) references s2.par(id) on delete restrict
212
+ );
213
+
214
+ select referenced_table, referenced_schema from foreign_key_info('mchild');
215
+ → [{"referenced_table":"par","referenced_schema":"s2"}]
216
+
217
+ -- enforcement still holds with the parent in s2
218
+ insert into s2.par values (1, 'p1');
219
+ insert into mchild values (1, 1);
220
+ select * from mchild;
221
+ → [{"id":1,"p_id":1}]
222
+
223
+ insert into mchild values (2, 99);
224
+ -- error: constraint failed
225
+
226
+ drop table mchild;
227
+
228
+ -- Implicit (no parent column list) cross-schema FK resolves against the
229
+ -- s2 parent's primary key, not just its own schema.
230
+ create table mchild2 (
231
+ id integer primary key,
232
+ p_id integer references s2.par
233
+ );
234
+
235
+ select referenced_table, referenced_schema, "to" from foreign_key_info('mchild2');
236
+ → [{"referenced_table":"par","referenced_schema":"s2","to":"id"}]
237
+
238
+ drop table mchild2;
239
+ drop table s2.par;
240
+
241
+ -- Regression: an ordinary same-schema FK reports its own schema (not null),
242
+ -- unchanged from before this feature.
243
+ create table sm_parent (id integer primary key);
244
+ create table sm_child (
245
+ id integer primary key,
246
+ p_id integer,
247
+ foreign key (p_id) references sm_parent(id)
248
+ );
249
+ select referenced_table, referenced_schema from foreign_key_info('sm_child');
250
+ → [{"referenced_table":"sm_parent","referenced_schema":"main"}]
251
+
252
+ drop table sm_child;
253
+ drop table sm_parent;
@@ -0,0 +1,354 @@
1
+ -- 41.6-alter-drop-rename-constraint.sqllogic
2
+ -- ALTER TABLE DROP CONSTRAINT / RENAME CONSTRAINT for named CHECK / UNIQUE /
3
+ -- FOREIGN KEY constraints. Behavioral assertions only (enforcement on/off after
4
+ -- the change + introspection via *_constraint_info TVFs), so this passes under
5
+ -- both `yarn test` (memory) and `yarn test:store`. Memory-specific covering-index
6
+ -- teardown is verified in alter-drop-rename-constraint.spec.ts.
7
+
8
+ pragma foreign_keys = true;
9
+ -- run
10
+
11
+ -- ============================================================
12
+ -- 1. DROP CONSTRAINT — named CHECK
13
+ -- ============================================================
14
+ create table c_chk (id integer primary key, qty integer, constraint chk_qty check (qty > 0));
15
+ insert into c_chk values (1, 5);
16
+ -- run
17
+
18
+ -- enforcement active: non-positive qty rejected
19
+ insert into c_chk values (2, -1);
20
+ -- error: check
21
+
22
+ -- introspection lists the named CHECK
23
+ select name from check_constraint_info('c_chk') where name = 'chk_qty';
24
+ → [{"name":"chk_qty"}]
25
+
26
+ alter table c_chk drop constraint chk_qty;
27
+ -- run
28
+
29
+ -- no longer listed
30
+ select count(*) as c from check_constraint_info('c_chk') where name = 'chk_qty';
31
+ → [{"c":0}]
32
+
33
+ -- enforcement gone: non-positive qty now accepted
34
+ insert into c_chk values (2, -1);
35
+ select qty from c_chk where id = 2;
36
+ → [{"qty":-1}]
37
+
38
+ drop table c_chk;
39
+ -- run
40
+
41
+ -- ============================================================
42
+ -- 2. DROP CONSTRAINT — named UNIQUE (covering structure released)
43
+ -- ============================================================
44
+ create table u_drop (id integer primary key, email text, constraint uq_email unique (email));
45
+ insert into u_drop values (1, 'a@x'), (2, 'b@x');
46
+ -- run
47
+
48
+ -- enforcement active: duplicate rejected
49
+ insert into u_drop values (3, 'a@x');
50
+ -- error: unique
51
+
52
+ alter table u_drop drop constraint uq_email;
53
+ -- run
54
+
55
+ -- constraint gone
56
+ select count(*) as c from unique_constraint_info('u_drop') where name = 'uq_email';
57
+ → [{"c":0}]
58
+
59
+ -- duplicate now accepted
60
+ insert into u_drop values (3, 'a@x');
61
+ select count(*) as c from u_drop;
62
+ → [{"c":3}]
63
+
64
+ drop table u_drop;
65
+ -- run
66
+
67
+ -- ============================================================
68
+ -- 3. DROP CONSTRAINT — named FOREIGN KEY (enforcement disabled)
69
+ -- ============================================================
70
+ create table fk_parent (pid integer primary key);
71
+ insert into fk_parent values (1), (2);
72
+ create table fk_child (id integer primary key, pid integer, constraint fk_p foreign key (pid) references fk_parent(pid));
73
+ insert into fk_child values (1, 1);
74
+ -- run
75
+
76
+ -- enforcement active: orphan child rejected
77
+ insert into fk_child values (2, 99);
78
+ -- error:
79
+
80
+ select name from foreign_key_info('fk_child') where name = 'fk_p';
81
+ → [{"name":"fk_p"}]
82
+
83
+ alter table fk_child drop constraint fk_p;
84
+ -- run
85
+
86
+ select count(*) as c from foreign_key_info('fk_child') where name = 'fk_p';
87
+ → [{"c":0}]
88
+
89
+ -- enforcement gone: orphan child now accepted
90
+ insert into fk_child values (2, 99);
91
+ select pid from fk_child where id = 2;
92
+ → [{"pid":99}]
93
+
94
+ drop table fk_child;
95
+ drop table fk_parent;
96
+ -- run
97
+
98
+ -- ============================================================
99
+ -- 4. RENAME CONSTRAINT — named CHECK
100
+ -- ============================================================
101
+ create table r_chk (id integer primary key, n integer, constraint chk_n check (n >= 0));
102
+ insert into r_chk values (1, 5);
103
+ -- run
104
+
105
+ alter table r_chk rename constraint chk_n to chk_nonneg;
106
+ -- run
107
+
108
+ -- old name gone, new name present
109
+ select count(*) as c from check_constraint_info('r_chk') where name = 'chk_n';
110
+ → [{"c":0}]
111
+
112
+ select name from check_constraint_info('r_chk') where name = 'chk_nonneg';
113
+ → [{"name":"chk_nonneg"}]
114
+
115
+ -- still enforces under the new name
116
+ insert into r_chk values (2, -1);
117
+ -- error: check
118
+
119
+ drop table r_chk;
120
+ -- run
121
+
122
+ -- ============================================================
123
+ -- 5. RENAME CONSTRAINT — named UNIQUE
124
+ -- ============================================================
125
+ create table r_unq (id integer primary key, email text, constraint uq_e unique (email));
126
+ insert into r_unq values (1, 'a');
127
+ -- run
128
+
129
+ alter table r_unq rename constraint uq_e to uq_email;
130
+ -- run
131
+
132
+ select name from unique_constraint_info('r_unq') where name = 'uq_email';
133
+ → [{"name":"uq_email"}]
134
+
135
+ select count(*) as c from unique_constraint_info('r_unq') where name = 'uq_e';
136
+ → [{"c":0}]
137
+
138
+ -- still enforces under the new name
139
+ insert into r_unq values (2, 'a');
140
+ -- error: unique
141
+
142
+ drop table r_unq;
143
+ -- run
144
+
145
+ -- ============================================================
146
+ -- 6. RENAME CONSTRAINT — named FOREIGN KEY
147
+ -- ============================================================
148
+ create table rfk_parent (pid integer primary key);
149
+ insert into rfk_parent values (1);
150
+ create table rfk_child (id integer primary key, pid integer, constraint fk_p foreign key (pid) references rfk_parent(pid));
151
+ -- run
152
+
153
+ alter table rfk_child rename constraint fk_p to fk_parent_ref;
154
+ -- run
155
+
156
+ select name from foreign_key_info('rfk_child') where name = 'fk_parent_ref';
157
+ → [{"name":"fk_parent_ref"}]
158
+
159
+ -- still enforces under the new name
160
+ insert into rfk_child values (1, 99);
161
+ -- error:
162
+
163
+ drop table rfk_child;
164
+ drop table rfk_parent;
165
+ -- run
166
+
167
+ -- ============================================================
168
+ -- 7. Error cases
169
+ -- ============================================================
170
+
171
+ -- NOTFOUND
172
+ create table e_nf (id integer primary key, a integer, constraint c1 check (a > 0));
173
+ -- run
174
+
175
+ alter table e_nf drop constraint nope;
176
+ -- error: not found
177
+
178
+ alter table e_nf rename constraint nope to other;
179
+ -- error: not found
180
+
181
+ drop table e_nf;
182
+ -- run
183
+
184
+ -- Ambiguous: same name in two constraint classes. Formerly constructible right
185
+ -- here — which was exactly the defect: `drop constraint dup` reported the pair
186
+ -- ambiguous FOREVER, so neither could ever be removed. The state is now refused
187
+ -- at CREATE TABLE (see 10.1.4-create-table-duplicate-constraint-names), so the
188
+ -- resolver's ambiguity arm survives only as a defensive guard for catalogs
189
+ -- persisted before the guard existed.
190
+ create table e_amb (id integer primary key, a integer, constraint dup check (a > 0), constraint dup unique (a));
191
+ -- error: duplicate constraint name 'dup'
192
+
193
+ -- Collision: rename target already names a constraint
194
+ create table e_coll (id integer primary key, a integer, b integer, constraint u1 unique (a), constraint u2 unique (b));
195
+ -- run
196
+
197
+ alter table e_coll rename constraint u1 to u2;
198
+ -- error: already exists
199
+
200
+ drop table e_coll;
201
+ -- run
202
+
203
+ -- The negative control for a UNIQUE derived from CREATE UNIQUE INDEX (DROP CONSTRAINT
204
+ -- cannot target it) lives in 41.6.1-alter-drop-constraint-index-derived.
205
+
206
+ -- ------------------------------------------------------------
207
+ -- 7b. ADD CONSTRAINT refuses a name another constraint already uses.
208
+ -- Same rule RENAME CONSTRAINT enforces, applied to the addition side. The refusal
209
+ -- happens before the statement reaches the storage module, so memory and store agree
210
+ -- and nothing is persisted — which is why these live here rather than in a spec.
211
+ -- ------------------------------------------------------------
212
+
213
+ -- CHECK onto CHECK
214
+ create table a_chk (id integer primary key, a integer, b integer, constraint ck check (a > 0));
215
+ -- run
216
+
217
+ alter table a_chk add constraint ck check (b > 0);
218
+ -- error: already exists
219
+
220
+ -- refused ⇒ table untouched: still exactly one CHECK named ck
221
+ select count(*) as c from check_constraint_info('a_chk') where name = 'ck';
222
+ → [{"c":1}]
223
+
224
+ -- a different name is still accepted
225
+ alter table a_chk add constraint ck2 check (b > 0);
226
+ -- run
227
+
228
+ select count(*) as c from check_constraint_info('a_chk') where name = 'ck2';
229
+ → [{"c":1}]
230
+
231
+ -- case-insensitive, like every other constraint-name comparison
232
+ alter table a_chk add constraint CK check (b > 1);
233
+ -- error: already exists
234
+
235
+ drop table a_chk;
236
+ -- run
237
+
238
+ -- UNIQUE onto UNIQUE
239
+ create table a_unq (id integer primary key, a integer, b integer, constraint uq unique (a));
240
+ -- run
241
+
242
+ alter table a_unq add constraint uq unique (b);
243
+ -- error: already exists
244
+
245
+ select count(*) as c from unique_constraint_info('a_unq') where name = 'uq';
246
+ → [{"c":1}]
247
+
248
+ -- negative control: an UNNAMED add has no user-supplied name to collide, so it succeeds
249
+ alter table a_unq add unique (b);
250
+ -- run
251
+
252
+ insert into a_unq values (1, 1, 1);
253
+ insert into a_unq values (2, 2, 1);
254
+ -- error: unique
255
+
256
+ drop table a_unq;
257
+ -- run
258
+
259
+ -- FOREIGN KEY onto FOREIGN KEY
260
+ create table a_fk_parent (pid integer primary key);
261
+ create table a_fk_child (id integer primary key, x integer, y integer, constraint fk foreign key (x) references a_fk_parent(pid));
262
+ -- run
263
+
264
+ alter table a_fk_child add constraint fk foreign key (y) references a_fk_parent(pid);
265
+ -- error: already exists
266
+
267
+ select count(*) as c from foreign_key_info('a_fk_child') where name = 'fk';
268
+ → [{"c":1}]
269
+
270
+ drop table a_fk_child;
271
+ drop table a_fk_parent;
272
+ -- run
273
+
274
+ -- Cross-class: a CHECK's name blocks a UNIQUE of the same name (and vice versa).
275
+ -- Without this, the table ends up with a name no DROP/RENAME can ever address —
276
+ -- both fail permanently with the ambiguity error from § 7 above.
277
+ create table a_cross (id integer primary key, a integer, b integer, constraint dup check (a > 0));
278
+ -- run
279
+
280
+ alter table a_cross add constraint dup unique (b);
281
+ -- error: already exists
282
+
283
+ select count(*) as c from unique_constraint_info('a_cross') where name = 'dup';
284
+ → [{"c":0}]
285
+
286
+ -- the name still resolves to exactly one constraint, so DROP works
287
+ alter table a_cross drop constraint dup;
288
+ -- run
289
+
290
+ select count(*) as c from check_constraint_info('a_cross') where name = 'dup';
291
+ → [{"c":0}]
292
+
293
+ drop table a_cross;
294
+ -- run
295
+
296
+ -- ADD COLUMN carrying an inline NAMED constraint is refused the same way
297
+ create table a_col (id integer primary key, a integer, constraint ck check (a > 0));
298
+ -- run
299
+
300
+ alter table a_col add column b integer null constraint ck check (b > 0);
301
+ -- error: already exists
302
+
303
+ -- refused ⇒ no column added and no constraint installed
304
+ select count(*) as c from table_info('a_col') where name = 'b';
305
+ → [{"c":0}]
306
+
307
+ select count(*) as c from check_constraint_info('a_col') where name = 'ck';
308
+ → [{"c":1}]
309
+
310
+ -- two inline constraints colliding with EACH OTHER on one ADD COLUMN (neither exists
311
+ -- on the table yet, so only the within-statement accumulation catches it)
312
+ alter table a_col add column c integer null constraint x check (c > 0) constraint x unique;
313
+ -- error: already exists
314
+
315
+ select count(*) as c from table_info('a_col') where name = 'c';
316
+ → [{"c":0}]
317
+
318
+ -- a non-colliding inline name still works
319
+ alter table a_col add column d integer null constraint ck_d check (d > 0);
320
+ -- run
321
+
322
+ select count(*) as c from check_constraint_info('a_col') where name = 'ck_d';
323
+ → [{"c":1}]
324
+
325
+ drop table a_col;
326
+ -- run
327
+
328
+ -- ============================================================
329
+ -- 8. DROP CONSTRAINT (CHECK) invalidates optimizer folding
330
+ -- ============================================================
331
+ -- A declared `check (x = 1)` lifts an FD/constant-binding onto the table that
332
+ -- the filter-contradiction rule uses to fold `where x = 2` to EmptyRelation.
333
+ -- Dropping the CHECK fires `table_modified`, which must invalidate that folding
334
+ -- so a row that violates the dropped predicate is actually returned (regression
335
+ -- guard for the cache-invalidation path on the constraint-drop case).
336
+ create table fold_chk (id integer primary key, x integer, constraint chk check (x = 1));
337
+ insert into fold_chk values (1, 1);
338
+ -- run
339
+
340
+ -- With the CHECK active, `where x = 2` is unsatisfiable (no such row can exist).
341
+ select count(*) as c from fold_chk where x = 2;
342
+ → [{"c":0}]
343
+
344
+ alter table fold_chk drop constraint chk;
345
+ -- run
346
+
347
+ -- A row that would have violated the dropped CHECK now inserts and must be found
348
+ -- (folding no longer applies).
349
+ insert into fold_chk values (2, 2);
350
+ select count(*) as c from fold_chk where x = 2;
351
+ → [{"c":1}]
352
+
353
+ drop table fold_chk;
354
+ -- run
@@ -0,0 +1,22 @@
1
+ -- 41.6.1-alter-drop-constraint-index-derived.sqllogic
2
+ --
3
+ -- requires-capability: standalone-index-ddl
4
+ --
5
+ -- Carved out of 41.6-alter-drop-rename-constraint: every other section there drops or
6
+ -- renames a named CHECK, UNIQUE or FOREIGN KEY declared in the table definition, with
7
+ -- no index DDL. This one negative control needs a UNIQUE that came from a standalone
8
+ -- `create unique index`, which is the whole point of the case.
9
+ --
10
+ -- Subject: a UNIQUE derived from CREATE UNIQUE INDEX is owned by the index, so
11
+ -- ALTER TABLE … DROP CONSTRAINT refuses to target it.
12
+
13
+ -- A UNIQUE derived from CREATE UNIQUE INDEX cannot be dropped as a constraint
14
+ create table e_der (id integer primary key, a integer);
15
+ create unique index uq_idx on e_der (a);
16
+ -- run
17
+
18
+ alter table e_der drop constraint uq_idx;
19
+ -- error: backed by index
20
+
21
+ drop table e_der;
22
+ -- run