@quereus/quereus 2.9.0 → 3.0.1

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 (356) hide show
  1. package/README.md +224 -222
  2. package/dist/src/core/database-assertions.d.ts +36 -16
  3. package/dist/src/core/database-assertions.d.ts.map +1 -1
  4. package/dist/src/core/database-assertions.js +222 -118
  5. package/dist/src/core/database-assertions.js.map +1 -1
  6. package/dist/src/core/database-transaction.d.ts +96 -13
  7. package/dist/src/core/database-transaction.d.ts.map +1 -1
  8. package/dist/src/core/database-transaction.js +294 -35
  9. package/dist/src/core/database-transaction.js.map +1 -1
  10. package/dist/src/core/database-watchers.d.ts +58 -0
  11. package/dist/src/core/database-watchers.d.ts.map +1 -0
  12. package/dist/src/core/database-watchers.js +206 -0
  13. package/dist/src/core/database-watchers.js.map +1 -0
  14. package/dist/src/core/database.d.ts +78 -5
  15. package/dist/src/core/database.d.ts.map +1 -1
  16. package/dist/src/core/database.js +120 -20
  17. package/dist/src/core/database.js.map +1 -1
  18. package/dist/src/core/statement.d.ts +9 -0
  19. package/dist/src/core/statement.d.ts.map +1 -1
  20. package/dist/src/core/statement.js +29 -0
  21. package/dist/src/core/statement.js.map +1 -1
  22. package/dist/src/core/table-handle.d.ts +45 -0
  23. package/dist/src/core/table-handle.d.ts.map +1 -0
  24. package/dist/src/core/table-handle.js +54 -0
  25. package/dist/src/core/table-handle.js.map +1 -0
  26. package/dist/src/func/builtins/conversion.d.ts.map +1 -1
  27. package/dist/src/func/builtins/conversion.js +12 -1
  28. package/dist/src/func/builtins/conversion.js.map +1 -1
  29. package/dist/src/func/builtins/explain.d.ts.map +1 -1
  30. package/dist/src/func/builtins/explain.js +22 -8
  31. package/dist/src/func/builtins/explain.js.map +1 -1
  32. package/dist/src/func/builtins/generation.d.ts.map +1 -1
  33. package/dist/src/func/builtins/generation.js +26 -1
  34. package/dist/src/func/builtins/generation.js.map +1 -1
  35. package/dist/src/func/builtins/index.d.ts.map +1 -1
  36. package/dist/src/func/builtins/index.js +5 -1
  37. package/dist/src/func/builtins/index.js.map +1 -1
  38. package/dist/src/func/builtins/json-tvf.d.ts.map +1 -1
  39. package/dist/src/func/builtins/json-tvf.js +16 -2
  40. package/dist/src/func/builtins/json-tvf.js.map +1 -1
  41. package/dist/src/func/builtins/schema.d.ts +4 -0
  42. package/dist/src/func/builtins/schema.d.ts.map +1 -1
  43. package/dist/src/func/builtins/schema.js +270 -11
  44. package/dist/src/func/builtins/schema.js.map +1 -1
  45. package/dist/src/func/registration.d.ts +19 -1
  46. package/dist/src/func/registration.d.ts.map +1 -1
  47. package/dist/src/func/registration.js +8 -3
  48. package/dist/src/func/registration.js.map +1 -1
  49. package/dist/src/index.d.ts +7 -1
  50. package/dist/src/index.d.ts.map +1 -1
  51. package/dist/src/index.js +5 -0
  52. package/dist/src/index.js.map +1 -1
  53. package/dist/src/parser/parser.d.ts.map +1 -1
  54. package/dist/src/parser/parser.js +12 -4
  55. package/dist/src/parser/parser.js.map +1 -1
  56. package/dist/src/planner/analysis/assertion-classifier.d.ts +71 -0
  57. package/dist/src/planner/analysis/assertion-classifier.d.ts.map +1 -0
  58. package/dist/src/planner/analysis/assertion-classifier.js +286 -0
  59. package/dist/src/planner/analysis/assertion-classifier.js.map +1 -0
  60. package/dist/src/planner/analysis/assertion-hoist-cache.d.ts +34 -0
  61. package/dist/src/planner/analysis/assertion-hoist-cache.d.ts.map +1 -0
  62. package/dist/src/planner/analysis/assertion-hoist-cache.js +119 -0
  63. package/dist/src/planner/analysis/assertion-hoist-cache.js.map +1 -0
  64. package/dist/src/planner/analysis/binding-extractor.d.ts +58 -0
  65. package/dist/src/planner/analysis/binding-extractor.d.ts.map +1 -0
  66. package/dist/src/planner/analysis/binding-extractor.js +110 -0
  67. package/dist/src/planner/analysis/binding-extractor.js.map +1 -0
  68. package/dist/src/planner/analysis/change-scope.d.ts +184 -0
  69. package/dist/src/planner/analysis/change-scope.d.ts.map +1 -0
  70. package/dist/src/planner/analysis/change-scope.js +825 -0
  71. package/dist/src/planner/analysis/change-scope.js.map +1 -0
  72. package/dist/src/planner/analysis/check-extraction.d.ts +29 -0
  73. package/dist/src/planner/analysis/check-extraction.d.ts.map +1 -0
  74. package/dist/src/planner/analysis/check-extraction.js +420 -0
  75. package/dist/src/planner/analysis/check-extraction.js.map +1 -0
  76. package/dist/src/planner/analysis/constraint-extractor.d.ts +47 -7
  77. package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
  78. package/dist/src/planner/analysis/constraint-extractor.js +186 -93
  79. package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
  80. package/dist/src/planner/analysis/partial-unique-extraction.d.ts +68 -0
  81. package/dist/src/planner/analysis/partial-unique-extraction.d.ts.map +1 -0
  82. package/dist/src/planner/analysis/partial-unique-extraction.js +347 -0
  83. package/dist/src/planner/analysis/partial-unique-extraction.js.map +1 -0
  84. package/dist/src/planner/analysis/predicate-conjuncts.d.ts +14 -0
  85. package/dist/src/planner/analysis/predicate-conjuncts.d.ts.map +1 -0
  86. package/dist/src/planner/analysis/predicate-conjuncts.js +31 -0
  87. package/dist/src/planner/analysis/predicate-conjuncts.js.map +1 -0
  88. package/dist/src/planner/analysis/predicate-shape.d.ts +52 -0
  89. package/dist/src/planner/analysis/predicate-shape.d.ts.map +1 -0
  90. package/dist/src/planner/analysis/predicate-shape.js +119 -0
  91. package/dist/src/planner/analysis/predicate-shape.js.map +1 -0
  92. package/dist/src/planner/analysis/sat-checker.d.ts +43 -0
  93. package/dist/src/planner/analysis/sat-checker.d.ts.map +1 -0
  94. package/dist/src/planner/analysis/sat-checker.js +393 -0
  95. package/dist/src/planner/analysis/sat-checker.js.map +1 -0
  96. package/dist/src/planner/building/table.d.ts.map +1 -1
  97. package/dist/src/planner/building/table.js +1 -1
  98. package/dist/src/planner/building/table.js.map +1 -1
  99. package/dist/src/planner/framework/characteristics.d.ts +10 -1
  100. package/dist/src/planner/framework/characteristics.d.ts.map +1 -1
  101. package/dist/src/planner/framework/characteristics.js +24 -5
  102. package/dist/src/planner/framework/characteristics.js.map +1 -1
  103. package/dist/src/planner/framework/context.d.ts +1 -8
  104. package/dist/src/planner/framework/context.d.ts.map +1 -1
  105. package/dist/src/planner/framework/context.js +4 -21
  106. package/dist/src/planner/framework/context.js.map +1 -1
  107. package/dist/src/planner/framework/pass.d.ts +18 -2
  108. package/dist/src/planner/framework/pass.d.ts.map +1 -1
  109. package/dist/src/planner/framework/pass.js +145 -46
  110. package/dist/src/planner/framework/pass.js.map +1 -1
  111. package/dist/src/planner/framework/physical-utils.d.ts +0 -9
  112. package/dist/src/planner/framework/physical-utils.d.ts.map +1 -1
  113. package/dist/src/planner/framework/physical-utils.js +0 -31
  114. package/dist/src/planner/framework/physical-utils.js.map +1 -1
  115. package/dist/src/planner/nodes/aggregate-node.d.ts +25 -0
  116. package/dist/src/planner/nodes/aggregate-node.d.ts.map +1 -1
  117. package/dist/src/planner/nodes/aggregate-node.js +75 -8
  118. package/dist/src/planner/nodes/aggregate-node.js.map +1 -1
  119. package/dist/src/planner/nodes/alias-node.d.ts.map +1 -1
  120. package/dist/src/planner/nodes/alias-node.js +6 -1
  121. package/dist/src/planner/nodes/alias-node.js.map +1 -1
  122. package/dist/src/planner/nodes/asof-scan-node.d.ts.map +1 -1
  123. package/dist/src/planner/nodes/asof-scan-node.js +17 -3
  124. package/dist/src/planner/nodes/asof-scan-node.js.map +1 -1
  125. package/dist/src/planner/nodes/bloom-join-node.d.ts.map +1 -1
  126. package/dist/src/planner/nodes/bloom-join-node.js +19 -9
  127. package/dist/src/planner/nodes/bloom-join-node.js.map +1 -1
  128. package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
  129. package/dist/src/planner/nodes/distinct-node.js +10 -6
  130. package/dist/src/planner/nodes/distinct-node.js.map +1 -1
  131. package/dist/src/planner/nodes/empty-relation-node.d.ts +27 -0
  132. package/dist/src/planner/nodes/empty-relation-node.d.ts.map +1 -0
  133. package/dist/src/planner/nodes/empty-relation-node.js +61 -0
  134. package/dist/src/planner/nodes/empty-relation-node.js.map +1 -0
  135. package/dist/src/planner/nodes/filter.d.ts.map +1 -1
  136. package/dist/src/planner/nodes/filter.js +65 -5
  137. package/dist/src/planner/nodes/filter.js.map +1 -1
  138. package/dist/src/planner/nodes/hash-aggregate.d.ts +1 -1
  139. package/dist/src/planner/nodes/hash-aggregate.d.ts.map +1 -1
  140. package/dist/src/planner/nodes/hash-aggregate.js +8 -6
  141. package/dist/src/planner/nodes/hash-aggregate.js.map +1 -1
  142. package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
  143. package/dist/src/planner/nodes/join-node.js +12 -9
  144. package/dist/src/planner/nodes/join-node.js.map +1 -1
  145. package/dist/src/planner/nodes/join-utils.d.ts +24 -1
  146. package/dist/src/planner/nodes/join-utils.d.ts.map +1 -1
  147. package/dist/src/planner/nodes/join-utils.js +86 -0
  148. package/dist/src/planner/nodes/join-utils.js.map +1 -1
  149. package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
  150. package/dist/src/planner/nodes/limit-offset.js +6 -1
  151. package/dist/src/planner/nodes/limit-offset.js.map +1 -1
  152. package/dist/src/planner/nodes/merge-join-node.d.ts.map +1 -1
  153. package/dist/src/planner/nodes/merge-join-node.js +19 -9
  154. package/dist/src/planner/nodes/merge-join-node.js.map +1 -1
  155. package/dist/src/planner/nodes/ordinal-slice-node.d.ts.map +1 -1
  156. package/dist/src/planner/nodes/ordinal-slice-node.js +5 -2
  157. package/dist/src/planner/nodes/ordinal-slice-node.js.map +1 -1
  158. package/dist/src/planner/nodes/plan-node-type.d.ts +1 -0
  159. package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
  160. package/dist/src/planner/nodes/plan-node-type.js +1 -0
  161. package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
  162. package/dist/src/planner/nodes/plan-node.d.ts +186 -4
  163. package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
  164. package/dist/src/planner/nodes/plan-node.js.map +1 -1
  165. package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
  166. package/dist/src/planner/nodes/project-node.js +75 -30
  167. package/dist/src/planner/nodes/project-node.js.map +1 -1
  168. package/dist/src/planner/nodes/reference.d.ts +24 -2
  169. package/dist/src/planner/nodes/reference.d.ts.map +1 -1
  170. package/dist/src/planner/nodes/reference.js +101 -1
  171. package/dist/src/planner/nodes/reference.js.map +1 -1
  172. package/dist/src/planner/nodes/retrieve-node.d.ts +9 -1
  173. package/dist/src/planner/nodes/retrieve-node.d.ts.map +1 -1
  174. package/dist/src/planner/nodes/retrieve-node.js +21 -0
  175. package/dist/src/planner/nodes/retrieve-node.js.map +1 -1
  176. package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
  177. package/dist/src/planner/nodes/returning-node.js +64 -28
  178. package/dist/src/planner/nodes/returning-node.js.map +1 -1
  179. package/dist/src/planner/nodes/scalar.d.ts +1 -0
  180. package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
  181. package/dist/src/planner/nodes/scalar.js +12 -0
  182. package/dist/src/planner/nodes/scalar.js.map +1 -1
  183. package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
  184. package/dist/src/planner/nodes/set-operation-node.js +15 -0
  185. package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
  186. package/dist/src/planner/nodes/single-row.d.ts.map +1 -1
  187. package/dist/src/planner/nodes/single-row.js +3 -1
  188. package/dist/src/planner/nodes/single-row.js.map +1 -1
  189. package/dist/src/planner/nodes/sort.d.ts.map +1 -1
  190. package/dist/src/planner/nodes/sort.js +10 -3
  191. package/dist/src/planner/nodes/sort.js.map +1 -1
  192. package/dist/src/planner/nodes/stream-aggregate.d.ts +1 -1
  193. package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
  194. package/dist/src/planner/nodes/stream-aggregate.js +8 -8
  195. package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
  196. package/dist/src/planner/nodes/table-access-nodes.d.ts +3 -3
  197. package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
  198. package/dist/src/planner/nodes/table-access-nodes.js +26 -8
  199. package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
  200. package/dist/src/planner/nodes/table-function-call.d.ts +4 -1
  201. package/dist/src/planner/nodes/table-function-call.d.ts.map +1 -1
  202. package/dist/src/planner/nodes/table-function-call.js +224 -14
  203. package/dist/src/planner/nodes/table-function-call.js.map +1 -1
  204. package/dist/src/planner/nodes/window-node.d.ts.map +1 -1
  205. package/dist/src/planner/nodes/window-node.js +9 -2
  206. package/dist/src/planner/nodes/window-node.js.map +1 -1
  207. package/dist/src/planner/optimizer-tuning.d.ts +29 -1
  208. package/dist/src/planner/optimizer-tuning.d.ts.map +1 -1
  209. package/dist/src/planner/optimizer-tuning.js +3 -0
  210. package/dist/src/planner/optimizer-tuning.js.map +1 -1
  211. package/dist/src/planner/optimizer.d.ts.map +1 -1
  212. package/dist/src/planner/optimizer.js +187 -0
  213. package/dist/src/planner/optimizer.js.map +1 -1
  214. package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
  215. package/dist/src/planner/rules/access/rule-select-access-path.js +22 -7
  216. package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
  217. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts +30 -0
  218. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts.map +1 -0
  219. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js +116 -0
  220. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js.map +1 -0
  221. package/dist/src/planner/rules/distinct/rule-distinct-elimination.d.ts +7 -7
  222. package/dist/src/planner/rules/distinct/rule-distinct-elimination.d.ts.map +1 -1
  223. package/dist/src/planner/rules/distinct/rule-distinct-elimination.js +18 -16
  224. package/dist/src/planner/rules/distinct/rule-distinct-elimination.js.map +1 -1
  225. package/dist/src/planner/rules/join/rule-join-elimination.d.ts +56 -0
  226. package/dist/src/planner/rules/join/rule-join-elimination.d.ts.map +1 -0
  227. package/dist/src/planner/rules/join/rule-join-elimination.js +326 -0
  228. package/dist/src/planner/rules/join/rule-join-elimination.js.map +1 -0
  229. package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts.map +1 -1
  230. package/dist/src/planner/rules/join/rule-join-greedy-commute.js +10 -2
  231. package/dist/src/planner/rules/join/rule-join-greedy-commute.js.map +1 -1
  232. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.d.ts +20 -0
  233. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.d.ts.map +1 -0
  234. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js +181 -0
  235. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js.map +1 -0
  236. package/dist/src/planner/rules/predicate/rule-empty-relation-folding.d.ts +46 -0
  237. package/dist/src/planner/rules/predicate/rule-empty-relation-folding.d.ts.map +1 -0
  238. package/dist/src/planner/rules/predicate/rule-empty-relation-folding.js +156 -0
  239. package/dist/src/planner/rules/predicate/rule-empty-relation-folding.js.map +1 -0
  240. package/dist/src/planner/rules/predicate/rule-filter-contradiction.d.ts +30 -0
  241. package/dist/src/planner/rules/predicate/rule-filter-contradiction.d.ts.map +1 -0
  242. package/dist/src/planner/rules/predicate/rule-filter-contradiction.js +60 -0
  243. package/dist/src/planner/rules/predicate/rule-filter-contradiction.js.map +1 -0
  244. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.d.ts +45 -0
  245. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.d.ts.map +1 -0
  246. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js +210 -0
  247. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js.map +1 -0
  248. package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.d.ts +29 -0
  249. package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.d.ts.map +1 -0
  250. package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.js +161 -0
  251. package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.js.map +1 -0
  252. package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.d.ts +39 -0
  253. package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.d.ts.map +1 -0
  254. package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.js +91 -0
  255. package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.js.map +1 -0
  256. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.d.ts +35 -0
  257. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.d.ts.map +1 -0
  258. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js +74 -0
  259. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js.map +1 -0
  260. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.d.ts +27 -0
  261. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.d.ts.map +1 -0
  262. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js +103 -0
  263. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js.map +1 -0
  264. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts.map +1 -1
  265. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js +1 -25
  266. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js.map +1 -1
  267. package/dist/src/planner/scopes/global.js +2 -2
  268. package/dist/src/planner/scopes/global.js.map +1 -1
  269. package/dist/src/planner/type-utils.d.ts.map +1 -1
  270. package/dist/src/planner/type-utils.js +11 -0
  271. package/dist/src/planner/type-utils.js.map +1 -1
  272. package/dist/src/planner/util/fd-utils.d.ts +245 -0
  273. package/dist/src/planner/util/fd-utils.d.ts.map +1 -0
  274. package/dist/src/planner/util/fd-utils.js +1416 -0
  275. package/dist/src/planner/util/fd-utils.js.map +1 -0
  276. package/dist/src/planner/util/ind-utils.d.ts +79 -0
  277. package/dist/src/planner/util/ind-utils.d.ts.map +1 -0
  278. package/dist/src/planner/util/ind-utils.js +146 -0
  279. package/dist/src/planner/util/ind-utils.js.map +1 -0
  280. package/dist/src/planner/util/key-utils.d.ts +75 -14
  281. package/dist/src/planner/util/key-utils.d.ts.map +1 -1
  282. package/dist/src/planner/util/key-utils.js +234 -57
  283. package/dist/src/planner/util/key-utils.js.map +1 -1
  284. package/dist/src/runtime/delta-executor.d.ts +134 -0
  285. package/dist/src/runtime/delta-executor.d.ts.map +1 -0
  286. package/dist/src/runtime/delta-executor.js +382 -0
  287. package/dist/src/runtime/delta-executor.js.map +1 -0
  288. package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
  289. package/dist/src/runtime/emit/alter-table.js +70 -24
  290. package/dist/src/runtime/emit/alter-table.js.map +1 -1
  291. package/dist/src/runtime/emit/create-assertion.d.ts.map +1 -1
  292. package/dist/src/runtime/emit/create-assertion.js +3 -2
  293. package/dist/src/runtime/emit/create-assertion.js.map +1 -1
  294. package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
  295. package/dist/src/runtime/emit/dml-executor.js +121 -41
  296. package/dist/src/runtime/emit/dml-executor.js.map +1 -1
  297. package/dist/src/runtime/emit/drop-assertion.js +1 -1
  298. package/dist/src/runtime/emit/drop-assertion.js.map +1 -1
  299. package/dist/src/runtime/emit/empty-relation.d.ts +5 -0
  300. package/dist/src/runtime/emit/empty-relation.d.ts.map +1 -0
  301. package/dist/src/runtime/emit/empty-relation.js +11 -0
  302. package/dist/src/runtime/emit/empty-relation.js.map +1 -0
  303. package/dist/src/runtime/foreign-key-actions.d.ts +39 -0
  304. package/dist/src/runtime/foreign-key-actions.d.ts.map +1 -1
  305. package/dist/src/runtime/foreign-key-actions.js +219 -1
  306. package/dist/src/runtime/foreign-key-actions.js.map +1 -1
  307. package/dist/src/runtime/register.d.ts.map +1 -1
  308. package/dist/src/runtime/register.js +2 -0
  309. package/dist/src/runtime/register.js.map +1 -1
  310. package/dist/src/schema/assertion.d.ts +8 -0
  311. package/dist/src/schema/assertion.d.ts.map +1 -1
  312. package/dist/src/schema/change-events.d.ts +5 -1
  313. package/dist/src/schema/change-events.d.ts.map +1 -1
  314. package/dist/src/schema/change-events.js.map +1 -1
  315. package/dist/src/schema/function.d.ts +65 -1
  316. package/dist/src/schema/function.d.ts.map +1 -1
  317. package/dist/src/schema/function.js +31 -0
  318. package/dist/src/schema/function.js.map +1 -1
  319. package/dist/src/schema/manager.d.ts +33 -0
  320. package/dist/src/schema/manager.d.ts.map +1 -1
  321. package/dist/src/schema/manager.js +95 -4
  322. package/dist/src/schema/manager.js.map +1 -1
  323. package/dist/src/schema/rename-rewriter.d.ts +32 -0
  324. package/dist/src/schema/rename-rewriter.d.ts.map +1 -1
  325. package/dist/src/schema/rename-rewriter.js +392 -105
  326. package/dist/src/schema/rename-rewriter.js.map +1 -1
  327. package/dist/src/schema/table.d.ts +21 -2
  328. package/dist/src/schema/table.d.ts.map +1 -1
  329. package/dist/src/schema/table.js +17 -8
  330. package/dist/src/schema/table.js.map +1 -1
  331. package/dist/src/types/temporal-types.d.ts.map +1 -1
  332. package/dist/src/types/temporal-types.js +32 -0
  333. package/dist/src/types/temporal-types.js.map +1 -1
  334. package/dist/src/vtab/events.d.ts +9 -0
  335. package/dist/src/vtab/events.d.ts.map +1 -1
  336. package/dist/src/vtab/events.js +19 -0
  337. package/dist/src/vtab/events.js.map +1 -1
  338. package/dist/src/vtab/memory/layer/connection.d.ts +20 -8
  339. package/dist/src/vtab/memory/layer/connection.d.ts.map +1 -1
  340. package/dist/src/vtab/memory/layer/connection.js +95 -73
  341. package/dist/src/vtab/memory/layer/connection.js.map +1 -1
  342. package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
  343. package/dist/src/vtab/memory/layer/manager.js +91 -10
  344. package/dist/src/vtab/memory/layer/manager.js.map +1 -1
  345. package/dist/src/vtab/memory/layer/transaction.d.ts +0 -8
  346. package/dist/src/vtab/memory/layer/transaction.d.ts.map +1 -1
  347. package/dist/src/vtab/memory/layer/transaction.js +0 -15
  348. package/dist/src/vtab/memory/layer/transaction.js.map +1 -1
  349. package/dist/src/vtab/memory/table.d.ts.map +1 -1
  350. package/dist/src/vtab/memory/table.js +13 -2
  351. package/dist/src/vtab/memory/table.js.map +1 -1
  352. package/dist/src/vtab/memory/utils/predicate.d.ts +2 -1
  353. package/dist/src/vtab/memory/utils/predicate.d.ts.map +1 -1
  354. package/dist/src/vtab/memory/utils/predicate.js +32 -1
  355. package/dist/src/vtab/memory/utils/predicate.js.map +1 -1
  356. package/package.json +3 -3
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Rule: Anti-Join FK → Empty
3
+ *
4
+ * Inclusion-dependency folding for `NOT EXISTS` patterns after
5
+ * `rule-subquery-decorrelation` has materialized them as anti-joins.
6
+ *
7
+ * Pattern:
8
+ * AntiJoin(L, R, p)
9
+ * where p is an AND-of-column-equalities,
10
+ * L's equi columns form a declared FK referencing R's PK (via the equi
11
+ * pairs in some permutation),
12
+ * every FK child column is NOT NULL, and
13
+ * R is a row-preserving path to its base table (no filter / limit / distinct
14
+ * between the anti-join and the parent table).
15
+ *
16
+ * Rewrite:
17
+ * EmptyRelationNode(L's attributes, L's RelationType)
18
+ *
19
+ * Why correct: under the FK inclusion `L.fk ⊆ R.pk`, every non-null FK row in L
20
+ * has a matching parent in R, so the anti-join contains no rows. With nullable
21
+ * FKs, NULL FK rows survive (the equality is UNKNOWN, never matched), so the
22
+ * rule conservatively requires all FK columns NOT NULL. Row-preserving R is
23
+ * required because the IND only guarantees the parent row exists in the table
24
+ * — a filter on the R side could remove it.
25
+ *
26
+ * The output schema of an anti-join is its left side (SEMI/ANTI take left
27
+ * columns only — see `buildJoinAttributes`), so we hand `EmptyRelationNode`
28
+ * L's attribute IDs and RelationType directly. The const-fold pass
29
+ * (Structural priority 27) then cascades that emptiness up through Filter /
30
+ * Project / Sort / LimitOffset / Distinct / inner-or-cross-or-semi joins.
31
+ */
32
+ import { createLogger } from '../../../common/logger.js';
33
+ import { JoinNode, extractEquiPairsFromCondition } from '../../nodes/join-node.js';
34
+ import { EmptyRelationNode } from '../../nodes/empty-relation-node.js';
35
+ import { normalizePredicate } from '../../analysis/predicate-normalizer.js';
36
+ import { lookupCoveringFK, isRowPreservingPathToTable, tableSchemaOf } from '../../util/ind-utils.js';
37
+ import { isAndOfColumnEqualities } from '../join/rule-join-elimination.js';
38
+ const log = createLogger('optimizer:rule:anti-join-fk-empty');
39
+ export function ruleAntiJoinFkEmpty(node, _context) {
40
+ if (!(node instanceof JoinNode))
41
+ return null;
42
+ if (node.joinType !== 'anti')
43
+ return null;
44
+ if (!node.condition)
45
+ return null;
46
+ const normalized = normalizePredicate(node.condition);
47
+ if (!isAndOfColumnEqualities(normalized))
48
+ return null;
49
+ const leftAttrs = node.left.getAttributes();
50
+ const rightAttrs = node.right.getAttributes();
51
+ const pairs = extractEquiPairsFromCondition(node.condition, leftAttrs, rightAttrs);
52
+ if (pairs.length === 0)
53
+ return null;
54
+ const leftSchema = tableSchemaOf(node.left);
55
+ const rightSchema = tableSchemaOf(node.right);
56
+ if (!leftSchema || !rightSchema)
57
+ return null;
58
+ const childEquiCols = pairs.map(p => p.left);
59
+ const parentEquiCols = pairs.map(p => p.right);
60
+ const match = lookupCoveringFK(leftSchema, rightSchema, childEquiCols, parentEquiCols);
61
+ if (!match)
62
+ return null;
63
+ // Nullable FK leaks NULL rows through the anti-join (NULL = X is UNKNOWN,
64
+ // never matched), so we can only fold when every FK column is NOT NULL.
65
+ if (match.nullable)
66
+ return null;
67
+ // The parent side must expose the full base-table row set — otherwise the
68
+ // IND `L.fk ⊆ R.pk` doesn't guarantee a match in the filtered relation.
69
+ if (!isRowPreservingPathToTable(node.right))
70
+ return null;
71
+ log('Folding anti-join over FK %s.%s → %s to empty', leftSchema.name, match.fk.columns.map(c => leftSchema.columns[c]?.name ?? c).join(','), rightSchema.name);
72
+ return new EmptyRelationNode(node.scope, node.left.getAttributes(), node.left.getType());
73
+ }
74
+ //# sourceMappingURL=rule-anti-join-fk-empty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-anti-join-fk-empty.js","sourceRoot":"","sources":["../../../../../src/planner/rules/subquery/rule-anti-join-fk-empty.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,OAAO,EAAE,QAAQ,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACtG,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAE3E,MAAM,GAAG,GAAG,YAAY,CAAC,mCAAmC,CAAC,CAAC;AAE9D,MAAM,UAAU,mBAAmB,CAAC,IAAc,EAAE,QAAoB;IACvE,IAAI,CAAC,CAAC,IAAI,YAAY,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,CAAC,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAEjC,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtD,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAG,6BAA6B,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACnF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAE7C,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,cAAc,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,gBAAgB,CAAC,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;IACvF,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,0EAA0E;IAC1E,wEAAwE;IACxE,IAAI,KAAK,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEhC,0EAA0E;IAC1E,wEAAwE;IACxE,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzD,GAAG,CAAC,+CAA+C,EAClD,UAAU,CAAC,IAAI,EACf,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EACrE,WAAW,CAAC,IAAI,CAChB,CAAC;IAEF,OAAO,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;AAC1F,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Rule: Semi-Join FK → Trivial
3
+ *
4
+ * Inclusion-dependency folding for `EXISTS` / `IN` patterns after
5
+ * `rule-subquery-decorrelation` has materialized them as semi-joins.
6
+ *
7
+ * Pattern:
8
+ * SemiJoin(L, R, p)
9
+ * where p is an AND-of-column-equalities,
10
+ * L's equi columns form a declared FK referencing R's PK, and
11
+ * R is a row-preserving path to its base table.
12
+ *
13
+ * Rewrite:
14
+ * - FK columns all NOT NULL → replace the SemiJoin with L (every L row matches
15
+ * in R by the IND `L.fk ⊆ R.pk`).
16
+ * - FK has any nullable column → replace with `Filter(L, fk_col_1 IS NOT NULL
17
+ * AND … AND fk_col_n IS NOT NULL)`. Rows with NULL in any FK column would
18
+ * not match the equi-condition (NULL compares to UNKNOWN, never `true`)
19
+ * and so would not survive the semi-join.
20
+ *
21
+ * Either way the R side never executes — a meaningful win for federated vtabs
22
+ * where R is a remote table.
23
+ */
24
+ import type { PlanNode } from '../../nodes/plan-node.js';
25
+ import type { OptContext } from '../../framework/context.js';
26
+ export declare function ruleSemiJoinFkTrivial(node: PlanNode, _context: OptContext): PlanNode | null;
27
+ //# sourceMappingURL=rule-semi-join-fk-trivial.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-semi-join-fk-trivial.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/subquery/rule-semi-join-fk-trivial.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAA6B,MAAM,0BAA0B,CAAC;AACpF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAa7D,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAwC3F"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Rule: Semi-Join FK → Trivial
3
+ *
4
+ * Inclusion-dependency folding for `EXISTS` / `IN` patterns after
5
+ * `rule-subquery-decorrelation` has materialized them as semi-joins.
6
+ *
7
+ * Pattern:
8
+ * SemiJoin(L, R, p)
9
+ * where p is an AND-of-column-equalities,
10
+ * L's equi columns form a declared FK referencing R's PK, and
11
+ * R is a row-preserving path to its base table.
12
+ *
13
+ * Rewrite:
14
+ * - FK columns all NOT NULL → replace the SemiJoin with L (every L row matches
15
+ * in R by the IND `L.fk ⊆ R.pk`).
16
+ * - FK has any nullable column → replace with `Filter(L, fk_col_1 IS NOT NULL
17
+ * AND … AND fk_col_n IS NOT NULL)`. Rows with NULL in any FK column would
18
+ * not match the equi-condition (NULL compares to UNKNOWN, never `true`)
19
+ * and so would not survive the semi-join.
20
+ *
21
+ * Either way the R side never executes — a meaningful win for federated vtabs
22
+ * where R is a remote table.
23
+ */
24
+ import { createLogger } from '../../../common/logger.js';
25
+ import { JoinNode, extractEquiPairsFromCondition } from '../../nodes/join-node.js';
26
+ import { FilterNode } from '../../nodes/filter.js';
27
+ import { UnaryOpNode, BinaryOpNode } from '../../nodes/scalar.js';
28
+ import { ColumnReferenceNode } from '../../nodes/reference.js';
29
+ import { normalizePredicate } from '../../analysis/predicate-normalizer.js';
30
+ import { lookupCoveringFK, isRowPreservingPathToTable, tableSchemaOf } from '../../util/ind-utils.js';
31
+ import { isAndOfColumnEqualities } from '../join/rule-join-elimination.js';
32
+ const log = createLogger('optimizer:rule:semi-join-fk-trivial');
33
+ export function ruleSemiJoinFkTrivial(node, _context) {
34
+ if (!(node instanceof JoinNode))
35
+ return null;
36
+ if (node.joinType !== 'semi')
37
+ return null;
38
+ if (!node.condition)
39
+ return null;
40
+ const normalized = normalizePredicate(node.condition);
41
+ if (!isAndOfColumnEqualities(normalized))
42
+ return null;
43
+ const leftAttrs = node.left.getAttributes();
44
+ const rightAttrs = node.right.getAttributes();
45
+ const pairs = extractEquiPairsFromCondition(node.condition, leftAttrs, rightAttrs);
46
+ if (pairs.length === 0)
47
+ return null;
48
+ const leftSchema = tableSchemaOf(node.left);
49
+ const rightSchema = tableSchemaOf(node.right);
50
+ if (!leftSchema || !rightSchema)
51
+ return null;
52
+ const childEquiCols = pairs.map(p => p.left);
53
+ const parentEquiCols = pairs.map(p => p.right);
54
+ const match = lookupCoveringFK(leftSchema, rightSchema, childEquiCols, parentEquiCols);
55
+ if (!match)
56
+ return null;
57
+ // The parent side must be the full table — if rows were filtered out, the
58
+ // IND inclusion doesn't preserve "every L row has a match" under filtering.
59
+ if (!isRowPreservingPathToTable(node.right))
60
+ return null;
61
+ if (!match.nullable) {
62
+ log('Dropping semi-join over non-null FK %s → %s; left side survives unchanged', leftSchema.name, rightSchema.name);
63
+ return node.left;
64
+ }
65
+ // Nullable FK: rows with NULL in any FK column never match in the semi-join.
66
+ // Replace the join with `Filter(L, fk IS NOT NULL AND …)`.
67
+ const predicate = buildIsNotNullPredicate(node.scope, leftAttrs, childEquiCols);
68
+ if (!predicate)
69
+ return null;
70
+ log('Trivializing semi-join over nullable FK %s → %s to Filter(L, fk IS NOT NULL)', leftSchema.name, rightSchema.name);
71
+ return new FilterNode(node.scope, node.left, predicate);
72
+ }
73
+ /**
74
+ * Build `col_1 IS NOT NULL AND col_2 IS NOT NULL AND …` over the given
75
+ * attribute indices into `leftAttrs`. Returns null if `cols` is empty.
76
+ */
77
+ function buildIsNotNullPredicate(scope, leftAttrs, cols) {
78
+ if (cols.length === 0)
79
+ return null;
80
+ const conjuncts = cols.map(idx => {
81
+ const attr = leftAttrs[idx];
82
+ const colExpr = attr.relationName
83
+ ? { type: 'column', name: attr.name, table: attr.relationName }
84
+ : { type: 'column', name: attr.name };
85
+ const colRef = new ColumnReferenceNode(scope, colExpr, attr.type, attr.id, idx);
86
+ const notNullAst = {
87
+ type: 'unary',
88
+ operator: 'IS NOT NULL',
89
+ expr: colExpr,
90
+ };
91
+ return new UnaryOpNode(scope, notNullAst, colRef);
92
+ });
93
+ return conjuncts.reduce((acc, cur) => {
94
+ const andAst = {
95
+ type: 'binary',
96
+ operator: 'AND',
97
+ left: acc.expression,
98
+ right: cur.expression,
99
+ };
100
+ return new BinaryOpNode(scope, andAst, acc, cur);
101
+ });
102
+ }
103
+ //# sourceMappingURL=rule-semi-join-fk-trivial.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-semi-join-fk-trivial.js","sourceRoot":"","sources":["../../../../../src/planner/rules/subquery/rule-semi-join-fk-trivial.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"rule-subquery-decorrelation.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/subquery/rule-subquery-decorrelation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAsC,MAAM,0BAA0B,CAAC;AAE7F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAgU7D,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAsE/F"}
1
+ {"version":3,"file":"rule-subquery-decorrelation.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/subquery/rule-subquery-decorrelation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAsC,MAAM,0BAA0B,CAAC;AAE7F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAiS7D,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAsE/F"}
@@ -27,32 +27,8 @@ import { BinaryOpNode } from '../../nodes/scalar.js';
27
27
  import { ColumnReferenceNode } from '../../nodes/reference.js';
28
28
  import { isCorrelatedSubquery } from '../../cache/correlation-detector.js';
29
29
  import { PlanNodeType } from '../../nodes/plan-node-type.js';
30
+ import { splitConjuncts, combineConjuncts } from '../../analysis/predicate-conjuncts.js';
30
31
  const log = createLogger('optimizer:rule:subquery-decorrelation');
31
- /**
32
- * Split an AND-tree into conjuncts.
33
- */
34
- function splitConjuncts(pred) {
35
- const result = [];
36
- const stack = [pred];
37
- while (stack.length) {
38
- const n = stack.pop();
39
- if (n instanceof BinaryOpNode && n.expression.operator === 'AND') {
40
- stack.push(n.left, n.right);
41
- }
42
- else {
43
- result.push(n);
44
- }
45
- }
46
- return result;
47
- }
48
- /**
49
- * Combine conjuncts back into an AND-tree.
50
- */
51
- function combineConjuncts(conjuncts) {
52
- if (conjuncts.length === 0)
53
- return null;
54
- return conjuncts.reduce((acc, cur) => new BinaryOpNode(cur.scope, { type: 'binary', operator: 'AND', left: acc.expression, right: cur.expression }, acc, cur));
55
- }
56
32
  /**
57
33
  * Identify a decorrelation candidate from a single conjunct.
58
34
  */
@@ -1 +1 @@
1
- {"version":3,"file":"rule-subquery-decorrelation.js","sourceRoot":"","sources":["../../../../../src/planner/rules/subquery/rule-subquery-decorrelation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rule-subquery-decorrelation.js","sourceRoot":"","sources":["../../../../../src/planner/rules/subquery/rule-subquery-decorrelation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAiB,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAEzF,MAAM,GAAG,GAAG,YAAY,CAAC,uCAAuC,CAAC,CAAC;AAWlE;;GAEG;AACH,SAAS,iBAAiB,CAAC,IAAoB;IAC9C,mBAAmB;IACnB,IAAI,IAAI,YAAY,UAAU,EAAE,CAAC;QAChC,IAAI,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;QACtE,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,uBAAuB;IACvB,IAAI,IAAI,YAAY,WAAW,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;QACvE,IAAI,IAAI,CAAC,OAAO,YAAY,UAAU,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;YAC5B,IAAI,oBAAoB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;YACxE,CAAC;QACF,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,+BAA+B;IAC/B,IAAI,IAAI,YAAY,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAC3D,IAAI,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACvC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;QACtE,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,IAAc;IAC5C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,SAAS,IAAI,CAAC,CAAW;QACxB,IAAI,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC;gBACtC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;QACF,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACrC,IAAI,CAAC,KAAK,CAAC,CAAC;QACb,CAAC;IACF,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,CAAC;IACX,OAAO,GAAG,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,IAAc,EAAE,OAAoB;IAC9D,IAAI,IAAI,YAAY,mBAAmB,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAC1E,OAAO,IAAI,CAAC;IACb,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACxC,IAAI,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;IACpD,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAS,wBAAwB,CAChC,YAAgC,EAChC,YAAyB;IAMzB,uDAAuD;IACvD,IAAI,OAAO,GAAuB,YAAY,CAAC;IAE/C,kFAAkF;IAClF,OAAO,OAAO,CAAC,QAAQ,KAAK,YAAY,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,YAAY,CAAC,KAAK,EAAE,CAAC;QAC7F,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAAE,MAAM;QACrC,OAAO,GAAG,MAAM,CAAC;IAClB,CAAC;IAED,4DAA4D;IAC5D,IAAI,CAAC,CAAC,OAAO,YAAY,UAAU,CAAC,EAAE,CAAC;QACtC,8EAA8E;QAC9E,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC;IACvB,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;IAClC,MAAM,YAAY,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAExD,mDAAmD;IACnD,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACnD,MAAM,oBAAoB,GAAqB,EAAE,CAAC;IAClD,MAAM,kBAAkB,GAAqB,EAAE,CAAC;IAEhD,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC9B,IAAI,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,YAAY,CAAC,EAAE,CAAC;YACzD,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACP,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;IACF,CAAC;IAED,IAAI,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,mCAAmC;QACnC,OAAO,IAAI,CAAC;IACb,CAAC;IAED,uEAAuE;IACvE,wEAAwE;IACxE,wEAAwE;IACxE,uEAAuE;IACvE,wCAAwC;IACxC,KAAK,MAAM,IAAI,IAAI,kBAAkB,EAAE,CAAC;QACvC,IAAI,iBAAiB,CAAC,IAAI,EAAE,YAAY,CAAC;YAAE,OAAO,IAAI,CAAC;IACxD,CAAC;IAED,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,oBAAoB,CAAE,CAAC;IACrE,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;IAEjE,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CACzB,IAAoB,EACpB,YAAyB,EACzB,YAAyB;IAEzB,IAAI,CAAC,CAAC,IAAI,YAAY,YAAY,CAAC;QAAE,OAAO,KAAK,CAAC;IAClD,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IACnD,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,YAAY,mBAAmB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,YAAY,mBAAmB,CAAC;QAAE,OAAO,KAAK,CAAC;IAE9G,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;IAEvC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1D,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAC5B,MAAc,EACd,YAAyB;IAMzB,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEhC,4DAA4D;IAC5D,4DAA4D;IAC5D,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;IAEnC,gEAAgE;IAChE,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,YAAY,mBAAmB,CAAC,EAAE,CAAC;QACxD,0DAA0D;QAC1D,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC;IACrC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC;QAChD,kEAAkE;QAClE,OAAO,IAAI,CAAC;IACb,CAAC;IAED,6DAA6D;IAC7D,MAAM,UAAU,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;IAChD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,cAAc,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAErC,4DAA4D;IAC5D,qFAAqF;IACrF,MAAM,WAAW,GAAG,IAAI,mBAAmB,CAC1C,WAAW,CAAC,KAAK,EACjB,WAAW,CAAC,UAAU,EAAG,kCAAkC;IAC3D,cAAc,CAAC,IAAI,EACnB,cAAc,CAAC,EAAE,EACjB,CAAC,CAAC,qCAAqC;KACvC,CAAC;IAEF,MAAM,aAAa,GAAG,IAAI,YAAY,CACrC,WAAW,CAAC,KAAK,EACjB,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,CAAC,UAAU,EAAE,KAAK,EAAE,WAAW,CAAC,UAAU,EAAE,EAC9F,WAAW,EACX,WAAW,CACX,CAAC;IAEF,uEAAuE;IACvE,IAAI,OAAO,GAAuB,YAAY,CAAC;IAE/C,+BAA+B;IAC/B,OAAO,OAAO,CAAC,QAAQ,KAAK,YAAY,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,YAAY,CAAC,KAAK,EAAE,CAAC;QAC7F,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAAE,MAAM;QACrC,OAAO,GAAG,MAAM,CAAC;IAClB,CAAC;IAED,8DAA8D;IAC9D,IAAI,OAAO,YAAY,UAAU,EAAE,CAAC;QACnC,MAAM,YAAY,GAAG,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACpD,MAAM,qBAAqB,GAAqB,EAAE,CAAC;QACnD,MAAM,SAAS,GAAqB,EAAE,CAAC;QAEvC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC9B,IAAI,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,YAAY,CAAC,EAAE,CAAC;gBACzD,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACP,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;QACF,CAAC;QAED,uEAAuE;QACvE,oDAAoD;QACpD,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC9B,IAAI,iBAAiB,CAAC,IAAI,EAAE,YAAY,CAAC;gBAAE,OAAO,IAAI,CAAC;QACxD,CAAC;QAED,MAAM,cAAc,GAAG,CAAC,aAAa,EAAE,GAAG,qBAAqB,CAAC,CAAC;QACjE,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,cAAc,CAAE,CAAC;QAC/D,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAExD,OAAO;YACN,WAAW,EAAE,OAAO,CAAC,MAAM;YAC3B,oBAAoB;YACpB,mBAAmB;SACnB,CAAC;IACH,CAAC;IAED,oEAAoE;IACpE,OAAO;QACN,WAAW,EAAE,OAAO;QACpB,oBAAoB,EAAE,aAAa;QACnC,mBAAmB,EAAE,IAAI;KACzB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAAc,EAAE,QAAoB;IAC7E,IAAI,CAAC,CAAC,IAAI,YAAY,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAE/C,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC;IAChC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEzE,4CAA4C;IAC5C,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAEjD,yCAAyC;IACzC,IAAI,cAAc,GAAG,CAAC,CAAC,CAAC;IACxB,IAAI,SAAS,GAAkC,IAAI,CAAC;IAEpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,SAAS,EAAE,CAAC;YACf,cAAc,GAAG,CAAC,CAAC;YACnB,MAAM;QACP,CAAC;IACF,CAAC;IAED,IAAI,CAAC,SAAS,IAAI,cAAc,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAErD,GAAG,CAAC,sDAAsD,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEhF,kDAAkD;IAClD,IAAI,UAAU,GAIH,IAAI,CAAC;IAEhB,IAAI,SAAS,CAAC,YAAY,YAAY,UAAU,EAAE,CAAC;QAClD,UAAU,GAAG,wBAAwB,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACtF,CAAC;SAAM,IAAI,SAAS,CAAC,YAAY,YAAY,MAAM,EAAE,CAAC;QACrD,UAAU,GAAG,oBAAoB,CAAC,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,GAAG,CAAC,mEAAmE,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,EAAE,WAAW,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,GAAG,UAAU,CAAC;IAE9E,wFAAwF;IACxF,IAAI,SAAS,GAAuB,WAAW,CAAC;IAChD,IAAI,mBAAmB,EAAE,CAAC;QACzB,SAAS,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,mBAAmB,CAAC,CAAC;IACjF,CAAC;IAED,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAC5B,WAAW,CAAC,KAAK,EACjB,WAAW,EACX,SAAS,EACT,SAAS,CAAC,QAAQ,EAClB,oBAAoB,CACpB,CAAC;IAEF,GAAG,CAAC,uCAAuC,EAAE,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IAEhH,oFAAoF;IACpF,MAAM,kBAAkB,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC;IAC5E,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,kBAAkB,CAAE,CAAC;QAChE,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,QAAQ,CAAC;AACjB,CAAC"}
@@ -37,7 +37,7 @@ export class GlobalScope extends BaseScope {
37
37
  if (!vtabModule) {
38
38
  return undefined;
39
39
  }
40
- return new TableReferenceNode(this, tableSchema, vtabModule.module, vtabModule.auxData);
40
+ return new TableReferenceNode(this, tableSchema, vtabModule.module, vtabModule.auxData, undefined, false, this.manager);
41
41
  }
42
42
  findUnqualifiedName(name) {
43
43
  // Functions have priority over tables.
@@ -54,7 +54,7 @@ export class GlobalScope extends BaseScope {
54
54
  if (!vtabModule) {
55
55
  return undefined;
56
56
  }
57
- return new TableReferenceNode(this, table, vtabModule.module, vtabModule.auxData);
57
+ return new TableReferenceNode(this, table, vtabModule.module, vtabModule.auxData, undefined, false, this.manager);
58
58
  }
59
59
  return undefined;
60
60
  }
@@ -1 +1 @@
1
- {"version":3,"file":"global.js","sourceRoot":"","sources":["../../../../src/planner/scopes/global.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"global.js","sourceRoot":"","sources":["../../../../src/planner/scopes/global.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAItC,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAGlF,OAAO,EAAuB,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AACvF,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,SAAS,qBAAqB,CAAC,IAAoB;IAClD,OAAO,sBAAsB,CAAC,IAAI,CAAC;QAClC,CAAC,CAAC,IAAI,CAAC,UAAU;QACjB,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AACtF,CAAC;AAED,MAAM,OAAO,WAAY,SAAQ,SAAS;IACb;IAA5B,YAA4B,OAAsB;QACjD,KAAK,EAAE,CAAC;QADmB,YAAO,GAAP,OAAO,CAAe;IAElD,CAAC;IAED,aAAa,CAAC,SAAiB,EAAE,WAA2B;QAC3D,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA,gCAAgC;YAC7D,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACjC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACpD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACX,OAAO,SAAS,CAAC;YAClB,CAAC;YAED,OAAO,IAAI,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3E,CAAC;QACD,wBAAwB;QACxB,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QACtC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,0EAA0E;QAC1E,uFAAuF;QACvF,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QACtE,IAAI,CAAC,UAAU,EAAE,CAAC;YACjB,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,OAAO,IAAI,kBAAkB,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACzH,CAAC;IAED,mBAAmB,CAAC,IAAY;QAC/B,uCAAuC;QACvC,0CAA0C;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAChD,IAAI,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3E,CAAC;QACD,wBAAwB;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,KAAK,EAAE,CAAC;YACX,+DAA+D;YAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAChE,IAAI,CAAC,UAAU,EAAE,CAAC;gBACjB,OAAO,SAAS,CAAC;YAClB,CAAC;YACD,OAAO,IAAI,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACnH,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;CACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"type-utils.d.ts","sourceRoot":"","sources":["../../../src/planner/type-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAU,MAAM,uBAAuB,CAAC;AACzF,OAAO,EAAc,KAAK,YAAY,EAAE,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAIhD;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,WAAW,GAAG,YAAY,CA8ClF;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,QAAQ,GAAG,UAAU,CASlE;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAIpI;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAE5G;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,SAAS,CAYlF"}
1
+ {"version":3,"file":"type-utils.d.ts","sourceRoot":"","sources":["../../../src/planner/type-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAU,MAAM,uBAAuB,CAAC;AACzF,OAAO,EAAc,KAAK,YAAY,EAAE,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAIhD;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,WAAW,GAAG,YAAY,CAwDlF;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,QAAQ,GAAG,UAAU,CASlE;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAIpI;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAE5G;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,SAAS,CAYlF"}
@@ -31,8 +31,19 @@ export function relationTypeFromTableSchema(tableSchema) {
31
31
  // Add unique constraints as additional keys, but only when all constrained
32
32
  // columns are NOT NULL. SQL UNIQUE allows multiple NULLs, so a nullable
33
33
  // UNIQUE column is not a true key for DISTINCT elimination purposes.
34
+ // Partial UNIQUE constraints (those with a `predicate`, synthesized from
35
+ // `CREATE UNIQUE INDEX ... WHERE ...`) only guarantee uniqueness within
36
+ // the partial scope, so they cannot be promoted to relation-level keys —
37
+ // doing so would let the FD layer derive `K → all-other-cols` over the
38
+ // whole table and silently break DISTINCT/GROUP BY/ORDER BY/join-elimination
39
+ // for rows outside the scope. Partial UCs are instead routed through
40
+ // `planner/analysis/partial-unique-extraction.ts`, which emits *guarded* FDs
41
+ // that Filter activation discharges when a surrounding predicate entails
42
+ // the partial WHERE.
34
43
  if (tableSchema.uniqueConstraints) {
35
44
  for (const uc of tableSchema.uniqueConstraints) {
45
+ if (uc.predicate !== undefined)
46
+ continue;
36
47
  const allNotNull = uc.columns.every(idx => tableSchema.columns[idx]?.notNull);
37
48
  if (allNotNull) {
38
49
  keys.push(uc.columns.map(idx => ({ index: idx })));
@@ -1 +1 @@
1
- {"version":3,"file":"type-utils.js","sourceRoot":"","sources":["../../../src/planner/type-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"type-utils.js","sourceRoot":"","sources":["../../../src/planner/type-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,245 @@
1
+ /**
2
+ * Functional dependency (FD) and equivalence-class (EC) helpers used by
3
+ * `computePhysical` on relational plan nodes. See `docs/optimizer.md`
4
+ * section "Functional Dependency Tracking" for the propagation table and
5
+ * design rationale.
6
+ */
7
+ import type { ConstantBinding, ConstantValue, DomainConstraint, FunctionalDependency, GuardPredicate, ScalarPlanNode } from '../nodes/plan-node.js';
8
+ /**
9
+ * Per-node cap on the number of FDs we materialize. The propagation rules
10
+ * are conservative enough that hitting this in practice is rare; the cap
11
+ * is a safety valve for pathological plans.
12
+ */
13
+ export declare const MAX_FDS_PER_NODE = 64;
14
+ /**
15
+ * Closure of `attrs` under `fds`. Iterative fixed-point.
16
+ *
17
+ * Guarded FDs (`fd.guard !== undefined`) are skipped — they are only valid
18
+ * under a surrounding predicate, and the closure layer has no notion of one.
19
+ * Filter activation strips the guard before the FD reaches closure consumers.
20
+ *
21
+ * O(|fds| × growth) — terminates when no new attribute is added in a pass.
22
+ */
23
+ export declare function computeClosure(attrs: ReadonlySet<number>, fds: ReadonlyArray<FunctionalDependency>): Set<number>;
24
+ /**
25
+ * Expand a list of equivalence classes into bi-directional FDs over the same
26
+ * column indices, then concatenate with the existing FDs. For a class
27
+ * `{c0, c1, ..., ck}` this emits `{ci} → {cj}` for every distinct ordered pair
28
+ * — enough for `computeClosure` to derive every member from any one of them.
29
+ */
30
+ export declare function expandEcsToFds(ecs: ReadonlyArray<ReadonlyArray<number>>, fds: ReadonlyArray<FunctionalDependency>): FunctionalDependency[];
31
+ /** True iff `attrs` determines every attribute in `target` under `fds`. */
32
+ export declare function determines(attrs: ReadonlySet<number>, target: ReadonlySet<number>, fds: ReadonlyArray<FunctionalDependency>): boolean;
33
+ /**
34
+ * Smallest subset of `attrs` whose closure equals the closure of `attrs`.
35
+ * Greedy minimization: try dropping each attribute; keep the drop iff the
36
+ * resulting closure is unchanged. O(|attrs|² × |fds|).
37
+ */
38
+ export declare function minimalCover(attrs: ReadonlySet<number>, fds: ReadonlyArray<FunctionalDependency>): Set<number>;
39
+ export interface AddFdOptions {
40
+ /**
41
+ * Hint: column subsets that are known full-cover keys on the relation.
42
+ * Used by `enforceCap` to prefer FDs whose determinants are subsets of
43
+ * any such key when truncating; otherwise unused. Optional.
44
+ */
45
+ keyHints?: ReadonlyArray<ReadonlyArray<number>>;
46
+ cap?: number;
47
+ }
48
+ /**
49
+ * Add a single FD, dropping any existing entry with the same determinants
50
+ * (and same guard) whose dependents are a subset of the new one (subsumption).
51
+ * When the resulting list exceeds the cap, drop FDs whose determinants are
52
+ * not a subset of any `keyHints` entry on the same node.
53
+ *
54
+ * Guard-aware: FDs with different `guard` predicates are kept side-by-side
55
+ * even when their determinants/dependents match — they are logically distinct
56
+ * facts and may be activated by different surrounding predicates.
57
+ */
58
+ export declare function addFd(fds: ReadonlyArray<FunctionalDependency>, next: FunctionalDependency, opts?: AddFdOptions): FunctionalDependency[];
59
+ /** Merge two FD lists, applying subsumption via `addFd`. */
60
+ export declare function mergeFds(a: ReadonlyArray<FunctionalDependency>, b: ReadonlyArray<FunctionalDependency>, opts?: AddFdOptions): FunctionalDependency[];
61
+ /**
62
+ * Project FDs through a column mapping (oldCol → newCol). FDs whose
63
+ * determinants lose any column are dropped entirely (the projection breaks
64
+ * the determinant set). Dependents that don't survive are filtered out;
65
+ * an FD whose dependents are completely filtered is dropped.
66
+ *
67
+ * Exception: an FD with empty determinants (the singleton "at-most-one-row"
68
+ * marker) survives as long as at least one dependent does — losing some
69
+ * dependent columns to projection doesn't invalidate the at-most-one-row
70
+ * claim on the surviving columns.
71
+ *
72
+ * Guarded FDs additionally require every column referenced in `guard.clauses`
73
+ * to be in the mapping — if any guard column is dropped the guard becomes
74
+ * unobservable and the FD can never be re-activated downstream.
75
+ */
76
+ export declare function projectFds(fds: ReadonlyArray<FunctionalDependency>, mapping: ReadonlyMap<number, number>): FunctionalDependency[];
77
+ /** Shift all column indices in `fds` (including any `guard` columns) by `offset`. */
78
+ export declare function shiftFds(fds: ReadonlyArray<FunctionalDependency>, offset: number): FunctionalDependency[];
79
+ /**
80
+ * Return the unconditional twin of `fd` — drop the guard but keep determinants
81
+ * and dependents. Used by Filter activation when the surrounding predicate
82
+ * entails the guard.
83
+ */
84
+ export declare function stripGuard(fd: FunctionalDependency): FunctionalDependency;
85
+ /** Shift all column indices in `classes` by `offset`. */
86
+ export declare function shiftEquivClasses(classes: ReadonlyArray<ReadonlyArray<number>>, offset: number): number[][];
87
+ /**
88
+ * Merge two equivalence-class sets, taking the transitive closure of
89
+ * overlapping classes (union-find style).
90
+ */
91
+ export declare function mergeEquivClasses(a: ReadonlyArray<ReadonlyArray<number>>, b: ReadonlyArray<ReadonlyArray<number>>): number[][];
92
+ /** Add a new equality `a ≡ b` to an existing class list. */
93
+ export declare function addEquivalence(classes: ReadonlyArray<ReadonlyArray<number>>, a: number, b: number): number[][];
94
+ /**
95
+ * Build an FD `key → {0..columnCount-1} \ key` from a superkey. The canonical
96
+ * way to encode "K is a unique key on a relation": K determines every other
97
+ * output column. K = ∅ produces the "at-most-one-row" singleton FD.
98
+ *
99
+ * Returns undefined when K covers every column (the all-columns case has no
100
+ * non-trivial encoding — that case is communicated via `RelationType.isSet`
101
+ * instead).
102
+ */
103
+ export declare function superkeyToFd(key: readonly number[], columnCount: number): FunctionalDependency | undefined;
104
+ /**
105
+ * True iff the closure of `attrs` under `fds` covers `{0..columnCount-1}` —
106
+ * i.e., `attrs` is a superkey of the relation. Replaces the legacy "covers a
107
+ * `uniqueKeys` entry" check; FDs are the canonical surface now.
108
+ */
109
+ export declare function isSuperkey(attrs: ReadonlySet<number>, fds: ReadonlyArray<FunctionalDependency> | undefined, columnCount: number): boolean;
110
+ /**
111
+ * Enumerate the minimal full-cover key sets discoverable from `fds`: for each
112
+ * FD `K → Y` whose closure covers all columns, return `K` (greedily minimized
113
+ * within `K`). Deduplicated by set equality.
114
+ *
115
+ * Excludes the trivial "all-columns is a superkey" tautology — only FDs with
116
+ * `K ⊊ all_cols` are considered, since the all-cols case is encoded via
117
+ * `RelationType.isSet`.
118
+ */
119
+ export declare function deriveKeysFromFds(fds: ReadonlyArray<FunctionalDependency> | undefined, columnCount: number): number[][];
120
+ /**
121
+ * True iff the FD set encodes any non-trivial key — i.e., there exists some
122
+ * FD whose determinants form a superkey of `columnCount` columns with the
123
+ * determinant set strictly smaller than all columns. This is the FD-surface
124
+ * replacement for "the relation has a known unique key smaller than its full
125
+ * column list" (the old `uniqueKeys.length > 0` check), excluding the
126
+ * tautological all-columns case which carries no information.
127
+ */
128
+ export declare function hasAnyKey(fds: ReadonlyArray<FunctionalDependency> | undefined, columnCount: number): boolean;
129
+ /**
130
+ * True iff the relation has at-most-one-row — i.e., some FD `∅ → Y` exists
131
+ * whose closure covers every column. Replaces the legacy `[[]]` singleton
132
+ * marker on `uniqueKeys`.
133
+ */
134
+ export declare function hasSingletonFd(fds: ReadonlyArray<FunctionalDependency> | undefined, columnCount: number): boolean;
135
+ /**
136
+ * Build the singleton FD `∅ → {0..columnCount-1}` that encodes
137
+ * "at-most-one-row". Returns undefined when `columnCount === 0` (no
138
+ * dependents).
139
+ */
140
+ export declare function singletonFd(columnCount: number): FunctionalDependency | undefined;
141
+ /**
142
+ * True iff `attrs` is asserted to be a unique key by the FD set — i.e., there
143
+ * exists some FD whose determinants are a subset of `attrs` and whose closure
144
+ * covers all columns. Stricter than `isSuperkey`: the trivial "all-cols is a
145
+ * superkey of itself" tautology does NOT count, because no FD makes that claim.
146
+ *
147
+ * Use this when you need a positive uniqueness claim (e.g., the
148
+ * sort/window strict-monotonicOn check). For "would attrs functionally
149
+ * determine the rest of the relation under closure?" use `isSuperkey` directly.
150
+ */
151
+ export declare function isAssertedKey(attrs: ReadonlySet<number>, fds: ReadonlyArray<FunctionalDependency> | undefined, columnCount: number): boolean;
152
+ /**
153
+ * Re-export so callers can import the binding shape from this module
154
+ * alongside the helpers (avoids reaching into `plan-node.js` for types
155
+ * that are conceptually part of the FD/EC layer).
156
+ */
157
+ export type { ConstantBinding, ConstantValue };
158
+ /**
159
+ * Extracted FD/EC/binding contributions from an equality-shaped predicate.
160
+ *
161
+ * - `fds`: FDs of the form `∅ → col` (column constant under the predicate)
162
+ * or `col1 → col2` / `col2 → col1` (mutual determination from `col1 = col2`).
163
+ * - `equivPairs`: `[col1, col2]` pairs to be merged into the EC list.
164
+ * - `constantBindings`: per-column constant bindings (one per `col = const`
165
+ * or `col = ?` conjunct). The caller is responsible for closing these
166
+ * over the resulting EC list.
167
+ */
168
+ export interface EqualityFds {
169
+ readonly fds: ReadonlyArray<FunctionalDependency>;
170
+ readonly equivPairs: ReadonlyArray<readonly [number, number]>;
171
+ readonly constantBindings: ReadonlyArray<ConstantBinding>;
172
+ }
173
+ /**
174
+ * Walk `predicate` (assumed to be a normalized conjunction) and extract FDs,
175
+ * equivalence-class contributions, and constant bindings from equality
176
+ * conjuncts.
177
+ *
178
+ * `attrIdToIndex` maps an attribute ID to its column index in the predicate's
179
+ * relation. Equality conjuncts referencing attributes outside this map
180
+ * (correlated subqueries, etc.) are silently ignored.
181
+ *
182
+ * Recognized shapes (per AND-conjunct):
183
+ * - `col = literal` ⇒ FD `∅ → col` + binding `{col} → literal value`.
184
+ * - `col = ?` ⇒ FD `∅ → col` + binding `{col} → parameter ref`.
185
+ * - `col1 = col2` ⇒ FDs `{col1} → {col2}` and `{col2} → {col1}` plus an
186
+ * equivalence pair `[col1, col2]`.
187
+ *
188
+ * Non-equality conjuncts contribute nothing.
189
+ */
190
+ export declare function extractEqualityFds(predicate: ScalarPlanNode, attrIdToIndex: ReadonlyMap<number, number>): EqualityFds;
191
+ /**
192
+ * Decide whether the surrounding `predicate` (combined with the source's ECs
193
+ * and constant bindings) entails every clause in `guard`. Conservative — when
194
+ * in doubt, returns `false`.
195
+ *
196
+ * `isColumnNonNullable(col)` reports whether the source's output column is
197
+ * declared NOT NULL; the helper uses it to discharge `is-null negated:true`
198
+ * guards from type information alone.
199
+ *
200
+ * `isColumnNumeric(col)` reports whether the source's output column has a
201
+ * numeric logical type. Used to gate the `NOT col → col = 0` rewrite: only
202
+ * sound for numeric columns since the consumer matches `eq-literal{col, 0}`
203
+ * via strict `sqlValueEquals`, which treats TEXT `''`, BLOB, and boolean
204
+ * `false` as unequal to integer 0.
205
+ */
206
+ export declare function predicateImpliesGuard(predicate: ScalarPlanNode, guard: GuardPredicate, ecs: ReadonlyArray<ReadonlyArray<number>>, bindings: ReadonlyArray<ConstantBinding>, attrIdToIndex: ReadonlyMap<number, number>, isColumnNonNullable: (col: number) => boolean, isColumnNumeric: (col: number) => boolean): boolean;
207
+ /**
208
+ * Merge two binding lists, coalescing bindings that share a `ConstantValue`
209
+ * by unioning their `attrs`. Caps the result at `MAX_FDS_PER_NODE`; later
210
+ * additions are dropped when the cap is exceeded — bindings sourced from
211
+ * earlier nodes are preferred since they typically sit closer to keyed
212
+ * columns. Truncations are logged under `quereus:planner:fd`.
213
+ */
214
+ export declare function mergeConstantBindings(a: ReadonlyArray<ConstantBinding>, b: ReadonlyArray<ConstantBinding>): ConstantBinding[];
215
+ /**
216
+ * Extend `bindings` over `ecs`: if a binding pins column `c` to value `v` and
217
+ * `c` is in an equivalence class `{c, c2, ...}`, fold every member of that
218
+ * class into the binding's `attrs`. This is what lets predicate-inference
219
+ * rules consume bindings directly without walking ECs.
220
+ */
221
+ export declare function closeConstantBindingsOverEcs(bindings: ReadonlyArray<ConstantBinding>, ecs: ReadonlyArray<ReadonlyArray<number>>): ConstantBinding[];
222
+ /**
223
+ * Project bindings through `mapping` (oldCol → newCol). A binding whose
224
+ * `attrs` lose every member is dropped; otherwise the surviving members are
225
+ * remapped.
226
+ */
227
+ export declare function projectConstantBindings(bindings: ReadonlyArray<ConstantBinding>, mapping: ReadonlyMap<number, number>): ConstantBinding[];
228
+ /** Shift `attrs` by `offset` (column-index translation for joins). */
229
+ export declare function shiftConstantBindings(bindings: ReadonlyArray<ConstantBinding>, offset: number): ConstantBinding[];
230
+ export type { DomainConstraint };
231
+ /**
232
+ * Concatenate two domain-constraint lists, dropping structurally equal
233
+ * duplicates. We deliberately do NOT intersect overlapping range/enum
234
+ * constraints on the same column — that's deferred to the
235
+ * predicate-contradiction-detection ticket. Caps at `MAX_FDS_PER_NODE`.
236
+ */
237
+ export declare function mergeDomainConstraints(a: ReadonlyArray<DomainConstraint>, b: ReadonlyArray<DomainConstraint>): DomainConstraint[];
238
+ /**
239
+ * Project domain constraints through `mapping` (oldCol → newCol). Drops any
240
+ * constraint whose column is not in the mapping; remaps the rest.
241
+ */
242
+ export declare function projectDomainConstraints(domains: ReadonlyArray<DomainConstraint>, mapping: ReadonlyMap<number, number>): DomainConstraint[];
243
+ /** Shift every domain constraint's `column` by `offset` (join translation). */
244
+ export declare function shiftDomainConstraints(domains: ReadonlyArray<DomainConstraint>, offset: number): DomainConstraint[];
245
+ //# sourceMappingURL=fd-utils.d.ts.map