@quereus/quereus 4.5.0 → 4.6.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 (468) hide show
  1. package/README.md +4 -3
  2. package/dist/src/core/database-events.d.ts +99 -1
  3. package/dist/src/core/database-events.d.ts.map +1 -1
  4. package/dist/src/core/database-events.js +219 -3
  5. package/dist/src/core/database-events.js.map +1 -1
  6. package/dist/src/core/database-materialized-views-plan-builders.d.ts.map +1 -1
  7. package/dist/src/core/database-materialized-views-plan-builders.js +29 -2
  8. package/dist/src/core/database-materialized-views-plan-builders.js.map +1 -1
  9. package/dist/src/core/database-transaction.d.ts +9 -0
  10. package/dist/src/core/database-transaction.d.ts.map +1 -1
  11. package/dist/src/core/database-transaction.js +9 -0
  12. package/dist/src/core/database-transaction.js.map +1 -1
  13. package/dist/src/core/database.d.ts +7 -1
  14. package/dist/src/core/database.d.ts.map +1 -1
  15. package/dist/src/core/database.js +20 -5
  16. package/dist/src/core/database.js.map +1 -1
  17. package/dist/src/func/builtins/aggregate.js +11 -11
  18. package/dist/src/func/builtins/aggregate.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 +15 -85
  21. package/dist/src/func/builtins/builtin-window-functions.js.map +1 -1
  22. package/dist/src/func/builtins/conversion.d.ts.map +1 -1
  23. package/dist/src/func/builtins/conversion.js +10 -9
  24. package/dist/src/func/builtins/conversion.js.map +1 -1
  25. package/dist/src/func/builtins/datetime.d.ts.map +1 -1
  26. package/dist/src/func/builtins/datetime.js +28 -10
  27. package/dist/src/func/builtins/datetime.js.map +1 -1
  28. package/dist/src/func/builtins/json.d.ts.map +1 -1
  29. package/dist/src/func/builtins/json.js +23 -17
  30. package/dist/src/func/builtins/json.js.map +1 -1
  31. package/dist/src/func/builtins/mutation.js +2 -2
  32. package/dist/src/func/builtins/mutation.js.map +1 -1
  33. package/dist/src/func/builtins/return-types.d.ts +327 -0
  34. package/dist/src/func/builtins/return-types.d.ts.map +1 -0
  35. package/dist/src/func/builtins/return-types.js +43 -0
  36. package/dist/src/func/builtins/return-types.js.map +1 -0
  37. package/dist/src/func/builtins/scalar.d.ts.map +1 -1
  38. package/dist/src/func/builtins/scalar.js +138 -71
  39. package/dist/src/func/builtins/scalar.js.map +1 -1
  40. package/dist/src/func/builtins/schema.d.ts.map +1 -1
  41. package/dist/src/func/builtins/schema.js +11 -3
  42. package/dist/src/func/builtins/schema.js.map +1 -1
  43. package/dist/src/func/builtins/string.d.ts.map +1 -1
  44. package/dist/src/func/builtins/string.js +4 -2
  45. package/dist/src/func/builtins/string.js.map +1 -1
  46. package/dist/src/func/builtins/timespan.d.ts +3 -0
  47. package/dist/src/func/builtins/timespan.d.ts.map +1 -1
  48. package/dist/src/func/builtins/timespan.js +15 -11
  49. package/dist/src/func/builtins/timespan.js.map +1 -1
  50. package/dist/src/func/registration.d.ts +35 -1
  51. package/dist/src/func/registration.d.ts.map +1 -1
  52. package/dist/src/func/registration.js +235 -41
  53. package/dist/src/func/registration.js.map +1 -1
  54. package/dist/src/index.d.ts +11 -4
  55. package/dist/src/index.d.ts.map +1 -1
  56. package/dist/src/index.js +12 -3
  57. package/dist/src/index.js.map +1 -1
  58. package/dist/src/parser/parser.d.ts +46 -0
  59. package/dist/src/parser/parser.d.ts.map +1 -1
  60. package/dist/src/parser/parser.js +160 -44
  61. package/dist/src/parser/parser.js.map +1 -1
  62. package/dist/src/planner/analysis/check-extraction.d.ts.map +1 -1
  63. package/dist/src/planner/analysis/check-extraction.js +37 -4
  64. package/dist/src/planner/analysis/check-extraction.js.map +1 -1
  65. package/dist/src/planner/analysis/comparison-collation.d.ts +20 -22
  66. package/dist/src/planner/analysis/comparison-collation.d.ts.map +1 -1
  67. package/dist/src/planner/analysis/comparison-collation.js +29 -26
  68. package/dist/src/planner/analysis/comparison-collation.js.map +1 -1
  69. package/dist/src/planner/analysis/constraint-extractor.d.ts +0 -7
  70. package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
  71. package/dist/src/planner/analysis/constraint-extractor.js +59 -59
  72. package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
  73. package/dist/src/planner/building/alter-table.d.ts.map +1 -1
  74. package/dist/src/planner/building/alter-table.js +65 -27
  75. package/dist/src/planner/building/alter-table.js.map +1 -1
  76. package/dist/src/planner/building/coercion.d.ts +21 -45
  77. package/dist/src/planner/building/coercion.d.ts.map +1 -1
  78. package/dist/src/planner/building/coercion.js +42 -91
  79. package/dist/src/planner/building/coercion.js.map +1 -1
  80. package/dist/src/planner/building/expression.d.ts +17 -0
  81. package/dist/src/planner/building/expression.d.ts.map +1 -1
  82. package/dist/src/planner/building/expression.js +28 -17
  83. package/dist/src/planner/building/expression.js.map +1 -1
  84. package/dist/src/planner/building/function-call.d.ts.map +1 -1
  85. package/dist/src/planner/building/function-call.js +7 -2
  86. package/dist/src/planner/building/function-call.js.map +1 -1
  87. package/dist/src/planner/building/select-aggregates.d.ts +1 -1
  88. package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
  89. package/dist/src/planner/building/select-aggregates.js +53 -2
  90. package/dist/src/planner/building/select-aggregates.js.map +1 -1
  91. package/dist/src/planner/building/select-context.d.ts +7 -0
  92. package/dist/src/planner/building/select-context.d.ts.map +1 -1
  93. package/dist/src/planner/building/select-context.js +10 -40
  94. package/dist/src/planner/building/select-context.js.map +1 -1
  95. package/dist/src/planner/building/select.d.ts +37 -1
  96. package/dist/src/planner/building/select.d.ts.map +1 -1
  97. package/dist/src/planner/building/select.js +112 -51
  98. package/dist/src/planner/building/select.js.map +1 -1
  99. package/dist/src/planner/cost/conjunct-cost.d.ts +40 -0
  100. package/dist/src/planner/cost/conjunct-cost.d.ts.map +1 -1
  101. package/dist/src/planner/cost/conjunct-cost.js +45 -0
  102. package/dist/src/planner/cost/conjunct-cost.js.map +1 -1
  103. package/dist/src/planner/cost/index.d.ts +10 -0
  104. package/dist/src/planner/cost/index.d.ts.map +1 -1
  105. package/dist/src/planner/cost/index.js +15 -0
  106. package/dist/src/planner/cost/index.js.map +1 -1
  107. package/dist/src/planner/nodes/aggregate-node.d.ts +6 -0
  108. package/dist/src/planner/nodes/aggregate-node.d.ts.map +1 -1
  109. package/dist/src/planner/nodes/aggregate-node.js +10 -2
  110. package/dist/src/planner/nodes/aggregate-node.js.map +1 -1
  111. package/dist/src/planner/nodes/alias-node.d.ts.map +1 -1
  112. package/dist/src/planner/nodes/alias-node.js +2 -1
  113. package/dist/src/planner/nodes/alias-node.js.map +1 -1
  114. package/dist/src/planner/nodes/alter-table-node.d.ts +24 -8
  115. package/dist/src/planner/nodes/alter-table-node.d.ts.map +1 -1
  116. package/dist/src/planner/nodes/alter-table-node.js.map +1 -1
  117. package/dist/src/planner/nodes/asof-scan-node.d.ts.map +1 -1
  118. package/dist/src/planner/nodes/asof-scan-node.js +4 -1
  119. package/dist/src/planner/nodes/asof-scan-node.js.map +1 -1
  120. package/dist/src/planner/nodes/asserted-keys-node.d.ts.map +1 -1
  121. package/dist/src/planner/nodes/asserted-keys-node.js +2 -1
  122. package/dist/src/planner/nodes/asserted-keys-node.js.map +1 -1
  123. package/dist/src/planner/nodes/bloom-join-node.d.ts.map +1 -1
  124. package/dist/src/planner/nodes/bloom-join-node.js +8 -3
  125. package/dist/src/planner/nodes/bloom-join-node.js.map +1 -1
  126. package/dist/src/planner/nodes/cache-node.d.ts.map +1 -1
  127. package/dist/src/planner/nodes/cache-node.js +2 -1
  128. package/dist/src/planner/nodes/cache-node.js.map +1 -1
  129. package/dist/src/planner/nodes/distinct-node.d.ts +6 -0
  130. package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
  131. package/dist/src/planner/nodes/distinct-node.js +10 -2
  132. package/dist/src/planner/nodes/distinct-node.js.map +1 -1
  133. package/dist/src/planner/nodes/eager-prefetch-node.d.ts.map +1 -1
  134. package/dist/src/planner/nodes/eager-prefetch-node.js +2 -1
  135. package/dist/src/planner/nodes/eager-prefetch-node.js.map +1 -1
  136. package/dist/src/planner/nodes/fanout-lookup-join-node.d.ts +5 -0
  137. package/dist/src/planner/nodes/fanout-lookup-join-node.d.ts.map +1 -1
  138. package/dist/src/planner/nodes/fanout-lookup-join-node.js +13 -6
  139. package/dist/src/planner/nodes/fanout-lookup-join-node.js.map +1 -1
  140. package/dist/src/planner/nodes/filter.d.ts.map +1 -1
  141. package/dist/src/planner/nodes/filter.js +12 -5
  142. package/dist/src/planner/nodes/filter.js.map +1 -1
  143. package/dist/src/planner/nodes/hash-aggregate.d.ts +6 -0
  144. package/dist/src/planner/nodes/hash-aggregate.d.ts.map +1 -1
  145. package/dist/src/planner/nodes/hash-aggregate.js +10 -2
  146. package/dist/src/planner/nodes/hash-aggregate.js.map +1 -1
  147. package/dist/src/planner/nodes/join-node.d.ts +20 -1
  148. package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
  149. package/dist/src/planner/nodes/join-node.js +30 -9
  150. package/dist/src/planner/nodes/join-node.js.map +1 -1
  151. package/dist/src/planner/nodes/join-utils.d.ts +21 -0
  152. package/dist/src/planner/nodes/join-utils.d.ts.map +1 -1
  153. package/dist/src/planner/nodes/join-utils.js +26 -0
  154. package/dist/src/planner/nodes/join-utils.js.map +1 -1
  155. package/dist/src/planner/nodes/key-set-semi-join-node.d.ts.map +1 -1
  156. package/dist/src/planner/nodes/key-set-semi-join-node.js +5 -1
  157. package/dist/src/planner/nodes/key-set-semi-join-node.js.map +1 -1
  158. package/dist/src/planner/nodes/lens-auxiliary-access-node.d.ts.map +1 -1
  159. package/dist/src/planner/nodes/lens-auxiliary-access-node.js +2 -1
  160. package/dist/src/planner/nodes/lens-auxiliary-access-node.js.map +1 -1
  161. package/dist/src/planner/nodes/limit-offset.d.ts +6 -0
  162. package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
  163. package/dist/src/planner/nodes/limit-offset.js +10 -2
  164. package/dist/src/planner/nodes/limit-offset.js.map +1 -1
  165. package/dist/src/planner/nodes/merge-join-node.d.ts.map +1 -1
  166. package/dist/src/planner/nodes/merge-join-node.js +8 -3
  167. package/dist/src/planner/nodes/merge-join-node.js.map +1 -1
  168. package/dist/src/planner/nodes/ordinal-slice-node.d.ts +5 -0
  169. package/dist/src/planner/nodes/ordinal-slice-node.d.ts.map +1 -1
  170. package/dist/src/planner/nodes/ordinal-slice-node.js +9 -2
  171. package/dist/src/planner/nodes/ordinal-slice-node.js.map +1 -1
  172. package/dist/src/planner/nodes/plan-node.d.ts +24 -0
  173. package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
  174. package/dist/src/planner/nodes/plan-node.js.map +1 -1
  175. package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
  176. package/dist/src/planner/nodes/project-node.js +2 -1
  177. package/dist/src/planner/nodes/project-node.js.map +1 -1
  178. package/dist/src/planner/nodes/reference.d.ts.map +1 -1
  179. package/dist/src/planner/nodes/reference.js +3 -2
  180. package/dist/src/planner/nodes/reference.js.map +1 -1
  181. package/dist/src/planner/nodes/retrieve-node.d.ts.map +1 -1
  182. package/dist/src/planner/nodes/retrieve-node.js +2 -1
  183. package/dist/src/planner/nodes/retrieve-node.js.map +1 -1
  184. package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
  185. package/dist/src/planner/nodes/scalar.js +5 -18
  186. package/dist/src/planner/nodes/scalar.js.map +1 -1
  187. package/dist/src/planner/nodes/sort.d.ts.map +1 -1
  188. package/dist/src/planner/nodes/sort.js +3 -1
  189. package/dist/src/planner/nodes/sort.js.map +1 -1
  190. package/dist/src/planner/nodes/stream-aggregate.d.ts +6 -0
  191. package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
  192. package/dist/src/planner/nodes/stream-aggregate.js +10 -2
  193. package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
  194. package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
  195. package/dist/src/planner/nodes/table-access-nodes.js +5 -0
  196. package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
  197. package/dist/src/planner/nodes/window-function.d.ts.map +1 -1
  198. package/dist/src/planner/nodes/window-function.js +8 -0
  199. package/dist/src/planner/nodes/window-function.js.map +1 -1
  200. package/dist/src/planner/nodes/window-node.d.ts +1 -1
  201. package/dist/src/planner/nodes/window-node.d.ts.map +1 -1
  202. package/dist/src/planner/nodes/window-node.js +3 -1
  203. package/dist/src/planner/nodes/window-node.js.map +1 -1
  204. package/dist/src/planner/optimizer.d.ts +9 -1
  205. package/dist/src/planner/optimizer.d.ts.map +1 -1
  206. package/dist/src/planner/optimizer.js +77 -6
  207. package/dist/src/planner/optimizer.js.map +1 -1
  208. package/dist/src/planner/rules/access/rule-key-set-seek.d.ts.map +1 -1
  209. package/dist/src/planner/rules/access/rule-key-set-seek.js +3 -68
  210. package/dist/src/planner/rules/access/rule-key-set-seek.js.map +1 -1
  211. package/dist/src/planner/rules/access/rule-select-access-path.d.ts +19 -0
  212. package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
  213. package/dist/src/planner/rules/access/rule-select-access-path.js +24 -3
  214. package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
  215. package/dist/src/planner/rules/cache/rule-cte-optimization.d.ts.map +1 -1
  216. package/dist/src/planner/rules/cache/rule-cte-optimization.js +9 -0
  217. package/dist/src/planner/rules/cache/rule-cte-optimization.js.map +1 -1
  218. package/dist/src/planner/rules/cache/rule-nested-loop-right-cache.d.ts.map +1 -1
  219. package/dist/src/planner/rules/cache/rule-nested-loop-right-cache.js +6 -4
  220. package/dist/src/planner/rules/cache/rule-nested-loop-right-cache.js.map +1 -1
  221. package/dist/src/planner/rules/join/equi-pair-extractor.d.ts +5 -31
  222. package/dist/src/planner/rules/join/equi-pair-extractor.d.ts.map +1 -1
  223. package/dist/src/planner/rules/join/equi-pair-extractor.js +4 -44
  224. package/dist/src/planner/rules/join/equi-pair-extractor.js.map +1 -1
  225. package/dist/src/planner/rules/join/index-nested-loop.d.ts +49 -0
  226. package/dist/src/planner/rules/join/index-nested-loop.d.ts.map +1 -0
  227. package/dist/src/planner/rules/join/index-nested-loop.js +285 -0
  228. package/dist/src/planner/rules/join/index-nested-loop.js.map +1 -0
  229. package/dist/src/planner/rules/join/rule-fanout-batched-outer.js +8 -8
  230. package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts +10 -4
  231. package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts.map +1 -1
  232. package/dist/src/planner/rules/join/rule-join-physical-selection.js +83 -27
  233. package/dist/src/planner/rules/join/rule-join-physical-selection.js.map +1 -1
  234. package/dist/src/planner/rules/join/rule-monotonic-merge-join.js +4 -4
  235. package/dist/src/planner/rules/join/rule-monotonic-merge-join.js.map +1 -1
  236. package/dist/src/planner/rules/predicate/rule-filter-conjunct-ordering.d.ts +21 -8
  237. package/dist/src/planner/rules/predicate/rule-filter-conjunct-ordering.d.ts.map +1 -1
  238. package/dist/src/planner/rules/predicate/rule-filter-conjunct-ordering.js +70 -14
  239. package/dist/src/planner/rules/predicate/rule-filter-conjunct-ordering.js.map +1 -1
  240. package/dist/src/planner/rules/predicate/rule-filter-selectivity.d.ts +42 -17
  241. package/dist/src/planner/rules/predicate/rule-filter-selectivity.d.ts.map +1 -1
  242. package/dist/src/planner/rules/predicate/rule-filter-selectivity.js +84 -154
  243. package/dist/src/planner/rules/predicate/rule-filter-selectivity.js.map +1 -1
  244. package/dist/src/planner/rules/predicate/rule-join-predicate-pushdown.d.ts +73 -0
  245. package/dist/src/planner/rules/predicate/rule-join-predicate-pushdown.d.ts.map +1 -0
  246. package/dist/src/planner/rules/predicate/rule-join-predicate-pushdown.js +205 -0
  247. package/dist/src/planner/rules/predicate/rule-join-predicate-pushdown.js.map +1 -0
  248. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.d.ts +14 -11
  249. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.d.ts.map +1 -1
  250. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js +21 -85
  251. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js.map +1 -1
  252. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.d.ts +7 -1
  253. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.d.ts.map +1 -1
  254. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js +7 -1
  255. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js.map +1 -1
  256. package/dist/src/planner/rules/shared/access-leaf.d.ts +39 -0
  257. package/dist/src/planner/rules/shared/access-leaf.d.ts.map +1 -0
  258. package/dist/src/planner/rules/shared/access-leaf.js +79 -0
  259. package/dist/src/planner/rules/shared/access-leaf.js.map +1 -0
  260. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.d.ts.map +1 -1
  261. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js +18 -8
  262. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js.map +1 -1
  263. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.d.ts +3 -1
  264. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.d.ts.map +1 -1
  265. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js +27 -10
  266. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js.map +1 -1
  267. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts.map +1 -1
  268. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js +69 -11
  269. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js.map +1 -1
  270. package/dist/src/planner/rules/window/rule-monotonic-window.d.ts +17 -7
  271. package/dist/src/planner/rules/window/rule-monotonic-window.d.ts.map +1 -1
  272. package/dist/src/planner/rules/window/rule-monotonic-window.js +124 -87
  273. package/dist/src/planner/rules/window/rule-monotonic-window.js.map +1 -1
  274. package/dist/src/planner/scopes/aliased.d.ts.map +1 -1
  275. package/dist/src/planner/scopes/aliased.js +6 -0
  276. package/dist/src/planner/scopes/aliased.js.map +1 -1
  277. package/dist/src/planner/stats/catalog-stats.d.ts +44 -13
  278. package/dist/src/planner/stats/catalog-stats.d.ts.map +1 -1
  279. package/dist/src/planner/stats/catalog-stats.js +137 -61
  280. package/dist/src/planner/stats/catalog-stats.js.map +1 -1
  281. package/dist/src/planner/stats/conjunct-selectivity.d.ts +48 -0
  282. package/dist/src/planner/stats/conjunct-selectivity.d.ts.map +1 -0
  283. package/dist/src/planner/stats/conjunct-selectivity.js +168 -0
  284. package/dist/src/planner/stats/conjunct-selectivity.js.map +1 -0
  285. package/dist/src/planner/stats/index.d.ts +22 -3
  286. package/dist/src/planner/stats/index.d.ts.map +1 -1
  287. package/dist/src/planner/stats/index.js.map +1 -1
  288. package/dist/src/planner/stats/table-cardinality.d.ts +28 -0
  289. package/dist/src/planner/stats/table-cardinality.d.ts.map +1 -0
  290. package/dist/src/planner/stats/table-cardinality.js +29 -0
  291. package/dist/src/planner/stats/table-cardinality.js.map +1 -0
  292. package/dist/src/planner/util/column-origins.d.ts +29 -8
  293. package/dist/src/planner/util/column-origins.d.ts.map +1 -1
  294. package/dist/src/planner/util/column-origins.js +74 -14
  295. package/dist/src/planner/util/column-origins.js.map +1 -1
  296. package/dist/src/planner/util/fd-utils.d.ts +32 -8
  297. package/dist/src/planner/util/fd-utils.d.ts.map +1 -1
  298. package/dist/src/planner/util/fd-utils.js +46 -9
  299. package/dist/src/planner/util/fd-utils.js.map +1 -1
  300. package/dist/src/planner/util/ind-utils.d.ts +56 -17
  301. package/dist/src/planner/util/ind-utils.d.ts.map +1 -1
  302. package/dist/src/planner/util/ind-utils.js +82 -21
  303. package/dist/src/planner/util/ind-utils.js.map +1 -1
  304. package/dist/src/planner/util/key-utils.d.ts +20 -2
  305. package/dist/src/planner/util/key-utils.d.ts.map +1 -1
  306. package/dist/src/planner/util/key-utils.js +37 -3
  307. package/dist/src/planner/util/key-utils.js.map +1 -1
  308. package/dist/src/planner/util/row-estimates.d.ts +28 -0
  309. package/dist/src/planner/util/row-estimates.d.ts.map +1 -0
  310. package/dist/src/planner/util/row-estimates.js +40 -0
  311. package/dist/src/planner/util/row-estimates.js.map +1 -0
  312. package/dist/src/planner/util/row-population.d.ts +42 -0
  313. package/dist/src/planner/util/row-population.d.ts.map +1 -0
  314. package/dist/src/planner/util/row-population.js +71 -0
  315. package/dist/src/planner/util/row-population.js.map +1 -0
  316. package/dist/src/runtime/emit/add-constraint.d.ts.map +1 -1
  317. package/dist/src/runtime/emit/add-constraint.js +39 -1
  318. package/dist/src/runtime/emit/add-constraint.js.map +1 -1
  319. package/dist/src/runtime/emit/aggregate.d.ts.map +1 -1
  320. package/dist/src/runtime/emit/aggregate.js +4 -4
  321. package/dist/src/runtime/emit/aggregate.js.map +1 -1
  322. package/dist/src/runtime/emit/alter-schema-event.d.ts +42 -0
  323. package/dist/src/runtime/emit/alter-schema-event.d.ts.map +1 -0
  324. package/dist/src/runtime/emit/alter-schema-event.js +28 -0
  325. package/dist/src/runtime/emit/alter-schema-event.js.map +1 -0
  326. package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
  327. package/dist/src/runtime/emit/alter-table.js +380 -154
  328. package/dist/src/runtime/emit/alter-table.js.map +1 -1
  329. package/dist/src/runtime/emit/analyze.d.ts.map +1 -1
  330. package/dist/src/runtime/emit/analyze.js +35 -3
  331. package/dist/src/runtime/emit/analyze.js.map +1 -1
  332. package/dist/src/runtime/emit/cast.d.ts.map +1 -1
  333. package/dist/src/runtime/emit/cast.js +4 -19
  334. package/dist/src/runtime/emit/cast.js.map +1 -1
  335. package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
  336. package/dist/src/runtime/emit/dml-executor.js +64 -27
  337. package/dist/src/runtime/emit/dml-executor.js.map +1 -1
  338. package/dist/src/runtime/emit/drop-index.d.ts.map +1 -1
  339. package/dist/src/runtime/emit/drop-index.js +4 -3
  340. package/dist/src/runtime/emit/drop-index.js.map +1 -1
  341. package/dist/src/runtime/emit/hash-aggregate.d.ts.map +1 -1
  342. package/dist/src/runtime/emit/hash-aggregate.js +2 -2
  343. package/dist/src/runtime/emit/hash-aggregate.js.map +1 -1
  344. package/dist/src/runtime/emit/join.d.ts.map +1 -1
  345. package/dist/src/runtime/emit/join.js +8 -67
  346. package/dist/src/runtime/emit/join.js.map +1 -1
  347. package/dist/src/runtime/emit/key-set-semi-join.d.ts.map +1 -1
  348. package/dist/src/runtime/emit/key-set-semi-join.js +6 -0
  349. package/dist/src/runtime/emit/key-set-semi-join.js.map +1 -1
  350. package/dist/src/runtime/emit/operand-comparator.d.ts +30 -0
  351. package/dist/src/runtime/emit/operand-comparator.d.ts.map +1 -1
  352. package/dist/src/runtime/emit/operand-comparator.js +34 -0
  353. package/dist/src/runtime/emit/operand-comparator.js.map +1 -1
  354. package/dist/src/runtime/emit/schema-declarative.d.ts.map +1 -1
  355. package/dist/src/runtime/emit/schema-declarative.js +30 -0
  356. package/dist/src/runtime/emit/schema-declarative.js.map +1 -1
  357. package/dist/src/runtime/emit/subquery.d.ts.map +1 -1
  358. package/dist/src/runtime/emit/subquery.js +153 -52
  359. package/dist/src/runtime/emit/subquery.js.map +1 -1
  360. package/dist/src/runtime/emit/window.js +36 -23
  361. package/dist/src/runtime/emit/window.js.map +1 -1
  362. package/dist/src/schema/catalog-persistability.d.ts +19 -16
  363. package/dist/src/schema/catalog-persistability.d.ts.map +1 -1
  364. package/dist/src/schema/catalog-persistability.js +76 -20
  365. package/dist/src/schema/catalog-persistability.js.map +1 -1
  366. package/dist/src/schema/catalog.d.ts +67 -2
  367. package/dist/src/schema/catalog.d.ts.map +1 -1
  368. package/dist/src/schema/catalog.js +194 -3
  369. package/dist/src/schema/catalog.js.map +1 -1
  370. package/dist/src/schema/column.d.ts +26 -3
  371. package/dist/src/schema/column.d.ts.map +1 -1
  372. package/dist/src/schema/column.js.map +1 -1
  373. package/dist/src/schema/ddl-generator.d.ts.map +1 -1
  374. package/dist/src/schema/ddl-generator.js +19 -6
  375. package/dist/src/schema/ddl-generator.js.map +1 -1
  376. package/dist/src/schema/function.d.ts +32 -1
  377. package/dist/src/schema/function.d.ts.map +1 -1
  378. package/dist/src/schema/function.js +10 -2
  379. package/dist/src/schema/function.js.map +1 -1
  380. package/dist/src/schema/manager.d.ts +84 -7
  381. package/dist/src/schema/manager.d.ts.map +1 -1
  382. package/dist/src/schema/manager.js +153 -53
  383. package/dist/src/schema/manager.js.map +1 -1
  384. package/dist/src/schema/schema-differ.d.ts.map +1 -1
  385. package/dist/src/schema/schema-differ.js +104 -28
  386. package/dist/src/schema/schema-differ.js.map +1 -1
  387. package/dist/src/schema/table.d.ts +149 -1
  388. package/dist/src/schema/table.d.ts.map +1 -1
  389. package/dist/src/schema/table.js +248 -1
  390. package/dist/src/schema/table.js.map +1 -1
  391. package/dist/src/schema/unique-enforcement.d.ts +5 -3
  392. package/dist/src/schema/unique-enforcement.d.ts.map +1 -1
  393. package/dist/src/schema/unique-enforcement.js +5 -3
  394. package/dist/src/schema/unique-enforcement.js.map +1 -1
  395. package/dist/src/types/builtin-types.d.ts +16 -0
  396. package/dist/src/types/builtin-types.d.ts.map +1 -1
  397. package/dist/src/types/builtin-types.js +46 -8
  398. package/dist/src/types/builtin-types.js.map +1 -1
  399. package/dist/src/types/cast-semantics.d.ts +42 -0
  400. package/dist/src/types/cast-semantics.d.ts.map +1 -1
  401. package/dist/src/types/cast-semantics.js +64 -0
  402. package/dist/src/types/cast-semantics.js.map +1 -1
  403. package/dist/src/types/comparison-coercion.d.ts +101 -0
  404. package/dist/src/types/comparison-coercion.d.ts.map +1 -0
  405. package/dist/src/types/comparison-coercion.js +162 -0
  406. package/dist/src/types/comparison-coercion.js.map +1 -0
  407. package/dist/src/types/index.d.ts +2 -2
  408. package/dist/src/types/index.d.ts.map +1 -1
  409. package/dist/src/types/index.js +2 -2
  410. package/dist/src/types/index.js.map +1 -1
  411. package/dist/src/types/logical-type.d.ts +7 -0
  412. package/dist/src/types/logical-type.d.ts.map +1 -1
  413. package/dist/src/types/logical-type.js.map +1 -1
  414. package/dist/src/types/validation.d.ts +56 -0
  415. package/dist/src/types/validation.d.ts.map +1 -1
  416. package/dist/src/types/validation.js +68 -0
  417. package/dist/src/types/validation.js.map +1 -1
  418. package/dist/src/util/coercion.d.ts +8 -0
  419. package/dist/src/util/coercion.d.ts.map +1 -1
  420. package/dist/src/util/coercion.js +8 -0
  421. package/dist/src/util/coercion.js.map +1 -1
  422. package/dist/src/util/comparison.d.ts +16 -3
  423. package/dist/src/util/comparison.d.ts.map +1 -1
  424. package/dist/src/util/comparison.js +21 -5
  425. package/dist/src/util/comparison.js.map +1 -1
  426. package/dist/src/util/key-serializer.d.ts +46 -0
  427. package/dist/src/util/key-serializer.d.ts.map +1 -1
  428. package/dist/src/util/key-serializer.js +47 -0
  429. package/dist/src/util/key-serializer.js.map +1 -1
  430. package/dist/src/util/value-set.d.ts +21 -0
  431. package/dist/src/util/value-set.d.ts.map +1 -0
  432. package/dist/src/util/value-set.js +22 -0
  433. package/dist/src/util/value-set.js.map +1 -0
  434. package/dist/src/vtab/capabilities.d.ts +1 -1
  435. package/dist/src/vtab/events.d.ts +5 -1
  436. package/dist/src/vtab/events.d.ts.map +1 -1
  437. package/dist/src/vtab/events.js.map +1 -1
  438. package/dist/src/vtab/memory/layer/alter-column.d.ts +147 -0
  439. package/dist/src/vtab/memory/layer/alter-column.d.ts.map +1 -0
  440. package/dist/src/vtab/memory/layer/alter-column.js +214 -0
  441. package/dist/src/vtab/memory/layer/alter-column.js.map +1 -0
  442. package/dist/src/vtab/memory/layer/base.d.ts.map +1 -1
  443. package/dist/src/vtab/memory/layer/base.js +4 -3
  444. package/dist/src/vtab/memory/layer/base.js.map +1 -1
  445. package/dist/src/vtab/memory/layer/interface.d.ts +2 -2
  446. package/dist/src/vtab/memory/layer/interface.d.ts.map +1 -1
  447. package/dist/src/vtab/memory/layer/manager.d.ts +176 -25
  448. package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
  449. package/dist/src/vtab/memory/layer/manager.js +572 -495
  450. package/dist/src/vtab/memory/layer/manager.js.map +1 -1
  451. package/dist/src/vtab/memory/layer/scan-layer.d.ts.map +1 -1
  452. package/dist/src/vtab/memory/layer/scan-layer.js +32 -5
  453. package/dist/src/vtab/memory/layer/scan-layer.js.map +1 -1
  454. package/dist/src/vtab/memory/layer/transaction.d.ts +101 -15
  455. package/dist/src/vtab/memory/layer/transaction.d.ts.map +1 -1
  456. package/dist/src/vtab/memory/layer/transaction.js +133 -45
  457. package/dist/src/vtab/memory/layer/transaction.js.map +1 -1
  458. package/dist/src/vtab/memory/module.d.ts.map +1 -1
  459. package/dist/src/vtab/memory/module.js +2 -1
  460. package/dist/src/vtab/memory/module.js.map +1 -1
  461. package/dist/src/vtab/memory/table.d.ts.map +1 -1
  462. package/dist/src/vtab/memory/table.js +11 -6
  463. package/dist/src/vtab/memory/table.js.map +1 -1
  464. package/dist/src/vtab/module.d.ts +51 -21
  465. package/dist/src/vtab/module.d.ts.map +1 -1
  466. package/dist/src/vtab/table.d.ts +1 -1
  467. package/dist/src/vtab/table.js +1 -1
  468. package/package.json +3 -3
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Per-conjunct selectivity estimation shared by `rule-filter-selectivity`
3
+ * (which folds the estimates into one stamped number) and
4
+ * `rule-filter-conjunct-ordering` (which ranks conjuncts individually).
5
+ * Extracted verbatim from the former so the two cannot drift.
6
+ *
7
+ * Everything here is gated on REAL statistics: a single-relation conjunct goes
8
+ * through `statsOnlySelectivity` (never `selectivity`, whose NaiveStatsProvider
9
+ * fallback fabricates a per-nodeType guess), and a cross-relation conjunct
10
+ * requires `columnStats` for both compared columns. Undefined always means
11
+ * "no real statistics answered", never "here is a guess".
12
+ *
13
+ * Do NOT re-export this module from `stats/index.ts`: `framework/context.ts`
14
+ * imports `stats/index.ts`, and this module type-imports `OptContext` from
15
+ * `framework/context.ts`, so a barrel re-export would create an import cycle
16
+ * (mirroring the same note on `cost/conjunct-cost.ts`).
17
+ *
18
+ * NOTE: a CORRELATED subquery conjunct (`exists (select … where i.oid = o.id)`)
19
+ * can resolve an outer attribute id through `conjunctRelations` — the walk
20
+ * descends relational children — and come back with a base-column estimate that
21
+ * describes the OUTER column rather than the subquery's result. Pre-existing in
22
+ * the stamping path, and bounded in the ordering path because the cost tier is
23
+ * the primary sort key: such a conjunct is `Subquery` tier, so a bogus estimate
24
+ * can only reorder it against other `Subquery`-tier conjuncts, never lift it
25
+ * ahead of a `Pure` one.
26
+ */
27
+ import { BinaryOpNode } from '../nodes/scalar.js';
28
+ import { ColumnReferenceNode } from '../nodes/reference.js';
29
+ /**
30
+ * Selectivity of an inequality (`<` `<=` `>` `>=`) comparing a column of one table
31
+ * to a column of another. The standard uniform-distribution estimate for a
32
+ * two-sided inequality is 1/3: there is no cross-table histogram, so nothing
33
+ * better than the uniform assumption is available here.
34
+ */
35
+ export const CROSS_RELATION_INEQUALITY_SELECTIVITY = 1 / 3;
36
+ /**
37
+ * A resolver over `origins`, restricted to the origins `accept` allows.
38
+ *
39
+ * An attribute with no origin — or one belonging to a relation the caller is not
40
+ * currently estimating — resolves to undefined, which the provider reads as "this
41
+ * column has no statistics" rather than falling back to its AST name.
42
+ */
43
+ export function makeColumnStatsResolver(origins, accept) {
44
+ return (attributeId) => {
45
+ const origin = origins.get(attributeId);
46
+ return origin && accept(origin) ? origin.columnName : undefined;
47
+ };
48
+ }
49
+ /** Estimate one conjunct, or undefined when it cannot be attributed / estimated. */
50
+ export function estimateConjunctSelectivity(conjunct, origins, context) {
51
+ const relations = conjunctRelations(conjunct, origins);
52
+ if (relations === undefined)
53
+ return undefined;
54
+ if (relations.size === 1) {
55
+ const [[relation, table]] = relations;
56
+ // Relation-instance identity, not schema: `from t a join t b` gives two
57
+ // instances sharing one TableSchema, so schema equality would not separate the
58
+ // sides. `conjunctRelations` has already established that this conjunct touches
59
+ // exactly this one instance.
60
+ const resolve = makeColumnStatsResolver(origins, origin => origin.relation === relation);
61
+ return singleRelationConjunct(table, conjunct, resolve, context);
62
+ }
63
+ if (relations.size === 2) {
64
+ return crossRelationConjunct(conjunct, origins, context);
65
+ }
66
+ // Three or more relations in one conjunct: no model for it here.
67
+ return undefined;
68
+ }
69
+ /**
70
+ * The distinct relation instances a conjunct's column references come from, each
71
+ * mapped to the schema whose statistics describe it.
72
+ *
73
+ * Returns undefined when the conjunct references no column at all, or references
74
+ * any attribute that is not a base-table column (a computed projection, an
75
+ * aggregate output, a join existence flag, a set-operation output, a column of a
76
+ * table inside a scalar subquery) — in either case there are no statistics to
77
+ * consult.
78
+ */
79
+ function conjunctRelations(conjunct, origins) {
80
+ const relations = new Map();
81
+ const stack = [conjunct];
82
+ while (stack.length > 0) {
83
+ const n = stack.pop();
84
+ if (n instanceof ColumnReferenceNode) {
85
+ const origin = origins.get(n.attributeId);
86
+ if (!origin)
87
+ return undefined;
88
+ relations.set(origin.relation, origin.table);
89
+ continue;
90
+ }
91
+ for (const child of n.getChildren())
92
+ stack.push(child);
93
+ }
94
+ return relations.size > 0 ? relations : undefined;
95
+ }
96
+ /**
97
+ * A conjunct over exactly one relation: hand it to the provider as if it were a
98
+ * single-table predicate.
99
+ *
100
+ * `statsOnlySelectivity` — not `selectivity` — IS the statistics gate. `selectivity`
101
+ * always returns a number (CatalogStatsProvider falls through to NaiveStatsProvider,
102
+ * which answers a flat 0.1 for any BinaryOp), so using it here would replace 0.5 with
103
+ * 0.1 on essentially every filter-over-join in the codebase — including the many tests
104
+ * that never run ANALYZE — churning plan shapes with no information behind the change.
105
+ * It also covers the subtler case of an analyzed table with a predicate the catalog
106
+ * cannot read (`lower(o.cat) = 'x'`), which a column-stats-presence check would let
107
+ * through. A provider that does not implement it is treated as having no statistics.
108
+ */
109
+ function singleRelationConjunct(table, conjunct, resolve, context) {
110
+ return context.stats.statsOnlySelectivity?.(table, conjunct, resolve);
111
+ }
112
+ function hasColumnStats(origin) {
113
+ return origin.table.statistics?.columnStats.has(origin.columnName.toLowerCase()) ?? false;
114
+ }
115
+ /**
116
+ * A conjunct comparing a column of one relation to a column of another
117
+ * (`o.qty > l.qty`, `a.id = b.id`). Only a plain binary comparison with a bare
118
+ * column reference on each side is modelled; anything else is unknown.
119
+ *
120
+ * Gated on real column statistics for BOTH compared columns, for the same reason as
121
+ * {@link singleRelationConjunct}: `joinSelectivity` falls back to
122
+ * `NaiveStatsProvider`'s `1/max(rowCount)` whenever it cannot read a distinct count,
123
+ * so table-level `statistics` being present is not enough on its own.
124
+ */
125
+ function crossRelationConjunct(conjunct, origins, context) {
126
+ if (!(conjunct instanceof BinaryOpNode))
127
+ return undefined;
128
+ if (!(conjunct.left instanceof ColumnReferenceNode))
129
+ return undefined;
130
+ if (!(conjunct.right instanceof ColumnReferenceNode))
131
+ return undefined;
132
+ const leftOrigin = origins.get(conjunct.left.attributeId);
133
+ const rightOrigin = origins.get(conjunct.right.attributeId);
134
+ if (!leftOrigin || !rightOrigin)
135
+ return undefined;
136
+ if (!hasColumnStats(leftOrigin) || !hasColumnStats(rightOrigin))
137
+ return undefined;
138
+ const op = conjunct.expression.operator;
139
+ // Both origins were resolved and stats-checked by identity just above, so no
140
+ // further narrowing is needed — the resolver only has to replace the AST names
141
+ // with the base columns those two attributes actually are.
142
+ const resolve = makeColumnStatsResolver(origins, () => true);
143
+ if (op === '=' || op === '==')
144
+ return equiJoinSelectivity(conjunct, leftOrigin, rightOrigin, resolve, context);
145
+ // `extractEquiJoinColumns` accepts only `=`, so the catalog declines a `<>` and
146
+ // `joinSelectivity` answers from NaiveStatsProvider, which is capped at 0.5. The
147
+ // complement is therefore bounded to [0.5, 1] — it can only ever relax the
148
+ // estimate relative to DEFAULT_FILTER_SELECTIVITY, and the true value for a
149
+ // cross-relation `<>` is near 1, so the bound errs in the right direction.
150
+ if (op === '!=' || op === '<>') {
151
+ const eq = equiJoinSelectivity(conjunct, leftOrigin, rightOrigin, resolve, context);
152
+ return eq === undefined ? undefined : 1 - eq;
153
+ }
154
+ if (op === '<' || op === '<=' || op === '>' || op === '>=') {
155
+ return CROSS_RELATION_INEQUALITY_SELECTIVITY;
156
+ }
157
+ return undefined;
158
+ }
159
+ /**
160
+ * Argument order matters: `CatalogStatsProvider.joinSelectivity` reads the column
161
+ * pair off the condition's own child order (`extractEquiJoinColumns`) and
162
+ * `fkPkSelectivity` interprets left/right against the tables it was handed. So the
163
+ * table owning the conjunct's LEFT child must be passed first.
164
+ */
165
+ function equiJoinSelectivity(conjunct, leftOrigin, rightOrigin, resolve, context) {
166
+ return context.stats.joinSelectivity?.(leftOrigin.table, rightOrigin.table, conjunct, resolve);
167
+ }
168
+ //# sourceMappingURL=conjunct-selectivity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conjunct-selectivity.js","sourceRoot":"","sources":["../../../../src/planner/stats/conjunct-selectivity.ts"],"names":[],"mappings":"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"}
@@ -4,8 +4,24 @@
4
4
  */
5
5
  import type { ScalarPlanNode } from '../nodes/plan-node.js';
6
6
  import type { TableSchema } from '../../schema/table.js';
7
+ /**
8
+ * Resolves the attribute id of a column reference appearing in a predicate to the
9
+ * name of the base-table column whose statistics describe it.
10
+ *
11
+ * Returns undefined when the attribute was minted above the base table (a computed
12
+ * projection, an aggregate or window output, a set-operation output) — such a column
13
+ * has no base-table statistics, whatever it happens to be named.
14
+ */
15
+ export type ColumnStatsResolver = (attributeId: number) => string | undefined;
7
16
  /**
8
17
  * Statistics provider interface for optimizer
18
+ *
19
+ * The `resolve` parameter on the selectivity family identifies a predicate's columns
20
+ * by attribute identity rather than by the name in their AST. A caller holding a plan
21
+ * tree MUST pass one: without it a provider falls back to the syntactic name, and a
22
+ * computed column aliased to a base column's name silently borrows that column's
23
+ * statistics. It stays optional only for callers with no plan context (direct unit
24
+ * tests over hand-built nodes).
9
25
  */
10
26
  export interface StatsProvider {
11
27
  /**
@@ -18,9 +34,10 @@ export interface StatsProvider {
18
34
  * Get selectivity estimate for a predicate on a table
19
35
  * @param table Table schema
20
36
  * @param predicate Predicate expression
37
+ * @param resolve Attribute id → base-column name; see {@link ColumnStatsResolver}
21
38
  * @returns Selectivity factor (0.0 to 1.0), or undefined if unknown
22
39
  */
23
- selectivity(table: TableSchema, predicate: ScalarPlanNode): number | undefined;
40
+ selectivity(table: TableSchema, predicate: ScalarPlanNode, resolve?: ColumnStatsResolver): number | undefined;
24
41
  /**
25
42
  * Selectivity derived from REAL statistics only, with no heuristic fallback.
26
43
  *
@@ -33,17 +50,19 @@ export interface StatsProvider {
33
50
  *
34
51
  * @param table Table schema
35
52
  * @param predicate Predicate expression
53
+ * @param resolve Attribute id → base-column name; see {@link ColumnStatsResolver}
36
54
  * @returns Selectivity factor (0.0 to 1.0), or undefined if real statistics cannot answer
37
55
  */
38
- statsOnlySelectivity?(table: TableSchema, predicate: ScalarPlanNode): number | undefined;
56
+ statsOnlySelectivity?(table: TableSchema, predicate: ScalarPlanNode, resolve?: ColumnStatsResolver): number | undefined;
39
57
  /**
40
58
  * Get join selectivity estimate
41
59
  * @param leftTable Left table schema
42
60
  * @param rightTable Right table schema
43
61
  * @param joinCondition Join condition
62
+ * @param resolve Attribute id → base-column name; see {@link ColumnStatsResolver}
44
63
  * @returns Join selectivity factor, or undefined if unknown
45
64
  */
46
- joinSelectivity?(leftTable: TableSchema, rightTable: TableSchema, joinCondition: ScalarPlanNode): number | undefined;
65
+ joinSelectivity?(leftTable: TableSchema, rightTable: TableSchema, joinCondition: ScalarPlanNode, resolve?: ColumnStatsResolver): number | undefined;
47
66
  /**
48
67
  * Get number of distinct values for a column
49
68
  * @param table Table schema
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/planner/stats/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAKzD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;IAElD;;;;;OAKG;IACH,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAAC;IAE/E;;;;;;;;;;;;;OAaG;IACH,oBAAoB,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAAC;IAEzF;;;;;;OAMG;IACH,eAAe,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAAC;IAErH;;;;;OAKG;IACH,cAAc,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAE5E;;;;;;OAMG;IACH,gBAAgB,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAAC;CACxG;AAED;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,aAAa;IAEtD,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,kBAAkB;gBADlB,gBAAgB,GAAE,MAAa,EAC/B,kBAAkB,GAAE,MAAY;IAMlD,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS;IAQjD,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS;IAO9E,eAAe,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS;IAWpH,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAU1E,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS;IAQtG,OAAO,CAAC,4BAA4B;CAmBpC;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,oBAA2B,CAAC;AAE7D;;GAEG;AACH,wBAAgB,mBAAmB,CAClC,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAClC,aAAa,CAWf"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/planner/stats/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAKzD;;;;;;;GAOG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;AAE9E;;;;;;;;;GASG;AACH,MAAM,WAAW,aAAa;IAC7B;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;IAElD;;;;;;OAMG;IACH,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,MAAM,GAAG,SAAS,CAAC;IAE9G;;;;;;;;;;;;;;OAcG;IACH,oBAAoB,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,MAAM,GAAG,SAAS,CAAC;IAExH;;;;;;;OAOG;IACH,eAAe,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,MAAM,GAAG,SAAS,CAAC;IAEpJ;;;;;OAKG;IACH,cAAc,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAE5E;;;;;;OAMG;IACH,gBAAgB,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAAC;CACxG;AAED;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,aAAa;IAEtD,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,kBAAkB;gBADlB,gBAAgB,GAAE,MAAa,EAC/B,kBAAkB,GAAE,MAAY;IAMlD,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS;IAQjD,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS;IAO9E,eAAe,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS;IAWpH,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAU1E,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS;IAQtG,OAAO,CAAC,4BAA4B;CAmBpC;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,oBAA2B,CAAC;AAE7D;;GAEG;AACH,wBAAgB,mBAAmB,CAClC,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAClC,aAAa,CAWf"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/planner/stats/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/planner/stats/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Shared base-table row-count helper.
3
+ *
4
+ * Statistics-first: prefer the `ANALYZE`-collected `rowCount` over the static
5
+ * `TableSchema.estimatedRows` field (which `SchemaManager` hardcodes to 0 at
6
+ * CREATE TABLE and never updates). `undefined` means "nobody knows" and must
7
+ * stay `undefined` — callers apply their own fallback (e.g. NaiveStatsProvider's
8
+ * default of 1000); folding that default in here would change every
9
+ * un-analyzed table's cardinality.
10
+ *
11
+ * `TableReferenceNode.estimatedRows` and `CatalogStatsProvider.tableRows` both
12
+ * call this so the logical/physical estimate and the stats-provider estimate
13
+ * cannot drift apart.
14
+ *
15
+ * NOTE: `rowCount` is a snapshot from the last `ANALYZE` — rows written
16
+ * afterwards are invisible until the next one.
17
+ *
18
+ * NOTE: a real 0 (analyzed, empty table) is distinct from `undefined`, but the
19
+ * `estimatedRows || default` spellings in `rule-select-access-path`,
20
+ * `rule-grow-retrieve` and `IndexSeekNode.computePhysical` collapse the two and
21
+ * substitute their default — so an analyzed empty table reaches
22
+ * `getBestAccessPlan` as "unknown" (1000) while a SeqScan over it reports 0.
23
+ * Harmless today (any plan over 0 rows is cheap); switch those to `??` if an
24
+ * empty-table plan ever costs out wrong.
25
+ */
26
+ import type { TableSchema } from '../../schema/table.js';
27
+ export declare function catalogRowCount(table: TableSchema): number | undefined;
28
+ //# sourceMappingURL=table-cardinality.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-cardinality.d.ts","sourceRoot":"","sources":["../../../../src/planner/stats/table-cardinality.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAEtE"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Shared base-table row-count helper.
3
+ *
4
+ * Statistics-first: prefer the `ANALYZE`-collected `rowCount` over the static
5
+ * `TableSchema.estimatedRows` field (which `SchemaManager` hardcodes to 0 at
6
+ * CREATE TABLE and never updates). `undefined` means "nobody knows" and must
7
+ * stay `undefined` — callers apply their own fallback (e.g. NaiveStatsProvider's
8
+ * default of 1000); folding that default in here would change every
9
+ * un-analyzed table's cardinality.
10
+ *
11
+ * `TableReferenceNode.estimatedRows` and `CatalogStatsProvider.tableRows` both
12
+ * call this so the logical/physical estimate and the stats-provider estimate
13
+ * cannot drift apart.
14
+ *
15
+ * NOTE: `rowCount` is a snapshot from the last `ANALYZE` — rows written
16
+ * afterwards are invisible until the next one.
17
+ *
18
+ * NOTE: a real 0 (analyzed, empty table) is distinct from `undefined`, but the
19
+ * `estimatedRows || default` spellings in `rule-select-access-path`,
20
+ * `rule-grow-retrieve` and `IndexSeekNode.computePhysical` collapse the two and
21
+ * substitute their default — so an analyzed empty table reaches
22
+ * `getBestAccessPlan` as "unknown" (1000) while a SeqScan over it reports 0.
23
+ * Harmless today (any plan over 0 rows is cheap); switch those to `??` if an
24
+ * empty-table plan ever costs out wrong.
25
+ */
26
+ export function catalogRowCount(table) {
27
+ return table.statistics?.rowCount ?? table.estimatedRows;
28
+ }
29
+ //# sourceMappingURL=table-cardinality.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-cardinality.js","sourceRoot":"","sources":["../../../../src/planner/stats/table-cardinality.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,MAAM,UAAU,eAAe,CAAC,KAAkB;IACjD,OAAO,KAAK,CAAC,UAAU,EAAE,QAAQ,IAAI,KAAK,CAAC,aAAa,CAAC;AAC1D,CAAC"}
@@ -9,10 +9,10 @@
9
9
  *
10
10
  * ## Identity — not schema — distinguishes the two sides of a self-join
11
11
  *
12
- * `ColumnOrigin.ref` is the `TableReferenceNode` instance that produced the
13
- * attribute. `from t a join t b` yields two distinct TableReferenceNodes sharing
12
+ * `ColumnOrigin.relation` is an opaque token standing for ONE instance of a relation
13
+ * in the plan. `from t a join t b` yields two distinct TableReferenceNodes sharing
14
14
  * ONE `TableSchema` object, so a caller asking "how many relations does this
15
- * expression touch?" must key on `ref` identity. Keying on `table` collapses the
15
+ * expression touch?" must key on `relation` identity. Keying on `table` collapses the
16
16
  * two sides and mis-classifies `a.age > b.age` as a single-table predicate
17
17
  * comparing a column to a constant.
18
18
  *
@@ -33,14 +33,35 @@
33
33
  * caller one branch's statistics as if they described the whole relation. The walk
34
34
  * therefore stops at such a node and records nothing beneath it — a conjunct over a
35
35
  * union reads as unknown, exactly like one over a computed projection.
36
+ *
37
+ * `rule-async-gather-union-all` rewrites a unionAll set operation into an
38
+ * `AsyncGatherNode` that forwards the same ids, so `isRowMerging` recognises that
39
+ * gather too — see `row-population.ts`.
40
+ *
41
+ * ## A CTE reference republishes its body's columns under its own relation instance
42
+ *
43
+ * `CTEReferenceNode` mints FRESH attribute ids for every column it republishes
44
+ * (`cte-reference-node.ts`), so the walk cannot simply descend through it: nothing
45
+ * above would land in the map. It instead maps the body's origins positionally onto
46
+ * the reference's own ids — but under a relation token minted PER REFERENCE, because
47
+ * two references to one `with` clause share a single body subtree. Pairing them with
48
+ * the body's own relation tokens would make both arms of a CTE self-join the same
49
+ * relation, and `rule-filter-selectivity` would read `a.qty > b.qty` as a
50
+ * single-relation predicate comparing a column to a constant.
36
51
  */
37
- import { TableReferenceNode } from '../nodes/reference.js';
38
52
  import type { RelationalPlanNode } from '../nodes/plan-node.js';
39
53
  import type { TableSchema } from '../../schema/table.js';
40
- /** Where a single attribute came from: a column of a specific base-table reference. */
54
+ /**
55
+ * Identity of one *instance* of a relation in the plan — compared by reference and
56
+ * never dereferenced. A `TableReferenceNode` is its own instance; a CTE reference
57
+ * mints one per (reference, underlying relation) pair so that two references to the
58
+ * same `with` clause stay distinguishable.
59
+ */
60
+ export type RelationInstance = object;
61
+ /** Where a single attribute came from: a column of a specific relation instance. */
41
62
  export interface ColumnOrigin {
42
- /** The TableReferenceNode that minted this attribute — identity is significant. */
43
- readonly ref: TableReferenceNode;
63
+ /** The relation instance that published this attribute — identity is significant. */
64
+ readonly relation: RelationInstance;
44
65
  readonly table: TableSchema;
45
66
  readonly columnIndex: number;
46
67
  readonly columnName: string;
@@ -52,7 +73,7 @@ export interface ColumnOrigin {
52
73
  * The walk descends relations only, so scalar subqueries hanging off a join
53
74
  * condition or a filter predicate are NOT traversed — their columns stay out of
54
75
  * the map and any conjunct referencing them reads as unknown. It also stops at a
55
- * row-merging operator (see the file doc-comment).
76
+ * row-merging operator and at a CTE reference (see the file doc-comment).
56
77
  */
57
78
  export declare function collectColumnOrigins(node: RelationalPlanNode): Map<number, ColumnOrigin>;
58
79
  //# sourceMappingURL=column-origins.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"column-origins.d.ts","sourceRoot":"","sources":["../../../../src/planner/util/column-origins.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAG3D,OAAO,KAAK,EAAY,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,uFAAuF;AACvF,MAAM,WAAW,YAAY;IAC5B,mFAAmF;IACnF,QAAQ,CAAC,GAAG,EAAE,kBAAkB,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,GAAG,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAoBxF"}
1
+ {"version":3,"file":"column-origins.d.ts","sourceRoot":"","sources":["../../../../src/planner/util/column-origins.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAKH,OAAO,KAAK,EAAY,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEtC,oFAAoF;AACpF,MAAM,WAAW,YAAY;IAC5B,qFAAqF;IACrF,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC5B;AAKD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,GAAG,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAExF"}
@@ -9,10 +9,10 @@
9
9
  *
10
10
  * ## Identity — not schema — distinguishes the two sides of a self-join
11
11
  *
12
- * `ColumnOrigin.ref` is the `TableReferenceNode` instance that produced the
13
- * attribute. `from t a join t b` yields two distinct TableReferenceNodes sharing
12
+ * `ColumnOrigin.relation` is an opaque token standing for ONE instance of a relation
13
+ * in the plan. `from t a join t b` yields two distinct TableReferenceNodes sharing
14
14
  * ONE `TableSchema` object, so a caller asking "how many relations does this
15
- * expression touch?" must key on `ref` identity. Keying on `table` collapses the
15
+ * expression touch?" must key on `relation` identity. Keying on `table` collapses the
16
16
  * two sides and mis-classifies `a.age > b.age` as a single-table predicate
17
17
  * comparing a column to a constant.
18
18
  *
@@ -33,10 +33,25 @@
33
33
  * caller one branch's statistics as if they described the whole relation. The walk
34
34
  * therefore stops at such a node and records nothing beneath it — a conjunct over a
35
35
  * union reads as unknown, exactly like one over a computed projection.
36
+ *
37
+ * `rule-async-gather-union-all` rewrites a unionAll set operation into an
38
+ * `AsyncGatherNode` that forwards the same ids, so `isRowMerging` recognises that
39
+ * gather too — see `row-population.ts`.
40
+ *
41
+ * ## A CTE reference republishes its body's columns under its own relation instance
42
+ *
43
+ * `CTEReferenceNode` mints FRESH attribute ids for every column it republishes
44
+ * (`cte-reference-node.ts`), so the walk cannot simply descend through it: nothing
45
+ * above would land in the map. It instead maps the body's origins positionally onto
46
+ * the reference's own ids — but under a relation token minted PER REFERENCE, because
47
+ * two references to one `with` clause share a single body subtree. Pairing them with
48
+ * the body's own relation tokens would make both arms of a CTE self-join the same
49
+ * relation, and `rule-filter-selectivity` would read `a.qty > b.qty` as a
50
+ * single-relation predicate comparing a column to a constant.
36
51
  */
37
52
  import { TableReferenceNode } from '../nodes/reference.js';
38
- import { SetOperationNode } from '../nodes/set-operation-node.js';
39
- import { RecursiveCTENode } from '../nodes/recursive-cte-node.js';
53
+ import { CTEReferenceNode } from '../nodes/cte-reference-node.js';
54
+ import { isRowMerging } from './row-population.js';
40
55
  /**
41
56
  * Attribute id → originating base-table column, for every base column reachable
42
57
  * under `node` via `getRelations()`.
@@ -44,9 +59,12 @@ import { RecursiveCTENode } from '../nodes/recursive-cte-node.js';
44
59
  * The walk descends relations only, so scalar subqueries hanging off a join
45
60
  * condition or a filter predicate are NOT traversed — their columns stay out of
46
61
  * the map and any conjunct referencing them reads as unknown. It also stops at a
47
- * row-merging operator (see the file doc-comment).
62
+ * row-merging operator and at a CTE reference (see the file doc-comment).
48
63
  */
49
64
  export function collectColumnOrigins(node) {
65
+ return collect(node, new Map());
66
+ }
67
+ function collect(node, bodies) {
50
68
  const origins = new Map();
51
69
  // Plan trees are DAGs (a CTE instance can be shared), so dedupe by identity.
52
70
  const visited = new Set();
@@ -60,6 +78,12 @@ export function collectColumnOrigins(node) {
60
78
  addBaseColumns(n, origins);
61
79
  continue;
62
80
  }
81
+ if (n instanceof CTEReferenceNode) {
82
+ // Deliberately NOT descended: the body publishes ids this node does not
83
+ // expose, and the body may be shared with a sibling reference.
84
+ addCTEColumns(n, origins, bodies);
85
+ continue;
86
+ }
63
87
  if (isRowMerging(n))
64
88
  continue;
65
89
  for (const rel of n.getRelations())
@@ -67,13 +91,6 @@ export function collectColumnOrigins(node) {
67
91
  }
68
92
  return origins;
69
93
  }
70
- /**
71
- * Does this node publish one branch's attribute ids over rows drawn from several
72
- * branches? Such an id describes no single base-table column.
73
- */
74
- function isRowMerging(node) {
75
- return node instanceof SetOperationNode || node instanceof RecursiveCTENode;
76
- }
77
94
  /** Zip a table reference's attributes with its schema columns (1:1 by construction). */
78
95
  function addBaseColumns(ref, out) {
79
96
  // TableReferenceNode builds its attributes by mapping `tableSchema.columns`
@@ -84,7 +101,50 @@ function addBaseColumns(ref, out) {
84
101
  const attr = attrs[i];
85
102
  if (!attr)
86
103
  return;
87
- out.set(attr.id, { ref, table: ref.tableSchema, columnIndex: i, columnName: col.name });
104
+ out.set(attr.id, { relation: ref, table: ref.tableSchema, columnIndex: i, columnName: col.name });
88
105
  });
89
106
  }
107
+ /**
108
+ * Re-publish a CTE body's origins under this reference's own attribute ids and its
109
+ * own relation instances.
110
+ *
111
+ * `CTEReferenceNode.buildAttributes` maps `CTENode.getAttributes()` one for one and
112
+ * `CTENode` forwards its source's attribute ids verbatim, so index i names the same
113
+ * column on both sides. Columns the body computed (or could not attribute) simply
114
+ * have no entry, exactly as for the equivalent inline subquery.
115
+ */
116
+ function addCTEColumns(ref, out, bodies) {
117
+ const body = ref.source;
118
+ // A recursive CTE's rows come from its base case AND its recursive case, so no
119
+ // base-table column describes them — same reasoning as a set operation.
120
+ if (isRowMerging(body))
121
+ return;
122
+ const bodyOrigins = bodyOriginsOf(body, bodies);
123
+ if (bodyOrigins.size === 0)
124
+ return;
125
+ // One fresh instance per underlying relation, minted for THIS reference: two
126
+ // references to one CTE must never share an instance.
127
+ const instances = new Map();
128
+ const bodyAttrs = body.getAttributes();
129
+ ref.getAttributes().forEach((attr, i) => {
130
+ const bodyAttr = bodyAttrs[i];
131
+ const origin = bodyAttr && bodyOrigins.get(bodyAttr.id);
132
+ if (!origin)
133
+ return;
134
+ let instance = instances.get(origin.relation);
135
+ if (!instance) {
136
+ instance = {};
137
+ instances.set(origin.relation, instance);
138
+ }
139
+ out.set(attr.id, { ...origin, relation: instance });
140
+ });
141
+ }
142
+ function bodyOriginsOf(body, bodies) {
143
+ const cached = bodies.get(body);
144
+ if (cached)
145
+ return cached;
146
+ const computed = collect(body, bodies);
147
+ bodies.set(body, computed);
148
+ return computed;
149
+ }
90
150
  //# sourceMappingURL=column-origins.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"column-origins.js","sourceRoot":"","sources":["../../../../src/planner/util/column-origins.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAalE;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAwB;IAC5D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAC;IAChD,6EAA6E;IAC7E,MAAM,OAAO,GAAG,IAAI,GAAG,EAAY,CAAC;IACpC,MAAM,KAAK,GAAyB,CAAC,IAAI,CAAC,CAAC;IAE3C,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QACvB,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,SAAS;QAC7B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAEf,IAAI,CAAC,YAAY,kBAAkB,EAAE,CAAC;YACrC,cAAc,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC3B,SAAS;QACV,CAAC;QACD,IAAI,YAAY,CAAC,CAAC,CAAC;YAAE,SAAS;QAC9B,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,YAAY,EAAE;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,OAAO,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,IAAwB;IAC7C,OAAO,IAAI,YAAY,gBAAgB,IAAI,IAAI,YAAY,gBAAgB,CAAC;AAC7E,CAAC;AAED,wFAAwF;AACxF,SAAS,cAAc,CAAC,GAAuB,EAAE,GAA8B;IAC9E,4EAA4E;IAC5E,gFAAgF;IAChF,sEAAsE;IACtE,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,EAAE,CAAC;IAClC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"column-origins.js","sourceRoot":"","sources":["../../../../src/planner/util/column-origins.ts"],"names":[],"mappings":"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"}
@@ -328,18 +328,42 @@ export interface EqualityFds {
328
328
  *
329
329
  * Non-equality conjuncts contribute nothing.
330
330
  *
331
- * **Collation gate.** Every extracted fact is a VALUE-level claim (a pinned
332
- * column has one value across rows; `col1 = col2` rows are value-equal), so a
333
- * conjunct only contributes when its comparison is value-discriminating
334
- * (`isValueDiscriminatingEquality`): for textual operands the effective
335
- * comparison collation must be BINARY. A NOCASE/RTRIM comparison — via a
336
- * `COLLATE` wrapper on either side or a non-BINARY declared column collation —
337
- * passes value-DIFFERENT rows ('Bob' = 'bob' NOCASE), so its facts would
338
- * over-claim (false ≤1-row keys, false EC-driven inferences, wrong insert
331
+ * **Collation gate (all shapes).** Every extracted fact is a VALUE-level claim
332
+ * (a pinned column has one value across rows; `col1 = col2` rows are
333
+ * value-equal), so a conjunct only contributes when its comparison is
334
+ * value-discriminating (`isValueDiscriminatingEquality`): for textual operands
335
+ * the effective comparison collation must be BINARY. A NOCASE/RTRIM comparison —
336
+ * via a `COLLATE` wrapper on either side or a non-BINARY declared column
337
+ * collation — passes value-DIFFERENT rows ('Bob' = 'bob' NOCASE), so its facts
338
+ * would over-claim (false ≤1-row keys, false EC-driven inferences, wrong insert
339
339
  * defaults — ticket `collation-blind-equality-fact-extraction`). Declared-
340
340
  * collation covered-key ≤1-row detection is NOT lost: it flows through the
341
341
  * independent (and collation-sound) `extractConstraints` path in
342
342
  * `FilterNode.computePhysical`.
343
+ *
344
+ * **Semantic-ordering gate (`col1 = col2` ONLY).** A few logical types compare
345
+ * by meaning rather than by stored text (`timespan`: 'PT1H' = 'PT60M'; `json`:
346
+ * '{"a":1}' = '{ "a" : 1 }'). For a MIXED pair — `d timespan = s text` — the
347
+ * mirror FDs and the equivalence class are both FALSE: two surviving rows can
348
+ * agree on `d` (same elapsed time) while disagreeing on `s` (distinct strings),
349
+ * because the two columns have no common notion of "same value". So the col=col
350
+ * arm additionally requires `semanticOrderingsAgree` on the two declared logical
351
+ * types, mirroring the two join-side extractors that mint the same kind of fact
352
+ * (`extractEquiPairsFromCondition` in `nodes/join-node.ts`, `extractEquiPairs`
353
+ * in `rules/join/equi-pair-extractor.ts`). Same-type pairs (`timespan =
354
+ * timespan`) stay admitted — under the type's own identity both facts hold.
355
+ * Invariant OPT-051; ticket `debt-filter-equality-facts-ignore-semantic-ordering`.
356
+ *
357
+ * **The constant-pin arms are deliberately NOT semantic-ordering-gated.** This is
358
+ * intentional, not an oversight. `where d = 'PT60M'` keeps every row whose `d` is
359
+ * one hour whatever text it stores, and under the engine's identity for a
360
+ * `timespan` column — the same identity `distinct`/`group by`/`unique` use —
361
+ * those rows all hold *the same value*, so `∅ → d` is true. The
362
+ * `ConstantBinding` claim is likewise true as defined (see its declaration in
363
+ * `nodes/plan-node.ts`): the column *compares equal to* the bound value under its
364
+ * own comparison. Gating this arm would decline EVERY constant pin on a
365
+ * `timespan`/`json` column (a literal never declares a semantic-ordering type),
366
+ * losing real optimizations to "fix" a claim that is not wrong.
343
367
  */
344
368
  export declare function extractEqualityFds(predicate: ScalarPlanNode, attrIdToIndex: ReadonlyMap<number, number>): EqualityFds;
345
369
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"fd-utils.d.ts","sourceRoot":"","sources":["../../../../src/planner/util/fd-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fd-utils.d.ts","sourceRoot":"","sources":["../../../../src/planner/util/fd-utils.ts"],"names":[],"mappings":"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"}