@quereus/quereus 3.2.1 → 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.
- package/README.md +7 -0
- package/dist/src/common/datatype.d.ts +12 -0
- package/dist/src/common/datatype.d.ts.map +1 -1
- package/dist/src/common/datatype.js.map +1 -1
- package/dist/src/common/types.d.ts +24 -0
- package/dist/src/common/types.d.ts.map +1 -1
- package/dist/src/common/types.js.map +1 -1
- package/dist/src/core/database-assertions.d.ts +37 -9
- package/dist/src/core/database-assertions.d.ts.map +1 -1
- package/dist/src/core/database-assertions.js +62 -106
- package/dist/src/core/database-assertions.js.map +1 -1
- package/dist/src/core/database-events.d.ts +163 -0
- package/dist/src/core/database-events.d.ts.map +1 -1
- package/dist/src/core/database-events.js +235 -21
- package/dist/src/core/database-events.js.map +1 -1
- package/dist/src/core/database-external-changes.d.ts +28 -0
- package/dist/src/core/database-external-changes.d.ts.map +1 -0
- package/dist/src/core/database-external-changes.js +242 -0
- package/dist/src/core/database-external-changes.js.map +1 -0
- package/dist/src/core/database-internal.d.ts +50 -1
- package/dist/src/core/database-internal.d.ts.map +1 -1
- package/dist/src/core/database-materialized-views.d.ts +1253 -0
- package/dist/src/core/database-materialized-views.d.ts.map +1 -0
- package/dist/src/core/database-materialized-views.js +3064 -0
- package/dist/src/core/database-materialized-views.js.map +1 -0
- package/dist/src/core/database-options.d.ts +4 -0
- package/dist/src/core/database-options.d.ts.map +1 -1
- package/dist/src/core/database-options.js +10 -0
- package/dist/src/core/database-options.js.map +1 -1
- package/dist/src/core/database-transaction.d.ts +19 -3
- package/dist/src/core/database-transaction.d.ts.map +1 -1
- package/dist/src/core/database-transaction.js +30 -3
- package/dist/src/core/database-transaction.js.map +1 -1
- package/dist/src/core/database-watchers.d.ts +19 -0
- package/dist/src/core/database-watchers.d.ts.map +1 -1
- package/dist/src/core/database-watchers.js +63 -3
- package/dist/src/core/database-watchers.js.map +1 -1
- package/dist/src/core/database.d.ts +203 -11
- package/dist/src/core/database.d.ts.map +1 -1
- package/dist/src/core/database.js +493 -29
- package/dist/src/core/database.js.map +1 -1
- package/dist/src/core/derived-row-validator.d.ts +137 -0
- package/dist/src/core/derived-row-validator.d.ts.map +1 -0
- package/dist/src/core/derived-row-validator.js +314 -0
- package/dist/src/core/derived-row-validator.js.map +1 -0
- package/dist/src/core/statement.d.ts.map +1 -1
- package/dist/src/core/statement.js +30 -9
- package/dist/src/core/statement.js.map +1 -1
- package/dist/src/emit/ast-stringify.d.ts +135 -1
- package/dist/src/emit/ast-stringify.d.ts.map +1 -1
- package/dist/src/emit/ast-stringify.js +795 -120
- package/dist/src/emit/ast-stringify.js.map +1 -1
- package/dist/src/func/builtins/aggregate.d.ts.map +1 -1
- package/dist/src/func/builtins/aggregate.js +11 -10
- package/dist/src/func/builtins/aggregate.js.map +1 -1
- package/dist/src/func/builtins/builtin-window-functions.d.ts.map +1 -1
- package/dist/src/func/builtins/builtin-window-functions.js +32 -0
- package/dist/src/func/builtins/builtin-window-functions.js.map +1 -1
- package/dist/src/func/builtins/explain.d.ts +3 -0
- package/dist/src/func/builtins/explain.d.ts.map +1 -1
- package/dist/src/func/builtins/explain.js +229 -0
- package/dist/src/func/builtins/explain.js.map +1 -1
- package/dist/src/func/builtins/index.d.ts.map +1 -1
- package/dist/src/func/builtins/index.js +10 -2
- package/dist/src/func/builtins/index.js.map +1 -1
- package/dist/src/func/builtins/json.d.ts.map +1 -1
- package/dist/src/func/builtins/json.js +3 -2
- package/dist/src/func/builtins/json.js.map +1 -1
- package/dist/src/func/builtins/mutation.d.ts +2 -0
- package/dist/src/func/builtins/mutation.d.ts.map +1 -0
- package/dist/src/func/builtins/mutation.js +53 -0
- package/dist/src/func/builtins/mutation.js.map +1 -0
- package/dist/src/func/builtins/schema.d.ts +2 -0
- package/dist/src/func/builtins/schema.d.ts.map +1 -1
- package/dist/src/func/builtins/schema.js +713 -26
- package/dist/src/func/builtins/schema.js.map +1 -1
- package/dist/src/func/builtins/string.js +1 -1
- package/dist/src/func/builtins/string.js.map +1 -1
- package/dist/src/func/registration.d.ts +9 -0
- package/dist/src/func/registration.d.ts.map +1 -1
- package/dist/src/func/registration.js +4 -0
- package/dist/src/func/registration.js.map +1 -1
- package/dist/src/index.d.ts +25 -6
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +27 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/parser/ast.d.ts +353 -21
- package/dist/src/parser/ast.d.ts.map +1 -1
- package/dist/src/parser/index.d.ts +14 -1
- package/dist/src/parser/index.d.ts.map +1 -1
- package/dist/src/parser/index.js +19 -0
- package/dist/src/parser/index.js.map +1 -1
- package/dist/src/parser/lexer.d.ts +9 -0
- package/dist/src/parser/lexer.d.ts.map +1 -1
- package/dist/src/parser/lexer.js +9 -0
- package/dist/src/parser/lexer.js.map +1 -1
- package/dist/src/parser/parser.d.ts +277 -8
- package/dist/src/parser/parser.d.ts.map +1 -1
- package/dist/src/parser/parser.js +1393 -471
- package/dist/src/parser/parser.js.map +1 -1
- package/dist/src/parser/visitor.d.ts.map +1 -1
- package/dist/src/parser/visitor.js +12 -8
- package/dist/src/parser/visitor.js.map +1 -1
- package/dist/src/planner/analysis/assertion-classifier.d.ts.map +1 -1
- package/dist/src/planner/analysis/assertion-classifier.js +4 -0
- package/dist/src/planner/analysis/assertion-classifier.js.map +1 -1
- package/dist/src/planner/analysis/assertion-hoist-cache.d.ts.map +1 -1
- package/dist/src/planner/analysis/assertion-hoist-cache.js +8 -4
- package/dist/src/planner/analysis/assertion-hoist-cache.js.map +1 -1
- package/dist/src/planner/analysis/authored-inverse.d.ts +22 -0
- package/dist/src/planner/analysis/authored-inverse.d.ts.map +1 -0
- package/dist/src/planner/analysis/authored-inverse.js +267 -0
- package/dist/src/planner/analysis/authored-inverse.js.map +1 -0
- package/dist/src/planner/analysis/binding-extractor.d.ts.map +1 -1
- package/dist/src/planner/analysis/binding-extractor.js +9 -6
- package/dist/src/planner/analysis/binding-extractor.js.map +1 -1
- package/dist/src/planner/analysis/change-scope.d.ts +34 -4
- package/dist/src/planner/analysis/change-scope.d.ts.map +1 -1
- package/dist/src/planner/analysis/change-scope.js +115 -7
- package/dist/src/planner/analysis/change-scope.js.map +1 -1
- package/dist/src/planner/analysis/check-extraction.d.ts +36 -2
- package/dist/src/planner/analysis/check-extraction.d.ts.map +1 -1
- package/dist/src/planner/analysis/check-extraction.js +174 -46
- package/dist/src/planner/analysis/check-extraction.js.map +1 -1
- package/dist/src/planner/analysis/coarsened-key.d.ts +109 -0
- package/dist/src/planner/analysis/coarsened-key.d.ts.map +1 -0
- package/dist/src/planner/analysis/coarsened-key.js +228 -0
- package/dist/src/planner/analysis/coarsened-key.js.map +1 -0
- package/dist/src/planner/analysis/comparison-collation.d.ts +216 -0
- package/dist/src/planner/analysis/comparison-collation.d.ts.map +1 -0
- package/dist/src/planner/analysis/comparison-collation.js +341 -0
- package/dist/src/planner/analysis/comparison-collation.js.map +1 -0
- package/dist/src/planner/analysis/constraint-extractor.d.ts +13 -1
- package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.js +220 -21
- package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
- package/dist/src/planner/analysis/coverage-prover.d.ts +321 -0
- package/dist/src/planner/analysis/coverage-prover.d.ts.map +1 -0
- package/dist/src/planner/analysis/coverage-prover.js +1038 -0
- package/dist/src/planner/analysis/coverage-prover.js.map +1 -0
- package/dist/src/planner/analysis/key-filter.d.ts +22 -0
- package/dist/src/planner/analysis/key-filter.d.ts.map +1 -0
- package/dist/src/planner/analysis/key-filter.js +105 -0
- package/dist/src/planner/analysis/key-filter.js.map +1 -0
- package/dist/src/planner/analysis/partial-unique-extraction.d.ts +36 -1
- package/dist/src/planner/analysis/partial-unique-extraction.d.ts.map +1 -1
- package/dist/src/planner/analysis/partial-unique-extraction.js +148 -22
- package/dist/src/planner/analysis/partial-unique-extraction.js.map +1 -1
- package/dist/src/planner/analysis/predicate-normalizer.d.ts.map +1 -1
- package/dist/src/planner/analysis/predicate-normalizer.js +30 -1
- package/dist/src/planner/analysis/predicate-normalizer.js.map +1 -1
- package/dist/src/planner/analysis/predicate-shape.d.ts +36 -1
- package/dist/src/planner/analysis/predicate-shape.d.ts.map +1 -1
- package/dist/src/planner/analysis/predicate-shape.js +51 -13
- package/dist/src/planner/analysis/predicate-shape.js.map +1 -1
- package/dist/src/planner/analysis/query-rewrite-matcher.d.ts +314 -0
- package/dist/src/planner/analysis/query-rewrite-matcher.d.ts.map +1 -0
- package/dist/src/planner/analysis/query-rewrite-matcher.js +1081 -0
- package/dist/src/planner/analysis/query-rewrite-matcher.js.map +1 -0
- package/dist/src/planner/analysis/scalar-invertibility.d.ts +92 -0
- package/dist/src/planner/analysis/scalar-invertibility.d.ts.map +1 -0
- package/dist/src/planner/analysis/scalar-invertibility.js +129 -0
- package/dist/src/planner/analysis/scalar-invertibility.js.map +1 -0
- package/dist/src/planner/analysis/update-lineage.d.ts +196 -0
- package/dist/src/planner/analysis/update-lineage.d.ts.map +1 -0
- package/dist/src/planner/analysis/update-lineage.js +322 -0
- package/dist/src/planner/analysis/update-lineage.js.map +1 -0
- package/dist/src/planner/analysis/view-complement.d.ts +42 -0
- package/dist/src/planner/analysis/view-complement.d.ts.map +1 -0
- package/dist/src/planner/analysis/view-complement.js +54 -0
- package/dist/src/planner/analysis/view-complement.js.map +1 -0
- package/dist/src/planner/building/alter-table.d.ts +1 -1
- package/dist/src/planner/building/alter-table.d.ts.map +1 -1
- package/dist/src/planner/building/alter-table.js +211 -2
- package/dist/src/planner/building/alter-table.js.map +1 -1
- package/dist/src/planner/building/block.d.ts.map +1 -1
- package/dist/src/planner/building/block.js +18 -1
- package/dist/src/planner/building/block.js.map +1 -1
- package/dist/src/planner/building/constraint-builder.d.ts +33 -5
- package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
- package/dist/src/planner/building/constraint-builder.js +63 -28
- package/dist/src/planner/building/constraint-builder.js.map +1 -1
- package/dist/src/planner/building/create-view.d.ts +9 -0
- package/dist/src/planner/building/create-view.d.ts.map +1 -1
- package/dist/src/planner/building/create-view.js +41 -12
- package/dist/src/planner/building/create-view.js.map +1 -1
- package/dist/src/planner/building/ddl.d.ts.map +1 -1
- package/dist/src/planner/building/ddl.js +94 -0
- package/dist/src/planner/building/ddl.js.map +1 -1
- package/dist/src/planner/building/declare-schema.d.ts +1 -0
- package/dist/src/planner/building/declare-schema.d.ts.map +1 -1
- package/dist/src/planner/building/declare-schema.js +4 -1
- package/dist/src/planner/building/declare-schema.js.map +1 -1
- package/dist/src/planner/building/default-scope.d.ts +26 -0
- package/dist/src/planner/building/default-scope.d.ts.map +1 -0
- package/dist/src/planner/building/default-scope.js +41 -0
- package/dist/src/planner/building/default-scope.js.map +1 -0
- package/dist/src/planner/building/delete.d.ts +19 -1
- package/dist/src/planner/building/delete.d.ts.map +1 -1
- package/dist/src/planner/building/delete.js +116 -34
- package/dist/src/planner/building/delete.js.map +1 -1
- package/dist/src/planner/building/dml-target.d.ts +118 -0
- package/dist/src/planner/building/dml-target.d.ts.map +1 -0
- package/dist/src/planner/building/dml-target.js +282 -0
- package/dist/src/planner/building/dml-target.js.map +1 -0
- package/dist/src/planner/building/drop-index.d.ts.map +1 -1
- package/dist/src/planner/building/drop-index.js +4 -1
- package/dist/src/planner/building/drop-index.js.map +1 -1
- package/dist/src/planner/building/drop-view.d.ts.map +1 -1
- package/dist/src/planner/building/drop-view.js +4 -2
- package/dist/src/planner/building/drop-view.js.map +1 -1
- package/dist/src/planner/building/expression.d.ts.map +1 -1
- package/dist/src/planner/building/expression.js +60 -21
- package/dist/src/planner/building/expression.js.map +1 -1
- package/dist/src/planner/building/foreign-key-builder.d.ts +30 -0
- package/dist/src/planner/building/foreign-key-builder.d.ts.map +1 -1
- package/dist/src/planner/building/foreign-key-builder.js +160 -129
- package/dist/src/planner/building/foreign-key-builder.js.map +1 -1
- package/dist/src/planner/building/insert.d.ts +45 -2
- package/dist/src/planner/building/insert.d.ts.map +1 -1
- package/dist/src/planner/building/insert.js +257 -88
- package/dist/src/planner/building/insert.js.map +1 -1
- package/dist/src/planner/building/lens-auxiliary-access.d.ts +22 -0
- package/dist/src/planner/building/lens-auxiliary-access.d.ts.map +1 -0
- package/dist/src/planner/building/lens-auxiliary-access.js +132 -0
- package/dist/src/planner/building/lens-auxiliary-access.js.map +1 -0
- package/dist/src/planner/building/materialized-view.d.ts +16 -0
- package/dist/src/planner/building/materialized-view.d.ts.map +1 -0
- package/dist/src/planner/building/materialized-view.js +57 -0
- package/dist/src/planner/building/materialized-view.js.map +1 -0
- package/dist/src/planner/building/returning-star.d.ts +32 -0
- package/dist/src/planner/building/returning-star.d.ts.map +1 -0
- package/dist/src/planner/building/returning-star.js +45 -0
- package/dist/src/planner/building/returning-star.js.map +1 -0
- package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
- package/dist/src/planner/building/select-aggregates.js +51 -13
- package/dist/src/planner/building/select-aggregates.js.map +1 -1
- package/dist/src/planner/building/select-compound.d.ts.map +1 -1
- package/dist/src/planner/building/select-compound.js +84 -11
- package/dist/src/planner/building/select-compound.js.map +1 -1
- package/dist/src/planner/building/select-context.d.ts +10 -2
- package/dist/src/planner/building/select-context.d.ts.map +1 -1
- package/dist/src/planner/building/select-context.js +7 -1
- package/dist/src/planner/building/select-context.js.map +1 -1
- package/dist/src/planner/building/select-modifiers.js +6 -0
- package/dist/src/planner/building/select-modifiers.js.map +1 -1
- package/dist/src/planner/building/select-ordinal.d.ts +18 -0
- package/dist/src/planner/building/select-ordinal.d.ts.map +1 -1
- package/dist/src/planner/building/select-ordinal.js +30 -0
- package/dist/src/planner/building/select-ordinal.js.map +1 -1
- package/dist/src/planner/building/select-projections.d.ts +8 -2
- package/dist/src/planner/building/select-projections.d.ts.map +1 -1
- package/dist/src/planner/building/select-projections.js +26 -4
- package/dist/src/planner/building/select-projections.js.map +1 -1
- package/dist/src/planner/building/select-window.d.ts.map +1 -1
- package/dist/src/planner/building/select-window.js +8 -5
- package/dist/src/planner/building/select-window.js.map +1 -1
- package/dist/src/planner/building/select.d.ts.map +1 -1
- package/dist/src/planner/building/select.js +164 -59
- package/dist/src/planner/building/select.js.map +1 -1
- package/dist/src/planner/building/set-object-tags.d.ts +7 -0
- package/dist/src/planner/building/set-object-tags.d.ts.map +1 -0
- package/dist/src/planner/building/set-object-tags.js +38 -0
- package/dist/src/planner/building/set-object-tags.js.map +1 -0
- package/dist/src/planner/building/tag-diagnostics.d.ts +27 -0
- package/dist/src/planner/building/tag-diagnostics.d.ts.map +1 -0
- package/dist/src/planner/building/tag-diagnostics.js +37 -0
- package/dist/src/planner/building/tag-diagnostics.js.map +1 -0
- package/dist/src/planner/building/update.d.ts +18 -1
- package/dist/src/planner/building/update.d.ts.map +1 -1
- package/dist/src/planner/building/update.js +134 -58
- package/dist/src/planner/building/update.js.map +1 -1
- package/dist/src/planner/building/view-mutation-builder.d.ts +15 -0
- package/dist/src/planner/building/view-mutation-builder.d.ts.map +1 -0
- package/dist/src/planner/building/view-mutation-builder.js +1158 -0
- package/dist/src/planner/building/view-mutation-builder.js.map +1 -0
- package/dist/src/planner/building/with.d.ts +11 -0
- package/dist/src/planner/building/with.d.ts.map +1 -1
- package/dist/src/planner/building/with.js +48 -10
- package/dist/src/planner/building/with.js.map +1 -1
- package/dist/src/planner/cost/index.d.ts +83 -0
- package/dist/src/planner/cost/index.d.ts.map +1 -1
- package/dist/src/planner/cost/index.js +114 -0
- package/dist/src/planner/cost/index.js.map +1 -1
- package/dist/src/planner/framework/characteristics.d.ts +38 -4
- package/dist/src/planner/framework/characteristics.d.ts.map +1 -1
- package/dist/src/planner/framework/characteristics.js +50 -6
- package/dist/src/planner/framework/characteristics.js.map +1 -1
- package/dist/src/planner/framework/pass.d.ts.map +1 -1
- package/dist/src/planner/framework/pass.js +2 -1
- package/dist/src/planner/framework/pass.js.map +1 -1
- package/dist/src/planner/framework/physical-utils.d.ts.map +1 -1
- package/dist/src/planner/framework/physical-utils.js +7 -1
- package/dist/src/planner/framework/physical-utils.js.map +1 -1
- package/dist/src/planner/framework/registry.d.ts +39 -1
- package/dist/src/planner/framework/registry.d.ts.map +1 -1
- package/dist/src/planner/framework/registry.js +18 -2
- package/dist/src/planner/framework/registry.js.map +1 -1
- package/dist/src/planner/mutation/backward-body.d.ts +131 -0
- package/dist/src/planner/mutation/backward-body.d.ts.map +1 -0
- package/dist/src/planner/mutation/backward-body.js +135 -0
- package/dist/src/planner/mutation/backward-body.js.map +1 -0
- package/dist/src/planner/mutation/cte-flatten.d.ts +17 -0
- package/dist/src/planner/mutation/cte-flatten.d.ts.map +1 -0
- package/dist/src/planner/mutation/cte-flatten.js +364 -0
- package/dist/src/planner/mutation/cte-flatten.js.map +1 -0
- package/dist/src/planner/mutation/decomposition.d.ts +273 -0
- package/dist/src/planner/mutation/decomposition.d.ts.map +1 -0
- package/dist/src/planner/mutation/decomposition.js +1719 -0
- package/dist/src/planner/mutation/decomposition.js.map +1 -0
- package/dist/src/planner/mutation/lens-enforcement.d.ts +165 -0
- package/dist/src/planner/mutation/lens-enforcement.d.ts.map +1 -0
- package/dist/src/planner/mutation/lens-enforcement.js +745 -0
- package/dist/src/planner/mutation/lens-enforcement.js.map +1 -0
- package/dist/src/planner/mutation/multi-source.d.ts +568 -0
- package/dist/src/planner/mutation/multi-source.d.ts.map +1 -0
- package/dist/src/planner/mutation/multi-source.js +2915 -0
- package/dist/src/planner/mutation/multi-source.js.map +1 -0
- package/dist/src/planner/mutation/mutation-diagnostic.d.ts +37 -0
- package/dist/src/planner/mutation/mutation-diagnostic.d.ts.map +1 -0
- package/dist/src/planner/mutation/mutation-diagnostic.js +24 -0
- package/dist/src/planner/mutation/mutation-diagnostic.js.map +1 -0
- package/dist/src/planner/mutation/mutation-tags.d.ts +33 -0
- package/dist/src/planner/mutation/mutation-tags.d.ts.map +1 -0
- package/dist/src/planner/mutation/mutation-tags.js +31 -0
- package/dist/src/planner/mutation/mutation-tags.js.map +1 -0
- package/dist/src/planner/mutation/propagate.d.ts +97 -0
- package/dist/src/planner/mutation/propagate.d.ts.map +1 -0
- package/dist/src/planner/mutation/propagate.js +220 -0
- package/dist/src/planner/mutation/propagate.js.map +1 -0
- package/dist/src/planner/mutation/scope-transform.d.ts +181 -0
- package/dist/src/planner/mutation/scope-transform.d.ts.map +1 -0
- package/dist/src/planner/mutation/scope-transform.js +574 -0
- package/dist/src/planner/mutation/scope-transform.js.map +1 -0
- package/dist/src/planner/mutation/set-op.d.ts +242 -0
- package/dist/src/planner/mutation/set-op.d.ts.map +1 -0
- package/dist/src/planner/mutation/set-op.js +1687 -0
- package/dist/src/planner/mutation/set-op.js.map +1 -0
- package/dist/src/planner/mutation/single-source.d.ts +261 -0
- package/dist/src/planner/mutation/single-source.d.ts.map +1 -0
- package/dist/src/planner/mutation/single-source.js +1096 -0
- package/dist/src/planner/mutation/single-source.js.map +1 -0
- package/dist/src/planner/nodes/aggregate-node.d.ts +6 -4
- package/dist/src/planner/nodes/aggregate-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/aggregate-node.js +11 -9
- package/dist/src/planner/nodes/aggregate-node.js.map +1 -1
- package/dist/src/planner/nodes/alias-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/alias-node.js +5 -1
- package/dist/src/planner/nodes/alias-node.js.map +1 -1
- package/dist/src/planner/nodes/alter-table-node.d.ts +124 -1
- package/dist/src/planner/nodes/alter-table-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/alter-table-node.js +27 -0
- package/dist/src/planner/nodes/alter-table-node.js.map +1 -1
- package/dist/src/planner/nodes/analyze-node.d.ts +2 -1
- package/dist/src/planner/nodes/analyze-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/analyze-node.js +21 -1
- package/dist/src/planner/nodes/analyze-node.js.map +1 -1
- package/dist/src/planner/nodes/asserted-keys-node.d.ts +43 -0
- package/dist/src/planner/nodes/asserted-keys-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/asserted-keys-node.js +99 -0
- package/dist/src/planner/nodes/asserted-keys-node.js.map +1 -0
- package/dist/src/planner/nodes/async-gather-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/async-gather-node.js +33 -8
- package/dist/src/planner/nodes/async-gather-node.js.map +1 -1
- package/dist/src/planner/nodes/bloom-join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/bloom-join-node.js +2 -1
- package/dist/src/planner/nodes/bloom-join-node.js.map +1 -1
- package/dist/src/planner/nodes/create-view-node.d.ts +7 -2
- package/dist/src/planner/nodes/create-view-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/create-view-node.js +4 -1
- package/dist/src/planner/nodes/create-view-node.js.map +1 -1
- package/dist/src/planner/nodes/declarative-schema.d.ts +13 -1
- package/dist/src/planner/nodes/declarative-schema.d.ts.map +1 -1
- package/dist/src/planner/nodes/declarative-schema.js +32 -0
- package/dist/src/planner/nodes/declarative-schema.js.map +1 -1
- package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/distinct-node.js +2 -0
- package/dist/src/planner/nodes/distinct-node.js.map +1 -1
- package/dist/src/planner/nodes/dml-executor-node.d.ts +29 -1
- package/dist/src/planner/nodes/dml-executor-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/dml-executor-node.js +27 -3
- package/dist/src/planner/nodes/dml-executor-node.js.map +1 -1
- package/dist/src/planner/nodes/eager-prefetch-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/eager-prefetch-node.js +2 -0
- package/dist/src/planner/nodes/eager-prefetch-node.js.map +1 -1
- package/dist/src/planner/nodes/envelope-scan-node.d.ts +42 -0
- package/dist/src/planner/nodes/envelope-scan-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/envelope-scan-node.js +62 -0
- package/dist/src/planner/nodes/envelope-scan-node.js.map +1 -0
- package/dist/src/planner/nodes/fanout-lookup-join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/fanout-lookup-join-node.js +11 -1
- package/dist/src/planner/nodes/fanout-lookup-join-node.js.map +1 -1
- package/dist/src/planner/nodes/filter.d.ts.map +1 -1
- package/dist/src/planner/nodes/filter.js +63 -13
- package/dist/src/planner/nodes/filter.js.map +1 -1
- package/dist/src/planner/nodes/hash-aggregate.d.ts.map +1 -1
- package/dist/src/planner/nodes/hash-aggregate.js +6 -16
- package/dist/src/planner/nodes/hash-aggregate.js.map +1 -1
- package/dist/src/planner/nodes/join-node.d.ts +41 -1
- package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-node.js +78 -8
- package/dist/src/planner/nodes/join-node.js.map +1 -1
- package/dist/src/planner/nodes/join-utils.d.ts +33 -6
- package/dist/src/planner/nodes/join-utils.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-utils.js +131 -10
- package/dist/src/planner/nodes/join-utils.js.map +1 -1
- package/dist/src/planner/nodes/lens-auxiliary-access-node.d.ts +104 -0
- package/dist/src/planner/nodes/lens-auxiliary-access-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/lens-auxiliary-access-node.js +91 -0
- package/dist/src/planner/nodes/lens-auxiliary-access-node.js.map +1 -0
- package/dist/src/planner/nodes/limit-offset.d.ts +12 -0
- package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
- package/dist/src/planner/nodes/limit-offset.js +52 -3
- package/dist/src/planner/nodes/limit-offset.js.map +1 -1
- package/dist/src/planner/nodes/materialized-view-nodes.d.ts +69 -0
- package/dist/src/planner/nodes/materialized-view-nodes.d.ts.map +1 -0
- package/dist/src/planner/nodes/materialized-view-nodes.js +111 -0
- package/dist/src/planner/nodes/materialized-view-nodes.js.map +1 -0
- package/dist/src/planner/nodes/merge-join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/merge-join-node.js +2 -1
- package/dist/src/planner/nodes/merge-join-node.js.map +1 -1
- package/dist/src/planner/nodes/ordinal-slice-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/ordinal-slice-node.js +2 -0
- package/dist/src/planner/nodes/ordinal-slice-node.js.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.d.ts +9 -0
- package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.js +9 -0
- package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
- package/dist/src/planner/nodes/plan-node.d.ts +265 -5
- package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node.js.map +1 -1
- package/dist/src/planner/nodes/pragma.d.ts +2 -1
- package/dist/src/planner/nodes/pragma.d.ts.map +1 -1
- package/dist/src/planner/nodes/pragma.js +12 -0
- package/dist/src/planner/nodes/pragma.js.map +1 -1
- package/dist/src/planner/nodes/project-node.d.ts +14 -1
- package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/project-node.js +103 -16
- package/dist/src/planner/nodes/project-node.js.map +1 -1
- package/dist/src/planner/nodes/reference.d.ts.map +1 -1
- package/dist/src/planner/nodes/reference.js +63 -30
- package/dist/src/planner/nodes/reference.js.map +1 -1
- package/dist/src/planner/nodes/retrieve-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/retrieve-node.js +7 -0
- package/dist/src/planner/nodes/retrieve-node.js.map +1 -1
- package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/returning-node.js +10 -3
- package/dist/src/planner/nodes/returning-node.js.map +1 -1
- package/dist/src/planner/nodes/scalar.d.ts +20 -0
- package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
- package/dist/src/planner/nodes/scalar.js +71 -14
- package/dist/src/planner/nodes/scalar.js.map +1 -1
- package/dist/src/planner/nodes/set-object-tags-node.d.ts +39 -0
- package/dist/src/planner/nodes/set-object-tags-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/set-object-tags-node.js +41 -0
- package/dist/src/planner/nodes/set-object-tags-node.js.map +1 -0
- package/dist/src/planner/nodes/set-operation-node.d.ts +123 -1
- package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/set-operation-node.js +302 -18
- package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
- package/dist/src/planner/nodes/single-row.d.ts.map +1 -1
- package/dist/src/planner/nodes/single-row.js +3 -0
- package/dist/src/planner/nodes/single-row.js.map +1 -1
- package/dist/src/planner/nodes/sort.d.ts.map +1 -1
- package/dist/src/planner/nodes/sort.js +8 -7
- package/dist/src/planner/nodes/sort.js.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.js +8 -23
- package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
- package/dist/src/planner/nodes/subquery.d.ts +2 -0
- package/dist/src/planner/nodes/subquery.d.ts.map +1 -1
- package/dist/src/planner/nodes/subquery.js +18 -2
- package/dist/src/planner/nodes/subquery.js.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.js +23 -3
- package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
- package/dist/src/planner/nodes/table-function-call.js +6 -0
- package/dist/src/planner/nodes/table-function-call.js.map +1 -1
- package/dist/src/planner/nodes/values-node.d.ts +3 -1
- package/dist/src/planner/nodes/values-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/values-node.js +26 -0
- package/dist/src/planner/nodes/values-node.js.map +1 -1
- package/dist/src/planner/nodes/view-mutation-node.d.ts +259 -0
- package/dist/src/planner/nodes/view-mutation-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/view-mutation-node.js +273 -0
- package/dist/src/planner/nodes/view-mutation-node.js.map +1 -0
- package/dist/src/planner/nodes/window-function.d.ts +17 -1
- package/dist/src/planner/nodes/window-function.d.ts.map +1 -1
- package/dist/src/planner/nodes/window-function.js +15 -1
- package/dist/src/planner/nodes/window-function.js.map +1 -1
- package/dist/src/planner/nodes/window-node.js +3 -3
- package/dist/src/planner/nodes/window-node.js.map +1 -1
- package/dist/src/planner/optimizer.d.ts.map +1 -1
- package/dist/src/planner/optimizer.js +372 -39
- package/dist/src/planner/optimizer.js.map +1 -1
- package/dist/src/planner/planning-context.d.ts +1 -1
- package/dist/src/planner/planning-context.d.ts.map +1 -1
- package/dist/src/planner/rules/access/lens-access-form-matcher.d.ts +70 -0
- package/dist/src/planner/rules/access/lens-access-form-matcher.d.ts.map +1 -0
- package/dist/src/planner/rules/access/lens-access-form-matcher.js +156 -0
- package/dist/src/planner/rules/access/lens-access-form-matcher.js.map +1 -0
- package/dist/src/planner/rules/access/rule-lens-auxiliary-access.d.ts +31 -0
- package/dist/src/planner/rules/access/rule-lens-auxiliary-access.d.ts.map +1 -0
- package/dist/src/planner/rules/access/rule-lens-auxiliary-access.js +176 -0
- package/dist/src/planner/rules/access/rule-lens-auxiliary-access.js.map +1 -0
- package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
- package/dist/src/planner/rules/access/rule-select-access-path.js +435 -37
- package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.d.ts.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js +8 -27
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts +9 -3
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js +56 -5
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js.map +1 -1
- package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.d.ts +39 -0
- package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.d.ts.map +1 -0
- package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.js +616 -0
- package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.js.map +1 -0
- package/dist/src/planner/rules/cache/rule-scalar-cse.d.ts.map +1 -1
- package/dist/src/planner/rules/cache/rule-scalar-cse.js +8 -1
- package/dist/src/planner/rules/cache/rule-scalar-cse.js.map +1 -1
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.d.ts +8 -7
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.d.ts.map +1 -1
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.js +14 -21
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.js.map +1 -1
- package/dist/src/planner/rules/join/equi-pair-extractor.d.ts +36 -0
- package/dist/src/planner/rules/join/equi-pair-extractor.d.ts.map +1 -1
- package/dist/src/planner/rules/join/equi-pair-extractor.js +42 -5
- package/dist/src/planner/rules/join/equi-pair-extractor.js.map +1 -1
- package/dist/src/planner/rules/join/rule-fanout-batched-outer.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-fanout-batched-outer.js +10 -0
- package/dist/src/planner/rules/join/rule-fanout-batched-outer.js.map +1 -1
- package/dist/src/planner/rules/join/rule-fanout-lookup-join.js +25 -9
- package/dist/src/planner/rules/join/rule-fanout-lookup-join.js.map +1 -1
- package/dist/src/planner/rules/join/rule-inner-join-existence-recovery.d.ts +130 -0
- package/dist/src/planner/rules/join/rule-inner-join-existence-recovery.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-inner-join-existence-recovery.js +206 -0
- package/dist/src/planner/rules/join/rule-inner-join-existence-recovery.js.map +1 -0
- package/dist/src/planner/rules/join/rule-join-elimination.d.ts +67 -14
- package/dist/src/planner/rules/join/rule-join-elimination.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-join-elimination.js +81 -25
- package/dist/src/planner/rules/join/rule-join-elimination.js.map +1 -1
- package/dist/src/planner/rules/join/rule-join-existence-pruning.d.ts +84 -0
- package/dist/src/planner/rules/join/rule-join-existence-pruning.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-join-existence-pruning.js +138 -0
- package/dist/src/planner/rules/join/rule-join-existence-pruning.js.map +1 -0
- package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-join-greedy-commute.js +19 -1
- package/dist/src/planner/rules/join/rule-join-greedy-commute.js.map +1 -1
- package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-join-physical-selection.js +14 -2
- package/dist/src/planner/rules/join/rule-join-physical-selection.js.map +1 -1
- package/dist/src/planner/rules/join/rule-lateral-top1-asof.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-lateral-top1-asof.js +5 -2
- package/dist/src/planner/rules/join/rule-lateral-top1-asof.js.map +1 -1
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.js +4 -0
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.js.map +1 -1
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.js +10 -0
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.js.map +1 -1
- package/dist/src/planner/rules/join/rule-semijoin-existence-recovery.d.ts +286 -0
- package/dist/src/planner/rules/join/rule-semijoin-existence-recovery.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-semijoin-existence-recovery.js +548 -0
- package/dist/src/planner/rules/join/rule-semijoin-existence-recovery.js.map +1 -0
- package/dist/src/planner/rules/parallel/rule-async-gather-union-all.d.ts.map +1 -1
- package/dist/src/planner/rules/parallel/rule-async-gather-union-all.js +9 -1
- package/dist/src/planner/rules/parallel/rule-async-gather-union-all.js.map +1 -1
- package/dist/src/planner/rules/parallel/rule-async-gather-zip-by-key.d.ts.map +1 -1
- package/dist/src/planner/rules/parallel/rule-async-gather-zip-by-key.js +7 -0
- package/dist/src/planner/rules/parallel/rule-async-gather-zip-by-key.js.map +1 -1
- package/dist/src/planner/rules/parallel/rule-eager-prefetch-probe.d.ts.map +1 -1
- package/dist/src/planner/rules/parallel/rule-eager-prefetch-probe.js +10 -1
- package/dist/src/planner/rules/parallel/rule-eager-prefetch-probe.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.d.ts.map +1 -1
- package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js +10 -1
- package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-empty-relation-folding.d.ts.map +1 -1
- package/dist/src/planner/rules/predicate/rule-empty-relation-folding.js +18 -0
- package/dist/src/planner/rules/predicate/rule-empty-relation-folding.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-filter-contradiction.d.ts.map +1 -1
- package/dist/src/planner/rules/predicate/rule-filter-contradiction.js +7 -0
- package/dist/src/planner/rules/predicate/rule-filter-contradiction.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.d.ts.map +1 -1
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js +9 -0
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js +13 -3
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js.map +1 -1
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js +2 -2
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +1 -1
- package/dist/src/planner/rules/retrieve/rule-projection-pruning.d.ts.map +1 -1
- package/dist/src/planner/rules/retrieve/rule-projection-pruning.js +14 -0
- package/dist/src/planner/rules/retrieve/rule-projection-pruning.js.map +1 -1
- package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.d.ts +16 -0
- package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.d.ts.map +1 -1
- package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.js +47 -4
- package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.js.map +1 -1
- package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.d.ts.map +1 -1
- package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js +8 -0
- package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js.map +1 -1
- package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.d.ts.map +1 -1
- package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js +7 -0
- package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js.map +1 -1
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts.map +1 -1
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js +12 -0
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js.map +1 -1
- package/dist/src/planner/rules/window/rule-monotonic-window.js +1 -1
- package/dist/src/planner/rules/window/rule-monotonic-window.js.map +1 -1
- package/dist/src/planner/type-utils.d.ts +14 -0
- package/dist/src/planner/type-utils.d.ts.map +1 -1
- package/dist/src/planner/type-utils.js +66 -21
- package/dist/src/planner/type-utils.js.map +1 -1
- package/dist/src/planner/util/fd-utils.d.ts +228 -36
- package/dist/src/planner/util/fd-utils.d.ts.map +1 -1
- package/dist/src/planner/util/fd-utils.js +501 -84
- package/dist/src/planner/util/fd-utils.js.map +1 -1
- package/dist/src/planner/util/ind-utils.d.ts +27 -1
- package/dist/src/planner/util/ind-utils.d.ts.map +1 -1
- package/dist/src/planner/util/ind-utils.js +80 -6
- package/dist/src/planner/util/ind-utils.js.map +1 -1
- package/dist/src/planner/util/key-utils.d.ts +26 -3
- package/dist/src/planner/util/key-utils.d.ts.map +1 -1
- package/dist/src/planner/util/key-utils.js +182 -33
- package/dist/src/planner/util/key-utils.js.map +1 -1
- package/dist/src/planner/util/set-op-wrapper.d.ts +37 -0
- package/dist/src/planner/util/set-op-wrapper.d.ts.map +1 -0
- package/dist/src/planner/util/set-op-wrapper.js +82 -0
- package/dist/src/planner/util/set-op-wrapper.js.map +1 -0
- package/dist/src/planner/validation/plan-validator.d.ts.map +1 -1
- package/dist/src/planner/validation/plan-validator.js +1 -0
- package/dist/src/planner/validation/plan-validator.js.map +1 -1
- package/dist/src/runtime/context-helpers.d.ts +13 -1
- package/dist/src/runtime/context-helpers.d.ts.map +1 -1
- package/dist/src/runtime/context-helpers.js +7 -1
- package/dist/src/runtime/context-helpers.js.map +1 -1
- package/dist/src/runtime/delta-executor.d.ts +30 -1
- package/dist/src/runtime/delta-executor.d.ts.map +1 -1
- package/dist/src/runtime/delta-executor.js +38 -4
- package/dist/src/runtime/delta-executor.js.map +1 -1
- package/dist/src/runtime/emit/add-constraint.d.ts.map +1 -1
- package/dist/src/runtime/emit/add-constraint.js +38 -5
- package/dist/src/runtime/emit/add-constraint.js.map +1 -1
- package/dist/src/runtime/emit/aggregate.d.ts.map +1 -1
- package/dist/src/runtime/emit/aggregate.js +10 -8
- package/dist/src/runtime/emit/aggregate.js.map +1 -1
- package/dist/src/runtime/emit/alter-table.d.ts +1 -1
- package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
- package/dist/src/runtime/emit/alter-table.js +664 -108
- package/dist/src/runtime/emit/alter-table.js.map +1 -1
- package/dist/src/runtime/emit/analyze.d.ts.map +1 -1
- package/dist/src/runtime/emit/analyze.js +2 -1
- package/dist/src/runtime/emit/analyze.js.map +1 -1
- package/dist/src/runtime/emit/asof-scan.d.ts.map +1 -1
- package/dist/src/runtime/emit/asof-scan.js +24 -9
- package/dist/src/runtime/emit/asof-scan.js.map +1 -1
- package/dist/src/runtime/emit/asserted-keys.d.ts +13 -0
- package/dist/src/runtime/emit/asserted-keys.d.ts.map +1 -0
- package/dist/src/runtime/emit/asserted-keys.js +13 -0
- package/dist/src/runtime/emit/asserted-keys.js.map +1 -0
- package/dist/src/runtime/emit/between.d.ts.map +1 -1
- package/dist/src/runtime/emit/between.js +24 -19
- package/dist/src/runtime/emit/between.js.map +1 -1
- package/dist/src/runtime/emit/binary.d.ts.map +1 -1
- package/dist/src/runtime/emit/binary.js +24 -36
- package/dist/src/runtime/emit/binary.js.map +1 -1
- package/dist/src/runtime/emit/block.d.ts.map +1 -1
- package/dist/src/runtime/emit/block.js +11 -2
- package/dist/src/runtime/emit/block.js.map +1 -1
- package/dist/src/runtime/emit/bloom-join.d.ts.map +1 -1
- package/dist/src/runtime/emit/bloom-join.js +12 -4
- package/dist/src/runtime/emit/bloom-join.js.map +1 -1
- package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
- package/dist/src/runtime/emit/constraint-check.js +50 -1
- package/dist/src/runtime/emit/constraint-check.js.map +1 -1
- package/dist/src/runtime/emit/create-table.d.ts.map +1 -1
- package/dist/src/runtime/emit/create-table.js +8 -0
- package/dist/src/runtime/emit/create-table.js.map +1 -1
- package/dist/src/runtime/emit/create-view.d.ts.map +1 -1
- package/dist/src/runtime/emit/create-view.js +16 -1
- package/dist/src/runtime/emit/create-view.js.map +1 -1
- package/dist/src/runtime/emit/delete.d.ts.map +1 -1
- package/dist/src/runtime/emit/delete.js +15 -5
- package/dist/src/runtime/emit/delete.js.map +1 -1
- package/dist/src/runtime/emit/dml-executor.d.ts +27 -0
- package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
- package/dist/src/runtime/emit/dml-executor.js +413 -193
- package/dist/src/runtime/emit/dml-executor.js.map +1 -1
- package/dist/src/runtime/emit/drop-table.d.ts.map +1 -1
- package/dist/src/runtime/emit/drop-table.js +10 -0
- package/dist/src/runtime/emit/drop-table.js.map +1 -1
- package/dist/src/runtime/emit/drop-view.d.ts.map +1 -1
- package/dist/src/runtime/emit/drop-view.js +17 -0
- package/dist/src/runtime/emit/drop-view.js.map +1 -1
- package/dist/src/runtime/emit/envelope-scan.d.ts +13 -0
- package/dist/src/runtime/emit/envelope-scan.d.ts.map +1 -0
- package/dist/src/runtime/emit/envelope-scan.js +22 -0
- package/dist/src/runtime/emit/envelope-scan.js.map +1 -0
- package/dist/src/runtime/emit/join.d.ts +10 -2
- package/dist/src/runtime/emit/join.d.ts.map +1 -1
- package/dist/src/runtime/emit/join.js +128 -38
- package/dist/src/runtime/emit/join.js.map +1 -1
- package/dist/src/runtime/emit/lens-auxiliary-access.d.ts +16 -0
- package/dist/src/runtime/emit/lens-auxiliary-access.d.ts.map +1 -0
- package/dist/src/runtime/emit/lens-auxiliary-access.js +16 -0
- package/dist/src/runtime/emit/lens-auxiliary-access.js.map +1 -0
- package/dist/src/runtime/emit/materialized-view-helpers.d.ts +640 -0
- package/dist/src/runtime/emit/materialized-view-helpers.d.ts.map +1 -0
- package/dist/src/runtime/emit/materialized-view-helpers.js +2576 -0
- package/dist/src/runtime/emit/materialized-view-helpers.js.map +1 -0
- package/dist/src/runtime/emit/materialized-view.d.ts +31 -0
- package/dist/src/runtime/emit/materialized-view.d.ts.map +1 -0
- package/dist/src/runtime/emit/materialized-view.js +187 -0
- package/dist/src/runtime/emit/materialized-view.js.map +1 -0
- package/dist/src/runtime/emit/merge-join.d.ts.map +1 -1
- package/dist/src/runtime/emit/merge-join.js +19 -5
- package/dist/src/runtime/emit/merge-join.js.map +1 -1
- package/dist/src/runtime/emit/project.d.ts.map +1 -1
- package/dist/src/runtime/emit/project.js +10 -5
- package/dist/src/runtime/emit/project.js.map +1 -1
- package/dist/src/runtime/emit/schema-declarative.d.ts +1 -0
- package/dist/src/runtime/emit/schema-declarative.d.ts.map +1 -1
- package/dist/src/runtime/emit/schema-declarative.js +101 -5
- package/dist/src/runtime/emit/schema-declarative.js.map +1 -1
- package/dist/src/runtime/emit/set-object-tags.d.ts +16 -0
- package/dist/src/runtime/emit/set-object-tags.d.ts.map +1 -0
- package/dist/src/runtime/emit/set-object-tags.js +57 -0
- package/dist/src/runtime/emit/set-object-tags.js.map +1 -0
- package/dist/src/runtime/emit/set-operation.d.ts.map +1 -1
- package/dist/src/runtime/emit/set-operation.js +140 -24
- package/dist/src/runtime/emit/set-operation.js.map +1 -1
- package/dist/src/runtime/emit/subquery.d.ts.map +1 -1
- package/dist/src/runtime/emit/subquery.js +110 -5
- package/dist/src/runtime/emit/subquery.js.map +1 -1
- package/dist/src/runtime/emit/unary.d.ts.map +1 -1
- package/dist/src/runtime/emit/unary.js +34 -6
- package/dist/src/runtime/emit/unary.js.map +1 -1
- package/dist/src/runtime/emit/view-mutation.d.ts +70 -0
- package/dist/src/runtime/emit/view-mutation.d.ts.map +1 -0
- package/dist/src/runtime/emit/view-mutation.js +299 -0
- package/dist/src/runtime/emit/view-mutation.js.map +1 -0
- package/dist/src/runtime/emit/window.js +29 -5
- package/dist/src/runtime/emit/window.js.map +1 -1
- package/dist/src/runtime/foreign-key-actions.d.ts +66 -3
- package/dist/src/runtime/foreign-key-actions.d.ts.map +1 -1
- package/dist/src/runtime/foreign-key-actions.js +580 -172
- package/dist/src/runtime/foreign-key-actions.js.map +1 -1
- package/dist/src/runtime/parallel-driver.d.ts +4 -1
- package/dist/src/runtime/parallel-driver.d.ts.map +1 -1
- package/dist/src/runtime/parallel-driver.js +5 -1
- package/dist/src/runtime/parallel-driver.js.map +1 -1
- package/dist/src/runtime/register.d.ts.map +1 -1
- package/dist/src/runtime/register.js +17 -1
- package/dist/src/runtime/register.js.map +1 -1
- package/dist/src/runtime/types.d.ts +10 -0
- package/dist/src/runtime/types.d.ts.map +1 -1
- package/dist/src/runtime/types.js.map +1 -1
- package/dist/src/schema/basis-backfill.d.ts +63 -0
- package/dist/src/schema/basis-backfill.d.ts.map +1 -0
- package/dist/src/schema/basis-backfill.js +161 -0
- package/dist/src/schema/basis-backfill.js.map +1 -0
- package/dist/src/schema/catalog.d.ts +115 -1
- package/dist/src/schema/catalog.d.ts.map +1 -1
- package/dist/src/schema/catalog.js +249 -22
- package/dist/src/schema/catalog.js.map +1 -1
- package/dist/src/schema/change-events.d.ts +42 -1
- package/dist/src/schema/change-events.d.ts.map +1 -1
- package/dist/src/schema/change-events.js.map +1 -1
- package/dist/src/schema/column.d.ts +16 -0
- package/dist/src/schema/column.d.ts.map +1 -1
- package/dist/src/schema/column.js.map +1 -1
- package/dist/src/schema/constraint-builder.d.ts +182 -0
- package/dist/src/schema/constraint-builder.d.ts.map +1 -0
- package/dist/src/schema/constraint-builder.js +424 -0
- package/dist/src/schema/constraint-builder.js.map +1 -0
- package/dist/src/schema/ddl-generator.d.ts +86 -1
- package/dist/src/schema/ddl-generator.d.ts.map +1 -1
- package/dist/src/schema/ddl-generator.js +316 -20
- package/dist/src/schema/ddl-generator.js.map +1 -1
- package/dist/src/schema/declared-schema-manager.d.ts +51 -0
- package/dist/src/schema/declared-schema-manager.d.ts.map +1 -1
- package/dist/src/schema/declared-schema-manager.js +61 -0
- package/dist/src/schema/declared-schema-manager.js.map +1 -1
- package/dist/src/schema/derivation.d.ts +106 -0
- package/dist/src/schema/derivation.d.ts.map +1 -0
- package/dist/src/schema/derivation.js +25 -0
- package/dist/src/schema/derivation.js.map +1 -0
- package/dist/src/schema/function.d.ts +13 -0
- package/dist/src/schema/function.d.ts.map +1 -1
- package/dist/src/schema/function.js.map +1 -1
- package/dist/src/schema/lens-ack.d.ts +90 -0
- package/dist/src/schema/lens-ack.d.ts.map +1 -0
- package/dist/src/schema/lens-ack.js +361 -0
- package/dist/src/schema/lens-ack.js.map +1 -0
- package/dist/src/schema/lens-compiler.d.ts +62 -0
- package/dist/src/schema/lens-compiler.d.ts.map +1 -0
- package/dist/src/schema/lens-compiler.js +1594 -0
- package/dist/src/schema/lens-compiler.js.map +1 -0
- package/dist/src/schema/lens-fk-discovery.d.ts +175 -0
- package/dist/src/schema/lens-fk-discovery.d.ts.map +1 -0
- package/dist/src/schema/lens-fk-discovery.js +336 -0
- package/dist/src/schema/lens-fk-discovery.js.map +1 -0
- package/dist/src/schema/lens-prover.d.ts +336 -0
- package/dist/src/schema/lens-prover.d.ts.map +1 -0
- package/dist/src/schema/lens-prover.js +1988 -0
- package/dist/src/schema/lens-prover.js.map +1 -0
- package/dist/src/schema/lens.d.ts +254 -0
- package/dist/src/schema/lens.d.ts.map +1 -0
- package/dist/src/schema/lens.js +21 -0
- package/dist/src/schema/lens.js.map +1 -0
- package/dist/src/schema/manager.d.ts +676 -18
- package/dist/src/schema/manager.d.ts.map +1 -1
- package/dist/src/schema/manager.js +1573 -238
- package/dist/src/schema/manager.js.map +1 -1
- package/dist/src/schema/mapping-advertisement-tags.d.ts +39 -0
- package/dist/src/schema/mapping-advertisement-tags.d.ts.map +1 -0
- package/dist/src/schema/mapping-advertisement-tags.js +216 -0
- package/dist/src/schema/mapping-advertisement-tags.js.map +1 -0
- package/dist/src/schema/rename-rewriter.d.ts +45 -4
- package/dist/src/schema/rename-rewriter.d.ts.map +1 -1
- package/dist/src/schema/rename-rewriter.js +412 -19
- package/dist/src/schema/rename-rewriter.js.map +1 -1
- package/dist/src/schema/reserved-tags-policy.d.ts +32 -0
- package/dist/src/schema/reserved-tags-policy.d.ts.map +1 -0
- package/dist/src/schema/reserved-tags-policy.js +34 -0
- package/dist/src/schema/reserved-tags-policy.js.map +1 -0
- package/dist/src/schema/reserved-tags.d.ts +170 -0
- package/dist/src/schema/reserved-tags.d.ts.map +1 -0
- package/dist/src/schema/reserved-tags.js +507 -0
- package/dist/src/schema/reserved-tags.js.map +1 -0
- package/dist/src/schema/schema-differ.d.ts +158 -2
- package/dist/src/schema/schema-differ.d.ts.map +1 -1
- package/dist/src/schema/schema-differ.js +1460 -78
- package/dist/src/schema/schema-differ.js.map +1 -1
- package/dist/src/schema/schema-hasher.d.ts +8 -3
- package/dist/src/schema/schema-hasher.d.ts.map +1 -1
- package/dist/src/schema/schema-hasher.js +22 -2
- package/dist/src/schema/schema-hasher.js.map +1 -1
- package/dist/src/schema/schema.d.ts +25 -1
- package/dist/src/schema/schema.d.ts.map +1 -1
- package/dist/src/schema/schema.js +36 -2
- package/dist/src/schema/schema.js.map +1 -1
- package/dist/src/schema/table.d.ts +259 -10
- package/dist/src/schema/table.d.ts.map +1 -1
- package/dist/src/schema/table.js +309 -26
- package/dist/src/schema/table.js.map +1 -1
- package/dist/src/schema/unique-enforcement.d.ts +78 -0
- package/dist/src/schema/unique-enforcement.d.ts.map +1 -0
- package/dist/src/schema/unique-enforcement.js +93 -0
- package/dist/src/schema/unique-enforcement.js.map +1 -0
- package/dist/src/schema/view.d.ts +83 -2
- package/dist/src/schema/view.d.ts.map +1 -1
- package/dist/src/schema/view.js +67 -1
- package/dist/src/schema/view.js.map +1 -1
- package/dist/src/schema/window-function.d.ts +9 -1
- package/dist/src/schema/window-function.d.ts.map +1 -1
- package/dist/src/schema/window-function.js.map +1 -1
- package/dist/src/types/temporal-types.d.ts.map +1 -1
- package/dist/src/types/temporal-types.js +71 -36
- package/dist/src/types/temporal-types.js.map +1 -1
- package/dist/src/util/comparison.d.ts +24 -0
- package/dist/src/util/comparison.d.ts.map +1 -1
- package/dist/src/util/comparison.js +34 -0
- package/dist/src/util/comparison.js.map +1 -1
- package/dist/src/util/mutation-statement.d.ts.map +1 -1
- package/dist/src/util/mutation-statement.js +4 -1
- package/dist/src/util/mutation-statement.js.map +1 -1
- package/dist/src/util/serialization.d.ts +9 -0
- package/dist/src/util/serialization.d.ts.map +1 -1
- package/dist/src/util/serialization.js +26 -0
- package/dist/src/util/serialization.js.map +1 -1
- package/dist/src/vtab/backing-host.d.ts +286 -0
- package/dist/src/vtab/backing-host.d.ts.map +1 -0
- package/dist/src/vtab/backing-host.js +118 -0
- package/dist/src/vtab/backing-host.js.map +1 -0
- package/dist/src/vtab/best-access-plan.d.ts +21 -0
- package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
- package/dist/src/vtab/best-access-plan.js.map +1 -1
- package/dist/src/vtab/capabilities.d.ts +5 -5
- package/dist/src/vtab/capabilities.d.ts.map +1 -1
- package/dist/src/vtab/mapping-advertisement.d.ts +163 -0
- package/dist/src/vtab/mapping-advertisement.d.ts.map +1 -0
- package/dist/src/vtab/mapping-advertisement.js +2 -0
- package/dist/src/vtab/mapping-advertisement.js.map +1 -0
- package/dist/src/vtab/memory/index.d.ts +64 -4
- package/dist/src/vtab/memory/index.d.ts.map +1 -1
- package/dist/src/vtab/memory/index.js +119 -12
- package/dist/src/vtab/memory/index.js.map +1 -1
- package/dist/src/vtab/memory/layer/base.d.ts +38 -1
- package/dist/src/vtab/memory/layer/base.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/base.js +112 -24
- package/dist/src/vtab/memory/layer/base.js.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts +291 -4
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +1050 -91
- package/dist/src/vtab/memory/layer/manager.js.map +1 -1
- package/dist/src/vtab/memory/layer/plan-filter.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/plan-filter.js +35 -6
- package/dist/src/vtab/memory/layer/plan-filter.js.map +1 -1
- package/dist/src/vtab/memory/layer/scan-layer.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/scan-layer.js +66 -14
- package/dist/src/vtab/memory/layer/scan-layer.js.map +1 -1
- package/dist/src/vtab/memory/layer/scan-plan.d.ts +14 -0
- package/dist/src/vtab/memory/layer/scan-plan.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/scan-plan.js +27 -4
- package/dist/src/vtab/memory/layer/scan-plan.js.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.js +5 -1
- package/dist/src/vtab/memory/layer/transaction.js.map +1 -1
- package/dist/src/vtab/memory/module.d.ts +17 -0
- package/dist/src/vtab/memory/module.d.ts.map +1 -1
- package/dist/src/vtab/memory/module.js +82 -3
- package/dist/src/vtab/memory/module.js.map +1 -1
- package/dist/src/vtab/memory/table.d.ts.map +1 -1
- package/dist/src/vtab/memory/table.js +15 -5
- package/dist/src/vtab/memory/table.js.map +1 -1
- package/dist/src/vtab/memory/types.d.ts +20 -2
- package/dist/src/vtab/memory/types.d.ts.map +1 -1
- package/dist/src/vtab/memory/utils/predicate.d.ts.map +1 -1
- package/dist/src/vtab/memory/utils/predicate.js +46 -24
- package/dist/src/vtab/memory/utils/predicate.js.map +1 -1
- package/dist/src/vtab/memory/utils/primary-key-encode.d.ts +31 -0
- package/dist/src/vtab/memory/utils/primary-key-encode.d.ts.map +1 -0
- package/dist/src/vtab/memory/utils/primary-key-encode.js +101 -0
- package/dist/src/vtab/memory/utils/primary-key-encode.js.map +1 -0
- package/dist/src/vtab/memory/utils/primary-key.d.ts +8 -0
- package/dist/src/vtab/memory/utils/primary-key.d.ts.map +1 -1
- package/dist/src/vtab/memory/utils/primary-key.js +12 -5
- package/dist/src/vtab/memory/utils/primary-key.js.map +1 -1
- package/dist/src/vtab/module.d.ts +203 -4
- package/dist/src/vtab/module.d.ts.map +1 -1
- package/dist/src/vtab/table.d.ts +9 -0
- package/dist/src/vtab/table.d.ts.map +1 -1
- package/dist/src/vtab/table.js.map +1 -1
- 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
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|