@quereus/quereus 4.5.0 → 4.7.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 (818) hide show
  1. package/README.md +5 -4
  2. package/dist/src/common/errors.d.ts +17 -0
  3. package/dist/src/common/errors.d.ts.map +1 -1
  4. package/dist/src/common/errors.js +21 -0
  5. package/dist/src/common/errors.js.map +1 -1
  6. package/dist/src/core/database-assertions.d.ts +4 -3
  7. package/dist/src/core/database-assertions.d.ts.map +1 -1
  8. package/dist/src/core/database-assertions.js +44 -14
  9. package/dist/src/core/database-assertions.js.map +1 -1
  10. package/dist/src/core/database-events.d.ts +161 -1
  11. package/dist/src/core/database-events.d.ts.map +1 -1
  12. package/dist/src/core/database-events.js +307 -5
  13. package/dist/src/core/database-events.js.map +1 -1
  14. package/dist/src/core/database-internal.d.ts +5 -2
  15. package/dist/src/core/database-internal.d.ts.map +1 -1
  16. package/dist/src/core/database-materialized-views-plan-builders.d.ts.map +1 -1
  17. package/dist/src/core/database-materialized-views-plan-builders.js +33 -4
  18. package/dist/src/core/database-materialized-views-plan-builders.js.map +1 -1
  19. package/dist/src/core/database-materialized-views-plans.d.ts +12 -2
  20. package/dist/src/core/database-materialized-views-plans.d.ts.map +1 -1
  21. package/dist/src/core/database-materialized-views.d.ts +46 -0
  22. package/dist/src/core/database-materialized-views.d.ts.map +1 -1
  23. package/dist/src/core/database-materialized-views.js +75 -4
  24. package/dist/src/core/database-materialized-views.js.map +1 -1
  25. package/dist/src/core/database-transaction.d.ts +9 -0
  26. package/dist/src/core/database-transaction.d.ts.map +1 -1
  27. package/dist/src/core/database-transaction.js +9 -0
  28. package/dist/src/core/database-transaction.js.map +1 -1
  29. package/dist/src/core/database.d.ts +16 -2
  30. package/dist/src/core/database.d.ts.map +1 -1
  31. package/dist/src/core/database.js +56 -15
  32. package/dist/src/core/database.js.map +1 -1
  33. package/dist/src/core/derived-row-validator.d.ts.map +1 -1
  34. package/dist/src/core/derived-row-validator.js +7 -1
  35. package/dist/src/core/derived-row-validator.js.map +1 -1
  36. package/dist/src/core/statement.d.ts.map +1 -1
  37. package/dist/src/core/statement.js +15 -5
  38. package/dist/src/core/statement.js.map +1 -1
  39. package/dist/src/emit/ast-stringify.d.ts +18 -2
  40. package/dist/src/emit/ast-stringify.d.ts.map +1 -1
  41. package/dist/src/emit/ast-stringify.js +22 -4
  42. package/dist/src/emit/ast-stringify.js.map +1 -1
  43. package/dist/src/func/builtins/aggregate.js +11 -11
  44. package/dist/src/func/builtins/aggregate.js.map +1 -1
  45. package/dist/src/func/builtins/builtin-window-functions.d.ts.map +1 -1
  46. package/dist/src/func/builtins/builtin-window-functions.js +15 -85
  47. package/dist/src/func/builtins/builtin-window-functions.js.map +1 -1
  48. package/dist/src/func/builtins/conversion.d.ts.map +1 -1
  49. package/dist/src/func/builtins/conversion.js +10 -9
  50. package/dist/src/func/builtins/conversion.js.map +1 -1
  51. package/dist/src/func/builtins/datetime.d.ts.map +1 -1
  52. package/dist/src/func/builtins/datetime.js +28 -10
  53. package/dist/src/func/builtins/datetime.js.map +1 -1
  54. package/dist/src/func/builtins/explain.d.ts.map +1 -1
  55. package/dist/src/func/builtins/explain.js +19 -5
  56. package/dist/src/func/builtins/explain.js.map +1 -1
  57. package/dist/src/func/builtins/json.d.ts.map +1 -1
  58. package/dist/src/func/builtins/json.js +23 -17
  59. package/dist/src/func/builtins/json.js.map +1 -1
  60. package/dist/src/func/builtins/mutation.js +2 -2
  61. package/dist/src/func/builtins/mutation.js.map +1 -1
  62. package/dist/src/func/builtins/return-types.d.ts +327 -0
  63. package/dist/src/func/builtins/return-types.d.ts.map +1 -0
  64. package/dist/src/func/builtins/return-types.js +43 -0
  65. package/dist/src/func/builtins/return-types.js.map +1 -0
  66. package/dist/src/func/builtins/scalar.d.ts.map +1 -1
  67. package/dist/src/func/builtins/scalar.js +150 -79
  68. package/dist/src/func/builtins/scalar.js.map +1 -1
  69. package/dist/src/func/builtins/schema.d.ts.map +1 -1
  70. package/dist/src/func/builtins/schema.js +43 -8
  71. package/dist/src/func/builtins/schema.js.map +1 -1
  72. package/dist/src/func/builtins/string.d.ts.map +1 -1
  73. package/dist/src/func/builtins/string.js +4 -2
  74. package/dist/src/func/builtins/string.js.map +1 -1
  75. package/dist/src/func/builtins/timespan.d.ts +3 -0
  76. package/dist/src/func/builtins/timespan.d.ts.map +1 -1
  77. package/dist/src/func/builtins/timespan.js +15 -11
  78. package/dist/src/func/builtins/timespan.js.map +1 -1
  79. package/dist/src/func/registration.d.ts +35 -1
  80. package/dist/src/func/registration.d.ts.map +1 -1
  81. package/dist/src/func/registration.js +235 -41
  82. package/dist/src/func/registration.js.map +1 -1
  83. package/dist/src/index.d.ts +14 -7
  84. package/dist/src/index.d.ts.map +1 -1
  85. package/dist/src/index.js +15 -6
  86. package/dist/src/index.js.map +1 -1
  87. package/dist/src/parser/ast.d.ts +58 -1
  88. package/dist/src/parser/ast.d.ts.map +1 -1
  89. package/dist/src/parser/parser.d.ts +46 -0
  90. package/dist/src/parser/parser.d.ts.map +1 -1
  91. package/dist/src/parser/parser.js +161 -45
  92. package/dist/src/parser/parser.js.map +1 -1
  93. package/dist/src/parser/utils.d.ts +13 -1
  94. package/dist/src/parser/utils.d.ts.map +1 -1
  95. package/dist/src/parser/utils.js +14 -0
  96. package/dist/src/parser/utils.js.map +1 -1
  97. package/dist/src/planner/analysis/assertion-classifier.d.ts.map +1 -1
  98. package/dist/src/planner/analysis/assertion-classifier.js +7 -2
  99. package/dist/src/planner/analysis/assertion-classifier.js.map +1 -1
  100. package/dist/src/planner/analysis/assertion-hoist-cache.d.ts.map +1 -1
  101. package/dist/src/planner/analysis/assertion-hoist-cache.js +5 -0
  102. package/dist/src/planner/analysis/assertion-hoist-cache.js.map +1 -1
  103. package/dist/src/planner/analysis/change-scope.d.ts +11 -3
  104. package/dist/src/planner/analysis/change-scope.d.ts.map +1 -1
  105. package/dist/src/planner/analysis/change-scope.js +5 -4
  106. package/dist/src/planner/analysis/change-scope.js.map +1 -1
  107. package/dist/src/planner/analysis/check-extraction.d.ts.map +1 -1
  108. package/dist/src/planner/analysis/check-extraction.js +37 -4
  109. package/dist/src/planner/analysis/check-extraction.js.map +1 -1
  110. package/dist/src/planner/analysis/comparison-collation.d.ts +20 -22
  111. package/dist/src/planner/analysis/comparison-collation.d.ts.map +1 -1
  112. package/dist/src/planner/analysis/comparison-collation.js +29 -26
  113. package/dist/src/planner/analysis/comparison-collation.js.map +1 -1
  114. package/dist/src/planner/analysis/constraint-extractor.d.ts +0 -7
  115. package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
  116. package/dist/src/planner/analysis/constraint-extractor.js +59 -59
  117. package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
  118. package/dist/src/planner/analysis/coverage-prover.d.ts.map +1 -1
  119. package/dist/src/planner/analysis/coverage-prover.js +13 -5
  120. package/dist/src/planner/analysis/coverage-prover.js.map +1 -1
  121. package/dist/src/planner/analysis/equi-correlation.d.ts +6 -1
  122. package/dist/src/planner/analysis/equi-correlation.d.ts.map +1 -1
  123. package/dist/src/planner/analysis/equi-correlation.js +8 -1
  124. package/dist/src/planner/analysis/equi-correlation.js.map +1 -1
  125. package/dist/src/planner/analysis/predicate-dependencies.d.ts +34 -0
  126. package/dist/src/planner/analysis/predicate-dependencies.d.ts.map +1 -0
  127. package/dist/src/planner/analysis/predicate-dependencies.js +60 -0
  128. package/dist/src/planner/analysis/predicate-dependencies.js.map +1 -0
  129. package/dist/src/planner/analysis/query-rewrite-matcher.d.ts +1 -1
  130. package/dist/src/planner/analysis/query-rewrite-matcher.d.ts.map +1 -1
  131. package/dist/src/planner/analysis/query-rewrite-matcher.js +0 -26
  132. package/dist/src/planner/analysis/query-rewrite-matcher.js.map +1 -1
  133. package/dist/src/planner/building/alter-table.d.ts.map +1 -1
  134. package/dist/src/planner/building/alter-table.js +117 -43
  135. package/dist/src/planner/building/alter-table.js.map +1 -1
  136. package/dist/src/planner/building/coercion.d.ts +21 -45
  137. package/dist/src/planner/building/coercion.d.ts.map +1 -1
  138. package/dist/src/planner/building/coercion.js +42 -91
  139. package/dist/src/planner/building/coercion.js.map +1 -1
  140. package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
  141. package/dist/src/planner/building/constraint-builder.js +9 -5
  142. package/dist/src/planner/building/constraint-builder.js.map +1 -1
  143. package/dist/src/planner/building/create-assertion.d.ts.map +1 -1
  144. package/dist/src/planner/building/create-assertion.js +72 -1
  145. package/dist/src/planner/building/create-assertion.js.map +1 -1
  146. package/dist/src/planner/building/create-view.d.ts +6 -1
  147. package/dist/src/planner/building/create-view.d.ts.map +1 -1
  148. package/dist/src/planner/building/create-view.js +12 -3
  149. package/dist/src/planner/building/create-view.js.map +1 -1
  150. package/dist/src/planner/building/ddl.d.ts.map +1 -1
  151. package/dist/src/planner/building/ddl.js +6 -2
  152. package/dist/src/planner/building/ddl.js.map +1 -1
  153. package/dist/src/planner/building/delete.d.ts.map +1 -1
  154. package/dist/src/planner/building/delete.js +23 -10
  155. package/dist/src/planner/building/delete.js.map +1 -1
  156. package/dist/src/planner/building/dml-target.d.ts.map +1 -1
  157. package/dist/src/planner/building/dml-target.js +4 -0
  158. package/dist/src/planner/building/dml-target.js.map +1 -1
  159. package/dist/src/planner/building/drop-assertion.d.ts.map +1 -1
  160. package/dist/src/planner/building/drop-assertion.js +3 -1
  161. package/dist/src/planner/building/drop-assertion.js.map +1 -1
  162. package/dist/src/planner/building/expression.d.ts +17 -0
  163. package/dist/src/planner/building/expression.d.ts.map +1 -1
  164. package/dist/src/planner/building/expression.js +28 -17
  165. package/dist/src/planner/building/expression.js.map +1 -1
  166. package/dist/src/planner/building/foreign-key-builder.d.ts.map +1 -1
  167. package/dist/src/planner/building/foreign-key-builder.js +7 -5
  168. package/dist/src/planner/building/foreign-key-builder.js.map +1 -1
  169. package/dist/src/planner/building/function-call.d.ts +35 -0
  170. package/dist/src/planner/building/function-call.d.ts.map +1 -1
  171. package/dist/src/planner/building/function-call.js +60 -42
  172. package/dist/src/planner/building/function-call.js.map +1 -1
  173. package/dist/src/planner/building/insert.d.ts.map +1 -1
  174. package/dist/src/planner/building/insert.js +185 -48
  175. package/dist/src/planner/building/insert.js.map +1 -1
  176. package/dist/src/planner/building/materialized-view.d.ts.map +1 -1
  177. package/dist/src/planner/building/materialized-view.js +3 -1
  178. package/dist/src/planner/building/materialized-view.js.map +1 -1
  179. package/dist/src/planner/building/schema-authored-context.d.ts +69 -0
  180. package/dist/src/planner/building/schema-authored-context.d.ts.map +1 -0
  181. package/dist/src/planner/building/schema-authored-context.js +75 -0
  182. package/dist/src/planner/building/schema-authored-context.js.map +1 -0
  183. package/dist/src/planner/building/schema-resolution.d.ts.map +1 -1
  184. package/dist/src/planner/building/schema-resolution.js +7 -4
  185. package/dist/src/planner/building/schema-resolution.js.map +1 -1
  186. package/dist/src/planner/building/select-aggregates.d.ts +188 -3
  187. package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
  188. package/dist/src/planner/building/select-aggregates.js +449 -65
  189. package/dist/src/planner/building/select-aggregates.js.map +1 -1
  190. package/dist/src/planner/building/select-compound.js +2 -2
  191. package/dist/src/planner/building/select-compound.js.map +1 -1
  192. package/dist/src/planner/building/select-context.d.ts +98 -0
  193. package/dist/src/planner/building/select-context.d.ts.map +1 -1
  194. package/dist/src/planner/building/select-context.js +120 -37
  195. package/dist/src/planner/building/select-context.js.map +1 -1
  196. package/dist/src/planner/building/select-modifiers.d.ts +10 -3
  197. package/dist/src/planner/building/select-modifiers.d.ts.map +1 -1
  198. package/dist/src/planner/building/select-modifiers.js +29 -8
  199. package/dist/src/planner/building/select-modifiers.js.map +1 -1
  200. package/dist/src/planner/building/select-ordinal.d.ts +64 -19
  201. package/dist/src/planner/building/select-ordinal.d.ts.map +1 -1
  202. package/dist/src/planner/building/select-ordinal.js +79 -30
  203. package/dist/src/planner/building/select-ordinal.js.map +1 -1
  204. package/dist/src/planner/building/select-projections.d.ts +1 -1
  205. package/dist/src/planner/building/select-projections.d.ts.map +1 -1
  206. package/dist/src/planner/building/select-projections.js +18 -11
  207. package/dist/src/planner/building/select-projections.js.map +1 -1
  208. package/dist/src/planner/building/select-window.d.ts +13 -3
  209. package/dist/src/planner/building/select-window.d.ts.map +1 -1
  210. package/dist/src/planner/building/select-window.js +142 -37
  211. package/dist/src/planner/building/select-window.js.map +1 -1
  212. package/dist/src/planner/building/select.d.ts +37 -1
  213. package/dist/src/planner/building/select.d.ts.map +1 -1
  214. package/dist/src/planner/building/select.js +240 -109
  215. package/dist/src/planner/building/select.js.map +1 -1
  216. package/dist/src/planner/building/update.d.ts.map +1 -1
  217. package/dist/src/planner/building/update.js +27 -13
  218. package/dist/src/planner/building/update.js.map +1 -1
  219. package/dist/src/planner/building/view-mutation-builder.d.ts +1 -1
  220. package/dist/src/planner/building/view-mutation-builder.d.ts.map +1 -1
  221. package/dist/src/planner/building/view-mutation-builder.js +102 -8
  222. package/dist/src/planner/building/view-mutation-builder.js.map +1 -1
  223. package/dist/src/planner/building/with.d.ts.map +1 -1
  224. package/dist/src/planner/building/with.js +34 -4
  225. package/dist/src/planner/building/with.js.map +1 -1
  226. package/dist/src/planner/cache/correlation-detector.d.ts +15 -0
  227. package/dist/src/planner/cache/correlation-detector.d.ts.map +1 -1
  228. package/dist/src/planner/cache/correlation-detector.js +26 -0
  229. package/dist/src/planner/cache/correlation-detector.js.map +1 -1
  230. package/dist/src/planner/cache/materialization-advisory.d.ts +7 -0
  231. package/dist/src/planner/cache/materialization-advisory.d.ts.map +1 -1
  232. package/dist/src/planner/cache/materialization-advisory.js +12 -3
  233. package/dist/src/planner/cache/materialization-advisory.js.map +1 -1
  234. package/dist/src/planner/cost/conjunct-cost.d.ts +40 -0
  235. package/dist/src/planner/cost/conjunct-cost.d.ts.map +1 -1
  236. package/dist/src/planner/cost/conjunct-cost.js +45 -0
  237. package/dist/src/planner/cost/conjunct-cost.js.map +1 -1
  238. package/dist/src/planner/cost/index.d.ts +10 -0
  239. package/dist/src/planner/cost/index.d.ts.map +1 -1
  240. package/dist/src/planner/cost/index.js +15 -0
  241. package/dist/src/planner/cost/index.js.map +1 -1
  242. package/dist/src/planner/framework/characteristics.d.ts +9 -0
  243. package/dist/src/planner/framework/characteristics.d.ts.map +1 -1
  244. package/dist/src/planner/framework/characteristics.js.map +1 -1
  245. package/dist/src/planner/framework/pass.d.ts +2 -0
  246. package/dist/src/planner/framework/pass.d.ts.map +1 -1
  247. package/dist/src/planner/framework/pass.js +15 -0
  248. package/dist/src/planner/framework/pass.js.map +1 -1
  249. package/dist/src/planner/mutation/backward-body.d.ts.map +1 -1
  250. package/dist/src/planner/mutation/backward-body.js +4 -1
  251. package/dist/src/planner/mutation/backward-body.js.map +1 -1
  252. package/dist/src/planner/mutation/body-context.d.ts +23 -0
  253. package/dist/src/planner/mutation/body-context.d.ts.map +1 -0
  254. package/dist/src/planner/mutation/body-context.js +26 -0
  255. package/dist/src/planner/mutation/body-context.js.map +1 -0
  256. package/dist/src/planner/mutation/cte-flatten.js +15 -2
  257. package/dist/src/planner/mutation/cte-flatten.js.map +1 -1
  258. package/dist/src/planner/mutation/decomposition.d.ts +8 -0
  259. package/dist/src/planner/mutation/decomposition.d.ts.map +1 -1
  260. package/dist/src/planner/mutation/decomposition.js +8 -3
  261. package/dist/src/planner/mutation/decomposition.js.map +1 -1
  262. package/dist/src/planner/mutation/lens-enforcement.js +1 -1
  263. package/dist/src/planner/mutation/multi-source.d.ts +7 -0
  264. package/dist/src/planner/mutation/multi-source.d.ts.map +1 -1
  265. package/dist/src/planner/mutation/multi-source.js +5 -0
  266. package/dist/src/planner/mutation/multi-source.js.map +1 -1
  267. package/dist/src/planner/mutation/mutation-diagnostic.d.ts +1 -1
  268. package/dist/src/planner/mutation/mutation-diagnostic.d.ts.map +1 -1
  269. package/dist/src/planner/mutation/mutation-diagnostic.js.map +1 -1
  270. package/dist/src/planner/mutation/scope-transform.d.ts +32 -0
  271. package/dist/src/planner/mutation/scope-transform.d.ts.map +1 -1
  272. package/dist/src/planner/mutation/scope-transform.js +181 -33
  273. package/dist/src/planner/mutation/scope-transform.js.map +1 -1
  274. package/dist/src/planner/mutation/set-op.d.ts.map +1 -1
  275. package/dist/src/planner/mutation/set-op.js +66 -16
  276. package/dist/src/planner/mutation/set-op.js.map +1 -1
  277. package/dist/src/planner/mutation/single-source.d.ts.map +1 -1
  278. package/dist/src/planner/mutation/single-source.js +100 -24
  279. package/dist/src/planner/mutation/single-source.js.map +1 -1
  280. package/dist/src/planner/nodes/add-constraint-node.d.ts +15 -1
  281. package/dist/src/planner/nodes/add-constraint-node.d.ts.map +1 -1
  282. package/dist/src/planner/nodes/add-constraint-node.js +10 -1
  283. package/dist/src/planner/nodes/add-constraint-node.js.map +1 -1
  284. package/dist/src/planner/nodes/aggregate-node.d.ts +15 -0
  285. package/dist/src/planner/nodes/aggregate-node.d.ts.map +1 -1
  286. package/dist/src/planner/nodes/aggregate-node.js +32 -17
  287. package/dist/src/planner/nodes/aggregate-node.js.map +1 -1
  288. package/dist/src/planner/nodes/alias-node.d.ts.map +1 -1
  289. package/dist/src/planner/nodes/alias-node.js +2 -1
  290. package/dist/src/planner/nodes/alias-node.js.map +1 -1
  291. package/dist/src/planner/nodes/alter-table-node.d.ts +51 -10
  292. package/dist/src/planner/nodes/alter-table-node.d.ts.map +1 -1
  293. package/dist/src/planner/nodes/alter-table-node.js +49 -2
  294. package/dist/src/planner/nodes/alter-table-node.js.map +1 -1
  295. package/dist/src/planner/nodes/asof-scan-node.d.ts.map +1 -1
  296. package/dist/src/planner/nodes/asof-scan-node.js +4 -1
  297. package/dist/src/planner/nodes/asof-scan-node.js.map +1 -1
  298. package/dist/src/planner/nodes/asserted-keys-node.d.ts.map +1 -1
  299. package/dist/src/planner/nodes/asserted-keys-node.js +2 -1
  300. package/dist/src/planner/nodes/asserted-keys-node.js.map +1 -1
  301. package/dist/src/planner/nodes/bloom-join-node.d.ts.map +1 -1
  302. package/dist/src/planner/nodes/bloom-join-node.js +8 -3
  303. package/dist/src/planner/nodes/bloom-join-node.js.map +1 -1
  304. package/dist/src/planner/nodes/cache-node.d.ts.map +1 -1
  305. package/dist/src/planner/nodes/cache-node.js +2 -1
  306. package/dist/src/planner/nodes/cache-node.js.map +1 -1
  307. package/dist/src/planner/nodes/constraint-check-node.d.ts.map +1 -1
  308. package/dist/src/planner/nodes/constraint-check-node.js +17 -19
  309. package/dist/src/planner/nodes/constraint-check-node.js.map +1 -1
  310. package/dist/src/planner/nodes/create-assertion-node.d.ts +2 -1
  311. package/dist/src/planner/nodes/create-assertion-node.d.ts.map +1 -1
  312. package/dist/src/planner/nodes/create-assertion-node.js +5 -2
  313. package/dist/src/planner/nodes/create-assertion-node.js.map +1 -1
  314. package/dist/src/planner/nodes/cte-node.d.ts +19 -9
  315. package/dist/src/planner/nodes/cte-node.d.ts.map +1 -1
  316. package/dist/src/planner/nodes/cte-node.js +25 -9
  317. package/dist/src/planner/nodes/cte-node.js.map +1 -1
  318. package/dist/src/planner/nodes/delete-node.d.ts +20 -2
  319. package/dist/src/planner/nodes/delete-node.d.ts.map +1 -1
  320. package/dist/src/planner/nodes/delete-node.js +11 -2
  321. package/dist/src/planner/nodes/delete-node.js.map +1 -1
  322. package/dist/src/planner/nodes/distinct-node.d.ts +6 -0
  323. package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
  324. package/dist/src/planner/nodes/distinct-node.js +10 -2
  325. package/dist/src/planner/nodes/distinct-node.js.map +1 -1
  326. package/dist/src/planner/nodes/dml-executor-node.d.ts +58 -1
  327. package/dist/src/planner/nodes/dml-executor-node.d.ts.map +1 -1
  328. package/dist/src/planner/nodes/dml-executor-node.js +107 -15
  329. package/dist/src/planner/nodes/dml-executor-node.js.map +1 -1
  330. package/dist/src/planner/nodes/drop-assertion-node.d.ts +2 -1
  331. package/dist/src/planner/nodes/drop-assertion-node.d.ts.map +1 -1
  332. package/dist/src/planner/nodes/drop-assertion-node.js +5 -2
  333. package/dist/src/planner/nodes/drop-assertion-node.js.map +1 -1
  334. package/dist/src/planner/nodes/eager-prefetch-node.d.ts.map +1 -1
  335. package/dist/src/planner/nodes/eager-prefetch-node.js +2 -1
  336. package/dist/src/planner/nodes/eager-prefetch-node.js.map +1 -1
  337. package/dist/src/planner/nodes/fanout-lookup-join-node.d.ts +5 -0
  338. package/dist/src/planner/nodes/fanout-lookup-join-node.d.ts.map +1 -1
  339. package/dist/src/planner/nodes/fanout-lookup-join-node.js +13 -6
  340. package/dist/src/planner/nodes/fanout-lookup-join-node.js.map +1 -1
  341. package/dist/src/planner/nodes/filter.d.ts.map +1 -1
  342. package/dist/src/planner/nodes/filter.js +18 -5
  343. package/dist/src/planner/nodes/filter.js.map +1 -1
  344. package/dist/src/planner/nodes/hash-aggregate.d.ts +1 -0
  345. package/dist/src/planner/nodes/hash-aggregate.d.ts.map +1 -1
  346. package/dist/src/planner/nodes/hash-aggregate.js +21 -16
  347. package/dist/src/planner/nodes/hash-aggregate.js.map +1 -1
  348. package/dist/src/planner/nodes/insert-node.d.ts +19 -2
  349. package/dist/src/planner/nodes/insert-node.d.ts.map +1 -1
  350. package/dist/src/planner/nodes/insert-node.js +10 -2
  351. package/dist/src/planner/nodes/insert-node.js.map +1 -1
  352. package/dist/src/planner/nodes/join-node.d.ts +20 -1
  353. package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
  354. package/dist/src/planner/nodes/join-node.js +30 -9
  355. package/dist/src/planner/nodes/join-node.js.map +1 -1
  356. package/dist/src/planner/nodes/join-utils.d.ts +21 -0
  357. package/dist/src/planner/nodes/join-utils.d.ts.map +1 -1
  358. package/dist/src/planner/nodes/join-utils.js +26 -0
  359. package/dist/src/planner/nodes/join-utils.js.map +1 -1
  360. package/dist/src/planner/nodes/key-set-semi-join-node.d.ts +42 -10
  361. package/dist/src/planner/nodes/key-set-semi-join-node.d.ts.map +1 -1
  362. package/dist/src/planner/nodes/key-set-semi-join-node.js +90 -17
  363. package/dist/src/planner/nodes/key-set-semi-join-node.js.map +1 -1
  364. package/dist/src/planner/nodes/lens-auxiliary-access-node.d.ts +5 -0
  365. package/dist/src/planner/nodes/lens-auxiliary-access-node.d.ts.map +1 -1
  366. package/dist/src/planner/nodes/lens-auxiliary-access-node.js +2 -1
  367. package/dist/src/planner/nodes/lens-auxiliary-access-node.js.map +1 -1
  368. package/dist/src/planner/nodes/limit-offset.d.ts +6 -0
  369. package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
  370. package/dist/src/planner/nodes/limit-offset.js +10 -2
  371. package/dist/src/planner/nodes/limit-offset.js.map +1 -1
  372. package/dist/src/planner/nodes/merge-join-node.d.ts.map +1 -1
  373. package/dist/src/planner/nodes/merge-join-node.js +8 -3
  374. package/dist/src/planner/nodes/merge-join-node.js.map +1 -1
  375. package/dist/src/planner/nodes/ordinal-slice-node.d.ts +5 -0
  376. package/dist/src/planner/nodes/ordinal-slice-node.d.ts.map +1 -1
  377. package/dist/src/planner/nodes/ordinal-slice-node.js +9 -2
  378. package/dist/src/planner/nodes/ordinal-slice-node.js.map +1 -1
  379. package/dist/src/planner/nodes/plan-node.d.ts +29 -0
  380. package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
  381. package/dist/src/planner/nodes/plan-node.js +12 -0
  382. package/dist/src/planner/nodes/plan-node.js.map +1 -1
  383. package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
  384. package/dist/src/planner/nodes/project-node.js +18 -36
  385. package/dist/src/planner/nodes/project-node.js.map +1 -1
  386. package/dist/src/planner/nodes/reference.d.ts.map +1 -1
  387. package/dist/src/planner/nodes/reference.js +3 -2
  388. package/dist/src/planner/nodes/reference.js.map +1 -1
  389. package/dist/src/planner/nodes/retrieve-node.d.ts +16 -2
  390. package/dist/src/planner/nodes/retrieve-node.d.ts.map +1 -1
  391. package/dist/src/planner/nodes/retrieve-node.js +10 -2
  392. package/dist/src/planner/nodes/retrieve-node.js.map +1 -1
  393. package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
  394. package/dist/src/planner/nodes/returning-node.js +13 -32
  395. package/dist/src/planner/nodes/returning-node.js.map +1 -1
  396. package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
  397. package/dist/src/planner/nodes/scalar.js +5 -18
  398. package/dist/src/planner/nodes/scalar.js.map +1 -1
  399. package/dist/src/planner/nodes/sort.d.ts.map +1 -1
  400. package/dist/src/planner/nodes/sort.js +3 -1
  401. package/dist/src/planner/nodes/sort.js.map +1 -1
  402. package/dist/src/planner/nodes/stream-aggregate.d.ts +1 -0
  403. package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
  404. package/dist/src/planner/nodes/stream-aggregate.js +22 -20
  405. package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
  406. package/dist/src/planner/nodes/table-access-nodes.d.ts +89 -1
  407. package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
  408. package/dist/src/planner/nodes/table-access-nodes.js +69 -2
  409. package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
  410. package/dist/src/planner/nodes/update-node.d.ts +19 -2
  411. package/dist/src/planner/nodes/update-node.d.ts.map +1 -1
  412. package/dist/src/planner/nodes/update-node.js +10 -2
  413. package/dist/src/planner/nodes/update-node.js.map +1 -1
  414. package/dist/src/planner/nodes/window-function.d.ts.map +1 -1
  415. package/dist/src/planner/nodes/window-function.js +8 -0
  416. package/dist/src/planner/nodes/window-function.js.map +1 -1
  417. package/dist/src/planner/nodes/window-node.d.ts +1 -1
  418. package/dist/src/planner/nodes/window-node.d.ts.map +1 -1
  419. package/dist/src/planner/nodes/window-node.js +3 -1
  420. package/dist/src/planner/nodes/window-node.js.map +1 -1
  421. package/dist/src/planner/optimizer.d.ts +27 -1
  422. package/dist/src/planner/optimizer.d.ts.map +1 -1
  423. package/dist/src/planner/optimizer.js +130 -10
  424. package/dist/src/planner/optimizer.js.map +1 -1
  425. package/dist/src/planner/planning-context.d.ts +24 -0
  426. package/dist/src/planner/planning-context.d.ts.map +1 -1
  427. package/dist/src/planner/planning-context.js.map +1 -1
  428. package/dist/src/planner/rules/access/rule-key-set-seek.d.ts +78 -20
  429. package/dist/src/planner/rules/access/rule-key-set-seek.d.ts.map +1 -1
  430. package/dist/src/planner/rules/access/rule-key-set-seek.js +296 -135
  431. package/dist/src/planner/rules/access/rule-key-set-seek.js.map +1 -1
  432. package/dist/src/planner/rules/access/rule-monotonic-range-access.d.ts.map +1 -1
  433. package/dist/src/planner/rules/access/rule-monotonic-range-access.js +2 -2
  434. package/dist/src/planner/rules/access/rule-monotonic-range-access.js.map +1 -1
  435. package/dist/src/planner/rules/access/rule-select-access-path.d.ts +30 -1
  436. package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
  437. package/dist/src/planner/rules/access/rule-select-access-path.js +70 -5
  438. package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
  439. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts +7 -4
  440. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts.map +1 -1
  441. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js +39 -5
  442. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js.map +1 -1
  443. package/dist/src/planner/rules/cache/rule-cte-optimization.d.ts.map +1 -1
  444. package/dist/src/planner/rules/cache/rule-cte-optimization.js +15 -2
  445. package/dist/src/planner/rules/cache/rule-cte-optimization.js.map +1 -1
  446. package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.js +10 -3
  447. package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.js.map +1 -1
  448. package/dist/src/planner/rules/cache/rule-nested-loop-right-cache.d.ts.map +1 -1
  449. package/dist/src/planner/rules/cache/rule-nested-loop-right-cache.js +6 -4
  450. package/dist/src/planner/rules/cache/rule-nested-loop-right-cache.js.map +1 -1
  451. package/dist/src/planner/rules/join/equi-pair-extractor.d.ts +5 -31
  452. package/dist/src/planner/rules/join/equi-pair-extractor.d.ts.map +1 -1
  453. package/dist/src/planner/rules/join/equi-pair-extractor.js +4 -44
  454. package/dist/src/planner/rules/join/equi-pair-extractor.js.map +1 -1
  455. package/dist/src/planner/rules/join/index-nested-loop.d.ts +49 -0
  456. package/dist/src/planner/rules/join/index-nested-loop.d.ts.map +1 -0
  457. package/dist/src/planner/rules/join/index-nested-loop.js +291 -0
  458. package/dist/src/planner/rules/join/index-nested-loop.js.map +1 -0
  459. package/dist/src/planner/rules/join/rule-fanout-batched-outer.js +8 -8
  460. package/dist/src/planner/rules/join/rule-fanout-lookup-join.d.ts +4 -0
  461. package/dist/src/planner/rules/join/rule-fanout-lookup-join.d.ts.map +1 -1
  462. package/dist/src/planner/rules/join/rule-fanout-lookup-join.js +50 -15
  463. package/dist/src/planner/rules/join/rule-fanout-lookup-join.js.map +1 -1
  464. package/dist/src/planner/rules/join/rule-join-elimination.d.ts +6 -0
  465. package/dist/src/planner/rules/join/rule-join-elimination.d.ts.map +1 -1
  466. package/dist/src/planner/rules/join/rule-join-elimination.js +25 -9
  467. package/dist/src/planner/rules/join/rule-join-elimination.js.map +1 -1
  468. package/dist/src/planner/rules/join/rule-join-key-inference.d.ts +7 -0
  469. package/dist/src/planner/rules/join/rule-join-key-inference.d.ts.map +1 -1
  470. package/dist/src/planner/rules/join/rule-join-key-inference.js +23 -11
  471. package/dist/src/planner/rules/join/rule-join-key-inference.js.map +1 -1
  472. package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts +10 -4
  473. package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts.map +1 -1
  474. package/dist/src/planner/rules/join/rule-join-physical-selection.js +115 -29
  475. package/dist/src/planner/rules/join/rule-join-physical-selection.js.map +1 -1
  476. package/dist/src/planner/rules/join/rule-monotonic-merge-join.d.ts +2 -0
  477. package/dist/src/planner/rules/join/rule-monotonic-merge-join.d.ts.map +1 -1
  478. package/dist/src/planner/rules/join/rule-monotonic-merge-join.js +18 -4
  479. package/dist/src/planner/rules/join/rule-monotonic-merge-join.js.map +1 -1
  480. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.d.ts +2 -2
  481. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.d.ts.map +1 -1
  482. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js +19 -22
  483. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js.map +1 -1
  484. package/dist/src/planner/rules/predicate/rule-filter-conjunct-ordering.d.ts +21 -8
  485. package/dist/src/planner/rules/predicate/rule-filter-conjunct-ordering.d.ts.map +1 -1
  486. package/dist/src/planner/rules/predicate/rule-filter-conjunct-ordering.js +70 -14
  487. package/dist/src/planner/rules/predicate/rule-filter-conjunct-ordering.js.map +1 -1
  488. package/dist/src/planner/rules/predicate/rule-filter-selectivity.d.ts +56 -17
  489. package/dist/src/planner/rules/predicate/rule-filter-selectivity.d.ts.map +1 -1
  490. package/dist/src/planner/rules/predicate/rule-filter-selectivity.js +103 -154
  491. package/dist/src/planner/rules/predicate/rule-filter-selectivity.js.map +1 -1
  492. package/dist/src/planner/rules/predicate/rule-join-predicate-pushdown.d.ts +76 -0
  493. package/dist/src/planner/rules/predicate/rule-join-predicate-pushdown.d.ts.map +1 -0
  494. package/dist/src/planner/rules/predicate/rule-join-predicate-pushdown.js +208 -0
  495. package/dist/src/planner/rules/predicate/rule-join-predicate-pushdown.js.map +1 -0
  496. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.d.ts +14 -11
  497. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.d.ts.map +1 -1
  498. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js +21 -85
  499. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js.map +1 -1
  500. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.d.ts +7 -1
  501. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.d.ts.map +1 -1
  502. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js +18 -22
  503. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js.map +1 -1
  504. package/dist/src/planner/rules/shared/access-leaf.d.ts +52 -0
  505. package/dist/src/planner/rules/shared/access-leaf.d.ts.map +1 -0
  506. package/dist/src/planner/rules/shared/access-leaf.js +95 -0
  507. package/dist/src/planner/rules/shared/access-leaf.js.map +1 -0
  508. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.d.ts.map +1 -1
  509. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js +17 -7
  510. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js.map +1 -1
  511. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.d.ts +3 -1
  512. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.d.ts.map +1 -1
  513. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js +26 -9
  514. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js.map +1 -1
  515. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts.map +1 -1
  516. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js +69 -11
  517. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js.map +1 -1
  518. package/dist/src/planner/rules/window/rule-monotonic-window.d.ts +17 -7
  519. package/dist/src/planner/rules/window/rule-monotonic-window.d.ts.map +1 -1
  520. package/dist/src/planner/rules/window/rule-monotonic-window.js +124 -87
  521. package/dist/src/planner/rules/window/rule-monotonic-window.js.map +1 -1
  522. package/dist/src/planner/scopes/aliased.d.ts.map +1 -1
  523. package/dist/src/planner/scopes/aliased.js +6 -0
  524. package/dist/src/planner/scopes/aliased.js.map +1 -1
  525. package/dist/src/planner/stats/catalog-stats.d.ts +44 -13
  526. package/dist/src/planner/stats/catalog-stats.d.ts.map +1 -1
  527. package/dist/src/planner/stats/catalog-stats.js +137 -61
  528. package/dist/src/planner/stats/catalog-stats.js.map +1 -1
  529. package/dist/src/planner/stats/conjunct-selectivity.d.ts +48 -0
  530. package/dist/src/planner/stats/conjunct-selectivity.d.ts.map +1 -0
  531. package/dist/src/planner/stats/conjunct-selectivity.js +168 -0
  532. package/dist/src/planner/stats/conjunct-selectivity.js.map +1 -0
  533. package/dist/src/planner/stats/index.d.ts +22 -3
  534. package/dist/src/planner/stats/index.d.ts.map +1 -1
  535. package/dist/src/planner/stats/index.js.map +1 -1
  536. package/dist/src/planner/stats/table-cardinality.d.ts +28 -0
  537. package/dist/src/planner/stats/table-cardinality.d.ts.map +1 -0
  538. package/dist/src/planner/stats/table-cardinality.js +29 -0
  539. package/dist/src/planner/stats/table-cardinality.js.map +1 -0
  540. package/dist/src/planner/stored-body-context.d.ts +57 -0
  541. package/dist/src/planner/stored-body-context.d.ts.map +1 -0
  542. package/dist/src/planner/stored-body-context.js +64 -0
  543. package/dist/src/planner/stored-body-context.js.map +1 -0
  544. package/dist/src/planner/util/column-origins.d.ts +29 -8
  545. package/dist/src/planner/util/column-origins.d.ts.map +1 -1
  546. package/dist/src/planner/util/column-origins.js +74 -14
  547. package/dist/src/planner/util/column-origins.js.map +1 -1
  548. package/dist/src/planner/util/fd-utils.d.ts +32 -8
  549. package/dist/src/planner/util/fd-utils.d.ts.map +1 -1
  550. package/dist/src/planner/util/fd-utils.js +46 -9
  551. package/dist/src/planner/util/fd-utils.js.map +1 -1
  552. package/dist/src/planner/util/ind-utils.d.ts +66 -19
  553. package/dist/src/planner/util/ind-utils.d.ts.map +1 -1
  554. package/dist/src/planner/util/ind-utils.js +91 -21
  555. package/dist/src/planner/util/ind-utils.js.map +1 -1
  556. package/dist/src/planner/util/key-utils.d.ts +36 -3
  557. package/dist/src/planner/util/key-utils.d.ts.map +1 -1
  558. package/dist/src/planner/util/key-utils.js +57 -7
  559. package/dist/src/planner/util/key-utils.js.map +1 -1
  560. package/dist/src/planner/util/output-names.d.ts +12 -0
  561. package/dist/src/planner/util/output-names.d.ts.map +1 -0
  562. package/dist/src/planner/util/output-names.js +20 -0
  563. package/dist/src/planner/util/output-names.js.map +1 -0
  564. package/dist/src/planner/util/row-estimates.d.ts +39 -0
  565. package/dist/src/planner/util/row-estimates.d.ts.map +1 -0
  566. package/dist/src/planner/util/row-estimates.js +68 -0
  567. package/dist/src/planner/util/row-estimates.js.map +1 -0
  568. package/dist/src/planner/util/row-population.d.ts +42 -0
  569. package/dist/src/planner/util/row-population.d.ts.map +1 -0
  570. package/dist/src/planner/util/row-population.js +71 -0
  571. package/dist/src/planner/util/row-population.js.map +1 -0
  572. package/dist/src/runtime/deferred-constraint-queue.d.ts.map +1 -1
  573. package/dist/src/runtime/deferred-constraint-queue.js +3 -2
  574. package/dist/src/runtime/deferred-constraint-queue.js.map +1 -1
  575. package/dist/src/runtime/emit/add-constraint.d.ts.map +1 -1
  576. package/dist/src/runtime/emit/add-constraint.js +60 -6
  577. package/dist/src/runtime/emit/add-constraint.js.map +1 -1
  578. package/dist/src/runtime/emit/aggregate.d.ts.map +1 -1
  579. package/dist/src/runtime/emit/aggregate.js +4 -4
  580. package/dist/src/runtime/emit/aggregate.js.map +1 -1
  581. package/dist/src/runtime/emit/alter-schema-event.d.ts +97 -0
  582. package/dist/src/runtime/emit/alter-schema-event.d.ts.map +1 -0
  583. package/dist/src/runtime/emit/alter-schema-event.js +87 -0
  584. package/dist/src/runtime/emit/alter-schema-event.js.map +1 -0
  585. package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
  586. package/dist/src/runtime/emit/alter-table.js +582 -236
  587. package/dist/src/runtime/emit/alter-table.js.map +1 -1
  588. package/dist/src/runtime/emit/analyze.d.ts.map +1 -1
  589. package/dist/src/runtime/emit/analyze.js +50 -7
  590. package/dist/src/runtime/emit/analyze.js.map +1 -1
  591. package/dist/src/runtime/emit/assertion-drop-guard.d.ts +37 -0
  592. package/dist/src/runtime/emit/assertion-drop-guard.d.ts.map +1 -0
  593. package/dist/src/runtime/emit/assertion-drop-guard.js +59 -0
  594. package/dist/src/runtime/emit/assertion-drop-guard.js.map +1 -0
  595. package/dist/src/runtime/emit/assertion-rename-helpers.d.ts +33 -0
  596. package/dist/src/runtime/emit/assertion-rename-helpers.d.ts.map +1 -0
  597. package/dist/src/runtime/emit/assertion-rename-helpers.js +124 -0
  598. package/dist/src/runtime/emit/assertion-rename-helpers.js.map +1 -0
  599. package/dist/src/runtime/emit/cast.d.ts.map +1 -1
  600. package/dist/src/runtime/emit/cast.js +4 -19
  601. package/dist/src/runtime/emit/cast.js.map +1 -1
  602. package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
  603. package/dist/src/runtime/emit/constraint-check.js +10 -227
  604. package/dist/src/runtime/emit/constraint-check.js.map +1 -1
  605. package/dist/src/runtime/emit/create-assertion.d.ts.map +1 -1
  606. package/dist/src/runtime/emit/create-assertion.js +31 -14
  607. package/dist/src/runtime/emit/create-assertion.js.map +1 -1
  608. package/dist/src/runtime/emit/cte.d.ts.map +1 -1
  609. package/dist/src/runtime/emit/cte.js +11 -6
  610. package/dist/src/runtime/emit/cte.js.map +1 -1
  611. package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
  612. package/dist/src/runtime/emit/dml-executor.js +233 -28
  613. package/dist/src/runtime/emit/dml-executor.js.map +1 -1
  614. package/dist/src/runtime/emit/drop-assertion.js +8 -8
  615. package/dist/src/runtime/emit/drop-assertion.js.map +1 -1
  616. package/dist/src/runtime/emit/drop-column-guards.d.ts +151 -0
  617. package/dist/src/runtime/emit/drop-column-guards.d.ts.map +1 -0
  618. package/dist/src/runtime/emit/drop-column-guards.js +230 -0
  619. package/dist/src/runtime/emit/drop-column-guards.js.map +1 -0
  620. package/dist/src/runtime/emit/drop-index.d.ts.map +1 -1
  621. package/dist/src/runtime/emit/drop-index.js +4 -3
  622. package/dist/src/runtime/emit/drop-index.js.map +1 -1
  623. package/dist/src/runtime/emit/drop-table.d.ts.map +1 -1
  624. package/dist/src/runtime/emit/drop-table.js +6 -0
  625. package/dist/src/runtime/emit/drop-table.js.map +1 -1
  626. package/dist/src/runtime/emit/drop-view.d.ts.map +1 -1
  627. package/dist/src/runtime/emit/drop-view.js +4 -0
  628. package/dist/src/runtime/emit/drop-view.js.map +1 -1
  629. package/dist/src/runtime/emit/hash-aggregate.d.ts.map +1 -1
  630. package/dist/src/runtime/emit/hash-aggregate.js +2 -2
  631. package/dist/src/runtime/emit/hash-aggregate.js.map +1 -1
  632. package/dist/src/runtime/emit/join.d.ts.map +1 -1
  633. package/dist/src/runtime/emit/join.js +8 -67
  634. package/dist/src/runtime/emit/join.js.map +1 -1
  635. package/dist/src/runtime/emit/key-set-semi-join.d.ts.map +1 -1
  636. package/dist/src/runtime/emit/key-set-semi-join.js +11 -3
  637. package/dist/src/runtime/emit/key-set-semi-join.js.map +1 -1
  638. package/dist/src/runtime/emit/materialized-view-helpers.d.ts +4 -4
  639. package/dist/src/runtime/emit/materialized-view-helpers.d.ts.map +1 -1
  640. package/dist/src/runtime/emit/materialized-view-helpers.js +34 -22
  641. package/dist/src/runtime/emit/materialized-view-helpers.js.map +1 -1
  642. package/dist/src/runtime/emit/materialized-view.d.ts.map +1 -1
  643. package/dist/src/runtime/emit/materialized-view.js +7 -2
  644. package/dist/src/runtime/emit/materialized-view.js.map +1 -1
  645. package/dist/src/runtime/emit/operand-comparator.d.ts +30 -0
  646. package/dist/src/runtime/emit/operand-comparator.d.ts.map +1 -1
  647. package/dist/src/runtime/emit/operand-comparator.js +34 -0
  648. package/dist/src/runtime/emit/operand-comparator.js.map +1 -1
  649. package/dist/src/runtime/emit/recursive-cte.d.ts.map +1 -1
  650. package/dist/src/runtime/emit/recursive-cte.js +4 -5
  651. package/dist/src/runtime/emit/recursive-cte.js.map +1 -1
  652. package/dist/src/runtime/emit/schema-declarative.d.ts.map +1 -1
  653. package/dist/src/runtime/emit/schema-declarative.js +30 -0
  654. package/dist/src/runtime/emit/schema-declarative.js.map +1 -1
  655. package/dist/src/runtime/emit/subquery.d.ts.map +1 -1
  656. package/dist/src/runtime/emit/subquery.js +153 -52
  657. package/dist/src/runtime/emit/subquery.js.map +1 -1
  658. package/dist/src/runtime/emit/update.d.ts.map +1 -1
  659. package/dist/src/runtime/emit/update.js +18 -6
  660. package/dist/src/runtime/emit/update.js.map +1 -1
  661. package/dist/src/runtime/emit/window.js +36 -23
  662. package/dist/src/runtime/emit/window.js.map +1 -1
  663. package/dist/src/runtime/row-constraints.d.ts +85 -0
  664. package/dist/src/runtime/row-constraints.d.ts.map +1 -0
  665. package/dist/src/runtime/row-constraints.js +239 -0
  666. package/dist/src/runtime/row-constraints.js.map +1 -0
  667. package/dist/src/runtime/types.d.ts +8 -11
  668. package/dist/src/runtime/types.d.ts.map +1 -1
  669. package/dist/src/runtime/types.js.map +1 -1
  670. package/dist/src/schema/assertion.d.ts +14 -1
  671. package/dist/src/schema/assertion.d.ts.map +1 -1
  672. package/dist/src/schema/assertion.js +14 -1
  673. package/dist/src/schema/assertion.js.map +1 -1
  674. package/dist/src/schema/catalog-persistability.d.ts +19 -16
  675. package/dist/src/schema/catalog-persistability.d.ts.map +1 -1
  676. package/dist/src/schema/catalog-persistability.js +92 -20
  677. package/dist/src/schema/catalog-persistability.js.map +1 -1
  678. package/dist/src/schema/catalog.d.ts +73 -2
  679. package/dist/src/schema/catalog.d.ts.map +1 -1
  680. package/dist/src/schema/catalog.js +220 -39
  681. package/dist/src/schema/catalog.js.map +1 -1
  682. package/dist/src/schema/column-source-resolver.d.ts +18 -0
  683. package/dist/src/schema/column-source-resolver.d.ts.map +1 -0
  684. package/dist/src/schema/column-source-resolver.js +22 -0
  685. package/dist/src/schema/column-source-resolver.js.map +1 -0
  686. package/dist/src/schema/column.d.ts +26 -3
  687. package/dist/src/schema/column.d.ts.map +1 -1
  688. package/dist/src/schema/column.js.map +1 -1
  689. package/dist/src/schema/constraint-builder.d.ts.map +1 -1
  690. package/dist/src/schema/constraint-builder.js +7 -1
  691. package/dist/src/schema/constraint-builder.js.map +1 -1
  692. package/dist/src/schema/ddl-generator.d.ts.map +1 -1
  693. package/dist/src/schema/ddl-generator.js +27 -6
  694. package/dist/src/schema/ddl-generator.js.map +1 -1
  695. package/dist/src/schema/function.d.ts +32 -1
  696. package/dist/src/schema/function.d.ts.map +1 -1
  697. package/dist/src/schema/function.js +10 -2
  698. package/dist/src/schema/function.js.map +1 -1
  699. package/dist/src/schema/lens-compiler.d.ts.map +1 -1
  700. package/dist/src/schema/lens-compiler.js +203 -51
  701. package/dist/src/schema/lens-compiler.js.map +1 -1
  702. package/dist/src/schema/lens-prover.d.ts +2 -3
  703. package/dist/src/schema/lens-prover.d.ts.map +1 -1
  704. package/dist/src/schema/lens-prover.js +19 -11
  705. package/dist/src/schema/lens-prover.js.map +1 -1
  706. package/dist/src/schema/manager.d.ts +115 -20
  707. package/dist/src/schema/manager.d.ts.map +1 -1
  708. package/dist/src/schema/manager.js +202 -70
  709. package/dist/src/schema/manager.js.map +1 -1
  710. package/dist/src/schema/rename-rewriter.d.ts +142 -0
  711. package/dist/src/schema/rename-rewriter.d.ts.map +1 -1
  712. package/dist/src/schema/rename-rewriter.js +254 -9
  713. package/dist/src/schema/rename-rewriter.js.map +1 -1
  714. package/dist/src/schema/reserved-tags.d.ts +1 -1
  715. package/dist/src/schema/reserved-tags.d.ts.map +1 -1
  716. package/dist/src/schema/reserved-tags.js +4 -3
  717. package/dist/src/schema/reserved-tags.js.map +1 -1
  718. package/dist/src/schema/schema-differ.d.ts +16 -0
  719. package/dist/src/schema/schema-differ.d.ts.map +1 -1
  720. package/dist/src/schema/schema-differ.js +225 -38
  721. package/dist/src/schema/schema-differ.js.map +1 -1
  722. package/dist/src/schema/table.d.ts +149 -1
  723. package/dist/src/schema/table.d.ts.map +1 -1
  724. package/dist/src/schema/table.js +248 -1
  725. package/dist/src/schema/table.js.map +1 -1
  726. package/dist/src/schema/unique-enforcement.d.ts +5 -3
  727. package/dist/src/schema/unique-enforcement.d.ts.map +1 -1
  728. package/dist/src/schema/unique-enforcement.js +5 -3
  729. package/dist/src/schema/unique-enforcement.js.map +1 -1
  730. package/dist/src/schema/view.d.ts +11 -0
  731. package/dist/src/schema/view.d.ts.map +1 -1
  732. package/dist/src/schema/view.js +12 -0
  733. package/dist/src/schema/view.js.map +1 -1
  734. package/dist/src/types/builtin-types.d.ts +54 -0
  735. package/dist/src/types/builtin-types.d.ts.map +1 -1
  736. package/dist/src/types/builtin-types.js +123 -34
  737. package/dist/src/types/builtin-types.js.map +1 -1
  738. package/dist/src/types/cast-semantics.d.ts +42 -0
  739. package/dist/src/types/cast-semantics.d.ts.map +1 -1
  740. package/dist/src/types/cast-semantics.js +64 -0
  741. package/dist/src/types/cast-semantics.js.map +1 -1
  742. package/dist/src/types/comparison-coercion.d.ts +101 -0
  743. package/dist/src/types/comparison-coercion.d.ts.map +1 -0
  744. package/dist/src/types/comparison-coercion.js +162 -0
  745. package/dist/src/types/comparison-coercion.js.map +1 -0
  746. package/dist/src/types/index.d.ts +2 -2
  747. package/dist/src/types/index.d.ts.map +1 -1
  748. package/dist/src/types/index.js +2 -2
  749. package/dist/src/types/index.js.map +1 -1
  750. package/dist/src/types/logical-type.d.ts +7 -0
  751. package/dist/src/types/logical-type.d.ts.map +1 -1
  752. package/dist/src/types/logical-type.js.map +1 -1
  753. package/dist/src/types/validation.d.ts +56 -0
  754. package/dist/src/types/validation.d.ts.map +1 -1
  755. package/dist/src/types/validation.js +68 -0
  756. package/dist/src/types/validation.js.map +1 -1
  757. package/dist/src/util/{working-table-iterable.d.ts → array-row-iterable.d.ts} +6 -6
  758. package/dist/src/util/array-row-iterable.d.ts.map +1 -0
  759. package/dist/src/util/{working-table-iterable.js → array-row-iterable.js} +6 -6
  760. package/dist/src/util/array-row-iterable.js.map +1 -0
  761. package/dist/src/util/coercion.d.ts +8 -0
  762. package/dist/src/util/coercion.d.ts.map +1 -1
  763. package/dist/src/util/coercion.js +8 -0
  764. package/dist/src/util/coercion.js.map +1 -1
  765. package/dist/src/util/comparison.d.ts +16 -3
  766. package/dist/src/util/comparison.d.ts.map +1 -1
  767. package/dist/src/util/comparison.js +21 -5
  768. package/dist/src/util/comparison.js.map +1 -1
  769. package/dist/src/util/key-serializer.d.ts +46 -0
  770. package/dist/src/util/key-serializer.d.ts.map +1 -1
  771. package/dist/src/util/key-serializer.js +47 -0
  772. package/dist/src/util/key-serializer.js.map +1 -1
  773. package/dist/src/util/value-set.d.ts +21 -0
  774. package/dist/src/util/value-set.d.ts.map +1 -0
  775. package/dist/src/util/value-set.js +22 -0
  776. package/dist/src/util/value-set.js.map +1 -0
  777. package/dist/src/vtab/capabilities.d.ts +1 -1
  778. package/dist/src/vtab/events.d.ts +8 -1
  779. package/dist/src/vtab/events.d.ts.map +1 -1
  780. package/dist/src/vtab/events.js.map +1 -1
  781. package/dist/src/vtab/manifest.d.ts +15 -0
  782. package/dist/src/vtab/manifest.d.ts.map +1 -1
  783. package/dist/src/vtab/memory/layer/alter-column.d.ts +147 -0
  784. package/dist/src/vtab/memory/layer/alter-column.d.ts.map +1 -0
  785. package/dist/src/vtab/memory/layer/alter-column.js +214 -0
  786. package/dist/src/vtab/memory/layer/alter-column.js.map +1 -0
  787. package/dist/src/vtab/memory/layer/base.d.ts.map +1 -1
  788. package/dist/src/vtab/memory/layer/base.js +4 -3
  789. package/dist/src/vtab/memory/layer/base.js.map +1 -1
  790. package/dist/src/vtab/memory/layer/interface.d.ts +2 -2
  791. package/dist/src/vtab/memory/layer/interface.d.ts.map +1 -1
  792. package/dist/src/vtab/memory/layer/manager.d.ts +176 -25
  793. package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
  794. package/dist/src/vtab/memory/layer/manager.js +569 -558
  795. package/dist/src/vtab/memory/layer/manager.js.map +1 -1
  796. package/dist/src/vtab/memory/layer/scan-layer.d.ts.map +1 -1
  797. package/dist/src/vtab/memory/layer/scan-layer.js +32 -5
  798. package/dist/src/vtab/memory/layer/scan-layer.js.map +1 -1
  799. package/dist/src/vtab/memory/layer/transaction.d.ts +101 -15
  800. package/dist/src/vtab/memory/layer/transaction.d.ts.map +1 -1
  801. package/dist/src/vtab/memory/layer/transaction.js +133 -45
  802. package/dist/src/vtab/memory/layer/transaction.js.map +1 -1
  803. package/dist/src/vtab/memory/module.d.ts +16 -1
  804. package/dist/src/vtab/memory/module.d.ts.map +1 -1
  805. package/dist/src/vtab/memory/module.js +64 -3
  806. package/dist/src/vtab/memory/module.js.map +1 -1
  807. package/dist/src/vtab/memory/table.d.ts.map +1 -1
  808. package/dist/src/vtab/memory/table.js +11 -6
  809. package/dist/src/vtab/memory/table.js.map +1 -1
  810. package/dist/src/vtab/module.d.ts +77 -23
  811. package/dist/src/vtab/module.d.ts.map +1 -1
  812. package/dist/src/vtab/table.d.ts +9 -2
  813. package/dist/src/vtab/table.d.ts.map +1 -1
  814. package/dist/src/vtab/table.js +1 -1
  815. package/dist/src/vtab/table.js.map +1 -1
  816. package/package.json +3 -3
  817. package/dist/src/util/working-table-iterable.d.ts.map +0 -1
  818. package/dist/src/util/working-table-iterable.js.map +0 -1
@@ -4,19 +4,21 @@ import { StatusCode } from '../../common/types.js';
4
4
  import { SingleRowNode } from '../nodes/single-row.js';
5
5
  import { buildTableReference } from './table.js';
6
6
  import { isMaintainedTable } from '../../schema/derivation.js';
7
+ import { isViewSchema } from '../../schema/view.js';
7
8
  import { AliasedScope } from '../scopes/aliased.js';
8
9
  import { RegisteredScope } from '../scopes/registered.js';
9
10
  import { MultiScope } from '../scopes/multi.js';
10
11
  import { ShadowScope } from '../scopes/shadow.js';
12
+ import { EmptyScope } from '../scopes/empty.js';
11
13
  import { ProjectNode } from '../nodes/project-node.js';
12
- import { buildExpression } from './expression.js';
14
+ import { buildComparison, buildExpression } from './expression.js';
13
15
  import { FilterNode } from '../nodes/filter.js';
14
16
  import { buildTableFunctionCall } from './table-function.js';
15
17
  import { CTEReferenceNode } from '../nodes/cte-reference-node.js';
16
18
  import { JoinNode } from '../nodes/join-node.js';
17
- import { resolveComparisonCollation, collationConflictError } from '../analysis/comparison-collation.js';
18
19
  import { EXISTENCE_FLAG_TYPE } from '../nodes/join-utils.js';
19
20
  import { ColumnReferenceNode } from '../nodes/reference.js';
21
+ import { BinaryOpNode } from '../nodes/scalar.js';
20
22
  import { TEXT_TYPE } from '../../types/builtin-types.js';
21
23
  import { ValuesNode } from '../nodes/values-node.js';
22
24
  import { createLogger } from '../../common/logger.js';
@@ -25,14 +27,15 @@ import { AssertedKeysNode } from '../nodes/asserted-keys-node.js';
25
27
  import { computeLensAssertedKeyFds } from '../../schema/lens-prover.js';
26
28
  import { buildLensAuxiliaryAccessMarker } from './lens-auxiliary-access.js';
27
29
  // Import decomposed functionality
28
- import { buildWithContext } from './select-context.js';
30
+ import { buildWithContext, enterStoredBodyEnv } from './select-context.js';
31
+ import { storedBodyContext } from '../stored-body-context.js';
29
32
  import { buildCompoundSelect } from './select-compound.js';
30
33
  import { analyzeSelectColumns, buildStarProjections } from './select-projections.js';
31
- import { buildAggregatePhase, buildFinalAggregateProjections } from './select-aggregates.js';
34
+ import { buildAggregatePhase, buildFinalAggregateProjections, buildGroupedWindowContext } from './select-aggregates.js';
32
35
  import { buildWindowPhase } from './select-window.js';
33
36
  import { buildFinalProjections, applyDistinct, applyOrderBy, applyLimitOffset, createProjectionOutputScope } from './select-modifiers.js';
34
37
  import { SortNode } from '../nodes/sort.js';
35
- import { buildSelectListAsts, resolveOrdinalReference } from './select-ordinal.js';
38
+ import { buildOrdinalAwareExpression, buildSelectListEntries } from './select-ordinal.js';
36
39
  import { buildInsertStmt } from './insert.js';
37
40
  import { buildUpdateStmt } from './update.js';
38
41
  import { buildDeleteStmt } from './delete.js';
@@ -53,12 +56,19 @@ export function buildSelectStmt(ctx, stmt, parentCTEs = new Map(),
53
56
  * expose only their declared columns.
54
57
  */
55
58
  preserveInputColumns = true) {
56
- // Apply schema path from statement if present
59
+ // A sub-select copied out of a stored view / MV body by the write-through lowering carries
60
+ // that body's whole naming environment on the AST node (`AST.StoredBodyEnv`, stamped by
61
+ // `mapNestedSelects` in `mutation/scope-transform.ts` from `buildViewMutation`). Re-enter
62
+ // it here — home schema, the body's declared `with schema` path, and the body's own
63
+ // leading `with` clause as this fragment's parent CTE namespace, in that order. A
64
+ // pass-through for every other statement; see `enterStoredBodyEnv`.
65
+ const { ctx: storedCtx, parentCTEs: storedParentCTEs } = enterStoredBodyEnv(ctx, stmt.storedBodyEnv, parentCTEs);
66
+ // A fragment's OWN `with schema` clause outranks the carried path.
57
67
  const contextWithSchemaPath = stmt.schemaPath
58
- ? { ...ctx, schemaPath: stmt.schemaPath }
59
- : ctx;
68
+ ? { ...storedCtx, schemaPath: stmt.schemaPath }
69
+ : storedCtx;
60
70
  // Phase 0: Handle WITH clause if present
61
- const { contextWithCTEs, cteNodes } = buildWithContext(contextWithSchemaPath, stmt, parentCTEs);
71
+ const { contextWithCTEs, cteNodes } = buildWithContext(contextWithSchemaPath, stmt, storedParentCTEs);
62
72
  // Handle compound set operations (UNION / INTERSECT / EXCEPT)
63
73
  if (stmt.compound) {
64
74
  return buildCompoundSelect(stmt, contextWithCTEs, cteNodes, (ctx, stmt, parentCTEs) => buildSelectStmt(ctx, stmt, parentCTEs));
@@ -74,6 +84,11 @@ preserveInputColumns = true) {
74
84
  throw new QuereusError('SELECT with multiple FROM sources (joins) not supported.', StatusCode.UNSUPPORTED, undefined, stmt.from[1].loc?.start.line, stmt.from[1].loc?.start.column);
75
85
  }
76
86
  // Phase 2: Create the main scope for this SELECT statement
87
+ // NOTE: the `|| ft.scope` fallback only fires for the FROM-less SingleRowNode, which
88
+ // buildFrom never registers. Every scope buildFrom does register is own-only (see
89
+ // registerColumnScope); a node's own `.scope` is the enclosing chain, so if this
90
+ // fallback ever starts firing for a real source it silently reinstates the chaining
91
+ // this ShadowScope exists to replace.
77
92
  const columnScopes = fromTables.map(ft => ctx.outputScopes.get(ft) || ft.scope).filter(Boolean);
78
93
  const selectScope = new ShadowScope([...columnScopes, contextWithCTEs.scope]);
79
94
  let selectContext = { ...contextWithCTEs, scope: selectScope };
@@ -100,29 +115,53 @@ preserveInputColumns = true) {
100
115
  // Build projections based on the SELECT list
101
116
  const projections = [];
102
117
  // Analyze SELECT columns
103
- const { projections: columnProjections, aggregates, windowFunctions, hasAggregates: hasAggregatesInSelect, hasWindowFunctions, hasWrappedAggregates } = analyzeSelectColumns(stmt.columns, selectContext, input);
118
+ const { projectionsByColumn, aggregates, windowFunctions, hasAggregates: hasAggregatesInSelect, hasWindowFunctions, hasWrappedAggregates } = analyzeSelectColumns(stmt.columns, selectContext, input);
104
119
  // `hasAggregates` may grow as buildAggregatePhase collects HAVING-only or
105
120
  // ORDER-BY-only aggregates; track it locally so the post-aggregate branch
106
121
  // is taken when those promote a non-aggregate query into an aggregate one.
107
122
  let hasAggregates = hasAggregatesInSelect;
108
- // Handle SELECT * separately
123
+ // Assemble the projection list in WRITTEN select-list order, expanding each star
124
+ // in place. Output columns follow the order the user wrote them — a star ahead of
125
+ // a named column emits its columns first, behind it emits them last — which is what
126
+ // SQLite/PostgreSQL do, and what the grouped path (`buildFinalAggregateProjections`,
127
+ // which walks `stmt.columns` itself) has always done.
128
+ //
129
+ // Star expansions are also kept keyed by their AST column so the aggregate path can
130
+ // expand each star back to *its own* columns — a select list may hold more than
131
+ // one star (`select a.*, b.* from a join b`).
132
+ const starProjectionsByColumn = new Map();
109
133
  for (const column of stmt.columns) {
110
134
  if (column.type === 'all') {
111
- const starProjections = buildStarProjections(column, input, selectScope);
112
- projections.push(...starProjections);
135
+ const expanded = buildStarProjections(column, input, selectScope);
136
+ starProjectionsByColumn.set(column, expanded);
137
+ projections.push(...expanded);
138
+ continue;
113
139
  }
140
+ // Non-star column. Aggregate items produced no projection (they are routed
141
+ // into the aggregate phase instead) and are simply absent from the map.
142
+ const columnProjection = projectionsByColumn.get(column);
143
+ if (columnProjection)
144
+ projections.push(columnProjection);
114
145
  }
115
- // Add non-star projections
116
- projections.push(...columnProjections);
117
- // Build the source-order AST list of SELECT-list output columns (with stars expanded)
146
+ // Build the source-order list of SELECT-list output columns (with stars expanded)
118
147
  // for resolving GROUP BY / ORDER BY positional ordinals.
119
- const selectListAsts = buildSelectListAsts(stmt.columns, input);
148
+ const selectListEntries = buildSelectListEntries(stmt.columns, input);
120
149
  // Process aggregates if present
121
- const aggregateResult = buildAggregatePhase(input, stmt, selectContext, aggregates, hasAggregates, projections, hasWrappedAggregates, selectListAsts);
150
+ const aggregateResult = buildAggregatePhase(input, stmt, selectContext, aggregates, hasAggregates, projections, hasWrappedAggregates, selectListEntries, starProjectionsByColumn);
122
151
  input = aggregateResult.output;
123
152
  let preAggregateSort = aggregateResult.preAggregateSort;
124
153
  let orderByAppliedEarly = false;
125
154
  let aggregateProjectionScope;
155
+ // Set when the query is BOTH grouped and windowed: the grouped select-list
156
+ // projection list, to be projected above the window phase's WindowNode.
157
+ let windowSelectProjections;
158
+ // Also set only for a grouped, windowed query: what the aggregate's rows carry,
159
+ // so the window phase can redirect a window specification onto them and reject
160
+ // one that reads anything else.
161
+ let windowGroupedContext;
162
+ // The node whose output attributes ARE this SELECT's result columns, once one
163
+ // exists. A positional ORDER BY binds to its Nth attribute (see applyOrderBy).
164
+ let orderByOutputRelation;
126
165
  // Update context if we have aggregates
127
166
  if (aggregateResult.aggregateScope) {
128
167
  // HAVING-only or ORDER-BY-only aggregates may have promoted this into an
@@ -144,22 +183,50 @@ preserveInputColumns = true) {
144
183
  !preAggregateSort &&
145
184
  !hasWindowFunctions &&
146
185
  stmt.orderBy && stmt.orderBy.length > 0) {
147
- input = applyOrderBy(input, stmt, selectContext, preAggregateSort, undefined, true, selectListAsts);
186
+ input = applyOrderBy(input, stmt, selectContext, preAggregateSort, undefined, true, selectListEntries);
148
187
  orderByAppliedEarly = true;
149
188
  }
150
- // Build final projections if needed
151
- if (aggregateResult.needsFinalProjection && aggregateResult.aggregateNode && aggregateResult.groupByExpressions) {
152
- const finalProjections = buildFinalAggregateProjections(stmt, selectContext, aggregateResult.aggregateScope, aggregateResult.aggregateNode, aggregates, aggregateResult.groupByExpressions);
153
- // When HAVING-only or ORDER-BY-only aggregates were added, don't preserve
154
- // input columns so they are stripped from the output (they exist only for
155
- // those clauses).
156
- const preserveForAggregate = preserveInputColumns &&
157
- !aggregateResult.hasHavingOnlyAggregates &&
158
- !aggregateResult.hasOrderByOnlyAggregates;
159
- input = new ProjectNode(selectScope, input, finalProjections, undefined, undefined, preserveForAggregate);
160
- // Expose final-projection output column names (including SELECT-list aliases)
161
- // so subsequent ORDER BY can reference aliases like the non-aggregate path.
162
- aggregateProjectionScope = createProjectionOutputScope(input);
189
+ // A grouped, windowed query's window specifications and function arguments are
190
+ // built against the aggregate-output scope but fall through to the pre-aggregate
191
+ // select scope for anything the aggregate does not carry. Some of what falls
192
+ // through is a legal grouping key under another spelling and some is a genuinely
193
+ // ungrouped column, so hand the window phase both halves: the maps that redirect
194
+ // the former onto the aggregate's own output columns, and the strict coverage
195
+ // test that rejects the latter at plan time. The aggregate's source relation goes
196
+ // along so both halves can tell which references belong to THIS query — a window
197
+ // specification may contain a subquery, whose own columns and whose correlated
198
+ // references to an enclosing query are neither redirected nor rejected.
199
+ if (hasWindowFunctions &&
200
+ aggregateResult.aggregateNode &&
201
+ aggregateResult.groupByExpressions &&
202
+ aggregateResult.groupByExpressions.length > 0) {
203
+ windowGroupedContext = buildGroupedWindowContext(aggregateResult.groupByExpressions, aggregateResult.aggregateNode.getAttributes(), aggregateResult.aggregateNode.getRelations()[0]);
204
+ }
205
+ // Build final projections if needed. A window function in the select list also
206
+ // forces one: the window phase projects the select list ABOVE its WindowNode, so
207
+ // the grouped select list must be materialized as a projection list here even when
208
+ // the AggregateNode's own output would otherwise have been the result shape.
209
+ if ((aggregateResult.needsFinalProjection || hasWindowFunctions) && aggregateResult.aggregateNode && aggregateResult.groupByExpressions) {
210
+ const finalProjections = buildFinalAggregateProjections(stmt, selectContext, aggregateResult.aggregateScope, aggregateResult.aggregateNode, aggregates, aggregateResult.groupByExpressions, starProjectionsByColumn);
211
+ if (hasWindowFunctions) {
212
+ // Hand the grouped select list to the window phase instead of projecting it
213
+ // here: the WindowNode must sit between the aggregate output and the final
214
+ // projection, so there is exactly ONE projection and it is above the window.
215
+ windowSelectProjections = finalProjections;
216
+ }
217
+ else {
218
+ // When HAVING-only or ORDER-BY-only aggregates were added, don't preserve
219
+ // input columns so they are stripped from the output (they exist only for
220
+ // those clauses).
221
+ const preserveForAggregate = preserveInputColumns &&
222
+ !aggregateResult.hasHavingOnlyAggregates &&
223
+ !aggregateResult.hasOrderByOnlyAggregates;
224
+ input = new ProjectNode(selectScope, input, finalProjections, undefined, undefined, preserveForAggregate);
225
+ // Expose final-projection output column names (including SELECT-list aliases)
226
+ // so subsequent ORDER BY can reference aliases like the non-aggregate path.
227
+ aggregateProjectionScope = createProjectionOutputScope(input);
228
+ orderByOutputRelation = input;
229
+ }
163
230
  }
164
231
  }
165
232
  // Handle window functions if present
@@ -181,15 +248,14 @@ preserveInputColumns = true) {
181
248
  if (orderByClause.expr.type === 'column') {
182
249
  const orderColumn = orderByClause.expr.name.toLowerCase();
183
250
  if (!selectedColumns.has(orderColumn)) {
184
- // Apply ORDER BY before window projections
185
- const sortKeys = stmt.orderBy.map(orderBy => {
186
- const resolved = resolveOrdinalReference(orderBy.expr, selectListAsts, 'ORDER BY');
187
- return {
188
- expression: buildExpression(selectContext, resolved ?? orderBy.expr),
189
- direction: orderBy.direction,
190
- nulls: orderBy.nulls
191
- };
192
- });
251
+ // Apply ORDER BY before window projections. This sort sits BELOW the
252
+ // window projection, so a positional reference resolves through the
253
+ // select list (no output attributes exist yet to bind to).
254
+ const sortKeys = stmt.orderBy.map(orderBy => ({
255
+ expression: buildOrdinalAwareExpression(selectContext, orderBy.expr, selectListEntries, 'ORDER BY'),
256
+ direction: orderBy.direction,
257
+ nulls: orderBy.nulls
258
+ }));
193
259
  input = new SortNode(selectContext.scope, input, sortKeys);
194
260
  preWindowSort = true;
195
261
  break;
@@ -197,7 +263,10 @@ preserveInputColumns = true) {
197
263
  }
198
264
  }
199
265
  }
200
- input = buildWindowPhase(input, windowFunctions, selectContext, stmt);
266
+ input = buildWindowPhase(input, windowFunctions, selectContext, windowSelectProjections ?? projections, windowGroupedContext);
267
+ // The window phase ends in a ProjectNode over the SELECT list, so that node's
268
+ // attributes are this query's result columns.
269
+ orderByOutputRelation = input;
201
270
  // Update context to include window output columns
202
271
  const windowOutputScope = new RegisteredScope(selectContext.scope);
203
272
  const windowAttributes = input.getAttributes();
@@ -213,15 +282,24 @@ preserveInputColumns = true) {
213
282
  preAggregateSort = true;
214
283
  }
215
284
  }
216
- // Handle final projections for non-aggregate, non-window cases
217
- if (!hasAggregates && !hasWindowFunctions) {
218
- const finalResult = buildFinalProjections(input, projections, selectScope, stmt, selectContext, preserveInputColumns, selectListAsts);
285
+ // Handle final projections for non-aggregate, non-window cases.
286
+ // A GROUP BY with no aggregate functions anywhere still went through the
287
+ // aggregate phase (which built its own final projection against the
288
+ // AggregateNode output); re-running buildFinalProjections here would emit a
289
+ // second projection whose column references still point at *pre-aggregate*
290
+ // attributes, which the AggregateNode does not output.
291
+ const hasGrouping = Boolean(aggregateResult.aggregateScope);
292
+ if (!hasGrouping && !hasWindowFunctions) {
293
+ const finalResult = buildFinalProjections(input, projections, selectScope, stmt, selectContext, preserveInputColumns, selectListEntries);
219
294
  input = finalResult.output;
220
295
  selectContext = finalResult.finalContext;
221
296
  preAggregateSort = finalResult.preAggregateSort;
297
+ // Either the final ProjectNode, or — for an identity `select *` — the source
298
+ // itself, whose attributes already ARE the select list.
299
+ orderByOutputRelation = finalResult.output;
222
300
  // Apply final modifiers with projection scope for column alias resolution
223
301
  input = applyDistinct(input, stmt, selectScope);
224
- input = applyOrderBy(input, stmt, selectContext, preAggregateSort, finalResult.projectionScope, false, selectListAsts);
302
+ input = applyOrderBy(input, stmt, selectContext, preAggregateSort, finalResult.projectionScope, false, selectListEntries, orderByOutputRelation);
225
303
  input = applyLimitOffset(input, stmt, selectContext, finalResult.projectionScope);
226
304
  }
227
305
  else {
@@ -233,7 +311,7 @@ preserveInputColumns = true) {
233
311
  if (!orderByAppliedEarly) {
234
312
  // In the aggregate path, ORDER BY may legally reference aggregates; in the
235
313
  // window path it may reference window outputs. Both are now in selectContext.
236
- input = applyOrderBy(input, stmt, selectContext, preAggregateSort, aggregateProjectionScope, hasAggregates, selectListAsts);
314
+ input = applyOrderBy(input, stmt, selectContext, preAggregateSort, aggregateProjectionScope, hasAggregates, selectListEntries, orderByOutputRelation);
237
315
  }
238
316
  input = applyLimitOffset(input, stmt, selectContext, aggregateProjectionScope);
239
317
  }
@@ -255,9 +333,17 @@ export function buildValuesStmt(ctx, stmt) {
255
333
  /**
256
334
  * Registers each column of a relational node as a symbol in a new scope,
257
335
  * wrapped with an AliasedScope for qualified name resolution.
336
+ *
337
+ * The scope is deliberately parented on {@link EmptyScope} — a FROM source's scope
338
+ * holds ONLY its own columns and answers "no" for anything else. The fallback to the
339
+ * enclosing query is composed exactly once by each consumer (`buildSelectStmt`'s
340
+ * `ShadowScope`, `buildJoin`'s ON-condition and LATERAL `ShadowScope`s). Chaining each
341
+ * source scope to the caller's scope instead would make `MultiScope`'s first-match reach
342
+ * the outer scope through peer #1 before peer #2 is ever consulted, so a join's own
343
+ * right-hand source loses name lookup to a same-named enclosing symbol.
258
344
  */
259
- function registerColumnScope(parentScope, node, scopeName, alias) {
260
- const registered = new RegisteredScope(parentScope);
345
+ function registerColumnScope(node, scopeName, alias) {
346
+ const registered = new RegisteredScope(EmptyScope.instance);
261
347
  const attributes = node.getAttributes();
262
348
  node.getType().columns.forEach((c, i) => {
263
349
  const attr = attributes[i];
@@ -286,8 +372,12 @@ export function buildFrom(fromClause, parentContext, cteNodes = new Map()) {
286
372
  let columnScope;
287
373
  if (fromClause.type === 'table') {
288
374
  const tableName = fromClause.table.name.toLowerCase();
289
- // Check if this is a CTE reference
290
- if (cteNodes.has(tableName)) {
375
+ // Check if this is a CTE reference. A schema-qualified name (`main.c`) names a
376
+ // schema object, never a CTE — CTEs live in no schema — so a qualifier sends the
377
+ // name straight to the ordinary view / table resolution below, even when a
378
+ // same-named CTE is in scope. Matches the write path (`resolveCteTarget`) and
379
+ // SQLite / PostgreSQL.
380
+ if (!fromClause.table.schema && cteNodes.has(tableName)) {
291
381
  const cteNode = cteNodes.get(tableName);
292
382
  // Check if this is an internal recursive CTE reference
293
383
  if (CapabilityDetectors.isRecursiveCTERef(cteNode)) {
@@ -297,7 +387,7 @@ export function buildFrom(fromClause, parentContext, cteNodes = new Map()) {
297
387
  internalRefNode = new AliasNode(parentContext.scope, cteNode, fromClause.alias.toLowerCase());
298
388
  }
299
389
  fromTable = internalRefNode;
300
- columnScope = registerColumnScope(parentContext.scope, fromTable, tableName, fromClause.alias?.toLowerCase() ?? tableName);
390
+ columnScope = registerColumnScope(fromTable, tableName, fromClause.alias?.toLowerCase() ?? tableName);
301
391
  }
302
392
  else {
303
393
  // Regular CTE reference - cache by CTE name + alias to ensure consistent attribute IDs
@@ -318,33 +408,32 @@ export function buildFrom(fromClause, parentContext, cteNodes = new Map()) {
318
408
  const attrs = cteRefNode.getAttributes();
319
409
  logger(`Created new CTE reference ${cacheKey}, attrs=[${attrs.map(a => a.id).join(',')}]`);
320
410
  }
321
- columnScope = registerColumnScope(parentContext.scope, cteRefNode, tableName, fromClause.alias?.toLowerCase() ?? tableName);
411
+ columnScope = registerColumnScope(cteRefNode, tableName, fromClause.alias?.toLowerCase() ?? tableName);
322
412
  fromTable = cteRefNode;
323
413
  }
324
414
  }
325
415
  else {
326
- // Check if this is a view
327
- const schemaName = fromClause.table.schema || parentContext.db.schemaManager.getCurrentSchemaName();
328
- const viewSchema = parentContext.db.schemaManager.getView(schemaName, fromClause.table.name);
329
- let maintainedTable = viewSchema ? undefined : parentContext.db.schemaManager.getMaintainedTable(schemaName, fromClause.table.name);
330
- if (!viewSchema && !maintainedTable && !fromClause.table.schema) {
331
- // An unqualified name resolves through the schema path below
332
- // (buildTableReference); mirror that here so a path-resolved
333
- // maintained table still gets the stale re-validation guard.
334
- const pathResolved = parentContext.db.schemaManager.findTable(fromClause.table.name, undefined, parentContext.schemaPath);
335
- if (isMaintainedTable(pathResolved))
336
- maintainedTable = pathResolved;
337
- }
416
+ // Check if this is a view. An unqualified name resolves through the
417
+ // schema search path — one path entry at a time, that schema's tables
418
+ // and views checked together — exactly as `buildTableReference` below
419
+ // resolves a plain table name.
420
+ const resolvedItem = parentContext.db.schemaManager.findSchemaItem(fromClause.table.name, fromClause.table.schema, parentContext.schemaPath);
421
+ const viewSchema = isViewSchema(resolvedItem) ? resolvedItem : undefined;
422
+ const maintainedTable = !isViewSchema(resolvedItem) && isMaintainedTable(resolvedItem) ? resolvedItem : undefined;
338
423
  if (viewSchema) {
339
424
  // Build the view's body. The body is a QueryExpr — today only
340
425
  // SELECT and VALUES bodies plan; DML bodies are rejected at
341
426
  // CREATE VIEW plan time so we never get here with one.
427
+ // The body plans under the VIEW's home-schema path (not the
428
+ // caller's) so its unqualified source names resolve next to the
429
+ // view — independent of the reading statement's search path.
430
+ const viewBodyContext = storedBodyContext(parentContext, viewSchema.schemaName);
342
431
  let viewSelectNode;
343
432
  if (viewSchema.selectAst.type === 'select') {
344
- viewSelectNode = buildSelectStmt(parentContext, viewSchema.selectAst, cteNodes);
433
+ viewSelectNode = buildSelectStmt(viewBodyContext, viewSchema.selectAst);
345
434
  }
346
435
  else if (viewSchema.selectAst.type === 'values') {
347
- viewSelectNode = buildValuesStmt(parentContext, viewSchema.selectAst);
436
+ viewSelectNode = buildValuesStmt(viewBodyContext, viewSchema.selectAst);
348
437
  }
349
438
  else {
350
439
  throw new QuereusError(`View '${viewSchema.name}' has a ${viewSchema.selectAst.type.toUpperCase()} body, which is not yet supported.`, StatusCode.UNSUPPORTED);
@@ -397,7 +486,7 @@ export function buildFrom(fromClause, parentContext, cteNodes = new Map()) {
397
486
  else {
398
487
  fromTable = viewSelectNode;
399
488
  }
400
- columnScope = registerColumnScope(parentContext.scope, fromTable, fromClause.table.name.toLowerCase(), fromClause.alias?.toLowerCase() ?? fromClause.table.name.toLowerCase());
489
+ columnScope = registerColumnScope(fromTable, fromClause.table.name.toLowerCase(), fromClause.alias?.toLowerCase() ?? fromClause.table.name.toLowerCase());
401
490
  }
402
491
  else if (maintainedTable) {
403
492
  // Maintained table (materialized view): resolves through the ORDINARY
@@ -409,13 +498,18 @@ export function buildFrom(fromClause, parentContext, cteNodes = new Map()) {
409
498
  if (maintainedTable.derivation.stale) {
410
499
  // Re-validate the body against current source schemas. An
411
500
  // incompatible change (dropped source, dropped column, …) makes
412
- // the body fail to plan — surface the staleness diagnostic.
501
+ // the body fail to plan — surface the staleness diagnostic. Under the
502
+ // MV's home-schema path, like every other body re-plan: the caller's
503
+ // path would make a perfectly resolvable non-`main` body look
504
+ // incompatibly changed, hiding the materialized rows behind a false
505
+ // staleness error.
506
+ const bodyContext = storedBodyContext(parentContext, maintainedTable.schemaName);
413
507
  try {
414
508
  if (maintainedTable.derivation.selectAst.type === 'select') {
415
- buildSelectStmt(parentContext, maintainedTable.derivation.selectAst, cteNodes);
509
+ buildSelectStmt(bodyContext, maintainedTable.derivation.selectAst);
416
510
  }
417
511
  else if (maintainedTable.derivation.selectAst.type === 'values') {
418
- buildValuesStmt(parentContext, maintainedTable.derivation.selectAst);
512
+ buildValuesStmt(bodyContext, maintainedTable.derivation.selectAst);
419
513
  }
420
514
  }
421
515
  catch (e) {
@@ -428,7 +522,7 @@ export function buildFrom(fromClause, parentContext, cteNodes = new Map()) {
428
522
  tableNode = new AliasNode(parentContext.scope, tableNode, fromClause.alias.toLowerCase());
429
523
  }
430
524
  fromTable = tableNode;
431
- columnScope = registerColumnScope(parentContext.scope, fromTable, fromClause.table.name.toLowerCase(), fromClause.alias?.toLowerCase() ?? fromClause.table.name.toLowerCase());
525
+ columnScope = registerColumnScope(fromTable, fromClause.table.name.toLowerCase(), fromClause.alias?.toLowerCase() ?? fromClause.table.name.toLowerCase());
432
526
  }
433
527
  else {
434
528
  // Regular table
@@ -438,7 +532,7 @@ export function buildFrom(fromClause, parentContext, cteNodes = new Map()) {
438
532
  tableNode = new AliasNode(parentContext.scope, tableNode, fromClause.alias.toLowerCase());
439
533
  }
440
534
  fromTable = tableNode;
441
- columnScope = registerColumnScope(parentContext.scope, fromTable, fromClause.table.name.toLowerCase(), fromClause.alias?.toLowerCase() ?? fromClause.table.name.toLowerCase());
535
+ columnScope = registerColumnScope(fromTable, fromClause.table.name.toLowerCase(), fromClause.alias?.toLowerCase() ?? fromClause.table.name.toLowerCase());
442
536
  }
443
537
  }
444
538
  }
@@ -449,7 +543,7 @@ export function buildFrom(fromClause, parentContext, cteNodes = new Map()) {
449
543
  funcNode = new AliasNode(parentContext.scope, funcNode, fromClause.alias.toLowerCase());
450
544
  }
451
545
  fromTable = funcNode;
452
- columnScope = registerColumnScope(parentContext.scope, fromTable, '', fromClause.alias?.toLowerCase() ?? fromClause.name.name.toLowerCase());
546
+ columnScope = registerColumnScope(fromTable, '', fromClause.alias?.toLowerCase() ?? fromClause.name.name.toLowerCase());
453
547
  }
454
548
  else if (fromClause.type === 'subquerySource') {
455
549
  // Build the subquery body. SubquerySource now carries any QueryExpr;
@@ -485,8 +579,9 @@ export function buildFrom(fromClause, parentContext, cteNodes = new Map()) {
485
579
  fromTable = alias
486
580
  ? new AliasNode(parentContext.scope, subqueryNode, alias)
487
581
  : subqueryNode;
488
- // Create scope for subquery columns
489
- const subqueryScope = new RegisteredScope(parentContext.scope);
582
+ // Create scope for subquery columns. Own-only, parented on EmptyScope, for the
583
+ // same reason as registerColumnScope — see its doc comment.
584
+ const subqueryScope = new RegisteredScope(EmptyScope.instance);
490
585
  const subqueryAttributes = fromTable.getAttributes();
491
586
  // Use provided column names or infer from subquery
492
587
  const columnNames = fromClause.columns || fromTable.getType().columns.map(c => c.name);
@@ -542,24 +637,24 @@ function buildJoin(joinClause, parentContext, cteNodes) {
542
637
  }
543
638
  // Create a combined scope for the join that includes both left and right columns
544
639
  const combinedScope = new MultiScope([leftScope, rightScope]);
545
- // Create a new planning context with the combined scope for condition evaluation
640
+ // Context for building the ON condition: the join's own two peers first, then the
641
+ // enclosing query. Both peers are own-only scopes (see registerColumnScope), so
642
+ // neither can answer for the other, and everything they do not own — a correlated
643
+ // outer column, a bind parameter — must still resolve, one level later.
546
644
  const joinContext = {
547
645
  ...parentContext,
548
- scope: combinedScope
646
+ scope: new ShadowScope([combinedScope, parentContext.scope])
549
647
  };
550
648
  let condition;
551
649
  let usingColumns;
552
- // Handle ON condition
650
+ // ON and USING are mutually exclusive spellings of the same predicate (the parser
651
+ // accepts one or the other), and USING desugars into the ON condition it means.
553
652
  if (joinClause.condition) {
554
653
  condition = buildExpression(joinContext, joinClause.condition);
555
654
  }
556
- // Handle USING columns
557
- if (joinClause.columns) {
655
+ else if (joinClause.columns) {
558
656
  usingColumns = joinClause.columns;
559
- // Convert USING to ON condition: table1.col1 = table2.col1 AND table1.col2 = table2.col2 ...
560
- // For now, store the column names and let the emitter handle the condition
561
- // TODO: This could be improved by synthesizing the equality conditions here
562
- validateUsingCollations(usingColumns, leftNode, rightNode);
657
+ condition = buildUsingCondition(usingColumns, leftNode.getAttributes(), rightNode.getAttributes(), joinContext.scope);
563
658
  }
564
659
  // Existence (`exists … as`) flags: mint a stable attribute id per clause (once,
565
660
  // here — so it survives `withChildren` rebuilds) and expose each by its `as`
@@ -587,31 +682,67 @@ function buildJoin(joinClause, parentContext, cteNodes) {
587
682
  return joinNode;
588
683
  }
589
684
  /**
590
- * Plan-time USING (and, when supported, NATURAL) collation-conflict check. USING
591
- * column pairs never materialize as a `BinaryOpNode`, so `BinaryOpNode.generateType`'s
592
- * lattice validation — which covers spelled-out ON-clause equi-joins — never sees
593
- * them, yet every USING comparator (the nested-loop join's, and the merge/bloom
594
- * key collations once `equi-pair-extractor` admits the pair) resolves each pair
595
- * through the SAME provenance lattice. Run the resolver here so a `using (c)` over
596
- * columns with conflicting explicit/declared collations raises the identical
597
- * ambiguous-collation error as the equivalent `l.c = r.c`, at plan time rather
598
- * than only as the emitter's loud backstop. A NATURAL join (not yet parsed)
599
- * desugars to USING pairs and inherits this check for free.
685
+ * Desugar `using (c1, c2, …)` into the `on l.c1 = r.c1 and l.c2 = r.c2 …` condition
686
+ * it is defined to mean, so a USING join is *the same plan* an equivalent ON join
687
+ * builds. Each pair goes through `buildComparison` — the same helper `buildExpression`
688
+ * uses for a spelled-out `=` — so everything hanging off a real comparison node
689
+ * applies to USING for free and cannot drift from the ON spelling:
690
+ *
691
+ * - cross-type coercion — a JSON column paired with a TEXT one compares structurally,
692
+ * an INTEGER paired with a TEXT one numerically (ticket
693
+ * `bug-using-join-skips-cross-type-coercion`; before the desugar USING compared
694
+ * raw storage classes and matched nothing).
695
+ * - `BinaryOpNode.generateType`'s collation-lattice validation — a `using (c)` over
696
+ * columns with conflicting explicit/declared collations raises the identical
697
+ * ambiguous-collation error as `l.c = r.c`, at plan time rather than only as the
698
+ * emitter's backstop. Both spellings resolve each pair through the SAME symmetric
699
+ * provenance lattice.
700
+ * - `extractEquiPairs` — hash/merge key selection, collation tagging and the
701
+ * semantic-ordering gate, all off the one extractor.
702
+ *
703
+ * A NATURAL join (not yet parsed) desugars to USING pairs and inherits all of this.
704
+ *
705
+ * Column references are built **from attributes**, not by resolving a synthesized
706
+ * qualified `AST.ColumnExpr` through the join scope: a USING column can be ambiguous
707
+ * by name within one side (`a join b using (k) join c using (k)` — the left side of
708
+ * the second join has two `k` columns). First-match-per-side by name is the pairing
709
+ * rule USING has always used here.
710
+ *
711
+ * NOTE: the nested-loop USING path used to resolve one comparator per column at emit
712
+ * time; it now evaluates a condition sub-program per row pair, like every ON join.
713
+ * Only USING joins that fall back to nested loop (cross-type pairs, existence-flag
714
+ * joins) pay this, and it is not measured. If a USING-heavy workload ever profiles
715
+ * slower, the fix belongs in the shared ON-condition evaluation path — not in a
716
+ * restored USING special case.
600
717
  */
601
- function validateUsingCollations(usingColumns, leftNode, rightNode) {
602
- const leftAttrs = leftNode.getAttributes();
603
- const rightAttrs = rightNode.getAttributes();
604
- for (const colName of usingColumns) {
605
- const lower = colName.toLowerCase();
606
- const leftAttr = leftAttrs.find(a => a.name.toLowerCase() === lower);
607
- const rightAttr = rightAttrs.find(a => a.name.toLowerCase() === lower);
608
- // A USING column missing from a side is a name-resolution error surfaced
609
- // elsewhere (the join's column scope); skip rather than mask it here.
610
- if (!leftAttr || !rightAttr)
611
- continue;
612
- const resolution = resolveComparisonCollation(leftAttr.type, rightAttr.type);
613
- if (resolution.kind === 'conflict')
614
- throw collationConflictError(resolution);
718
+ export function buildUsingCondition(usingColumns, leftAttrs, rightAttrs, scope) {
719
+ if (usingColumns.length === 0) {
720
+ throw new QuereusError('USING clause requires at least one column', StatusCode.ERROR);
721
+ }
722
+ const conjuncts = usingColumns.map(colName => buildUsingColumnEquality(colName, leftAttrs, rightAttrs, scope));
723
+ return conjuncts.reduce((acc, cur) => new BinaryOpNode(acc.scope, { type: 'binary', operator: 'AND', left: acc.expression, right: cur.expression }, acc, cur));
724
+ }
725
+ /** One USING column's `l.c = r.c` conjunct, built exactly as the ON spelling builds it. */
726
+ function buildUsingColumnEquality(colName, leftAttrs, rightAttrs, scope) {
727
+ const left = buildUsingOperand(colName, leftAttrs, 'left', scope);
728
+ const right = buildUsingOperand(colName, rightAttrs, 'right', scope);
729
+ return buildComparison(scope, { type: 'binary', operator: '=', left: left.expression, right: right.expression }, left, right);
730
+ }
731
+ /**
732
+ * One side's operand for a USING column: a reference to the FIRST attribute of that
733
+ * name on that side (see the pairing rule on {@link buildUsingCondition}), qualified
734
+ * by its relation so the synthesized AST reads like the ON spelling.
735
+ */
736
+ function buildUsingOperand(colName, attrs, side, scope) {
737
+ const lower = colName.toLowerCase();
738
+ const index = attrs.findIndex(a => a.name.toLowerCase() === lower);
739
+ if (index === -1) {
740
+ throw new QuereusError(`USING column not found on ${side} side of join: ${colName}`, StatusCode.ERROR);
615
741
  }
742
+ const attr = attrs[index];
743
+ const expr = attr.relationName
744
+ ? { type: 'column', name: attr.name, table: attr.relationName }
745
+ : { type: 'column', name: attr.name };
746
+ return new ColumnReferenceNode(scope, expr, attr.type, attr.id, index);
616
747
  }
617
748
  //# sourceMappingURL=select.js.map