@quereus/quereus 0.1.0 → 0.2.1

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 (477) hide show
  1. package/README.md +47 -23
  2. package/dist/src/common/types.d.ts +1 -0
  3. package/dist/src/common/types.d.ts.map +1 -1
  4. package/dist/src/core/database.d.ts +22 -4
  5. package/dist/src/core/database.d.ts.map +1 -1
  6. package/dist/src/core/database.js +44 -6
  7. package/dist/src/core/database.js.map +1 -1
  8. package/dist/src/core/statement.d.ts +0 -7
  9. package/dist/src/core/statement.d.ts.map +1 -1
  10. package/dist/src/core/statement.js +1 -51
  11. package/dist/src/core/statement.js.map +1 -1
  12. package/dist/src/func/builtins/explain.d.ts.map +1 -1
  13. package/dist/src/func/builtins/explain.js +0 -11
  14. package/dist/src/func/builtins/explain.js.map +1 -1
  15. package/dist/src/index.d.ts +13 -5
  16. package/dist/src/index.d.ts.map +1 -1
  17. package/dist/src/index.js +5 -2
  18. package/dist/src/index.js.map +1 -1
  19. package/dist/src/parser/ast.d.ts +10 -4
  20. package/dist/src/parser/ast.d.ts.map +1 -1
  21. package/dist/src/parser/parser.d.ts.map +1 -1
  22. package/dist/src/parser/parser.js +40 -44
  23. package/dist/src/parser/parser.js.map +1 -1
  24. package/dist/src/planner/analysis/const-pass.d.ts.map +1 -1
  25. package/dist/src/planner/analysis/const-pass.js +12 -6
  26. package/dist/src/planner/analysis/const-pass.js.map +1 -1
  27. package/dist/src/planner/building/constraint-builder.d.ts +11 -0
  28. package/dist/src/planner/building/constraint-builder.d.ts.map +1 -0
  29. package/dist/src/planner/building/constraint-builder.js +79 -0
  30. package/dist/src/planner/building/constraint-builder.js.map +1 -0
  31. package/dist/src/planner/building/delete.d.ts.map +1 -1
  32. package/dist/src/planner/building/delete.js +7 -4
  33. package/dist/src/planner/building/delete.js.map +1 -1
  34. package/dist/src/planner/building/expression.d.ts +3 -0
  35. package/dist/src/planner/building/expression.d.ts.map +1 -1
  36. package/dist/src/planner/building/expression.js +33 -7
  37. package/dist/src/planner/building/expression.js.map +1 -1
  38. package/dist/src/planner/building/insert.d.ts.map +1 -1
  39. package/dist/src/planner/building/insert.js +5 -2
  40. package/dist/src/planner/building/insert.js.map +1 -1
  41. package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
  42. package/dist/src/planner/building/select-aggregates.js +46 -9
  43. package/dist/src/planner/building/select-aggregates.js.map +1 -1
  44. package/dist/src/planner/building/select-context.js +20 -11
  45. package/dist/src/planner/building/select-context.js.map +1 -1
  46. package/dist/src/planner/building/select-modifiers.d.ts +5 -3
  47. package/dist/src/planner/building/select-modifiers.d.ts.map +1 -1
  48. package/dist/src/planner/building/select-modifiers.js +29 -20
  49. package/dist/src/planner/building/select-modifiers.js.map +1 -1
  50. package/dist/src/planner/building/select-projections.d.ts +3 -1
  51. package/dist/src/planner/building/select-projections.d.ts.map +1 -1
  52. package/dist/src/planner/building/select-projections.js +15 -20
  53. package/dist/src/planner/building/select-projections.js.map +1 -1
  54. package/dist/src/planner/building/select-window.d.ts.map +1 -1
  55. package/dist/src/planner/building/select-window.js +6 -3
  56. package/dist/src/planner/building/select-window.js.map +1 -1
  57. package/dist/src/planner/building/select.d.ts +25 -2
  58. package/dist/src/planner/building/select.d.ts.map +1 -1
  59. package/dist/src/planner/building/select.js +147 -24
  60. package/dist/src/planner/building/select.js.map +1 -1
  61. package/dist/src/planner/building/table.d.ts +0 -10
  62. package/dist/src/planner/building/table.d.ts.map +1 -1
  63. package/dist/src/planner/building/table.js +1 -35
  64. package/dist/src/planner/building/table.js.map +1 -1
  65. package/dist/src/planner/building/update.d.ts.map +1 -1
  66. package/dist/src/planner/building/update.js +8 -5
  67. package/dist/src/planner/building/update.js.map +1 -1
  68. package/dist/src/planner/building/with.d.ts.map +1 -1
  69. package/dist/src/planner/building/with.js +7 -8
  70. package/dist/src/planner/building/with.js.map +1 -1
  71. package/dist/src/planner/cache/correlation-detector.d.ts +11 -0
  72. package/dist/src/planner/cache/correlation-detector.d.ts.map +1 -0
  73. package/dist/src/planner/cache/correlation-detector.js +73 -0
  74. package/dist/src/planner/cache/correlation-detector.js.map +1 -0
  75. package/dist/src/planner/cache/materialization-advisory.d.ts +12 -18
  76. package/dist/src/planner/cache/materialization-advisory.d.ts.map +1 -1
  77. package/dist/src/planner/cache/materialization-advisory.js +65 -46
  78. package/dist/src/planner/cache/materialization-advisory.js.map +1 -1
  79. package/dist/src/planner/cache/reference-graph.d.ts +14 -9
  80. package/dist/src/planner/cache/reference-graph.d.ts.map +1 -1
  81. package/dist/src/planner/cache/reference-graph.js +93 -84
  82. package/dist/src/planner/cache/reference-graph.js.map +1 -1
  83. package/dist/src/planner/debug.d.ts +25 -0
  84. package/dist/src/planner/debug.d.ts.map +1 -1
  85. package/dist/src/planner/debug.js +127 -0
  86. package/dist/src/planner/debug.js.map +1 -1
  87. package/dist/src/planner/framework/context.d.ts +11 -0
  88. package/dist/src/planner/framework/context.d.ts.map +1 -1
  89. package/dist/src/planner/framework/context.js +25 -2
  90. package/dist/src/planner/framework/context.js.map +1 -1
  91. package/dist/src/planner/framework/registry.d.ts +3 -7
  92. package/dist/src/planner/framework/registry.d.ts.map +1 -1
  93. package/dist/src/planner/framework/registry.js +20 -31
  94. package/dist/src/planner/framework/registry.js.map +1 -1
  95. package/dist/src/planner/nodes/add-constraint-node.d.ts +2 -1
  96. package/dist/src/planner/nodes/add-constraint-node.d.ts.map +1 -1
  97. package/dist/src/planner/nodes/add-constraint-node.js +3 -0
  98. package/dist/src/planner/nodes/add-constraint-node.js.map +1 -1
  99. package/dist/src/planner/nodes/aggregate-node.d.ts.map +1 -1
  100. package/dist/src/planner/nodes/aggregate-node.js +6 -4
  101. package/dist/src/planner/nodes/aggregate-node.js.map +1 -1
  102. package/dist/src/planner/nodes/cache-node.d.ts.map +1 -1
  103. package/dist/src/planner/nodes/cache-node.js +2 -2
  104. package/dist/src/planner/nodes/cache-node.js.map +1 -1
  105. package/dist/src/planner/nodes/constraint-check-node.d.ts +13 -6
  106. package/dist/src/planner/nodes/constraint-check-node.d.ts.map +1 -1
  107. package/dist/src/planner/nodes/constraint-check-node.js +38 -12
  108. package/dist/src/planner/nodes/constraint-check-node.js.map +1 -1
  109. package/dist/src/planner/nodes/create-index-node.d.ts +2 -1
  110. package/dist/src/planner/nodes/create-index-node.d.ts.map +1 -1
  111. package/dist/src/planner/nodes/create-index-node.js +3 -0
  112. package/dist/src/planner/nodes/create-index-node.js.map +1 -1
  113. package/dist/src/planner/nodes/create-table-node.d.ts +2 -1
  114. package/dist/src/planner/nodes/create-table-node.d.ts.map +1 -1
  115. package/dist/src/planner/nodes/create-table-node.js +3 -0
  116. package/dist/src/planner/nodes/create-table-node.js.map +1 -1
  117. package/dist/src/planner/nodes/create-view-node.d.ts +2 -1
  118. package/dist/src/planner/nodes/create-view-node.d.ts.map +1 -1
  119. package/dist/src/planner/nodes/create-view-node.js +3 -0
  120. package/dist/src/planner/nodes/create-view-node.js.map +1 -1
  121. package/dist/src/planner/nodes/cte-node.d.ts +1 -1
  122. package/dist/src/planner/nodes/cte-node.d.ts.map +1 -1
  123. package/dist/src/planner/nodes/cte-node.js +33 -12
  124. package/dist/src/planner/nodes/cte-node.js.map +1 -1
  125. package/dist/src/planner/nodes/cte-reference-node.d.ts +18 -4
  126. package/dist/src/planner/nodes/cte-reference-node.d.ts.map +1 -1
  127. package/dist/src/planner/nodes/cte-reference-node.js +40 -10
  128. package/dist/src/planner/nodes/cte-reference-node.js.map +1 -1
  129. package/dist/src/planner/nodes/delete-node.d.ts +4 -3
  130. package/dist/src/planner/nodes/delete-node.d.ts.map +1 -1
  131. package/dist/src/planner/nodes/delete-node.js +20 -6
  132. package/dist/src/planner/nodes/delete-node.js.map +1 -1
  133. package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
  134. package/dist/src/planner/nodes/distinct-node.js +2 -2
  135. package/dist/src/planner/nodes/distinct-node.js.map +1 -1
  136. package/dist/src/planner/nodes/dml-executor-node.d.ts +1 -1
  137. package/dist/src/planner/nodes/dml-executor-node.d.ts.map +1 -1
  138. package/dist/src/planner/nodes/dml-executor-node.js +2 -2
  139. package/dist/src/planner/nodes/dml-executor-node.js.map +1 -1
  140. package/dist/src/planner/nodes/drop-table-node.d.ts +2 -1
  141. package/dist/src/planner/nodes/drop-table-node.d.ts.map +1 -1
  142. package/dist/src/planner/nodes/drop-table-node.js +3 -0
  143. package/dist/src/planner/nodes/drop-table-node.js.map +1 -1
  144. package/dist/src/planner/nodes/drop-view-node.d.ts +2 -1
  145. package/dist/src/planner/nodes/drop-view-node.d.ts.map +1 -1
  146. package/dist/src/planner/nodes/drop-view-node.js +3 -0
  147. package/dist/src/planner/nodes/drop-view-node.js.map +1 -1
  148. package/dist/src/planner/nodes/filter.d.ts.map +1 -1
  149. package/dist/src/planner/nodes/filter.js +3 -3
  150. package/dist/src/planner/nodes/filter.js.map +1 -1
  151. package/dist/src/planner/nodes/insert-node.d.ts +2 -1
  152. package/dist/src/planner/nodes/insert-node.d.ts.map +1 -1
  153. package/dist/src/planner/nodes/insert-node.js +18 -5
  154. package/dist/src/planner/nodes/insert-node.js.map +1 -1
  155. package/dist/src/planner/nodes/internal-recursive-cte-ref-node.d.ts +28 -0
  156. package/dist/src/planner/nodes/internal-recursive-cte-ref-node.d.ts.map +1 -0
  157. package/dist/src/planner/nodes/internal-recursive-cte-ref-node.js +69 -0
  158. package/dist/src/planner/nodes/internal-recursive-cte-ref-node.js.map +1 -0
  159. package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
  160. package/dist/src/planner/nodes/join-node.js +3 -3
  161. package/dist/src/planner/nodes/join-node.js.map +1 -1
  162. package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
  163. package/dist/src/planner/nodes/limit-offset.js +2 -2
  164. package/dist/src/planner/nodes/limit-offset.js.map +1 -1
  165. package/dist/src/planner/nodes/plan-node-type.d.ts +1 -1
  166. package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
  167. package/dist/src/planner/nodes/plan-node-type.js +1 -1
  168. package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
  169. package/dist/src/planner/nodes/plan-node.d.ts +23 -0
  170. package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
  171. package/dist/src/planner/nodes/plan-node.js +25 -2
  172. package/dist/src/planner/nodes/plan-node.js.map +1 -1
  173. package/dist/src/planner/nodes/project-node.d.ts +5 -1
  174. package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
  175. package/dist/src/planner/nodes/project-node.js +39 -20
  176. package/dist/src/planner/nodes/project-node.js.map +1 -1
  177. package/dist/src/planner/nodes/recursive-cte-node.d.ts +2 -2
  178. package/dist/src/planner/nodes/recursive-cte-node.d.ts.map +1 -1
  179. package/dist/src/planner/nodes/recursive-cte-node.js +20 -8
  180. package/dist/src/planner/nodes/recursive-cte-node.js.map +1 -1
  181. package/dist/src/planner/nodes/reference.d.ts.map +1 -1
  182. package/dist/src/planner/nodes/reference.js +4 -2
  183. package/dist/src/planner/nodes/reference.js.map +1 -1
  184. package/dist/src/planner/nodes/returning-node.d.ts +1 -1
  185. package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
  186. package/dist/src/planner/nodes/returning-node.js +21 -13
  187. package/dist/src/planner/nodes/returning-node.js.map +1 -1
  188. package/dist/src/planner/nodes/scalar.d.ts +26 -2
  189. package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
  190. package/dist/src/planner/nodes/scalar.js +82 -10
  191. package/dist/src/planner/nodes/scalar.js.map +1 -1
  192. package/dist/src/planner/nodes/sequencing-node.d.ts.map +1 -1
  193. package/dist/src/planner/nodes/sequencing-node.js +2 -2
  194. package/dist/src/planner/nodes/sequencing-node.js.map +1 -1
  195. package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
  196. package/dist/src/planner/nodes/set-operation-node.js +3 -3
  197. package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
  198. package/dist/src/planner/nodes/single-row.d.ts +4 -2
  199. package/dist/src/planner/nodes/single-row.d.ts.map +1 -1
  200. package/dist/src/planner/nodes/single-row.js +3 -0
  201. package/dist/src/planner/nodes/single-row.js.map +1 -1
  202. package/dist/src/planner/nodes/sink-node.d.ts +1 -1
  203. package/dist/src/planner/nodes/sink-node.d.ts.map +1 -1
  204. package/dist/src/planner/nodes/sink-node.js +4 -4
  205. package/dist/src/planner/nodes/sink-node.js.map +1 -1
  206. package/dist/src/planner/nodes/sort.d.ts.map +1 -1
  207. package/dist/src/planner/nodes/sort.js +2 -2
  208. package/dist/src/planner/nodes/sort.js.map +1 -1
  209. package/dist/src/planner/nodes/stream-aggregate.d.ts +1 -0
  210. package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
  211. package/dist/src/planner/nodes/stream-aggregate.js +64 -11
  212. package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
  213. package/dist/src/planner/nodes/subquery.d.ts +4 -4
  214. package/dist/src/planner/nodes/subquery.d.ts.map +1 -1
  215. package/dist/src/planner/nodes/subquery.js +68 -23
  216. package/dist/src/planner/nodes/subquery.js.map +1 -1
  217. package/dist/src/planner/nodes/table-access-nodes.d.ts +83 -0
  218. package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -0
  219. package/dist/src/planner/nodes/table-access-nodes.js +226 -0
  220. package/dist/src/planner/nodes/table-access-nodes.js.map +1 -0
  221. package/dist/src/planner/nodes/update-node.d.ts +4 -2
  222. package/dist/src/planner/nodes/update-node.d.ts.map +1 -1
  223. package/dist/src/planner/nodes/update-node.js +26 -13
  224. package/dist/src/planner/nodes/update-node.js.map +1 -1
  225. package/dist/src/planner/nodes/window-node.d.ts.map +1 -1
  226. package/dist/src/planner/nodes/window-node.js +25 -23
  227. package/dist/src/planner/nodes/window-node.js.map +1 -1
  228. package/dist/src/planner/optimizer.d.ts.map +1 -1
  229. package/dist/src/planner/optimizer.js +46 -50
  230. package/dist/src/planner/optimizer.js.map +1 -1
  231. package/dist/src/planner/planning-context.d.ts +13 -0
  232. package/dist/src/planner/planning-context.d.ts.map +1 -1
  233. package/dist/src/planner/planning-context.js.map +1 -1
  234. package/dist/src/planner/rules/access/rule-select-access-path.d.ts +1 -1
  235. package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
  236. package/dist/src/planner/rules/access/rule-select-access-path.js +59 -53
  237. package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
  238. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.d.ts.map +1 -1
  239. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js +62 -2
  240. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js.map +1 -1
  241. package/dist/src/planner/rules/cache/rule-materialization-advisory.d.ts.map +1 -1
  242. package/dist/src/planner/rules/cache/rule-materialization-advisory.js +31 -24
  243. package/dist/src/planner/rules/cache/rule-materialization-advisory.js.map +1 -1
  244. package/dist/src/planner/scopes/base.d.ts +0 -10
  245. package/dist/src/planner/scopes/base.d.ts.map +1 -1
  246. package/dist/src/planner/scopes/base.js +0 -14
  247. package/dist/src/planner/scopes/base.js.map +1 -1
  248. package/dist/src/planner/scopes/empty.d.ts +0 -2
  249. package/dist/src/planner/scopes/empty.d.ts.map +1 -1
  250. package/dist/src/planner/scopes/empty.js +0 -8
  251. package/dist/src/planner/scopes/empty.js.map +1 -1
  252. package/dist/src/planner/scopes/multi.d.ts.map +1 -1
  253. package/dist/src/planner/scopes/multi.js +0 -1
  254. package/dist/src/planner/scopes/multi.js.map +1 -1
  255. package/dist/src/planner/scopes/param.d.ts.map +1 -1
  256. package/dist/src/planner/scopes/param.js +0 -1
  257. package/dist/src/planner/scopes/param.js.map +1 -1
  258. package/dist/src/planner/scopes/registered.d.ts +0 -10
  259. package/dist/src/planner/scopes/registered.d.ts.map +1 -1
  260. package/dist/src/planner/scopes/registered.js +1 -17
  261. package/dist/src/planner/scopes/registered.js.map +1 -1
  262. package/dist/src/planner/scopes/scope.d.ts +0 -8
  263. package/dist/src/planner/scopes/scope.d.ts.map +1 -1
  264. package/dist/src/planner/validation/plan-validator.d.ts.map +1 -1
  265. package/dist/src/planner/validation/plan-validator.js +1 -7
  266. package/dist/src/planner/validation/plan-validator.js.map +1 -1
  267. package/dist/src/runtime/context-helpers.d.ts +45 -0
  268. package/dist/src/runtime/context-helpers.d.ts.map +1 -0
  269. package/dist/src/runtime/context-helpers.js +139 -0
  270. package/dist/src/runtime/context-helpers.js.map +1 -0
  271. package/dist/src/runtime/emission-context.d.ts +1 -0
  272. package/dist/src/runtime/emission-context.d.ts.map +1 -1
  273. package/dist/src/runtime/emission-context.js +2 -1
  274. package/dist/src/runtime/emission-context.js.map +1 -1
  275. package/dist/src/runtime/emit/aggregate.d.ts.map +1 -1
  276. package/dist/src/runtime/emit/aggregate.js +119 -86
  277. package/dist/src/runtime/emit/aggregate.js.map +1 -1
  278. package/dist/src/runtime/emit/between.d.ts +5 -0
  279. package/dist/src/runtime/emit/between.d.ts.map +1 -0
  280. package/dist/src/runtime/emit/between.js +38 -0
  281. package/dist/src/runtime/emit/between.js.map +1 -0
  282. package/dist/src/runtime/emit/binary.d.ts +0 -1
  283. package/dist/src/runtime/emit/binary.d.ts.map +1 -1
  284. package/dist/src/runtime/emit/binary.js +0 -36
  285. package/dist/src/runtime/emit/binary.js.map +1 -1
  286. package/dist/src/runtime/emit/column-reference.d.ts.map +1 -1
  287. package/dist/src/runtime/emit/column-reference.js +2 -26
  288. package/dist/src/runtime/emit/column-reference.js.map +1 -1
  289. package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
  290. package/dist/src/runtime/emit/constraint-check.js +16 -123
  291. package/dist/src/runtime/emit/constraint-check.js.map +1 -1
  292. package/dist/src/runtime/emit/cte-reference.d.ts.map +1 -1
  293. package/dist/src/runtime/emit/cte-reference.js +16 -48
  294. package/dist/src/runtime/emit/cte-reference.js.map +1 -1
  295. package/dist/src/runtime/emit/distinct.d.ts.map +1 -1
  296. package/dist/src/runtime/emit/distinct.js +2 -8
  297. package/dist/src/runtime/emit/distinct.js.map +1 -1
  298. package/dist/src/runtime/emit/filter.d.ts.map +1 -1
  299. package/dist/src/runtime/emit/filter.js +6 -13
  300. package/dist/src/runtime/emit/filter.js.map +1 -1
  301. package/dist/src/runtime/emit/internal-recursive-cte-ref.d.ts +5 -0
  302. package/dist/src/runtime/emit/internal-recursive-cte-ref.d.ts.map +1 -0
  303. package/dist/src/runtime/emit/internal-recursive-cte-ref.js +23 -0
  304. package/dist/src/runtime/emit/internal-recursive-cte-ref.js.map +1 -0
  305. package/dist/src/runtime/emit/join.d.ts.map +1 -1
  306. package/dist/src/runtime/emit/join.js +40 -40
  307. package/dist/src/runtime/emit/join.js.map +1 -1
  308. package/dist/src/runtime/emit/project.d.ts.map +1 -1
  309. package/dist/src/runtime/emit/project.js +13 -13
  310. package/dist/src/runtime/emit/project.js.map +1 -1
  311. package/dist/src/runtime/emit/recursive-cte.d.ts.map +1 -1
  312. package/dist/src/runtime/emit/recursive-cte.js +3 -14
  313. package/dist/src/runtime/emit/recursive-cte.js.map +1 -1
  314. package/dist/src/runtime/emit/returning.d.ts.map +1 -1
  315. package/dist/src/runtime/emit/returning.js +7 -14
  316. package/dist/src/runtime/emit/returning.js.map +1 -1
  317. package/dist/src/runtime/emit/scan.d.ts +5 -2
  318. package/dist/src/runtime/emit/scan.d.ts.map +1 -1
  319. package/dist/src/runtime/emit/scan.js +21 -17
  320. package/dist/src/runtime/emit/scan.js.map +1 -1
  321. package/dist/src/runtime/emit/sort.d.ts.map +1 -1
  322. package/dist/src/runtime/emit/sort.js +8 -11
  323. package/dist/src/runtime/emit/sort.js.map +1 -1
  324. package/dist/src/runtime/emit/subquery.d.ts.map +1 -1
  325. package/dist/src/runtime/emit/subquery.js +95 -40
  326. package/dist/src/runtime/emit/subquery.js.map +1 -1
  327. package/dist/src/runtime/emit/table-valued-function.d.ts.map +1 -1
  328. package/dist/src/runtime/emit/table-valued-function.js +7 -22
  329. package/dist/src/runtime/emit/table-valued-function.js.map +1 -1
  330. package/dist/src/runtime/emit/update.d.ts.map +1 -1
  331. package/dist/src/runtime/emit/update.js +20 -27
  332. package/dist/src/runtime/emit/update.js.map +1 -1
  333. package/dist/src/runtime/emit/window.d.ts.map +1 -1
  334. package/dist/src/runtime/emit/window.js +55 -83
  335. package/dist/src/runtime/emit/window.js.map +1 -1
  336. package/dist/src/runtime/emitters.d.ts.map +1 -1
  337. package/dist/src/runtime/emitters.js +49 -1
  338. package/dist/src/runtime/emitters.js.map +1 -1
  339. package/dist/src/runtime/register.d.ts.map +1 -1
  340. package/dist/src/runtime/register.js +5 -4
  341. package/dist/src/runtime/register.js.map +1 -1
  342. package/dist/src/runtime/scheduler.d.ts.map +1 -1
  343. package/dist/src/runtime/scheduler.js +47 -42
  344. package/dist/src/runtime/scheduler.js.map +1 -1
  345. package/dist/src/runtime/types.d.ts +34 -0
  346. package/dist/src/runtime/types.d.ts.map +1 -1
  347. package/dist/src/runtime/types.js +21 -0
  348. package/dist/src/runtime/types.js.map +1 -1
  349. package/dist/src/schema/manager.d.ts.map +1 -1
  350. package/dist/src/schema/manager.js +29 -16
  351. package/dist/src/schema/manager.js.map +1 -1
  352. package/dist/src/schema/table.d.ts +4 -4
  353. package/dist/src/schema/table.d.ts.map +1 -1
  354. package/dist/src/schema/table.js +10 -10
  355. package/dist/src/schema/table.js.map +1 -1
  356. package/dist/src/util/plugin-loader.d.ts +10 -1
  357. package/dist/src/util/plugin-loader.d.ts.map +1 -1
  358. package/dist/src/util/plugin-loader.js +56 -1
  359. package/dist/src/util/plugin-loader.js.map +1 -1
  360. package/dist/src/util/working-table-iterable.d.ts.map +1 -1
  361. package/dist/src/util/working-table-iterable.js +8 -8
  362. package/dist/src/util/working-table-iterable.js.map +1 -1
  363. package/dist/src/vtab/manifest.d.ts +36 -0
  364. package/dist/src/vtab/manifest.d.ts.map +1 -1
  365. package/dist/src/vtab/table.d.ts +1 -1
  366. package/dist/src/vtab/table.d.ts.map +1 -1
  367. package/package.json +8 -3
  368. package/src/common/types.ts +1 -0
  369. package/src/core/database.ts +48 -6
  370. package/src/core/statement.ts +1 -49
  371. package/src/func/builtins/explain.ts +0 -11
  372. package/src/index.ts +39 -5
  373. package/src/parser/ast.ts +12 -6
  374. package/src/parser/parser.ts +45 -52
  375. package/src/planner/analysis/const-pass.ts +281 -270
  376. package/src/planner/building/constraint-builder.ts +114 -0
  377. package/src/planner/building/delete.ts +18 -5
  378. package/src/planner/building/expression.ts +35 -7
  379. package/src/planner/building/insert.ts +16 -3
  380. package/src/planner/building/select-aggregates.ts +57 -11
  381. package/src/planner/building/select-context.ts +22 -12
  382. package/src/planner/building/select-modifiers.ts +35 -21
  383. package/src/planner/building/select-projections.ts +25 -26
  384. package/src/planner/building/select-window.ts +14 -9
  385. package/src/planner/building/select.ts +163 -31
  386. package/src/planner/building/table.ts +1 -40
  387. package/src/planner/building/update.ts +22 -7
  388. package/src/planner/building/with.ts +12 -13
  389. package/src/planner/cache/correlation-detector.ts +83 -0
  390. package/src/planner/cache/materialization-advisory.ts +71 -50
  391. package/src/planner/cache/reference-graph.ts +115 -91
  392. package/src/planner/debug.ts +163 -0
  393. package/src/planner/framework/context.ts +36 -2
  394. package/src/planner/framework/registry.ts +261 -274
  395. package/src/planner/nodes/add-constraint-node.ts +5 -1
  396. package/src/planner/nodes/aggregate-node.ts +6 -4
  397. package/src/planner/nodes/cache-node.ts +2 -2
  398. package/src/planner/nodes/constraint-check-node.ts +49 -15
  399. package/src/planner/nodes/create-index-node.ts +5 -1
  400. package/src/planner/nodes/create-table-node.ts +5 -1
  401. package/src/planner/nodes/create-view-node.ts +5 -1
  402. package/src/planner/nodes/cte-node.ts +45 -14
  403. package/src/planner/nodes/cte-reference-node.ts +49 -13
  404. package/src/planner/nodes/delete-node.ts +31 -7
  405. package/src/planner/nodes/distinct-node.ts +2 -2
  406. package/src/planner/nodes/dml-executor-node.ts +3 -3
  407. package/src/planner/nodes/drop-table-node.ts +5 -1
  408. package/src/planner/nodes/drop-view-node.ts +5 -1
  409. package/src/planner/nodes/filter.ts +3 -3
  410. package/src/planner/nodes/function.ts +93 -93
  411. package/src/planner/nodes/insert-node.ts +28 -5
  412. package/src/planner/nodes/internal-recursive-cte-ref-node.ts +76 -0
  413. package/src/planner/nodes/join-node.ts +3 -3
  414. package/src/planner/nodes/limit-offset.ts +2 -2
  415. package/src/planner/nodes/plan-node-type.ts +1 -1
  416. package/src/planner/nodes/plan-node.ts +39 -2
  417. package/src/planner/nodes/project-node.ts +39 -19
  418. package/src/planner/nodes/recursive-cte-node.ts +37 -9
  419. package/src/planner/nodes/reference.ts +4 -2
  420. package/src/planner/nodes/returning-node.ts +25 -13
  421. package/src/planner/nodes/scalar.ts +95 -11
  422. package/src/planner/nodes/sequencing-node.ts +2 -2
  423. package/src/planner/nodes/set-operation-node.ts +3 -3
  424. package/src/planner/nodes/single-row.ts +7 -2
  425. package/src/planner/nodes/sink-node.ts +5 -5
  426. package/src/planner/nodes/sort.ts +2 -2
  427. package/src/planner/nodes/stream-aggregate.ts +76 -12
  428. package/src/planner/nodes/subquery.ts +90 -27
  429. package/src/planner/nodes/{physical-access-nodes.ts → table-access-nodes.ts} +6 -6
  430. package/src/planner/nodes/update-node.ts +31 -13
  431. package/src/planner/nodes/window-node.ts +28 -22
  432. package/src/planner/optimizer.ts +257 -263
  433. package/src/planner/planning-context.ts +15 -0
  434. package/src/planner/rules/access/rule-select-access-path.ts +68 -64
  435. package/src/planner/rules/aggregate/rule-aggregate-streaming.ts +74 -2
  436. package/src/planner/rules/cache/rule-materialization-advisory.ts +31 -27
  437. package/src/planner/scopes/base.ts +0 -17
  438. package/src/planner/scopes/empty.ts +0 -10
  439. package/src/planner/scopes/multi.ts +0 -1
  440. package/src/planner/scopes/param.ts +0 -1
  441. package/src/planner/scopes/registered.ts +1 -20
  442. package/src/planner/scopes/scope.ts +0 -12
  443. package/src/planner/validation/plan-validator.ts +1 -8
  444. package/src/runtime/context-helpers.ts +191 -0
  445. package/src/runtime/emission-context.ts +5 -2
  446. package/src/runtime/emit/aggregate.ts +131 -85
  447. package/src/runtime/emit/between.ts +51 -0
  448. package/src/runtime/emit/binary.ts +0 -46
  449. package/src/runtime/emit/column-reference.ts +3 -36
  450. package/src/runtime/emit/constraint-check.ts +19 -144
  451. package/src/runtime/emit/cte-reference.ts +23 -60
  452. package/src/runtime/emit/distinct.ts +2 -7
  453. package/src/runtime/emit/filter.ts +6 -13
  454. package/src/runtime/emit/internal-recursive-cte-ref.ts +37 -0
  455. package/src/runtime/emit/join.ts +45 -43
  456. package/src/runtime/emit/project.ts +18 -12
  457. package/src/runtime/emit/recursive-cte.ts +3 -12
  458. package/src/runtime/emit/returning.ts +7 -14
  459. package/src/runtime/emit/scan.ts +25 -23
  460. package/src/runtime/emit/sort.ts +8 -11
  461. package/src/runtime/emit/subquery.ts +108 -48
  462. package/src/runtime/emit/table-valued-function.ts +7 -20
  463. package/src/runtime/emit/update.ts +22 -29
  464. package/src/runtime/emit/window.ts +74 -88
  465. package/src/runtime/emitters.ts +52 -1
  466. package/src/runtime/register.ts +5 -4
  467. package/src/runtime/scheduler.ts +54 -54
  468. package/src/runtime/types.ts +45 -0
  469. package/src/schema/manager.ts +34 -19
  470. package/src/schema/table.ts +8 -8
  471. package/src/util/plugin-loader.ts +78 -4
  472. package/src/util/working-table-iterable.ts +15 -7
  473. package/src/vtab/manifest.ts +42 -0
  474. package/src/vtab/table.ts +1 -1
  475. package/src/planner/nodes/scan.ts +0 -103
  476. package/src/planner/rules/physical/rule-mark-physical.ts +0 -37
  477. package/src/runtime/emit/table-reference.ts +0 -92
@@ -26,12 +26,13 @@ import { ParameterScope } from '../planner/scopes/param.js';
26
26
  import { GlobalScope } from '../planner/scopes/global.js';
27
27
  import type { PlanNode } from '../planner/nodes/plan-node.js';
28
28
  import { registerEmitters } from '../runtime/register.js';
29
- import { serializePlanTree } from '../planner/debug.js';
29
+ import { serializePlanTree, formatPlanTree } from '../planner/debug.js';
30
30
  import type { DebugOptions } from '../planner/planning-context.js';
31
31
  import { EmissionContext } from '../runtime/emission-context.js';
32
32
  import { Optimizer, DEFAULT_TUNING } from '../planner/optimizer.js';
33
33
  import { registerBuiltinWindowFunctions } from '../func/builtins/builtin-window-functions.js';
34
34
  import { DatabaseOptionsManager } from './database-options.js';
35
+ import type { InstructionTracer } from '../runtime/types.js';
35
36
 
36
37
  const log = createLogger('core:database');
37
38
  const warnLog = log.extend('warn');
@@ -52,6 +53,7 @@ export class Database {
52
53
  private inImplicitTransaction = false; // Track if we're in an implicit transaction
53
54
  public readonly optimizer: Optimizer;
54
55
  public readonly options: DatabaseOptionsManager;
56
+ private instructionTracer: InstructionTracer | undefined;
55
57
 
56
58
  constructor() {
57
59
  this.schemaManager = new SchemaManager(this);
@@ -145,6 +147,12 @@ export class Database {
145
147
  log('Default column nullability changed to: %s', value);
146
148
  }
147
149
  });
150
+
151
+ this.options.registerOption('trace_plan_stack', {
152
+ type: 'boolean',
153
+ defaultValue: false,
154
+ description: 'Enable plan stack tracing',
155
+ });
148
156
  }
149
157
 
150
158
  /** @internal Registers default built-in SQL functions */
@@ -247,6 +255,7 @@ export class Database {
247
255
  params: params ?? {},
248
256
  context: new Map(),
249
257
  tableContexts: new Map(),
258
+ tracer: this.instructionTracer,
250
259
  enableMetrics: this.options.getBooleanOption('runtime_stats'),
251
260
  };
252
261
 
@@ -547,6 +556,24 @@ export class Database {
547
556
  log('Registered collation: %s', name);
548
557
  }
549
558
 
559
+ /**
560
+ * Sets the instruction tracer for this database.
561
+ * The tracer will be used for all statement executions.
562
+ * @param tracer The instruction tracer to use, or null to disable tracing.
563
+ */
564
+ setInstructionTracer(tracer: InstructionTracer | undefined): void {
565
+ this.instructionTracer = tracer;
566
+ log('Instruction tracer %s', tracer ? 'enabled' : 'disabled');
567
+ }
568
+
569
+ /**
570
+ * Gets the current instruction tracer for this database.
571
+ * @returns The instruction tracer, or undefined if none is set.
572
+ */
573
+ getInstructionTracer(): InstructionTracer | undefined {
574
+ return this.instructionTracer;
575
+ }
576
+
550
577
  /** @internal Gets a registered collation function */
551
578
  _getCollation(name: string): CollationFunction | undefined {
552
579
  return getCollation(name);
@@ -625,14 +652,27 @@ export class Database {
625
652
  }
626
653
 
627
654
  /**
628
- * Gets a detailed JSON representation of the query plan for debugging.
655
+ * Gets a detailed representation of the query plan for debugging.
629
656
  * @param sql The SQL statement to plan.
630
- * @returns JSON string containing the detailed plan tree.
657
+ * @param options Optional formatting options. If not provided, uses concise tree format.
658
+ * @returns String containing the formatted plan tree.
631
659
  */
632
- getDebugPlan(sql: string): string {
660
+ getDebugPlan(sql: string, options?: { verbose?: boolean; expandNodes?: string[]; maxDepth?: number }): string {
633
661
  this.checkOpen();
634
662
  const plan = this.getPlan(sql);
635
- return serializePlanTree(plan);
663
+
664
+ if (options?.verbose) {
665
+ // Use the original detailed JSON format
666
+ return serializePlanTree(plan);
667
+ } else {
668
+ // Use the new concise tree format
669
+ return formatPlanTree(plan, {
670
+ concise: true,
671
+ expandNodes: options?.expandNodes || [],
672
+ maxDepth: options?.maxDepth,
673
+ showPhysical: true
674
+ });
675
+ }
636
676
  }
637
677
 
638
678
  /**
@@ -683,8 +723,10 @@ export class Database {
683
723
  schemaManager: this.schemaManager,
684
724
  parameters: params ?? {},
685
725
  scope: parameterScope,
726
+ cteNodes: new Map(),
686
727
  schemaDependencies: new BuildTimeDependencyTracker(),
687
- schemaCache: new Map()
728
+ schemaCache: new Map(),
729
+ cteReferenceCache: new Map()
688
730
  };
689
731
 
690
732
  return buildBlock(ctx, statements);
@@ -12,7 +12,6 @@ import type { RuntimeContext } from '../runtime/types.js';
12
12
  import { Cached } from '../util/cached.js';
13
13
  import { isAsyncIterable } from '../runtime/utils.js';
14
14
  import { generateInstructionProgram, serializePlanTree } from '../planner/debug.js';
15
- import type { InstructionTracer } from '../runtime/types.js';
16
15
  import { EmissionContext } from '../runtime/emission-context.js';
17
16
  import type { SchemaDependency } from '../planner/planning-context.js';
18
17
 
@@ -241,6 +240,7 @@ export class Statement {
241
240
  params: this.boundArgs,
242
241
  context: new Map(),
243
242
  tableContexts: new Map(),
243
+ tracer: this.db.getInstructionTracer(),
244
244
  enableMetrics: this.db.getOption('runtime_metrics'),
245
245
  };
246
246
 
@@ -438,53 +438,5 @@ export class Statement {
438
438
 
439
439
  return generateInstructionProgram(scheduler.instructions, scheduler.destinations);
440
440
  }
441
-
442
- /**
443
- * Executes with runtime instruction tracing enabled.
444
- * @param params Optional parameters to bind.
445
- * @param tracer Optional custom tracer for collecting trace data.
446
- */
447
- async *iterateRowsWithTrace(params?: SqlParameters | SqlValue[], tracer?: InstructionTracer): AsyncIterable<Row> {
448
- this.validateStatement("iterate rows with trace for");
449
- if (this.busy) throw new MisuseError("Statement busy, another iteration may be in progress or reset needed.");
450
- if (params) this.bindAll(params);
451
- this.busy = true;
452
-
453
- try {
454
- const blockPlanNode = this.compile();
455
- if (!blockPlanNode.statements.length) return;
456
-
457
- const emissionContext = this.getEmissionContext();
458
- const rootInstruction = emitPlanNode(blockPlanNode, emissionContext);
459
- const scheduler = new Scheduler(rootInstruction);
460
- const runtimeCtx: RuntimeContext = {
461
- db: this.db,
462
- stmt: this,
463
- params: this.boundArgs,
464
- context: new Map(),
465
- tableContexts: new Map(),
466
- tracer: tracer,
467
- enableMetrics: this.db.getOption('runtime_metrics'),
468
- };
469
-
470
- const results = await scheduler.run(runtimeCtx);
471
- if (results) {
472
- if (Array.isArray(results) && results.length) {
473
- const lastStatementOutput = results[results.length - 1];
474
- if (isAsyncIterable(lastStatementOutput)) {
475
- yield* lastStatementOutput as AsyncIterable<Row>;
476
- }
477
- } else if (isAsyncIterable(results)) {
478
- yield* results as AsyncIterable<Row>;
479
- }
480
- }
481
- } catch (e: any) {
482
- errorLog('Runtime execution failed in iterateRowsWithTrace for current statement: %O', e);
483
- if (e instanceof QuereusError) throw e;
484
- throw new QuereusError(`Execution error: ${e.message}`, StatusCode.ERROR, e);
485
- } finally {
486
- this.busy = false;
487
- }
488
- }
489
441
  }
490
442
 
@@ -75,10 +75,6 @@ export const queryPlanFunc = createIntegratedTableValuedFunction(
75
75
  op = node.nodeType.replace(/Node$/, '').toUpperCase();
76
76
 
77
77
  switch (node.nodeType) {
78
- case 'TableScan':
79
- objectName = node.source?.tableSchema?.name || null;
80
- alias = node.alias || null;
81
- break;
82
78
  case 'TableFunctionCall':
83
79
  objectName = node.functionName;
84
80
  alias = node.alias || null;
@@ -287,13 +283,6 @@ export const stackTraceFunc = createIntegratedTableValuedFunction(
287
283
  vars: { statementCount: node.statements?.length || 0 }
288
284
  });
289
285
  break;
290
- case 'TableScan':
291
- stack.push({
292
- name: 'buildTableScan',
293
- location: 'building/table.ts:buildTableScan',
294
- vars: { tableName: node.source?.tableSchema?.name || 'unknown' }
295
- });
296
- break;
297
286
  case 'Filter':
298
287
  stack.push({
299
288
  name: 'buildFilter',
package/src/index.ts CHANGED
@@ -11,16 +11,41 @@ export { Statement } from './core/statement.js';
11
11
 
12
12
  // Common data types and constants
13
13
  export { StatusCode, SqlDataType } from './common/types.js';
14
- export type { SqlValue, SqlParameters, Row } from './common/types.js';
15
- export { ConflictResolution } from './common/constants.js';
14
+ export type { SqlValue, SqlParameters, Row, MaybePromise, RowOp } from './common/types.js';
15
+ export { ConflictResolution, IndexConstraintOp, VTabConfig, FunctionFlags } from './common/constants.js';
16
16
  export { QuereusError, MisuseError, ConstraintError, unwrapError, formatErrorChain, getPrimaryError } from './common/errors.js';
17
17
  export type { ErrorInfo } from './common/errors.js';
18
18
 
19
19
  // Virtual Table API
20
20
  export { VirtualTable } from './vtab/table.js';
21
+ export type { VirtualTableConnection } from './vtab/connection.js';
21
22
  export { MemoryTableModule } from './vtab/memory/module.js';
22
- export type { IndexInfo, IndexConstraint, IndexConstraintUsage, IndexOrderBy, IndexScanFlags } from './vtab/index-info.js';
23
+ export type { IndexInfo, IndexConstraint, IndexConstraintUsage, IndexOrderBy } from './vtab/index-info.js';
24
+ export { IndexScanFlags } from './vtab/index-info.js';
23
25
  export type { FilterInfo } from './vtab/filter-info.js';
26
+ export type { BaseModuleConfig, SchemaChangeInfo } from './vtab/module.js';
27
+
28
+ // Best Access Plan API (modern vtable planning interface)
29
+ export type {
30
+ BestAccessPlanRequest,
31
+ BestAccessPlanResult,
32
+ ConstraintOp,
33
+ ColumnMeta,
34
+ PredicateConstraint,
35
+ OrderingSpec
36
+ } from './vtab/best-access-plan.js';
37
+ export { AccessPlanBuilder, validateAccessPlan } from './vtab/best-access-plan.js';
38
+
39
+ // Collation functions
40
+ export type { CollationFunction } from './util/comparison.js';
41
+ export {
42
+ BINARY_COLLATION,
43
+ NOCASE_COLLATION,
44
+ RTRIM_COLLATION,
45
+ registerCollation,
46
+ getCollation,
47
+ resolveCollation
48
+ } from './util/comparison.js';
24
49
 
25
50
  // SQL Parser and Compiler
26
51
  export { Parser } from './parser/parser.js';
@@ -58,10 +83,19 @@ import './runtime/register.js';
58
83
 
59
84
  // Re-export plugin system
60
85
  export { dynamicLoadModule, validatePluginUrl } from './util/plugin-loader.js';
61
- export type { PluginManifest, PluginRecord, PluginSetting } from './vtab/manifest.js';
86
+ export type {
87
+ PluginManifest,
88
+ PluginRecord,
89
+ PluginSetting,
90
+ VTablePluginInfo,
91
+ FunctionPluginInfo,
92
+ CollationPluginInfo,
93
+ PluginRegistrations
94
+ } from './vtab/manifest.js';
62
95
 
63
96
  // Re-export virtual table framework
64
97
  export type { VirtualTableModule } from './vtab/module.js';
65
98
 
66
99
  // Debug and development utilities
67
- export { serializePlanTree } from './planner/debug.js';
100
+ export { serializePlanTree, formatPlanTree, formatPlanSummary, serializePlanTreeWithOptions } from './planner/debug.js';
101
+ export type { PlanDisplayOptions } from './planner/debug.js';
package/src/parser/ast.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { MaybePromise, SqlValue } from '../common/types.js';
1
+ import type { MaybePromise, RowOp, SqlValue } from '../common/types.js';
2
2
  import type { ConflictResolution } from '../common/constants.js';
3
3
 
4
4
  /**
@@ -13,7 +13,7 @@ export interface AstNode {
13
13
  | 'rollback' | 'table' | 'join' | 'savepoint' | 'release' | 'functionSource' | 'with' | 'commonTableExpr' | 'pragma'
14
14
  | 'collate' | 'primaryKey' | 'notNull' | 'null' | 'unique' | 'check' | 'default' | 'foreignKey' | 'generated' | 'windowFunction'
15
15
  | 'windowDefinition' | 'windowFrame' | 'currentRow' | 'unboundedPreceding' | 'unboundedFollowing' | 'preceding' | 'following'
16
- | 'subquerySource' | 'mutatingSubquerySource' | 'case' | 'in' | 'exists' | 'values';
16
+ | 'subquerySource' | 'mutatingSubquerySource' | 'case' | 'in' | 'exists' | 'values' | 'between';
17
17
  loc?: {
18
18
  start: { line: number, column: number, offset: number };
19
19
  end: { line: number, column: number, offset: number };
@@ -23,7 +23,7 @@ export interface AstNode {
23
23
  // Expression types
24
24
  export type Expression = LiteralExpr | IdentifierExpr | BinaryExpr | UnaryExpr | FunctionExpr | CastExpr
25
25
  | ParameterExpr | SubqueryExpr | ColumnExpr | FunctionSource | CollateExpr | WindowFunctionExpr | CaseExpr
26
- | InExpr | ExistsExpr;
26
+ | InExpr | ExistsExpr | BetweenExpr;
27
27
 
28
28
  // Literal value expression (number, string, null, etc.)
29
29
  export interface LiteralExpr extends AstNode {
@@ -129,6 +129,15 @@ export interface SubqueryExpr extends AstNode {
129
129
  query: SelectStmt;
130
130
  }
131
131
 
132
+ // BETWEEN expression
133
+ export interface BetweenExpr extends AstNode {
134
+ type: 'between';
135
+ expr: Expression; // Left side of BETWEEN
136
+ lower: Expression; // Lower bound
137
+ upper: Expression; // Upper bound
138
+ not?: boolean; // For NOT BETWEEN
139
+ }
140
+
132
141
  // IN expression
133
142
  export interface InExpr extends AstNode {
134
143
  type: 'in';
@@ -347,9 +356,6 @@ export interface ColumnDef {
347
356
  constraints: ColumnConstraint[];
348
357
  }
349
358
 
350
- // New type for row operations
351
- export type RowOp = 'insert' | 'update' | 'delete';
352
-
353
359
  // Column constraint (PRIMARY KEY, NOT NULL, etc.)
354
360
  export interface ColumnConstraint extends AstNode {
355
361
  type: 'primaryKey' | 'notNull' | 'null' | 'unique' | 'check' | 'default' | 'foreignKey' | 'collate' | 'generated';
@@ -2,7 +2,7 @@ import { createLogger } from '../common/logger.js'; // Import logger
2
2
  import { Lexer, type Token, TokenType } from './lexer.js';
3
3
  import * as AST from './ast.js';
4
4
  import { ConflictResolution } from '../common/constants.js';
5
- import type { SqlValue } from '../common/types.js';
5
+ import type { RowOp, SqlValue } from '../common/types.js';
6
6
  import { quereusError } from '../common/errors.js';
7
7
  import { StatusCode } from '../common/types.js';
8
8
  import { getSyncLiteral } from './utils.js';
@@ -466,7 +466,24 @@ export class Parser {
466
466
  const expr = this.expression();
467
467
  const direction = this.match(TokenType.DESC) ? 'desc' :
468
468
  (this.match(TokenType.ASC) ? 'asc' : 'asc'); // Default to ASC
469
- orderBy.push({ expr, direction });
469
+
470
+ // Handle NULLS FIRST/LAST
471
+ let nulls: 'first' | 'last' | undefined;
472
+ if (this.matchKeyword('NULLS')) {
473
+ if (this.matchKeyword('FIRST')) {
474
+ nulls = 'first';
475
+ } else if (this.matchKeyword('LAST')) {
476
+ nulls = 'last';
477
+ } else {
478
+ throw this.error(this.peek(), "Expected 'FIRST' or 'LAST' after 'NULLS'.");
479
+ }
480
+ }
481
+
482
+ const orderClause: AST.OrderByClause = { expr, direction };
483
+ if (nulls) {
484
+ orderClause.nulls = nulls;
485
+ }
486
+ orderBy.push(orderClause);
470
487
  } while (this.match(TokenType.COMMA));
471
488
  lastConsumedToken = this.previous(); // After last order by clause
472
489
  }
@@ -1125,33 +1142,18 @@ export class Parser {
1125
1142
  }
1126
1143
  } else if (this.match(TokenType.BETWEEN)) {
1127
1144
  // NOT BETWEEN
1128
- const low = this.term();
1145
+ const lower = this.term();
1129
1146
  this.consume(TokenType.AND, "Expected 'AND' after NOT BETWEEN lower bound.");
1130
- const high = this.term();
1131
- const endToken = this.previous(); // End token is end of high expr
1132
-
1133
- // Create a binary AND expression for the bounds
1134
- const boundsExpr: AST.BinaryExpr = {
1135
- type: 'binary',
1136
- operator: 'AND',
1137
- left: low,
1138
- right: high,
1139
- loc: _createLoc(low.loc?.start ? this.tokens.find(t => t.startOffset === low.loc!.start.offset) ?? this.peek() : this.peek(), endToken)
1140
- };
1141
-
1142
- // Create the BETWEEN expression as a binary expression, then wrap in NOT
1143
- const betweenExpr: AST.BinaryExpr = {
1144
- type: 'binary',
1145
- operator: 'BETWEEN',
1146
- left: expr,
1147
- right: boundsExpr,
1148
- loc: _createLoc(startToken, endToken),
1149
- };
1147
+ const upper = this.term();
1148
+ const endToken = this.previous(); // End token is end of upper expr
1150
1149
 
1150
+ // Create the NOT BETWEEN expression as a dedicated node type
1151
1151
  expr = {
1152
- type: 'unary',
1153
- operator: 'NOT',
1154
- expr: betweenExpr,
1152
+ type: 'between',
1153
+ expr,
1154
+ lower,
1155
+ upper,
1156
+ not: true,
1155
1157
  loc: _createLoc(notStartToken, endToken),
1156
1158
  };
1157
1159
  } else if (this.match(TokenType.LIKE)) {
@@ -1194,26 +1196,17 @@ export class Parser {
1194
1196
  };
1195
1197
  } else if (operatorToken.type === TokenType.BETWEEN) {
1196
1198
  // Parse BETWEEN expression: expr BETWEEN low AND high
1197
- const low = this.term();
1199
+ const lower = this.term();
1198
1200
  this.consume(TokenType.AND, "Expected 'AND' after BETWEEN lower bound.");
1199
- const high = this.term();
1200
- const endToken = this.previous(); // End token is end of high expr
1201
+ const upper = this.term();
1202
+ const endToken = this.previous(); // End token is end of upper expr
1201
1203
 
1202
- // Create a binary AND expression for the bounds
1203
- const boundsExpr: AST.BinaryExpr = {
1204
- type: 'binary',
1205
- operator: 'AND',
1206
- left: low,
1207
- right: high,
1208
- loc: _createLoc(low.loc?.start ? this.tokens.find(t => t.startOffset === low.loc!.start.offset) ?? this.peek() : this.peek(), endToken)
1209
- };
1210
-
1211
- // Create the BETWEEN expression as a binary expression
1204
+ // Create the BETWEEN expression as a dedicated node type
1212
1205
  expr = {
1213
- type: 'binary',
1214
- operator: 'BETWEEN',
1215
- left: expr,
1216
- right: boundsExpr,
1206
+ type: 'between',
1207
+ expr,
1208
+ lower,
1209
+ upper,
1217
1210
  loc: _createLoc(startToken, endToken),
1218
1211
  };
1219
1212
  } else if (operatorToken.type === TokenType.IN) {
@@ -1617,20 +1610,20 @@ export class Parser {
1617
1610
  const direction = this.match(TokenType.DESC) ? 'desc' : (this.match(TokenType.ASC) ? 'asc' : 'asc');
1618
1611
 
1619
1612
  // Handle NULLS FIRST/LAST
1620
- let nullsOrdering: 'first' | 'last' | undefined;
1613
+ let nulls: 'first' | 'last' | undefined;
1621
1614
  if (this.matchKeyword('NULLS')) {
1622
1615
  if (this.matchKeyword('FIRST')) {
1623
- nullsOrdering = 'first';
1616
+ nulls = 'first';
1624
1617
  } else if (this.matchKeyword('LAST')) {
1625
- nullsOrdering = 'last';
1618
+ nulls = 'last';
1626
1619
  } else {
1627
1620
  throw this.error(this.peek(), "Expected 'FIRST' or 'LAST' after 'NULLS'.");
1628
1621
  }
1629
1622
  }
1630
1623
 
1631
1624
  const orderClause: AST.OrderByClause = { expr, direction };
1632
- if (nullsOrdering) {
1633
- (orderClause as any).nullsOrdering = nullsOrdering;
1625
+ if (nulls) {
1626
+ orderClause.nulls = nulls;
1634
1627
  }
1635
1628
  orderBy.push(orderClause);
1636
1629
  } while (this.match(TokenType.COMMA));
@@ -2454,7 +2447,7 @@ export class Parser {
2454
2447
  return { type: 'unique', name, onConflict, loc: _createLoc(startToken, endToken) };
2455
2448
  } else if (this.match(TokenType.CHECK)) {
2456
2449
  // --- Parse optional ON clause before parentheses --- //
2457
- let operations: AST.RowOp[] | undefined;
2450
+ let operations: RowOp[] | undefined;
2458
2451
  if (this.matchKeyword('ON')) {
2459
2452
  operations = this.parseRowOpList();
2460
2453
  }
@@ -2533,7 +2526,7 @@ export class Parser {
2533
2526
  return { type: 'unique', name, columns, onConflict, loc: _createLoc(startToken, endToken) };
2534
2527
  } else if (this.match(TokenType.CHECK)) {
2535
2528
  // --- Parse optional ON clause before parentheses --- //
2536
- let operations: AST.RowOp[] | undefined;
2529
+ let operations: RowOp[] | undefined;
2537
2530
  if (this.matchKeyword('ON')) {
2538
2531
  operations = this.parseRowOpList();
2539
2532
  }
@@ -2704,8 +2697,8 @@ export class Parser {
2704
2697
  }
2705
2698
 
2706
2699
  /** Parses the list of operations for CHECK ON */
2707
- private parseRowOpList(): AST.RowOp[] {
2708
- const operations: AST.RowOp[] = [];
2700
+ private parseRowOpList(): RowOp[] {
2701
+ const operations: RowOp[] = [];
2709
2702
 
2710
2703
  // Parse operations in a comma-separated list
2711
2704
  do {