@quereus/quereus 0.2.0 → 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 +2 -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 +3 -3
  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 +84 -6
  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 +2 -2
  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 +38 -6
  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 +68 -11
  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 +39 -7
  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 +12 -4
  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 +2 -2
  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 +112 -25
  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 +31 -6
  529. package/dist/src/schema/table.d.ts.map +1 -1
  530. package/dist/src/schema/table.js +27 -12
  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 +18 -5
  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 +5 -3
  580. package/src/common/errors.ts +1 -1
  581. package/src/common/json-types.ts +16 -0
  582. package/src/common/types.ts +3 -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 +3 -3
  597. package/src/parser/ast.ts +582 -484
  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 +16 -7
  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 +2 -2
  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 +150 -28
  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,364 +1,398 @@
1
- import type { ColumnSchema } from './column.js';
2
- import type { VirtualTableModule } from '../vtab/module.js';
3
- import { MemoryTableModule } from '../vtab/memory/module.js';
4
- import type { Expression } from '../parser/ast.js';
5
- import { type ColumnDef, type TableConstraint } from '../parser/ast.js';
6
- import { getAffinity } from '../common/type-inference.js';
7
- import { SqlDataType, StatusCode, type SqlValue } from '../common/types.js';
8
- import type * as AST from '../parser/ast.js';
9
- import { quereusError, QuereusError } from '../common/errors.js';
10
- import { createLogger } from '../common/logger.js';
11
-
12
- const log = createLogger('schema:table');
13
- const warnLog = log.extend('warn');
14
-
15
- /**
16
- * Represents the schema definition of a table (real or virtual).
17
- */
18
- export interface TableSchema {
19
- /** Table name */
20
- name: string;
21
- /** Schema name (e.g., "main", "temp") */
22
- schemaName: string;
23
- /** Ordered list of column definitions */
24
- columns: ReadonlyArray<ColumnSchema>;
25
- /** Map from column name (lowercase) to column index */
26
- columnIndexMap: ReadonlyMap<string, number>;
27
- /** Definition of the primary key, including order and direction */
28
- primaryKeyDefinition: ReadonlyArray<PrimaryKeyColumnDefinition>;
29
- /** CHECK constraints defined on the table or its columns */
30
- checkConstraints: ReadonlyArray<RowConstraintSchema>;
31
- /** Reference to the registered module */
32
- vtabModule: VirtualTableModule<any, any>;
33
- /** If virtual, aux data passed during module registration */
34
- vtabAuxData?: unknown;
35
- /** If virtual, the arguments passed in CREATE VIRTUAL TABLE */
36
- vtabArgs?: Record<string, SqlValue>;
37
- /** If virtual, the name the module was registered with */
38
- vtabModuleName: string;
39
- /** Whether the table is a temporary table */
40
- isTemporary?: boolean;
41
- /** Whether the table is a view */
42
- isView: boolean;
43
- /** Whether the table is a subquery source */
44
- subqueryAST?: AST.SelectStmt;
45
- /** If virtual, the view definition */
46
- viewDefinition?: AST.SelectStmt;
47
- /** Table-level constraints */
48
- tableConstraints?: readonly TableConstraint[];
49
- /** Definitions of secondary indexes (relevant for planning) */
50
- indexes?: ReadonlyArray<IndexSchema>;
51
- /** Estimated number of rows in the table (for query planning) */
52
- readonly estimatedRows?: number;
53
- /** Whether the table is read-only */
54
- isReadOnly?: boolean; // default false
55
- /** Foreign key constraints (parsed but not yet enforced by engine) */
56
- // foreignKeys?: ReadonlyArray<ForeignKeyConstraintSchema>;
57
- /** Unique constraints (beyond primary key) */
58
- // uniqueConstraints?: ReadonlyArray<ConstraintSchema>;
59
- }
60
-
61
- /**
62
- * Builds a map from column names to their indices in the columns array
63
- *
64
- * @param columns Array of column schemas
65
- * @returns Map of lowercase column names to their indices
66
- */
67
- export function buildColumnIndexMap(columns: ReadonlyArray<ColumnSchema>): Map<string, number> {
68
- const map = new Map<string, number>();
69
- columns.forEach((col, index) => {
70
- map.set(col.name.toLowerCase(), index);
71
- });
72
- return map;
73
- }
74
-
75
- /**
76
- * Extracts just the column indices from a primary key definition
77
- *
78
- * @param pkDef Primary key definition array
79
- * @returns Array of column indices that form the primary key
80
- */
81
- export function getPrimaryKeyIndices(pkDef: ReadonlyArray<PrimaryKeyColumnDefinition>): ReadonlyArray<number> {
82
- return Object.freeze(pkDef.map(def => def.index));
83
- }
84
-
85
- /**
86
- * Converts a parsed ColumnDef AST node into a runtime ColumnSchema object
87
- *
88
- * @param def Column definition AST node
89
- * @param defaultNotNull Whether columns should be NOT NULL by default (Third Manifesto approach)
90
- * @returns A runtime ColumnSchema object
91
- */
92
- export function columnDefToSchema(def: ColumnDef, defaultNotNull: boolean = true): ColumnSchema {
93
- const schema: Partial<ColumnSchema> & { name: string } = {
94
- name: def.name,
95
- affinity: getAffinity(def.dataType),
96
- notNull: defaultNotNull, // Default based on Third Manifesto principles
97
- primaryKey: false,
98
- pkOrder: 0,
99
- defaultValue: null,
100
- collation: 'BINARY',
101
- generated: false,
102
- };
103
-
104
- for (const constraint of def.constraints ?? []) {
105
- switch (constraint.type) {
106
- case 'primaryKey':
107
- schema.primaryKey = true;
108
- break;
109
- case 'notNull':
110
- schema.notNull = true;
111
- break;
112
- case 'null':
113
- schema.notNull = false;
114
- break;
115
- case 'unique':
116
- break;
117
- case 'default':
118
- schema.defaultValue = constraint.expr;
119
- break;
120
- case 'collate':
121
- schema.collation = constraint.collation;
122
- break;
123
- case 'generated':
124
- schema.generated = true;
125
- break;
126
- }
127
- }
128
-
129
- // PK implies NOT NULL (always, regardless of default)
130
- if (schema.primaryKey) {
131
- schema.notNull = true;
132
- }
133
-
134
- // If no explicit nullability constraint and default is nullable,
135
- // we need to check if there's an explicit NULL declaration
136
- // Note: SQL doesn't have explicit NULL constraints in standard syntax,
137
- // so this primarily affects the default behavior
138
-
139
- // Assign a default pkOrder if it's a PK but order isn't specified elsewhere
140
- if (schema.primaryKey && schema.pkOrder === 0) {
141
- schema.pkOrder = 1;
142
- }
143
-
144
- return schema as ColumnSchema;
145
- }
146
-
147
- /**
148
- * Defines a column in an index
149
- */
150
- export interface IndexColumnSchema {
151
- /** Column index in TableSchema.columns */
152
- index: number;
153
- /** Whether the index should sort in descending order */
154
- desc?: boolean; // default false
155
- /** Optional collation sequence for the column */
156
- collation?: string;
157
- }
158
-
159
- /**
160
- * Represents an index definition
161
- */
162
- export interface IndexSchema {
163
- /** Index name */
164
- name: string;
165
- /** Columns in the index */
166
- columns: ReadonlyArray<IndexColumnSchema>;
167
- }
168
-
169
- /**
170
- * Creates a basic TableSchema with minimal configuration
171
- *
172
- * @param name Table name
173
- * @param columns Array of column name and type objects
174
- * @param pkColNames Optional array of primary key column names
175
- * @param defaultNotNull Whether columns should be NOT NULL by default (defaults to true for Third Manifesto compliance)
176
- * @returns A frozen TableSchema object
177
- */
178
- export function createBasicSchema(name: string, columns: { name: string, type: string }[], pkColNames?: string[], defaultNotNull: boolean = true): Readonly<TableSchema> {
179
- const columnSchemas = columns.map(c => columnDefToSchema({
180
- name: c.name,
181
- dataType: c.type,
182
- constraints: []
183
- }, defaultNotNull));
184
- const columnIndexMap = buildColumnIndexMap(columnSchemas);
185
- const pkDef = pkColNames
186
- ? pkColNames.map(pkName => {
187
- const idx = columnIndexMap.get(pkName.toLowerCase());
188
- if (idx === undefined) quereusError(`PK column ${pkName} not found`);
189
- return { index: idx, desc: false };
190
- })
191
- : [];
192
-
193
- const defaultMemoryModule = new MemoryTableModule();
194
-
195
- return Object.freeze({
196
- name: name,
197
- schemaName: 'main',
198
- columns: columnSchemas,
199
- columnIndexMap: columnIndexMap,
200
- primaryKeyDefinition: pkDef,
201
- checkConstraints: [] as RowConstraintSchema[],
202
- indexes: [],
203
- vtabModule: defaultMemoryModule,
204
- vtabAuxData: null,
205
- vtabArgs: {},
206
- vtabModuleName: 'memory',
207
- isTemporary: false,
208
- isView: false,
209
- subqueryAST: undefined,
210
- viewDefinition: undefined,
211
- tableConstraints: [],
212
- primaryKey: pkDef.map(def => columnSchemas[def.index].name),
213
- });
214
- }
215
-
216
- /** Bitmask for row operations */
217
- export const enum RowOp {
218
- INSERT = 1,
219
- UPDATE = 2,
220
- DELETE = 4
221
- }
222
- export type RowOpMask = RowOp;
223
- export const DEFAULT_ROWOP_MASK = RowOp.INSERT | RowOp.UPDATE;
224
-
225
- /**
226
- * Converts an array of row operations to a bitmask
227
- *
228
- * @param list Optional array of operation types
229
- * @returns A bitmask representing the operations
230
- */
231
- export function opsToMask(list?: AST.RowOp[]): RowOpMask {
232
- if (!list || list.length === 0) {
233
- return DEFAULT_ROWOP_MASK;
234
- }
235
- let mask: RowOpMask = 0 as RowOpMask;
236
- list.forEach(op => {
237
- switch (op) {
238
- case 'insert': mask |= RowOp.INSERT; break;
239
- case 'update': mask |= RowOp.UPDATE; break;
240
- case 'delete': mask |= RowOp.DELETE; break;
241
- }
242
- });
243
- return mask;
244
- }
245
-
246
- /**
247
- * Represents a CHECK constraint with operation flags
248
- */
249
- export interface RowConstraintSchema {
250
- /** Optional constraint name */
251
- name?: string;
252
- /** Constraint expression */
253
- expr: Expression;
254
- /** Bitmask of operations the constraint applies to */
255
- operations: RowOpMask;
256
- }
257
-
258
- export interface PrimaryKeyColumnDefinition {
259
- index: number;
260
- desc?: boolean; // default false
261
- autoIncrement?: boolean;
262
- collation?: string;
263
- }
264
-
265
- /**
266
- * Helper to parse primary key from AST column and table constraints.
267
- * @param columns Parsed column definitions from AST.
268
- * @param constraints Parsed table constraints from AST.
269
- * @returns A ReadonlyArray defining the primary key columns (index and direction), or undefined.
270
- * @throws QuereusError if multiple primary keys are defined or PK column not found.
271
- */
272
- export function findPKDefinition(
273
- columns: ReadonlyArray<ColumnSchema>,
274
- constraints: ReadonlyArray<AST.TableConstraint> | undefined,
275
- ): ReadonlyArray<PrimaryKeyColumnDefinition> {
276
- const columnPK = findColumnPKDefinition(columns);
277
- const constraintPK = findConstraintPKDefinition(columns, constraints);
278
-
279
- if (constraintPK && columnPK) {
280
- throw new QuereusError("Cannot define both table-level and column-level PRIMARY KEYs", StatusCode.CONSTRAINT);
281
- }
282
-
283
- let finalPkDef = constraintPK ?? columnPK;
284
-
285
- if (!finalPkDef) {
286
- // Quereus-specific behavior: Include all columns in the primary key when no explicit primary key is defined
287
- // This differs from SQLite which would use the first INTEGER column or an implicit rowid
288
- // This design choice ensures predictable behavior and avoids potential confusion with SQLite's implicit rules
289
- warnLog(`No PRIMARY KEY explicitly defined. Including all columns in primary key.`);
290
- finalPkDef = Object.freeze(
291
- columns.map((col, index) => ({
292
- index,
293
- desc: false,
294
- collation: col.collation || 'BINARY'
295
- }))
296
- );
297
- }
298
-
299
- // Don't require NOT NULL, we want to be more flexible
300
-
301
- return finalPkDef as ReadonlyArray<PrimaryKeyColumnDefinition>;
302
- }
303
-
304
- function findConstraintPKDefinition(
305
- columns: readonly ColumnSchema[],
306
- constraints: readonly TableConstraint[] | undefined
307
- ): PrimaryKeyColumnDefinition[] | undefined {
308
- const colMap = buildColumnIndexMap(columns);
309
- let constraintPKs: PrimaryKeyColumnDefinition[] | undefined;
310
-
311
- if (constraints) {
312
- for (const constraint of constraints) {
313
- if (constraint.type === 'primaryKey') {
314
- if (constraintPKs) {
315
- throw new QuereusError("Multiple table-level PRIMARY KEY constraints defined", StatusCode.CONSTRAINT);
316
- }
317
- if (!constraint.columns || constraint.columns.length === 0) {
318
- // An empty column list is fine; means table can have 0-1 rows
319
- constraintPKs = [];
320
- } else {
321
- constraintPKs = constraint.columns.map(colInfo => {
322
- const colIndex = colMap.get(colInfo.name.toLowerCase());
323
- if (colIndex === undefined) {
324
- throw new QuereusError(`PRIMARY KEY column '${colInfo.name}' not found in table definition`, StatusCode.ERROR);
325
- }
326
- return {
327
- index: colIndex,
328
- desc: colInfo.direction === 'desc',
329
- collation: columns[colIndex].collation || 'BINARY'
330
- };
331
- });
332
- }
333
- }
334
- }
335
- }
336
- return constraintPKs;
337
- }
338
-
339
- function findColumnPKDefinition(columns: ReadonlyArray<ColumnSchema>): ReadonlyArray<PrimaryKeyColumnDefinition> | undefined {
340
- const pkCols = columns
341
- .map((col, index) => ({ ...col, originalIndex: index }))
342
- .filter(col => col.primaryKey)
343
- .sort((a, b) => a.pkOrder - b.pkOrder);
344
-
345
- if (pkCols.length > 1 && pkCols.some(col => col.pkOrder === 0)) {
346
- warnLog("Multiple column-level PRIMARY KEYs defined without explicit pkOrder; consider a table-level PRIMARY KEY for composite keys.");
347
- }
348
-
349
- if (pkCols.length > 1) {
350
- warnLog('Multiple columns defined as PRIMARY KEY at column level. Forming a composite key.');
351
- }
352
-
353
- if (pkCols.length === 0) {
354
- return undefined;
355
- }
356
-
357
- return Object.freeze(pkCols.map(col => ({
358
- index: col.originalIndex,
359
- desc: col.affinity === SqlDataType.INTEGER && (col as any).autoIncrement ? false : (col as any).pkDirection === 'desc',
360
- autoIncrement: col.affinity === SqlDataType.INTEGER && !!((col as any).autoIncrement),
361
- collation: col.collation || 'BINARY'
362
- })));
363
- }
364
-
1
+ import type { ColumnSchema } from './column.js';
2
+ import type { AnyVirtualTableModule } from '../vtab/module.js';
3
+ import { MemoryTableModule } from '../vtab/memory/module.js';
4
+ import type { Expression } from '../parser/ast.js';
5
+ import { type ColumnDef, type TableConstraint } from '../parser/ast.js';
6
+ import { getAffinity } from '../common/type-inference.js';
7
+ import { RowOp, SqlDataType, StatusCode, type SqlValue } from '../common/types.js';
8
+ import type * as AST from '../parser/ast.js';
9
+ import { quereusError, QuereusError } from '../common/errors.js';
10
+ import { createLogger } from '../common/logger.js';
11
+
12
+ const log = createLogger('schema:table');
13
+ const warnLog = log.extend('warn');
14
+
15
+ /**
16
+ * Represents the schema definition of a table (real or virtual).
17
+ */
18
+ export interface TableSchema {
19
+ /** Table name */
20
+ name: string;
21
+ /** Schema name (e.g., "main", "temp") */
22
+ schemaName: string;
23
+ /** Ordered list of column definitions */
24
+ columns: ReadonlyArray<ColumnSchema>;
25
+ /** Map from column name (lowercase) to column index */
26
+ columnIndexMap: ReadonlyMap<string, number>;
27
+ /** Definition of the primary key, including order and direction */
28
+ primaryKeyDefinition: ReadonlyArray<PrimaryKeyColumnDefinition>;
29
+ /** CHECK constraints defined on the table or its columns */
30
+ checkConstraints: ReadonlyArray<RowConstraintSchema>;
31
+ /** Reference to the registered module */
32
+ vtabModule: AnyVirtualTableModule;
33
+ /** If virtual, aux data passed during module registration */
34
+ vtabAuxData?: unknown;
35
+ /** If virtual, the arguments passed in CREATE VIRTUAL TABLE */
36
+ vtabArgs?: Record<string, SqlValue>;
37
+ /** If virtual, the name the module was registered with */
38
+ vtabModuleName: string;
39
+ /** Whether the table is a temporary table */
40
+ isTemporary?: boolean;
41
+ /** Whether the table is a view */
42
+ isView: boolean;
43
+ /** Whether the table is a subquery source */
44
+ subqueryAST?: AST.SelectStmt;
45
+ /** If virtual, the view definition */
46
+ viewDefinition?: AST.SelectStmt;
47
+ /** Table-level constraints */
48
+ tableConstraints?: readonly TableConstraint[];
49
+ /** Definitions of secondary indexes (relevant for planning) */
50
+ indexes?: ReadonlyArray<IndexSchema>;
51
+ /** Estimated number of rows in the table (for query planning) */
52
+ readonly estimatedRows?: number;
53
+ /** Whether the table is read-only */
54
+ isReadOnly?: boolean; // default false
55
+ /** Mutation context variables for this table */
56
+ mutationContext?: ReadonlyArray<MutationContextDefinition>;
57
+ /** Foreign key constraints (parsed but not yet enforced by engine) */
58
+ // foreignKeys?: ReadonlyArray<ForeignKeyConstraintSchema>;
59
+ /** Unique constraints (beyond primary key) */
60
+ // uniqueConstraints?: ReadonlyArray<ConstraintSchema>;
61
+ }
62
+
63
+ /**
64
+ * Builds a map from column names to their indices in the columns array
65
+ *
66
+ * @param columns Array of column schemas
67
+ * @returns Map of lowercase column names to their indices
68
+ */
69
+ export function buildColumnIndexMap(columns: ReadonlyArray<ColumnSchema>): Map<string, number> {
70
+ const map = new Map<string, number>();
71
+ columns.forEach((col, index) => {
72
+ map.set(col.name.toLowerCase(), index);
73
+ });
74
+ return map;
75
+ }
76
+
77
+ /**
78
+ * Extracts just the column indices from a primary key definition
79
+ *
80
+ * @param pkDef Primary key definition array
81
+ * @returns Array of column indices that form the primary key
82
+ */
83
+ export function getPrimaryKeyIndices(pkDef: ReadonlyArray<PrimaryKeyColumnDefinition>): ReadonlyArray<number> {
84
+ return Object.freeze(pkDef.map(def => def.index));
85
+ }
86
+
87
+ /**
88
+ * Converts a parsed ColumnDef AST node into a runtime ColumnSchema object
89
+ *
90
+ * @param def Column definition AST node
91
+ * @param defaultNotNull Whether columns should be NOT NULL by default (Third Manifesto approach)
92
+ * @returns A runtime ColumnSchema object
93
+ */
94
+ export function columnDefToSchema(def: ColumnDef, defaultNotNull: boolean = true): ColumnSchema {
95
+ const schema: Partial<ColumnSchema> & { name: string } = {
96
+ name: def.name,
97
+ affinity: getAffinity(def.dataType),
98
+ notNull: defaultNotNull, // Default based on Third Manifesto principles
99
+ primaryKey: false,
100
+ pkOrder: 0,
101
+ defaultValue: null,
102
+ collation: 'BINARY',
103
+ generated: false,
104
+ };
105
+
106
+ for (const constraint of def.constraints ?? []) {
107
+ switch (constraint.type) {
108
+ case 'primaryKey':
109
+ schema.primaryKey = true;
110
+ schema.pkDirection = constraint.direction;
111
+ break;
112
+ case 'notNull':
113
+ schema.notNull = true;
114
+ break;
115
+ case 'null':
116
+ schema.notNull = false;
117
+ break;
118
+ case 'unique':
119
+ break;
120
+ case 'default':
121
+ schema.defaultValue = constraint.expr;
122
+ break;
123
+ case 'collate':
124
+ schema.collation = constraint.collation;
125
+ break;
126
+ case 'generated':
127
+ schema.generated = true;
128
+ break;
129
+ }
130
+ }
131
+
132
+ // PK implies NOT NULL (always, regardless of default)
133
+ if (schema.primaryKey) {
134
+ schema.notNull = true;
135
+ }
136
+
137
+ // If no explicit nullability constraint and default is nullable,
138
+ // we need to check if there's an explicit NULL declaration
139
+ // Note: SQL doesn't have explicit NULL constraints in standard syntax,
140
+ // so this primarily affects the default behavior
141
+
142
+ // Assign a default pkOrder if it's a PK but order isn't specified elsewhere
143
+ if (schema.primaryKey && schema.pkOrder === 0) {
144
+ schema.pkOrder = 1;
145
+ }
146
+
147
+ return schema as ColumnSchema;
148
+ }
149
+
150
+ /**
151
+ * Mutation context variable definition
152
+ */
153
+ export interface MutationContextDefinition {
154
+ /** Variable name */
155
+ name: string;
156
+ /** Type affinity of the variable */
157
+ affinity: SqlDataType;
158
+ /** Whether the variable is NOT NULL */
159
+ notNull: boolean;
160
+ }
161
+
162
+ /**
163
+ * Converts AST mutation context variable to schema definition
164
+ *
165
+ * @param varDef AST mutation context variable definition
166
+ * @param defaultNotNull Whether variables should be NOT NULL by default
167
+ * @returns Mutation context definition schema object
168
+ */
169
+ export function mutationContextVarToSchema(varDef: AST.MutationContextVar, defaultNotNull: boolean = true): MutationContextDefinition {
170
+ return {
171
+ name: varDef.name,
172
+ affinity: getAffinity(varDef.dataType),
173
+ notNull: varDef.notNull !== undefined ? varDef.notNull : defaultNotNull,
174
+ };
175
+ }
176
+
177
+ /**
178
+ * Defines a column in an index
179
+ */
180
+ export interface IndexColumnSchema {
181
+ /** Column index in TableSchema.columns */
182
+ index: number;
183
+ /** Whether the index should sort in descending order */
184
+ desc?: boolean; // default false
185
+ /** Optional collation sequence for the column */
186
+ collation?: string;
187
+ }
188
+
189
+ /**
190
+ * Represents an index definition
191
+ */
192
+ export interface IndexSchema {
193
+ /** Index name */
194
+ name: string;
195
+ /** Columns in the index */
196
+ columns: ReadonlyArray<IndexColumnSchema>;
197
+ }
198
+
199
+ /**
200
+ * Creates a basic TableSchema with minimal configuration
201
+ *
202
+ * @param name Table name
203
+ * @param columns Array of column name and type objects
204
+ * @param pkColNames Optional array of primary key column names
205
+ * @param defaultNotNull Whether columns should be NOT NULL by default (defaults to true for Third Manifesto compliance)
206
+ * @returns A frozen TableSchema object
207
+ */
208
+ export function createBasicSchema(name: string, columns: { name: string, type: string }[], pkColNames?: string[], defaultNotNull: boolean = true): Readonly<TableSchema> {
209
+ const columnSchemas = columns.map(c => columnDefToSchema({
210
+ name: c.name,
211
+ dataType: c.type,
212
+ constraints: []
213
+ }, defaultNotNull));
214
+ const columnIndexMap = buildColumnIndexMap(columnSchemas);
215
+ const pkDef = pkColNames
216
+ ? pkColNames.map(pkName => {
217
+ const idx = columnIndexMap.get(pkName.toLowerCase());
218
+ if (idx === undefined) quereusError(`PK column ${pkName} not found`);
219
+ return { index: idx, desc: false };
220
+ })
221
+ : [];
222
+
223
+ const defaultMemoryModule = new MemoryTableModule();
224
+
225
+ return Object.freeze({
226
+ name: name,
227
+ schemaName: 'main',
228
+ columns: columnSchemas,
229
+ columnIndexMap: columnIndexMap,
230
+ primaryKeyDefinition: pkDef,
231
+ checkConstraints: [] as RowConstraintSchema[],
232
+ indexes: [],
233
+ vtabModule: defaultMemoryModule,
234
+ vtabAuxData: null,
235
+ vtabArgs: {},
236
+ vtabModuleName: 'memory',
237
+ isTemporary: false,
238
+ isView: false,
239
+ subqueryAST: undefined,
240
+ viewDefinition: undefined,
241
+ tableConstraints: [],
242
+ primaryKey: pkDef.map(def => columnSchemas[def.index].name),
243
+ });
244
+ }
245
+
246
+ /** Bitmask for row operations */
247
+ export const enum RowOpFlag {
248
+ INSERT = 1,
249
+ UPDATE = 2,
250
+ DELETE = 4
251
+ }
252
+ export type RowOpMask = RowOpFlag;
253
+ export const DEFAULT_ROWOP_MASK = RowOpFlag.INSERT | RowOpFlag.UPDATE;
254
+
255
+ /**
256
+ * Converts an array of row operations to a bitmask
257
+ *
258
+ * @param list Optional array of operation types
259
+ * @returns A bitmask representing the operations
260
+ */
261
+ export function opsToMask(list?: RowOp[]): RowOpMask {
262
+ if (!list || list.length === 0) {
263
+ return DEFAULT_ROWOP_MASK;
264
+ }
265
+ let mask: RowOpMask = 0 as RowOpMask;
266
+ list.forEach(op => {
267
+ switch (op) {
268
+ case 'insert': mask |= RowOpFlag.INSERT; break;
269
+ case 'update': mask |= RowOpFlag.UPDATE; break;
270
+ case 'delete': mask |= RowOpFlag.DELETE; break;
271
+ }
272
+ });
273
+ return mask;
274
+ }
275
+
276
+ /**
277
+ * Represents a CHECK constraint with operation flags
278
+ */
279
+ export interface RowConstraintSchema {
280
+ /** Optional constraint name */
281
+ name?: string;
282
+ /** Constraint expression */
283
+ expr: Expression;
284
+ /** Bitmask of operations the constraint applies to */
285
+ operations: RowOpMask;
286
+ /** Whether the constraint is deferrable */
287
+ deferrable?: boolean;
288
+ /** Whether the constraint is initially deferred */
289
+ initiallyDeferred?: boolean;
290
+ }
291
+
292
+ export interface PrimaryKeyColumnDefinition {
293
+ index: number;
294
+ desc?: boolean; // default false
295
+ autoIncrement?: boolean;
296
+ collation?: string;
297
+ }
298
+
299
+ /**
300
+ * Helper to parse primary key from AST column and table constraints.
301
+ * @param columns Parsed column definitions from AST.
302
+ * @param constraints Parsed table constraints from AST.
303
+ * @returns A ReadonlyArray defining the primary key columns (index and direction), or undefined.
304
+ * @throws QuereusError if multiple primary keys are defined or PK column not found.
305
+ */
306
+ export function findPKDefinition(
307
+ columns: ReadonlyArray<ColumnSchema>,
308
+ constraints: ReadonlyArray<AST.TableConstraint> | undefined,
309
+ ): ReadonlyArray<PrimaryKeyColumnDefinition> {
310
+ const columnPK = findColumnPKDefinition(columns);
311
+ const constraintPK = findConstraintPKDefinition(columns, constraints);
312
+
313
+ if (constraintPK && columnPK) {
314
+ throw new QuereusError("Cannot define both table-level and column-level PRIMARY KEYs", StatusCode.CONSTRAINT);
315
+ }
316
+
317
+ let finalPkDef = constraintPK ?? columnPK;
318
+
319
+ if (!finalPkDef) {
320
+ // Quereus-specific behavior: Include all columns in the primary key when no explicit primary key is defined
321
+ // This differs from SQLite which would use the first INTEGER column or an implicit rowid
322
+ // This design choice ensures predictable behavior and avoids potential confusion with SQLite's implicit rules
323
+ warnLog(`No PRIMARY KEY explicitly defined. Including all columns in primary key.`);
324
+ finalPkDef = Object.freeze(
325
+ columns.map((col, index) => ({
326
+ index,
327
+ desc: false,
328
+ collation: col.collation || 'BINARY'
329
+ }))
330
+ );
331
+ }
332
+
333
+ // Don't require NOT NULL, we want to be more flexible
334
+
335
+ return finalPkDef as ReadonlyArray<PrimaryKeyColumnDefinition>;
336
+ }
337
+
338
+ function findConstraintPKDefinition(
339
+ columns: readonly ColumnSchema[],
340
+ constraints: readonly TableConstraint[] | undefined
341
+ ): PrimaryKeyColumnDefinition[] | undefined {
342
+ const colMap = buildColumnIndexMap(columns);
343
+ let constraintPKs: PrimaryKeyColumnDefinition[] | undefined;
344
+
345
+ if (constraints) {
346
+ for (const constraint of constraints) {
347
+ if (constraint.type === 'primaryKey') {
348
+ if (constraintPKs) {
349
+ throw new QuereusError("Multiple table-level PRIMARY KEY constraints defined", StatusCode.CONSTRAINT);
350
+ }
351
+ if (!constraint.columns || constraint.columns.length === 0) {
352
+ // An empty column list is fine; means table can have 0-1 rows
353
+ constraintPKs = [];
354
+ } else {
355
+ constraintPKs = constraint.columns.map(colInfo => {
356
+ const colIndex = colMap.get(colInfo.name.toLowerCase());
357
+ if (colIndex === undefined) {
358
+ throw new QuereusError(`PRIMARY KEY column '${colInfo.name}' not found in table definition`, StatusCode.ERROR);
359
+ }
360
+ return {
361
+ index: colIndex,
362
+ desc: colInfo.direction === 'desc',
363
+ collation: columns[colIndex].collation || 'BINARY'
364
+ };
365
+ });
366
+ }
367
+ }
368
+ }
369
+ }
370
+ return constraintPKs;
371
+ }
372
+
373
+ function findColumnPKDefinition(columns: ReadonlyArray<ColumnSchema>): ReadonlyArray<PrimaryKeyColumnDefinition> | undefined {
374
+ const pkCols = columns
375
+ .map((col, index) => ({ ...col, originalIndex: index }))
376
+ .filter(col => col.primaryKey)
377
+ .sort((a, b) => a.pkOrder - b.pkOrder);
378
+
379
+ if (pkCols.length > 1 && pkCols.some(col => col.pkOrder === 0)) {
380
+ warnLog("Multiple column-level PRIMARY KEYs defined without explicit pkOrder; consider a table-level PRIMARY KEY for composite keys.");
381
+ }
382
+
383
+ if (pkCols.length > 1) {
384
+ warnLog('Multiple columns defined as PRIMARY KEY at column level. Forming a composite key.');
385
+ }
386
+
387
+ if (pkCols.length === 0) {
388
+ return undefined;
389
+ }
390
+
391
+ return Object.freeze(pkCols.map(col => ({
392
+ index: col.originalIndex,
393
+ desc: col.affinity === SqlDataType.INTEGER && col.pkDirection === 'desc',
394
+ autoIncrement: col.affinity === SqlDataType.INTEGER,
395
+ collation: col.collation || 'BINARY'
396
+ })));
397
+ }
398
+