@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,305 @@
1
+ -- 102.2.1-unique-collation-index-derived.sqllogic — UNIQUE whose collation comes from a
2
+ -- standalone `create unique index`, not from the column declaration.
3
+ --
4
+ -- requires-capability: standalone-index-ddl
5
+ --
6
+ -- Carved out of 102.2-unique-collation: §§1-8 there prove the same collation ground
7
+ -- (auto-index enforcement, OR IGNORE/OR REPLACE, covering-MV path, RTRIM, composite
8
+ -- members, UPDATE, lowercase spelling) using only inline / table-level `unique`, and
9
+ -- are a complete self-sufficient subset. Everything below needs an explicit
10
+ -- `create unique index … collate …`, which is the only way to give a UNIQUE a
11
+ -- collation that differs from its column's.
12
+ --
13
+ -- Runs under BOTH the memory module (`yarn test`) and the store module
14
+ -- (`yarn test:store`). §1 (was §9) exercises the index-derived shapes (finer / coarser /
15
+ -- plain index) through the plain per-scan / auto-index path. §2 (was §10) reruns them
16
+ -- through a row-time covering MV, where the collation eligibility gate
17
+ -- (`covering-mv-index-derived-unique-collation`) keeps an MV only when the index
18
+ -- collation is coarser-or-equal to the declared column collation per column. §3 (was §11)
19
+ -- covers two UNIQUE indexes over the SAME column-set with differing collations: each
20
+ -- derived constraint enforces under ITS OWN index's collation in BOTH creation orders
21
+ -- (`memory-multi-index-unique-collation-resolution`). §4 (was §12) covers a NON-derived
22
+ -- (table-level / column) UNIQUE coexisting with a FINER same-column-set
23
+ -- `create unique index`: the non-derived UNIQUE enforces under its DECLARED collation
24
+ -- in BOTH creation orders, the user's finer index keeps enforcing its own uniqueness,
25
+ -- and dropping the non-derived constraint leaves the user index intact
26
+ -- (`memory-nonderived-unique-reused-finer-index-under-enforcement`). §5 (was §13) covers
27
+ -- conflict resolution (OR REPLACE / OR IGNORE) over those two coexisting structures:
28
+ -- a conflict on one is not a false conflict on the other, and OR REPLACE evicts
29
+ -- exactly the row the conflicting structure identifies.
30
+ --
31
+ -- Section numbers below keep their original 9-13 labels so cross-references from
32
+ -- 102.2 and from the source tickets still resolve.
33
+
34
+ -- ===================================
35
+ -- 9. Index-derived UNIQUE enforces under the INDEX's per-column collation, not
36
+ -- the column's declared collation. A `create unique index … (col collate x)`
37
+ -- carries its own comparator; both modules enforce through it (memory's
38
+ -- checkUniqueViaIndex / the store's findUniqueConflict, both now resolving the
39
+ -- index per-column collation). Run through the plain per-scan / auto-index
40
+ -- path (no covering MV), where memory and store provably agree.
41
+ -- (store-index-derived-unique-honors-index-collation.)
42
+ -- ===================================
43
+
44
+ -- 9a. FINER index (BINARY) over a NOCASE column ADMITS both case-variants — the
45
+ -- NOCASE column would unify 'Bob'/'bob' but the BINARY index keeps them apart.
46
+ create table fai (id integer primary key, b text collate NOCASE);
47
+ create unique index fai_b on fai (b collate BINARY);
48
+ insert into fai values (1, 'Bob');
49
+ insert into fai values (2, 'bob');
50
+ select id, b from fai order by id;
51
+ → [{"id":1,"b":"Bob"},{"id":2,"b":"bob"}]
52
+
53
+ -- a genuine BINARY duplicate is still rejected (guard against under-matching)
54
+ insert into fai values (3, 'bob');
55
+ -- error: UNIQUE constraint failed
56
+
57
+ select count(*) as n from fai;
58
+ → [{"n":2}]
59
+
60
+ -- 9b. COARSER index (NOCASE) over a BINARY column UNIFIES case-variants — the
61
+ -- BINARY column would keep 'Bob'/'BOB' distinct but the NOCASE index folds them.
62
+ create table cbi (id integer primary key, b text);
63
+ create unique index cbi_b on cbi (b collate NOCASE);
64
+ insert into cbi values (1, 'Bob');
65
+ insert into cbi values (2, 'BOB');
66
+ -- error: UNIQUE constraint failed
67
+
68
+ select count(*) as n from cbi;
69
+ → [{"n":1}]
70
+
71
+ -- a genuinely different value still inserts
72
+ insert into cbi values (3, 'Carol');
73
+ select id, b from cbi order by id;
74
+ → [{"id":1,"b":"Bob"},{"id":3,"b":"Carol"}]
75
+
76
+ -- 9c. A plain `create unique index` (no per-column COLLATE) falls back to the
77
+ -- column's declared collation — a NOCASE column's index still folds case.
78
+ create table pgi (id integer primary key, b text collate NOCASE);
79
+ create unique index pgi_b on pgi (b);
80
+ insert into pgi values (1, 'Bob');
81
+ insert into pgi values (2, 'bob');
82
+ -- error: UNIQUE constraint failed
83
+
84
+ select count(*) as n from pgi;
85
+ → [{"n":1}]
86
+
87
+ -- ===================================
88
+ -- 10. Index-derived UNIQUE through a row-time COVERING MV. Parallels §9's per-scan
89
+ -- shapes but with a covering MV linked, so the collation eligibility gate decides
90
+ -- whether enforcement routes through the MV (BINARY-floor / equal collation) or
91
+ -- falls back to the per-scan / auto-index path (finer/incomparable index). Both
92
+ -- paths honor the INDEX per-column collation, so memory and store agree on each
93
+ -- module (covering-mv-index-derived-unique-collation).
94
+ -- ===================================
95
+
96
+ -- 10a. FINER index (BINARY) over a NOCASE column + covering MV → eligible (I=BINARY
97
+ -- floor). The candidate set is a superset; re-validation under BINARY admits both
98
+ -- case-variants 'Bob'/'bob'. A genuine BINARY duplicate is still rejected.
99
+ create table fam (id integer primary key, b text collate NOCASE);
100
+ create unique index fam_b on fam (b collate BINARY);
101
+ create materialized view fam_mv as select b, id from fam order by b;
102
+ insert into fam values (1, 'Bob');
103
+ insert into fam values (2, 'bob');
104
+ select id, b from fam order by id;
105
+ → [{"id":1,"b":"Bob"},{"id":2,"b":"bob"}]
106
+
107
+ insert into fam values (3, 'bob');
108
+ -- error: UNIQUE constraint failed
109
+
110
+ select count(*) as n from fam;
111
+ → [{"n":2}]
112
+
113
+ -- 10b. COARSER index (NOCASE) over a BINARY column + covering MV → declined (I=NOCASE,
114
+ -- D=BINARY). Enforcement falls back to the per-scan / auto-index path under the
115
+ -- index NOCASE, so 'BOB' after 'Bob' is rejected (the silent miss the gate closes).
116
+ create table cbm (id integer primary key, b text);
117
+ create unique index cbm_b on cbm (b collate NOCASE);
118
+ create materialized view cbm_mv as select b, id from cbm order by b;
119
+ insert into cbm values (1, 'Bob');
120
+ insert into cbm values (2, 'BOB');
121
+ -- error: UNIQUE constraint failed
122
+
123
+ select count(*) as n from cbm;
124
+ → [{"n":1}]
125
+
126
+ -- a genuinely different value still inserts through the per-scan path
127
+ insert into cbm values (3, 'Carol');
128
+ select id, b from cbm order by id;
129
+ → [{"id":1,"b":"Bob"},{"id":3,"b":"Carol"}]
130
+
131
+ -- 10c. PLAIN index (no per-column COLLATE) over a NOCASE column + covering MV →
132
+ -- eligible (I falls back to D=NOCASE ⇒ equal). Unchanged NOCASE folding (mirrors §4).
133
+ create table pgm (id integer primary key, b text collate NOCASE);
134
+ create unique index pgm_b on pgm (b);
135
+ create materialized view pgm_mv as select b, id from pgm order by b;
136
+ insert into pgm values (1, 'Bob');
137
+ insert into pgm values (2, 'bob');
138
+ -- error: UNIQUE constraint failed
139
+
140
+ select count(*) as n from pgm;
141
+ → [{"n":1}]
142
+
143
+ -- a non-NOCASE-equal value still inserts through the covering path
144
+ insert into pgm values (3, 'abd');
145
+ select id, b from pgm order by id;
146
+ → [{"id":1,"b":"Bob"},{"id":3,"b":"abd"}]
147
+
148
+ -- ===================================
149
+ -- 11. TWO UNIQUE indexes over the SAME column-set with DIFFERING collations. Each
150
+ -- index-derived UNIQUE must enforce under ITS OWN index's collation, regardless
151
+ -- of the order the indexes were created in. memory's findIndexForConstraint now
152
+ -- resolves the enforcing index BY NAME (uc.derivedFromIndex), not the FIRST
153
+ -- same-column-set index, so the coarser (NOCASE) UNIQUE rejects a case-variant
154
+ -- duplicate in BOTH creation orders while the finer (BINARY) UNIQUE keeps
155
+ -- genuine byte-distinct values apart. On main the BINARY-first order silently
156
+ -- ADMITTED the NOCASE duplicate (the order-sensitive under-enforcement bug,
157
+ -- memory-multi-index-unique-collation-resolution); store already rejected both.
158
+ -- ===================================
159
+
160
+ -- 11a. BINARY index created FIRST, then NOCASE. The NOCASE UNIQUE still catches a
161
+ -- case-variant duplicate — index order no longer decides the enforcing collation.
162
+ create table mbf (id integer primary key, b text collate NOCASE);
163
+ create unique index mbf_binary on mbf (b collate BINARY);
164
+ create unique index mbf_nocase on mbf (b collate NOCASE);
165
+ insert into mbf values (1, 'Bob');
166
+
167
+ -- 'bob' is BINARY-distinct from 'Bob' but NOCASE-equal → the NOCASE UNIQUE rejects it
168
+ insert into mbf values (2, 'bob');
169
+ -- error: UNIQUE constraint failed
170
+
171
+ select count(*) as n from mbf;
172
+ → [{"n":1}]
173
+
174
+ -- a genuinely distinct value (neither NOCASE- nor BINARY-equal) still inserts — the
175
+ -- finer BINARY index keys byte-distinct values apart without raising a false conflict
176
+ insert into mbf values (3, 'Carol');
177
+ select id, b from mbf order by id;
178
+ → [{"id":1,"b":"Bob"},{"id":3,"b":"Carol"}]
179
+
180
+ -- 11b. Reverse creation order: NOCASE FIRST, then BINARY. Same enforcement — the
181
+ -- NOCASE UNIQUE rejects the case-variant regardless of index order.
182
+ create table mnf (id integer primary key, b text collate NOCASE);
183
+ create unique index mnf_nocase on mnf (b collate NOCASE);
184
+ create unique index mnf_binary on mnf (b collate BINARY);
185
+ insert into mnf values (1, 'Bob');
186
+
187
+ insert into mnf values (2, 'bob');
188
+ -- error: UNIQUE constraint failed
189
+
190
+ select count(*) as n from mnf;
191
+ → [{"n":1}]
192
+
193
+ insert into mnf values (3, 'Carol');
194
+ select id, b from mnf order by id;
195
+ → [{"id":1,"b":"Bob"},{"id":3,"b":"Carol"}]
196
+
197
+ -- ===================================
198
+ -- 12. A NON-derived (table-level / column) UNIQUE coexisting with a FINER
199
+ -- same-column-set `create unique index`. The non-derived UNIQUE enforces under
200
+ -- its DECLARED column collation (NOCASE) regardless of DDL order — the memory
201
+ -- module no longer reuses or resolves onto the finer (BINARY) user index, which
202
+ -- would silently ADMIT a NOCASE duplicate. The user's BINARY index keeps
203
+ -- enforcing its OWN (byte-exact) uniqueness, and dropping the non-derived
204
+ -- constraint leaves that index intact. On main the index-first order under-enforced
205
+ -- (count went to 2); store already rejected both orders.
206
+ -- (memory-nonderived-unique-reused-finer-index-under-enforcement.)
207
+ -- ===================================
208
+
209
+ -- 12a. INDEX created FIRST, then `alter table … add constraint uq unique (b)` over a
210
+ -- NOCASE column. The NOCASE UNIQUE rejects a case-variant duplicate that the
211
+ -- finer BINARY index alone would have admitted — the bug this fix closes.
212
+ create table mif (id integer primary key, b text collate NOCASE);
213
+ create unique index mif_binary on mif (b collate BINARY);
214
+ alter table mif add constraint uq unique (b);
215
+ insert into mif values (1, 'Bob');
216
+
217
+ -- 'bob' is BINARY-distinct from 'Bob' but NOCASE-equal → the non-derived NOCASE UNIQUE rejects it
218
+ insert into mif values (2, 'bob');
219
+ -- error: UNIQUE constraint failed
220
+
221
+ select count(*) as n from mif;
222
+ → [{"n":1}]
223
+
224
+ -- a genuinely distinct value (neither NOCASE- nor BINARY-equal) still inserts (guard against over-matching)
225
+ insert into mif values (3, 'Carol');
226
+ select id, b from mif order by id;
227
+ → [{"id":1,"b":"Bob"},{"id":3,"b":"Carol"}]
228
+
229
+ -- 12b. CONSTRAINT created FIRST (table-level `unique (b)`), THEN the finer index —
230
+ -- order-independence. Same NOCASE enforcement.
231
+ create table mcf (id integer primary key, b text collate NOCASE, unique (b));
232
+ create unique index mcf_binary on mcf (b collate BINARY);
233
+ insert into mcf values (1, 'Bob');
234
+
235
+ insert into mcf values (2, 'bob');
236
+ -- error: UNIQUE constraint failed
237
+
238
+ select count(*) as n from mcf;
239
+ → [{"n":1}]
240
+
241
+ insert into mcf values (3, 'Carol');
242
+ select id, b from mcf order by id;
243
+ → [{"id":1,"b":"Bob"},{"id":3,"b":"Carol"}]
244
+
245
+ -- 12c. Lifecycle: dropping the non-derived NOCASE UNIQUE leaves the user's BINARY
246
+ -- index (`mif_binary`) enforcing its own uniqueness. A NOCASE-variant is now
247
+ -- ADMITTED (only BINARY enforces, keeping case-variants apart) while a genuine
248
+ -- byte-exact duplicate is still rejected — proof the user index survived the drop.
249
+ alter table mif drop constraint uq;
250
+
251
+ -- NOCASE folding gone: 'BOB' is BINARY-distinct from existing 'Bob'/'Carol' → admitted
252
+ insert into mif values (4, 'BOB');
253
+ select id, b from mif order by id;
254
+ → [{"id":1,"b":"Bob"},{"id":3,"b":"Carol"},{"id":4,"b":"BOB"}]
255
+
256
+ -- but a byte-exact duplicate of 'Bob' is still rejected by the surviving BINARY index
257
+ insert into mif values (5, 'Bob');
258
+ -- error: UNIQUE constraint failed
259
+
260
+ select count(*) as n from mif;
261
+ → [{"n":3}]
262
+
263
+ -- ===================================
264
+ -- 13. Conflict resolution (OR REPLACE / OR IGNORE) with the TWO coexisting unique
265
+ -- structures the §12 fix produces: a NOCASE non-derived UNIQUE (`uq`) and a
266
+ -- FINER BINARY user index (`ixb`). The two enforce DIFFERENT equivalences, so a
267
+ -- conflict on one must not be a false conflict on the other, and OR REPLACE must
268
+ -- evict exactly the row the conflicting structure identifies. Runs under memory
269
+ -- AND store (cross-module conformance with SQLite).
270
+ -- (memory-nonderived-unique-reused-finer-index-under-enforcement, review.)
271
+ -- ===================================
272
+
273
+ create table p (id integer primary key, b text collate nocase);
274
+ create unique index ixb on p (b collate binary);
275
+ alter table p add constraint uq unique (b);
276
+ insert into p values (1, 'Bob');
277
+
278
+ -- OR REPLACE on 'bob': NOCASE-dup of 'Bob' but BINARY-distinct → the NOCASE UNIQUE
279
+ -- drives the conflict and evicts id=1; the BINARY index raises no false conflict.
280
+ insert or replace into p values (2, 'bob');
281
+ select id, b from p order by id;
282
+ → [{"id":2,"b":"bob"}]
283
+
284
+ -- OR IGNORE on 'BOB': NOCASE-dup of the surviving 'bob' → ignored, table unchanged.
285
+ insert or ignore into p values (3, 'BOB');
286
+ select id, b from p order by id;
287
+ → [{"id":2,"b":"bob"}]
288
+
289
+ -- OR REPLACE byte-exact dup of 'bob' → BOTH structures conflict on the SAME row id=2;
290
+ -- it is evicted once and the new row inserted (no double-evict error).
291
+ insert or replace into p values (4, 'bob');
292
+ select id, b from p order by id;
293
+ → [{"id":4,"b":"bob"}]
294
+
295
+ -- OR REPLACE where the NOCASE structure conflicts on one row while a DIFFERENT row
296
+ -- stays clear of both: 'Cat' NOCASE-matches 'cat' (id=1); 'DOG' is BINARY- and
297
+ -- NOCASE-distinct → only id=1 is evicted, id=2 survives.
298
+ create table q (id integer primary key, b text collate nocase);
299
+ create unique index qixb on q (b collate binary);
300
+ alter table q add constraint uq2 unique (b);
301
+ insert into q values (1, 'cat');
302
+ insert into q values (2, 'DOG');
303
+ insert or replace into q values (3, 'Cat');
304
+ select id, b from q order by id;
305
+ → [{"id":2,"b":"DOG"},{"id":3,"b":"Cat"}]
@@ -0,0 +1,108 @@
1
+ -- database-options-edge-cases.sqllogic - Pragma edge cases and option handling
2
+
3
+ -- ===================================
4
+ -- PRAGMA default_vtab_module
5
+ -- ===================================
6
+
7
+ -- Default should be 'memory'
8
+ PRAGMA default_vtab_module;
9
+ → [{"name": "default_vtab_module", "value": "memory"}]
10
+
11
+ -- Set to 'memory' explicitly (same value, should be no-op)
12
+ PRAGMA default_vtab_module = 'memory';
13
+ -- run
14
+
15
+ PRAGMA default_vtab_module;
16
+ → [{"name": "default_vtab_module", "value": "memory"}]
17
+
18
+ -- ===================================
19
+ -- PRAGMA schema_path basics
20
+ -- ===================================
21
+
22
+ -- Default should be 'main'
23
+ PRAGMA schema_path;
24
+ → [{"name": "schema_path", "value": "main"}]
25
+
26
+ -- Set and read back
27
+ PRAGMA schema_path = 'main,temp';
28
+
29
+ PRAGMA schema_path;
30
+ → [{"name": "schema_path", "value": "main,temp"}]
31
+
32
+ -- Reset
33
+ PRAGMA schema_path = 'main';
34
+ -- run
35
+
36
+ -- ===================================
37
+ -- Invalid pragma names
38
+ -- ===================================
39
+
40
+ PRAGMA nonexistent_pragma;
41
+ -- error: Unknown pragma
42
+
43
+ PRAGMA nonexistent_pragma = 'value';
44
+ -- error: Unknown pragma
45
+
46
+ -- ===================================
47
+ -- Boolean pragma values (various forms)
48
+ -- ===================================
49
+
50
+ -- Create a table to use for testing
51
+ CREATE TABLE pragma_test (id INTEGER PRIMARY KEY, val TEXT);
52
+
53
+ -- Test boolean conversion forms via PRAGMA (using known boolean pragmas)
54
+ -- The exact boolean pragmas depend on what's registered, but we can test
55
+ -- that the system handles queries correctly after pragma changes
56
+
57
+ INSERT INTO pragma_test VALUES (1, 'test');
58
+
59
+ SELECT * FROM pragma_test;
60
+ → [{"id": 1, "val": "test"}]
61
+
62
+ DROP TABLE pragma_test;
63
+
64
+ -- ===================================
65
+ -- Multiple pragmas in sequence
66
+ -- ===================================
67
+
68
+ PRAGMA schema_path = 'main';
69
+ PRAGMA default_vtab_module = 'memory';
70
+ -- run
71
+
72
+ PRAGMA schema_path;
73
+ → [{"name": "schema_path", "value": "main"}]
74
+
75
+ PRAGMA default_vtab_module;
76
+ → [{"name": "default_vtab_module", "value": "memory"}]
77
+
78
+ -- ===================================
79
+ -- table_info on various table shapes
80
+ -- ===================================
81
+
82
+ -- Simple table
83
+ CREATE TABLE pi_simple (id INTEGER PRIMARY KEY, name TEXT);
84
+
85
+ SELECT name, type, pk FROM table_info('pi_simple') ORDER BY cid;
86
+ → [{"name": "id", "type": "INTEGER", "pk": 1}, {"name": "name", "type": "TEXT", "pk": 0}]
87
+
88
+ DROP TABLE pi_simple;
89
+
90
+ -- Table with many column types
91
+ CREATE TABLE pi_types (
92
+ a INTEGER PRIMARY KEY,
93
+ b TEXT NOT NULL,
94
+ c REAL,
95
+ d BLOB
96
+ );
97
+
98
+ SELECT name, type, pk FROM table_info('pi_types') ORDER BY cid;
99
+ → [{"name": "a", "type": "INTEGER", "pk": 1}, {"name": "b", "type": "TEXT", "pk": 0}, {"name": "c", "type": "REAL", "pk": 0}, {"name": "d", "type": "BLOB", "pk": 0}]
100
+
101
+ DROP TABLE pi_types;
102
+
103
+ -- ===================================
104
+ -- table_info on non-existent table should error
105
+ -- ===================================
106
+
107
+ SELECT * FROM table_info('does_not_exist');
108
+ -- error: not found
@@ -0,0 +1,126 @@
1
+ -- pragma-boolean-values.sqllogic - PRAGMA boolean value bareword parsing
2
+ --
3
+ -- Regression coverage for the `on`/`off` bareword spellings of a boolean
4
+ -- pragma value. `on` lexes as the JOIN keyword (TokenType.ON), while `off`
5
+ -- is not a reserved word at all -- so `pragma foreign_keys = off` always
6
+ -- parsed fine, but `pragma foreign_keys = on` used to throw a misleading
7
+ -- "'ON' must follow a JOIN" parse error. The fix accepts any
8
+ -- CONTEXTUAL_KEYWORDS-listed bareword (not just `on`) as a name/value item.
9
+
10
+ -- Default is true
11
+ PRAGMA foreign_keys;
12
+ → [{"name": "foreign_keys", "value": true}]
13
+
14
+ -- ===================================
15
+ -- off (never broken; regression guard)
16
+ -- ===================================
17
+
18
+ PRAGMA foreign_keys = off;
19
+ -- run
20
+
21
+ PRAGMA foreign_keys;
22
+ → [{"name": "foreign_keys", "value": false}]
23
+
24
+ -- ===================================
25
+ -- on (the bug: used to throw a JOIN parse error)
26
+ -- ===================================
27
+
28
+ PRAGMA foreign_keys = on;
29
+ -- run
30
+
31
+ PRAGMA foreign_keys;
32
+ → [{"name": "foreign_keys", "value": true}]
33
+
34
+ -- ===================================
35
+ -- Case-insensitivity
36
+ -- ===================================
37
+
38
+ PRAGMA foreign_keys = OFF;
39
+ -- run
40
+
41
+ PRAGMA foreign_keys;
42
+ → [{"name": "foreign_keys", "value": false}]
43
+
44
+ PRAGMA foreign_keys = On;
45
+ -- run
46
+
47
+ PRAGMA foreign_keys;
48
+ → [{"name": "foreign_keys", "value": true}]
49
+
50
+ -- ===================================
51
+ -- Quoted string forms
52
+ -- ===================================
53
+
54
+ PRAGMA foreign_keys = 'off';
55
+ -- run
56
+
57
+ PRAGMA foreign_keys;
58
+ → [{"name": "foreign_keys", "value": false}]
59
+
60
+ PRAGMA foreign_keys = 'on';
61
+ -- run
62
+
63
+ PRAGMA foreign_keys;
64
+ → [{"name": "foreign_keys", "value": true}]
65
+
66
+ -- ===================================
67
+ -- Numeric and TRUE/FALSE forms (regression guard)
68
+ -- ===================================
69
+
70
+ PRAGMA foreign_keys = 0;
71
+ -- run
72
+
73
+ PRAGMA foreign_keys;
74
+ → [{"name": "foreign_keys", "value": false}]
75
+
76
+ PRAGMA foreign_keys = 1;
77
+ -- run
78
+
79
+ PRAGMA foreign_keys;
80
+ → [{"name": "foreign_keys", "value": true}]
81
+
82
+ PRAGMA foreign_keys = false;
83
+ -- run
84
+
85
+ PRAGMA foreign_keys;
86
+ → [{"name": "foreign_keys", "value": false}]
87
+
88
+ PRAGMA foreign_keys = true;
89
+ -- run
90
+
91
+ PRAGMA foreign_keys;
92
+ → [{"name": "foreign_keys", "value": true}]
93
+
94
+ -- ===================================
95
+ -- Another boolean pragma on the same grammar path
96
+ -- ===================================
97
+
98
+ PRAGMA runtime_fuse_scalars = off;
99
+ -- run
100
+
101
+ PRAGMA runtime_fuse_scalars;
102
+ → [{"name": "runtime_fuse_scalars", "value": false}]
103
+
104
+ PRAGMA runtime_fuse_scalars = on;
105
+ -- run
106
+
107
+ PRAGMA runtime_fuse_scalars;
108
+ → [{"name": "runtime_fuse_scalars", "value": true}]
109
+
110
+ -- ===================================
111
+ -- Generality: any CONTEXTUAL_KEYWORDS bareword is a value, not just `on`.
112
+ -- A string-typed pragma stores it verbatim (no boolean conversion involved).
113
+ -- ===================================
114
+
115
+ PRAGMA schema_path = key;
116
+ -- run
117
+
118
+ PRAGMA schema_path;
119
+ → [{"name": "schema_path", "value": "key"}]
120
+
121
+ -- Reset
122
+ PRAGMA schema_path = 'main';
123
+ -- run
124
+
125
+ PRAGMA schema_path;
126
+ → [{"name": "schema_path", "value": "main"}]