@quereus/quereus 4.20.1 → 4.20.3

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 (380) hide show
  1. package/README.md +2 -0
  2. package/dist/src/schema/schema-differ.d.ts.map +1 -1
  3. package/dist/src/schema/schema-differ.js +17 -69
  4. package/dist/src/schema/schema-differ.js.map +1 -1
  5. package/package.json +7 -4
  6. package/test/README.md +173 -0
  7. package/test/logic/01-basic.sqllogic +39 -0
  8. package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
  9. package/test/logic/01.2-strings.sqllogic +43 -0
  10. package/test/logic/01.5-insert-select.sqllogic +237 -0
  11. package/test/logic/01.6-update-extras.sqllogic +118 -0
  12. package/test/logic/01.7-update-from.sqllogic +67 -0
  13. package/test/logic/01.8-delete-extras.sqllogic +122 -0
  14. package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
  15. package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
  16. package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
  17. package/test/logic/01.9-query-expr-values.sqllogic +111 -0
  18. package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
  19. package/test/logic/02-filters.sqllogic +54 -0
  20. package/test/logic/02-smoke.sqllogic +62 -0
  21. package/test/logic/02.1-bind-parameters.sqllogic +223 -0
  22. package/test/logic/03-expressions.sqllogic +190 -0
  23. package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
  24. package/test/logic/03.4-defaults.sqllogic +554 -0
  25. package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
  26. package/test/logic/03.5-tvf.sqllogic +61 -0
  27. package/test/logic/03.6-type-system.sqllogic +544 -0
  28. package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
  29. package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
  30. package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
  31. package/test/logic/03.8-not-precedence.sqllogic +255 -0
  32. package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
  33. package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
  34. package/test/logic/04-order-by.sqllogic +38 -0
  35. package/test/logic/04-transactions.sqllogic +239 -0
  36. package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
  37. package/test/logic/05-vtab_memory.sqllogic +50 -0
  38. package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
  39. package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
  40. package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
  41. package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
  42. package/test/logic/06-builtin_functions.sqllogic +149 -0
  43. package/test/logic/06.1-string-functions.sqllogic +92 -0
  44. package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
  45. package/test/logic/06.2-math-functions.sqllogic +82 -0
  46. package/test/logic/06.3-schema.sqllogic +48 -0
  47. package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
  48. package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
  49. package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
  50. package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
  51. package/test/logic/06.3.4-view-info.sqllogic +378 -0
  52. package/test/logic/06.3.5-column-info.sqllogic +347 -0
  53. package/test/logic/06.3.6-schema-views.sqllogic +29 -0
  54. package/test/logic/06.4-schema-search-path.sqllogic +354 -0
  55. package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
  56. package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
  57. package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
  58. package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
  59. package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
  60. package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
  61. package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
  62. package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
  63. package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
  64. package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
  65. package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
  66. package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
  67. package/test/logic/06.7-json-extended.sqllogic +53 -0
  68. package/test/logic/06.8-json-path-operators.sqllogic +99 -0
  69. package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
  70. package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
  71. package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
  72. package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
  73. package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
  74. package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
  75. package/test/logic/07-aggregates.sqllogic +193 -0
  76. package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
  77. package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
  78. package/test/logic/07.3-group-by-extras.sqllogic +602 -0
  79. package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
  80. package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
  81. package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
  82. package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
  83. package/test/logic/07.5-window.sqllogic +1941 -0
  84. package/test/logic/07.5.1-window-named.sqllogic +13 -0
  85. package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
  86. package/test/logic/07.6-subqueries.sqllogic +78 -0
  87. package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
  88. package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
  89. package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
  90. package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
  91. package/test/logic/07.7.1-in-extras.sqllogic +158 -0
  92. package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
  93. package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
  94. package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
  95. package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
  96. package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
  97. package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
  98. package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
  99. package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
  100. package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
  101. package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
  102. package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
  103. package/test/logic/07.9-in-value-list.sqllogic +154 -0
  104. package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
  105. package/test/logic/08-views.sqllogic +64 -0
  106. package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
  107. package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
  108. package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
  109. package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
  110. package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
  111. package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
  112. package/test/logic/09-set_operations.sqllogic +244 -0
  113. package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
  114. package/test/logic/10-distinct_datatypes.sqllogic +127 -0
  115. package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
  116. package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
  117. package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
  118. package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
  119. package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
  120. package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
  121. package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
  122. package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
  123. package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
  124. package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
  125. package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
  126. package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
  127. package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
  128. package/test/logic/10.2-column-features.sqllogic +365 -0
  129. package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
  130. package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
  131. package/test/logic/10.3-function-features.sqllogic +247 -0
  132. package/test/logic/10.4-schema-scale.sqllogic +168 -0
  133. package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
  134. package/test/logic/10.5-indexes.sqllogic +164 -0
  135. package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
  136. package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
  137. package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
  138. package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
  139. package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
  140. package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
  141. package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
  142. package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
  143. package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
  144. package/test/logic/100.1-where-extras.sqllogic +163 -0
  145. package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
  146. package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
  147. package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
  148. package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
  149. package/test/logic/102-unique-constraints.sqllogic +145 -0
  150. package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
  151. package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
  152. package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
  153. package/test/logic/102.2-unique-collation.sqllogic +181 -0
  154. package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
  155. package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
  156. package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
  157. package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
  158. package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
  159. package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
  160. package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
  161. package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
  162. package/test/logic/108-cardinality-estimation.sqllogic +146 -0
  163. package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
  164. package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
  165. package/test/logic/11-joins.sqllogic +86 -0
  166. package/test/logic/11.1-join-using.sqllogic +267 -0
  167. package/test/logic/11.2-comma-join.sqllogic +35 -0
  168. package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
  169. package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
  170. package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
  171. package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
  172. package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
  173. package/test/logic/12-empty-primary-key.sqllogic +124 -0
  174. package/test/logic/12-join_padding_order.sqllogic +58 -0
  175. package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
  176. package/test/logic/13-cte.sqllogic +137 -0
  177. package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
  178. package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
  179. package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
  180. package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
  181. package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
  182. package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
  183. package/test/logic/13.4-cte-extras.sqllogic +98 -0
  184. package/test/logic/13.5-cte-join-order.sqllogic +166 -0
  185. package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
  186. package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
  187. package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
  188. package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
  189. package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
  190. package/test/logic/14-utilities.sqllogic +168 -0
  191. package/test/logic/15-timespan.sqllogic +279 -0
  192. package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
  193. package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
  194. package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
  195. package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
  196. package/test/logic/16-epoch.sqllogic +187 -0
  197. package/test/logic/17-weekday-modifier.sqllogic +78 -0
  198. package/test/logic/18-json-string-escapes.sqllogic +86 -0
  199. package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
  200. package/test/logic/20-empty-single-row.sqllogic +261 -0
  201. package/test/logic/21-null-edge-cases.sqllogic +227 -0
  202. package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
  203. package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
  204. package/test/logic/21.2-between-edges.sqllogic +157 -0
  205. package/test/logic/22-boundary-values.sqllogic +175 -0
  206. package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
  207. package/test/logic/24-builtin-branches.sqllogic +611 -0
  208. package/test/logic/24.1-substr-extras.sqllogic +75 -0
  209. package/test/logic/24.2-random-extras.sqllogic +39 -0
  210. package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
  211. package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
  212. package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
  213. package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
  214. package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
  215. package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
  216. package/test/logic/26-join-edge-cases.sqllogic +333 -0
  217. package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
  218. package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
  219. package/test/logic/26.3-join-on-constants.sqllogic +61 -0
  220. package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
  221. package/test/logic/27-window-edge-cases.sqllogic +206 -0
  222. package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
  223. package/test/logic/27.2-window-exclude.sqllogic +13 -0
  224. package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
  225. package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
  226. package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
  227. package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
  228. package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
  229. package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
  230. package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
  231. package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
  232. package/test/logic/40-constraints.sqllogic +418 -0
  233. package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
  234. package/test/logic/40.2-check-extras.sqllogic +683 -0
  235. package/test/logic/41-alter-table.sqllogic +191 -0
  236. package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
  237. package/test/logic/41-fk-cross-schema.sqllogic +155 -0
  238. package/test/logic/41-fk-extended-targets.sqllogic +173 -0
  239. package/test/logic/41-foreign-keys.sqllogic +1001 -0
  240. package/test/logic/41-generated-column-errors.sqllogic +225 -0
  241. package/test/logic/41-generated-column-extras.sqllogic +598 -0
  242. package/test/logic/41-generated-column-scope.sqllogic +329 -0
  243. package/test/logic/41-generated-columns.sqllogic +361 -0
  244. package/test/logic/41.1-alter-pk.sqllogic +230 -0
  245. package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
  246. package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
  247. package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
  248. package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
  249. package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
  250. package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
  251. package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
  252. package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
  253. package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
  254. package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
  255. package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
  256. package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
  257. package/test/logic/41.2-alter-column.sqllogic +382 -0
  258. package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
  259. package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
  260. package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
  261. package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
  262. package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
  263. package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
  264. package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
  265. package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
  266. package/test/logic/41.5-alter-misc.sqllogic +48 -0
  267. package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
  268. package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
  269. package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
  270. package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
  271. package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
  272. package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
  273. package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
  274. package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
  275. package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
  276. package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
  277. package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
  278. package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
  279. package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
  280. package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
  281. package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
  282. package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
  283. package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
  284. package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
  285. package/test/logic/42-committed-snapshot.sqllogic +254 -0
  286. package/test/logic/42-returning.sqllogic +159 -0
  287. package/test/logic/42.1-returning-extras.sqllogic +232 -0
  288. package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
  289. package/test/logic/43-default-nullability.sqllogic +131 -0
  290. package/test/logic/43-transition-constraints.sqllogic +341 -0
  291. package/test/logic/43.1-default-collation.sqllogic +140 -0
  292. package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
  293. package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
  294. package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
  295. package/test/logic/44-determinism-validation.sqllogic +164 -0
  296. package/test/logic/44-orthogonality.sqllogic +146 -0
  297. package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
  298. package/test/logic/45-udf-determinism.sqllogic +39 -0
  299. package/test/logic/46-mutation-context.sqllogic +595 -0
  300. package/test/logic/47-upsert.sqllogic +255 -0
  301. package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
  302. package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
  303. package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
  304. package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
  305. package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
  306. package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
  307. package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
  308. package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
  309. package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
  310. package/test/logic/49-reference-graph.sqllogic +84 -0
  311. package/test/logic/50-declarative-schema.sqllogic +2550 -0
  312. package/test/logic/50-metadata-tags.sqllogic +1033 -0
  313. package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
  314. package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
  315. package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
  316. package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +210 -0
  317. package/test/logic/50.3-declare-schema-duplicate-names.sqllogic +280 -0
  318. package/test/logic/50.4-declare-schema-apply-restore.sqllogic +192 -0
  319. package/test/logic/51-lens-foundation.sqllogic +147 -0
  320. package/test/logic/51-materialized-views.sqllogic +376 -0
  321. package/test/logic/51.5-materialized-views-coarsened-key.sqllogic +198 -0
  322. package/test/logic/51.7-maintained-table-attach-detach.sqllogic +468 -0
  323. package/test/logic/51.8-maintained-table-declared-constraints.sqllogic +440 -0
  324. package/test/logic/51.85-maintained-table-parent-fk.sqllogic +103 -0
  325. package/test/logic/51.9-maintained-table-secondary-unique.sqllogic +237 -0
  326. package/test/logic/51.9.1-maintained-table-partial-unique.sqllogic +36 -0
  327. package/test/logic/52-lens-overrides.sqllogic +566 -0
  328. package/test/logic/53-materialized-views-rowtime.sqllogic +1601 -0
  329. package/test/logic/53-reserved-tags.sqllogic +252 -0
  330. package/test/logic/53.1-materialized-view-write-through.sqllogic +329 -0
  331. package/test/logic/53.2-materialized-view-rename-propagation.sqllogic +483 -0
  332. package/test/logic/53.3-materialized-view-constraint-only-ddl.sqllogic +409 -0
  333. package/test/logic/53.3.1-materialized-view-index-ddl-irrelevance.sqllogic +29 -0
  334. package/test/logic/53.4-materialized-view-structural-alter-restore.sqllogic +436 -0
  335. package/test/logic/54-covering-mv-enforcement.sqllogic +314 -0
  336. package/test/logic/54.1-covering-mv-partial-enforcement.sqllogic +34 -0
  337. package/test/logic/55-internal-eviction-reporting.sqllogic +89 -0
  338. package/test/logic/55-lens-prover.sqllogic +202 -0
  339. package/test/logic/55.1-eviction-restrict-fk.sqllogic +148 -0
  340. package/test/logic/55.5-lens-authored-inverse.sqllogic +1468 -0
  341. package/test/logic/80-grow-retrieve-pass.sqllogic +79 -0
  342. package/test/logic/81-quickpick.sqllogic +24 -0
  343. package/test/logic/82-bloom-join.sqllogic +185 -0
  344. package/test/logic/83-merge-join.sqllogic +280 -0
  345. package/test/logic/84-asof-scan.sqllogic +238 -0
  346. package/test/logic/84-key-cardinality.sqllogic +50 -0
  347. package/test/logic/85-relational-const-folding.sqllogic +51 -0
  348. package/test/logic/86-scalar-cse.sqllogic +42 -0
  349. package/test/logic/90-error_paths.sqllogic +114 -0
  350. package/test/logic/90.1-parse-errors.sqllogic +77 -0
  351. package/test/logic/90.2-alter-table-errors.sqllogic +53 -0
  352. package/test/logic/90.2.1-alter-extra-errors.sqllogic +51 -0
  353. package/test/logic/90.3-expression-errors.sqllogic +43 -0
  354. package/test/logic/90.4-dml-errors.sqllogic +47 -0
  355. package/test/logic/90.5-unsupported-join-types.sqllogic +37 -0
  356. package/test/logic/90.5.1-right-full-join-read.sqllogic +157 -0
  357. package/test/logic/90.6-select-error-paths.sqllogic +57 -0
  358. package/test/logic/91-merge-join-edge-cases.sqllogic +159 -0
  359. package/test/logic/92-hash-aggregate-edge-cases.sqllogic +139 -0
  360. package/test/logic/93-ddl-view-edge-cases.sqllogic +104 -0
  361. package/test/logic/93.1-view-error-paths.sqllogic +74 -0
  362. package/test/logic/93.2-view-mutation-pending.sqllogic +108 -0
  363. package/test/logic/93.3-view-mutation-or-clause.sqllogic +60 -0
  364. package/test/logic/93.4-view-mutation.sqllogic +4881 -0
  365. package/test/logic/93.4.1-view-mutation-partial-unique-cardinality.sqllogic +31 -0
  366. package/test/logic/93.5-authored-inverse.sqllogic +415 -0
  367. package/test/logic/93.6-set-op-flagless-write.sqllogic +862 -0
  368. package/test/logic/94-tvf-edge-cases.sqllogic +58 -0
  369. package/test/logic/94.1-limit-offset-edge-cases.sqllogic +109 -0
  370. package/test/logic/94.2-limit-offset-extras.sqllogic +98 -0
  371. package/test/logic/95-assertions.sqllogic +1417 -0
  372. package/test/logic/96-subquery-edge-cases.sqllogic +276 -0
  373. package/test/logic/97-json-function-edge-cases.sqllogic +633 -0
  374. package/test/logic/97.1-json-blob-and-special-values.sqllogic +92 -0
  375. package/test/logic/98-temporal-edge-cases.sqllogic +515 -0
  376. package/test/logic/99-conversion-edge-cases.sqllogic +325 -0
  377. package/test/logic/99.0.1-schema-index-listing.sqllogic +21 -0
  378. package/test/logic/99.1-cast-syntax-extras.sqllogic +167 -0
  379. package/test/logic/drop-unique-index.sqllogic +88 -0
  380. package/test/logic/pushdown-test.sqllogic +36 -0
@@ -0,0 +1,61 @@
1
+ -- test/logic/tvf.sqllogic
2
+
3
+ -- Check query plan using the new TVF
4
+ -- After relational constant folding, SELECT 1+1 collapses to Block → TableLiteral
5
+ SELECT op FROM query_plan('SELECT 1 + 1');
6
+ → [{"op":"BLOCK"},{"op":"TABLELITERAL"}]
7
+
8
+ -- Check scheduler program dump TVF (basic execution check)
9
+ -- After relational constant folding, SELECT 1 collapses to Block → TableLiteral
10
+ SELECT description FROM scheduler_program('SELECT 1');
11
+ → [{"description":"tableLiteral(1 rows, 1 cols)"},{"description":"block(1 stmts, result idx: 0)"}]
12
+
13
+ -- json_each: array immediate children only
14
+ SELECT key, value FROM json_each('[10, 20, {"a": 30}]');
15
+ → [{"key":0,"value":10},{"key":1,"value":20},{"key":2,"value":"{\"a\":30}"}]
16
+
17
+ -- json_each: object immediate children only (does NOT recurse into nested containers)
18
+ SELECT key, value, type FROM json_each('{"a":{"b":1},"c":2}');
19
+ → [{"key":"a","value":"{\"b\":1}","type":"object"},{"key":"c","value":2,"type":"integer"}]
20
+
21
+ -- Basic json_tree (just test it runs for now)
22
+ SELECT id, fullkey, type, atom FROM json_tree('{"a": [1, 2], "b": true}');
23
+
24
+ -- TVF with alias and WHERE filter
25
+ SELECT j.key FROM json_each('[5,6]') AS j WHERE j.value > 5;
26
+ → [{"key":1}]
27
+
28
+ -- TVF with alias and qualified SELECT *
29
+ SELECT j.* FROM json_each('[5,6]') AS j WHERE j.value > 5;
30
+ → [{"key":1,"value":6,"type":"integer","atom":6,"id":1,"parent":null,"fullkey":"[1]","path":""}]
31
+
32
+ -- json_each with root path
33
+ SELECT key, value FROM json_each('{"data": [1, 2]}', '$.data');
34
+ → [{"key":0,"value":1},{"key":1,"value":2}]
35
+
36
+ -- TVF with root path (json_tree) (just test it runs for now)
37
+ SELECT fullkey, value FROM json_tree('{"a": 1, "nested": {"b": 2}}', '$.nested');
38
+
39
+ -- expect error: Invalid JSON
40
+ SELECT * FROM json_each('invalid json');
41
+ -- error: Error: Invalid JSON provided to json_each
42
+
43
+ -- expect error: Function not found
44
+ SELECT * FROM non_existent_tvf(1);
45
+ -- error: Function not found: non_existent_tvf/1
46
+
47
+ -- expect error: Incorrect number of arguments (json_each - no args)
48
+ SELECT * FROM json_each();
49
+ -- error: Error: json_each requires 1 or 2 arguments (jsonSource, [rootPath])
50
+
51
+ -- expect error: Incorrect number of arguments (json_each - too many args)
52
+ SELECT * FROM json_each('[]', '$', 'extra');
53
+ -- error: Error: json_each requires 1 or 2 arguments (jsonSource, [rootPath])
54
+
55
+ -- expect error: Incorrect number of arguments (json_tree - no args)
56
+ SELECT * FROM json_tree();
57
+ -- error: Error: json_tree requires 1 or 2 arguments (jsonSource, [rootPath])
58
+
59
+ -- expect error: Incorrect number of arguments (json_tree - too many args)
60
+ SELECT * FROM json_tree('{}', '$', 'extra');
61
+ -- error: Error: json_tree requires 1 or 2 arguments (jsonSource, [rootPath])
@@ -0,0 +1,544 @@
1
+ -- type-system.sqllogic - Regression tests for type system: CAST, comparisons, ordering
2
+
3
+ -- === CAST via LogicalType.parse ===
4
+
5
+ -- CAST to INTEGER
6
+ select cast(3.7 as integer) as r;
7
+ → [{"r":3}]
8
+
9
+ select cast(-2.9 as integer) as r;
10
+ → [{"r":-2}]
11
+
12
+ select cast('42' as integer) as r;
13
+ → [{"r":42}]
14
+
15
+ select cast(true as integer) as r;
16
+ → [{"r":1}]
17
+
18
+ select cast(false as integer) as r;
19
+ → [{"r":0}]
20
+
21
+ -- Non-numeric string: CAST should yield 0 (SQLite-compatible lenient behavior)
22
+ select cast('abc' as integer) as r;
23
+ → [{"r":0}]
24
+
25
+ select cast(null as integer) as r;
26
+ → [{"r":null}]
27
+
28
+ -- CAST to REAL
29
+ select cast(42 as real) as r;
30
+ → [{"r":42}]
31
+
32
+ select cast('3.14' as real) as r;
33
+ → [{"r":3.14}]
34
+
35
+ select cast(true as real) as r;
36
+ → [{"r":1}]
37
+
38
+ select cast(null as real) as r;
39
+ → [{"r":null}]
40
+
41
+ -- CAST to TEXT
42
+ select cast(123 as text) as r;
43
+ → [{"r":"123"}]
44
+
45
+ select cast(3.14 as text) as r;
46
+ → [{"r":"3.14"}]
47
+
48
+ select cast(true as text) as r;
49
+ → [{"r":"true"}]
50
+
51
+ select cast(null as text) as r;
52
+ → [{"r":null}]
53
+
54
+ -- CAST to BLOB
55
+ select typeof(cast('hello' as blob)) as r;
56
+ → [{"r":"blob"}]
57
+
58
+ select typeof(cast(123 as blob)) as r;
59
+ → [{"r":"blob"}]
60
+
61
+ select cast(null as blob) as r;
62
+ → [{"r":null}]
63
+
64
+ -- CAST to NUMERIC (integer if possible, otherwise real)
65
+ select cast('42' as numeric) as r;
66
+ → [{"r":42}]
67
+
68
+ select cast('3.14' as numeric) as r;
69
+ → [{"r":3.14}]
70
+
71
+ select cast(null as numeric) as r;
72
+ → [{"r":null}]
73
+
74
+ -- CAST to BOOLEAN
75
+ select cast(1 as boolean) as r;
76
+ → [{"r":true}]
77
+
78
+ select cast(0 as boolean) as r;
79
+ → [{"r":false}]
80
+
81
+ select cast(42 as boolean) as r;
82
+ → [{"r":true}]
83
+
84
+ -- CAST aliases
85
+ select cast(3.7 as int) as r;
86
+ → [{"r":3}]
87
+
88
+ select cast('42' as float) as r;
89
+ → [{"r":42}]
90
+
91
+ select cast(42 as varchar) as r;
92
+ → [{"r":"42"}]
93
+
94
+ -- === Cross-type comparison ordering ===
95
+ -- SQLite ordering: NULL < Numeric < TEXT < BLOB
96
+
97
+ CREATE TABLE order_test (id INTEGER PRIMARY KEY, v ANY NULL);
98
+ INSERT INTO order_test VALUES (1, null);
99
+ INSERT INTO order_test VALUES (2, -1);
100
+ INSERT INTO order_test VALUES (3, 0);
101
+ INSERT INTO order_test VALUES (4, 1);
102
+ INSERT INTO order_test VALUES (5, 'aaa');
103
+ INSERT INTO order_test VALUES (6, 'zzz');
104
+ INSERT INTO order_test VALUES (7, x'00');
105
+ INSERT INTO order_test VALUES (8, x'ff');
106
+
107
+ -- Verify cross-type ordering: NULL < numeric < text < blob
108
+ select id from order_test order by v;
109
+ → [{"id":1},{"id":2},{"id":3},{"id":4},{"id":5},{"id":6},{"id":7},{"id":8}]
110
+
111
+ DROP TABLE order_test;
112
+
113
+ -- === BLOB comparison (byte-by-byte, then length) ===
114
+
115
+ CREATE TABLE blob_cmp (id INTEGER PRIMARY KEY, b BLOB);
116
+ INSERT INTO blob_cmp VALUES (1, x'01'), (2, x'02'), (3, x'01ff'), (4, x'0200'), (5, x'0100'), (6, x'abcd');
117
+
118
+ -- Byte-by-byte: x'01...' < x'02'
119
+ select id from blob_cmp where b < x'02' order by b;
120
+ → [{"id":1},{"id":5},{"id":3}]
121
+
122
+ -- Full ordering: byte-by-byte then length
123
+ select id from blob_cmp order by b;
124
+ → [{"id":1},{"id":5},{"id":3},{"id":2},{"id":4},{"id":6}]
125
+
126
+ -- Equality
127
+ select id from blob_cmp where b = x'abcd';
128
+ → [{"id":6}]
129
+
130
+ DROP TABLE blob_cmp;
131
+
132
+ -- === Date/time ordering uses binary comparison (not locale) ===
133
+
134
+ CREATE TABLE date_cmp (id INTEGER PRIMARY KEY, d TEXT);
135
+ INSERT INTO date_cmp VALUES (1, '2024-01-15'), (2, '2024-02-01'), (3, '2024-12-31'), (4, '2024-06-15');
136
+
137
+ select d from date_cmp order by d;
138
+ → [{"d":"2024-01-15"},{"d":"2024-02-01"},{"d":"2024-06-15"},{"d":"2024-12-31"}]
139
+
140
+ select d from date_cmp where d < '2024-02-01' order by d;
141
+ → [{"d":"2024-01-15"}]
142
+
143
+ DROP TABLE date_cmp;
144
+
145
+ CREATE TABLE time_cmp (id INTEGER PRIMARY KEY, t TEXT);
146
+ INSERT INTO time_cmp VALUES (1, '09:00:00'), (2, '17:00:00'), (3, '23:59:59'), (4, '00:00:00');
147
+
148
+ select t from time_cmp order by t;
149
+ → [{"t":"00:00:00"},{"t":"09:00:00"},{"t":"17:00:00"},{"t":"23:59:59"}]
150
+
151
+ DROP TABLE time_cmp;
152
+
153
+ CREATE TABLE dt_cmp (id INTEGER PRIMARY KEY, dt TEXT);
154
+ INSERT INTO dt_cmp VALUES (1, '2024-01-01T00:00:00'), (2, '2024-12-31T23:59:59'), (3, '2024-06-15T12:00:00');
155
+
156
+ select dt from dt_cmp order by dt;
157
+ → [{"dt":"2024-01-01T00:00:00"},{"dt":"2024-06-15T12:00:00"},{"dt":"2024-12-31T23:59:59"}]
158
+
159
+ DROP TABLE dt_cmp;
160
+
161
+ -- === NULL ordering in ORDER BY ===
162
+
163
+ CREATE TABLE null_order (id INTEGER PRIMARY KEY, v INTEGER null);
164
+ INSERT INTO null_order VALUES (1, null), (2, 10), (3, null), (4, 5);
165
+
166
+ -- Nulls sort first in ASC
167
+ select v from null_order order by v;
168
+ → [{"v":null},{"v":null},{"v":5},{"v":10}]
169
+
170
+ DROP TABLE null_order;
171
+
172
+ -- === BOOLEAN ordering and CAST ===
173
+
174
+ select cast(0 as boolean) as r;
175
+ → [{"r":false}]
176
+
177
+ select cast(1 as boolean) as r;
178
+ → [{"r":true}]
179
+
180
+ select cast(-1 as boolean) as r;
181
+ → [{"r":true}]
182
+
183
+ select cast(42 as boolean) as r;
184
+ → [{"r":true}]
185
+
186
+ -- Boolean ordering: false < true
187
+ CREATE TABLE bool_order (id INTEGER PRIMARY KEY, b BOOLEAN);
188
+ INSERT INTO bool_order VALUES (1, true), (2, false), (3, true), (4, false);
189
+
190
+ select b from bool_order order by b, id;
191
+ → [{"b":false},{"b":false},{"b":true},{"b":true}]
192
+
193
+ DROP TABLE bool_order;
194
+
195
+ -- === TEXT collation in comparisons ===
196
+
197
+ CREATE TABLE text_cmp (id INTEGER PRIMARY KEY, t TEXT);
198
+ INSERT INTO text_cmp VALUES (1, 'abc'), (2, 'ABC'), (3, 'abd'), (4, 'abc ');
199
+
200
+ -- Binary: 'ABC' < 'abc' (uppercase letters have lower code points)
201
+ select t from text_cmp where t < 'abc' order by t;
202
+ → [{"t":"ABC"}]
203
+
204
+ -- NOCASE: 'ABC' = 'abc'
205
+ select id from text_cmp where t = 'abc' collate nocase order by id;
206
+ → [{"id":1},{"id":2}]
207
+
208
+ -- RTRIM: 'abc ' = 'abc'
209
+ select id from text_cmp where t = 'abc' collate rtrim order by id;
210
+ → [{"id":1},{"id":4}]
211
+
212
+ DROP TABLE text_cmp;
213
+
214
+ -- === CAST in ORDER BY context ===
215
+
216
+ CREATE TABLE cast_order (id INTEGER PRIMARY KEY, v TEXT);
217
+ INSERT INTO cast_order VALUES (1, '10'), (2, '2'), (3, '1'), (4, '20');
218
+
219
+ -- Text ordering (lexicographic)
220
+ select v from cast_order order by v;
221
+ → [{"v":"1"},{"v":"10"},{"v":"2"},{"v":"20"}]
222
+
223
+ -- Numeric ordering via CAST
224
+ select v from cast_order order by cast(v as integer);
225
+ → [{"v":"1"},{"v":"2"},{"v":"10"},{"v":"20"}]
226
+
227
+ DROP TABLE cast_order;
228
+
229
+ -- === JSON validation on insert ===
230
+
231
+ CREATE TABLE json_tbl (id INTEGER PRIMARY KEY, j JSON);
232
+ INSERT INTO json_tbl VALUES (1, '{"a":1}'), (2, '[1,2,3]'), (3, '"hello"');
233
+
234
+ select j from json_tbl order by id;
235
+ → [{"j":{"a":1}},{"j":[1,2,3]},{"j":"hello"}]
236
+
237
+ -- Invalid JSON rejected
238
+ INSERT INTO json_tbl VALUES (4, '{invalid');
239
+ -- error: Type conversion failed
240
+
241
+ -- typeof returns 'json' for native JSON objects
242
+ select typeof(j) as t from json_tbl where id = 1;
243
+ → [{"t":"json"}]
244
+
245
+ DROP TABLE json_tbl;
246
+
247
+ -- === json() conversion function returns native objects ===
248
+
249
+ select json('{"a":1}') as r;
250
+ → [{"r":{"a":1}}]
251
+
252
+ select json('[1,2,3]') as r;
253
+ → [{"r":[1,2,3]}]
254
+
255
+ select json('null') as r;
256
+ → [{"r":null}]
257
+
258
+ select typeof(json('{"a":1}')) as t;
259
+ → [{"t":"json"}]
260
+
261
+ -- === JSON deep comparison ===
262
+
263
+ select json('{"a":1}') = json('{"a":1}') as eq;
264
+ → [{"eq":true}]
265
+
266
+ select json('{"a":1}') = json('{"a":2}') as eq;
267
+ → [{"eq":false}]
268
+
269
+ select json('[1,2,3]') = json('[1,2,3]') as eq;
270
+ → [{"eq":true}]
271
+
272
+ select json('[1,2,3]') = json('[1,2,4]') as eq;
273
+ → [{"eq":false}]
274
+
275
+ -- === Numeric type coercion in comparisons (table context) ===
276
+
277
+ CREATE TABLE num_cmp (id INTEGER PRIMARY KEY, i INTEGER, r REAL, t TEXT);
278
+ INSERT INTO num_cmp VALUES (1, 42, 42.0, '42');
279
+
280
+ -- Integer vs real equality
281
+ select i = r as r1 from num_cmp;
282
+ → [{"r1":true}]
283
+
284
+ -- Text coerced to numeric for comparison
285
+ select i = t as r1 from num_cmp;
286
+ → [{"r1":true}]
287
+
288
+ -- Integer column vs text literal (planner inserts cast on text)
289
+ select i = '42' as eq, i > '10' as gt, i < '100' as lt from num_cmp;
290
+ → [{"eq":true,"gt":true,"lt":true}]
291
+
292
+ -- Real column vs text literal
293
+ select r = '42.0' as eq from num_cmp;
294
+ → [{"eq":true}]
295
+
296
+ -- Text column vs integer literal (planner inserts cast on text column)
297
+ select t = 42 as eq from num_cmp;
298
+ → [{"eq":true}]
299
+
300
+ -- Non-numeric text compared to integer: cast produces 0
301
+ select '42' = 42 as r1, 'abc' = 0 as r2;
302
+ → [{"r1":true,"r2":true}]
303
+
304
+ -- BETWEEN with mixed types: integer BETWEEN text bounds
305
+ select i from num_cmp where i between '10' and '100';
306
+ → [{"i":42}]
307
+
308
+ -- BETWEEN with text expr and numeric bounds
309
+ select t from num_cmp where t between 10 and 100;
310
+ → [{"t":"42"}]
311
+
312
+ DROP TABLE num_cmp;
313
+
314
+ -- === Cross-category comparison edge cases ===
315
+
316
+ -- Literal cross-category comparisons (no table needed)
317
+ select 42 = '42' as r;
318
+ → [{"r":true}]
319
+
320
+ select 42 != '43' as r;
321
+ → [{"r":true}]
322
+
323
+ select 10 < '20' as r;
324
+ → [{"r":true}]
325
+
326
+ select 100 > '50' as r;
327
+ → [{"r":true}]
328
+
329
+ select 10 <= '10' as r;
330
+ → [{"r":true}]
331
+
332
+ select 10 >= '10' as r;
333
+ → [{"r":true}]
334
+
335
+ -- BETWEEN with all-literal cross-category
336
+ select 5 between '1' and '10' as r;
337
+ → [{"r":true}]
338
+
339
+ select '5' between 1 and 10 as r;
340
+ → [{"r":true}]
341
+
342
+ -- NOT BETWEEN with cross-category
343
+ select 50 not between '1' and '10' as r;
344
+ → [{"r":true}]
345
+
346
+ -- NULL handling in cross-category (NULL propagates)
347
+ select null = '42' as r;
348
+ → [{"r":null}]
349
+
350
+ select 42 = null as r;
351
+ → [{"r":null}]
352
+
353
+ -- === NUMERIC comparator across the number/bigint boundary (regression) ===
354
+ -- A NUMERIC column accepts both number and bigint; ordering must not throw
355
+ -- and must not lose precision past 2^53 by round-tripping through Number().
356
+
357
+ CREATE TABLE numeric_big (v NUMERIC PRIMARY KEY);
358
+ INSERT INTO numeric_big VALUES (9007199254740993);
359
+ INSERT INTO numeric_big VALUES (3);
360
+
361
+ select cast(v as text) as v from numeric_big order by v;
362
+ → [{"v":"3"},{"v":"9007199254740993"}]
363
+
364
+ -- Adjacent bigints past 2^53, negatives, and a fractional double interleaved:
365
+ -- key placement must use exact value order, not a rounded double.
366
+ INSERT INTO numeric_big VALUES (9007199254740994);
367
+ INSERT INTO numeric_big VALUES (-9007199254740993);
368
+ INSERT INTO numeric_big VALUES (2.5);
369
+
370
+ select cast(v as text) as v from numeric_big order by v;
371
+ → [{"v":"-9007199254740993"},{"v":"2.5"},{"v":"3"},{"v":"9007199254740993"},{"v":"9007199254740994"}]
372
+
373
+ select cast(v as text) as v from numeric_big where v > 9007199254740993 order by v;
374
+ → [{"v":"9007199254740994"}]
375
+
376
+ select count(*) as c from numeric_big;
377
+ → [{"c":5}]
378
+
379
+ DROP TABLE numeric_big;
380
+
381
+ -- === TEXT -> INTEGER / NUMERIC conversion past 2^53 (regression) ===
382
+ -- The string arm of parse() used to go through parseInt/parseFloat, which
383
+ -- returns a `number` and silently rounds once the value exceeds 2^53. Both
384
+ -- CAST and cross-category comparison (which CASTs the text operand at plan
385
+ -- time) funnel through the same parse(), so one fix covers both symptoms.
386
+ -- No 64-bit clamp: Quereus literals are already arbitrary-precision
387
+ -- (`select 99999999999999999999999999` is exact), so the text path must
388
+ -- agree rather than clamp to SQLite's INT64_MAX.
389
+ --
390
+ -- Bigint results below are compared via cast(... as text), not the raw numeric
391
+ -- column: the test harness's JSON-diff path normalizes an actual bigint through
392
+ -- Number() before comparing, which rounds a wrong result and a correct one to the
393
+ -- same double — a raw-number assertion here would pass even if the fix regressed.
394
+
395
+ select cast(v as text) as v from (select cast('9007199254740993' as integer) as v);
396
+ → [{"v":"9007199254740993"}]
397
+
398
+ select cast(v as text) as v from (select cast('9007199254740993' as numeric) as v);
399
+ → [{"v":"9007199254740993"}]
400
+
401
+ select cast(v as text) as v from (select cast('-9007199254740993' as integer) as v);
402
+ → [{"v":"-9007199254740993"}]
403
+
404
+ select cast(v as text) as v from (select cast('9223372036854775807' as integer) as v);
405
+ → [{"v":"9223372036854775807"}]
406
+
407
+ -- Arbitrary precision, past SQLite's INT64_MAX: matches the literal path, not SQLite.
408
+ select cast(v as text) as v from (select cast('99999999999999999999999999' as integer) as v);
409
+ → [{"v":"99999999999999999999999999"}]
410
+
411
+ -- Explicit leading '+': BigInt() rejects the '+' that Number() accepts, so the sign is
412
+ -- stripped before the bigint is rebuilt. Without that, this would fall to castFallback (0).
413
+ select cast(v as text) as v from (select cast('+9007199254740993' as integer) as v);
414
+ → [{"v":"9007199254740993"}]
415
+
416
+ select cast(v as text) as v from (select cast('+9007199254740993' as numeric) as v);
417
+ → [{"v":"9007199254740993"}]
418
+
419
+ select cast('+42' as numeric) as v;
420
+ → [{"v":42}]
421
+
422
+ -- The integer() conversion function shares INTEGER_TYPE.parse with CAST, and the docs
423
+ -- prefer it over CAST syntax — it must agree past 2^53.
424
+ select cast(v as text) as v from (select integer('9007199254740993') as v);
425
+ → [{"v":"9007199254740993"}]
426
+
427
+ -- A fractional form is not all-digit, so it falls through to parseFloat and stays
428
+ -- a REAL (double) even past 2^53 — this matches SQLite and is unaffected by the fix.
429
+ select cast('9007199254740993.0' as numeric) as v;
430
+ → [{"v":9007199254740992}]
431
+
432
+ -- Prefix semantics (parseInt-style leading-digit-run) are preserved, matching SQLite.
433
+ select cast('9e18' as integer) as v;
434
+ → [{"v":9}]
435
+
436
+ select cast(v as text) as v from (select cast('9007199254740993abc' as integer) as v);
437
+ → [{"v":"9007199254740993"}]
438
+
439
+ -- Unaffected existing behavior: prefix parse, plain doubles, whitespace trim.
440
+ select cast('12abc' as integer) as v;
441
+ → [{"v":12}]
442
+
443
+ select cast('3.14' as numeric) as v;
444
+ → [{"v":3.14}]
445
+
446
+ select cast(' 42 ' as integer) as v;
447
+ → [{"v":42}]
448
+
449
+ select cast('abc' as integer) as v;
450
+ → [{"v":0}]
451
+
452
+ select cast('' as integer) as v;
453
+ → [{"v":null}]
454
+
455
+ -- Cross-category comparison: text past 2^53 must compare equal to the matching
456
+ -- integer literal, not to its Number()-rounded neighbor.
457
+ select 9007199254740993 = '9007199254740993' as r;
458
+ → [{"r":true}]
459
+
460
+ select 9007199254740993 = '9007199254740992' as r;
461
+ → [{"r":false}]
462
+
463
+ -- Insert-side: a text value past 2^53 written into a NUMERIC column reads back exact.
464
+ CREATE TABLE numeric_text_insert (v NUMERIC);
465
+ INSERT INTO numeric_text_insert VALUES ('9007199254740993');
466
+ select cast(v as text) as v from numeric_text_insert;
467
+ → [{"v":"9007199254740993"}]
468
+
469
+ -- Same for a declared INTEGER column, which runs a different parse() than NUMERIC.
470
+ -- INTEGER_TYPE.validate only accepts a number that is a SAFE integer, so a write-time
471
+ -- parse that yielded a rounded (unsafe) number would fail the column type check outright.
472
+ CREATE TABLE integer_text_insert (v INTEGER);
473
+ INSERT INTO integer_text_insert VALUES ('9007199254740993');
474
+ select cast(v as text) as v from integer_text_insert;
475
+ → [{"v":"9007199254740993"}]
476
+ DROP TABLE integer_text_insert;
477
+ DROP TABLE numeric_text_insert;
478
+
479
+ -- === REAL comparator against a bigint operand past 2^53 (regression) ===
480
+ -- REAL_TYPE.compare used to assert its operands were `number` and call isNaN()
481
+ -- on them; isNaN() throws on a bigint. A REAL column compared against an
482
+ -- integer literal past 2^53 (which the engine keeps as bigint) hit this on
483
+ -- every index/primary-key lookup. Must order by exact value, not throw.
484
+
485
+ CREATE TABLE real_big (id INTEGER PRIMARY KEY, r REAL);
486
+ CREATE INDEX real_big_ir ON real_big(r);
487
+ INSERT INTO real_big VALUES (1, 5.0), (2, 9007199254740992.0);
488
+
489
+ -- Secondary index: equality against a bigint that doesn't match any stored REAL
490
+ select id from real_big where r = 9007199254740993;
491
+ → []
492
+
493
+ -- Secondary index: greater-than against a bigint
494
+ select id from real_big where r > 9007199254740993;
495
+ → []
496
+
497
+ -- Secondary index: less-than against a bigint one past the stored REAL. Both rows
498
+ -- must come back — had the bigint been coerced through Number() it would round
499
+ -- down to 9007199254740992 and drop row 2.
500
+ select id from real_big where r < 9007199254740993 order by id;
501
+ → [{"id":1},{"id":2}]
502
+
503
+ -- ...and the exact stored value excludes itself, which the rounded form would not.
504
+ select id from real_big where r < 9007199254740992 order by id;
505
+ → [{"id":1}]
506
+
507
+ -- Negative bigint past -2^53, below everything stored
508
+ select id from real_big where r > -9007199254740993 order by id;
509
+ → [{"id":1},{"id":2}]
510
+
511
+ -- Secondary index: IN-list mixing a bigint and a plain number
512
+ select id from real_big where r in (9007199254740993, 5) order by id;
513
+ → [{"id":1}]
514
+
515
+ select id from real_big where r in (9007199254740992, 5) order by id;
516
+ → [{"id":1},{"id":2}]
517
+
518
+ DROP TABLE real_big;
519
+
520
+ -- NULL in an indexed REAL column still sorts first and never reaches the numeric path
521
+ -- (columns default NOT NULL in Quereus, hence the explicit `null`)
522
+ CREATE TABLE real_big_null (id INTEGER PRIMARY KEY, r REAL null);
523
+ CREATE INDEX real_big_null_ir ON real_big_null(r);
524
+ INSERT INTO real_big_null VALUES (1, 5.0), (2, 9007199254740992.0), (3, NULL);
525
+
526
+ select id from real_big_null where r < 9007199254740993 order by id;
527
+ → [{"id":1},{"id":2}]
528
+
529
+ select id from real_big_null order by r, id;
530
+ → [{"id":3},{"id":1},{"id":2}]
531
+
532
+ DROP TABLE real_big_null;
533
+
534
+ -- REAL primary key, no secondary index in sight
535
+ CREATE TABLE real_pk (r REAL PRIMARY KEY);
536
+ INSERT INTO real_pk VALUES (5.0);
537
+
538
+ select r from real_pk where r = 9007199254740993;
539
+ → []
540
+
541
+ select r from real_pk where r in (9007199254740993, 5) order by r;
542
+ → [{"r":5}]
543
+
544
+ DROP TABLE real_pk;