@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,325 @@
1
+ -- 99-conversion-edge-cases.sqllogic
2
+ -- Targeted coverage for uncovered branches in conversion.ts, json-type.ts,
3
+ -- logical-type.ts, and schema.ts:
4
+ -- Type conversion error paths, json() function, schema introspection functions
5
+
6
+ -- ============================================================
7
+ -- integer() conversion edge cases
8
+ -- ============================================================
9
+
10
+ -- Null returns null
11
+ SELECT integer(null) as result;
12
+ → [{"result":null}]
13
+
14
+ -- Integer from integer (identity)
15
+ SELECT integer(42) as result;
16
+ → [{"result":42}]
17
+
18
+ -- Integer from float (truncates/rounds)
19
+ SELECT integer(3.7) as result;
20
+ → [{"result":3}]
21
+
22
+ -- Integer from negative float
23
+ SELECT integer(-2.9) as result;
24
+ → [{"result":-2}]
25
+
26
+ -- Integer from string
27
+ SELECT integer('123') as result;
28
+ → [{"result":123}]
29
+
30
+ -- Integer from negative string
31
+ SELECT integer('-456') as result;
32
+ → [{"result":-456}]
33
+
34
+ -- Integer from boolean
35
+ SELECT integer(true) as result;
36
+ → [{"result":1}]
37
+
38
+ SELECT integer(false) as result;
39
+ → [{"result":0}]
40
+
41
+ -- Integer from zero
42
+ SELECT integer(0) as result;
43
+ → [{"result":0}]
44
+
45
+ -- Integer from empty string returns null (not error)
46
+ SELECT integer('') as result;
47
+ → [{"result":null}]
48
+
49
+ -- Integer from non-numeric string errors
50
+ SELECT integer('hello');
51
+ -- error: Cannot convert to INTEGER
52
+
53
+ -- ============================================================
54
+ -- real() conversion edge cases
55
+ -- ============================================================
56
+
57
+ -- Null
58
+ SELECT real(null) as result;
59
+ → [{"result":null}]
60
+
61
+ -- Real from integer
62
+ SELECT real(42) as result;
63
+ → [{"result":42}]
64
+
65
+ -- Real from float (identity)
66
+ SELECT real(3.14) as result;
67
+ → [{"result":3.14}]
68
+
69
+ -- Real from string
70
+ SELECT real('2.718') as result;
71
+ → [{"result":2.718}]
72
+
73
+ -- Real from boolean
74
+ SELECT real(true) as result;
75
+ → [{"result":1}]
76
+
77
+ SELECT real(false) as result;
78
+ → [{"result":0}]
79
+
80
+ -- Real from empty string returns null
81
+ SELECT real('') as result;
82
+ → [{"result":null}]
83
+
84
+ -- Real from non-numeric string errors
85
+ SELECT real('hello');
86
+ -- error: Cannot convert to REAL
87
+
88
+ -- ============================================================
89
+ -- text() conversion edge cases
90
+ -- ============================================================
91
+
92
+ -- Null
93
+ SELECT text(null) as result;
94
+ → [{"result":null}]
95
+
96
+ -- Text from integer
97
+ SELECT text(42) as result;
98
+ → [{"result":"42"}]
99
+
100
+ -- Text from float
101
+ SELECT text(3.14) as result;
102
+ → [{"result":"3.14"}]
103
+
104
+ -- Text from boolean
105
+ SELECT text(true) as result;
106
+ → [{"result":"true"}]
107
+
108
+ SELECT text(false) as result;
109
+ → [{"result":"false"}]
110
+
111
+ -- Text from string (identity)
112
+ SELECT text('hello') as result;
113
+ → [{"result":"hello"}]
114
+
115
+ -- Text from empty string
116
+ SELECT text('') as result;
117
+ → [{"result":""}]
118
+
119
+ -- ============================================================
120
+ -- boolean() conversion edge cases
121
+ -- ============================================================
122
+
123
+ -- Null
124
+ SELECT boolean(null) as result;
125
+ → [{"result":null}]
126
+
127
+ -- Boolean from boolean (identity)
128
+ SELECT boolean(true) as result;
129
+ → [{"result":true}]
130
+
131
+ SELECT boolean(false) as result;
132
+ → [{"result":false}]
133
+
134
+ -- Boolean from integer
135
+ SELECT boolean(1) as result;
136
+ → [{"result":true}]
137
+
138
+ SELECT boolean(0) as result;
139
+ → [{"result":false}]
140
+
141
+ -- Boolean from string
142
+ SELECT boolean('true') as result;
143
+ → [{"result":true}]
144
+
145
+ SELECT boolean('false') as result;
146
+ → [{"result":false}]
147
+
148
+ SELECT boolean('yes') as result;
149
+ → [{"result":true}]
150
+
151
+ SELECT boolean('no') as result;
152
+ → [{"result":false}]
153
+
154
+ SELECT boolean('on') as result;
155
+ → [{"result":true}]
156
+
157
+ SELECT boolean('off') as result;
158
+ → [{"result":false}]
159
+
160
+ -- Boolean from invalid string errors
161
+ SELECT boolean('maybe');
162
+ -- error: Cannot convert to BOOLEAN
163
+
164
+ SELECT boolean('');
165
+ -- error: Cannot convert to BOOLEAN
166
+
167
+ -- ============================================================
168
+ -- json() conversion edge cases
169
+ -- ============================================================
170
+
171
+ -- Null
172
+ SELECT json(null) as result;
173
+ → [{"result":null}]
174
+
175
+ -- JSON from valid JSON string
176
+ SELECT json('{"a":1}') as result;
177
+ → [{"result":{"a":1}}]
178
+
179
+ -- JSON from array string
180
+ SELECT json('[1,2,3]') as result;
181
+ → [{"result":[1,2,3]}]
182
+
183
+ -- JSON from number
184
+ SELECT json(42) as result;
185
+ → [{"result":42}]
186
+
187
+ -- JSON from boolean
188
+ SELECT json(true) as result;
189
+ → [{"result":true}]
190
+
191
+ -- JSON from 'null' string
192
+ SELECT json('null') as result;
193
+ → [{"result":null}]
194
+
195
+ -- JSON from invalid string errors
196
+ SELECT json('not-valid-json');
197
+ -- error: Cannot convert to JSON
198
+
199
+ -- ============================================================
200
+ -- timespan() conversion error path
201
+ -- ============================================================
202
+
203
+ -- Valid conversion
204
+ SELECT timespan('PT1H') as result;
205
+ → [{"result":"PT1H"}]
206
+
207
+ -- Null
208
+ SELECT timespan(null) as result;
209
+ → [{"result":null}]
210
+
211
+ -- Invalid string errors
212
+ SELECT timespan('invalid');
213
+ -- error: Cannot convert to TIMESPAN
214
+
215
+ -- ============================================================
216
+ -- Schema introspection: schema() function
217
+ -- ============================================================
218
+
219
+ CREATE TABLE schema_test (id INTEGER PRIMARY KEY, name TEXT, score REAL);
220
+ -- run
221
+
222
+ -- schema() returns rows with schema info
223
+ SELECT type, name FROM schema() WHERE name = 'schema_test';
224
+ → [{"type":"table","name":"schema_test"}]
225
+
226
+ -- table_info() returns column information
227
+ SELECT name, type, pk FROM table_info('schema_test') ORDER BY cid;
228
+ → [{"name":"id","type":"INTEGER","pk":1},{"name":"name","type":"TEXT","pk":0},{"name":"score","type":"REAL","pk":0}]
229
+
230
+ -- table_info with non-existent table
231
+ SELECT name FROM table_info('nonexistent_table');
232
+ -- error: not found
233
+
234
+ DROP TABLE schema_test;
235
+
236
+ -- ============================================================
237
+ -- function_info() introspection
238
+ -- ============================================================
239
+
240
+ -- function_info() returns functions (check a known function)
241
+ SELECT name, type FROM function_info('json_valid');
242
+ → [{"name":"json_valid","type":"scalar"}]
243
+
244
+ -- function_info with filter
245
+ SELECT name, type FROM function_info('json_extract');
246
+ → [{"name":"json_extract","type":"scalar"}]
247
+
248
+ -- function_info without filter returns many rows (just check it works)
249
+ SELECT count(*) > 0 as has_functions FROM function_info();
250
+ → [{"has_functions":true}]
251
+
252
+ -- schema() listing an index row alongside its table lives in
253
+ -- 99.0.1-schema-index-listing (it needs standalone CREATE INDEX).
254
+
255
+ -- ============================================================
256
+ -- Schema: foreign keys
257
+ -- ============================================================
258
+
259
+ CREATE TABLE fk_parent (id INTEGER PRIMARY KEY, name TEXT);
260
+ CREATE TABLE fk_child (id INTEGER PRIMARY KEY, parent_id INTEGER REFERENCES fk_parent(id));
261
+ -- run
262
+
263
+ -- foreign_key_info returns FK relationships
264
+ SELECT "from", referenced_table, "to" FROM foreign_key_info('fk_child');
265
+ → [{"from":"parent_id","referenced_table":"fk_parent","to":"id"}]
266
+
267
+ -- foreign_key_info on table without FKs returns nothing
268
+ SELECT count(*) as cnt FROM foreign_key_info('fk_parent');
269
+ → [{"cnt":0}]
270
+
271
+ -- foreign_key_info on non-existent table errors
272
+ SELECT "from" FROM foreign_key_info('nonexistent');
273
+ -- error: not found
274
+
275
+ -- Non-string table name errors
276
+ SELECT "from" FROM foreign_key_info(42);
277
+ -- error: requires a table name string
278
+
279
+ DROP TABLE fk_child;
280
+ DROP TABLE fk_parent;
281
+
282
+ -- ============================================================
283
+ -- typeof: all types
284
+ -- ============================================================
285
+
286
+ SELECT typeof(null) as result;
287
+ → [{"result":"null"}]
288
+
289
+ SELECT typeof(42) as result;
290
+ → [{"result":"integer"}]
291
+
292
+ SELECT typeof(3.14) as result;
293
+ → [{"result":"real"}]
294
+
295
+ SELECT typeof('hello') as result;
296
+ → [{"result":"text"}]
297
+
298
+ SELECT typeof(true) as result;
299
+ → [{"result":"integer"}]
300
+
301
+ SELECT typeof(json_array(1,2)) as result;
302
+ → [{"result":"json"}]
303
+
304
+ -- ============================================================
305
+ -- Cross-type conversion chains
306
+ -- ============================================================
307
+
308
+ -- integer -> text -> integer roundtrip
309
+ SELECT integer(text(42)) as result;
310
+ → [{"result":42}]
311
+
312
+ -- real -> text -> real roundtrip
313
+ SELECT real(text(3.14)) as result;
314
+ → [{"result":3.14}]
315
+
316
+ -- boolean -> integer -> boolean roundtrip
317
+ SELECT boolean(integer(true)) as result;
318
+ → [{"result":true}]
319
+
320
+ SELECT boolean(integer(false)) as result;
321
+ → [{"result":false}]
322
+
323
+ -- json -> text -> json roundtrip (via json_extract)
324
+ SELECT json('{"a":1}') as result;
325
+ → [{"result":{"a":1}}]
@@ -0,0 +1,21 @@
1
+ -- 99.0.1-schema-index-listing.sqllogic
2
+ --
3
+ -- requires-capability: standalone-index-ddl
4
+ --
5
+ -- Carved out of 99-conversion-edge-cases: that file is type-conversion edge cases
6
+ -- plus introspection-function checks, and this was its only index DDL — a table
7
+ -- plus one `create index` existing solely so schema() has an index row to list.
8
+ -- On its own here, the conversion coverage stays runnable on backends without
9
+ -- first-class CREATE INDEX.
10
+ --
11
+ -- Subject: schema() lists an index row alongside the table row that owns it.
12
+
13
+ CREATE TABLE idx_test (id INTEGER PRIMARY KEY, name TEXT, score REAL);
14
+ CREATE INDEX idx_name ON idx_test (name);
15
+ -- run
16
+
17
+ -- Should show both table and index in schema
18
+ SELECT type, name FROM schema() WHERE name = 'idx_test' OR name = 'idx_name' ORDER BY type;
19
+ → [{"type":"index","name":"idx_name"},{"type":"table","name":"idx_test"}]
20
+
21
+ DROP TABLE idx_test;
@@ -0,0 +1,167 @@
1
+ -- adapted from SQLite test/cast.test, numcast.test, types2.test
2
+ -- Edge cases for CAST and conversion functions: BLOB roundtrips, scientific notation,
3
+ -- whitespace handling, IEEE 754 INF/NaN.
4
+
5
+ -- =============================================================================
6
+ -- BLOB roundtrips via CAST
7
+ -- =============================================================================
8
+
9
+ -- CAST text to BLOB preserves bytes
10
+ select cast('hello' as blob) = x'68656c6c6f' as r;
11
+ → [{"r":true}]
12
+
13
+ -- BLOB equality after CAST
14
+ select cast(x'0102' as blob) = x'0102' as r;
15
+ → [{"r":true}]
16
+
17
+ -- -----------------------------------------------------------------------------
18
+ -- Text-to-binary is literal UTF-8 -- no hex sniffing
19
+ -- -----------------------------------------------------------------------------
20
+
21
+ -- The round trip this behavior exists for: text(blob) then blob(text) is
22
+ -- lossless for UTF-8-clean bytes.
23
+ select cast(cast(x'6162' as text) as blob) = x'6162' as r;
24
+ → [{"r":true}]
25
+
26
+ -- Round-trip is NOT total: a blob that is not valid UTF-8 renders as U+FFFD
27
+ -- on the way to text, so it comes back as the UTF-8 bytes of the replacement
28
+ -- character, not the original byte.
29
+ select cast(cast(x'ff' as text) as blob) = x'efbfbd' as r;
30
+ → [{"r":true}]
31
+
32
+ -- A string that looks like hex digits is no longer sniffed as hex -- it
33
+ -- becomes its own UTF-8 bytes, four of them, not the two bytes 0x61 0x62.
34
+ select cast('6162' as blob) = x'36313632' as r;
35
+ → [{"r":true}]
36
+
37
+ -- =============================================================================
38
+ -- Scientific notation in conversions
39
+ -- =============================================================================
40
+
41
+ -- CAST string with positive exponent
42
+ select cast('1.23e+2' as real) as r;
43
+ → [{"r":123}]
44
+
45
+ -- CAST string with negative exponent
46
+ select cast('5e-1' as real) as r;
47
+ → [{"r":0.5}]
48
+
49
+ -- =============================================================================
50
+ -- Whitespace handling in conversions
51
+ -- =============================================================================
52
+
53
+ -- Leading whitespace
54
+ select cast(' 42' as integer) as r;
55
+ → [{"r":42}]
56
+
57
+ select cast(' 3.14' as real) as r;
58
+ → [{"r":3.14}]
59
+
60
+ -- Trailing whitespace
61
+ select cast('42 ' as integer) as r;
62
+ → [{"r":42}]
63
+
64
+ -- =============================================================================
65
+ -- BOOLEAN <-> numeric edge cases
66
+ -- =============================================================================
67
+
68
+ -- BOOLEAN-typed literal coerced to integer
69
+ select cast(true as integer) + cast(false as integer) as r;
70
+ → [{"r":1}]
71
+
72
+ -- Negative integer to boolean: nonzero is true
73
+ select cast(-1 as boolean) as r;
74
+ → [{"r":true}]
75
+
76
+ -- Float to boolean
77
+ select cast(0.5 as boolean) as r;
78
+ → [{"r":true}]
79
+
80
+ select cast(0.0 as boolean) as r;
81
+ → [{"r":false}]
82
+
83
+ -- =============================================================================
84
+ -- A failed CAST yields NULL, never the unconverted operand
85
+ -- =============================================================================
86
+ -- The numeric/text/blob targets keep SQLite's lenient fallbacks (0, '', bytes).
87
+ -- Every other target has no such fallback, so a value it cannot convert simply
88
+ -- has no result: the cast is NULL rather than a value outside the target type.
89
+
90
+ select cast('junk' as date) as r;
91
+ → [{"r":null}]
92
+
93
+ select cast('junk' as time) as r;
94
+ → [{"r":null}]
95
+
96
+ select cast('junk' as datetime) as r;
97
+ → [{"r":null}]
98
+
99
+ select cast('junk' as timespan) as r;
100
+ → [{"r":null}]
101
+
102
+ select cast('junk' as boolean) as r;
103
+ → [{"r":null}]
104
+
105
+ -- A blob is not a JSON value under any reading, so the cast has no result.
106
+ select cast(x'0102' as json) as r;
107
+ → [{"r":null}]
108
+
109
+ -- But a bare string IS a valid JSON string scalar even though it is not valid
110
+ -- JSON *source text*, so JSON's own validate keeps it.
111
+ select cast('abc' as json) as r;
112
+ → [{"r":"abc"}]
113
+
114
+ -- Successful casts are unaffected.
115
+ select cast('2024-03-05' as date) as r;
116
+ → [{"r":"2024-03-05"}]
117
+
118
+ select cast('true' as boolean) as r;
119
+ → [{"r":true}]
120
+
121
+ -- A blob is not a date under any reading either.
122
+ select cast(x'0102' as date) as r;
123
+ → [{"r":null}]
124
+
125
+ -- Numeric/text/blob fallbacks still apply and still produce their own type.
126
+ select cast('junk' as integer) as r;
127
+ → [{"r":0}]
128
+
129
+ select cast('junk' as real) as r;
130
+ → [{"r":0}]
131
+
132
+ -- Every fallback arm yields a value that inhabits the type the cast advertises.
133
+ -- typeof() reports the storage class, so REAL's 0.0 reads as 'integer'.
134
+ select typeof(cast('junk' as integer)) as i, typeof(cast('junk' as real)) as r,
135
+ typeof(cast('junk' as numeric)) as n, typeof(cast(x'0102' as text)) as t,
136
+ typeof(cast('junk' as blob)) as b;
137
+ → [{"i":"integer","r":"integer","n":"integer","t":"text","b":"blob"}]
138
+
139
+ -- -----------------------------------------------------------------------------
140
+ -- Write path: the NULL reaches storage as a NULL, not as garbage
141
+ -- -----------------------------------------------------------------------------
142
+
143
+ create table cast_dt (id integer primary key, dt date null);
144
+
145
+ insert into cast_dt values (1, cast('junk' as date));
146
+ select id, dt, typeof(dt) as ty from cast_dt where id = 1;
147
+ → [{"id":1,"dt":null,"ty":"null"}]
148
+
149
+ -- A successful cast round-trips through storage unchanged.
150
+ insert into cast_dt values (2, cast('2024-03-05' as date));
151
+ select id, dt, typeof(dt) as ty from cast_dt where id = 2;
152
+ → [{"id":2,"dt":"2024-03-05","ty":"text"}]
153
+
154
+ -- The stored date still orders as a date, not as the raw operand would have.
155
+ select id from cast_dt where dt > '2000-01-01' order by id;
156
+ → [{"id":2}]
157
+
158
+ drop table cast_dt;
159
+
160
+ -- Columns are NOT NULL by default, so the same insert is rejected outright
161
+ -- instead of storing a value the column's type does not admit.
162
+ create table cast_dt_nn (id integer primary key, dt date not null);
163
+
164
+ insert into cast_dt_nn values (1, cast('junk' as date));
165
+ -- error: NOT NULL constraint failed
166
+
167
+ drop table cast_dt_nn;
@@ -0,0 +1,88 @@
1
+ -- DROP INDEX on a UNIQUE index must also remove the synthesized
2
+ -- UniqueConstraintSchema (tagged with derivedFromIndex). Without that, the
3
+ -- mutation manager keeps enforcing the unique check after the index is gone.
4
+ --
5
+ -- requires-capability: standalone-index-ddl
6
+
7
+ -- =====================================================
8
+ -- 1. Happy path: DROP UNIQUE INDEX clears the uniqueness check
9
+ -- =====================================================
10
+ create table dui_basic (a integer, b integer);
11
+ create unique index ix_dui_basic_a on dui_basic(a);
12
+
13
+ insert into dui_basic values (1, 10);
14
+
15
+ -- Duplicate fails while index exists
16
+ insert into dui_basic values (1, 20);
17
+ -- error: UNIQUE constraint failed
18
+
19
+ select a, b from dui_basic order by a, b;
20
+ → [{"a":1,"b":10}]
21
+
22
+ drop index ix_dui_basic_a;
23
+
24
+ -- After drop, the duplicate is allowed (no stale uniqueConstraint enforcement)
25
+ insert into dui_basic values (1, 20);
26
+
27
+ select a, b from dui_basic order by a, b;
28
+ → [{"a":1,"b":10},{"a":1,"b":20}]
29
+
30
+ drop table dui_basic;
31
+
32
+ -- =====================================================
33
+ -- 2. Coincident-name preservation: dropping a UNIQUE index does NOT
34
+ -- remove a CREATE-TABLE-time UNIQUE constraint on a different column,
35
+ -- even when their names sit in adjacent namespaces.
36
+ -- =====================================================
37
+ create table dui_coincident (a integer, b integer, constraint u unique(b));
38
+ create unique index u_idx on dui_coincident(a);
39
+
40
+ insert into dui_coincident values (1, 2);
41
+
42
+ -- Pre-drop: both constraints enforced
43
+ insert into dui_coincident values (1, 3);
44
+ -- error: UNIQUE constraint failed
45
+
46
+ insert into dui_coincident values (4, 2);
47
+ -- error: UNIQUE constraint failed
48
+
49
+ drop index u_idx;
50
+
51
+ -- After dropping the index, UNIQUE(a) is gone but the declared UNIQUE(b) survives
52
+ insert into dui_coincident values (1, 5);
53
+
54
+ select a, b from dui_coincident order by a, b;
55
+ → [{"a":1,"b":2},{"a":1,"b":5}]
56
+
57
+ -- Declared UNIQUE(b) still rejects duplicates
58
+ insert into dui_coincident values (9, 2);
59
+ -- error: UNIQUE constraint failed
60
+
61
+ drop table dui_coincident;
62
+
63
+ -- =====================================================
64
+ -- 3. Partial UNIQUE index round-trip: drop must clear the synthesized
65
+ -- partial constraint, including its predicate.
66
+ -- =====================================================
67
+ create table dui_partial (id integer primary key, status text, code text);
68
+ create unique index ix_dui_partial on dui_partial(code) where status = 'active';
69
+
70
+ insert into dui_partial values (1, 'active', 'A');
71
+
72
+ -- Inside scope: duplicate code 'A' is rejected
73
+ insert into dui_partial values (2, 'active', 'A');
74
+ -- error: UNIQUE
75
+
76
+ -- Outside scope: same code allowed
77
+ insert into dui_partial values (3, 'inactive', 'A');
78
+
79
+ drop index ix_dui_partial;
80
+
81
+ -- After drop, the partial unique constraint is gone — duplicate 'A' inside
82
+ -- the (formerly) active scope is allowed.
83
+ insert into dui_partial values (4, 'active', 'A');
84
+
85
+ select id, status, code from dui_partial order by id;
86
+ → [{"id":1,"status":"active","code":"A"},{"id":3,"status":"inactive","code":"A"},{"id":4,"status":"active","code":"A"}]
87
+
88
+ drop table dui_partial;
@@ -0,0 +1,36 @@
1
+ -- Predicate Pushdown Tests
2
+ -- Verify that WHERE clause predicates are pushed down to table access
3
+
4
+ CREATE TABLE users (id INTEGER, name TEXT, age INTEGER);
5
+ INSERT INTO users VALUES (1, 'Alice', 30), (2, 'Bob', 25), (3, 'Carol', 35);
6
+
7
+ -- Test simple equality predicate pushdown
8
+ SELECT id, name FROM users WHERE id = 1;
9
+ → [{"id": 1, "name": "Alice"}]
10
+
11
+ -- Test inequality predicate pushdown
12
+ SELECT age, name FROM users WHERE age > 25;
13
+ → [{"age": 30, "name": "Alice"}, {"age": 35, "name": "Carol"}]
14
+
15
+ -- Test compound predicate (partial pushdown)
16
+ SELECT age, name FROM users WHERE age > 25 AND name LIKE 'A%';
17
+ → [{"age": 30, "name": "Alice"}]
18
+
19
+ DROP TABLE users;
20
+
21
+ -- Regression: pushing a filter below a Project must preserve the projection's
22
+ -- attribute IDs. A computed column was re-assigned a fresh attribute ID on the
23
+ -- rebuild, stranding an outer projection that kept ONLY the computed column
24
+ -- while filtering on a different (pruned) column ("No row context found").
25
+ create table t (id integer primary key, code20 text not null);
26
+ insert into t values (3, 'C1');
27
+ create view v_plain as select id, case code20 when 'A1' then 'A' else 'C' end as code from t;
28
+
29
+ select code from v_plain where id = 3;
30
+ → [{"code":"C"}]
31
+
32
+ select code from (select id, case code20 when 'A1' then 'A' else 'C' end as code from t) where id = 3;
33
+ → [{"code":"C"}]
34
+
35
+ drop view v_plain;
36
+ drop table t;