@quereus/quereus 3.3.0 → 4.0.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 +203 -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 +713 -26
  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 +9 -0
  80. package/dist/src/func/registration.d.ts.map +1 -1
  81. package/dist/src/func/registration.js +4 -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 +13 -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 +6 -5
@@ -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()) {
@@ -326,11 +363,19 @@ export const indexInfoFunc = createIntegratedTableValuedFunction({
326
363
  if (!table) {
327
364
  throw new QuereusError(`Table '${tableName}' not found`, StatusCode.ERROR);
328
365
  }
329
- if (!table.indexes)
366
+ // Real indexes plus any exposed implicit covering index the backend did NOT
367
+ // materialize as an `IndexSchema` (store mode). In memory mode the second
368
+ // list is empty (the name already lives in `table.indexes`), so the row set
369
+ // matches across backends. Synthetic descriptors carry no `unique` flag —
370
+ // UNIQUE enforcement routes through `uniqueConstraints` — so they report
371
+ // `unique = 0`, mirroring the memory materialized entry.
372
+ const realIndexes = table.indexes ?? [];
373
+ const synthetic = exposedImplicitIndexes(table);
374
+ if (realIndexes.length === 0 && synthetic.length === 0)
330
375
  return;
331
- for (const idx of table.indexes) {
376
+ for (const idx of [...realIndexes, ...synthetic]) {
332
377
  const tagJson = tagsToJson(idx.tags);
333
- const uniqueFlag = idx.unique ? 1 : 0;
378
+ const uniqueFlag = ('unique' in idx && idx.unique) ? 1 : 0;
334
379
  const partialFlag = idx.predicate ? 1 : 0;
335
380
  for (let seq = 0; seq < idx.columns.length; seq++) {
336
381
  const col = idx.columns[seq];
@@ -548,4 +593,646 @@ export const functionInfoFunc = createIntegratedTableValuedFunction({
548
593
  yield ['error', -1, 'error', 0, 0, `Failed to get function info: ${error.message}`];
549
594
  }
550
595
  });
596
+ /** The conservative all-`NO` / `[]` row for a body with no recoverable base lineage. */
597
+ const CONSERVATIVE_VIEW_INFO = {
598
+ isInsertableInto: false,
599
+ isUpdatable: false,
600
+ isDeletable: false,
601
+ effectiveTargets: [],
602
+ };
603
+ /** SQL-standard `'YES'`/`'NO'` text encoding for a boolean updateability flag. */
604
+ function yesNo(value) {
605
+ return value ? 'YES' : 'NO';
606
+ }
607
+ /**
608
+ * Resolve an UpdateSite to its underlying base reference: the producing
609
+ * `TableReferenceNode` id + base column for a `base` site (plain or `null-extended`),
610
+ * else `undefined` (a `computed` / leaf-less site). `nullExtended` is true when an
611
+ * outer-join `null-extended` layer was unwrapped to reach the base — the column names a
612
+ * base table/column (so it is insertable through the both-sides envelope and counts as
613
+ * an effective target) but is read-only on UPDATE (the deferred per-row materialization),
614
+ * so the per-column / `is_updatable` surfaces report it non-updatable.
615
+ */
616
+ function baseSiteOf(site) {
617
+ let s = site;
618
+ let nullExtended = false;
619
+ while (s && s.kind === 'null-extended') {
620
+ nullExtended = true;
621
+ s = s.inner;
622
+ }
623
+ return s && s.kind === 'base' ? { table: s.table, baseColumn: s.baseColumn, nullExtended } : undefined;
624
+ }
625
+ /** Every relational node in the planned body (deduped), root-first. */
626
+ function collectBodyNodes(root) {
627
+ const out = [];
628
+ const seen = new Set();
629
+ const visit = (n) => {
630
+ if (seen.has(n))
631
+ return;
632
+ seen.add(n);
633
+ out.push(n);
634
+ for (const child of n.getRelations())
635
+ visit(child);
636
+ };
637
+ visit(root);
638
+ return out;
639
+ }
640
+ /**
641
+ * Index every `TableReferenceNode` in a planned body by its numeric node id.
642
+ * Shared by `deriveViewInfo` and `deriveColumnInfo`: an UpdateSite's `table`
643
+ * field is the producing reference's id, which both surfaces resolve back to a
644
+ * base-table name through this map.
645
+ */
646
+ function buildTableRefsById(nodes) {
647
+ const tableRefsById = new Map();
648
+ for (const n of nodes) {
649
+ if (n instanceof TableReferenceNode)
650
+ tableRefsById.set(Number(n.id), n);
651
+ }
652
+ return tableRefsById;
653
+ }
654
+ /** Record `baseColumn` (lowercased) as defaultable for base table `table`. */
655
+ function addDefaultable(map, table, baseColumn) {
656
+ const set = map.get(table) ?? new Set();
657
+ set.add(baseColumn.toLowerCase());
658
+ map.set(table, set);
659
+ }
660
+ /**
661
+ * Derive the four view-level updateability columns statically from the planned
662
+ * view body. The **logical** tree is used deliberately (via `_buildPlan`, not
663
+ * `getPlan`): it preserves the Project/Filter/Join/TableReference operator
664
+ * structure that threads `updateLineage`, whereas the optimizer degrades a join's
665
+ * top-node lineage to `computed` (docs/view-updateability.md § surface authority).
666
+ * This mirrors the view-mutation substrate (`planner/mutation/*`), which plans the
667
+ * body logically for the same reason — so `effective_targets` agrees with the
668
+ * base set `propagate()` reaches.
669
+ *
670
+ * Re-plans on every call (same re-plan-on-read posture as `deriveBackingShape`);
671
+ * caching is a later optimization.
672
+ */
673
+ function deriveViewInfo(db, view) {
674
+ const { plan } = db._buildPlan([view.selectAst]);
675
+ const root = plan.getRelations()[0];
676
+ if (!root)
677
+ return CONSERVATIVE_VIEW_INFO;
678
+ const nodes = collectBodyNodes(root);
679
+ // The minimal `MutableViewLike` the set-op insertability probe re-derives the branches from
680
+ // (the same `{ name, schemaName, selectAst }` shape the write path / `deriveBackingShape` use).
681
+ const viewAsMutable = { name: view.name, schemaName: view.schemaName, selectAst: view.selectAst };
682
+ // Set-operation membership body: the per-branch fan-out makes the view
683
+ // insertable-into (flag-routed insert-through), updatable (membership flip + data
684
+ // fan-out), and deletable (delete fan-out), agreeing with the dynamic `propagate()`
685
+ // truth (`set-op-membership-write`). The effective targets are the branch base
686
+ // tables. A plain (flag-less) set-op body is NOT this case — it falls through to the
687
+ // `targetIds.size === 0` conservative row below (no membership column to address a branch).
688
+ if (isSetOpMembershipBody(view.selectAst)) {
689
+ // Branch-writability shape gate (mirrors the non-decomposable join shape gate below):
690
+ // a membership body the dynamic write (`analyzeSetOpView`) would reject — an outer
691
+ // LIMIT/OFFSET (non-decomposable window), a non-SELECT right operand, a `select *`
692
+ // leg, a computed leg, or legs with mismatched column counts — is gated out here.
693
+ // Without this gate the
694
+ // surface would over-claim writable from the membership flag's presence alone; report
695
+ // the conservative all-`NO` row to agree with the dynamic `propagate()` reject.
696
+ if (!isSetOpBranchWritable(view.selectAst))
697
+ return CONSERVATIVE_VIEW_INFO;
698
+ const targets = [...new Set([...buildTableRefsById(nodes).values()].map(r => r.tableSchema.name))].sort();
699
+ // Update / delete fan-out recurses through a subtree operand to its member leaves
700
+ // (`nestable-flagged-set-ops`) AND composes a multi-source (INNER join) branch
701
+ // (`set-op-write-multisource-leg-compose`), so updatable / deletable stay YES at any depth.
702
+ // Insert through a join branch is now SHIPPED via the nested shared-surrogate envelope splice
703
+ // (`set-op-write-multisource-leg-insert`), so `is_insertable_into` is YES for a body whose
704
+ // join branches are ALL insertable — re-derived dynamically by `setOpJoinLegsInsertable`
705
+ // (NO for a composite-key / no-default / non-equi join branch). It stays NO when EITHER
706
+ // operand is a subtree: inserting into a multi-leaf subtree has no single deterministic
707
+ // target leaf (product-coordinate addressing — `set-op-membership-nested`).
708
+ const isInsertableInto = !setOpHasSubtreeOperand(view.selectAst)
709
+ && setOpJoinLegsInsertable(db._buildProbeContext(), viewAsMutable);
710
+ return { isInsertableInto, isUpdatable: true, isDeletable: true, effectiveTargets: targets };
711
+ }
712
+ // Flag-less predicate-honest set-op body (`set-op-flagless-predicate-honest-writes`): a
713
+ // flag-less body of literal-discriminator legs is insertable (routed to the consistent
714
+ // legs), updatable (data-column fan-out; the literal discriminators are read-only), and
715
+ // deletable (fan-out) — agreeing with the dynamic `buildFlaglessSetOpWrite` truth. The
716
+ // recognizer is the static shadow of the dynamic write's shape acceptance (it admits
717
+ // literal projections, unlike the membership probe), so a body it rejects (outer
718
+ // LIMIT/OFFSET, `select *` / computed leg, deep intersect/except) falls through to the
719
+ // `targetIds.size === 0` conservative row below.
720
+ if (isSetOpFlaglessWritableBody(view.selectAst)) {
721
+ const targets = [...new Set([...buildTableRefsById(nodes).values()].map(r => r.tableSchema.name))].sort();
722
+ // Insert through a multi-source (join) leg is now SHIPPED via the nested shared-surrogate
723
+ // envelope splice (`set-op-write-multisource-leg-insert`), so `is_insertable_into` is YES for
724
+ // a body whose join legs are ALL insertable — re-derived dynamically by
725
+ // `setOpJoinLegsInsertable` (NO for a composite-key / no-default / non-equi join leg) —
726
+ // matching the dynamic `buildFlaglessInsert`; UPDATE / DELETE through the join leg stay YES.
727
+ const isInsertableInto = setOpJoinLegsInsertable(db._buildProbeContext(), viewAsMutable);
728
+ return { isInsertableInto, isUpdatable: true, isDeletable: true, effectiveTargets: targets };
729
+ }
730
+ // Non-decomposable join shape gate: cross / comma (implicit) / subquery- or
731
+ // function-source join bodies are not write-through-able, so they must report the
732
+ // conservative all-`NO` row. `propagate()` decomposes an n-way (≥2) equi-join —
733
+ // `inner`/`left`/`right`/`full` (RIGHT now admitted, the LEFT mirror; FULL self-conservatizes), composite-PK
734
+ // sides and self-joins included
735
+ // (`isDecomposableJoinBody`, the boolean shadow of `collectJoinSources`) — and rejects
736
+ // every other join shape, so without this gate the target walk below would resolve
737
+ // their bases and over-report `is_updatable = 'YES'`. Outer joins ARE decomposable
738
+ // now (partially writable), so they flow through to the per-column walk, which reports
739
+ // a non-preserved (`null-extended`) column non-updatable via `baseSiteOf().nullExtended`
740
+ // — agreeing with the dynamic `propagate()` truth (a non-preserved update rejects).
741
+ if (isJoinBody(view.selectAst) && !isDecomposableJoinBody(view.selectAst)) {
742
+ return CONSERVATIVE_VIEW_INFO;
743
+ }
744
+ const tableRefsById = buildTableRefsById(nodes);
745
+ // Output-column lineage: effective targets, the per-table set of base columns
746
+ // exposed by the projection, and the is_updatable flag (≥1 output column with a
747
+ // PRESERVED base site — a non-preserved `null-extended` column is read-only on
748
+ // update, so it does not make the view updatable). `preservedTargets` are the base
749
+ // tables a column reaches non-null-extended — the only ones a DELETE routes to
750
+ // (§ Outer Joins — Deletes), so they alone gate deletability below.
751
+ const rootLineage = root.physical?.updateLineage;
752
+ const targetIds = new Set();
753
+ const preservedTargets = new Set();
754
+ const exposed = new Map();
755
+ let anyBase = false;
756
+ for (const attr of root.getAttributes()) {
757
+ const site = rootLineage?.get(attr.id);
758
+ // An authored (`with inverse`) column exposes each put's target base column —
759
+ // it is writable through the put expressions, so the targets count toward base
760
+ // reachability exactly like identity columns. INSERT coverage (`exposed`) is
761
+ // counted only for a single-source body: the single-source spine evaluates the
762
+ // puts per supplied row, but the multi-source insert envelope defers authored
763
+ // puts, so counting them there would over-report `is_insertable_into`.
764
+ if (site?.kind === 'authored') {
765
+ for (const put of site.puts) {
766
+ anyBase = true;
767
+ preservedTargets.add(put.table);
768
+ targetIds.add(put.table);
769
+ if (!isJoinBody(view.selectAst)) {
770
+ const set = exposed.get(put.table) ?? new Set();
771
+ set.add(put.baseColumn.toLowerCase());
772
+ exposed.set(put.table, set);
773
+ }
774
+ }
775
+ continue;
776
+ }
777
+ const bs = baseSiteOf(site);
778
+ if (!bs)
779
+ continue;
780
+ if (!bs.nullExtended) {
781
+ anyBase = true;
782
+ preservedTargets.add(bs.table);
783
+ }
784
+ targetIds.add(bs.table);
785
+ // A null-extended column still exposes its base column for INSERT coverage (the
786
+ // both-sides envelope supplies it) — add it regardless of preservation.
787
+ const set = exposed.get(bs.table) ?? new Set();
788
+ set.add(bs.baseColumn.toLowerCase());
789
+ exposed.set(bs.table, set);
790
+ }
791
+ // No base lineage at the root ⇒ wholly read-only (VALUES / aggregate / set-op /
792
+ // computed-only / recursive-CTE body). The conservative row falls straight out.
793
+ if (targetIds.size === 0)
794
+ return CONSERVATIVE_VIEW_INFO;
795
+ // No PRESERVED base column ⇒ a FULL outer join (every side null-extended), or a
796
+ // LEFT/RIGHT body that projects away its whole preserved side. v1 defers write-through
797
+ // there (a full-outer write is per-row — § Outer Joins; a RIGHT body now reaches here
798
+ // but always has a preserved anchor), so report the conservative
799
+ // row, agreeing with the dynamic rejects (`unsupported-outer-join-update` on update,
800
+ // `unsupported-join` on delete/insert through a side-less preserved set).
801
+ if (preservedTargets.size === 0)
802
+ return CONSERVATIVE_VIEW_INFO;
803
+ // Defaultable base columns: every (node, attribute) carrying an insert default
804
+ // (`constant-fd` selection pin, declared `base-default`, `view-insert-default`),
805
+ // resolved through THAT node's own lineage back to a base column. Walking the
806
+ // whole spine — not just the root — recovers a *projected-away* constant-FD
807
+ // column (e.g. `select name from t where color = 'green'`, where `color`'s
808
+ // default lives on the Filter, below the projection that drops it).
809
+ const defaultable = new Map();
810
+ for (const n of nodes) {
811
+ const nl = n.physical?.updateLineage;
812
+ const nd = n.physical?.attributeDefaults;
813
+ if (!nl || !nd)
814
+ continue;
815
+ for (const attrId of nd.keys()) {
816
+ const bs = baseSiteOf(nl.get(attrId));
817
+ if (!bs)
818
+ continue;
819
+ addDefaultable(defaultable, bs.table, bs.baseColumn);
820
+ }
821
+ }
822
+ // View-level insert defaults (Divergence 1): the `view-insert-default`
823
+ // provenance is never threaded onto `PhysicalProperties` (it is consumed only
824
+ // in the rewrite), so this body is planned without the view's defaults and the
825
+ // walk above misses them. Fold each `with defaults (col = expr, …)` clause
826
+ // column (now stored on the body select AST) into `defaultable` directly,
827
+ // mirroring `resolveDefaultForColumn` — a base column of a reachable target
828
+ // (the common projected-away case) or a visible view-output column with base
829
+ // lineage. Unlike the rewrite, an unresolvable name is silently skipped: a
830
+ // read-only introspection surface stays on its never-throw posture (the
831
+ // per-view try/catch would otherwise collapse the row to all-`NO`).
832
+ const defaultedColumns = new Set((bodyDefaults(view.selectAst) ?? []).map(d => d.column.toLowerCase()));
833
+ for (const colName of defaultedColumns) {
834
+ let resolved = false;
835
+ for (const id of targetIds) {
836
+ const match = tableRefsById.get(id)?.tableSchema.columns
837
+ .find(c => c.name.toLowerCase() === colName);
838
+ if (match) {
839
+ addDefaultable(defaultable, id, match.name);
840
+ resolved = true;
841
+ }
842
+ }
843
+ if (resolved)
844
+ continue;
845
+ const attr = root.getAttributes().find(a => a.name.toLowerCase() === colName);
846
+ const bs = attr && baseSiteOf(rootLineage?.get(attr.id));
847
+ if (bs)
848
+ addDefaultable(defaultable, bs.table, bs.baseColumn);
849
+ }
850
+ const targetNames = new Set();
851
+ let isDeletable = true;
852
+ let isInsertableInto = true;
853
+ for (const id of targetIds) {
854
+ const ref = tableRefsById.get(id);
855
+ if (!ref) {
856
+ // A base-site id with no resolved TableReferenceNode should not happen
857
+ // (root lineage ids come from the nodes we collected); fail conservative.
858
+ isDeletable = false;
859
+ isInsertableInto = false;
860
+ continue;
861
+ }
862
+ const tbl = ref.tableSchema;
863
+ targetNames.add(tbl.name);
864
+ const exp = exposed.get(id) ?? new Set();
865
+ const def = defaultable.get(id) ?? new Set();
866
+ // Deletability + insertability are decided over the PRESERVED targets only — a
867
+ // non-preserved (outer-join) target is never the delete route (deleting it merely
868
+ // null-extends the row — § Outer Joins — Deletes) and is an *optional* member of
869
+ // the insert fan-out (the preserved-only insert omits it). So a non-preserved
870
+ // target's unexposed PK / uncovered not-null column does not block either flag; a
871
+ // real both-sides insert that DOES supply it is gated at runtime instead.
872
+ if (!preservedTargets.has(id))
873
+ continue;
874
+ // Deletable iff every preserved target's PK is exposed through base lineage (so
875
+ // `pk = <view value>` is constructible). A keyless preserved base is undeletable.
876
+ const pkCols = tbl.primaryKeyDefinition.map(pk => tbl.columns[pk.index].name.toLowerCase());
877
+ if (pkCols.length === 0 || !pkCols.every(c => exp.has(c)))
878
+ isDeletable = false;
879
+ // Insertable iff every not-null-without-declared-default, non-generated base
880
+ // column has a recoverable value: projected (exposed) or carries an insert
881
+ // default. Generated columns are computed/auto; nullable columns take null;
882
+ // declared-default columns supply themselves.
883
+ for (const col of tbl.columns) {
884
+ if (col.generated || !col.notNull || col.defaultValue != null)
885
+ continue;
886
+ const name = col.name.toLowerCase();
887
+ if (!exp.has(name) && !def.has(name)) {
888
+ isInsertableInto = false;
889
+ break;
890
+ }
891
+ }
892
+ }
893
+ return {
894
+ isInsertableInto,
895
+ isUpdatable: anyBase,
896
+ isDeletable,
897
+ effectiveTargets: [...targetNames].sort(),
898
+ };
899
+ }
900
+ // View updateability function (table-valued function)
901
+ export const viewInfoFunc = createIntegratedTableValuedFunction({
902
+ name: 'view_info',
903
+ numArgs: -1,
904
+ deterministic: false, // Schema (and therefore lineage) can change
905
+ returnType: {
906
+ typeClass: 'relation',
907
+ isReadOnly: true,
908
+ isSet: false,
909
+ columns: [
910
+ { name: 'schema', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
911
+ { name: 'name', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
912
+ { name: 'is_insertable_into', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
913
+ { name: 'is_updatable', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
914
+ { name: 'is_deletable', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
915
+ { name: 'effective_targets', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
916
+ ],
917
+ keys: [],
918
+ rowConstraints: []
919
+ },
920
+ relationalAdvertisement: {
921
+ isSet: true,
922
+ // Composite (schema, name): a view is unique per (schema, name) — guards
923
+ // against same-named views across schemas (main / temp / …).
924
+ keys: [[{ index: 0 }, { index: 1 }]],
925
+ },
926
+ }, async function* (db, filterName) {
927
+ const nameFilter = (typeof filterName === 'string') ? filterName.toLowerCase() : null;
928
+ for (const schemaInstance of db.schemaManager._getAllSchemas()) {
929
+ for (const view of schemaInstance.getAllViews()) {
930
+ if (nameFilter !== null && view.name.toLowerCase() !== nameFilter)
931
+ continue;
932
+ let info;
933
+ try {
934
+ info = deriveViewInfo(db, view);
935
+ }
936
+ catch (error) {
937
+ // Per-view conservative fallback: a body that fails to plan (stale
938
+ // source, unsupported shape) yields the all-`NO` / `[]` row rather
939
+ // than throwing the whole TVF. Logged so a genuinely unexpected
940
+ // failure is not silently swallowed.
941
+ log('conservative row for view %s.%s: %s', schemaInstance.name, view.name, error instanceof Error ? error.message : String(error));
942
+ info = CONSERVATIVE_VIEW_INFO;
943
+ }
944
+ yield [
945
+ schemaInstance.name,
946
+ view.name,
947
+ yesNo(info.isInsertableInto),
948
+ yesNo(info.isUpdatable),
949
+ yesNo(info.isDeletable),
950
+ jsonStringify(info.effectiveTargets),
951
+ ];
952
+ }
953
+ }
954
+ });
955
+ /**
956
+ * Derive the per-column updateability rows for a base table, plain view, or
957
+ * maintained table (materialized view).
958
+ *
959
+ * **Base table** (`_findTable` hit) — every non-generated column is trivially a
960
+ * `base` write target; generated columns are computed/read-only. The `schema`
961
+ * comes straight off the resolved `TableSchema.schemaName`.
962
+ *
963
+ * **Plain view** (first `getView` hit across schemas, main→temp→attached order
964
+ * mirroring `_findTable`) — plan the body **logically** (via `_buildPlan`, not
965
+ * `getPlan`, for the same lineage-preservation reason as `deriveViewInfo`) and
966
+ * read each output attribute's backward `updateLineage` site. A `base` site
967
+ * (unwrapped through `null-extended`) that resolves to a `TableReferenceNode`
968
+ * is updatable and carries its base table/column trace; everything else is
969
+ * read-only with `null` trace.
970
+ *
971
+ * Throws `'<name>' not found` when neither resolves (parity with `table_info`'s
972
+ * required-target posture — `column_info` takes a *required* name, unlike
973
+ * `view_info`'s optional filter). A view body that fails to plan or yields no
974
+ * relational output produces *no rows* (logged) — the conservative, never-throw
975
+ * posture `view_info` takes, but at row granularity there is no all-`NO` row to
976
+ * emit.
977
+ *
978
+ * **Maintained table** (a `TableSchema` carrying a `TableDerivation` — what
979
+ * `create materialized view` produces; detected via `isMaintainedTable`, never a
980
+ * name pattern) — write-through inherits the view-updateability rules
981
+ * (`maintainedTableViewLike` routes DML through the same view-mutation rewrite a
982
+ * plain view uses), so the per-column rows come from the SAME derivation-body
983
+ * lineage walk a plain view gets, not the trivially-all-updatable base branch:
984
+ * passthrough/rename columns report their source base column and
985
+ * `is_updatable = 'YES'`; non-invertible expression columns report `'NO'` with
986
+ * null trace. The table's own registered columns are the authoritative output
987
+ * names (the derivation's rename list is already folded into them), so they
988
+ * override the body attribute names positionally. A derivation body that fails
989
+ * to plan (e.g. stale source) degrades to conservative read-only rows over the
990
+ * registered columns — unlike the view path's no-rows fallback, the columns ARE
991
+ * known here. `view_info` continues to exclude maintained tables (its per-view
992
+ * surface stays plain-view-only); the two functions tell one consistent
993
+ * lineage story through this shared walk.
994
+ */
995
+ function deriveColumnInfo(db, name) {
996
+ // Base table first (mirrors table_info's `_findTable`-only resolution).
997
+ const table = db._findTable(name);
998
+ if (table) {
999
+ if (isMaintainedTable(table)) {
1000
+ const columnNames = table.columns.map(c => c.name);
1001
+ try {
1002
+ return deriveBodyColumnRows(db, table.schemaName, table.name, table.derivation.selectAst, columnNames);
1003
+ }
1004
+ catch (error) {
1005
+ // Conservative fallback: the registered columns are known even when the
1006
+ // derivation body fails to plan — report each read-only with null trace.
1007
+ log('column_info: conservative rows for maintained table %s.%s: %s', table.schemaName, table.name, error instanceof Error ? error.message : String(error));
1008
+ return columnNames.map((columnName, i) => ({
1009
+ schema: table.schemaName,
1010
+ objectName: table.name,
1011
+ cid: i,
1012
+ columnName,
1013
+ isUpdatable: false,
1014
+ baseTable: null,
1015
+ baseColumn: null,
1016
+ }));
1017
+ }
1018
+ }
1019
+ return table.columns.map((col, i) => {
1020
+ const updatable = !col.generated;
1021
+ return {
1022
+ schema: table.schemaName,
1023
+ objectName: table.name,
1024
+ cid: i,
1025
+ columnName: col.name,
1026
+ isUpdatable: updatable,
1027
+ baseTable: updatable ? table.name : null,
1028
+ baseColumn: updatable ? col.name : null,
1029
+ };
1030
+ });
1031
+ }
1032
+ // View fallback: first `getView` hit across schemas (main → temp → attached,
1033
+ // the insertion order `_getAllSchemas` yields — same order `_findTable` uses).
1034
+ let view;
1035
+ let schemaName;
1036
+ for (const schemaInstance of db.schemaManager._getAllSchemas()) {
1037
+ const v = schemaInstance.getView(name);
1038
+ if (v) {
1039
+ view = v;
1040
+ schemaName = schemaInstance.name;
1041
+ break;
1042
+ }
1043
+ }
1044
+ if (!view || schemaName === undefined) {
1045
+ throw new QuereusError(`'${name}' not found`, StatusCode.ERROR);
1046
+ }
1047
+ try {
1048
+ return deriveBodyColumnRows(db, schemaName, view.name, view.selectAst);
1049
+ }
1050
+ catch (error) {
1051
+ // A body that fails to plan (stale source, unsupported shape) yields no
1052
+ // rows rather than throwing the whole TVF — logged so a genuinely
1053
+ // unexpected failure is not silently swallowed.
1054
+ log('column_info: no rows for view %s.%s: %s', schemaName, view.name, error instanceof Error ? error.message : String(error));
1055
+ return [];
1056
+ }
1057
+ }
1058
+ /**
1059
+ * The shared body-lineage walk behind `column_info`'s view AND maintained-table
1060
+ * branches: plan `selectAst` **logically** (via `_buildPlan`, not `getPlan`, for
1061
+ * the same lineage-preservation reason as `deriveViewInfo`) and read each output
1062
+ * attribute's backward `updateLineage` site — the same classification the
1063
+ * write-through rewrite applies, so the static surface agrees with the dynamic
1064
+ * `propagate()` truth for both surfaces. Throws on plan failure; each caller
1065
+ * supplies its own conservative fallback. `columnNames`, when given (the
1066
+ * maintained-table caller), positionally overrides the body attribute names —
1067
+ * the owning table's registered columns are the authoritative output names.
1068
+ * Lineage classification (set-op flag membership) still keys off the body
1069
+ * attribute names the AST probes report.
1070
+ */
1071
+ function deriveBodyColumnRows(db, schemaName, objectName, selectAst, columnNames) {
1072
+ const { plan } = db._buildPlan([selectAst]);
1073
+ const root = plan.getRelations()[0];
1074
+ if (!root)
1075
+ return [];
1076
+ const nodes = collectBodyNodes(root);
1077
+ // Set-operation membership body: every column is writable through an *effect*, not a
1078
+ // base mapping — a membership flag flips its branch's presence (insert/delete), a data
1079
+ // column fans out to its member branches (`set-op-membership-write`). So each reports
1080
+ // `is_updatable = 'YES'` with `base_table` / `base_column` = null (no single base
1081
+ // column), the same writable-through-effect shape a join-side existence flag reports.
1082
+ //
1083
+ // Gated on the branch-writability shape probe (parity with `deriveViewInfo`): a body
1084
+ // the dynamic write rejects (outer LIMIT/OFFSET, non-SELECT right, `select *` leg,
1085
+ // computed leg, mismatched leg arity) falls THROUGH to the per-column walk below
1086
+ // instead of the all-`YES` short-circuit. That walk reports every column non-updatable
1087
+ // with null base — a `SetOperationNode` root threads `updateLineage` ONLY for its
1088
+ // membership flags (a read-only `set-op-branch` existence site) and NONE for its data
1089
+ // columns, so `baseSiteOf` resolves no base for either, matching the dynamic reject.
1090
+ // Nested (subtree) operands (`nestable-flagged-set-ops`): data columns + own flags stay
1091
+ // writable-through-effect (`YES`); a SURFACED INNER flag (`inB`/`inC`) is read-only (`NO`) —
1092
+ // writing it addresses a branch inside a subtree (product-coordinate `set-op-membership-nested`).
1093
+ // Empty surfaced-inner set (the binary case) => all-`YES`, unchanged.
1094
+ if (isSetOpMembershipBody(selectAst) && isSetOpBranchWritable(selectAst)) {
1095
+ const innerFlags = new Set(surfacedInnerFlagNames(selectAst).map(n => n.toLowerCase()));
1096
+ return root.getAttributes().map((attr, i) => ({
1097
+ schema: schemaName,
1098
+ objectName,
1099
+ cid: i,
1100
+ columnName: columnNames?.[i] ?? attr.name,
1101
+ isUpdatable: !innerFlags.has(attr.name.toLowerCase()),
1102
+ baseTable: null,
1103
+ baseColumn: null,
1104
+ }));
1105
+ }
1106
+ // Flag-less predicate-honest set-op body (`set-op-flagless-predicate-honest-writes`):
1107
+ // a plain (writable) data column reports `is_updatable = YES` (its data-column fan-out
1108
+ // writes the base column through every consistent leg); a literal **discriminator**
1109
+ // column reports `NO` (read-only — it routes rows and has no base inverse, surfacing
1110
+ // `no-inverse` on the dynamic write). Both with null base (no single base column). Gated
1111
+ // on the same shape recognizer as `deriveViewInfo`, so the static and dynamic answers
1112
+ // cannot drift.
1113
+ if (isSetOpFlaglessWritableBody(selectAst)) {
1114
+ const discriminators = new Set(flaglessDiscriminatorColumnNames(selectAst).map(n => n.toLowerCase()));
1115
+ return root.getAttributes().map((attr, i) => ({
1116
+ schema: schemaName,
1117
+ objectName,
1118
+ cid: i,
1119
+ columnName: columnNames?.[i] ?? attr.name,
1120
+ isUpdatable: !discriminators.has(attr.name.toLowerCase()),
1121
+ baseTable: null,
1122
+ baseColumn: null,
1123
+ }));
1124
+ }
1125
+ // Non-decomposable join shape gate: cross / comma / subquery-source join bodies
1126
+ // are not write-through-able. `propagate()` decomposes an n-way (≥2) equi-join —
1127
+ // `inner`/`left`/`right`/`full` (RIGHT now admitted, the LEFT mirror; FULL self-conservatizes), composite-PK
1128
+ // sides and self-joins included
1129
+ // (`isDecomposableJoinBody`, the boolean shadow of `collectJoinSources`) — and
1130
+ // rejects every other join shape, so without this gate `baseSiteOf` would resolve
1131
+ // their bases and over-report `is_updatable = 'YES'`. Outer joins ARE decomposable
1132
+ // now; their non-preserved columns are reported updatable per-column below when a
1133
+ // preserved anchor exists (matching the dynamic matched-update / null-extended-insert
1134
+ // materialization), rather than short-circuiting the whole view to all-`NO`.
1135
+ const unsupportedJoinShape = isJoinBody(selectAst) && !isDecomposableJoinBody(selectAst);
1136
+ const tableRefsById = buildTableRefsById(nodes);
1137
+ const rootLineage = root.physical?.updateLineage;
1138
+ const attrs = root.getAttributes();
1139
+ // Whether the body exposes a PRESERVED base column — a preserved anchor that pins
1140
+ // each view row's identity. A LEFT join has one (the preserved side); a FULL outer
1141
+ // join (every column null-extended) does not, so a non-preserved update there stays
1142
+ // deferred. A non-preserved (`null-extended`) column is now updatable WHEN such an
1143
+ // anchor exists: the matched-update / null-extended-insert materialization keys off
1144
+ // it (`view-write-optional-member-transitions`), matching the dynamic accept.
1145
+ const hasPreservedBase = !unsupportedJoinShape && attrs.some(a => {
1146
+ const s = baseSiteOf(rootLineage?.get(a.id));
1147
+ return s !== undefined && !s.nullExtended;
1148
+ });
1149
+ const rows = [];
1150
+ for (let i = 0; i < attrs.length; i++) {
1151
+ const attr = attrs[i];
1152
+ const site = unsupportedJoinShape ? undefined : rootLineage?.get(attr.id);
1153
+ const bs = baseSiteOf(site);
1154
+ const ref = bs ? tableRefsById.get(bs.table) : undefined;
1155
+ // A join-side `exists … as` existence flag has NO base column but is writable
1156
+ // through an *effect* — its flip inserts/deletes the non-preserved side — when a
1157
+ // preserved anchor pins each row's identity (`outer-join-existence-column`).
1158
+ // Report it `is_updatable = 'YES'` with `base_table` / `base_column` = null (it
1159
+ // maps to no base column), matching the dynamic `propagate()` accept. Gated on a
1160
+ // preserved anchor like the non-preserved column: a FULL outer (none) stays
1161
+ // deferred. A `set-op-branch` existence flag is READ-ONLY in this read half
1162
+ // (`set-op-membership-read`) — it reports `is_updatable = 'NO'` with null base
1163
+ // (a set-op view has no preserved base anchor anyway); the write half flips it on.
1164
+ const isExistence = site?.kind === 'existence' && site.component.kind === 'join-side' && hasPreservedBase;
1165
+ // An authored (`with inverse`) column is writable (and insertable) through its
1166
+ // put expressions — report it updatable, with the base trace populated only
1167
+ // for a single-put inverse (a multi-target inverse maps to no single base
1168
+ // column, the same null-base shape an existence flag reports). Agrees with
1169
+ // the dynamic spines, which route authored sites on UPDATE and INSERT alike.
1170
+ const authored = site?.kind === 'authored' ? site : undefined;
1171
+ const authoredPutRef = authored && authored.puts.length === 1
1172
+ ? tableRefsById.get(authored.puts[0].table)
1173
+ : undefined;
1174
+ // Updatable iff a base site resolves to a producing TableReferenceNode. A
1175
+ // PRESERVED base column is always updatable; a non-preserved (`null-extended`)
1176
+ // column is updatable when the body has a preserved anchor (the matched-update /
1177
+ // null-extended-insert materialization pins identity off it), and read-only only
1178
+ // when no anchor exists (a FULL outer — write-through stays deferred there). A
1179
+ // base id without a resolved ref should not happen; fail conservative if it does.
1180
+ const updatable = isExistence || authored !== undefined || !!(bs && ref && (!bs.nullExtended || hasPreservedBase));
1181
+ // Base trace is reported only for an actual base column write (an existence flag
1182
+ // is updatable but has no base mapping).
1183
+ const hasBaseTrace = updatable && bs !== undefined && ref !== undefined;
1184
+ rows.push({
1185
+ schema: schemaName,
1186
+ objectName,
1187
+ cid: i,
1188
+ columnName: columnNames?.[i] ?? attr.name,
1189
+ isUpdatable: updatable,
1190
+ baseTable: hasBaseTrace ? ref.tableSchema.name : authoredPutRef ? authoredPutRef.tableSchema.name : null,
1191
+ baseColumn: hasBaseTrace ? bs.baseColumn : authoredPutRef ? authored.puts[0].baseColumn : null,
1192
+ });
1193
+ }
1194
+ return rows;
1195
+ }
1196
+ // Per-column updateability function (table-valued function)
1197
+ export const columnInfoFunc = createIntegratedTableValuedFunction({
1198
+ name: 'column_info',
1199
+ numArgs: 1,
1200
+ deterministic: false, // Schema (and therefore lineage) can change
1201
+ returnType: {
1202
+ typeClass: 'relation',
1203
+ isReadOnly: true,
1204
+ isSet: false,
1205
+ columns: [
1206
+ { name: 'schema', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
1207
+ { name: 'name', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
1208
+ { name: 'cid', type: { typeClass: 'scalar', logicalType: INTEGER_TYPE, nullable: false, isReadOnly: true }, generated: true },
1209
+ { name: 'column_name', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
1210
+ { name: 'is_updatable', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
1211
+ { name: 'base_table', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: true, isReadOnly: true }, generated: true },
1212
+ { name: 'base_column', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: true, isReadOnly: true }, generated: true },
1213
+ ],
1214
+ keys: [],
1215
+ rowConstraints: []
1216
+ },
1217
+ relationalAdvertisement: {
1218
+ isSet: true,
1219
+ // `cid` (column 2) is the column ordinal — unique per emitted row.
1220
+ keys: [[{ index: 2 }]],
1221
+ },
1222
+ }, async function* (db, tableName) {
1223
+ if (typeof tableName !== 'string') {
1224
+ throw new QuereusError('column_info() requires a table or view name string argument', StatusCode.ERROR);
1225
+ }
1226
+ for (const r of deriveColumnInfo(db, tableName)) {
1227
+ yield [
1228
+ r.schema,
1229
+ r.objectName,
1230
+ r.cid,
1231
+ r.columnName,
1232
+ yesNo(r.isUpdatable),
1233
+ r.baseTable,
1234
+ r.baseColumn,
1235
+ ];
1236
+ }
1237
+ });
551
1238
  //# sourceMappingURL=schema.js.map