@quereus/quereus 0.2.1 → 0.4.0

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 -0
  539. package/dist/src/util/plugin-loader.d.ts.map +1 -1
  540. package/dist/src/util/plugin-loader.js +137 -0
  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 +184 -0
  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,130 +1,394 @@
1
1
  /**
2
- * Constraint extraction utilities for predicate analysis and VTab.xBestIndex
2
+ * Constraint extraction utilities for predicate analysis and pushdown optimization
3
3
  * Converts scalar expressions into constraints that can be pushed down to virtual tables
4
4
  */
5
5
  import { PlanNodeType } from '../nodes/plan-node-type.js';
6
+ import { BinaryOpNode } from '../nodes/scalar.js';
7
+ import { createLogger } from '../../common/logger.js';
8
+ import { getSyncLiteral } from '../../parser/utils.js';
9
+ import { TableReferenceNode } from '../nodes/reference.js';
10
+ import { CapabilityDetectors } from '../framework/characteristics.js';
11
+ const log = createLogger('planner:analysis:constraint-extractor');
6
12
  /**
7
13
  * Extract constraints from a scalar predicate expression
8
- * Currently handles simple binary comparisons and basic boolean logic
14
+ * Handles binary comparisons, boolean logic (AND/OR), and complex expressions
9
15
  */
10
- export function extractConstraints(predicate, columnAttributeToIndex) {
11
- const constraints = [];
16
+ export function extractConstraints(predicate, tableInfos = []) {
17
+ const constraintsByTable = new Map();
18
+ const allConstraints = [];
12
19
  const residualExpressions = [];
13
- // Start extraction process
14
- extractFromExpression(predicate, constraints, residualExpressions, columnAttributeToIndex);
15
- // Build residual predicate from unmatched expressions
20
+ log('Extracting constraints from predicate: %s', predicate.toString());
21
+ // Build attribute-to-table mapping for quick lookups
22
+ const tableByAttribute = new Map();
23
+ for (const tableInfo of tableInfos) {
24
+ for (const attr of tableInfo.attributes) {
25
+ tableByAttribute.set(attr.id, tableInfo);
26
+ }
27
+ }
28
+ // Start extraction process & build supported fragments per table
29
+ const perTableParts = new Map();
30
+ extractFromExpression(predicate, allConstraints, residualExpressions, tableByAttribute, perTableParts);
31
+ // Group constraints by table instance key
32
+ for (const constraint of allConstraints) {
33
+ if (constraint.targetRelation) {
34
+ if (!constraintsByTable.has(constraint.targetRelation)) {
35
+ constraintsByTable.set(constraint.targetRelation, []);
36
+ }
37
+ constraintsByTable.get(constraint.targetRelation).push(constraint);
38
+ }
39
+ }
40
+ // Build residual predicate from unmatched expressions (combine with AND)
16
41
  let residualPredicate;
17
42
  if (residualExpressions.length === 1) {
18
43
  residualPredicate = residualExpressions[0];
19
44
  }
20
45
  else if (residualExpressions.length > 1) {
21
- // For now, combine with AND - more sophisticated logic can be added later
22
- residualPredicate = combineWithAnd(residualExpressions);
46
+ let acc = residualExpressions[0];
47
+ for (let i = 1; i < residualExpressions.length; i++) {
48
+ const right = residualExpressions[i];
49
+ const ast = { type: 'binary', operator: 'AND', left: acc.expression, right: right.expression };
50
+ acc = new BinaryOpNode(acc.scope, ast, acc, right);
51
+ }
52
+ residualPredicate = acc;
53
+ }
54
+ log('Extracted %d constraints across %d tables, %d residual expressions', allConstraints.length, constraintsByTable.size, residualExpressions.length);
55
+ const supportedPredicateByTable = new Map();
56
+ for (const [rel, parts] of perTableParts) {
57
+ const combined = combineParts(parts);
58
+ if (combined)
59
+ supportedPredicateByTable.set(rel, combined);
60
+ }
61
+ // Compute covered keys per table: collect equality constraints and check against table unique keys
62
+ const coveredKeysByTable = new Map();
63
+ for (const [rel, constraints] of constraintsByTable) {
64
+ const tInfo = tableInfos.find(t => t.relationKey === rel || t.relationName === rel);
65
+ if (!tInfo || !tInfo.uniqueKeys || tInfo.uniqueKeys.length === 0) {
66
+ coveredKeysByTable.set(rel, []);
67
+ continue;
68
+ }
69
+ const eqCols = new Set();
70
+ for (const c of constraints) {
71
+ if (c.op === '=') {
72
+ eqCols.add(c.columnIndex);
73
+ }
74
+ // Single-value IN could be treated as equality
75
+ if (c.op === 'IN' && Array.isArray(c.value) && c.value.length === 1) {
76
+ eqCols.add(c.columnIndex);
77
+ }
78
+ }
79
+ const covered = [];
80
+ for (const key of tInfo.uniqueKeys) {
81
+ if (key.length === 0) {
82
+ // Zero-length key means at most one row; trivially covered
83
+ covered.push([]);
84
+ continue;
85
+ }
86
+ const allCovered = key.every(idx => eqCols.has(idx));
87
+ if (allCovered)
88
+ covered.push([...key]);
89
+ }
90
+ coveredKeysByTable.set(rel, covered);
23
91
  }
24
92
  return {
25
- constraints,
26
- residualPredicate
93
+ constraintsByTable,
94
+ residualPredicate,
95
+ allConstraints,
96
+ supportedPredicateByTable,
97
+ coveredKeysByTable
27
98
  };
28
99
  }
29
100
  /**
30
101
  * Recursively extract constraints from an expression
31
102
  */
32
- function extractFromExpression(expr, constraints, residual, columnAttributeToIndex) {
103
+ function extractFromExpression(expr, constraints, residual, attributeToTableMap, perTableParts) {
33
104
  // Handle AND expressions - recurse on both sides
34
105
  if (isAndExpression(expr)) {
35
- const children = getBinaryExpressionChildren(expr);
36
- if (children) {
37
- extractFromExpression(children.left, constraints, residual, columnAttributeToIndex);
38
- extractFromExpression(children.right, constraints, residual, columnAttributeToIndex);
106
+ const binaryOp = expr;
107
+ extractFromExpression(binaryOp.left, constraints, residual, attributeToTableMap, perTableParts);
108
+ extractFromExpression(binaryOp.right, constraints, residual, attributeToTableMap, perTableParts);
109
+ return;
110
+ }
111
+ // Handle OR expressions - for now, treat as residual (could be enhanced later)
112
+ if (isOrExpression(expr)) {
113
+ log('OR expression found, treating as residual: %s', expr.toString());
114
+ residual.push(expr);
115
+ return;
116
+ }
117
+ // BETWEEN → range constraints
118
+ if (expr.nodeType === PlanNodeType.Between) {
119
+ const c = extractBetweenConstraints(expr, attributeToTableMap);
120
+ if (c) {
121
+ constraints.push(...c);
122
+ addSupportedPart(expr, attributeToTableMap, perTableParts);
123
+ return;
124
+ }
125
+ }
126
+ // IN list → IN constraint (literals only)
127
+ if (expr.nodeType === PlanNodeType.In) {
128
+ const c = extractInConstraint(expr, attributeToTableMap);
129
+ if (c) {
130
+ constraints.push(c);
131
+ addSupportedPart(expr, attributeToTableMap, perTableParts);
39
132
  return;
40
133
  }
41
134
  }
42
135
  // Try to extract constraint from binary comparison
43
- const constraint = extractBinaryConstraint(expr, columnAttributeToIndex);
136
+ const constraint = extractBinaryConstraint(expr, attributeToTableMap);
44
137
  if (constraint) {
45
138
  constraints.push(constraint);
139
+ addSupportedPart(expr, attributeToTableMap, perTableParts);
140
+ log('Extracted constraint: %s %s %s (table: %s)', constraint.attributeId, constraint.op, constraint.value, constraint.targetRelation);
46
141
  }
47
142
  else {
48
143
  // Cannot convert to constraint - add to residual
144
+ log('Cannot extract constraint from expression, adding to residual: %s', expr.toString());
49
145
  residual.push(expr);
50
146
  }
51
147
  }
148
+ function addSupportedPart(expr, attributeToTableMap, perTableParts) {
149
+ // Determine target table by first column reference in expr; if absent, skip
150
+ const relKey = findTargetRelationKey(expr, attributeToTableMap);
151
+ if (!relKey)
152
+ return;
153
+ if (!perTableParts.has(relKey))
154
+ perTableParts.set(relKey, []);
155
+ perTableParts.get(relKey).push(expr);
156
+ }
157
+ function findTargetRelationKey(expr, attributeToTableMap) {
158
+ let found;
159
+ const stack = [expr];
160
+ while (stack.length) {
161
+ const n = stack.pop();
162
+ if (n.nodeType === PlanNodeType.ColumnReference) {
163
+ const attrId = n.attributeId;
164
+ const info = attributeToTableMap.get(attrId);
165
+ if (info)
166
+ return info.relationKey ?? info.relationName;
167
+ }
168
+ for (const c of n.getChildren()) {
169
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
170
+ stack.push(c);
171
+ }
172
+ }
173
+ return found;
174
+ }
175
+ function combineParts(parts) {
176
+ if (parts.length === 0)
177
+ return undefined;
178
+ if (parts.length === 1)
179
+ return parts[0];
180
+ // Combine with AND
181
+ let acc = parts[0];
182
+ for (let i = 1; i < parts.length; i++) {
183
+ const right = parts[i];
184
+ const ast = { type: 'binary', operator: 'AND', left: acc.expression, right: right.expression };
185
+ acc = new BinaryOpNode(acc.scope, ast, acc, right);
186
+ }
187
+ return acc;
188
+ }
52
189
  /**
53
190
  * Extract constraint from binary comparison expression
54
191
  */
55
- function extractBinaryConstraint(expr, columnAttributeToIndex) {
56
- const binaryInfo = getBinaryComparisonInfo(expr);
57
- if (!binaryInfo) {
192
+ function extractBinaryConstraint(expr, attributeToTableMap) {
193
+ // Must be a binary operation
194
+ if (expr.nodeType !== PlanNodeType.BinaryOp) {
58
195
  return null;
59
196
  }
60
- const { left, right, op } = binaryInfo;
197
+ const binaryOp = expr;
198
+ const { left, right } = binaryOp;
199
+ const operator = binaryOp.expression.operator;
61
200
  // Try column-constant pattern (column op constant)
62
201
  let columnRef = null;
63
202
  let constant;
64
- let constraintOp = op;
65
- if (isColumnReference(left) && isLiteralConstant(right)) {
203
+ let finalOp = null;
204
+ if (isColumnReference(left) && (isLiteralConstant(right) || isDynamicValue(right))) {
66
205
  columnRef = left;
67
- constant = getLiteralValue(right);
206
+ if (isLiteralConstant(right)) {
207
+ constant = getLiteralValue(right);
208
+ }
209
+ finalOp = mapOperatorToConstraint(operator, constant);
68
210
  }
69
- else if (isLiteralConstant(left) && isColumnReference(right)) {
211
+ else if ((isLiteralConstant(left) || isDynamicValue(left)) && isColumnReference(right)) {
70
212
  // Reverse pattern (constant op column) - flip operator
71
213
  columnRef = right;
72
- constant = getLiteralValue(left);
73
- constraintOp = flipOperator(op);
214
+ if (isLiteralConstant(left)) {
215
+ constant = getLiteralValue(left);
216
+ }
217
+ const baseOp = mapOperatorToConstraint(operator, constant);
218
+ finalOp = baseOp ? flipOperator(baseOp) : null;
74
219
  }
75
- if (!columnRef) {
220
+ if (!columnRef || !finalOp) {
221
+ log('No column-constant pattern found in binary expression');
76
222
  return null;
77
223
  }
78
- // Map attribute ID to column index if mapping provided
79
- let columnIndex = -1;
80
- if (columnAttributeToIndex) {
81
- const mappedIndex = columnAttributeToIndex.get(columnRef.attributeId);
82
- if (mappedIndex !== undefined) {
83
- columnIndex = mappedIndex;
224
+ // Map attribute ID to table and column index
225
+ const tableInfo = attributeToTableMap.get(columnRef.attributeId);
226
+ if (!tableInfo) {
227
+ log('No table mapping found for attribute ID %d', columnRef.attributeId);
228
+ return null;
229
+ }
230
+ const columnIndex = tableInfo.columnIndexMap.get(columnRef.attributeId);
231
+ if (columnIndex === undefined) {
232
+ log('No column index found for attribute ID %d', columnRef.attributeId);
233
+ return null;
234
+ }
235
+ const result = {
236
+ columnIndex,
237
+ attributeId: columnRef.attributeId,
238
+ op: finalOp,
239
+ value: constant,
240
+ usable: true, // Usable since we found table mapping
241
+ sourceExpression: expr,
242
+ targetRelation: tableInfo.relationKey
243
+ };
244
+ // Attach dynamic binding metadata when RHS/LHS is not a literal
245
+ const rhs = expr.right;
246
+ const lhs = expr.left;
247
+ const nonLiteral = !isLiteralConstant(lhs) || !isLiteralConstant(rhs);
248
+ if (nonLiteral) {
249
+ // Determine which side is the value side
250
+ const valueSide = (columnRef === lhs ? rhs : lhs);
251
+ if (!isLiteralConstant(valueSide)) {
252
+ result.valueExpr = valueSide;
253
+ if (valueSide.nodeType === PlanNodeType.ParameterReference) {
254
+ result.bindingKind = 'parameter';
255
+ }
256
+ else if (valueSide.nodeType === PlanNodeType.ColumnReference) {
257
+ const rhsAttrId = valueSide.attributeId;
258
+ const sameTable = tableInfo.columnIndexMap.has(rhsAttrId);
259
+ result.bindingKind = sameTable ? 'expression' : 'correlated';
260
+ }
261
+ else {
262
+ result.bindingKind = 'expression';
263
+ }
84
264
  }
265
+ else {
266
+ result.bindingKind = 'literal';
267
+ }
268
+ }
269
+ else {
270
+ result.bindingKind = 'literal';
271
+ }
272
+ return result;
273
+ }
274
+ function extractBetweenConstraints(expr, attributeToTableMap) {
275
+ // Only support column BETWEEN literal AND literal
276
+ const col = expr.expr;
277
+ const low = expr.lower;
278
+ const up = expr.upper;
279
+ const not = !!expr.expression.not;
280
+ if (col.nodeType !== PlanNodeType.ColumnReference)
281
+ return null;
282
+ if (!isLiteralConstant(low) || !isLiteralConstant(up))
283
+ return null;
284
+ const columnRef = col;
285
+ const tableInfo = attributeToTableMap.get(columnRef.attributeId);
286
+ if (!tableInfo)
287
+ return null;
288
+ const columnIndex = tableInfo.columnIndexMap.get(columnRef.attributeId);
289
+ if (columnIndex === undefined)
290
+ return null;
291
+ if (not) {
292
+ // NOT BETWEEN not expressible as single contiguous range; leave as residual
293
+ return null;
85
294
  }
295
+ const lowVal = getLiteralValue(low);
296
+ const upVal = getLiteralValue(up);
297
+ return [
298
+ {
299
+ columnIndex,
300
+ attributeId: columnRef.attributeId,
301
+ op: '>=',
302
+ value: lowVal,
303
+ usable: true,
304
+ sourceExpression: expr,
305
+ targetRelation: tableInfo.relationKey
306
+ },
307
+ {
308
+ columnIndex,
309
+ attributeId: columnRef.attributeId,
310
+ op: '<=',
311
+ value: upVal,
312
+ usable: true,
313
+ sourceExpression: expr,
314
+ targetRelation: tableInfo.relationKey
315
+ }
316
+ ];
317
+ }
318
+ function extractInConstraint(expr, attributeToTableMap) {
319
+ // Only support column IN (literal, ...)
320
+ if (expr.source)
321
+ return null;
322
+ if (!expr.values || expr.values.length === 0)
323
+ return null;
324
+ const col = expr.condition;
325
+ if (col.nodeType !== PlanNodeType.ColumnReference)
326
+ return null;
327
+ // Ensure all are literals
328
+ if (!expr.values.every(v => isLiteralConstant(v)))
329
+ return null;
330
+ const columnRef = col;
331
+ const tableInfo = attributeToTableMap.get(columnRef.attributeId);
332
+ if (!tableInfo)
333
+ return null;
334
+ const columnIndex = tableInfo.columnIndexMap.get(columnRef.attributeId);
335
+ if (columnIndex === undefined)
336
+ return null;
337
+ // Virtual table IN constraint can carry a single array value or multiple equality constraints.
338
+ // Our API supports op 'IN' with value array.
339
+ const values = expr.values.map(v => getLiteralValue(v));
86
340
  return {
87
341
  columnIndex,
88
342
  attributeId: columnRef.attributeId,
89
- op: constraintOp,
90
- value: constant,
91
- usable: columnIndex >= 0, // Only usable if we can map to column index
92
- sourceExpression: expr
343
+ op: 'IN',
344
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
345
+ value: values,
346
+ usable: true,
347
+ sourceExpression: expr,
348
+ targetRelation: tableInfo.relationKey
93
349
  };
94
350
  }
95
351
  /**
96
- * Get information about binary comparison expressions
352
+ * Map AST operators to constraint operators
97
353
  */
98
- function getBinaryComparisonInfo(expr) {
99
- // This is a simplified version - real implementation would need to handle
100
- // the actual binary expression node structure
101
- if (expr.nodeType === PlanNodeType.BinaryOp) {
102
- // Extract from actual binary expression node
103
- // This would need to be implemented based on the actual BinaryOpNode structure
104
- // For now, return null as placeholder
105
- return null;
354
+ function mapOperatorToConstraint(operator, rightValue) {
355
+ switch (operator) {
356
+ case '=': return '=';
357
+ case '>': return '>';
358
+ case '>=': return '>=';
359
+ case '<': return '<';
360
+ case '<=': return '<=';
361
+ case 'LIKE': return 'LIKE';
362
+ case 'GLOB': return 'GLOB';
363
+ case 'MATCH': return 'MATCH';
364
+ case 'IN': return 'IN';
365
+ case 'NOT IN': return 'NOT IN';
366
+ case 'IS':
367
+ return rightValue === null ? 'IS NULL' : null;
368
+ case 'IS NOT':
369
+ return rightValue === null ? 'IS NOT NULL' : null;
370
+ default: return null;
106
371
  }
107
- return null;
108
372
  }
109
373
  /**
110
374
  * Check if expression is an AND operation
111
375
  */
112
376
  function isAndExpression(expr) {
113
- // Simplified check - would need actual implementation
114
- return expr.nodeType === PlanNodeType.BinaryOp;
377
+ return expr.nodeType === PlanNodeType.BinaryOp &&
378
+ expr.expression.operator === 'AND';
115
379
  }
116
380
  /**
117
- * Get children of binary expression
381
+ * Check if expression is an OR operation
118
382
  */
119
- function getBinaryExpressionChildren(_expr) {
120
- // Simplified - would need actual implementation
121
- return null;
383
+ function isOrExpression(expr) {
384
+ return expr.nodeType === PlanNodeType.BinaryOp &&
385
+ expr.expression.operator === 'OR';
122
386
  }
123
387
  /**
124
388
  * Check if node is a column reference
125
389
  */
126
390
  function isColumnReference(node) {
127
- return node.nodeType === PlanNodeType.ColumnReference;
391
+ return CapabilityDetectors.isColumnReference(node);
128
392
  }
129
393
  /**
130
394
  * Check if node is a literal constant
@@ -132,12 +396,16 @@ function isColumnReference(node) {
132
396
  function isLiteralConstant(node) {
133
397
  return node.nodeType === PlanNodeType.Literal;
134
398
  }
399
+ function isDynamicValue(node) {
400
+ // Parameter or column reference from any table (correlation handled later)
401
+ return node.nodeType === PlanNodeType.ParameterReference || node.nodeType === PlanNodeType.ColumnReference;
402
+ }
135
403
  /**
136
404
  * Get literal value from literal node
137
405
  */
138
- function getLiteralValue(_node) {
139
- // Simplified - would need actual implementation
140
- return null;
406
+ function getLiteralValue(node) {
407
+ const literalNode = node;
408
+ return getSyncLiteral(literalNode.expression);
141
409
  }
142
410
  /**
143
411
  * Flip comparison operator for reversed operand order
@@ -149,45 +417,206 @@ function flipOperator(op) {
149
417
  case '>': return '<';
150
418
  case '>=': return '<=';
151
419
  case '=': return '=';
420
+ case 'LIKE': return 'LIKE'; // Not flippable
421
+ case 'GLOB': return 'GLOB'; // Not flippable
422
+ case 'MATCH': return 'MATCH'; // Not flippable
423
+ case 'IN': return 'IN'; // Not flippable in this context
424
+ case 'NOT IN': return 'NOT IN'; // Not flippable in this context
152
425
  default: return op;
153
426
  }
154
427
  }
155
428
  /**
156
- * Combine multiple expressions with AND logic
429
+ * Extract constraints for a specific table from a relational plan
430
+ * Analyzes all Filter nodes and join conditions that reference the table
157
431
  */
158
- function combineWithAnd(expressions) {
159
- // This would need to create an actual AND expression node
160
- // For now, return the first expression as placeholder
161
- return expressions[0];
432
+ export function extractConstraintsForTable(plan, targetTableRelationKey) {
433
+ const constraints = [];
434
+ // Walk the plan tree looking for filter predicates
435
+ walkPlanForPredicates(plan, (predicate, sourceNode) => {
436
+ // Create table info for the target table only
437
+ const tableInfos = createTableInfosFromPlan(plan).filter(info => info.relationKey === targetTableRelationKey);
438
+ if (tableInfos.length > 0) {
439
+ const result = extractConstraints(predicate, tableInfos);
440
+ const tableConstraints = result.constraintsByTable.get(targetTableRelationKey);
441
+ if (tableConstraints) {
442
+ constraints.push(...tableConstraints);
443
+ log('Found %d constraints for table %s from %s', tableConstraints.length, targetTableRelationKey, sourceNode);
444
+ }
445
+ }
446
+ });
447
+ return constraints;
162
448
  }
163
449
  /**
164
- * Create a residual filter predicate from constraints that weren't handled
165
- * This allows creating a filter function that can be applied at runtime
450
+ * Extract constraints and combined residual predicate for a specific table
166
451
  */
167
- export function createResidualFilter(originalPredicate, handledConstraints) {
168
- // If all constraints were handled, no residual filter needed
169
- if (handledConstraints.length === 0) {
170
- // Return a simple function that evaluates the original predicate
171
- // This is a placeholder - real implementation would need to compile the predicate
172
- return (_row) => true;
452
+ export function extractConstraintsAndResidualForTable(plan, targetTableRelationKey) {
453
+ const constraints = [];
454
+ const residuals = [];
455
+ walkPlanForPredicates(plan, (predicate) => {
456
+ const tableInfos = createTableInfosFromPlan(plan).filter(info => info.relationKey === targetTableRelationKey);
457
+ if (tableInfos.length === 0)
458
+ return;
459
+ const result = extractConstraints(predicate, tableInfos);
460
+ const tableConstraints = result.constraintsByTable.get(targetTableRelationKey);
461
+ if (tableConstraints && tableConstraints.length) {
462
+ constraints.push(...tableConstraints);
463
+ }
464
+ if (result.residualPredicate) {
465
+ residuals.push(result.residualPredicate);
466
+ }
467
+ });
468
+ return { constraints, residualPredicate: combineResiduals(residuals) };
469
+ }
470
+ /**
471
+ * Compute which unique keys are fully covered by equality constraints for a table within a plan.
472
+ * Returns a list of covered keys (each key is a list of column indexes in the table output order).
473
+ */
474
+ export function extractCoveredKeysForTable(plan, targetTableRelationKey) {
475
+ const constraints = extractConstraintsForTable(plan, targetTableRelationKey);
476
+ const tInfos = createTableInfosFromPlan(plan).filter(info => info.relationKey === targetTableRelationKey);
477
+ if (tInfos.length === 0)
478
+ return [];
479
+ const uniqueKeys = tInfos[0].uniqueKeys ?? [];
480
+ return computeCoveredKeysForConstraints(constraints, uniqueKeys);
481
+ }
482
+ /**
483
+ * Given a set of constraints and a table's unique keys, compute which keys are fully covered by equality.
484
+ */
485
+ export function computeCoveredKeysForConstraints(constraints, tableUniqueKeys) {
486
+ const eqCols = new Set();
487
+ for (const c of constraints) {
488
+ if (c.op === '=') {
489
+ eqCols.add(c.columnIndex);
490
+ }
491
+ if (c.op === 'IN' && Array.isArray(c.value) && c.value.length === 1) {
492
+ eqCols.add(c.columnIndex);
493
+ }
173
494
  }
174
- // For now, return undefined to indicate no residual filter
175
- // Real implementation would create a runtime-evaluable filter function
176
- return undefined;
495
+ const covered = [];
496
+ for (const key of tableUniqueKeys) {
497
+ if (key.length === 0) {
498
+ covered.push([]);
499
+ continue;
500
+ }
501
+ const allCovered = key.every(idx => eqCols.has(idx));
502
+ if (allCovered)
503
+ covered.push([...key]);
504
+ }
505
+ return covered;
177
506
  }
178
507
  /**
179
- * Utility to map table schema columns to attribute IDs
180
- * Used when extracting constraints for specific tables
508
+ * Analyze plan to classify each TableReference instance as 'row' (row-specific) or 'global'.
509
+ * Row-specific means equality constraints fully cover at least one unique key at that reference.
181
510
  */
182
- export function createColumnMapping(tableColumns, nodeAttributes) {
183
- const mapping = new Map();
184
- // Simple name-based mapping
185
- for (const attr of nodeAttributes) {
186
- const columnIndex = tableColumns.findIndex(col => col.name === attr.name);
187
- if (columnIndex >= 0) {
188
- mapping.set(attr.id, columnIndex);
511
+ export function analyzeRowSpecific(plan) {
512
+ const result = new Map();
513
+ const infos = createTableInfosFromPlan(plan);
514
+ for (const info of infos) {
515
+ const covered = extractCoveredKeysForTable(plan, info.relationKey);
516
+ result.set(info.relationKey, covered.length > 0 ? 'row' : 'global');
517
+ }
518
+ return result;
519
+ }
520
+ function combineResiduals(predicates) {
521
+ if (predicates.length === 0)
522
+ return undefined;
523
+ if (predicates.length === 1)
524
+ return predicates[0];
525
+ let acc = predicates[0];
526
+ for (let i = 1; i < predicates.length; i++) {
527
+ const right = predicates[i];
528
+ const ast = { type: 'binary', operator: 'AND', left: acc.expression, right: right.expression };
529
+ acc = new BinaryOpNode(acc.scope, ast, acc, right);
530
+ }
531
+ return acc;
532
+ }
533
+ /**
534
+ * Walk a plan tree and call callback for each predicate found
535
+ */
536
+ function walkPlanForPredicates(plan, callback) {
537
+ if (!plan)
538
+ return;
539
+ // If node exposes predicates via characteristic, collect them
540
+ if (CapabilityDetectors.isPredicateSource(plan)) {
541
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
542
+ const preds = plan.getPredicates();
543
+ for (const p of preds) {
544
+ callback(p, 'PredicateSource');
189
545
  }
190
546
  }
191
- return mapping;
547
+ // Recurse into all children (scalar and relational)
548
+ for (const child of plan.getChildren()) {
549
+ walkPlanForPredicates(child, callback);
550
+ }
551
+ }
552
+ /**
553
+ * Create table information from a relational plan
554
+ */
555
+ function createTableInfosFromPlan(plan) {
556
+ const tableInfos = [];
557
+ const seen = new Set();
558
+ function visitAny(node) {
559
+ const id = node.id ?? null;
560
+ if (id !== null) {
561
+ const k = String(id);
562
+ if (seen.has(k))
563
+ return;
564
+ seen.add(k);
565
+ }
566
+ if (node instanceof TableReferenceNode) {
567
+ const tr = node;
568
+ tableInfos.push(createTableInfoFromNode(node, `${tr.tableSchema.schemaName}.${tr.tableSchema.name}`));
569
+ }
570
+ for (const rel of node.getRelations()) {
571
+ visitAny(rel);
572
+ }
573
+ for (const child of node.getChildren()) {
574
+ visitAny(child);
575
+ }
576
+ }
577
+ visitAny(plan);
578
+ return tableInfos;
579
+ }
580
+ /**
581
+ * Utility to create table info from a table reference node
582
+ */
583
+ export function createTableInfoFromNode(node, relationName) {
584
+ const attributes = node.getAttributes();
585
+ const columnIndexMap = new Map();
586
+ // Map attribute IDs to column indices
587
+ attributes.forEach((attr, index) => {
588
+ columnIndexMap.set(attr.id, index);
589
+ });
590
+ // Extract logical unique keys from relation type, map ColRef[] to plain column indexes
591
+ const relType = node.getType();
592
+ const uniqueKeys = Array.isArray(relType?.keys)
593
+ ? relType.keys.map(key => key.map(ref => ref.index))
594
+ : undefined;
595
+ const relName = relationName || node.toString();
596
+ const relationKey = `${relName}#${node.id ?? 'unknown'}`;
597
+ return {
598
+ relationName: relName,
599
+ relationKey,
600
+ attributes: attributes.map(attr => ({ id: attr.id, name: attr.name })),
601
+ columnIndexMap,
602
+ uniqueKeys
603
+ };
604
+ }
605
+ /**
606
+ * Create a residual filter predicate from constraints that weren't handled
607
+ * This allows creating a filter function that can be applied at runtime
608
+ */
609
+ export function createResidualFilter(originalPredicate, handledConstraints) {
610
+ // If no constraints were handled, return undefined (original predicate still needed)
611
+ if (handledConstraints.length === 0) {
612
+ return undefined;
613
+ }
614
+ // TODO: Implement sophisticated residual filter construction
615
+ // This would need to:
616
+ // 1. Identify which parts of the original predicate were handled
617
+ // 2. Construct a new predicate with only the unhandled parts
618
+ // 3. Compile that predicate to a runtime function
619
+ log('Residual filter construction not yet implemented - using original predicate');
620
+ return undefined;
192
621
  }
193
622
  //# sourceMappingURL=constraint-extractor.js.map