@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
@@ -473,7 +473,7 @@ export class SchemaManager {
473
473
  }
474
474
 
475
475
  // Check if the virtual table module supports xCreateIndex
476
- if (typeof (tableSchema.vtabModule as any)?.xCreateIndex !== 'function') {
476
+ if (!tableSchema.vtabModule.xCreateIndex) {
477
477
  throw new QuereusError(`Virtual table module '${tableSchema.vtabModuleName}' for table '${tableName}' does not support CREATE INDEX.`, StatusCode.ERROR, undefined, stmt.table.loc?.start.line, stmt.table.loc?.start.column);
478
478
  }
479
479
 
@@ -518,19 +518,26 @@ export class SchemaManager {
518
518
 
519
519
  try {
520
520
  // Call xCreateIndex on the virtual table module
521
- await tableSchema.vtabModule.xCreateIndex!(
521
+ await tableSchema.vtabModule.xCreateIndex(
522
522
  this.db,
523
523
  targetSchemaName,
524
524
  tableName,
525
525
  indexSchema
526
526
  );
527
527
 
528
- // Update the table schema with the new index
528
+ // Update the table schema with the new index by creating a new schema object
529
529
  const updatedIndexes = [...(tableSchema.indexes || []), indexSchema];
530
- (tableSchema as any).indexes = Object.freeze(updatedIndexes);
530
+ const updatedTableSchema: TableSchema = {
531
+ ...tableSchema,
532
+ indexes: Object.freeze(updatedIndexes),
533
+ };
534
+
535
+ // Replace the table schema in the schema
536
+ const schema = this.getSchemaOrFail(targetSchemaName);
537
+ schema.addTable(updatedTableSchema);
531
538
 
532
539
  log(`Successfully created index %s on table %s.%s`, indexName, targetSchemaName, tableName);
533
- } catch (e: any) {
540
+ } catch (e: unknown) {
534
541
  const message = e instanceof Error ? e.message : String(e);
535
542
  const code = e instanceof QuereusError ? e.code : StatusCode.ERROR;
536
543
  throw new QuereusError(`xCreateIndex failed for index '${indexName}' on table '${tableName}': ${message}`, code, e instanceof Error ? e : undefined, stmt.loc?.start.line, stmt.loc?.start.column);
@@ -634,7 +641,7 @@ export class SchemaManager {
634
641
  this.db,
635
642
  baseTableSchema
636
643
  );
637
- } catch (e: any) {
644
+ } catch (e: unknown) {
638
645
  const message = e instanceof Error ? e.message : String(e);
639
646
  const code = e instanceof QuereusError ? e.code : StatusCode.ERROR;
640
647
  throw new QuereusError(`Module '${moduleName}' xCreate failed for table '${tableName}': ${message}`, code, e instanceof Error ? e : undefined, stmt.loc?.start.line, stmt.loc?.start.column);
@@ -650,20 +657,28 @@ export class SchemaManager {
650
657
  throw new QuereusError(`Module '${moduleName}' xCreate did not provide a tableSchema for '${tableName}'.`, StatusCode.INTERNAL);
651
658
  }
652
659
 
660
+ // Create a properly typed schema object instead of mutating properties
661
+ let correctedSchema = finalRegisteredSchema;
653
662
  if (finalRegisteredSchema.name.toLowerCase() !== tableName.toLowerCase() ||
654
663
  finalRegisteredSchema.schemaName.toLowerCase() !== targetSchemaName.toLowerCase()) {
655
- warnLog(`Module ${moduleName} returned schema for ${finalRegisteredSchema.schemaName}.${finalRegisteredSchema.name} but expected ${targetSchemaName}.${tableName}. Overwriting name/schemaName.`);
656
- (finalRegisteredSchema as any).name = tableName;
657
- (finalRegisteredSchema as any).schemaName = targetSchemaName;
658
- }
659
- (finalRegisteredSchema as any).vtabModuleName = moduleName;
660
- (finalRegisteredSchema as any).vtabArgs = effectiveModuleArgs;
661
- (finalRegisteredSchema as any).vtabModule = moduleInfo.module;
662
- (finalRegisteredSchema as any).vtabAuxData = moduleInfo.auxData;
663
- if (finalRegisteredSchema.estimatedRows === undefined) {
664
- (finalRegisteredSchema as any).estimatedRows = 0;
664
+ warnLog(`Module ${moduleName} returned schema for ${finalRegisteredSchema.schemaName}.${finalRegisteredSchema.name} but expected ${targetSchemaName}.${tableName}. Correcting name/schemaName.`);
665
+ correctedSchema = {
666
+ ...finalRegisteredSchema,
667
+ name: tableName,
668
+ schemaName: targetSchemaName,
669
+ };
665
670
  }
666
671
 
672
+ // Ensure all required properties are properly set
673
+ const completeTableSchema: TableSchema = {
674
+ ...correctedSchema,
675
+ vtabModuleName: moduleName,
676
+ vtabArgs: effectiveModuleArgs,
677
+ vtabModule: moduleInfo.module,
678
+ vtabAuxData: moduleInfo.auxData,
679
+ estimatedRows: correctedSchema.estimatedRows ?? 0,
680
+ };
681
+
667
682
  const existingTable = schema.getTable(tableName);
668
683
  const existingView = schema.getView(tableName);
669
684
 
@@ -678,7 +693,7 @@ export class SchemaManager {
678
693
  }
679
694
  }
680
695
 
681
- schema.addTable(finalRegisteredSchema);
696
+ schema.addTable(completeTableSchema);
682
697
  log(`Successfully created table %s.%s using module %s`, targetSchemaName, tableName, moduleName);
683
698
 
684
699
  // Notify schema change listeners
@@ -686,9 +701,9 @@ export class SchemaManager {
686
701
  type: 'table_added',
687
702
  schemaName: targetSchemaName,
688
703
  objectName: tableName,
689
- newObject: finalRegisteredSchema
704
+ newObject: completeTableSchema
690
705
  });
691
706
 
692
- return finalRegisteredSchema;
707
+ return completeTableSchema;
693
708
  }
694
709
  }
@@ -4,7 +4,7 @@ import { MemoryTableModule } from '../vtab/memory/module.js';
4
4
  import type { Expression } from '../parser/ast.js';
5
5
  import { type ColumnDef, type TableConstraint } from '../parser/ast.js';
6
6
  import { getAffinity } from '../common/type-inference.js';
7
- import { SqlDataType, StatusCode, type SqlValue } from '../common/types.js';
7
+ import { RowOp, SqlDataType, StatusCode, type SqlValue } from '../common/types.js';
8
8
  import type * as AST from '../parser/ast.js';
9
9
  import { quereusError, QuereusError } from '../common/errors.js';
10
10
  import { createLogger } from '../common/logger.js';
@@ -214,13 +214,13 @@ export function createBasicSchema(name: string, columns: { name: string, type: s
214
214
  }
215
215
 
216
216
  /** Bitmask for row operations */
217
- export const enum RowOp {
217
+ export const enum RowOpFlag {
218
218
  INSERT = 1,
219
219
  UPDATE = 2,
220
220
  DELETE = 4
221
221
  }
222
- export type RowOpMask = RowOp;
223
- export const DEFAULT_ROWOP_MASK = RowOp.INSERT | RowOp.UPDATE;
222
+ export type RowOpMask = RowOpFlag;
223
+ export const DEFAULT_ROWOP_MASK = RowOpFlag.INSERT | RowOpFlag.UPDATE;
224
224
 
225
225
  /**
226
226
  * Converts an array of row operations to a bitmask
@@ -228,16 +228,16 @@ export const DEFAULT_ROWOP_MASK = RowOp.INSERT | RowOp.UPDATE;
228
228
  * @param list Optional array of operation types
229
229
  * @returns A bitmask representing the operations
230
230
  */
231
- export function opsToMask(list?: AST.RowOp[]): RowOpMask {
231
+ export function opsToMask(list?: RowOp[]): RowOpMask {
232
232
  if (!list || list.length === 0) {
233
233
  return DEFAULT_ROWOP_MASK;
234
234
  }
235
235
  let mask: RowOpMask = 0 as RowOpMask;
236
236
  list.forEach(op => {
237
237
  switch (op) {
238
- case 'insert': mask |= RowOp.INSERT; break;
239
- case 'update': mask |= RowOp.UPDATE; break;
240
- case 'delete': mask |= RowOp.DELETE; break;
238
+ case 'insert': mask |= RowOpFlag.INSERT; break;
239
+ case 'update': mask |= RowOpFlag.UPDATE; break;
240
+ case 'delete': mask |= RowOpFlag.DELETE; break;
241
241
  }
242
242
  });
243
243
  return mask;
@@ -1,7 +1,21 @@
1
1
  import type { Database } from '../core/database.js';
2
- import type { PluginManifest } from '../vtab/manifest.js';
2
+ import type { PluginManifest, PluginRegistrations } from '../vtab/manifest.js';
3
3
  import { StatusCode, type SqlValue } from '../common/types.js';
4
4
  import { quereusError } from '../common/errors.js';
5
+ import { createLogger } from '../common/logger.js';
6
+
7
+ const log = createLogger('util:plugin-loader');
8
+
9
+ /**
10
+ * Plugin module interface - what we expect from a plugin module
11
+ */
12
+ export interface PluginModule {
13
+ /** Plugin manifest with metadata */
14
+ manifest?: PluginManifest;
15
+
16
+ /** Default export - the plugin registration function */
17
+ default: (db: Database, config: Record<string, SqlValue>) => Promise<PluginRegistrations> | PluginRegistrations;
18
+ }
5
19
 
6
20
  /**
7
21
  * Dynamically loads and registers a plugin module
@@ -24,7 +38,7 @@ export async function dynamicLoadModule(
24
38
  }
25
39
 
26
40
  // Dynamic import with Vite ignore comment for bundler compatibility
27
- const mod = await import(/* @vite-ignore */ moduleUrl.toString());
41
+ const mod = await import(/* @vite-ignore */ moduleUrl.toString()) as PluginModule;
28
42
 
29
43
  // Validate module structure
30
44
  if (typeof mod.default !== 'function') {
@@ -32,16 +46,74 @@ export async function dynamicLoadModule(
32
46
  }
33
47
 
34
48
  // Call the module's register function with the database and config
35
- await mod.default(db, config);
49
+ const registrations = await mod.default(db, config);
50
+
51
+ // Register all the items the plugin provides
52
+ await registerPluginItems(db, registrations);
53
+
54
+ log('Successfully loaded plugin from %s', url);
55
+ if (registrations.vtables?.length) {
56
+ log(' Registered %d vtable module(s): %s', registrations.vtables.length,
57
+ registrations.vtables.map(v => v.name).join(', '));
58
+ }
59
+ if (registrations.functions?.length) {
60
+ log(' Registered %d function(s): %s', registrations.functions.length,
61
+ registrations.functions.map(f => `${f.schema.name}/${f.schema.numArgs}`).join(', '));
62
+ }
63
+ if (registrations.collations?.length) {
64
+ log(' Registered %d collation(s): %s', registrations.collations.length,
65
+ registrations.collations.map(c => c.name).join(', '));
66
+ }
36
67
 
37
68
  // Return the manifest if available
38
- return mod.manifest as PluginManifest | undefined;
69
+ return mod.manifest;
39
70
  } catch (error) {
40
71
  const message = error instanceof Error ? error.message : String(error);
41
72
  quereusError(`Failed to load plugin from ${url}: ${message}`);
42
73
  }
43
74
  }
44
75
 
76
+ /**
77
+ * Registers all items provided by a plugin
78
+ *
79
+ * @param db Database instance to register with
80
+ * @param registrations The items to register
81
+ */
82
+ async function registerPluginItems(db: Database, registrations: PluginRegistrations): Promise<void> {
83
+ // Register virtual table modules
84
+ if (registrations.vtables) {
85
+ for (const vtable of registrations.vtables) {
86
+ try {
87
+ db.registerVtabModule(vtable.name, vtable.module, vtable.auxData);
88
+ } catch (error) {
89
+ quereusError(`Failed to register vtable module '${vtable.name}': ${error instanceof Error ? error.message : String(error)}`);
90
+ }
91
+ }
92
+ }
93
+
94
+ // Register functions
95
+ if (registrations.functions) {
96
+ for (const func of registrations.functions) {
97
+ try {
98
+ db.registerFunction(func.schema);
99
+ } catch (error) {
100
+ quereusError(`Failed to register function '${func.schema.name}/${func.schema.numArgs}': ${error instanceof Error ? error.message : String(error)}`);
101
+ }
102
+ }
103
+ }
104
+
105
+ // Register collations
106
+ if (registrations.collations) {
107
+ for (const collation of registrations.collations) {
108
+ try {
109
+ db.registerCollation(collation.name, collation.func);
110
+ } catch (error) {
111
+ quereusError(`Failed to register collation '${collation.name}': ${error instanceof Error ? error.message : String(error)}`);
112
+ }
113
+ }
114
+ }
115
+ }
116
+
45
117
  /**
46
118
  * Validates that a URL is likely to be a valid plugin module
47
119
  *
@@ -67,3 +139,5 @@ export function validatePluginUrl(url: string): boolean {
67
139
  return false;
68
140
  }
69
141
  }
142
+
143
+
@@ -1,6 +1,7 @@
1
1
  import type { Row } from '../common/types.js';
2
2
  import type { RuntimeContext } from '../runtime/types.js';
3
3
  import type { RowDescriptor } from '../planner/nodes/plan-node.js';
4
+ import { withRowContextGenerator } from '../runtime/context-helpers.js';
4
5
 
5
6
  /**
6
7
  * A reusable async iterable for working table data that can be iterated multiple times.
@@ -16,15 +17,22 @@ export class WorkingTableIterable implements AsyncIterable<Row> {
16
17
  ) {}
17
18
 
18
19
  async *[Symbol.asyncIterator](): AsyncIterator<Row> {
19
- for (const row of this.rows) {
20
- // Set up context for this row using the CTE row descriptor
21
- this.rctx.context.set(this.rowDescriptor, () => row);
22
- try {
20
+ // Convert rows array to async iterable
21
+ async function* rowsIterable(rows: Row[]): AsyncIterable<Row> {
22
+ for (const row of rows) {
23
23
  yield row;
24
- } finally {
25
- // Clean up context
26
- this.rctx.context.delete(this.rowDescriptor);
27
24
  }
28
25
  }
26
+
27
+ // Use the helper to manage context
28
+ yield* withRowContextGenerator(
29
+ this.rctx,
30
+ this.rowDescriptor,
31
+ rowsIterable(this.rows),
32
+ async function* (row) {
33
+ yield row;
34
+ }
35
+ );
29
36
  }
30
37
  }
38
+
@@ -1,4 +1,6 @@
1
1
  import type { SqlValue } from '../common/types.js';
2
+ import type { FunctionSchema } from '../schema/function.js';
3
+ import type { CollationFunction } from '../util/comparison.js';
2
4
 
3
5
  /**
4
6
  * Configuration setting definition for a plugin
@@ -12,6 +14,39 @@ export interface PluginSetting {
12
14
  help?: string;
13
15
  }
14
16
 
17
+ /**
18
+ * Virtual table module registration info
19
+ */
20
+ export interface VTablePluginInfo {
21
+ name: string; // module name for registration
22
+ module: any; // the VirtualTableModule implementation
23
+ auxData?: unknown; // optional auxiliary data
24
+ }
25
+
26
+ /**
27
+ * Function registration info
28
+ */
29
+ export interface FunctionPluginInfo {
30
+ schema: FunctionSchema; // complete function schema
31
+ }
32
+
33
+ /**
34
+ * Collation registration info
35
+ */
36
+ export interface CollationPluginInfo {
37
+ name: string; // collation name
38
+ func: CollationFunction; // comparison function
39
+ }
40
+
41
+ /**
42
+ * Plugin registration items - what the plugin wants to register
43
+ */
44
+ export interface PluginRegistrations {
45
+ vtables?: VTablePluginInfo[];
46
+ functions?: FunctionPluginInfo[];
47
+ collations?: CollationPluginInfo[];
48
+ }
49
+
15
50
  /**
16
51
  * Plugin manifest that describes the plugin's metadata and configuration options
17
52
  */
@@ -23,6 +58,13 @@ export interface PluginManifest {
23
58
  pragmaPrefix?: string; // default = name, used for PRAGMA commands
24
59
  settings?: PluginSetting[]; // configuration options
25
60
  capabilities?: string[]; // e.g. ['scan', 'index', 'write']
61
+
62
+ // Plugin type indicators (for UI display)
63
+ provides?: {
64
+ vtables?: string[]; // names of vtable modules provided
65
+ functions?: string[]; // names of functions provided
66
+ collations?: string[]; // names of collations provided
67
+ };
26
68
  }
27
69
 
28
70
  /**
package/src/vtab/table.ts CHANGED
@@ -4,7 +4,7 @@ import type { TableSchema } from '../schema/table.js';
4
4
  import type { MaybePromise, Row } from '../common/types.js';
5
5
  import type { IndexSchema } from '../schema/table.js';
6
6
  import type { FilterInfo } from './filter-info.js';
7
- import type { RowOp } from '../parser/ast.js';
7
+ import type { RowOp } from '../common/types.js';
8
8
  import type { VirtualTableConnection } from './connection.js';
9
9
 
10
10
  /**
@@ -1,103 +0,0 @@
1
- import { PlanNodeType } from './plan-node-type.js';
2
- import { PlanNode, type UnaryRelationalNode, type PhysicalProperties, type Attribute } from './plan-node.js';
3
- import { TableReferenceNode } from './reference.js';
4
- import type { RelationType } from '../../common/datatype.js';
5
- import type { Scope } from '../scopes/scope.js';
6
- import { Cached } from '../../util/cached.js';
7
- import type { FilterInfo } from '../../vtab/filter-info.js';
8
- import { quereusError } from '../../common/errors.js';
9
- import { StatusCode } from '../../common/types.js';
10
-
11
- /**
12
- * Represents a table scan operation (full or filtered).
13
- * This is a physical node that accesses actual table data.
14
- */
15
- export class TableScanNode extends PlanNode implements UnaryRelationalNode {
16
- override readonly nodeType = PlanNodeType.TableScan;
17
-
18
- private outputType: Cached<RelationType>;
19
-
20
- constructor(
21
- scope: Scope,
22
- public readonly source: TableReferenceNode,
23
- public readonly filterInfo: FilterInfo,
24
- estimatedCostOverride?: number
25
- ) {
26
- super(scope, estimatedCostOverride ?? filterInfo.indexInfoOutput.estimatedCost);
27
-
28
- this.outputType = new Cached(() => this.source.getType());
29
- }
30
-
31
- getType(): RelationType {
32
- return this.outputType.value;
33
- }
34
-
35
- getAttributes(): Attribute[] {
36
- // Table scans produce the same attributes as their source table reference
37
- return this.source.getAttributes();
38
- }
39
-
40
- getChildren(): readonly [TableReferenceNode] {
41
- return [this.source];
42
- }
43
-
44
- getRelations(): readonly [TableReferenceNode] {
45
- return [this.source];
46
- }
47
-
48
- withChildren(newChildren: readonly PlanNode[]): PlanNode {
49
- if (newChildren.length !== 1) {
50
- quereusError(`TableScanNode expects 1 child, got ${newChildren.length}`, StatusCode.INTERNAL);
51
- }
52
-
53
- const [newSource] = newChildren;
54
-
55
- // Type check - TableScanNode specifically needs a TableReferenceNode
56
- if (!(newSource instanceof TableReferenceNode)) {
57
- quereusError('TableScanNode: child must be a TableReferenceNode', StatusCode.INTERNAL);
58
- }
59
-
60
- // Return same instance if nothing changed
61
- if (newSource === this.source) {
62
- return this;
63
- }
64
-
65
- // Create new instance preserving attributes (scan preserves table attributes)
66
- return new TableScanNode(
67
- this.scope,
68
- newSource,
69
- this.filterInfo
70
- );
71
- }
72
-
73
- get estimatedRows(): number | undefined {
74
- return Number(this.filterInfo.indexInfoOutput.estimatedRows);
75
- }
76
-
77
- override computePhysical(): Partial<PhysicalProperties> {
78
- const tableType = this.source.getType();
79
-
80
- return {
81
- estimatedRows: this.estimatedRows,
82
- // Table scans preserve the logical keys from the table schema
83
- uniqueKeys: tableType.keys.map(key => key.map(colRef => colRef.index)),
84
- };
85
- }
86
-
87
- override toString(): string {
88
- return `SCAN ${this.source.tableSchema.name}`;
89
- }
90
-
91
- override getLogicalAttributes(): Record<string, unknown> {
92
- return {
93
- table: this.source.tableSchema.name,
94
- schema: this.source.tableSchema.schemaName,
95
- filterInfo: {
96
- usableIndex: this.filterInfo.indexInfoOutput.idxStr,
97
- matchedClauses: this.filterInfo.indexInfoOutput.aConstraintUsage?.length || 0,
98
- estimatedCost: this.filterInfo.indexInfoOutput.estimatedCost,
99
- estimatedRows: this.filterInfo.indexInfoOutput.estimatedRows
100
- }
101
- };
102
- }
103
- }
@@ -1,37 +0,0 @@
1
- /**
2
- * Rule: Mark Physical (Fallback)
3
- *
4
- * Transforms: Any logical node → Same node (marked as physical)
5
- * Conditions: When no other rule has made the node physical
6
- * Benefits: Ensures all nodes become physical even if no specific transformation is needed
7
- */
8
-
9
- import { createLogger } from '../../../common/logger.js';
10
- import type { PlanNode } from '../../nodes/plan-node.js';
11
- import type { OptContext } from '../../framework/context.js';
12
-
13
- const log = createLogger('optimizer:rule:mark-physical');
14
-
15
- export function ruleMarkPhysical(node: PlanNode, _context: OptContext): PlanNode | null {
16
- // This is a fallback rule - only apply if the node is not already physical
17
- if (node.physical) {
18
- return null; // Already physical
19
- }
20
-
21
- // Some node types cannot be made physical directly (like AggregateNode)
22
- // These should have been handled by specific transformation rules
23
- const cannotBePhysical = new Set([
24
- 'Aggregate', // Should be transformed to StreamAggregate/HashAggregate
25
- ]);
26
-
27
- if (cannotBePhysical.has(node.nodeType)) {
28
- log('Cannot mark %s as physical - requires transformation', node.nodeType);
29
- return null; // Let the optimizer handle this as an error
30
- }
31
-
32
- log('Marking %s as physical (fallback rule)', node.nodeType);
33
-
34
- // Return the node - framework will set physical properties via markPhysical()
35
- // Don't hardcode properties, let the framework compute them from children
36
- return node;
37
- }
@@ -1,92 +0,0 @@
1
- import type { TableReferenceNode } from '../../planner/nodes/reference.js';
2
- import type { Instruction, RuntimeContext } from '../types.js';
3
- import type { EmissionContext } from '../emission-context.js';
4
- import type { Row } from '../../common/types.js';
5
- import { disconnectVTable } from '../utils.js';
6
- import { createValidatedInstruction } from '../emitters.js';
7
- import type { FilterInfo } from '../../vtab/filter-info.js';
8
- import type { IndexInfo, IndexConstraintUsage } from '../../vtab/index-info.js';
9
- import { QuereusError } from '../../common/errors.js';
10
- import { StatusCode } from '../../common/types.js';
11
- import { buildRowDescriptor } from '../../util/row-descriptor.js';
12
-
13
- export function emitTableReference(plan: TableReferenceNode, ctx: EmissionContext): Instruction {
14
- // Create row descriptor for output attributes
15
- const rowDescriptor = buildRowDescriptor(plan.getAttributes());
16
-
17
- async function* run(rctx: RuntimeContext): AsyncIterable<Row> {
18
- // Get the table schema and pre-resolved vtab module
19
- const tableSchema = plan.tableSchema;
20
- const vtabModule = plan.vtabModule;
21
- const vtabAuxData = plan.vtabAuxData;
22
-
23
- // Create vtab instance using pre-resolved module
24
- if (typeof vtabModule.xConnect !== 'function') {
25
- throw new QuereusError(`Virtual table module '${tableSchema.vtabModuleName}' does not implement xConnect`, StatusCode.MISUSE);
26
- }
27
-
28
- const vtabArgs = tableSchema.vtabArgs || {};
29
- const vtab = vtabModule.xConnect(
30
- rctx.db,
31
- vtabAuxData,
32
- tableSchema.vtabModuleName,
33
- tableSchema.schemaName,
34
- tableSchema.name,
35
- vtabArgs
36
- );
37
-
38
- try {
39
- // Set up context for each row using row descriptor
40
- let row: Row;
41
- rctx.context.set(rowDescriptor, () => row);
42
-
43
- // Check if the virtual table supports xQuery
44
- if (typeof vtab.xQuery === 'function') {
45
- // Create a minimal FilterInfo for full table scan
46
- const defaultIndexInfo: IndexInfo = {
47
- nConstraint: 0,
48
- aConstraint: [],
49
- nOrderBy: 0,
50
- aOrderBy: [],
51
- aConstraintUsage: [] as IndexConstraintUsage[],
52
- idxNum: 0,
53
- idxStr: 'fullscan',
54
- orderByConsumed: false,
55
- estimatedCost: 1000,
56
- estimatedRows: BigInt(100),
57
- idxFlags: 0,
58
- colUsed: 0n,
59
- };
60
-
61
- const filterInfo: FilterInfo = {
62
- idxNum: 0,
63
- idxStr: 'fullscan',
64
- constraints: [],
65
- args: [],
66
- indexInfoOutput: defaultIndexInfo,
67
- };
68
-
69
- // Use xQuery with the filter info
70
- const asyncRowIterable = vtab.xQuery(filterInfo);
71
- for await (row of asyncRowIterable) {
72
- yield row;
73
- }
74
- } else {
75
- throw new QuereusError(`Virtual table '${tableSchema.name}' does not support xQuery.`, StatusCode.UNSUPPORTED);
76
- }
77
-
78
- // Clean up context
79
- rctx.context.delete(rowDescriptor);
80
- } finally {
81
- // Properly disconnect the VirtualTable instance
82
- await disconnectVTable(rctx, vtab);
83
- }
84
- }
85
-
86
- return createValidatedInstruction(
87
- [],
88
- run,
89
- ctx,
90
- `table_ref(${plan.tableSchema.schemaName}.${plan.tableSchema.name})`
91
- );
92
- }