@quereus/quereus 0.2.1 → 0.4.5

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 (760) hide show
  1. package/README.md +12 -1
  2. package/dist/src/common/errors.js.map +1 -1
  3. package/dist/src/common/json-types.d.ts +11 -0
  4. package/dist/src/common/json-types.d.ts.map +1 -0
  5. package/dist/src/common/json-types.js +3 -0
  6. package/dist/src/common/json-types.js.map +1 -0
  7. package/dist/src/common/types.d.ts +1 -0
  8. package/dist/src/common/types.d.ts.map +1 -1
  9. package/dist/src/core/database-options.d.ts +2 -2
  10. package/dist/src/core/database-options.d.ts.map +1 -1
  11. package/dist/src/core/database-options.js.map +1 -1
  12. package/dist/src/core/database.d.ts +61 -14
  13. package/dist/src/core/database.d.ts.map +1 -1
  14. package/dist/src/core/database.js +481 -54
  15. package/dist/src/core/database.js.map +1 -1
  16. package/dist/src/core/statement.d.ts.map +1 -1
  17. package/dist/src/core/statement.js +3 -1
  18. package/dist/src/core/statement.js.map +1 -1
  19. package/dist/src/func/builtins/builtin-window-functions.d.ts.map +1 -1
  20. package/dist/src/func/builtins/builtin-window-functions.js.map +1 -1
  21. package/dist/src/func/builtins/datetime.d.ts +2 -0
  22. package/dist/src/func/builtins/datetime.d.ts.map +1 -1
  23. package/dist/src/func/builtins/datetime.js +39 -0
  24. package/dist/src/func/builtins/datetime.js.map +1 -1
  25. package/dist/src/func/builtins/explain.d.ts +1 -0
  26. package/dist/src/func/builtins/explain.d.ts.map +1 -1
  27. package/dist/src/func/builtins/explain.js +159 -36
  28. package/dist/src/func/builtins/explain.js.map +1 -1
  29. package/dist/src/func/builtins/index.d.ts.map +1 -1
  30. package/dist/src/func/builtins/index.js +5 -2
  31. package/dist/src/func/builtins/index.js.map +1 -1
  32. package/dist/src/func/builtins/json-helpers.d.ts +8 -8
  33. package/dist/src/func/builtins/json-helpers.d.ts.map +1 -1
  34. package/dist/src/func/builtins/json-helpers.js +3 -3
  35. package/dist/src/func/builtins/json-helpers.js.map +1 -1
  36. package/dist/src/func/builtins/json-tvf.d.ts.map +1 -1
  37. package/dist/src/func/builtins/json-tvf.js +1 -1
  38. package/dist/src/func/builtins/json-tvf.js.map +1 -1
  39. package/dist/src/func/builtins/json.d.ts.map +1 -1
  40. package/dist/src/func/builtins/json.js +3 -2
  41. package/dist/src/func/builtins/json.js.map +1 -1
  42. package/dist/src/func/builtins/schema.d.ts.map +1 -1
  43. package/dist/src/func/builtins/schema.js +22 -1
  44. package/dist/src/func/builtins/schema.js.map +1 -1
  45. package/dist/src/func/context.d.ts.map +1 -1
  46. package/dist/src/func/context.js +5 -0
  47. package/dist/src/func/context.js.map +1 -1
  48. package/dist/src/func/registration.d.ts +2 -1
  49. package/dist/src/func/registration.d.ts.map +1 -1
  50. package/dist/src/func/registration.js.map +1 -1
  51. package/dist/src/index.d.ts +2 -2
  52. package/dist/src/index.d.ts.map +1 -1
  53. package/dist/src/index.js +2 -2
  54. package/dist/src/index.js.map +1 -1
  55. package/dist/src/parser/ast.d.ts +83 -4
  56. package/dist/src/parser/ast.d.ts.map +1 -1
  57. package/dist/src/parser/lexer.d.ts +11 -0
  58. package/dist/src/parser/lexer.d.ts.map +1 -1
  59. package/dist/src/parser/lexer.js +29 -21
  60. package/dist/src/parser/lexer.js.map +1 -1
  61. package/dist/src/parser/parser.d.ts +16 -0
  62. package/dist/src/parser/parser.d.ts.map +1 -1
  63. package/dist/src/parser/parser.js +542 -26
  64. package/dist/src/parser/parser.js.map +1 -1
  65. package/dist/src/parser/visitor.d.ts.map +1 -1
  66. package/dist/src/parser/visitor.js +1 -0
  67. package/dist/src/parser/visitor.js.map +1 -1
  68. package/dist/src/planner/analysis/binding-collector.d.ts +5 -0
  69. package/dist/src/planner/analysis/binding-collector.d.ts.map +1 -0
  70. package/dist/src/planner/analysis/binding-collector.js +73 -0
  71. package/dist/src/planner/analysis/binding-collector.js.map +1 -0
  72. package/dist/src/planner/analysis/const-evaluator.js +1 -1
  73. package/dist/src/planner/analysis/const-evaluator.js.map +1 -1
  74. package/dist/src/planner/analysis/const-pass.d.ts.map +1 -1
  75. package/dist/src/planner/analysis/const-pass.js +1 -1
  76. package/dist/src/planner/analysis/const-pass.js.map +1 -1
  77. package/dist/src/planner/analysis/constraint-extractor.d.ts +67 -31
  78. package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
  79. package/dist/src/planner/analysis/constraint-extractor.js +513 -84
  80. package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
  81. package/dist/src/planner/analysis/predicate-normalizer.d.ts +17 -0
  82. package/dist/src/planner/analysis/predicate-normalizer.d.ts.map +1 -0
  83. package/dist/src/planner/analysis/predicate-normalizer.js +222 -0
  84. package/dist/src/planner/analysis/predicate-normalizer.js.map +1 -0
  85. package/dist/src/planner/building/alter-table.d.ts.map +1 -1
  86. package/dist/src/planner/building/alter-table.js +5 -2
  87. package/dist/src/planner/building/alter-table.js.map +1 -1
  88. package/dist/src/planner/building/block.d.ts.map +1 -1
  89. package/dist/src/planner/building/block.js +16 -0
  90. package/dist/src/planner/building/block.js.map +1 -1
  91. package/dist/src/planner/building/constraint-builder.d.ts +1 -1
  92. package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
  93. package/dist/src/planner/building/constraint-builder.js +52 -3
  94. package/dist/src/planner/building/constraint-builder.js.map +1 -1
  95. package/dist/src/planner/building/create-assertion.d.ts +5 -0
  96. package/dist/src/planner/building/create-assertion.d.ts.map +1 -0
  97. package/dist/src/planner/building/create-assertion.js +5 -0
  98. package/dist/src/planner/building/create-assertion.js.map +1 -0
  99. package/dist/src/planner/building/declare-schema.d.ts +8 -0
  100. package/dist/src/planner/building/declare-schema.d.ts.map +1 -0
  101. package/dist/src/planner/building/declare-schema.js +14 -0
  102. package/dist/src/planner/building/declare-schema.js.map +1 -0
  103. package/dist/src/planner/building/delete.d.ts.map +1 -1
  104. package/dist/src/planner/building/delete.js +37 -5
  105. package/dist/src/planner/building/delete.js.map +1 -1
  106. package/dist/src/planner/building/drop-assertion.d.ts +5 -0
  107. package/dist/src/planner/building/drop-assertion.d.ts.map +1 -0
  108. package/dist/src/planner/building/drop-assertion.js +8 -0
  109. package/dist/src/planner/building/drop-assertion.js.map +1 -0
  110. package/dist/src/planner/building/expression.d.ts.map +1 -1
  111. package/dist/src/planner/building/expression.js +1 -0
  112. package/dist/src/planner/building/expression.js.map +1 -1
  113. package/dist/src/planner/building/function-call.d.ts.map +1 -1
  114. package/dist/src/planner/building/function-call.js +2 -1
  115. package/dist/src/planner/building/function-call.js.map +1 -1
  116. package/dist/src/planner/building/insert.d.ts.map +1 -1
  117. package/dist/src/planner/building/insert.js +67 -10
  118. package/dist/src/planner/building/insert.js.map +1 -1
  119. package/dist/src/planner/building/pragma.d.ts.map +1 -1
  120. package/dist/src/planner/building/pragma.js +1 -0
  121. package/dist/src/planner/building/pragma.js.map +1 -1
  122. package/dist/src/planner/building/schema-resolution.d.ts +2 -2
  123. package/dist/src/planner/building/schema-resolution.d.ts.map +1 -1
  124. package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
  125. package/dist/src/planner/building/select-aggregates.js +3 -2
  126. package/dist/src/planner/building/select-aggregates.js.map +1 -1
  127. package/dist/src/planner/building/select-compound.d.ts +2 -2
  128. package/dist/src/planner/building/select-compound.d.ts.map +1 -1
  129. package/dist/src/planner/building/select-compound.js +10 -1
  130. package/dist/src/planner/building/select-compound.js.map +1 -1
  131. package/dist/src/planner/building/select-context.d.ts +3 -3
  132. package/dist/src/planner/building/select-context.d.ts.map +1 -1
  133. package/dist/src/planner/building/select-context.js.map +1 -1
  134. package/dist/src/planner/building/select-modifiers.d.ts +6 -5
  135. package/dist/src/planner/building/select-modifiers.d.ts.map +1 -1
  136. package/dist/src/planner/building/select-modifiers.js +5 -4
  137. package/dist/src/planner/building/select-modifiers.js.map +1 -1
  138. package/dist/src/planner/building/select-projections.d.ts.map +1 -1
  139. package/dist/src/planner/building/select-projections.js +4 -5
  140. package/dist/src/planner/building/select-projections.js.map +1 -1
  141. package/dist/src/planner/building/select-window.d.ts.map +1 -1
  142. package/dist/src/planner/building/select-window.js +6 -3
  143. package/dist/src/planner/building/select-window.js.map +1 -1
  144. package/dist/src/planner/building/select.d.ts +3 -3
  145. package/dist/src/planner/building/select.d.ts.map +1 -1
  146. package/dist/src/planner/building/select.js +18 -8
  147. package/dist/src/planner/building/select.js.map +1 -1
  148. package/dist/src/planner/building/table-function.d.ts.map +1 -1
  149. package/dist/src/planner/building/table-function.js +1 -1
  150. package/dist/src/planner/building/table-function.js.map +1 -1
  151. package/dist/src/planner/building/table.d.ts +5 -3
  152. package/dist/src/planner/building/table.d.ts.map +1 -1
  153. package/dist/src/planner/building/table.js +7 -2
  154. package/dist/src/planner/building/table.js.map +1 -1
  155. package/dist/src/planner/building/update.d.ts.map +1 -1
  156. package/dist/src/planner/building/update.js +38 -6
  157. package/dist/src/planner/building/update.js.map +1 -1
  158. package/dist/src/planner/building/with.d.ts +3 -3
  159. package/dist/src/planner/building/with.d.ts.map +1 -1
  160. package/dist/src/planner/building/with.js.map +1 -1
  161. package/dist/src/planner/debug.d.ts.map +1 -1
  162. package/dist/src/planner/debug.js.map +1 -1
  163. package/dist/src/planner/framework/characteristics.d.ts +235 -0
  164. package/dist/src/planner/framework/characteristics.d.ts.map +1 -0
  165. package/dist/src/planner/framework/characteristics.js +299 -0
  166. package/dist/src/planner/framework/characteristics.js.map +1 -0
  167. package/dist/src/planner/framework/context.d.ts +16 -5
  168. package/dist/src/planner/framework/context.d.ts.map +1 -1
  169. package/dist/src/planner/framework/context.js +2 -0
  170. package/dist/src/planner/framework/context.js.map +1 -1
  171. package/dist/src/planner/framework/pass.d.ts +116 -0
  172. package/dist/src/planner/framework/pass.d.ts.map +1 -0
  173. package/dist/src/planner/framework/pass.js +236 -0
  174. package/dist/src/planner/framework/pass.js.map +1 -0
  175. package/dist/src/planner/nodes/aggregate-node.d.ts +16 -6
  176. package/dist/src/planner/nodes/aggregate-node.d.ts.map +1 -1
  177. package/dist/src/planner/nodes/aggregate-node.js +40 -4
  178. package/dist/src/planner/nodes/aggregate-node.js.map +1 -1
  179. package/dist/src/planner/nodes/array-index-node.js.map +1 -1
  180. package/dist/src/planner/nodes/cache-node.d.ts +5 -2
  181. package/dist/src/planner/nodes/cache-node.d.ts.map +1 -1
  182. package/dist/src/planner/nodes/cache-node.js +6 -0
  183. package/dist/src/planner/nodes/cache-node.js.map +1 -1
  184. package/dist/src/planner/nodes/constraint-check-node.d.ts +10 -2
  185. package/dist/src/planner/nodes/constraint-check-node.d.ts.map +1 -1
  186. package/dist/src/planner/nodes/constraint-check-node.js +12 -4
  187. package/dist/src/planner/nodes/constraint-check-node.js.map +1 -1
  188. package/dist/src/planner/nodes/create-assertion-node.d.ts +22 -0
  189. package/dist/src/planner/nodes/create-assertion-node.d.ts.map +1 -0
  190. package/dist/src/planner/nodes/create-assertion-node.js +41 -0
  191. package/dist/src/planner/nodes/create-assertion-node.js.map +1 -0
  192. package/dist/src/planner/nodes/create-index-node.js +2 -2
  193. package/dist/src/planner/nodes/create-index-node.js.map +1 -1
  194. package/dist/src/planner/nodes/create-table-node.js +2 -2
  195. package/dist/src/planner/nodes/create-table-node.js.map +1 -1
  196. package/dist/src/planner/nodes/cte-node.d.ts +17 -2
  197. package/dist/src/planner/nodes/cte-node.d.ts.map +1 -1
  198. package/dist/src/planner/nodes/cte-node.js +9 -1
  199. package/dist/src/planner/nodes/cte-node.js.map +1 -1
  200. package/dist/src/planner/nodes/cte-reference-node.js +1 -1
  201. package/dist/src/planner/nodes/cte-reference-node.js.map +1 -1
  202. package/dist/src/planner/nodes/declarative-schema.d.ts +62 -0
  203. package/dist/src/planner/nodes/declarative-schema.d.ts.map +1 -0
  204. package/dist/src/planner/nodes/declarative-schema.js +181 -0
  205. package/dist/src/planner/nodes/declarative-schema.js.map +1 -0
  206. package/dist/src/planner/nodes/delete-node.d.ts +8 -3
  207. package/dist/src/planner/nodes/delete-node.d.ts.map +1 -1
  208. package/dist/src/planner/nodes/delete-node.js +10 -2
  209. package/dist/src/planner/nodes/delete-node.js.map +1 -1
  210. package/dist/src/planner/nodes/distinct-node.d.ts +3 -2
  211. package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
  212. package/dist/src/planner/nodes/distinct-node.js +17 -4
  213. package/dist/src/planner/nodes/distinct-node.js.map +1 -1
  214. package/dist/src/planner/nodes/dml-executor-node.d.ts +1 -1
  215. package/dist/src/planner/nodes/dml-executor-node.d.ts.map +1 -1
  216. package/dist/src/planner/nodes/drop-assertion-node.d.ts +21 -0
  217. package/dist/src/planner/nodes/drop-assertion-node.d.ts.map +1 -0
  218. package/dist/src/planner/nodes/drop-assertion-node.js +41 -0
  219. package/dist/src/planner/nodes/drop-assertion-node.js.map +1 -0
  220. package/dist/src/planner/nodes/drop-table-node.d.ts.map +1 -1
  221. package/dist/src/planner/nodes/drop-table-node.js +1 -0
  222. package/dist/src/planner/nodes/drop-table-node.js.map +1 -1
  223. package/dist/src/planner/nodes/filter.d.ts +8 -3
  224. package/dist/src/planner/nodes/filter.d.ts.map +1 -1
  225. package/dist/src/planner/nodes/filter.js +44 -0
  226. package/dist/src/planner/nodes/filter.js.map +1 -1
  227. package/dist/src/planner/nodes/insert-node.d.ts +9 -3
  228. package/dist/src/planner/nodes/insert-node.d.ts.map +1 -1
  229. package/dist/src/planner/nodes/insert-node.js +11 -2
  230. package/dist/src/planner/nodes/insert-node.js.map +1 -1
  231. package/dist/src/planner/nodes/internal-recursive-cte-ref-node.d.ts +3 -4
  232. package/dist/src/planner/nodes/internal-recursive-cte-ref-node.d.ts.map +1 -1
  233. package/dist/src/planner/nodes/internal-recursive-cte-ref-node.js +1 -16
  234. package/dist/src/planner/nodes/internal-recursive-cte-ref-node.js.map +1 -1
  235. package/dist/src/planner/nodes/join-node.d.ts +12 -3
  236. package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
  237. package/dist/src/planner/nodes/join-node.js +111 -2
  238. package/dist/src/planner/nodes/join-node.js.map +1 -1
  239. package/dist/src/planner/nodes/limit-offset.d.ts +7 -3
  240. package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
  241. package/dist/src/planner/nodes/limit-offset.js +15 -0
  242. package/dist/src/planner/nodes/limit-offset.js.map +1 -1
  243. package/dist/src/planner/nodes/plan-node-type.d.ts +8 -0
  244. package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
  245. package/dist/src/planner/nodes/plan-node-type.js +8 -0
  246. package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
  247. package/dist/src/planner/nodes/plan-node.d.ts +9 -9
  248. package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
  249. package/dist/src/planner/nodes/plan-node.js +3 -3
  250. package/dist/src/planner/nodes/plan-node.js.map +1 -1
  251. package/dist/src/planner/nodes/pragma.d.ts +2 -1
  252. package/dist/src/planner/nodes/pragma.d.ts.map +1 -1
  253. package/dist/src/planner/nodes/pragma.js +3 -1
  254. package/dist/src/planner/nodes/pragma.js.map +1 -1
  255. package/dist/src/planner/nodes/project-node.d.ts +16 -3
  256. package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
  257. package/dist/src/planner/nodes/project-node.js +82 -2
  258. package/dist/src/planner/nodes/project-node.js.map +1 -1
  259. package/dist/src/planner/nodes/recursive-cte-node.d.ts +2 -2
  260. package/dist/src/planner/nodes/recursive-cte-node.d.ts.map +1 -1
  261. package/dist/src/planner/nodes/recursive-cte-node.js +1 -1
  262. package/dist/src/planner/nodes/recursive-cte-node.js.map +1 -1
  263. package/dist/src/planner/nodes/reference.d.ts +13 -4
  264. package/dist/src/planner/nodes/reference.d.ts.map +1 -1
  265. package/dist/src/planner/nodes/reference.js +16 -0
  266. package/dist/src/planner/nodes/reference.js.map +1 -1
  267. package/dist/src/planner/nodes/remote-query-node.d.ts +37 -0
  268. package/dist/src/planner/nodes/remote-query-node.d.ts.map +1 -0
  269. package/dist/src/planner/nodes/remote-query-node.js +63 -0
  270. package/dist/src/planner/nodes/remote-query-node.js.map +1 -0
  271. package/dist/src/planner/nodes/retrieve-node.d.ts +46 -0
  272. package/dist/src/planner/nodes/retrieve-node.d.ts.map +1 -0
  273. package/dist/src/planner/nodes/retrieve-node.js +77 -0
  274. package/dist/src/planner/nodes/retrieve-node.js.map +1 -0
  275. package/dist/src/planner/nodes/returning-node.d.ts +4 -3
  276. package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
  277. package/dist/src/planner/nodes/returning-node.js +44 -3
  278. package/dist/src/planner/nodes/returning-node.js.map +1 -1
  279. package/dist/src/planner/nodes/sequencing-node.d.ts +1 -1
  280. package/dist/src/planner/nodes/sequencing-node.d.ts.map +1 -1
  281. package/dist/src/planner/nodes/sequencing-node.js.map +1 -1
  282. package/dist/src/planner/nodes/set-operation-node.d.ts +1 -1
  283. package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
  284. package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
  285. package/dist/src/planner/nodes/sort.d.ts +11 -2
  286. package/dist/src/planner/nodes/sort.d.ts.map +1 -1
  287. package/dist/src/planner/nodes/sort.js +23 -2
  288. package/dist/src/planner/nodes/sort.js.map +1 -1
  289. package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
  290. package/dist/src/planner/nodes/stream-aggregate.js +4 -1
  291. package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
  292. package/dist/src/planner/nodes/table-access-nodes.d.ts +7 -1
  293. package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
  294. package/dist/src/planner/nodes/table-access-nodes.js +22 -4
  295. package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
  296. package/dist/src/planner/nodes/table-function-call.d.ts +2 -1
  297. package/dist/src/planner/nodes/table-function-call.d.ts.map +1 -1
  298. package/dist/src/planner/nodes/table-function-call.js +12 -5
  299. package/dist/src/planner/nodes/table-function-call.js.map +1 -1
  300. package/dist/src/planner/nodes/transaction-node.js +2 -2
  301. package/dist/src/planner/nodes/transaction-node.js.map +1 -1
  302. package/dist/src/planner/nodes/update-node.d.ts +7 -1
  303. package/dist/src/planner/nodes/update-node.d.ts.map +1 -1
  304. package/dist/src/planner/nodes/update-node.js +11 -2
  305. package/dist/src/planner/nodes/update-node.js.map +1 -1
  306. package/dist/src/planner/nodes/view-reference-node.js.map +1 -1
  307. package/dist/src/planner/nodes/window-function.js.map +1 -1
  308. package/dist/src/planner/nodes/window-node.js.map +1 -1
  309. package/dist/src/planner/optimizer-tuning.d.ts +11 -0
  310. package/dist/src/planner/optimizer-tuning.d.ts.map +1 -1
  311. package/dist/src/planner/optimizer-tuning.js +6 -0
  312. package/dist/src/planner/optimizer-tuning.js.map +1 -1
  313. package/dist/src/planner/optimizer.d.ts +17 -3
  314. package/dist/src/planner/optimizer.d.ts.map +1 -1
  315. package/dist/src/planner/optimizer.js +159 -67
  316. package/dist/src/planner/optimizer.js.map +1 -1
  317. package/dist/src/planner/planning-context.d.ts +5 -3
  318. package/dist/src/planner/planning-context.d.ts.map +1 -1
  319. package/dist/src/planner/planning-context.js +2 -0
  320. package/dist/src/planner/planning-context.js.map +1 -1
  321. package/dist/src/planner/resolve.d.ts +3 -2
  322. package/dist/src/planner/resolve.d.ts.map +1 -1
  323. package/dist/src/planner/resolve.js +6 -5
  324. package/dist/src/planner/resolve.js.map +1 -1
  325. package/dist/src/planner/rules/access/rule-select-access-path.d.ts +8 -3
  326. package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
  327. package/dist/src/planner/rules/access/rule-select-access-path.js +206 -47
  328. package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
  329. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.d.ts +10 -3
  330. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.d.ts.map +1 -1
  331. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js +95 -87
  332. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js.map +1 -1
  333. package/dist/src/planner/rules/cache/rule-cte-optimization.d.ts +8 -2
  334. package/dist/src/planner/rules/cache/rule-cte-optimization.d.ts.map +1 -1
  335. package/dist/src/planner/rules/cache/rule-cte-optimization.js +24 -13
  336. package/dist/src/planner/rules/cache/rule-cte-optimization.js.map +1 -1
  337. package/dist/src/planner/rules/cache/rule-materialization-advisory.d.ts +9 -2
  338. package/dist/src/planner/rules/cache/rule-materialization-advisory.d.ts.map +1 -1
  339. package/dist/src/planner/rules/cache/rule-materialization-advisory.js +14 -7
  340. package/dist/src/planner/rules/cache/rule-materialization-advisory.js.map +1 -1
  341. package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.d.ts +9 -3
  342. package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.d.ts.map +1 -1
  343. package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.js +34 -37
  344. package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.js.map +1 -1
  345. package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts +14 -0
  346. package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts.map +1 -0
  347. package/dist/src/planner/rules/join/rule-join-greedy-commute.js +33 -0
  348. package/dist/src/planner/rules/join/rule-join-greedy-commute.js.map +1 -0
  349. package/dist/src/planner/rules/join/rule-join-key-inference.d.ts +11 -0
  350. package/dist/src/planner/rules/join/rule-join-key-inference.d.ts.map +1 -0
  351. package/dist/src/planner/rules/join/rule-join-key-inference.js +32 -0
  352. package/dist/src/planner/rules/join/rule-join-key-inference.js.map +1 -0
  353. package/dist/src/planner/rules/join/rule-quickpick-enumeration.d.ts +4 -0
  354. package/dist/src/planner/rules/join/rule-quickpick-enumeration.d.ts.map +1 -0
  355. package/dist/src/planner/rules/join/rule-quickpick-enumeration.js +233 -0
  356. package/dist/src/planner/rules/join/rule-quickpick-enumeration.js.map +1 -0
  357. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.d.ts +21 -0
  358. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.d.ts.map +1 -0
  359. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js +125 -0
  360. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js.map +1 -0
  361. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts +21 -0
  362. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts.map +1 -0
  363. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js +261 -0
  364. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +1 -0
  365. package/dist/src/planner/scopes/registered.d.ts +1 -0
  366. package/dist/src/planner/scopes/registered.d.ts.map +1 -1
  367. package/dist/src/planner/scopes/registered.js +7 -0
  368. package/dist/src/planner/scopes/registered.js.map +1 -1
  369. package/dist/src/planner/stats/index.d.ts +0 -17
  370. package/dist/src/planner/stats/index.d.ts.map +1 -1
  371. package/dist/src/planner/stats/index.js +0 -58
  372. package/dist/src/planner/stats/index.js.map +1 -1
  373. package/dist/src/planner/util/deferred-constraint.d.ts +14 -0
  374. package/dist/src/planner/util/deferred-constraint.d.ts.map +1 -0
  375. package/dist/src/planner/util/deferred-constraint.js +85 -0
  376. package/dist/src/planner/util/deferred-constraint.js.map +1 -0
  377. package/dist/src/planner/util/key-utils.d.ts +15 -0
  378. package/dist/src/planner/util/key-utils.d.ts.map +1 -0
  379. package/dist/src/planner/util/key-utils.js +43 -0
  380. package/dist/src/planner/util/key-utils.js.map +1 -0
  381. package/dist/src/planner/validation/plan-validator.d.ts.map +1 -1
  382. package/dist/src/planner/validation/plan-validator.js +1 -0
  383. package/dist/src/planner/validation/plan-validator.js.map +1 -1
  384. package/dist/src/runtime/deferred-constraint-queue.d.ts +33 -0
  385. package/dist/src/runtime/deferred-constraint-queue.d.ts.map +1 -0
  386. package/dist/src/runtime/deferred-constraint-queue.js +172 -0
  387. package/dist/src/runtime/deferred-constraint-queue.js.map +1 -0
  388. package/dist/src/runtime/emission-context.d.ts +9 -3
  389. package/dist/src/runtime/emission-context.d.ts.map +1 -1
  390. package/dist/src/runtime/emission-context.js +5 -1
  391. package/dist/src/runtime/emission-context.js.map +1 -1
  392. package/dist/src/runtime/emit/add-constraint.d.ts.map +1 -1
  393. package/dist/src/runtime/emit/add-constraint.js +22 -4
  394. package/dist/src/runtime/emit/add-constraint.js.map +1 -1
  395. package/dist/src/runtime/emit/aggregate.d.ts.map +1 -1
  396. package/dist/src/runtime/emit/aggregate.js +3 -2
  397. package/dist/src/runtime/emit/aggregate.js.map +1 -1
  398. package/dist/src/runtime/emit/array-index.js.map +1 -1
  399. package/dist/src/runtime/emit/binary.d.ts.map +1 -1
  400. package/dist/src/runtime/emit/binary.js +9 -2
  401. package/dist/src/runtime/emit/binary.js.map +1 -1
  402. package/dist/src/runtime/emit/cache.d.ts.map +1 -1
  403. package/dist/src/runtime/emit/cache.js +1 -1
  404. package/dist/src/runtime/emit/cache.js.map +1 -1
  405. package/dist/src/runtime/emit/cast.d.ts.map +1 -1
  406. package/dist/src/runtime/emit/cast.js.map +1 -1
  407. package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
  408. package/dist/src/runtime/emit/constraint-check.js +110 -23
  409. package/dist/src/runtime/emit/constraint-check.js.map +1 -1
  410. package/dist/src/runtime/emit/create-assertion.d.ts +5 -0
  411. package/dist/src/runtime/emit/create-assertion.d.ts.map +1 -0
  412. package/dist/src/runtime/emit/create-assertion.js +70 -0
  413. package/dist/src/runtime/emit/create-assertion.js.map +1 -0
  414. package/dist/src/runtime/emit/cte-reference.d.ts.map +1 -1
  415. package/dist/src/runtime/emit/cte-reference.js.map +1 -1
  416. package/dist/src/runtime/emit/cte.d.ts.map +1 -1
  417. package/dist/src/runtime/emit/cte.js.map +1 -1
  418. package/dist/src/runtime/emit/distinct.d.ts.map +1 -1
  419. package/dist/src/runtime/emit/distinct.js.map +1 -1
  420. package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
  421. package/dist/src/runtime/emit/dml-executor.js +17 -9
  422. package/dist/src/runtime/emit/dml-executor.js.map +1 -1
  423. package/dist/src/runtime/emit/drop-assertion.d.ts +5 -0
  424. package/dist/src/runtime/emit/drop-assertion.d.ts.map +1 -0
  425. package/dist/src/runtime/emit/drop-assertion.js +30 -0
  426. package/dist/src/runtime/emit/drop-assertion.js.map +1 -0
  427. package/dist/src/runtime/emit/filter.d.ts.map +1 -1
  428. package/dist/src/runtime/emit/filter.js.map +1 -1
  429. package/dist/src/runtime/emit/join.d.ts.map +1 -1
  430. package/dist/src/runtime/emit/join.js.map +1 -1
  431. package/dist/src/runtime/emit/limit-offset.d.ts.map +1 -1
  432. package/dist/src/runtime/emit/limit-offset.js.map +1 -1
  433. package/dist/src/runtime/emit/pragma.js.map +1 -1
  434. package/dist/src/runtime/emit/project.d.ts.map +1 -1
  435. package/dist/src/runtime/emit/project.js.map +1 -1
  436. package/dist/src/runtime/emit/recursive-cte.d.ts.map +1 -1
  437. package/dist/src/runtime/emit/recursive-cte.js +1 -1
  438. package/dist/src/runtime/emit/recursive-cte.js.map +1 -1
  439. package/dist/src/runtime/emit/remote-query.d.ts +9 -0
  440. package/dist/src/runtime/emit/remote-query.d.ts.map +1 -0
  441. package/dist/src/runtime/emit/remote-query.js +30 -0
  442. package/dist/src/runtime/emit/remote-query.js.map +1 -0
  443. package/dist/src/runtime/emit/retrieve.d.ts +5 -0
  444. package/dist/src/runtime/emit/retrieve.d.ts.map +1 -0
  445. package/dist/src/runtime/emit/retrieve.js +9 -0
  446. package/dist/src/runtime/emit/retrieve.js.map +1 -0
  447. package/dist/src/runtime/emit/returning.d.ts.map +1 -1
  448. package/dist/src/runtime/emit/returning.js +1 -1
  449. package/dist/src/runtime/emit/returning.js.map +1 -1
  450. package/dist/src/runtime/emit/scalar-function.d.ts.map +1 -1
  451. package/dist/src/runtime/emit/scalar-function.js.map +1 -1
  452. package/dist/src/runtime/emit/scan.d.ts.map +1 -1
  453. package/dist/src/runtime/emit/scan.js +20 -5
  454. package/dist/src/runtime/emit/scan.js.map +1 -1
  455. package/dist/src/runtime/emit/schema-declarative.d.ts +8 -0
  456. package/dist/src/runtime/emit/schema-declarative.d.ts.map +1 -0
  457. package/dist/src/runtime/emit/schema-declarative.js +163 -0
  458. package/dist/src/runtime/emit/schema-declarative.js.map +1 -0
  459. package/dist/src/runtime/emit/sequencing.d.ts.map +1 -1
  460. package/dist/src/runtime/emit/sequencing.js.map +1 -1
  461. package/dist/src/runtime/emit/set-operation.d.ts.map +1 -1
  462. package/dist/src/runtime/emit/set-operation.js +6 -6
  463. package/dist/src/runtime/emit/set-operation.js.map +1 -1
  464. package/dist/src/runtime/emit/sort.d.ts.map +1 -1
  465. package/dist/src/runtime/emit/sort.js.map +1 -1
  466. package/dist/src/runtime/emit/subquery.d.ts +1 -1
  467. package/dist/src/runtime/emit/subquery.d.ts.map +1 -1
  468. package/dist/src/runtime/emit/subquery.js +6 -6
  469. package/dist/src/runtime/emit/subquery.js.map +1 -1
  470. package/dist/src/runtime/emit/transaction.d.ts.map +1 -1
  471. package/dist/src/runtime/emit/transaction.js +48 -8
  472. package/dist/src/runtime/emit/transaction.js.map +1 -1
  473. package/dist/src/runtime/emit/values.d.ts.map +1 -1
  474. package/dist/src/runtime/emit/values.js.map +1 -1
  475. package/dist/src/runtime/emit/window.d.ts.map +1 -1
  476. package/dist/src/runtime/emit/window.js.map +1 -1
  477. package/dist/src/runtime/emitters.d.ts.map +1 -1
  478. package/dist/src/runtime/emitters.js +1 -0
  479. package/dist/src/runtime/emitters.js.map +1 -1
  480. package/dist/src/runtime/register.d.ts.map +1 -1
  481. package/dist/src/runtime/register.js +16 -2
  482. package/dist/src/runtime/register.js.map +1 -1
  483. package/dist/src/runtime/scheduler.js.map +1 -1
  484. package/dist/src/runtime/types.d.ts +2 -2
  485. package/dist/src/runtime/types.d.ts.map +1 -1
  486. package/dist/src/runtime/types.js +4 -1
  487. package/dist/src/runtime/types.js.map +1 -1
  488. package/dist/src/runtime/utils.d.ts +2 -2
  489. package/dist/src/runtime/utils.d.ts.map +1 -1
  490. package/dist/src/runtime/utils.js +1 -0
  491. package/dist/src/runtime/utils.js.map +1 -1
  492. package/dist/src/schema/assertion.d.ts +19 -0
  493. package/dist/src/schema/assertion.d.ts.map +1 -0
  494. package/dist/src/schema/assertion.js +2 -0
  495. package/dist/src/schema/assertion.js.map +1 -0
  496. package/dist/src/schema/catalog.d.ts +44 -0
  497. package/dist/src/schema/catalog.d.ts.map +1 -0
  498. package/dist/src/schema/catalog.js +148 -0
  499. package/dist/src/schema/catalog.js.map +1 -0
  500. package/dist/src/schema/change-events.d.ts +2 -2
  501. package/dist/src/schema/change-events.d.ts.map +1 -1
  502. package/dist/src/schema/column.d.ts +2 -0
  503. package/dist/src/schema/column.d.ts.map +1 -1
  504. package/dist/src/schema/column.js.map +1 -1
  505. package/dist/src/schema/declared-schema-manager.d.ts +42 -0
  506. package/dist/src/schema/declared-schema-manager.d.ts.map +1 -0
  507. package/dist/src/schema/declared-schema-manager.js +71 -0
  508. package/dist/src/schema/declared-schema-manager.js.map +1 -0
  509. package/dist/src/schema/function.d.ts +3 -2
  510. package/dist/src/schema/function.d.ts.map +1 -1
  511. package/dist/src/schema/function.js.map +1 -1
  512. package/dist/src/schema/manager.d.ts +8 -3
  513. package/dist/src/schema/manager.d.ts.map +1 -1
  514. package/dist/src/schema/manager.js +32 -3
  515. package/dist/src/schema/manager.js.map +1 -1
  516. package/dist/src/schema/schema-differ.d.ts +34 -0
  517. package/dist/src/schema/schema-differ.d.ts.map +1 -0
  518. package/dist/src/schema/schema-differ.js +157 -0
  519. package/dist/src/schema/schema-differ.js.map +1 -0
  520. package/dist/src/schema/schema-hasher.d.ts +10 -0
  521. package/dist/src/schema/schema-hasher.d.ts.map +1 -0
  522. package/dist/src/schema/schema-hasher.js +39 -0
  523. package/dist/src/schema/schema-hasher.js.map +1 -0
  524. package/dist/src/schema/schema.d.ts +7 -0
  525. package/dist/src/schema/schema.d.ts.map +1 -1
  526. package/dist/src/schema/schema.js +19 -0
  527. package/dist/src/schema/schema.js.map +1 -1
  528. package/dist/src/schema/table.d.ts +28 -3
  529. package/dist/src/schema/table.d.ts.map +1 -1
  530. package/dist/src/schema/table.js +17 -2
  531. package/dist/src/schema/table.js.map +1 -1
  532. package/dist/src/schema/window-function.d.ts.map +1 -1
  533. package/dist/src/schema/window-function.js.map +1 -1
  534. package/dist/src/util/ast-stringify.d.ts.map +1 -1
  535. package/dist/src/util/ast-stringify.js +116 -3
  536. package/dist/src/util/ast-stringify.js.map +1 -1
  537. package/dist/src/util/environment.js.map +1 -1
  538. package/dist/src/util/plugin-loader.d.ts +25 -2
  539. package/dist/src/util/plugin-loader.d.ts.map +1 -1
  540. package/dist/src/util/plugin-loader.js +180 -2
  541. package/dist/src/util/plugin-loader.js.map +1 -1
  542. package/dist/src/util/row-descriptor.d.ts +1 -1
  543. package/dist/src/util/row-descriptor.d.ts.map +1 -1
  544. package/dist/src/util/row-descriptor.js.map +1 -1
  545. package/dist/src/util/serialization.d.ts +3 -0
  546. package/dist/src/util/serialization.d.ts.map +1 -1
  547. package/dist/src/util/serialization.js +1 -0
  548. package/dist/src/util/serialization.js.map +1 -1
  549. package/dist/src/vtab/best-access-plan.d.ts +1 -1
  550. package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
  551. package/dist/src/vtab/best-access-plan.js +1 -0
  552. package/dist/src/vtab/best-access-plan.js.map +1 -1
  553. package/dist/src/vtab/manifest.d.ts.map +1 -1
  554. package/dist/src/vtab/memory/layer/base.d.ts.map +1 -1
  555. package/dist/src/vtab/memory/layer/base.js +2 -0
  556. package/dist/src/vtab/memory/layer/base.js.map +1 -1
  557. package/dist/src/vtab/memory/layer/manager.d.ts +2 -1
  558. package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
  559. package/dist/src/vtab/memory/layer/manager.js +24 -6
  560. package/dist/src/vtab/memory/layer/manager.js.map +1 -1
  561. package/dist/src/vtab/memory/layer/safe-iterate.d.ts.map +1 -1
  562. package/dist/src/vtab/memory/layer/safe-iterate.js.map +1 -1
  563. package/dist/src/vtab/memory/module.d.ts.map +1 -1
  564. package/dist/src/vtab/memory/module.js +5 -0
  565. package/dist/src/vtab/memory/module.js.map +1 -1
  566. package/dist/src/vtab/memory/table.d.ts +2 -1
  567. package/dist/src/vtab/memory/table.d.ts.map +1 -1
  568. package/dist/src/vtab/memory/table.js +3 -2
  569. package/dist/src/vtab/memory/table.js.map +1 -1
  570. package/dist/src/vtab/memory/utils/logging.d.ts +2 -2
  571. package/dist/src/vtab/memory/utils/logging.d.ts.map +1 -1
  572. package/dist/src/vtab/memory/utils/logging.js +6 -3
  573. package/dist/src/vtab/memory/utils/logging.js.map +1 -1
  574. package/dist/src/vtab/module.d.ts +25 -0
  575. package/dist/src/vtab/module.d.ts.map +1 -1
  576. package/dist/src/vtab/table.d.ts +17 -4
  577. package/dist/src/vtab/table.d.ts.map +1 -1
  578. package/dist/src/vtab/table.js.map +1 -1
  579. package/package.json +4 -2
  580. package/src/common/errors.ts +1 -1
  581. package/src/common/json-types.ts +16 -0
  582. package/src/common/types.ts +2 -0
  583. package/src/core/database-options.ts +8 -8
  584. package/src/core/database.ts +537 -71
  585. package/src/core/statement.ts +3 -1
  586. package/src/func/builtins/builtin-window-functions.ts +11 -10
  587. package/src/func/builtins/datetime.ts +42 -0
  588. package/src/func/builtins/explain.ts +186 -44
  589. package/src/func/builtins/index.ts +5 -2
  590. package/src/func/builtins/json-helpers.ts +21 -21
  591. package/src/func/builtins/json-tvf.ts +8 -9
  592. package/src/func/builtins/json.ts +10 -9
  593. package/src/func/builtins/schema.ts +24 -4
  594. package/src/func/context.ts +7 -0
  595. package/src/func/registration.ts +5 -1
  596. package/src/index.ts +2 -2
  597. package/src/parser/ast.ts +582 -481
  598. package/src/parser/lexer.ts +27 -21
  599. package/src/parser/parser.ts +3336 -2776
  600. package/src/parser/visitor.ts +1 -0
  601. package/src/planner/analysis/binding-collector.ts +83 -0
  602. package/src/planner/analysis/const-evaluator.ts +1 -1
  603. package/src/planner/analysis/const-pass.ts +3 -2
  604. package/src/planner/analysis/constraint-extractor.ts +610 -123
  605. package/src/planner/analysis/predicate-normalizer.ts +237 -0
  606. package/src/planner/building/alter-table.ts +3 -1
  607. package/src/planner/building/block.ts +93 -78
  608. package/src/planner/building/constraint-builder.ts +173 -114
  609. package/src/planner/building/create-assertion.ts +7 -0
  610. package/src/planner/building/declare-schema.ts +22 -0
  611. package/src/planner/building/delete.ts +214 -171
  612. package/src/planner/building/drop-assertion.ts +11 -0
  613. package/src/planner/building/expression.ts +1 -0
  614. package/src/planner/building/function-call.ts +6 -5
  615. package/src/planner/building/insert.ts +428 -349
  616. package/src/planner/building/pragma.ts +1 -0
  617. package/src/planner/building/schema-resolution.ts +176 -176
  618. package/src/planner/building/select-aggregates.ts +5 -3
  619. package/src/planner/building/select-compound.ts +22 -13
  620. package/src/planner/building/select-context.ts +6 -6
  621. package/src/planner/building/select-modifiers.ts +8 -7
  622. package/src/planner/building/select-projections.ts +177 -176
  623. package/src/planner/building/select-window.ts +259 -253
  624. package/src/planner/building/select.ts +531 -520
  625. package/src/planner/building/table-function.ts +49 -48
  626. package/src/planner/building/table.ts +9 -3
  627. package/src/planner/building/update.ts +319 -270
  628. package/src/planner/building/with.ts +7 -7
  629. package/src/planner/debug.ts +1 -0
  630. package/src/planner/framework/characteristics.ts +503 -0
  631. package/src/planner/framework/context.ts +23 -6
  632. package/src/planner/framework/pass.ts +354 -0
  633. package/src/planner/nodes/aggregate-node.ts +52 -7
  634. package/src/planner/nodes/array-index-node.ts +1 -1
  635. package/src/planner/nodes/cache-node.ts +11 -2
  636. package/src/planner/nodes/constraint-check-node.ts +14 -5
  637. package/src/planner/nodes/create-assertion-node.ts +51 -0
  638. package/src/planner/nodes/create-index-node.ts +2 -2
  639. package/src/planner/nodes/create-table-node.ts +2 -2
  640. package/src/planner/nodes/cte-node.ts +30 -4
  641. package/src/planner/nodes/cte-reference-node.ts +2 -2
  642. package/src/planner/nodes/declarative-schema.ts +221 -0
  643. package/src/planner/nodes/delete-node.ts +102 -96
  644. package/src/planner/nodes/distinct-node.ts +20 -6
  645. package/src/planner/nodes/dml-executor-node.ts +1 -1
  646. package/src/planner/nodes/drop-assertion-node.ts +50 -0
  647. package/src/planner/nodes/drop-table-node.ts +1 -0
  648. package/src/planner/nodes/filter.ts +56 -3
  649. package/src/planner/nodes/insert-node.ts +126 -120
  650. package/src/planner/nodes/internal-recursive-cte-ref-node.ts +5 -20
  651. package/src/planner/nodes/join-node.ts +122 -4
  652. package/src/planner/nodes/limit-offset.ts +132 -113
  653. package/src/planner/nodes/plan-node-type.ts +95 -87
  654. package/src/planner/nodes/plan-node.ts +8 -8
  655. package/src/planner/nodes/pragma.ts +6 -3
  656. package/src/planner/nodes/project-node.ts +101 -7
  657. package/src/planner/nodes/recursive-cte-node.ts +6 -6
  658. package/src/planner/nodes/reference.ts +334 -312
  659. package/src/planner/nodes/remote-query-node.ts +73 -0
  660. package/src/planner/nodes/retrieve-node.ts +86 -0
  661. package/src/planner/nodes/returning-node.ts +52 -10
  662. package/src/planner/nodes/sequencing-node.ts +2 -2
  663. package/src/planner/nodes/set-operation-node.ts +3 -3
  664. package/src/planner/nodes/sort.ts +33 -4
  665. package/src/planner/nodes/stream-aggregate.ts +5 -1
  666. package/src/planner/nodes/table-access-nodes.ts +31 -6
  667. package/src/planner/nodes/table-function-call.ts +134 -127
  668. package/src/planner/nodes/transaction-node.ts +2 -2
  669. package/src/planner/nodes/update-node.ts +138 -132
  670. package/src/planner/nodes/view-reference-node.ts +1 -1
  671. package/src/planner/nodes/window-function.ts +2 -2
  672. package/src/planner/nodes/window-node.ts +1 -1
  673. package/src/planner/optimizer-tuning.ts +18 -0
  674. package/src/planner/optimizer.ts +171 -96
  675. package/src/planner/planning-context.ts +10 -3
  676. package/src/planner/resolve.ts +10 -9
  677. package/src/planner/rules/README.md +96 -96
  678. package/src/planner/rules/access/rule-select-access-path.ts +384 -184
  679. package/src/planner/rules/aggregate/rule-aggregate-streaming.ts +118 -104
  680. package/src/planner/rules/cache/rule-cte-optimization.ts +29 -16
  681. package/src/planner/rules/cache/rule-materialization-advisory.ts +14 -7
  682. package/src/planner/rules/cache/rule-mutating-subquery-cache.ts +38 -44
  683. package/src/planner/rules/join/rule-join-greedy-commute.ts +48 -0
  684. package/src/planner/rules/join/rule-join-key-inference.ts +35 -0
  685. package/src/planner/rules/join/rule-quickpick-enumeration.ts +267 -0
  686. package/src/planner/rules/predicate/rule-predicate-pushdown.ts +144 -0
  687. package/src/planner/rules/retrieve/rule-grow-retrieve.ts +337 -0
  688. package/src/planner/scopes/registered.ts +8 -0
  689. package/src/planner/stats/index.ts +0 -65
  690. package/src/planner/util/key-utils.ts +46 -0
  691. package/src/planner/validation/plan-validator.ts +5 -3
  692. package/src/runtime/deferred-constraint-queue.ts +196 -0
  693. package/src/runtime/emission-context.ts +11 -5
  694. package/src/runtime/emit/add-constraint.ts +26 -5
  695. package/src/runtime/emit/aggregate.ts +9 -7
  696. package/src/runtime/emit/array-index.ts +2 -2
  697. package/src/runtime/emit/binary.ts +26 -8
  698. package/src/runtime/emit/cache.ts +2 -2
  699. package/src/runtime/emit/cast.ts +2 -2
  700. package/src/runtime/emit/constraint-check.ts +148 -26
  701. package/src/runtime/emit/create-assertion.ts +82 -0
  702. package/src/runtime/emit/cte-reference.ts +2 -2
  703. package/src/runtime/emit/cte.ts +2 -2
  704. package/src/runtime/emit/distinct.ts +2 -2
  705. package/src/runtime/emit/dml-executor.ts +20 -12
  706. package/src/runtime/emit/drop-assertion.ts +45 -0
  707. package/src/runtime/emit/filter.ts +4 -4
  708. package/src/runtime/emit/join.ts +8 -7
  709. package/src/runtime/emit/limit-offset.ts +2 -2
  710. package/src/runtime/emit/pragma.ts +2 -2
  711. package/src/runtime/emit/project.ts +2 -2
  712. package/src/runtime/emit/recursive-cte.ts +2 -2
  713. package/src/runtime/emit/remote-query.ts +47 -0
  714. package/src/runtime/emit/retrieve.ts +15 -0
  715. package/src/runtime/emit/returning.ts +4 -4
  716. package/src/runtime/emit/scalar-function.ts +2 -2
  717. package/src/runtime/emit/scan.ts +29 -13
  718. package/src/runtime/emit/schema-declarative.ts +205 -0
  719. package/src/runtime/emit/sequencing.ts +3 -3
  720. package/src/runtime/emit/set-operation.ts +7 -7
  721. package/src/runtime/emit/sort.ts +2 -2
  722. package/src/runtime/emit/subquery.ts +10 -10
  723. package/src/runtime/emit/transaction.ts +46 -8
  724. package/src/runtime/emit/values.ts +2 -2
  725. package/src/runtime/emit/window.ts +3 -3
  726. package/src/runtime/emitters.ts +1 -0
  727. package/src/runtime/register.ts +150 -135
  728. package/src/runtime/scheduler.ts +2 -2
  729. package/src/runtime/types.ts +10 -7
  730. package/src/runtime/utils.ts +3 -2
  731. package/src/schema/assertion.ts +21 -0
  732. package/src/schema/catalog.ts +208 -0
  733. package/src/schema/change-events.ts +2 -2
  734. package/src/schema/column.ts +2 -0
  735. package/src/schema/declared-schema-manager.ts +82 -0
  736. package/src/schema/function.ts +5 -2
  737. package/src/schema/manager.ts +742 -709
  738. package/src/schema/schema-differ.ts +214 -0
  739. package/src/schema/schema-hasher.ts +44 -0
  740. package/src/schema/schema.ts +23 -0
  741. package/src/schema/table.ts +398 -364
  742. package/src/schema/window-function.ts +2 -0
  743. package/src/util/ast-stringify.ts +869 -764
  744. package/src/util/environment.ts +2 -2
  745. package/src/util/plugin-loader.ts +232 -7
  746. package/src/util/row-descriptor.ts +1 -1
  747. package/src/util/serialization.ts +2 -0
  748. package/src/vtab/best-access-plan.ts +2 -1
  749. package/src/vtab/manifest.ts +1 -0
  750. package/src/vtab/memory/index.ts +178 -178
  751. package/src/vtab/memory/layer/base.ts +275 -273
  752. package/src/vtab/memory/layer/interface.ts +47 -47
  753. package/src/vtab/memory/layer/manager.ts +33 -11
  754. package/src/vtab/memory/layer/safe-iterate.ts +3 -3
  755. package/src/vtab/memory/layer/transaction.ts +229 -229
  756. package/src/vtab/memory/module.ts +24 -18
  757. package/src/vtab/memory/table.ts +256 -253
  758. package/src/vtab/memory/utils/logging.ts +6 -3
  759. package/src/vtab/module.ts +170 -140
  760. package/src/vtab/table.ts +162 -143
@@ -1,273 +1,275 @@
1
- import { BTree } from 'inheritree';
2
- import type { TableSchema } from '../../../schema/table.js';
3
- import type { BTreeKeyForPrimary, BTreeKeyForIndex, MemoryIndexEntry } from '../types.js';
4
- import type { Layer } from './interface.js';
5
- import { MemoryIndex } from '../index.js';
6
- import { safeJsonStringify } from '../../../util/serialization.js';
7
- import type { Row, SqlValue } from '../../../common/types.js';
8
- import { type ColumnSchema } from '../../../schema/column.js';
9
- import type { IndexSchema } from '../../../schema/table.js';
10
- import { createPrimaryKeyFunctions, type PrimaryKeyFunctions } from '../utils/primary-key.js';
11
- import { createMemoryTableLoggers } from '../utils/logging.js';
12
-
13
- let baseLayerCounter = 0;
14
- const logger = createMemoryTableLoggers('layer:base');
15
-
16
- export class BaseLayer implements Layer {
17
- private readonly layerId: number;
18
- public tableSchema: TableSchema;
19
- private primaryKeyFunctions!: PrimaryKeyFunctions;
20
- public primaryTree: BTree<BTreeKeyForPrimary, Row>;
21
- public readonly secondaryIndexes: Map<string, MemoryIndex>;
22
-
23
- constructor(schema: TableSchema) {
24
- this.layerId = baseLayerCounter++;
25
- this.tableSchema = schema;
26
- this.initializePrimaryKeyFunctions();
27
-
28
- // Use the same key extraction pattern as TransactionLayer for consistency
29
- const btreeKeyFromValue = (value: Row): BTreeKeyForPrimary =>
30
- this.primaryKeyFunctions.extractFromRow(value);
31
-
32
- this.primaryTree = new BTree<BTreeKeyForPrimary, Row>(
33
- btreeKeyFromValue,
34
- this.primaryKeyFunctions.compare
35
- );
36
- this.secondaryIndexes = new Map();
37
- this.rebuildAllSecondaryIndexes();
38
- }
39
-
40
- public updateSchema(newSchema: TableSchema): void {
41
- logger.operation('Schema Update', this.tableSchema.name, {
42
- from: this.tableSchema.name,
43
- to: newSchema.name
44
- });
45
- this.tableSchema = newSchema;
46
- this.initializePrimaryKeyFunctions();
47
- }
48
-
49
- private initializePrimaryKeyFunctions(): void {
50
- this.primaryKeyFunctions = createPrimaryKeyFunctions(this.tableSchema);
51
- }
52
-
53
- public rebuildAllSecondaryIndexes(): void {
54
- this.clearExistingSecondaryIndexes();
55
-
56
- if (!this.hasSecondaryIndexes()) {
57
- return;
58
- }
59
-
60
- const newIndexes = this.createSecondaryIndexes();
61
- this.populateSecondaryIndexes(newIndexes);
62
- this.replaceSecondaryIndexes(newIndexes);
63
- }
64
-
65
- private clearExistingSecondaryIndexes(): void {
66
- this.secondaryIndexes.forEach(index => index.clear());
67
- }
68
-
69
- private hasSecondaryIndexes(): boolean {
70
- return Boolean(this.tableSchema.indexes && this.tableSchema.indexes.length > 0);
71
- }
72
-
73
- private createSecondaryIndexes(): Map<string, MemoryIndex> {
74
- const newIndexes = new Map<string, MemoryIndex>();
75
-
76
- for (const indexSchema of this.tableSchema.indexes!) {
77
- try {
78
- const memoryIndex = new MemoryIndex(indexSchema, this.tableSchema.columns);
79
- newIndexes.set(indexSchema.name, memoryIndex);
80
- } catch (e: any) {
81
- logger.error('Create Index', this.tableSchema.name, e, { indexName: indexSchema.name });
82
- }
83
- }
84
-
85
- return newIndexes;
86
- }
87
-
88
- private populateSecondaryIndexes(newIndexes: Map<string, MemoryIndex>): void {
89
- for (const path of this.primaryTree.ascending(this.primaryTree.first())) {
90
- const row = this.primaryTree.at(path)!;
91
- this.addRowToSecondaryIndexes(row, newIndexes);
92
- }
93
- }
94
-
95
- private addRowToSecondaryIndexes(row: Row, indexes: Map<string, MemoryIndex>): void {
96
- const primaryKey = this.primaryKeyFunctions.extractFromRow(row);
97
-
98
- indexes.forEach(index => {
99
- try {
100
- const indexKey = index.keyFromRow(row);
101
- index.addEntry(indexKey, primaryKey);
102
- } catch (e: any) {
103
- logger.error('Re-index Row', this.tableSchema.name, e, { indexName: index.name });
104
- }
105
- });
106
- }
107
-
108
- private replaceSecondaryIndexes(newIndexes: Map<string, MemoryIndex>): void {
109
- this.secondaryIndexes.clear();
110
- newIndexes.forEach((idx, name) => this.secondaryIndexes.set(name, idx));
111
- }
112
-
113
- getLayerId = (): number => this.layerId;
114
- getParent = (): Layer | null => null;
115
- getSchema = (): TableSchema => this.tableSchema;
116
- isCommitted = (): boolean => true;
117
-
118
- getModificationTree = (indexName: string | 'primary'): BTree<BTreeKeyForPrimary, Row> | null =>
119
- indexName === 'primary' ? this.primaryTree : null;
120
-
121
- getSecondaryIndexTree = (indexName: string): BTree<BTreeKeyForIndex, MemoryIndexEntry> | null =>
122
- this.secondaryIndexes.get(indexName)?.data ?? null;
123
-
124
- public getPkExtractorsAndComparators(schema: TableSchema): {
125
- primaryKeyExtractorFromRow: (row: Row) => BTreeKeyForPrimary;
126
- primaryKeyComparator: (a: BTreeKeyForPrimary, b: BTreeKeyForPrimary) => number
127
- } {
128
- if (schema !== this.tableSchema) {
129
- logger.warn('PK Extractors', this.tableSchema.name, 'Called with different schema');
130
- }
131
- return {
132
- primaryKeyExtractorFromRow: this.primaryKeyFunctions.extractFromRow,
133
- primaryKeyComparator: this.primaryKeyFunctions.compare
134
- };
135
- }
136
-
137
- applyChange(
138
- primaryKey: BTreeKeyForPrimary,
139
- modification: Row,
140
- secondaryIndexChanges: Map<string, Array<{op: 'ADD' | 'DELETE', indexKey: BTreeKeyForIndex}>>
141
- ): void {
142
- this.applySecondaryIndexChanges(primaryKey, secondaryIndexChanges);
143
- this.applyPrimaryChange(primaryKey, modification);
144
- }
145
-
146
- private applySecondaryIndexChanges(
147
- primaryKey: BTreeKeyForPrimary,
148
- secondaryIndexChanges: Map<string, Array<{op: 'ADD' | 'DELETE', indexKey: BTreeKeyForIndex}>>
149
- ): void {
150
- secondaryIndexChanges.forEach((changes, indexName) => {
151
- const memoryIndex = this.secondaryIndexes.get(indexName);
152
- if (!memoryIndex) {
153
- logger.warn('Apply Change', this.tableSchema.name, 'Secondary index not found', {
154
- indexName,
155
- primaryKey: safeJsonStringify(primaryKey)
156
- });
157
- return;
158
- }
159
-
160
- changes.forEach(change => {
161
- if (change.op === 'DELETE') {
162
- memoryIndex.removeEntry(change.indexKey, primaryKey);
163
- } else {
164
- memoryIndex.addEntry(change.indexKey, primaryKey);
165
- }
166
- });
167
- });
168
- }
169
-
170
- private applyPrimaryChange(primaryKey: BTreeKeyForPrimary, modification: Row): void {
171
- this.primaryTree.insert(modification);
172
- }
173
-
174
- has = (key: BTreeKeyForPrimary): boolean => {
175
- const value = this.primaryTree.get(key);
176
- return value !== undefined;
177
- };
178
-
179
- async addColumnToBase(newColumnSchema: ColumnSchema, defaultValue: SqlValue): Promise<void> {
180
- logger.operation('Add Column', this.tableSchema.name, {
181
- columnName: newColumnSchema.name,
182
- defaultValue
183
- });
184
-
185
- const oldPrimaryTree = this.primaryTree;
186
-
187
- // First, reinitialize primary key functions with the updated schema (which already includes the new column)
188
- this.initializePrimaryKeyFunctions();
189
-
190
- // Create new primary tree with the updated schema and migrate data
191
- this.recreatePrimaryTreeWithNewColumn(oldPrimaryTree, defaultValue);
192
-
193
- this.rebuildAllSecondaryIndexes();
194
- }
195
-
196
- private recreatePrimaryTreeWithNewColumn(
197
- oldTree: BTree<BTreeKeyForPrimary, Row>,
198
- defaultValue: SqlValue
199
- ): void {
200
- // Use the updated primary key functions for the new tree
201
- const btreeKeyFromValue = (value: Row): BTreeKeyForPrimary =>
202
- this.primaryKeyFunctions.extractFromRow(value);
203
-
204
- this.primaryTree = new BTree<BTreeKeyForPrimary, Row>(
205
- btreeKeyFromValue,
206
- this.primaryKeyFunctions.compare
207
- );
208
-
209
- for (const path of oldTree.ascending(oldTree.first())) {
210
- const oldRow = oldTree.at(path)!;
211
- const newRow = [...oldRow, defaultValue];
212
- this.primaryTree.insert(newRow);
213
- }
214
- }
215
-
216
- async dropColumnFromBase(columnIndexInOldSchema: number): Promise<void> {
217
- logger.operation('Drop Column', this.tableSchema.name, {
218
- columnIndex: columnIndexInOldSchema
219
- });
220
-
221
- const oldPrimaryTree = this.primaryTree;
222
- this.recreatePrimaryTreeWithoutColumn(oldPrimaryTree, columnIndexInOldSchema);
223
- await this.rebuildAllSecondaryIndexes();
224
- }
225
-
226
- private recreatePrimaryTreeWithoutColumn(oldTree: BTree<BTreeKeyForPrimary, Row>, columnIndex: number): void {
227
- const btreeKeyFromValue = (value: Row): BTreeKeyForPrimary =>
228
- this.primaryKeyFunctions.extractFromRow(value);
229
-
230
- this.primaryTree = new BTree<BTreeKeyForPrimary, Row>(
231
- btreeKeyFromValue,
232
- this.primaryKeyFunctions.compare
233
- );
234
-
235
- for (const path of oldTree.ascending(oldTree.first())) {
236
- const oldRow = oldTree.at(path)!;
237
- const newRow = oldRow.filter((_, idx) => idx !== columnIndex);
238
- this.primaryTree.insert(newRow);
239
- }
240
- }
241
-
242
- async handleColumnRename(): Promise<void> {
243
- logger.operation('Handle Column Rename', this.tableSchema.name);
244
- await this.rebuildAllSecondaryIndexes();
245
- }
246
-
247
- async addIndexToBase(indexSchema: IndexSchema): Promise<void> {
248
- logger.operation('Add Index', this.tableSchema.name, {
249
- indexName: indexSchema.name
250
- });
251
-
252
- const newMemoryIndex = new MemoryIndex(indexSchema, this.tableSchema.columns);
253
- this.populateNewIndex(newMemoryIndex);
254
- this.secondaryIndexes.set(indexSchema.name, newMemoryIndex);
255
- }
256
-
257
- private populateNewIndex(newIndex: MemoryIndex): void {
258
- for (const path of this.primaryTree.ascending(this.primaryTree.first())) {
259
- const currentRow = this.primaryTree.at(path)!;
260
- const indexKey = newIndex.keyFromRow(currentRow);
261
- const primaryKey = this.primaryKeyFunctions.extractFromRow(currentRow);
262
- newIndex.addEntry(indexKey, primaryKey);
263
- }
264
- }
265
-
266
- async dropIndexFromBase(indexName: string): Promise<void> {
267
- if (this.secondaryIndexes.delete(indexName)) {
268
- logger.operation('Drop Index', this.tableSchema.name, { indexName });
269
- } else {
270
- logger.warn('Drop Index', this.tableSchema.name, 'Index not found', { indexName });
271
- }
272
- }
273
- }
1
+ import { BTree } from 'inheritree';
2
+ import type { TableSchema } from '../../../schema/table.js';
3
+ import type { BTreeKeyForPrimary, BTreeKeyForIndex, MemoryIndexEntry } from '../types.js';
4
+ import type { Layer } from './interface.js';
5
+ import { MemoryIndex } from '../index.js';
6
+ import { safeJsonStringify } from '../../../util/serialization.js';
7
+ import type { Row, SqlValue } from '../../../common/types.js';
8
+ import { type ColumnSchema } from '../../../schema/column.js';
9
+ import type { IndexSchema } from '../../../schema/table.js';
10
+ import { createPrimaryKeyFunctions, type PrimaryKeyFunctions } from '../utils/primary-key.js';
11
+ import { createMemoryTableLoggers } from '../utils/logging.js';
12
+
13
+ let baseLayerCounter = 0;
14
+ const logger = createMemoryTableLoggers('layer:base');
15
+
16
+ export class BaseLayer implements Layer {
17
+ private readonly layerId: number;
18
+ public tableSchema: TableSchema;
19
+ private primaryKeyFunctions!: PrimaryKeyFunctions;
20
+ public primaryTree: BTree<BTreeKeyForPrimary, Row>;
21
+ public readonly secondaryIndexes: Map<string, MemoryIndex>;
22
+
23
+ constructor(schema: TableSchema) {
24
+ this.layerId = baseLayerCounter++;
25
+ this.tableSchema = schema;
26
+ this.initializePrimaryKeyFunctions();
27
+
28
+ // Use the same key extraction pattern as TransactionLayer for consistency
29
+ const btreeKeyFromValue = (value: Row): BTreeKeyForPrimary =>
30
+ this.primaryKeyFunctions.extractFromRow(value);
31
+
32
+ this.primaryTree = new BTree<BTreeKeyForPrimary, Row>(
33
+ btreeKeyFromValue,
34
+ this.primaryKeyFunctions.compare
35
+ );
36
+ this.secondaryIndexes = new Map();
37
+ this.rebuildAllSecondaryIndexes();
38
+ }
39
+
40
+ public updateSchema(newSchema: TableSchema): void {
41
+ logger.operation('Schema Update', this.tableSchema.name, {
42
+ from: this.tableSchema.name,
43
+ to: newSchema.name
44
+ });
45
+ this.tableSchema = newSchema;
46
+ this.initializePrimaryKeyFunctions();
47
+ }
48
+
49
+ private initializePrimaryKeyFunctions(): void {
50
+ this.primaryKeyFunctions = createPrimaryKeyFunctions(this.tableSchema);
51
+ }
52
+
53
+ public rebuildAllSecondaryIndexes(): void {
54
+ this.clearExistingSecondaryIndexes();
55
+
56
+ if (!this.hasSecondaryIndexes()) {
57
+ return;
58
+ }
59
+
60
+ const newIndexes = this.createSecondaryIndexes();
61
+ this.populateSecondaryIndexes(newIndexes);
62
+ this.replaceSecondaryIndexes(newIndexes);
63
+ }
64
+
65
+ private clearExistingSecondaryIndexes(): void {
66
+ this.secondaryIndexes.forEach(index => index.clear());
67
+ }
68
+
69
+ private hasSecondaryIndexes(): boolean {
70
+ return Boolean(this.tableSchema.indexes && this.tableSchema.indexes.length > 0);
71
+ }
72
+
73
+ private createSecondaryIndexes(): Map<string, MemoryIndex> {
74
+ const newIndexes = new Map<string, MemoryIndex>();
75
+
76
+ for (const indexSchema of this.tableSchema.indexes!) {
77
+ try {
78
+ const memoryIndex = new MemoryIndex(indexSchema, this.tableSchema.columns);
79
+ newIndexes.set(indexSchema.name, memoryIndex);
80
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
81
+ } catch (e: any) {
82
+ logger.error('Create Index', this.tableSchema.name, e, { indexName: indexSchema.name });
83
+ }
84
+ }
85
+
86
+ return newIndexes;
87
+ }
88
+
89
+ private populateSecondaryIndexes(newIndexes: Map<string, MemoryIndex>): void {
90
+ for (const path of this.primaryTree.ascending(this.primaryTree.first())) {
91
+ const row = this.primaryTree.at(path)!;
92
+ this.addRowToSecondaryIndexes(row, newIndexes);
93
+ }
94
+ }
95
+
96
+ private addRowToSecondaryIndexes(row: Row, indexes: Map<string, MemoryIndex>): void {
97
+ const primaryKey = this.primaryKeyFunctions.extractFromRow(row);
98
+
99
+ indexes.forEach(index => {
100
+ try {
101
+ const indexKey = index.keyFromRow(row);
102
+ index.addEntry(indexKey, primaryKey);
103
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
104
+ } catch (e: any) {
105
+ logger.error('Re-index Row', this.tableSchema.name, e, { indexName: index.name });
106
+ }
107
+ });
108
+ }
109
+
110
+ private replaceSecondaryIndexes(newIndexes: Map<string, MemoryIndex>): void {
111
+ this.secondaryIndexes.clear();
112
+ newIndexes.forEach((idx, name) => this.secondaryIndexes.set(name, idx));
113
+ }
114
+
115
+ getLayerId = (): number => this.layerId;
116
+ getParent = (): Layer | null => null;
117
+ getSchema = (): TableSchema => this.tableSchema;
118
+ isCommitted = (): boolean => true;
119
+
120
+ getModificationTree = (indexName: string | 'primary'): BTree<BTreeKeyForPrimary, Row> | null =>
121
+ indexName === 'primary' ? this.primaryTree : null;
122
+
123
+ getSecondaryIndexTree = (indexName: string): BTree<BTreeKeyForIndex, MemoryIndexEntry> | null =>
124
+ this.secondaryIndexes.get(indexName)?.data ?? null;
125
+
126
+ public getPkExtractorsAndComparators(schema: TableSchema): {
127
+ primaryKeyExtractorFromRow: (row: Row) => BTreeKeyForPrimary;
128
+ primaryKeyComparator: (a: BTreeKeyForPrimary, b: BTreeKeyForPrimary) => number
129
+ } {
130
+ if (schema !== this.tableSchema) {
131
+ logger.warn('PK Extractors', this.tableSchema.name, 'Called with different schema');
132
+ }
133
+ return {
134
+ primaryKeyExtractorFromRow: this.primaryKeyFunctions.extractFromRow,
135
+ primaryKeyComparator: this.primaryKeyFunctions.compare
136
+ };
137
+ }
138
+
139
+ applyChange(
140
+ primaryKey: BTreeKeyForPrimary,
141
+ modification: Row,
142
+ secondaryIndexChanges: Map<string, Array<{op: 'ADD' | 'DELETE', indexKey: BTreeKeyForIndex}>>
143
+ ): void {
144
+ this.applySecondaryIndexChanges(primaryKey, secondaryIndexChanges);
145
+ this.applyPrimaryChange(primaryKey, modification);
146
+ }
147
+
148
+ private applySecondaryIndexChanges(
149
+ primaryKey: BTreeKeyForPrimary,
150
+ secondaryIndexChanges: Map<string, Array<{op: 'ADD' | 'DELETE', indexKey: BTreeKeyForIndex}>>
151
+ ): void {
152
+ secondaryIndexChanges.forEach((changes, indexName) => {
153
+ const memoryIndex = this.secondaryIndexes.get(indexName);
154
+ if (!memoryIndex) {
155
+ logger.warn('Apply Change', this.tableSchema.name, 'Secondary index not found', {
156
+ indexName,
157
+ primaryKey: safeJsonStringify(primaryKey)
158
+ });
159
+ return;
160
+ }
161
+
162
+ changes.forEach(change => {
163
+ if (change.op === 'DELETE') {
164
+ memoryIndex.removeEntry(change.indexKey, primaryKey);
165
+ } else {
166
+ memoryIndex.addEntry(change.indexKey, primaryKey);
167
+ }
168
+ });
169
+ });
170
+ }
171
+
172
+ private applyPrimaryChange(primaryKey: BTreeKeyForPrimary, modification: Row): void {
173
+ this.primaryTree.insert(modification);
174
+ }
175
+
176
+ has = (key: BTreeKeyForPrimary): boolean => {
177
+ const value = this.primaryTree.get(key);
178
+ return value !== undefined;
179
+ };
180
+
181
+ async addColumnToBase(newColumnSchema: ColumnSchema, defaultValue: SqlValue): Promise<void> {
182
+ logger.operation('Add Column', this.tableSchema.name, {
183
+ columnName: newColumnSchema.name,
184
+ defaultValue
185
+ });
186
+
187
+ const oldPrimaryTree = this.primaryTree;
188
+
189
+ // First, reinitialize primary key functions with the updated schema (which already includes the new column)
190
+ this.initializePrimaryKeyFunctions();
191
+
192
+ // Create new primary tree with the updated schema and migrate data
193
+ this.recreatePrimaryTreeWithNewColumn(oldPrimaryTree, defaultValue);
194
+
195
+ this.rebuildAllSecondaryIndexes();
196
+ }
197
+
198
+ private recreatePrimaryTreeWithNewColumn(
199
+ oldTree: BTree<BTreeKeyForPrimary, Row>,
200
+ defaultValue: SqlValue
201
+ ): void {
202
+ // Use the updated primary key functions for the new tree
203
+ const btreeKeyFromValue = (value: Row): BTreeKeyForPrimary =>
204
+ this.primaryKeyFunctions.extractFromRow(value);
205
+
206
+ this.primaryTree = new BTree<BTreeKeyForPrimary, Row>(
207
+ btreeKeyFromValue,
208
+ this.primaryKeyFunctions.compare
209
+ );
210
+
211
+ for (const path of oldTree.ascending(oldTree.first())) {
212
+ const oldRow = oldTree.at(path)!;
213
+ const newRow = [...oldRow, defaultValue];
214
+ this.primaryTree.insert(newRow);
215
+ }
216
+ }
217
+
218
+ async dropColumnFromBase(columnIndexInOldSchema: number): Promise<void> {
219
+ logger.operation('Drop Column', this.tableSchema.name, {
220
+ columnIndex: columnIndexInOldSchema
221
+ });
222
+
223
+ const oldPrimaryTree = this.primaryTree;
224
+ this.recreatePrimaryTreeWithoutColumn(oldPrimaryTree, columnIndexInOldSchema);
225
+ await this.rebuildAllSecondaryIndexes();
226
+ }
227
+
228
+ private recreatePrimaryTreeWithoutColumn(oldTree: BTree<BTreeKeyForPrimary, Row>, columnIndex: number): void {
229
+ const btreeKeyFromValue = (value: Row): BTreeKeyForPrimary =>
230
+ this.primaryKeyFunctions.extractFromRow(value);
231
+
232
+ this.primaryTree = new BTree<BTreeKeyForPrimary, Row>(
233
+ btreeKeyFromValue,
234
+ this.primaryKeyFunctions.compare
235
+ );
236
+
237
+ for (const path of oldTree.ascending(oldTree.first())) {
238
+ const oldRow = oldTree.at(path)!;
239
+ const newRow = oldRow.filter((_, idx) => idx !== columnIndex);
240
+ this.primaryTree.insert(newRow);
241
+ }
242
+ }
243
+
244
+ async handleColumnRename(): Promise<void> {
245
+ logger.operation('Handle Column Rename', this.tableSchema.name);
246
+ await this.rebuildAllSecondaryIndexes();
247
+ }
248
+
249
+ async addIndexToBase(indexSchema: IndexSchema): Promise<void> {
250
+ logger.operation('Add Index', this.tableSchema.name, {
251
+ indexName: indexSchema.name
252
+ });
253
+
254
+ const newMemoryIndex = new MemoryIndex(indexSchema, this.tableSchema.columns);
255
+ this.populateNewIndex(newMemoryIndex);
256
+ this.secondaryIndexes.set(indexSchema.name, newMemoryIndex);
257
+ }
258
+
259
+ private populateNewIndex(newIndex: MemoryIndex): void {
260
+ for (const path of this.primaryTree.ascending(this.primaryTree.first())) {
261
+ const currentRow = this.primaryTree.at(path)!;
262
+ const indexKey = newIndex.keyFromRow(currentRow);
263
+ const primaryKey = this.primaryKeyFunctions.extractFromRow(currentRow);
264
+ newIndex.addEntry(indexKey, primaryKey);
265
+ }
266
+ }
267
+
268
+ async dropIndexFromBase(indexName: string): Promise<void> {
269
+ if (this.secondaryIndexes.delete(indexName)) {
270
+ logger.operation('Drop Index', this.tableSchema.name, { indexName });
271
+ } else {
272
+ logger.warn('Drop Index', this.tableSchema.name, 'Index not found', { indexName });
273
+ }
274
+ }
275
+ }
@@ -1,47 +1,47 @@
1
- import type { BTree } from 'inheritree';
2
- import type { TableSchema } from '../../../schema/table.js';
3
- import type { BTreeKeyForPrimary, BTreeKeyForIndex, MemoryIndexEntry } from '../types.js';
4
- import type { Row } from '../../../common/types.js';
5
-
6
- /**
7
- * Represents a snapshot or a set of changes in the MemoryTable MVCC model.
8
- * Layers form a chain, starting from a BaseLayer.
9
- */
10
- export interface Layer {
11
- /** Returns the layer ID (unique identifier, potentially timestamp or sequence) */
12
- getLayerId(): number;
13
-
14
- /** Returns the parent layer in the chain, or null for the BaseLayer */
15
- getParent(): Layer | null;
16
-
17
- /**
18
- * Gets the BTree containing modifications specific to this layer for a given index.
19
- * For BaseLayer, this returns the main data BTree.
20
- * For TransactionLayer, this returns the inherited BTree for that index.
21
- *
22
- * @param indexName The name of the secondary index, or 'primary' for the primary key index.
23
- * @returns The BTree containing modifications/data for the index in this layer, or null if no modifications exist for that index in this layer.
24
- */
25
- getModificationTree(indexName: string | 'primary'): BTree<BTreeKeyForPrimary, Row> | null;
26
-
27
- /**
28
- * Returns the table schema as it existed when this layer was created or relevant.
29
- * This is important for interpreting modifications during layer collapse, especially
30
- * if schema changes occurred after this layer was created.
31
- */
32
- getSchema(): TableSchema;
33
-
34
- /** Indicates if this layer represents a committed transaction state */
35
- isCommitted(): boolean;
36
-
37
- /** Helper to get the specific BTree for a secondary index's underlying data */
38
- getSecondaryIndexTree?(indexName: string): BTree<BTreeKeyForIndex, MemoryIndexEntry> | null;
39
-
40
- /**
41
- * This method provides PK extractor and comparator based on a given schema (usually its own)
42
- */
43
- getPkExtractorsAndComparators(schema: TableSchema): {
44
- primaryKeyExtractorFromRow: (row: Row) => BTreeKeyForPrimary;
45
- primaryKeyComparator: (a: BTreeKeyForPrimary, b: BTreeKeyForPrimary) => number;
46
- };
47
- }
1
+ import type { BTree } from 'inheritree';
2
+ import type { TableSchema } from '../../../schema/table.js';
3
+ import type { BTreeKeyForPrimary, BTreeKeyForIndex, MemoryIndexEntry } from '../types.js';
4
+ import type { Row } from '../../../common/types.js';
5
+
6
+ /**
7
+ * Represents a snapshot or a set of changes in the MemoryTable MVCC model.
8
+ * Layers form a chain, starting from a BaseLayer.
9
+ */
10
+ export interface Layer {
11
+ /** Returns the layer ID (unique identifier, potentially timestamp or sequence) */
12
+ getLayerId(): number;
13
+
14
+ /** Returns the parent layer in the chain, or null for the BaseLayer */
15
+ getParent(): Layer | null;
16
+
17
+ /**
18
+ * Gets the BTree containing modifications specific to this layer for a given index.
19
+ * For BaseLayer, this returns the main data BTree.
20
+ * For TransactionLayer, this returns the inherited BTree for that index.
21
+ *
22
+ * @param indexName The name of the secondary index, or 'primary' for the primary key index.
23
+ * @returns The BTree containing modifications/data for the index in this layer, or null if no modifications exist for that index in this layer.
24
+ */
25
+ getModificationTree(indexName: string | 'primary'): BTree<BTreeKeyForPrimary, Row> | null;
26
+
27
+ /**
28
+ * Returns the table schema as it existed when this layer was created or relevant.
29
+ * This is important for interpreting modifications during layer collapse, especially
30
+ * if schema changes occurred after this layer was created.
31
+ */
32
+ getSchema(): TableSchema;
33
+
34
+ /** Indicates if this layer represents a committed transaction state */
35
+ isCommitted(): boolean;
36
+
37
+ /** Helper to get the specific BTree for a secondary index's underlying data */
38
+ getSecondaryIndexTree?(indexName: string): BTree<BTreeKeyForIndex, MemoryIndexEntry> | null;
39
+
40
+ /**
41
+ * This method provides PK extractor and comparator based on a given schema (usually its own)
42
+ */
43
+ getPkExtractorsAndComparators(schema: TableSchema): {
44
+ primaryKeyExtractorFromRow: (row: Row) => BTreeKeyForPrimary;
45
+ primaryKeyComparator: (a: BTreeKeyForPrimary, b: BTreeKeyForPrimary) => number;
46
+ };
47
+ }