@quereus/quereus 3.3.0 → 4.1.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 (900) hide show
  1. package/README.md +7 -0
  2. package/dist/src/common/datatype.d.ts +12 -0
  3. package/dist/src/common/datatype.d.ts.map +1 -1
  4. package/dist/src/common/datatype.js.map +1 -1
  5. package/dist/src/common/types.d.ts +24 -0
  6. package/dist/src/common/types.d.ts.map +1 -1
  7. package/dist/src/common/types.js.map +1 -1
  8. package/dist/src/core/database-assertions.d.ts +37 -9
  9. package/dist/src/core/database-assertions.d.ts.map +1 -1
  10. package/dist/src/core/database-assertions.js +62 -110
  11. package/dist/src/core/database-assertions.js.map +1 -1
  12. package/dist/src/core/database-events.d.ts +163 -0
  13. package/dist/src/core/database-events.d.ts.map +1 -1
  14. package/dist/src/core/database-events.js +235 -21
  15. package/dist/src/core/database-events.js.map +1 -1
  16. package/dist/src/core/database-external-changes.d.ts +28 -0
  17. package/dist/src/core/database-external-changes.d.ts.map +1 -0
  18. package/dist/src/core/database-external-changes.js +242 -0
  19. package/dist/src/core/database-external-changes.js.map +1 -0
  20. package/dist/src/core/database-internal.d.ts +50 -1
  21. package/dist/src/core/database-internal.d.ts.map +1 -1
  22. package/dist/src/core/database-materialized-views.d.ts +1253 -0
  23. package/dist/src/core/database-materialized-views.d.ts.map +1 -0
  24. package/dist/src/core/database-materialized-views.js +3064 -0
  25. package/dist/src/core/database-materialized-views.js.map +1 -0
  26. package/dist/src/core/database-options.d.ts +4 -0
  27. package/dist/src/core/database-options.d.ts.map +1 -1
  28. package/dist/src/core/database-options.js +10 -0
  29. package/dist/src/core/database-options.js.map +1 -1
  30. package/dist/src/core/database-transaction.d.ts +19 -3
  31. package/dist/src/core/database-transaction.d.ts.map +1 -1
  32. package/dist/src/core/database-transaction.js +30 -3
  33. package/dist/src/core/database-transaction.js.map +1 -1
  34. package/dist/src/core/database-watchers.d.ts +19 -0
  35. package/dist/src/core/database-watchers.d.ts.map +1 -1
  36. package/dist/src/core/database-watchers.js +63 -3
  37. package/dist/src/core/database-watchers.js.map +1 -1
  38. package/dist/src/core/database.d.ts +204 -11
  39. package/dist/src/core/database.d.ts.map +1 -1
  40. package/dist/src/core/database.js +493 -29
  41. package/dist/src/core/database.js.map +1 -1
  42. package/dist/src/core/derived-row-validator.d.ts +137 -0
  43. package/dist/src/core/derived-row-validator.d.ts.map +1 -0
  44. package/dist/src/core/derived-row-validator.js +314 -0
  45. package/dist/src/core/derived-row-validator.js.map +1 -0
  46. package/dist/src/core/statement.d.ts.map +1 -1
  47. package/dist/src/core/statement.js +30 -9
  48. package/dist/src/core/statement.js.map +1 -1
  49. package/dist/src/emit/ast-stringify.d.ts +135 -1
  50. package/dist/src/emit/ast-stringify.d.ts.map +1 -1
  51. package/dist/src/emit/ast-stringify.js +793 -118
  52. package/dist/src/emit/ast-stringify.js.map +1 -1
  53. package/dist/src/func/builtins/aggregate.d.ts.map +1 -1
  54. package/dist/src/func/builtins/aggregate.js +11 -10
  55. package/dist/src/func/builtins/aggregate.js.map +1 -1
  56. package/dist/src/func/builtins/builtin-window-functions.d.ts.map +1 -1
  57. package/dist/src/func/builtins/builtin-window-functions.js +32 -0
  58. package/dist/src/func/builtins/builtin-window-functions.js.map +1 -1
  59. package/dist/src/func/builtins/explain.d.ts +3 -0
  60. package/dist/src/func/builtins/explain.d.ts.map +1 -1
  61. package/dist/src/func/builtins/explain.js +229 -0
  62. package/dist/src/func/builtins/explain.js.map +1 -1
  63. package/dist/src/func/builtins/index.d.ts.map +1 -1
  64. package/dist/src/func/builtins/index.js +10 -2
  65. package/dist/src/func/builtins/index.js.map +1 -1
  66. package/dist/src/func/builtins/json.d.ts.map +1 -1
  67. package/dist/src/func/builtins/json.js +3 -2
  68. package/dist/src/func/builtins/json.js.map +1 -1
  69. package/dist/src/func/builtins/mutation.d.ts +2 -0
  70. package/dist/src/func/builtins/mutation.d.ts.map +1 -0
  71. package/dist/src/func/builtins/mutation.js +53 -0
  72. package/dist/src/func/builtins/mutation.js.map +1 -0
  73. package/dist/src/func/builtins/schema.d.ts +2 -0
  74. package/dist/src/func/builtins/schema.d.ts.map +1 -1
  75. package/dist/src/func/builtins/schema.js +716 -27
  76. package/dist/src/func/builtins/schema.js.map +1 -1
  77. package/dist/src/func/builtins/string.js +1 -1
  78. package/dist/src/func/builtins/string.js.map +1 -1
  79. package/dist/src/func/registration.d.ts +13 -0
  80. package/dist/src/func/registration.d.ts.map +1 -1
  81. package/dist/src/func/registration.js +5 -0
  82. package/dist/src/func/registration.js.map +1 -1
  83. package/dist/src/index.d.ts +25 -6
  84. package/dist/src/index.d.ts.map +1 -1
  85. package/dist/src/index.js +27 -3
  86. package/dist/src/index.js.map +1 -1
  87. package/dist/src/parser/ast.d.ts +353 -21
  88. package/dist/src/parser/ast.d.ts.map +1 -1
  89. package/dist/src/parser/index.d.ts +14 -1
  90. package/dist/src/parser/index.d.ts.map +1 -1
  91. package/dist/src/parser/index.js +19 -0
  92. package/dist/src/parser/index.js.map +1 -1
  93. package/dist/src/parser/lexer.d.ts +9 -0
  94. package/dist/src/parser/lexer.d.ts.map +1 -1
  95. package/dist/src/parser/lexer.js +9 -0
  96. package/dist/src/parser/lexer.js.map +1 -1
  97. package/dist/src/parser/parser.d.ts +276 -7
  98. package/dist/src/parser/parser.d.ts.map +1 -1
  99. package/dist/src/parser/parser.js +1387 -469
  100. package/dist/src/parser/parser.js.map +1 -1
  101. package/dist/src/parser/visitor.d.ts.map +1 -1
  102. package/dist/src/parser/visitor.js +12 -8
  103. package/dist/src/parser/visitor.js.map +1 -1
  104. package/dist/src/planner/analysis/assertion-classifier.d.ts.map +1 -1
  105. package/dist/src/planner/analysis/assertion-classifier.js +4 -0
  106. package/dist/src/planner/analysis/assertion-classifier.js.map +1 -1
  107. package/dist/src/planner/analysis/assertion-hoist-cache.d.ts.map +1 -1
  108. package/dist/src/planner/analysis/assertion-hoist-cache.js +8 -4
  109. package/dist/src/planner/analysis/assertion-hoist-cache.js.map +1 -1
  110. package/dist/src/planner/analysis/authored-inverse.d.ts +22 -0
  111. package/dist/src/planner/analysis/authored-inverse.d.ts.map +1 -0
  112. package/dist/src/planner/analysis/authored-inverse.js +267 -0
  113. package/dist/src/planner/analysis/authored-inverse.js.map +1 -0
  114. package/dist/src/planner/analysis/change-scope.d.ts +34 -4
  115. package/dist/src/planner/analysis/change-scope.d.ts.map +1 -1
  116. package/dist/src/planner/analysis/change-scope.js +108 -7
  117. package/dist/src/planner/analysis/change-scope.js.map +1 -1
  118. package/dist/src/planner/analysis/check-extraction.d.ts +36 -2
  119. package/dist/src/planner/analysis/check-extraction.d.ts.map +1 -1
  120. package/dist/src/planner/analysis/check-extraction.js +174 -46
  121. package/dist/src/planner/analysis/check-extraction.js.map +1 -1
  122. package/dist/src/planner/analysis/coarsened-key.d.ts +109 -0
  123. package/dist/src/planner/analysis/coarsened-key.d.ts.map +1 -0
  124. package/dist/src/planner/analysis/coarsened-key.js +228 -0
  125. package/dist/src/planner/analysis/coarsened-key.js.map +1 -0
  126. package/dist/src/planner/analysis/comparison-collation.d.ts +216 -0
  127. package/dist/src/planner/analysis/comparison-collation.d.ts.map +1 -0
  128. package/dist/src/planner/analysis/comparison-collation.js +341 -0
  129. package/dist/src/planner/analysis/comparison-collation.js.map +1 -0
  130. package/dist/src/planner/analysis/constraint-extractor.d.ts +3 -1
  131. package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
  132. package/dist/src/planner/analysis/constraint-extractor.js +192 -9
  133. package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
  134. package/dist/src/planner/analysis/coverage-prover.d.ts +321 -0
  135. package/dist/src/planner/analysis/coverage-prover.d.ts.map +1 -0
  136. package/dist/src/planner/analysis/coverage-prover.js +1038 -0
  137. package/dist/src/planner/analysis/coverage-prover.js.map +1 -0
  138. package/dist/src/planner/analysis/key-filter.d.ts +22 -0
  139. package/dist/src/planner/analysis/key-filter.d.ts.map +1 -0
  140. package/dist/src/planner/analysis/key-filter.js +105 -0
  141. package/dist/src/planner/analysis/key-filter.js.map +1 -0
  142. package/dist/src/planner/analysis/partial-unique-extraction.d.ts +36 -1
  143. package/dist/src/planner/analysis/partial-unique-extraction.d.ts.map +1 -1
  144. package/dist/src/planner/analysis/partial-unique-extraction.js +148 -22
  145. package/dist/src/planner/analysis/partial-unique-extraction.js.map +1 -1
  146. package/dist/src/planner/analysis/predicate-normalizer.d.ts.map +1 -1
  147. package/dist/src/planner/analysis/predicate-normalizer.js +30 -1
  148. package/dist/src/planner/analysis/predicate-normalizer.js.map +1 -1
  149. package/dist/src/planner/analysis/predicate-shape.d.ts +36 -1
  150. package/dist/src/planner/analysis/predicate-shape.d.ts.map +1 -1
  151. package/dist/src/planner/analysis/predicate-shape.js +51 -13
  152. package/dist/src/planner/analysis/predicate-shape.js.map +1 -1
  153. package/dist/src/planner/analysis/query-rewrite-matcher.d.ts +314 -0
  154. package/dist/src/planner/analysis/query-rewrite-matcher.d.ts.map +1 -0
  155. package/dist/src/planner/analysis/query-rewrite-matcher.js +1081 -0
  156. package/dist/src/planner/analysis/query-rewrite-matcher.js.map +1 -0
  157. package/dist/src/planner/analysis/scalar-invertibility.d.ts +92 -0
  158. package/dist/src/planner/analysis/scalar-invertibility.d.ts.map +1 -0
  159. package/dist/src/planner/analysis/scalar-invertibility.js +129 -0
  160. package/dist/src/planner/analysis/scalar-invertibility.js.map +1 -0
  161. package/dist/src/planner/analysis/update-lineage.d.ts +196 -0
  162. package/dist/src/planner/analysis/update-lineage.d.ts.map +1 -0
  163. package/dist/src/planner/analysis/update-lineage.js +322 -0
  164. package/dist/src/planner/analysis/update-lineage.js.map +1 -0
  165. package/dist/src/planner/analysis/view-complement.d.ts +42 -0
  166. package/dist/src/planner/analysis/view-complement.d.ts.map +1 -0
  167. package/dist/src/planner/analysis/view-complement.js +54 -0
  168. package/dist/src/planner/analysis/view-complement.js.map +1 -0
  169. package/dist/src/planner/building/alter-table.d.ts +1 -1
  170. package/dist/src/planner/building/alter-table.d.ts.map +1 -1
  171. package/dist/src/planner/building/alter-table.js +211 -2
  172. package/dist/src/planner/building/alter-table.js.map +1 -1
  173. package/dist/src/planner/building/block.d.ts.map +1 -1
  174. package/dist/src/planner/building/block.js +18 -1
  175. package/dist/src/planner/building/block.js.map +1 -1
  176. package/dist/src/planner/building/constraint-builder.d.ts +33 -5
  177. package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
  178. package/dist/src/planner/building/constraint-builder.js +63 -28
  179. package/dist/src/planner/building/constraint-builder.js.map +1 -1
  180. package/dist/src/planner/building/create-view.d.ts +9 -0
  181. package/dist/src/planner/building/create-view.d.ts.map +1 -1
  182. package/dist/src/planner/building/create-view.js +41 -12
  183. package/dist/src/planner/building/create-view.js.map +1 -1
  184. package/dist/src/planner/building/ddl.d.ts.map +1 -1
  185. package/dist/src/planner/building/ddl.js +94 -0
  186. package/dist/src/planner/building/ddl.js.map +1 -1
  187. package/dist/src/planner/building/declare-schema.d.ts +1 -0
  188. package/dist/src/planner/building/declare-schema.d.ts.map +1 -1
  189. package/dist/src/planner/building/declare-schema.js +4 -1
  190. package/dist/src/planner/building/declare-schema.js.map +1 -1
  191. package/dist/src/planner/building/default-scope.d.ts +26 -0
  192. package/dist/src/planner/building/default-scope.d.ts.map +1 -0
  193. package/dist/src/planner/building/default-scope.js +41 -0
  194. package/dist/src/planner/building/default-scope.js.map +1 -0
  195. package/dist/src/planner/building/delete.d.ts +19 -1
  196. package/dist/src/planner/building/delete.d.ts.map +1 -1
  197. package/dist/src/planner/building/delete.js +109 -30
  198. package/dist/src/planner/building/delete.js.map +1 -1
  199. package/dist/src/planner/building/dml-target.d.ts +118 -0
  200. package/dist/src/planner/building/dml-target.d.ts.map +1 -0
  201. package/dist/src/planner/building/dml-target.js +282 -0
  202. package/dist/src/planner/building/dml-target.js.map +1 -0
  203. package/dist/src/planner/building/drop-index.d.ts.map +1 -1
  204. package/dist/src/planner/building/drop-index.js +4 -1
  205. package/dist/src/planner/building/drop-index.js.map +1 -1
  206. package/dist/src/planner/building/drop-view.d.ts.map +1 -1
  207. package/dist/src/planner/building/drop-view.js +4 -2
  208. package/dist/src/planner/building/drop-view.js.map +1 -1
  209. package/dist/src/planner/building/expression.d.ts.map +1 -1
  210. package/dist/src/planner/building/expression.js +60 -21
  211. package/dist/src/planner/building/expression.js.map +1 -1
  212. package/dist/src/planner/building/foreign-key-builder.d.ts +30 -0
  213. package/dist/src/planner/building/foreign-key-builder.d.ts.map +1 -1
  214. package/dist/src/planner/building/foreign-key-builder.js +160 -129
  215. package/dist/src/planner/building/foreign-key-builder.js.map +1 -1
  216. package/dist/src/planner/building/insert.d.ts +45 -2
  217. package/dist/src/planner/building/insert.d.ts.map +1 -1
  218. package/dist/src/planner/building/insert.js +257 -88
  219. package/dist/src/planner/building/insert.js.map +1 -1
  220. package/dist/src/planner/building/lens-auxiliary-access.d.ts +22 -0
  221. package/dist/src/planner/building/lens-auxiliary-access.d.ts.map +1 -0
  222. package/dist/src/planner/building/lens-auxiliary-access.js +132 -0
  223. package/dist/src/planner/building/lens-auxiliary-access.js.map +1 -0
  224. package/dist/src/planner/building/materialized-view.d.ts +16 -0
  225. package/dist/src/planner/building/materialized-view.d.ts.map +1 -0
  226. package/dist/src/planner/building/materialized-view.js +57 -0
  227. package/dist/src/planner/building/materialized-view.js.map +1 -0
  228. package/dist/src/planner/building/returning-star.d.ts +32 -0
  229. package/dist/src/planner/building/returning-star.d.ts.map +1 -0
  230. package/dist/src/planner/building/returning-star.js +45 -0
  231. package/dist/src/planner/building/returning-star.js.map +1 -0
  232. package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
  233. package/dist/src/planner/building/select-aggregates.js +47 -0
  234. package/dist/src/planner/building/select-aggregates.js.map +1 -1
  235. package/dist/src/planner/building/select-compound.d.ts.map +1 -1
  236. package/dist/src/planner/building/select-compound.js +84 -11
  237. package/dist/src/planner/building/select-compound.js.map +1 -1
  238. package/dist/src/planner/building/select-context.d.ts +10 -2
  239. package/dist/src/planner/building/select-context.d.ts.map +1 -1
  240. package/dist/src/planner/building/select-context.js +7 -1
  241. package/dist/src/planner/building/select-context.js.map +1 -1
  242. package/dist/src/planner/building/select-modifiers.js +6 -0
  243. package/dist/src/planner/building/select-modifiers.js.map +1 -1
  244. package/dist/src/planner/building/select-ordinal.d.ts +18 -0
  245. package/dist/src/planner/building/select-ordinal.d.ts.map +1 -1
  246. package/dist/src/planner/building/select-ordinal.js +30 -0
  247. package/dist/src/planner/building/select-ordinal.js.map +1 -1
  248. package/dist/src/planner/building/select-projections.d.ts +8 -2
  249. package/dist/src/planner/building/select-projections.d.ts.map +1 -1
  250. package/dist/src/planner/building/select-projections.js +26 -4
  251. package/dist/src/planner/building/select-projections.js.map +1 -1
  252. package/dist/src/planner/building/select-window.d.ts.map +1 -1
  253. package/dist/src/planner/building/select-window.js +8 -5
  254. package/dist/src/planner/building/select-window.js.map +1 -1
  255. package/dist/src/planner/building/select.d.ts.map +1 -1
  256. package/dist/src/planner/building/select.js +164 -59
  257. package/dist/src/planner/building/select.js.map +1 -1
  258. package/dist/src/planner/building/set-object-tags.d.ts +7 -0
  259. package/dist/src/planner/building/set-object-tags.d.ts.map +1 -0
  260. package/dist/src/planner/building/set-object-tags.js +38 -0
  261. package/dist/src/planner/building/set-object-tags.js.map +1 -0
  262. package/dist/src/planner/building/tag-diagnostics.d.ts +27 -0
  263. package/dist/src/planner/building/tag-diagnostics.d.ts.map +1 -0
  264. package/dist/src/planner/building/tag-diagnostics.js +37 -0
  265. package/dist/src/planner/building/tag-diagnostics.js.map +1 -0
  266. package/dist/src/planner/building/update.d.ts +18 -1
  267. package/dist/src/planner/building/update.d.ts.map +1 -1
  268. package/dist/src/planner/building/update.js +134 -58
  269. package/dist/src/planner/building/update.js.map +1 -1
  270. package/dist/src/planner/building/view-mutation-builder.d.ts +15 -0
  271. package/dist/src/planner/building/view-mutation-builder.d.ts.map +1 -0
  272. package/dist/src/planner/building/view-mutation-builder.js +1158 -0
  273. package/dist/src/planner/building/view-mutation-builder.js.map +1 -0
  274. package/dist/src/planner/building/with.d.ts +11 -0
  275. package/dist/src/planner/building/with.d.ts.map +1 -1
  276. package/dist/src/planner/building/with.js +48 -10
  277. package/dist/src/planner/building/with.js.map +1 -1
  278. package/dist/src/planner/cost/index.d.ts +83 -0
  279. package/dist/src/planner/cost/index.d.ts.map +1 -1
  280. package/dist/src/planner/cost/index.js +114 -0
  281. package/dist/src/planner/cost/index.js.map +1 -1
  282. package/dist/src/planner/framework/characteristics.d.ts +38 -4
  283. package/dist/src/planner/framework/characteristics.d.ts.map +1 -1
  284. package/dist/src/planner/framework/characteristics.js +50 -6
  285. package/dist/src/planner/framework/characteristics.js.map +1 -1
  286. package/dist/src/planner/framework/pass.d.ts.map +1 -1
  287. package/dist/src/planner/framework/pass.js +2 -1
  288. package/dist/src/planner/framework/pass.js.map +1 -1
  289. package/dist/src/planner/framework/registry.d.ts +39 -1
  290. package/dist/src/planner/framework/registry.d.ts.map +1 -1
  291. package/dist/src/planner/framework/registry.js +18 -2
  292. package/dist/src/planner/framework/registry.js.map +1 -1
  293. package/dist/src/planner/mutation/backward-body.d.ts +131 -0
  294. package/dist/src/planner/mutation/backward-body.d.ts.map +1 -0
  295. package/dist/src/planner/mutation/backward-body.js +135 -0
  296. package/dist/src/planner/mutation/backward-body.js.map +1 -0
  297. package/dist/src/planner/mutation/cte-flatten.d.ts +17 -0
  298. package/dist/src/planner/mutation/cte-flatten.d.ts.map +1 -0
  299. package/dist/src/planner/mutation/cte-flatten.js +364 -0
  300. package/dist/src/planner/mutation/cte-flatten.js.map +1 -0
  301. package/dist/src/planner/mutation/decomposition.d.ts +273 -0
  302. package/dist/src/planner/mutation/decomposition.d.ts.map +1 -0
  303. package/dist/src/planner/mutation/decomposition.js +1719 -0
  304. package/dist/src/planner/mutation/decomposition.js.map +1 -0
  305. package/dist/src/planner/mutation/lens-enforcement.d.ts +165 -0
  306. package/dist/src/planner/mutation/lens-enforcement.d.ts.map +1 -0
  307. package/dist/src/planner/mutation/lens-enforcement.js +745 -0
  308. package/dist/src/planner/mutation/lens-enforcement.js.map +1 -0
  309. package/dist/src/planner/mutation/multi-source.d.ts +568 -0
  310. package/dist/src/planner/mutation/multi-source.d.ts.map +1 -0
  311. package/dist/src/planner/mutation/multi-source.js +2915 -0
  312. package/dist/src/planner/mutation/multi-source.js.map +1 -0
  313. package/dist/src/planner/mutation/mutation-diagnostic.d.ts +37 -0
  314. package/dist/src/planner/mutation/mutation-diagnostic.d.ts.map +1 -0
  315. package/dist/src/planner/mutation/mutation-diagnostic.js +24 -0
  316. package/dist/src/planner/mutation/mutation-diagnostic.js.map +1 -0
  317. package/dist/src/planner/mutation/mutation-tags.d.ts +33 -0
  318. package/dist/src/planner/mutation/mutation-tags.d.ts.map +1 -0
  319. package/dist/src/planner/mutation/mutation-tags.js +31 -0
  320. package/dist/src/planner/mutation/mutation-tags.js.map +1 -0
  321. package/dist/src/planner/mutation/propagate.d.ts +97 -0
  322. package/dist/src/planner/mutation/propagate.d.ts.map +1 -0
  323. package/dist/src/planner/mutation/propagate.js +220 -0
  324. package/dist/src/planner/mutation/propagate.js.map +1 -0
  325. package/dist/src/planner/mutation/scope-transform.d.ts +181 -0
  326. package/dist/src/planner/mutation/scope-transform.d.ts.map +1 -0
  327. package/dist/src/planner/mutation/scope-transform.js +574 -0
  328. package/dist/src/planner/mutation/scope-transform.js.map +1 -0
  329. package/dist/src/planner/mutation/set-op.d.ts +242 -0
  330. package/dist/src/planner/mutation/set-op.d.ts.map +1 -0
  331. package/dist/src/planner/mutation/set-op.js +1687 -0
  332. package/dist/src/planner/mutation/set-op.js.map +1 -0
  333. package/dist/src/planner/mutation/single-source.d.ts +261 -0
  334. package/dist/src/planner/mutation/single-source.d.ts.map +1 -0
  335. package/dist/src/planner/mutation/single-source.js +1096 -0
  336. package/dist/src/planner/mutation/single-source.js.map +1 -0
  337. package/dist/src/planner/nodes/aggregate-node.js +3 -3
  338. package/dist/src/planner/nodes/aggregate-node.js.map +1 -1
  339. package/dist/src/planner/nodes/alias-node.d.ts.map +1 -1
  340. package/dist/src/planner/nodes/alias-node.js +5 -1
  341. package/dist/src/planner/nodes/alias-node.js.map +1 -1
  342. package/dist/src/planner/nodes/alter-table-node.d.ts +124 -1
  343. package/dist/src/planner/nodes/alter-table-node.d.ts.map +1 -1
  344. package/dist/src/planner/nodes/alter-table-node.js +27 -0
  345. package/dist/src/planner/nodes/alter-table-node.js.map +1 -1
  346. package/dist/src/planner/nodes/analyze-node.d.ts +2 -1
  347. package/dist/src/planner/nodes/analyze-node.d.ts.map +1 -1
  348. package/dist/src/planner/nodes/analyze-node.js +18 -1
  349. package/dist/src/planner/nodes/analyze-node.js.map +1 -1
  350. package/dist/src/planner/nodes/asserted-keys-node.d.ts +43 -0
  351. package/dist/src/planner/nodes/asserted-keys-node.d.ts.map +1 -0
  352. package/dist/src/planner/nodes/asserted-keys-node.js +99 -0
  353. package/dist/src/planner/nodes/asserted-keys-node.js.map +1 -0
  354. package/dist/src/planner/nodes/async-gather-node.d.ts.map +1 -1
  355. package/dist/src/planner/nodes/async-gather-node.js +33 -8
  356. package/dist/src/planner/nodes/async-gather-node.js.map +1 -1
  357. package/dist/src/planner/nodes/bloom-join-node.d.ts.map +1 -1
  358. package/dist/src/planner/nodes/bloom-join-node.js +2 -1
  359. package/dist/src/planner/nodes/bloom-join-node.js.map +1 -1
  360. package/dist/src/planner/nodes/create-view-node.d.ts +7 -2
  361. package/dist/src/planner/nodes/create-view-node.d.ts.map +1 -1
  362. package/dist/src/planner/nodes/create-view-node.js +4 -1
  363. package/dist/src/planner/nodes/create-view-node.js.map +1 -1
  364. package/dist/src/planner/nodes/declarative-schema.d.ts +13 -1
  365. package/dist/src/planner/nodes/declarative-schema.d.ts.map +1 -1
  366. package/dist/src/planner/nodes/declarative-schema.js +32 -0
  367. package/dist/src/planner/nodes/declarative-schema.js.map +1 -1
  368. package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
  369. package/dist/src/planner/nodes/distinct-node.js +2 -0
  370. package/dist/src/planner/nodes/distinct-node.js.map +1 -1
  371. package/dist/src/planner/nodes/dml-executor-node.d.ts +29 -1
  372. package/dist/src/planner/nodes/dml-executor-node.d.ts.map +1 -1
  373. package/dist/src/planner/nodes/dml-executor-node.js +27 -3
  374. package/dist/src/planner/nodes/dml-executor-node.js.map +1 -1
  375. package/dist/src/planner/nodes/eager-prefetch-node.d.ts.map +1 -1
  376. package/dist/src/planner/nodes/eager-prefetch-node.js +2 -0
  377. package/dist/src/planner/nodes/eager-prefetch-node.js.map +1 -1
  378. package/dist/src/planner/nodes/envelope-scan-node.d.ts +42 -0
  379. package/dist/src/planner/nodes/envelope-scan-node.d.ts.map +1 -0
  380. package/dist/src/planner/nodes/envelope-scan-node.js +62 -0
  381. package/dist/src/planner/nodes/envelope-scan-node.js.map +1 -0
  382. package/dist/src/planner/nodes/fanout-lookup-join-node.d.ts.map +1 -1
  383. package/dist/src/planner/nodes/fanout-lookup-join-node.js +11 -1
  384. package/dist/src/planner/nodes/fanout-lookup-join-node.js.map +1 -1
  385. package/dist/src/planner/nodes/filter.d.ts.map +1 -1
  386. package/dist/src/planner/nodes/filter.js +63 -13
  387. package/dist/src/planner/nodes/filter.js.map +1 -1
  388. package/dist/src/planner/nodes/join-node.d.ts +41 -1
  389. package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
  390. package/dist/src/planner/nodes/join-node.js +78 -8
  391. package/dist/src/planner/nodes/join-node.js.map +1 -1
  392. package/dist/src/planner/nodes/join-utils.d.ts +33 -6
  393. package/dist/src/planner/nodes/join-utils.d.ts.map +1 -1
  394. package/dist/src/planner/nodes/join-utils.js +124 -9
  395. package/dist/src/planner/nodes/join-utils.js.map +1 -1
  396. package/dist/src/planner/nodes/lens-auxiliary-access-node.d.ts +104 -0
  397. package/dist/src/planner/nodes/lens-auxiliary-access-node.d.ts.map +1 -0
  398. package/dist/src/planner/nodes/lens-auxiliary-access-node.js +91 -0
  399. package/dist/src/planner/nodes/lens-auxiliary-access-node.js.map +1 -0
  400. package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
  401. package/dist/src/planner/nodes/limit-offset.js +4 -5
  402. package/dist/src/planner/nodes/limit-offset.js.map +1 -1
  403. package/dist/src/planner/nodes/materialized-view-nodes.d.ts +69 -0
  404. package/dist/src/planner/nodes/materialized-view-nodes.d.ts.map +1 -0
  405. package/dist/src/planner/nodes/materialized-view-nodes.js +111 -0
  406. package/dist/src/planner/nodes/materialized-view-nodes.js.map +1 -0
  407. package/dist/src/planner/nodes/merge-join-node.d.ts.map +1 -1
  408. package/dist/src/planner/nodes/merge-join-node.js +2 -1
  409. package/dist/src/planner/nodes/merge-join-node.js.map +1 -1
  410. package/dist/src/planner/nodes/ordinal-slice-node.d.ts.map +1 -1
  411. package/dist/src/planner/nodes/ordinal-slice-node.js +2 -0
  412. package/dist/src/planner/nodes/ordinal-slice-node.js.map +1 -1
  413. package/dist/src/planner/nodes/plan-node-type.d.ts +9 -0
  414. package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
  415. package/dist/src/planner/nodes/plan-node-type.js +9 -0
  416. package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
  417. package/dist/src/planner/nodes/plan-node.d.ts +265 -5
  418. package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
  419. package/dist/src/planner/nodes/plan-node.js.map +1 -1
  420. package/dist/src/planner/nodes/pragma.d.ts +2 -1
  421. package/dist/src/planner/nodes/pragma.d.ts.map +1 -1
  422. package/dist/src/planner/nodes/pragma.js +12 -0
  423. package/dist/src/planner/nodes/pragma.js.map +1 -1
  424. package/dist/src/planner/nodes/project-node.d.ts +14 -1
  425. package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
  426. package/dist/src/planner/nodes/project-node.js +85 -11
  427. package/dist/src/planner/nodes/project-node.js.map +1 -1
  428. package/dist/src/planner/nodes/reference.d.ts.map +1 -1
  429. package/dist/src/planner/nodes/reference.js +62 -27
  430. package/dist/src/planner/nodes/reference.js.map +1 -1
  431. package/dist/src/planner/nodes/retrieve-node.d.ts.map +1 -1
  432. package/dist/src/planner/nodes/retrieve-node.js +7 -0
  433. package/dist/src/planner/nodes/retrieve-node.js.map +1 -1
  434. package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
  435. package/dist/src/planner/nodes/returning-node.js +10 -3
  436. package/dist/src/planner/nodes/returning-node.js.map +1 -1
  437. package/dist/src/planner/nodes/scalar.d.ts +20 -0
  438. package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
  439. package/dist/src/planner/nodes/scalar.js +71 -14
  440. package/dist/src/planner/nodes/scalar.js.map +1 -1
  441. package/dist/src/planner/nodes/set-object-tags-node.d.ts +39 -0
  442. package/dist/src/planner/nodes/set-object-tags-node.d.ts.map +1 -0
  443. package/dist/src/planner/nodes/set-object-tags-node.js +41 -0
  444. package/dist/src/planner/nodes/set-object-tags-node.js.map +1 -0
  445. package/dist/src/planner/nodes/set-operation-node.d.ts +123 -1
  446. package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
  447. package/dist/src/planner/nodes/set-operation-node.js +291 -18
  448. package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
  449. package/dist/src/planner/nodes/single-row.d.ts.map +1 -1
  450. package/dist/src/planner/nodes/single-row.js +3 -0
  451. package/dist/src/planner/nodes/single-row.js.map +1 -1
  452. package/dist/src/planner/nodes/sort.d.ts.map +1 -1
  453. package/dist/src/planner/nodes/sort.js +7 -6
  454. package/dist/src/planner/nodes/sort.js.map +1 -1
  455. package/dist/src/planner/nodes/subquery.d.ts +2 -0
  456. package/dist/src/planner/nodes/subquery.d.ts.map +1 -1
  457. package/dist/src/planner/nodes/subquery.js +18 -2
  458. package/dist/src/planner/nodes/subquery.js.map +1 -1
  459. package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
  460. package/dist/src/planner/nodes/table-access-nodes.js +23 -3
  461. package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
  462. package/dist/src/planner/nodes/table-function-call.js +6 -0
  463. package/dist/src/planner/nodes/table-function-call.js.map +1 -1
  464. package/dist/src/planner/nodes/values-node.d.ts +1 -0
  465. package/dist/src/planner/nodes/values-node.d.ts.map +1 -1
  466. package/dist/src/planner/nodes/values-node.js +16 -6
  467. package/dist/src/planner/nodes/values-node.js.map +1 -1
  468. package/dist/src/planner/nodes/view-mutation-node.d.ts +259 -0
  469. package/dist/src/planner/nodes/view-mutation-node.d.ts.map +1 -0
  470. package/dist/src/planner/nodes/view-mutation-node.js +273 -0
  471. package/dist/src/planner/nodes/view-mutation-node.js.map +1 -0
  472. package/dist/src/planner/nodes/window-function.d.ts +17 -1
  473. package/dist/src/planner/nodes/window-function.d.ts.map +1 -1
  474. package/dist/src/planner/nodes/window-function.js +15 -1
  475. package/dist/src/planner/nodes/window-function.js.map +1 -1
  476. package/dist/src/planner/nodes/window-node.js +2 -2
  477. package/dist/src/planner/nodes/window-node.js.map +1 -1
  478. package/dist/src/planner/optimizer.d.ts.map +1 -1
  479. package/dist/src/planner/optimizer.js +372 -39
  480. package/dist/src/planner/optimizer.js.map +1 -1
  481. package/dist/src/planner/planning-context.d.ts +1 -1
  482. package/dist/src/planner/planning-context.d.ts.map +1 -1
  483. package/dist/src/planner/rules/access/lens-access-form-matcher.d.ts +70 -0
  484. package/dist/src/planner/rules/access/lens-access-form-matcher.d.ts.map +1 -0
  485. package/dist/src/planner/rules/access/lens-access-form-matcher.js +156 -0
  486. package/dist/src/planner/rules/access/lens-access-form-matcher.js.map +1 -0
  487. package/dist/src/planner/rules/access/rule-lens-auxiliary-access.d.ts +31 -0
  488. package/dist/src/planner/rules/access/rule-lens-auxiliary-access.d.ts.map +1 -0
  489. package/dist/src/planner/rules/access/rule-lens-auxiliary-access.js +176 -0
  490. package/dist/src/planner/rules/access/rule-lens-auxiliary-access.js.map +1 -0
  491. package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
  492. package/dist/src/planner/rules/access/rule-select-access-path.js +435 -37
  493. package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
  494. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts.map +1 -1
  495. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js +9 -0
  496. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js.map +1 -1
  497. package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.d.ts +39 -0
  498. package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.d.ts.map +1 -0
  499. package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.js +616 -0
  500. package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.js.map +1 -0
  501. package/dist/src/planner/rules/cache/rule-scalar-cse.d.ts.map +1 -1
  502. package/dist/src/planner/rules/cache/rule-scalar-cse.js +8 -1
  503. package/dist/src/planner/rules/cache/rule-scalar-cse.js.map +1 -1
  504. package/dist/src/planner/rules/join/equi-pair-extractor.d.ts +36 -0
  505. package/dist/src/planner/rules/join/equi-pair-extractor.d.ts.map +1 -1
  506. package/dist/src/planner/rules/join/equi-pair-extractor.js +38 -1
  507. package/dist/src/planner/rules/join/equi-pair-extractor.js.map +1 -1
  508. package/dist/src/planner/rules/join/rule-fanout-batched-outer.d.ts.map +1 -1
  509. package/dist/src/planner/rules/join/rule-fanout-batched-outer.js +10 -0
  510. package/dist/src/planner/rules/join/rule-fanout-batched-outer.js.map +1 -1
  511. package/dist/src/planner/rules/join/rule-fanout-lookup-join.d.ts.map +1 -1
  512. package/dist/src/planner/rules/join/rule-fanout-lookup-join.js +19 -1
  513. package/dist/src/planner/rules/join/rule-fanout-lookup-join.js.map +1 -1
  514. package/dist/src/planner/rules/join/rule-inner-join-existence-recovery.d.ts +130 -0
  515. package/dist/src/planner/rules/join/rule-inner-join-existence-recovery.d.ts.map +1 -0
  516. package/dist/src/planner/rules/join/rule-inner-join-existence-recovery.js +206 -0
  517. package/dist/src/planner/rules/join/rule-inner-join-existence-recovery.js.map +1 -0
  518. package/dist/src/planner/rules/join/rule-join-elimination.d.ts +67 -14
  519. package/dist/src/planner/rules/join/rule-join-elimination.d.ts.map +1 -1
  520. package/dist/src/planner/rules/join/rule-join-elimination.js +81 -25
  521. package/dist/src/planner/rules/join/rule-join-elimination.js.map +1 -1
  522. package/dist/src/planner/rules/join/rule-join-existence-pruning.d.ts +84 -0
  523. package/dist/src/planner/rules/join/rule-join-existence-pruning.d.ts.map +1 -0
  524. package/dist/src/planner/rules/join/rule-join-existence-pruning.js +138 -0
  525. package/dist/src/planner/rules/join/rule-join-existence-pruning.js.map +1 -0
  526. package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts.map +1 -1
  527. package/dist/src/planner/rules/join/rule-join-greedy-commute.js +9 -1
  528. package/dist/src/planner/rules/join/rule-join-greedy-commute.js.map +1 -1
  529. package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts.map +1 -1
  530. package/dist/src/planner/rules/join/rule-join-physical-selection.js +12 -1
  531. package/dist/src/planner/rules/join/rule-join-physical-selection.js.map +1 -1
  532. package/dist/src/planner/rules/join/rule-lateral-top1-asof.d.ts.map +1 -1
  533. package/dist/src/planner/rules/join/rule-lateral-top1-asof.js +4 -0
  534. package/dist/src/planner/rules/join/rule-lateral-top1-asof.js.map +1 -1
  535. package/dist/src/planner/rules/join/rule-monotonic-merge-join.d.ts.map +1 -1
  536. package/dist/src/planner/rules/join/rule-monotonic-merge-join.js +4 -0
  537. package/dist/src/planner/rules/join/rule-monotonic-merge-join.js.map +1 -1
  538. package/dist/src/planner/rules/join/rule-quickpick-enumeration.d.ts.map +1 -1
  539. package/dist/src/planner/rules/join/rule-quickpick-enumeration.js +10 -0
  540. package/dist/src/planner/rules/join/rule-quickpick-enumeration.js.map +1 -1
  541. package/dist/src/planner/rules/join/rule-semijoin-existence-recovery.d.ts +286 -0
  542. package/dist/src/planner/rules/join/rule-semijoin-existence-recovery.d.ts.map +1 -0
  543. package/dist/src/planner/rules/join/rule-semijoin-existence-recovery.js +548 -0
  544. package/dist/src/planner/rules/join/rule-semijoin-existence-recovery.js.map +1 -0
  545. package/dist/src/planner/rules/parallel/rule-async-gather-union-all.d.ts.map +1 -1
  546. package/dist/src/planner/rules/parallel/rule-async-gather-union-all.js +9 -1
  547. package/dist/src/planner/rules/parallel/rule-async-gather-union-all.js.map +1 -1
  548. package/dist/src/planner/rules/parallel/rule-async-gather-zip-by-key.d.ts.map +1 -1
  549. package/dist/src/planner/rules/parallel/rule-async-gather-zip-by-key.js +7 -0
  550. package/dist/src/planner/rules/parallel/rule-async-gather-zip-by-key.js.map +1 -1
  551. package/dist/src/planner/rules/parallel/rule-eager-prefetch-probe.d.ts.map +1 -1
  552. package/dist/src/planner/rules/parallel/rule-eager-prefetch-probe.js +10 -1
  553. package/dist/src/planner/rules/parallel/rule-eager-prefetch-probe.js.map +1 -1
  554. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.d.ts.map +1 -1
  555. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js +9 -0
  556. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js.map +1 -1
  557. package/dist/src/planner/rules/predicate/rule-empty-relation-folding.d.ts.map +1 -1
  558. package/dist/src/planner/rules/predicate/rule-empty-relation-folding.js +18 -0
  559. package/dist/src/planner/rules/predicate/rule-empty-relation-folding.js.map +1 -1
  560. package/dist/src/planner/rules/predicate/rule-filter-contradiction.d.ts.map +1 -1
  561. package/dist/src/planner/rules/predicate/rule-filter-contradiction.js +7 -0
  562. package/dist/src/planner/rules/predicate/rule-filter-contradiction.js.map +1 -1
  563. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.d.ts.map +1 -1
  564. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js +9 -0
  565. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js.map +1 -1
  566. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js +13 -3
  567. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js.map +1 -1
  568. package/dist/src/planner/rules/retrieve/rule-projection-pruning.d.ts.map +1 -1
  569. package/dist/src/planner/rules/retrieve/rule-projection-pruning.js +14 -0
  570. package/dist/src/planner/rules/retrieve/rule-projection-pruning.js.map +1 -1
  571. package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.d.ts +1 -1
  572. package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.js +4 -4
  573. package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.js.map +1 -1
  574. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.d.ts.map +1 -1
  575. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js +8 -0
  576. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js.map +1 -1
  577. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.d.ts.map +1 -1
  578. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js +7 -0
  579. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js.map +1 -1
  580. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts.map +1 -1
  581. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js +12 -0
  582. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js.map +1 -1
  583. package/dist/src/planner/type-utils.d.ts +14 -0
  584. package/dist/src/planner/type-utils.d.ts.map +1 -1
  585. package/dist/src/planner/type-utils.js +66 -21
  586. package/dist/src/planner/type-utils.js.map +1 -1
  587. package/dist/src/planner/util/fd-utils.d.ts +177 -43
  588. package/dist/src/planner/util/fd-utils.d.ts.map +1 -1
  589. package/dist/src/planner/util/fd-utils.js +396 -101
  590. package/dist/src/planner/util/fd-utils.js.map +1 -1
  591. package/dist/src/planner/util/ind-utils.d.ts +27 -1
  592. package/dist/src/planner/util/ind-utils.d.ts.map +1 -1
  593. package/dist/src/planner/util/ind-utils.js +80 -6
  594. package/dist/src/planner/util/ind-utils.js.map +1 -1
  595. package/dist/src/planner/util/key-utils.d.ts.map +1 -1
  596. package/dist/src/planner/util/key-utils.js +81 -12
  597. package/dist/src/planner/util/key-utils.js.map +1 -1
  598. package/dist/src/planner/util/set-op-wrapper.d.ts +37 -0
  599. package/dist/src/planner/util/set-op-wrapper.d.ts.map +1 -0
  600. package/dist/src/planner/util/set-op-wrapper.js +82 -0
  601. package/dist/src/planner/util/set-op-wrapper.js.map +1 -0
  602. package/dist/src/planner/validation/plan-validator.d.ts.map +1 -1
  603. package/dist/src/planner/validation/plan-validator.js +1 -0
  604. package/dist/src/planner/validation/plan-validator.js.map +1 -1
  605. package/dist/src/runtime/context-helpers.d.ts +13 -1
  606. package/dist/src/runtime/context-helpers.d.ts.map +1 -1
  607. package/dist/src/runtime/context-helpers.js +7 -1
  608. package/dist/src/runtime/context-helpers.js.map +1 -1
  609. package/dist/src/runtime/delta-executor.d.ts +30 -1
  610. package/dist/src/runtime/delta-executor.d.ts.map +1 -1
  611. package/dist/src/runtime/delta-executor.js +29 -4
  612. package/dist/src/runtime/delta-executor.js.map +1 -1
  613. package/dist/src/runtime/emit/add-constraint.d.ts.map +1 -1
  614. package/dist/src/runtime/emit/add-constraint.js +38 -5
  615. package/dist/src/runtime/emit/add-constraint.js.map +1 -1
  616. package/dist/src/runtime/emit/aggregate.d.ts.map +1 -1
  617. package/dist/src/runtime/emit/aggregate.js +10 -8
  618. package/dist/src/runtime/emit/aggregate.js.map +1 -1
  619. package/dist/src/runtime/emit/alter-table.d.ts +1 -1
  620. package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
  621. package/dist/src/runtime/emit/alter-table.js +664 -108
  622. package/dist/src/runtime/emit/alter-table.js.map +1 -1
  623. package/dist/src/runtime/emit/analyze.d.ts.map +1 -1
  624. package/dist/src/runtime/emit/analyze.js +2 -1
  625. package/dist/src/runtime/emit/analyze.js.map +1 -1
  626. package/dist/src/runtime/emit/asof-scan.d.ts.map +1 -1
  627. package/dist/src/runtime/emit/asof-scan.js +18 -5
  628. package/dist/src/runtime/emit/asof-scan.js.map +1 -1
  629. package/dist/src/runtime/emit/asserted-keys.d.ts +13 -0
  630. package/dist/src/runtime/emit/asserted-keys.d.ts.map +1 -0
  631. package/dist/src/runtime/emit/asserted-keys.js +13 -0
  632. package/dist/src/runtime/emit/asserted-keys.js.map +1 -0
  633. package/dist/src/runtime/emit/between.d.ts.map +1 -1
  634. package/dist/src/runtime/emit/between.js +24 -19
  635. package/dist/src/runtime/emit/between.js.map +1 -1
  636. package/dist/src/runtime/emit/binary.d.ts.map +1 -1
  637. package/dist/src/runtime/emit/binary.js +5 -9
  638. package/dist/src/runtime/emit/binary.js.map +1 -1
  639. package/dist/src/runtime/emit/block.d.ts.map +1 -1
  640. package/dist/src/runtime/emit/block.js +11 -2
  641. package/dist/src/runtime/emit/block.js.map +1 -1
  642. package/dist/src/runtime/emit/bloom-join.d.ts.map +1 -1
  643. package/dist/src/runtime/emit/bloom-join.js +8 -2
  644. package/dist/src/runtime/emit/bloom-join.js.map +1 -1
  645. package/dist/src/runtime/emit/constraint-check.js +15 -0
  646. package/dist/src/runtime/emit/constraint-check.js.map +1 -1
  647. package/dist/src/runtime/emit/create-table.d.ts.map +1 -1
  648. package/dist/src/runtime/emit/create-table.js +8 -0
  649. package/dist/src/runtime/emit/create-table.js.map +1 -1
  650. package/dist/src/runtime/emit/create-view.d.ts.map +1 -1
  651. package/dist/src/runtime/emit/create-view.js +16 -1
  652. package/dist/src/runtime/emit/create-view.js.map +1 -1
  653. package/dist/src/runtime/emit/dml-executor.d.ts +27 -0
  654. package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
  655. package/dist/src/runtime/emit/dml-executor.js +413 -193
  656. package/dist/src/runtime/emit/dml-executor.js.map +1 -1
  657. package/dist/src/runtime/emit/drop-table.d.ts.map +1 -1
  658. package/dist/src/runtime/emit/drop-table.js +10 -0
  659. package/dist/src/runtime/emit/drop-table.js.map +1 -1
  660. package/dist/src/runtime/emit/drop-view.d.ts.map +1 -1
  661. package/dist/src/runtime/emit/drop-view.js +17 -0
  662. package/dist/src/runtime/emit/drop-view.js.map +1 -1
  663. package/dist/src/runtime/emit/envelope-scan.d.ts +13 -0
  664. package/dist/src/runtime/emit/envelope-scan.d.ts.map +1 -0
  665. package/dist/src/runtime/emit/envelope-scan.js +22 -0
  666. package/dist/src/runtime/emit/envelope-scan.js.map +1 -0
  667. package/dist/src/runtime/emit/join.d.ts +10 -2
  668. package/dist/src/runtime/emit/join.d.ts.map +1 -1
  669. package/dist/src/runtime/emit/join.js +128 -38
  670. package/dist/src/runtime/emit/join.js.map +1 -1
  671. package/dist/src/runtime/emit/lens-auxiliary-access.d.ts +16 -0
  672. package/dist/src/runtime/emit/lens-auxiliary-access.d.ts.map +1 -0
  673. package/dist/src/runtime/emit/lens-auxiliary-access.js +16 -0
  674. package/dist/src/runtime/emit/lens-auxiliary-access.js.map +1 -0
  675. package/dist/src/runtime/emit/materialized-view-helpers.d.ts +640 -0
  676. package/dist/src/runtime/emit/materialized-view-helpers.d.ts.map +1 -0
  677. package/dist/src/runtime/emit/materialized-view-helpers.js +2576 -0
  678. package/dist/src/runtime/emit/materialized-view-helpers.js.map +1 -0
  679. package/dist/src/runtime/emit/materialized-view.d.ts +31 -0
  680. package/dist/src/runtime/emit/materialized-view.d.ts.map +1 -0
  681. package/dist/src/runtime/emit/materialized-view.js +187 -0
  682. package/dist/src/runtime/emit/materialized-view.js.map +1 -0
  683. package/dist/src/runtime/emit/merge-join.d.ts.map +1 -1
  684. package/dist/src/runtime/emit/merge-join.js +15 -3
  685. package/dist/src/runtime/emit/merge-join.js.map +1 -1
  686. package/dist/src/runtime/emit/project.d.ts.map +1 -1
  687. package/dist/src/runtime/emit/project.js +10 -5
  688. package/dist/src/runtime/emit/project.js.map +1 -1
  689. package/dist/src/runtime/emit/schema-declarative.d.ts +1 -0
  690. package/dist/src/runtime/emit/schema-declarative.d.ts.map +1 -1
  691. package/dist/src/runtime/emit/schema-declarative.js +101 -5
  692. package/dist/src/runtime/emit/schema-declarative.js.map +1 -1
  693. package/dist/src/runtime/emit/set-object-tags.d.ts +16 -0
  694. package/dist/src/runtime/emit/set-object-tags.d.ts.map +1 -0
  695. package/dist/src/runtime/emit/set-object-tags.js +57 -0
  696. package/dist/src/runtime/emit/set-object-tags.js.map +1 -0
  697. package/dist/src/runtime/emit/set-operation.d.ts.map +1 -1
  698. package/dist/src/runtime/emit/set-operation.js +140 -24
  699. package/dist/src/runtime/emit/set-operation.js.map +1 -1
  700. package/dist/src/runtime/emit/subquery.d.ts.map +1 -1
  701. package/dist/src/runtime/emit/subquery.js +110 -5
  702. package/dist/src/runtime/emit/subquery.js.map +1 -1
  703. package/dist/src/runtime/emit/unary.d.ts.map +1 -1
  704. package/dist/src/runtime/emit/unary.js +34 -6
  705. package/dist/src/runtime/emit/unary.js.map +1 -1
  706. package/dist/src/runtime/emit/view-mutation.d.ts +70 -0
  707. package/dist/src/runtime/emit/view-mutation.d.ts.map +1 -0
  708. package/dist/src/runtime/emit/view-mutation.js +299 -0
  709. package/dist/src/runtime/emit/view-mutation.js.map +1 -0
  710. package/dist/src/runtime/emit/window.js +29 -5
  711. package/dist/src/runtime/emit/window.js.map +1 -1
  712. package/dist/src/runtime/foreign-key-actions.d.ts +66 -3
  713. package/dist/src/runtime/foreign-key-actions.d.ts.map +1 -1
  714. package/dist/src/runtime/foreign-key-actions.js +580 -172
  715. package/dist/src/runtime/foreign-key-actions.js.map +1 -1
  716. package/dist/src/runtime/parallel-driver.d.ts +4 -1
  717. package/dist/src/runtime/parallel-driver.d.ts.map +1 -1
  718. package/dist/src/runtime/parallel-driver.js +5 -1
  719. package/dist/src/runtime/parallel-driver.js.map +1 -1
  720. package/dist/src/runtime/register.d.ts.map +1 -1
  721. package/dist/src/runtime/register.js +17 -1
  722. package/dist/src/runtime/register.js.map +1 -1
  723. package/dist/src/runtime/types.d.ts +10 -0
  724. package/dist/src/runtime/types.d.ts.map +1 -1
  725. package/dist/src/runtime/types.js.map +1 -1
  726. package/dist/src/schema/basis-backfill.d.ts +63 -0
  727. package/dist/src/schema/basis-backfill.d.ts.map +1 -0
  728. package/dist/src/schema/basis-backfill.js +161 -0
  729. package/dist/src/schema/basis-backfill.js.map +1 -0
  730. package/dist/src/schema/catalog.d.ts +115 -1
  731. package/dist/src/schema/catalog.d.ts.map +1 -1
  732. package/dist/src/schema/catalog.js +249 -22
  733. package/dist/src/schema/catalog.js.map +1 -1
  734. package/dist/src/schema/change-events.d.ts +42 -1
  735. package/dist/src/schema/change-events.d.ts.map +1 -1
  736. package/dist/src/schema/change-events.js.map +1 -1
  737. package/dist/src/schema/column.d.ts +16 -0
  738. package/dist/src/schema/column.d.ts.map +1 -1
  739. package/dist/src/schema/column.js.map +1 -1
  740. package/dist/src/schema/constraint-builder.d.ts +182 -0
  741. package/dist/src/schema/constraint-builder.d.ts.map +1 -0
  742. package/dist/src/schema/constraint-builder.js +424 -0
  743. package/dist/src/schema/constraint-builder.js.map +1 -0
  744. package/dist/src/schema/ddl-generator.d.ts +86 -1
  745. package/dist/src/schema/ddl-generator.d.ts.map +1 -1
  746. package/dist/src/schema/ddl-generator.js +316 -20
  747. package/dist/src/schema/ddl-generator.js.map +1 -1
  748. package/dist/src/schema/declared-schema-manager.d.ts +51 -0
  749. package/dist/src/schema/declared-schema-manager.d.ts.map +1 -1
  750. package/dist/src/schema/declared-schema-manager.js +61 -0
  751. package/dist/src/schema/declared-schema-manager.js.map +1 -1
  752. package/dist/src/schema/derivation.d.ts +106 -0
  753. package/dist/src/schema/derivation.d.ts.map +1 -0
  754. package/dist/src/schema/derivation.js +25 -0
  755. package/dist/src/schema/derivation.js.map +1 -0
  756. package/dist/src/schema/function.d.ts +20 -0
  757. package/dist/src/schema/function.d.ts.map +1 -1
  758. package/dist/src/schema/function.js.map +1 -1
  759. package/dist/src/schema/lens-ack.d.ts +90 -0
  760. package/dist/src/schema/lens-ack.d.ts.map +1 -0
  761. package/dist/src/schema/lens-ack.js +361 -0
  762. package/dist/src/schema/lens-ack.js.map +1 -0
  763. package/dist/src/schema/lens-compiler.d.ts +62 -0
  764. package/dist/src/schema/lens-compiler.d.ts.map +1 -0
  765. package/dist/src/schema/lens-compiler.js +1594 -0
  766. package/dist/src/schema/lens-compiler.js.map +1 -0
  767. package/dist/src/schema/lens-fk-discovery.d.ts +175 -0
  768. package/dist/src/schema/lens-fk-discovery.d.ts.map +1 -0
  769. package/dist/src/schema/lens-fk-discovery.js +336 -0
  770. package/dist/src/schema/lens-fk-discovery.js.map +1 -0
  771. package/dist/src/schema/lens-prover.d.ts +336 -0
  772. package/dist/src/schema/lens-prover.d.ts.map +1 -0
  773. package/dist/src/schema/lens-prover.js +1988 -0
  774. package/dist/src/schema/lens-prover.js.map +1 -0
  775. package/dist/src/schema/lens.d.ts +254 -0
  776. package/dist/src/schema/lens.d.ts.map +1 -0
  777. package/dist/src/schema/lens.js +21 -0
  778. package/dist/src/schema/lens.js.map +1 -0
  779. package/dist/src/schema/manager.d.ts +676 -18
  780. package/dist/src/schema/manager.d.ts.map +1 -1
  781. package/dist/src/schema/manager.js +1573 -238
  782. package/dist/src/schema/manager.js.map +1 -1
  783. package/dist/src/schema/mapping-advertisement-tags.d.ts +39 -0
  784. package/dist/src/schema/mapping-advertisement-tags.d.ts.map +1 -0
  785. package/dist/src/schema/mapping-advertisement-tags.js +216 -0
  786. package/dist/src/schema/mapping-advertisement-tags.js.map +1 -0
  787. package/dist/src/schema/rename-rewriter.d.ts +45 -4
  788. package/dist/src/schema/rename-rewriter.d.ts.map +1 -1
  789. package/dist/src/schema/rename-rewriter.js +412 -19
  790. package/dist/src/schema/rename-rewriter.js.map +1 -1
  791. package/dist/src/schema/reserved-tags-policy.d.ts +32 -0
  792. package/dist/src/schema/reserved-tags-policy.d.ts.map +1 -0
  793. package/dist/src/schema/reserved-tags-policy.js +34 -0
  794. package/dist/src/schema/reserved-tags-policy.js.map +1 -0
  795. package/dist/src/schema/reserved-tags.d.ts +170 -0
  796. package/dist/src/schema/reserved-tags.d.ts.map +1 -0
  797. package/dist/src/schema/reserved-tags.js +507 -0
  798. package/dist/src/schema/reserved-tags.js.map +1 -0
  799. package/dist/src/schema/schema-differ.d.ts +158 -2
  800. package/dist/src/schema/schema-differ.d.ts.map +1 -1
  801. package/dist/src/schema/schema-differ.js +1460 -78
  802. package/dist/src/schema/schema-differ.js.map +1 -1
  803. package/dist/src/schema/schema-hasher.d.ts +8 -3
  804. package/dist/src/schema/schema-hasher.d.ts.map +1 -1
  805. package/dist/src/schema/schema-hasher.js +22 -2
  806. package/dist/src/schema/schema-hasher.js.map +1 -1
  807. package/dist/src/schema/schema.d.ts +25 -1
  808. package/dist/src/schema/schema.d.ts.map +1 -1
  809. package/dist/src/schema/schema.js +36 -2
  810. package/dist/src/schema/schema.js.map +1 -1
  811. package/dist/src/schema/table.d.ts +259 -10
  812. package/dist/src/schema/table.d.ts.map +1 -1
  813. package/dist/src/schema/table.js +309 -26
  814. package/dist/src/schema/table.js.map +1 -1
  815. package/dist/src/schema/unique-enforcement.d.ts +78 -0
  816. package/dist/src/schema/unique-enforcement.d.ts.map +1 -0
  817. package/dist/src/schema/unique-enforcement.js +93 -0
  818. package/dist/src/schema/unique-enforcement.js.map +1 -0
  819. package/dist/src/schema/view.d.ts +83 -2
  820. package/dist/src/schema/view.d.ts.map +1 -1
  821. package/dist/src/schema/view.js +67 -1
  822. package/dist/src/schema/view.js.map +1 -1
  823. package/dist/src/schema/window-function.d.ts +9 -1
  824. package/dist/src/schema/window-function.d.ts.map +1 -1
  825. package/dist/src/schema/window-function.js.map +1 -1
  826. package/dist/src/util/comparison.d.ts +24 -0
  827. package/dist/src/util/comparison.d.ts.map +1 -1
  828. package/dist/src/util/comparison.js +34 -0
  829. package/dist/src/util/comparison.js.map +1 -1
  830. package/dist/src/util/mutation-statement.d.ts.map +1 -1
  831. package/dist/src/util/mutation-statement.js +4 -1
  832. package/dist/src/util/mutation-statement.js.map +1 -1
  833. package/dist/src/util/serialization.d.ts +9 -0
  834. package/dist/src/util/serialization.d.ts.map +1 -1
  835. package/dist/src/util/serialization.js +26 -0
  836. package/dist/src/util/serialization.js.map +1 -1
  837. package/dist/src/vtab/backing-host.d.ts +286 -0
  838. package/dist/src/vtab/backing-host.d.ts.map +1 -0
  839. package/dist/src/vtab/backing-host.js +118 -0
  840. package/dist/src/vtab/backing-host.js.map +1 -0
  841. package/dist/src/vtab/best-access-plan.d.ts +21 -0
  842. package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
  843. package/dist/src/vtab/best-access-plan.js.map +1 -1
  844. package/dist/src/vtab/capabilities.d.ts +5 -5
  845. package/dist/src/vtab/capabilities.d.ts.map +1 -1
  846. package/dist/src/vtab/mapping-advertisement.d.ts +163 -0
  847. package/dist/src/vtab/mapping-advertisement.d.ts.map +1 -0
  848. package/dist/src/vtab/mapping-advertisement.js +2 -0
  849. package/dist/src/vtab/mapping-advertisement.js.map +1 -0
  850. package/dist/src/vtab/memory/index.d.ts +64 -4
  851. package/dist/src/vtab/memory/index.d.ts.map +1 -1
  852. package/dist/src/vtab/memory/index.js +119 -12
  853. package/dist/src/vtab/memory/index.js.map +1 -1
  854. package/dist/src/vtab/memory/layer/base.d.ts +38 -1
  855. package/dist/src/vtab/memory/layer/base.d.ts.map +1 -1
  856. package/dist/src/vtab/memory/layer/base.js +112 -24
  857. package/dist/src/vtab/memory/layer/base.js.map +1 -1
  858. package/dist/src/vtab/memory/layer/manager.d.ts +291 -4
  859. package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
  860. package/dist/src/vtab/memory/layer/manager.js +1050 -91
  861. package/dist/src/vtab/memory/layer/manager.js.map +1 -1
  862. package/dist/src/vtab/memory/layer/plan-filter.d.ts.map +1 -1
  863. package/dist/src/vtab/memory/layer/plan-filter.js +35 -6
  864. package/dist/src/vtab/memory/layer/plan-filter.js.map +1 -1
  865. package/dist/src/vtab/memory/layer/scan-layer.d.ts.map +1 -1
  866. package/dist/src/vtab/memory/layer/scan-layer.js +66 -14
  867. package/dist/src/vtab/memory/layer/scan-layer.js.map +1 -1
  868. package/dist/src/vtab/memory/layer/scan-plan.d.ts +14 -0
  869. package/dist/src/vtab/memory/layer/scan-plan.d.ts.map +1 -1
  870. package/dist/src/vtab/memory/layer/scan-plan.js +27 -4
  871. package/dist/src/vtab/memory/layer/scan-plan.js.map +1 -1
  872. package/dist/src/vtab/memory/layer/transaction.d.ts.map +1 -1
  873. package/dist/src/vtab/memory/layer/transaction.js +5 -1
  874. package/dist/src/vtab/memory/layer/transaction.js.map +1 -1
  875. package/dist/src/vtab/memory/module.d.ts +17 -0
  876. package/dist/src/vtab/memory/module.d.ts.map +1 -1
  877. package/dist/src/vtab/memory/module.js +82 -3
  878. package/dist/src/vtab/memory/module.js.map +1 -1
  879. package/dist/src/vtab/memory/table.d.ts.map +1 -1
  880. package/dist/src/vtab/memory/table.js +15 -5
  881. package/dist/src/vtab/memory/table.js.map +1 -1
  882. package/dist/src/vtab/memory/types.d.ts +20 -2
  883. package/dist/src/vtab/memory/types.d.ts.map +1 -1
  884. package/dist/src/vtab/memory/utils/predicate.d.ts.map +1 -1
  885. package/dist/src/vtab/memory/utils/predicate.js +46 -24
  886. package/dist/src/vtab/memory/utils/predicate.js.map +1 -1
  887. package/dist/src/vtab/memory/utils/primary-key-encode.d.ts +31 -0
  888. package/dist/src/vtab/memory/utils/primary-key-encode.d.ts.map +1 -0
  889. package/dist/src/vtab/memory/utils/primary-key-encode.js +101 -0
  890. package/dist/src/vtab/memory/utils/primary-key-encode.js.map +1 -0
  891. package/dist/src/vtab/memory/utils/primary-key.d.ts +8 -0
  892. package/dist/src/vtab/memory/utils/primary-key.d.ts.map +1 -1
  893. package/dist/src/vtab/memory/utils/primary-key.js +12 -5
  894. package/dist/src/vtab/memory/utils/primary-key.js.map +1 -1
  895. package/dist/src/vtab/module.d.ts +203 -4
  896. package/dist/src/vtab/module.d.ts.map +1 -1
  897. package/dist/src/vtab/table.d.ts +9 -0
  898. package/dist/src/vtab/table.d.ts.map +1 -1
  899. package/dist/src/vtab/table.js.map +1 -1
  900. package/package.json +17 -16
@@ -3,11 +3,20 @@ import { QuereusError } from "../../common/errors.js";
3
3
  import { StatusCode } from "../../common/types.js";
4
4
  import { isScalarFunctionSchema, isTableValuedFunctionSchema, isAggregateFunctionSchema } from "../../schema/function.js";
5
5
  import { isWindowFunction } from "../../schema/window-function.js";
6
+ import { exposedImplicitIndexes } from "../../schema/catalog.js";
7
+ import { isMaintainedTable } from "../../schema/derivation.js";
8
+ import { generateMaintainedTableDDL } from "../../schema/ddl-generator.js";
6
9
  import { INTEGER_TYPE, TEXT_TYPE } from "../../types/builtin-types.js";
7
10
  import { FunctionFlags } from "../../common/constants.js";
8
11
  import { RowOpFlag } from "../../schema/table.js";
9
12
  import { jsonStringify } from "../../util/serialization.js";
10
13
  import { expressionToString } from "../../emit/ast-stringify.js";
14
+ import { createLogger } from "../../common/logger.js";
15
+ import { TableReferenceNode } from "../../planner/nodes/reference.js";
16
+ import { isJoinBody, isDecomposableJoinBody } from "../../planner/mutation/multi-source.js";
17
+ import { isSetOpMembershipBody, isSetOpBranchWritable, setOpHasSubtreeOperand, setOpJoinLegsInsertable, surfacedInnerFlagNames, isSetOpFlaglessWritableBody, flaglessDiscriminatorColumnNames } from "../../planner/mutation/set-op.js";
18
+ import { bodyDefaults } from "../../schema/view.js";
19
+ const log = createLogger('func:view_info');
11
20
  /**
12
21
  * Encodes a tag bag as a JSON object string. Returns null when there are no
13
22
  * tags so callers can use `WHERE tags IS NULL` to filter untagged objects.
@@ -21,6 +30,31 @@ function tagsToJson(tags) {
21
30
  return null;
22
31
  return jsonStringify(tags);
23
32
  }
33
+ /**
34
+ * Builds the `CREATE INDEX "name" ON "table" (cols)` string a `schema()` row
35
+ * surfaces. Shared by real `IndexSchema` rows and synthetic exposed-implicit
36
+ * descriptors (both expose `name` + `columns`). Returns `null` if a referenced
37
+ * column index is out of range, matching the prior inline behavior.
38
+ */
39
+ function buildIndexCreateSql(index, tableSchema) {
40
+ try {
41
+ const indexColumns = index.columns.map(col => {
42
+ const column = tableSchema.columns[col.index];
43
+ let colStr = `"${column.name}"`;
44
+ if (col.collation) {
45
+ colStr += ` COLLATE ${col.collation}`;
46
+ }
47
+ if (col.desc) {
48
+ colStr += ' DESC';
49
+ }
50
+ return colStr;
51
+ }).join(', ');
52
+ return `CREATE INDEX "${index.name}" ON "${tableSchema.name}" (${indexColumns})`;
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ }
24
58
  /**
25
59
  * Converts a RowOpMask bitmask to a comma-joined operations list.
26
60
  * An empty/default mask returns the canonical default-all string so the
@@ -76,16 +110,23 @@ export const schemaFunc = createIntegratedTableValuedFunction({
76
110
  for (const tableSchema of schemaInstance.getAllTables()) {
77
111
  let createSql = null;
78
112
  try {
79
- const columnsStr = tableSchema.columns.map((c) => `"${c.name}" ${c.logicalType.name}`).join(', ');
80
- const argsStr = Object.entries(tableSchema.vtabArgs ?? {}).map(([key, value]) => `${key}=${value}`).join(', ');
81
- createSql = `create table "${tableSchema.name}" (${columnsStr}) using ${tableSchema.vtabModuleName}(${argsStr})`;
113
+ if (isMaintainedTable(tableSchema)) {
114
+ // A maintained table (materialized view) lists exactly ONCE,
115
+ // as itself, with its canonical create-materialized-view DDL.
116
+ createSql = generateMaintainedTableDDL(tableSchema);
117
+ }
118
+ else {
119
+ const columnsStr = tableSchema.columns.map((c) => `"${c.name}" ${c.logicalType.name}`).join(', ');
120
+ const argsStr = Object.entries(tableSchema.vtabArgs ?? {}).map(([key, value]) => `${key}=${value}`).join(', ');
121
+ createSql = `create table "${tableSchema.name}" (${columnsStr}) using ${tableSchema.vtabModuleName}(${argsStr})`;
122
+ }
82
123
  }
83
124
  catch {
84
125
  createSql = null;
85
126
  }
86
127
  yield [
87
128
  schemaName,
88
- tableSchema.isView ? 'view' : 'table',
129
+ tableSchema.isView ? 'view' : isMaintainedTable(tableSchema) ? 'materialized_view' : 'table',
89
130
  tableSchema.name,
90
131
  tableSchema.name,
91
132
  createSql,
@@ -94,34 +135,30 @@ export const schemaFunc = createIntegratedTableValuedFunction({
94
135
  // Process Indexes for this table
95
136
  if (tableSchema.indexes) {
96
137
  for (const indexSchema of tableSchema.indexes) {
97
- let indexSql = null;
98
- try {
99
- const indexColumns = indexSchema.columns.map(col => {
100
- const column = tableSchema.columns[col.index];
101
- let colStr = `"${column.name}"`;
102
- if (col.collation) {
103
- colStr += ` COLLATE ${col.collation}`;
104
- }
105
- if (col.desc) {
106
- colStr += ' DESC';
107
- }
108
- return colStr;
109
- }).join(', ');
110
- indexSql = `CREATE INDEX "${indexSchema.name}" ON "${tableSchema.name}" (${indexColumns})`;
111
- }
112
- catch {
113
- indexSql = null;
114
- }
115
138
  yield [
116
139
  schemaName,
117
140
  'index',
118
141
  indexSchema.name,
119
142
  tableSchema.name,
120
- indexSql,
143
+ buildIndexCreateSql(indexSchema, tableSchema),
121
144
  tagsToJson(indexSchema.tags)
122
145
  ];
123
146
  }
124
147
  }
148
+ // Surface exposed implicit covering indexes the backend did NOT
149
+ // materialize as `IndexSchema` entries (store mode). In memory mode
150
+ // `exposedImplicitIndexes` returns [] (the name is already in
151
+ // `tableSchema.indexes` above), so this loop is a no-op there.
152
+ for (const desc of exposedImplicitIndexes(tableSchema)) {
153
+ yield [
154
+ schemaName,
155
+ 'index',
156
+ desc.name,
157
+ tableSchema.name,
158
+ buildIndexCreateSql(desc, tableSchema),
159
+ tagsToJson(desc.tags)
160
+ ];
161
+ }
125
162
  }
126
163
  // Process Views
127
164
  for (const viewSchema of schemaInstance.getAllViews()) {
@@ -134,8 +171,10 @@ export const schemaFunc = createIntegratedTableValuedFunction({
134
171
  tagsToJson(viewSchema.tags)
135
172
  ];
136
173
  }
137
- // Process Functions
174
+ // Process Functions (skip hidden internal helpers)
138
175
  for (const funcSchema of schemaInstance._getAllFunctions()) {
176
+ if (funcSchema.hidden)
177
+ continue;
139
178
  yield [
140
179
  schemaName,
141
180
  'function',
@@ -326,11 +365,19 @@ export const indexInfoFunc = createIntegratedTableValuedFunction({
326
365
  if (!table) {
327
366
  throw new QuereusError(`Table '${tableName}' not found`, StatusCode.ERROR);
328
367
  }
329
- if (!table.indexes)
368
+ // Real indexes plus any exposed implicit covering index the backend did NOT
369
+ // materialize as an `IndexSchema` (store mode). In memory mode the second
370
+ // list is empty (the name already lives in `table.indexes`), so the row set
371
+ // matches across backends. Synthetic descriptors carry no `unique` flag —
372
+ // UNIQUE enforcement routes through `uniqueConstraints` — so they report
373
+ // `unique = 0`, mirroring the memory materialized entry.
374
+ const realIndexes = table.indexes ?? [];
375
+ const synthetic = exposedImplicitIndexes(table);
376
+ if (realIndexes.length === 0 && synthetic.length === 0)
330
377
  return;
331
- for (const idx of table.indexes) {
378
+ for (const idx of [...realIndexes, ...synthetic]) {
332
379
  const tagJson = tagsToJson(idx.tags);
333
- const uniqueFlag = idx.unique ? 1 : 0;
380
+ const uniqueFlag = ('unique' in idx && idx.unique) ? 1 : 0;
334
381
  const partialFlag = idx.predicate ? 1 : 0;
335
382
  for (let seq = 0; seq < idx.columns.length; seq++) {
336
383
  const col = idx.columns[seq];
@@ -548,4 +595,646 @@ export const functionInfoFunc = createIntegratedTableValuedFunction({
548
595
  yield ['error', -1, 'error', 0, 0, `Failed to get function info: ${error.message}`];
549
596
  }
550
597
  });
598
+ /** The conservative all-`NO` / `[]` row for a body with no recoverable base lineage. */
599
+ const CONSERVATIVE_VIEW_INFO = {
600
+ isInsertableInto: false,
601
+ isUpdatable: false,
602
+ isDeletable: false,
603
+ effectiveTargets: [],
604
+ };
605
+ /** SQL-standard `'YES'`/`'NO'` text encoding for a boolean updateability flag. */
606
+ function yesNo(value) {
607
+ return value ? 'YES' : 'NO';
608
+ }
609
+ /**
610
+ * Resolve an UpdateSite to its underlying base reference: the producing
611
+ * `TableReferenceNode` id + base column for a `base` site (plain or `null-extended`),
612
+ * else `undefined` (a `computed` / leaf-less site). `nullExtended` is true when an
613
+ * outer-join `null-extended` layer was unwrapped to reach the base — the column names a
614
+ * base table/column (so it is insertable through the both-sides envelope and counts as
615
+ * an effective target) but is read-only on UPDATE (the deferred per-row materialization),
616
+ * so the per-column / `is_updatable` surfaces report it non-updatable.
617
+ */
618
+ function baseSiteOf(site) {
619
+ let s = site;
620
+ let nullExtended = false;
621
+ while (s && s.kind === 'null-extended') {
622
+ nullExtended = true;
623
+ s = s.inner;
624
+ }
625
+ return s && s.kind === 'base' ? { table: s.table, baseColumn: s.baseColumn, nullExtended } : undefined;
626
+ }
627
+ /** Every relational node in the planned body (deduped), root-first. */
628
+ function collectBodyNodes(root) {
629
+ const out = [];
630
+ const seen = new Set();
631
+ const visit = (n) => {
632
+ if (seen.has(n))
633
+ return;
634
+ seen.add(n);
635
+ out.push(n);
636
+ for (const child of n.getRelations())
637
+ visit(child);
638
+ };
639
+ visit(root);
640
+ return out;
641
+ }
642
+ /**
643
+ * Index every `TableReferenceNode` in a planned body by its numeric node id.
644
+ * Shared by `deriveViewInfo` and `deriveColumnInfo`: an UpdateSite's `table`
645
+ * field is the producing reference's id, which both surfaces resolve back to a
646
+ * base-table name through this map.
647
+ */
648
+ function buildTableRefsById(nodes) {
649
+ const tableRefsById = new Map();
650
+ for (const n of nodes) {
651
+ if (n instanceof TableReferenceNode)
652
+ tableRefsById.set(Number(n.id), n);
653
+ }
654
+ return tableRefsById;
655
+ }
656
+ /** Record `baseColumn` (lowercased) as defaultable for base table `table`. */
657
+ function addDefaultable(map, table, baseColumn) {
658
+ const set = map.get(table) ?? new Set();
659
+ set.add(baseColumn.toLowerCase());
660
+ map.set(table, set);
661
+ }
662
+ /**
663
+ * Derive the four view-level updateability columns statically from the planned
664
+ * view body. The **logical** tree is used deliberately (via `_buildPlan`, not
665
+ * `getPlan`): it preserves the Project/Filter/Join/TableReference operator
666
+ * structure that threads `updateLineage`, whereas the optimizer degrades a join's
667
+ * top-node lineage to `computed` (docs/view-updateability.md § surface authority).
668
+ * This mirrors the view-mutation substrate (`planner/mutation/*`), which plans the
669
+ * body logically for the same reason — so `effective_targets` agrees with the
670
+ * base set `propagate()` reaches.
671
+ *
672
+ * Re-plans on every call (same re-plan-on-read posture as `deriveBackingShape`);
673
+ * caching is a later optimization.
674
+ */
675
+ function deriveViewInfo(db, view) {
676
+ const { plan } = db._buildPlan([view.selectAst]);
677
+ const root = plan.getRelations()[0];
678
+ if (!root)
679
+ return CONSERVATIVE_VIEW_INFO;
680
+ const nodes = collectBodyNodes(root);
681
+ // The minimal `MutableViewLike` the set-op insertability probe re-derives the branches from
682
+ // (the same `{ name, schemaName, selectAst }` shape the write path / `deriveBackingShape` use).
683
+ const viewAsMutable = { name: view.name, schemaName: view.schemaName, selectAst: view.selectAst };
684
+ // Set-operation membership body: the per-branch fan-out makes the view
685
+ // insertable-into (flag-routed insert-through), updatable (membership flip + data
686
+ // fan-out), and deletable (delete fan-out), agreeing with the dynamic `propagate()`
687
+ // truth (`set-op-membership-write`). The effective targets are the branch base
688
+ // tables. A plain (flag-less) set-op body is NOT this case — it falls through to the
689
+ // `targetIds.size === 0` conservative row below (no membership column to address a branch).
690
+ if (isSetOpMembershipBody(view.selectAst)) {
691
+ // Branch-writability shape gate (mirrors the non-decomposable join shape gate below):
692
+ // a membership body the dynamic write (`analyzeSetOpView`) would reject — an outer
693
+ // LIMIT/OFFSET (non-decomposable window), a non-SELECT right operand, a `select *`
694
+ // leg, a computed leg, or legs with mismatched column counts — is gated out here.
695
+ // Without this gate the
696
+ // surface would over-claim writable from the membership flag's presence alone; report
697
+ // the conservative all-`NO` row to agree with the dynamic `propagate()` reject.
698
+ if (!isSetOpBranchWritable(view.selectAst))
699
+ return CONSERVATIVE_VIEW_INFO;
700
+ const targets = [...new Set([...buildTableRefsById(nodes).values()].map(r => r.tableSchema.name))].sort();
701
+ // Update / delete fan-out recurses through a subtree operand to its member leaves
702
+ // (`nestable-flagged-set-ops`) AND composes a multi-source (INNER join) branch
703
+ // (`set-op-write-multisource-leg-compose`), so updatable / deletable stay YES at any depth.
704
+ // Insert through a join branch is now SHIPPED via the nested shared-surrogate envelope splice
705
+ // (`set-op-write-multisource-leg-insert`), so `is_insertable_into` is YES for a body whose
706
+ // join branches are ALL insertable — re-derived dynamically by `setOpJoinLegsInsertable`
707
+ // (NO for a composite-key / no-default / non-equi join branch). It stays NO when EITHER
708
+ // operand is a subtree: inserting into a multi-leaf subtree has no single deterministic
709
+ // target leaf (product-coordinate addressing — `set-op-membership-nested`).
710
+ const isInsertableInto = !setOpHasSubtreeOperand(view.selectAst)
711
+ && setOpJoinLegsInsertable(db._buildProbeContext(), viewAsMutable);
712
+ return { isInsertableInto, isUpdatable: true, isDeletable: true, effectiveTargets: targets };
713
+ }
714
+ // Flag-less predicate-honest set-op body (`set-op-flagless-predicate-honest-writes`): a
715
+ // flag-less body of literal-discriminator legs is insertable (routed to the consistent
716
+ // legs), updatable (data-column fan-out; the literal discriminators are read-only), and
717
+ // deletable (fan-out) — agreeing with the dynamic `buildFlaglessSetOpWrite` truth. The
718
+ // recognizer is the static shadow of the dynamic write's shape acceptance (it admits
719
+ // literal projections, unlike the membership probe), so a body it rejects (outer
720
+ // LIMIT/OFFSET, `select *` / computed leg, deep intersect/except) falls through to the
721
+ // `targetIds.size === 0` conservative row below.
722
+ if (isSetOpFlaglessWritableBody(view.selectAst)) {
723
+ const targets = [...new Set([...buildTableRefsById(nodes).values()].map(r => r.tableSchema.name))].sort();
724
+ // Insert through a multi-source (join) leg is now SHIPPED via the nested shared-surrogate
725
+ // envelope splice (`set-op-write-multisource-leg-insert`), so `is_insertable_into` is YES for
726
+ // a body whose join legs are ALL insertable — re-derived dynamically by
727
+ // `setOpJoinLegsInsertable` (NO for a composite-key / no-default / non-equi join leg) —
728
+ // matching the dynamic `buildFlaglessInsert`; UPDATE / DELETE through the join leg stay YES.
729
+ const isInsertableInto = setOpJoinLegsInsertable(db._buildProbeContext(), viewAsMutable);
730
+ return { isInsertableInto, isUpdatable: true, isDeletable: true, effectiveTargets: targets };
731
+ }
732
+ // Non-decomposable join shape gate: cross / comma (implicit) / subquery- or
733
+ // function-source join bodies are not write-through-able, so they must report the
734
+ // conservative all-`NO` row. `propagate()` decomposes an n-way (≥2) equi-join —
735
+ // `inner`/`left`/`right`/`full` (RIGHT now admitted, the LEFT mirror; FULL self-conservatizes), composite-PK
736
+ // sides and self-joins included
737
+ // (`isDecomposableJoinBody`, the boolean shadow of `collectJoinSources`) — and rejects
738
+ // every other join shape, so without this gate the target walk below would resolve
739
+ // their bases and over-report `is_updatable = 'YES'`. Outer joins ARE decomposable
740
+ // now (partially writable), so they flow through to the per-column walk, which reports
741
+ // a non-preserved (`null-extended`) column non-updatable via `baseSiteOf().nullExtended`
742
+ // — agreeing with the dynamic `propagate()` truth (a non-preserved update rejects).
743
+ if (isJoinBody(view.selectAst) && !isDecomposableJoinBody(view.selectAst)) {
744
+ return CONSERVATIVE_VIEW_INFO;
745
+ }
746
+ const tableRefsById = buildTableRefsById(nodes);
747
+ // Output-column lineage: effective targets, the per-table set of base columns
748
+ // exposed by the projection, and the is_updatable flag (≥1 output column with a
749
+ // PRESERVED base site — a non-preserved `null-extended` column is read-only on
750
+ // update, so it does not make the view updatable). `preservedTargets` are the base
751
+ // tables a column reaches non-null-extended — the only ones a DELETE routes to
752
+ // (§ Outer Joins — Deletes), so they alone gate deletability below.
753
+ const rootLineage = root.physical?.updateLineage;
754
+ const targetIds = new Set();
755
+ const preservedTargets = new Set();
756
+ const exposed = new Map();
757
+ let anyBase = false;
758
+ for (const attr of root.getAttributes()) {
759
+ const site = rootLineage?.get(attr.id);
760
+ // An authored (`with inverse`) column exposes each put's target base column —
761
+ // it is writable through the put expressions, so the targets count toward base
762
+ // reachability exactly like identity columns. INSERT coverage (`exposed`) is
763
+ // counted only for a single-source body: the single-source spine evaluates the
764
+ // puts per supplied row, but the multi-source insert envelope defers authored
765
+ // puts, so counting them there would over-report `is_insertable_into`.
766
+ if (site?.kind === 'authored') {
767
+ for (const put of site.puts) {
768
+ anyBase = true;
769
+ preservedTargets.add(put.table);
770
+ targetIds.add(put.table);
771
+ if (!isJoinBody(view.selectAst)) {
772
+ const set = exposed.get(put.table) ?? new Set();
773
+ set.add(put.baseColumn.toLowerCase());
774
+ exposed.set(put.table, set);
775
+ }
776
+ }
777
+ continue;
778
+ }
779
+ const bs = baseSiteOf(site);
780
+ if (!bs)
781
+ continue;
782
+ if (!bs.nullExtended) {
783
+ anyBase = true;
784
+ preservedTargets.add(bs.table);
785
+ }
786
+ targetIds.add(bs.table);
787
+ // A null-extended column still exposes its base column for INSERT coverage (the
788
+ // both-sides envelope supplies it) — add it regardless of preservation.
789
+ const set = exposed.get(bs.table) ?? new Set();
790
+ set.add(bs.baseColumn.toLowerCase());
791
+ exposed.set(bs.table, set);
792
+ }
793
+ // No base lineage at the root ⇒ wholly read-only (VALUES / aggregate / set-op /
794
+ // computed-only / recursive-CTE body). The conservative row falls straight out.
795
+ if (targetIds.size === 0)
796
+ return CONSERVATIVE_VIEW_INFO;
797
+ // No PRESERVED base column ⇒ a FULL outer join (every side null-extended), or a
798
+ // LEFT/RIGHT body that projects away its whole preserved side. v1 defers write-through
799
+ // there (a full-outer write is per-row — § Outer Joins; a RIGHT body now reaches here
800
+ // but always has a preserved anchor), so report the conservative
801
+ // row, agreeing with the dynamic rejects (`unsupported-outer-join-update` on update,
802
+ // `unsupported-join` on delete/insert through a side-less preserved set).
803
+ if (preservedTargets.size === 0)
804
+ return CONSERVATIVE_VIEW_INFO;
805
+ // Defaultable base columns: every (node, attribute) carrying an insert default
806
+ // (`constant-fd` selection pin, declared `base-default`, `view-insert-default`),
807
+ // resolved through THAT node's own lineage back to a base column. Walking the
808
+ // whole spine — not just the root — recovers a *projected-away* constant-FD
809
+ // column (e.g. `select name from t where color = 'green'`, where `color`'s
810
+ // default lives on the Filter, below the projection that drops it).
811
+ const defaultable = new Map();
812
+ for (const n of nodes) {
813
+ const nl = n.physical?.updateLineage;
814
+ const nd = n.physical?.attributeDefaults;
815
+ if (!nl || !nd)
816
+ continue;
817
+ for (const attrId of nd.keys()) {
818
+ const bs = baseSiteOf(nl.get(attrId));
819
+ if (!bs)
820
+ continue;
821
+ addDefaultable(defaultable, bs.table, bs.baseColumn);
822
+ }
823
+ }
824
+ // View-level insert defaults (Divergence 1): the `view-insert-default`
825
+ // provenance is never threaded onto `PhysicalProperties` (it is consumed only
826
+ // in the rewrite), so this body is planned without the view's defaults and the
827
+ // walk above misses them. Fold each `with defaults (col = expr, …)` clause
828
+ // column (now stored on the body select AST) into `defaultable` directly,
829
+ // mirroring `resolveDefaultForColumn` — a base column of a reachable target
830
+ // (the common projected-away case) or a visible view-output column with base
831
+ // lineage. Unlike the rewrite, an unresolvable name is silently skipped: a
832
+ // read-only introspection surface stays on its never-throw posture (the
833
+ // per-view try/catch would otherwise collapse the row to all-`NO`).
834
+ const defaultedColumns = new Set((bodyDefaults(view.selectAst) ?? []).map(d => d.column.toLowerCase()));
835
+ for (const colName of defaultedColumns) {
836
+ let resolved = false;
837
+ for (const id of targetIds) {
838
+ const match = tableRefsById.get(id)?.tableSchema.columns
839
+ .find(c => c.name.toLowerCase() === colName);
840
+ if (match) {
841
+ addDefaultable(defaultable, id, match.name);
842
+ resolved = true;
843
+ }
844
+ }
845
+ if (resolved)
846
+ continue;
847
+ const attr = root.getAttributes().find(a => a.name.toLowerCase() === colName);
848
+ const bs = attr && baseSiteOf(rootLineage?.get(attr.id));
849
+ if (bs)
850
+ addDefaultable(defaultable, bs.table, bs.baseColumn);
851
+ }
852
+ const targetNames = new Set();
853
+ let isDeletable = true;
854
+ let isInsertableInto = true;
855
+ for (const id of targetIds) {
856
+ const ref = tableRefsById.get(id);
857
+ if (!ref) {
858
+ // A base-site id with no resolved TableReferenceNode should not happen
859
+ // (root lineage ids come from the nodes we collected); fail conservative.
860
+ isDeletable = false;
861
+ isInsertableInto = false;
862
+ continue;
863
+ }
864
+ const tbl = ref.tableSchema;
865
+ targetNames.add(tbl.name);
866
+ const exp = exposed.get(id) ?? new Set();
867
+ const def = defaultable.get(id) ?? new Set();
868
+ // Deletability + insertability are decided over the PRESERVED targets only — a
869
+ // non-preserved (outer-join) target is never the delete route (deleting it merely
870
+ // null-extends the row — § Outer Joins — Deletes) and is an *optional* member of
871
+ // the insert fan-out (the preserved-only insert omits it). So a non-preserved
872
+ // target's unexposed PK / uncovered not-null column does not block either flag; a
873
+ // real both-sides insert that DOES supply it is gated at runtime instead.
874
+ if (!preservedTargets.has(id))
875
+ continue;
876
+ // Deletable iff every preserved target's PK is exposed through base lineage (so
877
+ // `pk = <view value>` is constructible). A keyless preserved base is undeletable.
878
+ const pkCols = tbl.primaryKeyDefinition.map(pk => tbl.columns[pk.index].name.toLowerCase());
879
+ if (pkCols.length === 0 || !pkCols.every(c => exp.has(c)))
880
+ isDeletable = false;
881
+ // Insertable iff every not-null-without-declared-default, non-generated base
882
+ // column has a recoverable value: projected (exposed) or carries an insert
883
+ // default. Generated columns are computed/auto; nullable columns take null;
884
+ // declared-default columns supply themselves.
885
+ for (const col of tbl.columns) {
886
+ if (col.generated || !col.notNull || col.defaultValue != null)
887
+ continue;
888
+ const name = col.name.toLowerCase();
889
+ if (!exp.has(name) && !def.has(name)) {
890
+ isInsertableInto = false;
891
+ break;
892
+ }
893
+ }
894
+ }
895
+ return {
896
+ isInsertableInto,
897
+ isUpdatable: anyBase,
898
+ isDeletable,
899
+ effectiveTargets: [...targetNames].sort(),
900
+ };
901
+ }
902
+ // View updateability function (table-valued function)
903
+ export const viewInfoFunc = createIntegratedTableValuedFunction({
904
+ name: 'view_info',
905
+ numArgs: -1,
906
+ deterministic: false, // Schema (and therefore lineage) can change
907
+ returnType: {
908
+ typeClass: 'relation',
909
+ isReadOnly: true,
910
+ isSet: false,
911
+ columns: [
912
+ { name: 'schema', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
913
+ { name: 'name', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
914
+ { name: 'is_insertable_into', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
915
+ { name: 'is_updatable', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
916
+ { name: 'is_deletable', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
917
+ { name: 'effective_targets', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
918
+ ],
919
+ keys: [],
920
+ rowConstraints: []
921
+ },
922
+ relationalAdvertisement: {
923
+ isSet: true,
924
+ // Composite (schema, name): a view is unique per (schema, name) — guards
925
+ // against same-named views across schemas (main / temp / …).
926
+ keys: [[{ index: 0 }, { index: 1 }]],
927
+ },
928
+ }, async function* (db, filterName) {
929
+ const nameFilter = (typeof filterName === 'string') ? filterName.toLowerCase() : null;
930
+ for (const schemaInstance of db.schemaManager._getAllSchemas()) {
931
+ for (const view of schemaInstance.getAllViews()) {
932
+ if (nameFilter !== null && view.name.toLowerCase() !== nameFilter)
933
+ continue;
934
+ let info;
935
+ try {
936
+ info = deriveViewInfo(db, view);
937
+ }
938
+ catch (error) {
939
+ // Per-view conservative fallback: a body that fails to plan (stale
940
+ // source, unsupported shape) yields the all-`NO` / `[]` row rather
941
+ // than throwing the whole TVF. Logged so a genuinely unexpected
942
+ // failure is not silently swallowed.
943
+ log('conservative row for view %s.%s: %s', schemaInstance.name, view.name, error instanceof Error ? error.message : String(error));
944
+ info = CONSERVATIVE_VIEW_INFO;
945
+ }
946
+ yield [
947
+ schemaInstance.name,
948
+ view.name,
949
+ yesNo(info.isInsertableInto),
950
+ yesNo(info.isUpdatable),
951
+ yesNo(info.isDeletable),
952
+ jsonStringify(info.effectiveTargets),
953
+ ];
954
+ }
955
+ }
956
+ });
957
+ /**
958
+ * Derive the per-column updateability rows for a base table, plain view, or
959
+ * maintained table (materialized view).
960
+ *
961
+ * **Base table** (`_findTable` hit) — every non-generated column is trivially a
962
+ * `base` write target; generated columns are computed/read-only. The `schema`
963
+ * comes straight off the resolved `TableSchema.schemaName`.
964
+ *
965
+ * **Plain view** (first `getView` hit across schemas, main→temp→attached order
966
+ * mirroring `_findTable`) — plan the body **logically** (via `_buildPlan`, not
967
+ * `getPlan`, for the same lineage-preservation reason as `deriveViewInfo`) and
968
+ * read each output attribute's backward `updateLineage` site. A `base` site
969
+ * (unwrapped through `null-extended`) that resolves to a `TableReferenceNode`
970
+ * is updatable and carries its base table/column trace; everything else is
971
+ * read-only with `null` trace.
972
+ *
973
+ * Throws `'<name>' not found` when neither resolves (parity with `table_info`'s
974
+ * required-target posture — `column_info` takes a *required* name, unlike
975
+ * `view_info`'s optional filter). A view body that fails to plan or yields no
976
+ * relational output produces *no rows* (logged) — the conservative, never-throw
977
+ * posture `view_info` takes, but at row granularity there is no all-`NO` row to
978
+ * emit.
979
+ *
980
+ * **Maintained table** (a `TableSchema` carrying a `TableDerivation` — what
981
+ * `create materialized view` produces; detected via `isMaintainedTable`, never a
982
+ * name pattern) — write-through inherits the view-updateability rules
983
+ * (`maintainedTableViewLike` routes DML through the same view-mutation rewrite a
984
+ * plain view uses), so the per-column rows come from the SAME derivation-body
985
+ * lineage walk a plain view gets, not the trivially-all-updatable base branch:
986
+ * passthrough/rename columns report their source base column and
987
+ * `is_updatable = 'YES'`; non-invertible expression columns report `'NO'` with
988
+ * null trace. The table's own registered columns are the authoritative output
989
+ * names (the derivation's rename list is already folded into them), so they
990
+ * override the body attribute names positionally. A derivation body that fails
991
+ * to plan (e.g. stale source) degrades to conservative read-only rows over the
992
+ * registered columns — unlike the view path's no-rows fallback, the columns ARE
993
+ * known here. `view_info` continues to exclude maintained tables (its per-view
994
+ * surface stays plain-view-only); the two functions tell one consistent
995
+ * lineage story through this shared walk.
996
+ */
997
+ function deriveColumnInfo(db, name) {
998
+ // Base table first (mirrors table_info's `_findTable`-only resolution).
999
+ const table = db._findTable(name);
1000
+ if (table) {
1001
+ if (isMaintainedTable(table)) {
1002
+ const columnNames = table.columns.map(c => c.name);
1003
+ try {
1004
+ return deriveBodyColumnRows(db, table.schemaName, table.name, table.derivation.selectAst, columnNames);
1005
+ }
1006
+ catch (error) {
1007
+ // Conservative fallback: the registered columns are known even when the
1008
+ // derivation body fails to plan — report each read-only with null trace.
1009
+ log('column_info: conservative rows for maintained table %s.%s: %s', table.schemaName, table.name, error instanceof Error ? error.message : String(error));
1010
+ return columnNames.map((columnName, i) => ({
1011
+ schema: table.schemaName,
1012
+ objectName: table.name,
1013
+ cid: i,
1014
+ columnName,
1015
+ isUpdatable: false,
1016
+ baseTable: null,
1017
+ baseColumn: null,
1018
+ }));
1019
+ }
1020
+ }
1021
+ return table.columns.map((col, i) => {
1022
+ const updatable = !col.generated;
1023
+ return {
1024
+ schema: table.schemaName,
1025
+ objectName: table.name,
1026
+ cid: i,
1027
+ columnName: col.name,
1028
+ isUpdatable: updatable,
1029
+ baseTable: updatable ? table.name : null,
1030
+ baseColumn: updatable ? col.name : null,
1031
+ };
1032
+ });
1033
+ }
1034
+ // View fallback: first `getView` hit across schemas (main → temp → attached,
1035
+ // the insertion order `_getAllSchemas` yields — same order `_findTable` uses).
1036
+ let view;
1037
+ let schemaName;
1038
+ for (const schemaInstance of db.schemaManager._getAllSchemas()) {
1039
+ const v = schemaInstance.getView(name);
1040
+ if (v) {
1041
+ view = v;
1042
+ schemaName = schemaInstance.name;
1043
+ break;
1044
+ }
1045
+ }
1046
+ if (!view || schemaName === undefined) {
1047
+ throw new QuereusError(`'${name}' not found`, StatusCode.ERROR);
1048
+ }
1049
+ try {
1050
+ return deriveBodyColumnRows(db, schemaName, view.name, view.selectAst);
1051
+ }
1052
+ catch (error) {
1053
+ // A body that fails to plan (stale source, unsupported shape) yields no
1054
+ // rows rather than throwing the whole TVF — logged so a genuinely
1055
+ // unexpected failure is not silently swallowed.
1056
+ log('column_info: no rows for view %s.%s: %s', schemaName, view.name, error instanceof Error ? error.message : String(error));
1057
+ return [];
1058
+ }
1059
+ }
1060
+ /**
1061
+ * The shared body-lineage walk behind `column_info`'s view AND maintained-table
1062
+ * branches: plan `selectAst` **logically** (via `_buildPlan`, not `getPlan`, for
1063
+ * the same lineage-preservation reason as `deriveViewInfo`) and read each output
1064
+ * attribute's backward `updateLineage` site — the same classification the
1065
+ * write-through rewrite applies, so the static surface agrees with the dynamic
1066
+ * `propagate()` truth for both surfaces. Throws on plan failure; each caller
1067
+ * supplies its own conservative fallback. `columnNames`, when given (the
1068
+ * maintained-table caller), positionally overrides the body attribute names —
1069
+ * the owning table's registered columns are the authoritative output names.
1070
+ * Lineage classification (set-op flag membership) still keys off the body
1071
+ * attribute names the AST probes report.
1072
+ */
1073
+ function deriveBodyColumnRows(db, schemaName, objectName, selectAst, columnNames) {
1074
+ const { plan } = db._buildPlan([selectAst]);
1075
+ const root = plan.getRelations()[0];
1076
+ if (!root)
1077
+ return [];
1078
+ const nodes = collectBodyNodes(root);
1079
+ // Set-operation membership body: every column is writable through an *effect*, not a
1080
+ // base mapping — a membership flag flips its branch's presence (insert/delete), a data
1081
+ // column fans out to its member branches (`set-op-membership-write`). So each reports
1082
+ // `is_updatable = 'YES'` with `base_table` / `base_column` = null (no single base
1083
+ // column), the same writable-through-effect shape a join-side existence flag reports.
1084
+ //
1085
+ // Gated on the branch-writability shape probe (parity with `deriveViewInfo`): a body
1086
+ // the dynamic write rejects (outer LIMIT/OFFSET, non-SELECT right, `select *` leg,
1087
+ // computed leg, mismatched leg arity) falls THROUGH to the per-column walk below
1088
+ // instead of the all-`YES` short-circuit. That walk reports every column non-updatable
1089
+ // with null base — a `SetOperationNode` root threads `updateLineage` ONLY for its
1090
+ // membership flags (a read-only `set-op-branch` existence site) and NONE for its data
1091
+ // columns, so `baseSiteOf` resolves no base for either, matching the dynamic reject.
1092
+ // Nested (subtree) operands (`nestable-flagged-set-ops`): data columns + own flags stay
1093
+ // writable-through-effect (`YES`); a SURFACED INNER flag (`inB`/`inC`) is read-only (`NO`) —
1094
+ // writing it addresses a branch inside a subtree (product-coordinate `set-op-membership-nested`).
1095
+ // Empty surfaced-inner set (the binary case) => all-`YES`, unchanged.
1096
+ if (isSetOpMembershipBody(selectAst) && isSetOpBranchWritable(selectAst)) {
1097
+ const innerFlags = new Set(surfacedInnerFlagNames(selectAst).map(n => n.toLowerCase()));
1098
+ return root.getAttributes().map((attr, i) => ({
1099
+ schema: schemaName,
1100
+ objectName,
1101
+ cid: i,
1102
+ columnName: columnNames?.[i] ?? attr.name,
1103
+ isUpdatable: !innerFlags.has(attr.name.toLowerCase()),
1104
+ baseTable: null,
1105
+ baseColumn: null,
1106
+ }));
1107
+ }
1108
+ // Flag-less predicate-honest set-op body (`set-op-flagless-predicate-honest-writes`):
1109
+ // a plain (writable) data column reports `is_updatable = YES` (its data-column fan-out
1110
+ // writes the base column through every consistent leg); a literal **discriminator**
1111
+ // column reports `NO` (read-only — it routes rows and has no base inverse, surfacing
1112
+ // `no-inverse` on the dynamic write). Both with null base (no single base column). Gated
1113
+ // on the same shape recognizer as `deriveViewInfo`, so the static and dynamic answers
1114
+ // cannot drift.
1115
+ if (isSetOpFlaglessWritableBody(selectAst)) {
1116
+ const discriminators = new Set(flaglessDiscriminatorColumnNames(selectAst).map(n => n.toLowerCase()));
1117
+ return root.getAttributes().map((attr, i) => ({
1118
+ schema: schemaName,
1119
+ objectName,
1120
+ cid: i,
1121
+ columnName: columnNames?.[i] ?? attr.name,
1122
+ isUpdatable: !discriminators.has(attr.name.toLowerCase()),
1123
+ baseTable: null,
1124
+ baseColumn: null,
1125
+ }));
1126
+ }
1127
+ // Non-decomposable join shape gate: cross / comma / subquery-source join bodies
1128
+ // are not write-through-able. `propagate()` decomposes an n-way (≥2) equi-join —
1129
+ // `inner`/`left`/`right`/`full` (RIGHT now admitted, the LEFT mirror; FULL self-conservatizes), composite-PK
1130
+ // sides and self-joins included
1131
+ // (`isDecomposableJoinBody`, the boolean shadow of `collectJoinSources`) — and
1132
+ // rejects every other join shape, so without this gate `baseSiteOf` would resolve
1133
+ // their bases and over-report `is_updatable = 'YES'`. Outer joins ARE decomposable
1134
+ // now; their non-preserved columns are reported updatable per-column below when a
1135
+ // preserved anchor exists (matching the dynamic matched-update / null-extended-insert
1136
+ // materialization), rather than short-circuiting the whole view to all-`NO`.
1137
+ const unsupportedJoinShape = isJoinBody(selectAst) && !isDecomposableJoinBody(selectAst);
1138
+ const tableRefsById = buildTableRefsById(nodes);
1139
+ const rootLineage = root.physical?.updateLineage;
1140
+ const attrs = root.getAttributes();
1141
+ // Whether the body exposes a PRESERVED base column — a preserved anchor that pins
1142
+ // each view row's identity. A LEFT join has one (the preserved side); a FULL outer
1143
+ // join (every column null-extended) does not, so a non-preserved update there stays
1144
+ // deferred. A non-preserved (`null-extended`) column is now updatable WHEN such an
1145
+ // anchor exists: the matched-update / null-extended-insert materialization keys off
1146
+ // it (`view-write-optional-member-transitions`), matching the dynamic accept.
1147
+ const hasPreservedBase = !unsupportedJoinShape && attrs.some(a => {
1148
+ const s = baseSiteOf(rootLineage?.get(a.id));
1149
+ return s !== undefined && !s.nullExtended;
1150
+ });
1151
+ const rows = [];
1152
+ for (let i = 0; i < attrs.length; i++) {
1153
+ const attr = attrs[i];
1154
+ const site = unsupportedJoinShape ? undefined : rootLineage?.get(attr.id);
1155
+ const bs = baseSiteOf(site);
1156
+ const ref = bs ? tableRefsById.get(bs.table) : undefined;
1157
+ // A join-side `exists … as` existence flag has NO base column but is writable
1158
+ // through an *effect* — its flip inserts/deletes the non-preserved side — when a
1159
+ // preserved anchor pins each row's identity (`outer-join-existence-column`).
1160
+ // Report it `is_updatable = 'YES'` with `base_table` / `base_column` = null (it
1161
+ // maps to no base column), matching the dynamic `propagate()` accept. Gated on a
1162
+ // preserved anchor like the non-preserved column: a FULL outer (none) stays
1163
+ // deferred. A `set-op-branch` existence flag is READ-ONLY in this read half
1164
+ // (`set-op-membership-read`) — it reports `is_updatable = 'NO'` with null base
1165
+ // (a set-op view has no preserved base anchor anyway); the write half flips it on.
1166
+ const isExistence = site?.kind === 'existence' && site.component.kind === 'join-side' && hasPreservedBase;
1167
+ // An authored (`with inverse`) column is writable (and insertable) through its
1168
+ // put expressions — report it updatable, with the base trace populated only
1169
+ // for a single-put inverse (a multi-target inverse maps to no single base
1170
+ // column, the same null-base shape an existence flag reports). Agrees with
1171
+ // the dynamic spines, which route authored sites on UPDATE and INSERT alike.
1172
+ const authored = site?.kind === 'authored' ? site : undefined;
1173
+ const authoredPutRef = authored && authored.puts.length === 1
1174
+ ? tableRefsById.get(authored.puts[0].table)
1175
+ : undefined;
1176
+ // Updatable iff a base site resolves to a producing TableReferenceNode. A
1177
+ // PRESERVED base column is always updatable; a non-preserved (`null-extended`)
1178
+ // column is updatable when the body has a preserved anchor (the matched-update /
1179
+ // null-extended-insert materialization pins identity off it), and read-only only
1180
+ // when no anchor exists (a FULL outer — write-through stays deferred there). A
1181
+ // base id without a resolved ref should not happen; fail conservative if it does.
1182
+ const updatable = isExistence || authored !== undefined || !!(bs && ref && (!bs.nullExtended || hasPreservedBase));
1183
+ // Base trace is reported only for an actual base column write (an existence flag
1184
+ // is updatable but has no base mapping).
1185
+ const hasBaseTrace = updatable && bs !== undefined && ref !== undefined;
1186
+ rows.push({
1187
+ schema: schemaName,
1188
+ objectName,
1189
+ cid: i,
1190
+ columnName: columnNames?.[i] ?? attr.name,
1191
+ isUpdatable: updatable,
1192
+ baseTable: hasBaseTrace ? ref.tableSchema.name : authoredPutRef ? authoredPutRef.tableSchema.name : null,
1193
+ baseColumn: hasBaseTrace ? bs.baseColumn : authoredPutRef ? authored.puts[0].baseColumn : null,
1194
+ });
1195
+ }
1196
+ return rows;
1197
+ }
1198
+ // Per-column updateability function (table-valued function)
1199
+ export const columnInfoFunc = createIntegratedTableValuedFunction({
1200
+ name: 'column_info',
1201
+ numArgs: 1,
1202
+ deterministic: false, // Schema (and therefore lineage) can change
1203
+ returnType: {
1204
+ typeClass: 'relation',
1205
+ isReadOnly: true,
1206
+ isSet: false,
1207
+ columns: [
1208
+ { name: 'schema', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
1209
+ { name: 'name', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
1210
+ { name: 'cid', type: { typeClass: 'scalar', logicalType: INTEGER_TYPE, nullable: false, isReadOnly: true }, generated: true },
1211
+ { name: 'column_name', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
1212
+ { name: 'is_updatable', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
1213
+ { name: 'base_table', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: true, isReadOnly: true }, generated: true },
1214
+ { name: 'base_column', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: true, isReadOnly: true }, generated: true },
1215
+ ],
1216
+ keys: [],
1217
+ rowConstraints: []
1218
+ },
1219
+ relationalAdvertisement: {
1220
+ isSet: true,
1221
+ // `cid` (column 2) is the column ordinal — unique per emitted row.
1222
+ keys: [[{ index: 2 }]],
1223
+ },
1224
+ }, async function* (db, tableName) {
1225
+ if (typeof tableName !== 'string') {
1226
+ throw new QuereusError('column_info() requires a table or view name string argument', StatusCode.ERROR);
1227
+ }
1228
+ for (const r of deriveColumnInfo(db, tableName)) {
1229
+ yield [
1230
+ r.schema,
1231
+ r.objectName,
1232
+ r.cid,
1233
+ r.columnName,
1234
+ yesNo(r.isUpdatable),
1235
+ r.baseTable,
1236
+ r.baseColumn,
1237
+ ];
1238
+ }
1239
+ });
551
1240
  //# sourceMappingURL=schema.js.map