@quereus/quereus 2.9.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +224 -222
- package/dist/src/core/database-assertions.d.ts +36 -16
- package/dist/src/core/database-assertions.d.ts.map +1 -1
- package/dist/src/core/database-assertions.js +222 -118
- package/dist/src/core/database-assertions.js.map +1 -1
- package/dist/src/core/database-transaction.d.ts +96 -13
- package/dist/src/core/database-transaction.d.ts.map +1 -1
- package/dist/src/core/database-transaction.js +294 -35
- package/dist/src/core/database-transaction.js.map +1 -1
- package/dist/src/core/database-watchers.d.ts +58 -0
- package/dist/src/core/database-watchers.d.ts.map +1 -0
- package/dist/src/core/database-watchers.js +206 -0
- package/dist/src/core/database-watchers.js.map +1 -0
- package/dist/src/core/database.d.ts +78 -5
- package/dist/src/core/database.d.ts.map +1 -1
- package/dist/src/core/database.js +120 -20
- package/dist/src/core/database.js.map +1 -1
- package/dist/src/core/statement.d.ts +9 -0
- package/dist/src/core/statement.d.ts.map +1 -1
- package/dist/src/core/statement.js +29 -0
- package/dist/src/core/statement.js.map +1 -1
- package/dist/src/core/table-handle.d.ts +45 -0
- package/dist/src/core/table-handle.d.ts.map +1 -0
- package/dist/src/core/table-handle.js +54 -0
- package/dist/src/core/table-handle.js.map +1 -0
- package/dist/src/func/builtins/conversion.d.ts.map +1 -1
- package/dist/src/func/builtins/conversion.js +12 -1
- package/dist/src/func/builtins/conversion.js.map +1 -1
- package/dist/src/func/builtins/explain.d.ts.map +1 -1
- package/dist/src/func/builtins/explain.js +22 -8
- package/dist/src/func/builtins/explain.js.map +1 -1
- package/dist/src/func/builtins/generation.d.ts.map +1 -1
- package/dist/src/func/builtins/generation.js +26 -1
- package/dist/src/func/builtins/generation.js.map +1 -1
- package/dist/src/func/builtins/index.d.ts.map +1 -1
- package/dist/src/func/builtins/index.js +5 -1
- package/dist/src/func/builtins/index.js.map +1 -1
- package/dist/src/func/builtins/json-tvf.d.ts.map +1 -1
- package/dist/src/func/builtins/json-tvf.js +16 -2
- package/dist/src/func/builtins/json-tvf.js.map +1 -1
- package/dist/src/func/builtins/schema.d.ts +4 -0
- package/dist/src/func/builtins/schema.d.ts.map +1 -1
- package/dist/src/func/builtins/schema.js +270 -11
- package/dist/src/func/builtins/schema.js.map +1 -1
- package/dist/src/func/registration.d.ts +19 -1
- package/dist/src/func/registration.d.ts.map +1 -1
- package/dist/src/func/registration.js +8 -3
- package/dist/src/func/registration.js.map +1 -1
- package/dist/src/index.d.ts +7 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/parser/parser.d.ts.map +1 -1
- package/dist/src/parser/parser.js +12 -4
- package/dist/src/parser/parser.js.map +1 -1
- package/dist/src/planner/analysis/assertion-classifier.d.ts +71 -0
- package/dist/src/planner/analysis/assertion-classifier.d.ts.map +1 -0
- package/dist/src/planner/analysis/assertion-classifier.js +286 -0
- package/dist/src/planner/analysis/assertion-classifier.js.map +1 -0
- package/dist/src/planner/analysis/assertion-hoist-cache.d.ts +34 -0
- package/dist/src/planner/analysis/assertion-hoist-cache.d.ts.map +1 -0
- package/dist/src/planner/analysis/assertion-hoist-cache.js +119 -0
- package/dist/src/planner/analysis/assertion-hoist-cache.js.map +1 -0
- package/dist/src/planner/analysis/binding-extractor.d.ts +58 -0
- package/dist/src/planner/analysis/binding-extractor.d.ts.map +1 -0
- package/dist/src/planner/analysis/binding-extractor.js +110 -0
- package/dist/src/planner/analysis/binding-extractor.js.map +1 -0
- package/dist/src/planner/analysis/change-scope.d.ts +184 -0
- package/dist/src/planner/analysis/change-scope.d.ts.map +1 -0
- package/dist/src/planner/analysis/change-scope.js +825 -0
- package/dist/src/planner/analysis/change-scope.js.map +1 -0
- package/dist/src/planner/analysis/check-extraction.d.ts +29 -0
- package/dist/src/planner/analysis/check-extraction.d.ts.map +1 -0
- package/dist/src/planner/analysis/check-extraction.js +420 -0
- package/dist/src/planner/analysis/check-extraction.js.map +1 -0
- package/dist/src/planner/analysis/constraint-extractor.d.ts +47 -7
- package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.js +186 -93
- package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
- package/dist/src/planner/analysis/partial-unique-extraction.d.ts +68 -0
- package/dist/src/planner/analysis/partial-unique-extraction.d.ts.map +1 -0
- package/dist/src/planner/analysis/partial-unique-extraction.js +347 -0
- package/dist/src/planner/analysis/partial-unique-extraction.js.map +1 -0
- package/dist/src/planner/analysis/predicate-conjuncts.d.ts +14 -0
- package/dist/src/planner/analysis/predicate-conjuncts.d.ts.map +1 -0
- package/dist/src/planner/analysis/predicate-conjuncts.js +31 -0
- package/dist/src/planner/analysis/predicate-conjuncts.js.map +1 -0
- package/dist/src/planner/analysis/predicate-shape.d.ts +52 -0
- package/dist/src/planner/analysis/predicate-shape.d.ts.map +1 -0
- package/dist/src/planner/analysis/predicate-shape.js +119 -0
- package/dist/src/planner/analysis/predicate-shape.js.map +1 -0
- package/dist/src/planner/analysis/sat-checker.d.ts +43 -0
- package/dist/src/planner/analysis/sat-checker.d.ts.map +1 -0
- package/dist/src/planner/analysis/sat-checker.js +393 -0
- package/dist/src/planner/analysis/sat-checker.js.map +1 -0
- package/dist/src/planner/building/table.d.ts.map +1 -1
- package/dist/src/planner/building/table.js +1 -1
- package/dist/src/planner/building/table.js.map +1 -1
- package/dist/src/planner/framework/characteristics.d.ts +10 -1
- package/dist/src/planner/framework/characteristics.d.ts.map +1 -1
- package/dist/src/planner/framework/characteristics.js +24 -5
- package/dist/src/planner/framework/characteristics.js.map +1 -1
- package/dist/src/planner/framework/context.d.ts +1 -8
- package/dist/src/planner/framework/context.d.ts.map +1 -1
- package/dist/src/planner/framework/context.js +4 -21
- package/dist/src/planner/framework/context.js.map +1 -1
- package/dist/src/planner/framework/pass.d.ts +18 -2
- package/dist/src/planner/framework/pass.d.ts.map +1 -1
- package/dist/src/planner/framework/pass.js +145 -46
- package/dist/src/planner/framework/pass.js.map +1 -1
- package/dist/src/planner/framework/physical-utils.d.ts +0 -9
- package/dist/src/planner/framework/physical-utils.d.ts.map +1 -1
- package/dist/src/planner/framework/physical-utils.js +0 -31
- package/dist/src/planner/framework/physical-utils.js.map +1 -1
- package/dist/src/planner/nodes/aggregate-node.d.ts +25 -0
- package/dist/src/planner/nodes/aggregate-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/aggregate-node.js +75 -8
- 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 +6 -1
- package/dist/src/planner/nodes/alias-node.js.map +1 -1
- package/dist/src/planner/nodes/asof-scan-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/asof-scan-node.js +17 -3
- package/dist/src/planner/nodes/asof-scan-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 +19 -9
- package/dist/src/planner/nodes/bloom-join-node.js.map +1 -1
- package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/distinct-node.js +10 -6
- package/dist/src/planner/nodes/distinct-node.js.map +1 -1
- package/dist/src/planner/nodes/empty-relation-node.d.ts +27 -0
- package/dist/src/planner/nodes/empty-relation-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/empty-relation-node.js +61 -0
- package/dist/src/planner/nodes/empty-relation-node.js.map +1 -0
- package/dist/src/planner/nodes/filter.d.ts.map +1 -1
- package/dist/src/planner/nodes/filter.js +65 -5
- package/dist/src/planner/nodes/filter.js.map +1 -1
- package/dist/src/planner/nodes/hash-aggregate.d.ts +1 -1
- package/dist/src/planner/nodes/hash-aggregate.d.ts.map +1 -1
- package/dist/src/planner/nodes/hash-aggregate.js +8 -6
- package/dist/src/planner/nodes/hash-aggregate.js.map +1 -1
- package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-node.js +12 -9
- package/dist/src/planner/nodes/join-node.js.map +1 -1
- package/dist/src/planner/nodes/join-utils.d.ts +24 -1
- package/dist/src/planner/nodes/join-utils.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-utils.js +86 -0
- package/dist/src/planner/nodes/join-utils.js.map +1 -1
- package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
- package/dist/src/planner/nodes/limit-offset.js +6 -1
- package/dist/src/planner/nodes/limit-offset.js.map +1 -1
- package/dist/src/planner/nodes/merge-join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/merge-join-node.js +19 -9
- 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 +5 -2
- package/dist/src/planner/nodes/ordinal-slice-node.js.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.d.ts +1 -0
- package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.js +1 -0
- package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
- package/dist/src/planner/nodes/plan-node.d.ts +186 -4
- 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/project-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/project-node.js +75 -30
- package/dist/src/planner/nodes/project-node.js.map +1 -1
- package/dist/src/planner/nodes/reference.d.ts +24 -2
- package/dist/src/planner/nodes/reference.d.ts.map +1 -1
- package/dist/src/planner/nodes/reference.js +101 -1
- package/dist/src/planner/nodes/reference.js.map +1 -1
- package/dist/src/planner/nodes/retrieve-node.d.ts +9 -1
- package/dist/src/planner/nodes/retrieve-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/retrieve-node.js +21 -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 +64 -28
- package/dist/src/planner/nodes/returning-node.js.map +1 -1
- package/dist/src/planner/nodes/scalar.d.ts +1 -0
- package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
- package/dist/src/planner/nodes/scalar.js +12 -0
- package/dist/src/planner/nodes/scalar.js.map +1 -1
- package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/set-operation-node.js +15 -0
- 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 -1
- 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 +10 -3
- package/dist/src/planner/nodes/sort.js.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.d.ts +1 -1
- package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.js +8 -8
- package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.d.ts +3 -3
- package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.js +26 -8
- package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
- package/dist/src/planner/nodes/table-function-call.d.ts +4 -1
- package/dist/src/planner/nodes/table-function-call.d.ts.map +1 -1
- package/dist/src/planner/nodes/table-function-call.js +224 -14
- package/dist/src/planner/nodes/table-function-call.js.map +1 -1
- package/dist/src/planner/nodes/window-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/window-node.js +9 -2
- package/dist/src/planner/nodes/window-node.js.map +1 -1
- package/dist/src/planner/optimizer-tuning.d.ts +29 -1
- package/dist/src/planner/optimizer-tuning.d.ts.map +1 -1
- package/dist/src/planner/optimizer-tuning.js +3 -0
- package/dist/src/planner/optimizer-tuning.js.map +1 -1
- package/dist/src/planner/optimizer.d.ts.map +1 -1
- package/dist/src/planner/optimizer.js +187 -0
- package/dist/src/planner/optimizer.js.map +1 -1
- 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 +22 -7
- package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts +30 -0
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts.map +1 -0
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js +116 -0
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js.map +1 -0
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.d.ts +7 -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 +18 -16
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.js.map +1 -1
- package/dist/src/planner/rules/join/rule-join-elimination.d.ts +56 -0
- package/dist/src/planner/rules/join/rule-join-elimination.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-join-elimination.js +326 -0
- package/dist/src/planner/rules/join/rule-join-elimination.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 +10 -2
- package/dist/src/planner/rules/join/rule-join-greedy-commute.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.d.ts +20 -0
- package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.d.ts.map +1 -0
- package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js +181 -0
- package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js.map +1 -0
- package/dist/src/planner/rules/predicate/rule-empty-relation-folding.d.ts +46 -0
- package/dist/src/planner/rules/predicate/rule-empty-relation-folding.d.ts.map +1 -0
- package/dist/src/planner/rules/predicate/rule-empty-relation-folding.js +156 -0
- package/dist/src/planner/rules/predicate/rule-empty-relation-folding.js.map +1 -0
- package/dist/src/planner/rules/predicate/rule-filter-contradiction.d.ts +30 -0
- package/dist/src/planner/rules/predicate/rule-filter-contradiction.d.ts.map +1 -0
- package/dist/src/planner/rules/predicate/rule-filter-contradiction.js +60 -0
- package/dist/src/planner/rules/predicate/rule-filter-contradiction.js.map +1 -0
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.d.ts +45 -0
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.d.ts.map +1 -0
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js +210 -0
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js.map +1 -0
- package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.d.ts +29 -0
- package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.d.ts.map +1 -0
- package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.js +161 -0
- package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.js.map +1 -0
- package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.d.ts +39 -0
- package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.d.ts.map +1 -0
- package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.js +91 -0
- package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.js.map +1 -0
- package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.d.ts +35 -0
- package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.d.ts.map +1 -0
- package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js +74 -0
- package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js.map +1 -0
- package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.d.ts +27 -0
- package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.d.ts.map +1 -0
- package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js +103 -0
- package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js.map +1 -0
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts.map +1 -1
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js +1 -25
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js.map +1 -1
- package/dist/src/planner/scopes/global.js +2 -2
- package/dist/src/planner/scopes/global.js.map +1 -1
- package/dist/src/planner/type-utils.d.ts.map +1 -1
- package/dist/src/planner/type-utils.js +11 -0
- package/dist/src/planner/type-utils.js.map +1 -1
- package/dist/src/planner/util/fd-utils.d.ts +245 -0
- package/dist/src/planner/util/fd-utils.d.ts.map +1 -0
- package/dist/src/planner/util/fd-utils.js +1416 -0
- package/dist/src/planner/util/fd-utils.js.map +1 -0
- package/dist/src/planner/util/ind-utils.d.ts +79 -0
- package/dist/src/planner/util/ind-utils.d.ts.map +1 -0
- package/dist/src/planner/util/ind-utils.js +146 -0
- package/dist/src/planner/util/ind-utils.js.map +1 -0
- package/dist/src/planner/util/key-utils.d.ts +75 -14
- package/dist/src/planner/util/key-utils.d.ts.map +1 -1
- package/dist/src/planner/util/key-utils.js +234 -57
- package/dist/src/planner/util/key-utils.js.map +1 -1
- package/dist/src/runtime/delta-executor.d.ts +134 -0
- package/dist/src/runtime/delta-executor.d.ts.map +1 -0
- package/dist/src/runtime/delta-executor.js +382 -0
- package/dist/src/runtime/delta-executor.js.map +1 -0
- package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
- package/dist/src/runtime/emit/alter-table.js +70 -24
- package/dist/src/runtime/emit/alter-table.js.map +1 -1
- package/dist/src/runtime/emit/create-assertion.d.ts.map +1 -1
- package/dist/src/runtime/emit/create-assertion.js +3 -2
- package/dist/src/runtime/emit/create-assertion.js.map +1 -1
- package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
- package/dist/src/runtime/emit/dml-executor.js +121 -41
- package/dist/src/runtime/emit/dml-executor.js.map +1 -1
- package/dist/src/runtime/emit/drop-assertion.js +1 -1
- package/dist/src/runtime/emit/drop-assertion.js.map +1 -1
- package/dist/src/runtime/emit/empty-relation.d.ts +5 -0
- package/dist/src/runtime/emit/empty-relation.d.ts.map +1 -0
- package/dist/src/runtime/emit/empty-relation.js +11 -0
- package/dist/src/runtime/emit/empty-relation.js.map +1 -0
- package/dist/src/runtime/foreign-key-actions.d.ts +39 -0
- package/dist/src/runtime/foreign-key-actions.d.ts.map +1 -1
- package/dist/src/runtime/foreign-key-actions.js +219 -1
- package/dist/src/runtime/foreign-key-actions.js.map +1 -1
- package/dist/src/runtime/register.d.ts.map +1 -1
- package/dist/src/runtime/register.js +2 -0
- package/dist/src/runtime/register.js.map +1 -1
- package/dist/src/schema/assertion.d.ts +8 -0
- package/dist/src/schema/assertion.d.ts.map +1 -1
- package/dist/src/schema/change-events.d.ts +5 -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/function.d.ts +65 -1
- package/dist/src/schema/function.d.ts.map +1 -1
- package/dist/src/schema/function.js +31 -0
- package/dist/src/schema/function.js.map +1 -1
- package/dist/src/schema/manager.d.ts +33 -0
- package/dist/src/schema/manager.d.ts.map +1 -1
- package/dist/src/schema/manager.js +95 -4
- package/dist/src/schema/manager.js.map +1 -1
- package/dist/src/schema/rename-rewriter.d.ts +32 -0
- package/dist/src/schema/rename-rewriter.d.ts.map +1 -1
- package/dist/src/schema/rename-rewriter.js +392 -105
- package/dist/src/schema/rename-rewriter.js.map +1 -1
- package/dist/src/schema/table.d.ts +21 -2
- package/dist/src/schema/table.d.ts.map +1 -1
- package/dist/src/schema/table.js +17 -8
- package/dist/src/schema/table.js.map +1 -1
- package/dist/src/types/temporal-types.d.ts.map +1 -1
- package/dist/src/types/temporal-types.js +32 -0
- package/dist/src/types/temporal-types.js.map +1 -1
- package/dist/src/vtab/events.d.ts +9 -0
- package/dist/src/vtab/events.d.ts.map +1 -1
- package/dist/src/vtab/events.js +19 -0
- package/dist/src/vtab/events.js.map +1 -1
- package/dist/src/vtab/memory/layer/connection.d.ts +20 -8
- package/dist/src/vtab/memory/layer/connection.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/connection.js +95 -73
- package/dist/src/vtab/memory/layer/connection.js.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +91 -10
- package/dist/src/vtab/memory/layer/manager.js.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.d.ts +0 -8
- package/dist/src/vtab/memory/layer/transaction.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.js +0 -15
- package/dist/src/vtab/memory/layer/transaction.js.map +1 -1
- package/dist/src/vtab/memory/table.d.ts.map +1 -1
- package/dist/src/vtab/memory/table.js +13 -2
- package/dist/src/vtab/memory/table.js.map +1 -1
- package/dist/src/vtab/memory/utils/predicate.d.ts +2 -1
- package/dist/src/vtab/memory/utils/predicate.d.ts.map +1 -1
- package/dist/src/vtab/memory/utils/predicate.js +32 -1
- package/dist/src/vtab/memory/utils/predicate.js.map +1 -1
- package/package.json +3 -3
|
@@ -208,33 +208,118 @@ export function renameColumnInAst(node, tableName, oldColName, newColName, defau
|
|
|
208
208
|
visitColumnRename(node, state);
|
|
209
209
|
return state.changed;
|
|
210
210
|
}
|
|
211
|
-
|
|
212
|
-
|
|
211
|
+
/**
|
|
212
|
+
* Rewrite a column reference inside a CHECK expression. Unlike
|
|
213
|
+
* `renameColumnInAst`, this entry point seeds the scope stack with an
|
|
214
|
+
* implicit unaliased binding to `tableName` so top-level unqualified
|
|
215
|
+
* `ColumnExpr` nodes resolve to the owning table. CHECK expressions
|
|
216
|
+
* cannot reference other tables at top level, so the implicit binding
|
|
217
|
+
* is safe there.
|
|
218
|
+
*
|
|
219
|
+
* When `resolveColumnInSource` is supplied, the scope walk consults it at
|
|
220
|
+
* each inner FROM frame: if any real-table source in that frame exposes
|
|
221
|
+
* `oldColName`, the unqualified ref binds inside the subquery and the
|
|
222
|
+
* walk stops before reaching the seed. This stops the rewriter from
|
|
223
|
+
* false-positively rewriting an inner unqualified ref that legitimately
|
|
224
|
+
* binds to a like-named column on the subquery's FROM (e.g.
|
|
225
|
+
* `check ((select min(v) from u) > 0)` when `u` also has a `v` column).
|
|
226
|
+
*
|
|
227
|
+
* Limitation: aliased subquery / function-source / CTE-projection inner
|
|
228
|
+
* sources are not asked (the rewriter would need recursive column-set
|
|
229
|
+
* inference on their bodies). Same latent issue exists in
|
|
230
|
+
* `renameColumnInAst` for non-CHECK paths — file a follow-up if it
|
|
231
|
+
* surfaces; the callback infrastructure is already in place.
|
|
232
|
+
*/
|
|
233
|
+
export function renameColumnInCheckExpression(expr, tableName, oldColName, newColName, defaultSchemaName, resolveColumnInSource) {
|
|
234
|
+
if (!expr)
|
|
235
|
+
return false;
|
|
236
|
+
const state = {
|
|
237
|
+
tableName: tableName.toLowerCase(),
|
|
238
|
+
oldCol: oldColName.toLowerCase(),
|
|
239
|
+
newCol: newColName,
|
|
240
|
+
defaultSchema: defaultSchemaName.toLowerCase(),
|
|
241
|
+
scopeStack: [],
|
|
242
|
+
changed: false,
|
|
243
|
+
resolveColumnInSource,
|
|
244
|
+
};
|
|
245
|
+
const frame = emptyFrame();
|
|
246
|
+
frame.unaliased.add(state.tableName);
|
|
247
|
+
state.scopeStack.push(frame);
|
|
248
|
+
try {
|
|
249
|
+
visitColumnRename(expr, state);
|
|
250
|
+
}
|
|
251
|
+
finally {
|
|
252
|
+
state.scopeStack.pop();
|
|
253
|
+
}
|
|
254
|
+
return state.changed;
|
|
255
|
+
}
|
|
256
|
+
function emptyFrame() {
|
|
257
|
+
return {
|
|
258
|
+
unaliased: new Set(),
|
|
259
|
+
aliasMap: new Map(),
|
|
260
|
+
ctesExposingRenamed: new Set(),
|
|
261
|
+
ctesInScope: new Set(),
|
|
262
|
+
ctesShadowingSource: new Set(),
|
|
263
|
+
realSources: [],
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
function buildScopeFrame(from, state) {
|
|
267
|
+
const frame = emptyFrame();
|
|
213
268
|
if (!from)
|
|
214
269
|
return frame;
|
|
215
270
|
for (const item of from) {
|
|
216
|
-
collectFromBindings(item,
|
|
271
|
+
collectFromBindings(item, state, frame);
|
|
217
272
|
}
|
|
218
273
|
return frame;
|
|
219
274
|
}
|
|
220
|
-
function collectFromBindings(item,
|
|
275
|
+
function collectFromBindings(item, state, frame) {
|
|
221
276
|
switch (item.type) {
|
|
222
277
|
case 'table': {
|
|
223
278
|
const ts = item;
|
|
224
|
-
const schema = (ts.table.schema ?? defaultSchema).toLowerCase();
|
|
225
279
|
const name = ts.table.name.toLowerCase();
|
|
280
|
+
// Unqualified reference to a CTE in scope — the CTE shadows any
|
|
281
|
+
// same-named real table. Whether it re-exposes the renamed column
|
|
282
|
+
// determines whether unqualified refs against this source rewrite.
|
|
283
|
+
if (ts.table.schema === undefined && isCteInScope(state, name)) {
|
|
284
|
+
if (isCteExposingInScope(state, name)) {
|
|
285
|
+
if (ts.alias) {
|
|
286
|
+
frame.aliasMap.set(ts.alias.toLowerCase(), state.tableName);
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
frame.unaliased.add(state.tableName);
|
|
290
|
+
// The CTE name acts as an implicit qualifier for refs like "a.k".
|
|
291
|
+
frame.aliasMap.set(name, state.tableName);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
// Shadowing-but-not-exposing: the source binds to the CTE
|
|
296
|
+
// row source, not the renamed real table. Record the
|
|
297
|
+
// qualifier (alias if present, otherwise the source name)
|
|
298
|
+
// so qualified column refs against it don't short-circuit
|
|
299
|
+
// to the renamed table.
|
|
300
|
+
frame.ctesShadowingSource.add(ts.alias ? ts.alias.toLowerCase() : name);
|
|
301
|
+
}
|
|
302
|
+
// Shadowing-but-not-exposing: do not bind as the renamed table.
|
|
303
|
+
break;
|
|
304
|
+
}
|
|
305
|
+
const schemaLower = (ts.table.schema ?? state.defaultSchema).toLowerCase();
|
|
226
306
|
if (ts.alias) {
|
|
227
307
|
frame.aliasMap.set(ts.alias.toLowerCase(), name);
|
|
228
308
|
}
|
|
229
|
-
else if (
|
|
309
|
+
else if (schemaLower === state.defaultSchema || ts.table.schema === undefined) {
|
|
230
310
|
frame.unaliased.add(name);
|
|
231
311
|
}
|
|
312
|
+
// Record as a real-table source so the unqualified-scope walk can
|
|
313
|
+
// ask whether this source exposes the renamed column. Both aliased
|
|
314
|
+
// and unaliased real sources are recorded — asking "does u expose
|
|
315
|
+
// col v" is the same question regardless of any alias.
|
|
316
|
+
frame.realSources.push({ schema: schemaLower, name });
|
|
232
317
|
break;
|
|
233
318
|
}
|
|
234
319
|
case 'join': {
|
|
235
320
|
const join = item;
|
|
236
|
-
collectFromBindings(join.left,
|
|
237
|
-
collectFromBindings(join.right,
|
|
321
|
+
collectFromBindings(join.left, state, frame);
|
|
322
|
+
collectFromBindings(join.right, state, frame);
|
|
238
323
|
break;
|
|
239
324
|
}
|
|
240
325
|
case 'subquerySource':
|
|
@@ -245,46 +330,119 @@ function collectFromBindings(item, defaultSchema, frame) {
|
|
|
245
330
|
break;
|
|
246
331
|
}
|
|
247
332
|
}
|
|
248
|
-
|
|
333
|
+
/**
|
|
334
|
+
* Innermost-first walk: an inner non-exposing same-name CTE shadows an
|
|
335
|
+
* outer exposing one, so a `ctesInScope` hit without a matching
|
|
336
|
+
* `ctesExposingRenamed` entry wins. `isCteInScope` (below) intentionally
|
|
337
|
+
* stays OR-shaped — it only gates "is this source a CTE rather than a
|
|
338
|
+
* real table?", a question for which any enclosing CTE suffices.
|
|
339
|
+
*/
|
|
340
|
+
function isCteExposingInScope(state, name) {
|
|
341
|
+
for (let i = state.scopeStack.length - 1; i >= 0; i--) {
|
|
342
|
+
const frame = state.scopeStack[i];
|
|
343
|
+
if (frame.ctesExposingRenamed.has(name))
|
|
344
|
+
return true;
|
|
345
|
+
if (frame.ctesInScope.has(name))
|
|
346
|
+
return false;
|
|
347
|
+
}
|
|
348
|
+
return false;
|
|
349
|
+
}
|
|
350
|
+
function isCteInScope(state, name) {
|
|
249
351
|
for (const frame of state.scopeStack) {
|
|
352
|
+
if (frame.ctesInScope.has(name))
|
|
353
|
+
return true;
|
|
354
|
+
}
|
|
355
|
+
return false;
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Innermost-first walk: a closer same-name CTE shadows an outer unaliased
|
|
359
|
+
* binding to the renamed real table. When a `resolveColumnInSource`
|
|
360
|
+
* callback is configured, also stop at any inner FROM frame whose real
|
|
361
|
+
* sources expose `oldCol` — the unqualified ref binds inside that frame
|
|
362
|
+
* and an outer seed binding must not capture it.
|
|
363
|
+
*/
|
|
364
|
+
function isTableInUnaliasedScope(state) {
|
|
365
|
+
for (let i = state.scopeStack.length - 1; i >= 0; i--) {
|
|
366
|
+
const frame = state.scopeStack[i];
|
|
367
|
+
if (frame.ctesInScope.has(state.tableName))
|
|
368
|
+
return false;
|
|
369
|
+
if (state.resolveColumnInSource && frame.realSources.length > 0) {
|
|
370
|
+
for (const src of frame.realSources) {
|
|
371
|
+
// The renamed table itself trivially exposes oldCol; defer to
|
|
372
|
+
// the existing `unaliased` check below so we don't
|
|
373
|
+
// double-capture.
|
|
374
|
+
if (src.name === state.tableName && src.schema === state.defaultSchema)
|
|
375
|
+
continue;
|
|
376
|
+
if (state.resolveColumnInSource(src.schema, src.name, state.oldCol))
|
|
377
|
+
return false;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
250
380
|
if (frame.unaliased.has(state.tableName))
|
|
251
381
|
return true;
|
|
252
382
|
}
|
|
253
383
|
return false;
|
|
254
384
|
}
|
|
385
|
+
/**
|
|
386
|
+
* Innermost-first walk: a closer alias binding wins over an outer one
|
|
387
|
+
* (standard SQL alias shadowing).
|
|
388
|
+
*/
|
|
255
389
|
function aliasResolvesToTable(state, alias) {
|
|
256
390
|
const aliasLower = alias.toLowerCase();
|
|
257
|
-
for (
|
|
258
|
-
const target =
|
|
391
|
+
for (let i = state.scopeStack.length - 1; i >= 0; i--) {
|
|
392
|
+
const target = state.scopeStack[i].aliasMap.get(aliasLower);
|
|
259
393
|
if (target !== undefined)
|
|
260
394
|
return target === state.tableName;
|
|
261
395
|
}
|
|
262
396
|
return false;
|
|
263
397
|
}
|
|
398
|
+
/**
|
|
399
|
+
* Walk the scope stack innermost-first to decide whether a qualifier
|
|
400
|
+
* resolves to a non-exposing shadowing CTE rather than the renamed real
|
|
401
|
+
* table. A closer rebind to the real table (via unaliased binding or alias)
|
|
402
|
+
* wins over an outer shadowing entry.
|
|
403
|
+
*/
|
|
404
|
+
function isQualifierShadowedInScope(state, qualifier) {
|
|
405
|
+
for (let i = state.scopeStack.length - 1; i >= 0; i--) {
|
|
406
|
+
const frame = state.scopeStack[i];
|
|
407
|
+
if (frame.ctesShadowingSource.has(qualifier))
|
|
408
|
+
return true;
|
|
409
|
+
// Closer rebind to the real table wins → not shadowed at this point.
|
|
410
|
+
if (frame.aliasMap.get(qualifier) === state.tableName)
|
|
411
|
+
return false;
|
|
412
|
+
if (qualifier === state.tableName && frame.unaliased.has(state.tableName))
|
|
413
|
+
return false;
|
|
414
|
+
}
|
|
415
|
+
return false;
|
|
416
|
+
}
|
|
264
417
|
function visitColumnRename(node, state) {
|
|
265
418
|
if (!node)
|
|
266
419
|
return;
|
|
267
420
|
switch (node.type) {
|
|
268
421
|
case 'select': {
|
|
269
422
|
const stmt = node;
|
|
270
|
-
stmt.withClause
|
|
271
|
-
const frame = buildScopeFrame(stmt.from, state.defaultSchema);
|
|
272
|
-
state.scopeStack.push(frame);
|
|
423
|
+
pushWithFrame(stmt.withClause, state);
|
|
273
424
|
try {
|
|
274
|
-
(stmt.
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
visitColumnRename(stmt.
|
|
425
|
+
const frame = buildScopeFrame(stmt.from, state);
|
|
426
|
+
state.scopeStack.push(frame);
|
|
427
|
+
try {
|
|
428
|
+
(stmt.columns ?? []).forEach(c => {
|
|
429
|
+
if (c.type === 'column')
|
|
430
|
+
visitColumnRename(c.expr, state);
|
|
431
|
+
});
|
|
432
|
+
(stmt.from ?? []).forEach(f => visitColumnRename(f, state));
|
|
433
|
+
visitColumnRename(stmt.where, state);
|
|
434
|
+
(stmt.groupBy ?? []).forEach(g => visitColumnRename(g, state));
|
|
435
|
+
visitColumnRename(stmt.having, state);
|
|
436
|
+
(stmt.orderBy ?? []).forEach(o => visitColumnRename(o.expr, state));
|
|
437
|
+
visitColumnRename(stmt.limit, state);
|
|
438
|
+
visitColumnRename(stmt.offset, state);
|
|
439
|
+
visitColumnRename(stmt.union, state);
|
|
440
|
+
if (stmt.compound)
|
|
441
|
+
visitColumnRename(stmt.compound.select, state);
|
|
442
|
+
}
|
|
443
|
+
finally {
|
|
444
|
+
state.scopeStack.pop();
|
|
445
|
+
}
|
|
288
446
|
}
|
|
289
447
|
finally {
|
|
290
448
|
state.scopeStack.pop();
|
|
@@ -293,80 +451,90 @@ function visitColumnRename(node, state) {
|
|
|
293
451
|
}
|
|
294
452
|
case 'insert': {
|
|
295
453
|
const stmt = node;
|
|
296
|
-
stmt.withClause
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
state.
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
(
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
state.
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
a.column
|
|
323
|
-
|
|
454
|
+
pushWithFrame(stmt.withClause, state);
|
|
455
|
+
try {
|
|
456
|
+
const targetIsRenamed = eq(stmt.table.name, state.tableName) &&
|
|
457
|
+
(stmt.table.schema === undefined || eq(stmt.table.schema, state.defaultSchema));
|
|
458
|
+
if (targetIsRenamed && stmt.columns) {
|
|
459
|
+
stmt.columns = stmt.columns.map(c => {
|
|
460
|
+
if (c.toLowerCase() === state.oldCol) {
|
|
461
|
+
state.changed = true;
|
|
462
|
+
return state.newCol;
|
|
463
|
+
}
|
|
464
|
+
return c;
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
if (targetIsRenamed) {
|
|
468
|
+
(stmt.upsertClauses ?? []).forEach(uc => {
|
|
469
|
+
if (uc.conflictTarget) {
|
|
470
|
+
uc.conflictTarget = uc.conflictTarget.map(c => {
|
|
471
|
+
if (c.toLowerCase() === state.oldCol) {
|
|
472
|
+
state.changed = true;
|
|
473
|
+
return state.newCol;
|
|
474
|
+
}
|
|
475
|
+
return c;
|
|
476
|
+
});
|
|
477
|
+
}
|
|
478
|
+
if (uc.assignments) {
|
|
479
|
+
for (const a of uc.assignments) {
|
|
480
|
+
if (a.column.toLowerCase() === state.oldCol) {
|
|
481
|
+
a.column = state.newCol;
|
|
482
|
+
state.changed = true;
|
|
483
|
+
}
|
|
324
484
|
}
|
|
325
485
|
}
|
|
326
|
-
}
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
(stmt.values ?? []).forEach(row => row.forEach(v => visitColumnRename(v, state)));
|
|
489
|
+
visitColumnRename(stmt.select, state);
|
|
490
|
+
(stmt.upsertClauses ?? []).forEach(uc => {
|
|
491
|
+
(uc.assignments ?? []).forEach(a => visitColumnRename(a.value, state));
|
|
492
|
+
visitColumnRename(uc.where, state);
|
|
327
493
|
});
|
|
494
|
+
(stmt.returning ?? []).forEach(r => {
|
|
495
|
+
if (r.type === 'column')
|
|
496
|
+
visitColumnRename(r.expr, state);
|
|
497
|
+
});
|
|
498
|
+
(stmt.contextValues ?? []).forEach(cv => visitColumnRename(cv.value, state));
|
|
499
|
+
}
|
|
500
|
+
finally {
|
|
501
|
+
state.scopeStack.pop();
|
|
328
502
|
}
|
|
329
|
-
(stmt.values ?? []).forEach(row => row.forEach(v => visitColumnRename(v, state)));
|
|
330
|
-
visitColumnRename(stmt.select, state);
|
|
331
|
-
(stmt.upsertClauses ?? []).forEach(uc => {
|
|
332
|
-
(uc.assignments ?? []).forEach(a => visitColumnRename(a.value, state));
|
|
333
|
-
visitColumnRename(uc.where, state);
|
|
334
|
-
});
|
|
335
|
-
(stmt.returning ?? []).forEach(r => {
|
|
336
|
-
if (r.type === 'column')
|
|
337
|
-
visitColumnRename(r.expr, state);
|
|
338
|
-
});
|
|
339
|
-
(stmt.contextValues ?? []).forEach(cv => visitColumnRename(cv.value, state));
|
|
340
503
|
break;
|
|
341
504
|
}
|
|
342
505
|
case 'update': {
|
|
343
506
|
const stmt = node;
|
|
344
|
-
stmt.withClause
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
a.column
|
|
351
|
-
|
|
507
|
+
pushWithFrame(stmt.withClause, state);
|
|
508
|
+
try {
|
|
509
|
+
const targetIsRenamed = eq(stmt.table.name, state.tableName) &&
|
|
510
|
+
(stmt.table.schema === undefined || eq(stmt.table.schema, state.defaultSchema));
|
|
511
|
+
if (targetIsRenamed) {
|
|
512
|
+
for (const a of stmt.assignments) {
|
|
513
|
+
if (a.column.toLowerCase() === state.oldCol) {
|
|
514
|
+
a.column = state.newCol;
|
|
515
|
+
state.changed = true;
|
|
516
|
+
}
|
|
352
517
|
}
|
|
353
518
|
}
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
519
|
+
// Push a scope frame so unqualified column refs in WHERE/RETURNING
|
|
520
|
+
// resolve against the update target.
|
|
521
|
+
const frame = emptyFrame();
|
|
522
|
+
if (stmt.table.schema === undefined || eq(stmt.table.schema, state.defaultSchema)) {
|
|
523
|
+
frame.unaliased.add(stmt.table.name.toLowerCase());
|
|
524
|
+
}
|
|
525
|
+
state.scopeStack.push(frame);
|
|
526
|
+
try {
|
|
527
|
+
stmt.assignments.forEach(a => visitColumnRename(a.value, state));
|
|
528
|
+
visitColumnRename(stmt.where, state);
|
|
529
|
+
(stmt.returning ?? []).forEach(r => {
|
|
530
|
+
if (r.type === 'column')
|
|
531
|
+
visitColumnRename(r.expr, state);
|
|
532
|
+
});
|
|
533
|
+
(stmt.contextValues ?? []).forEach(cv => visitColumnRename(cv.value, state));
|
|
534
|
+
}
|
|
535
|
+
finally {
|
|
536
|
+
state.scopeStack.pop();
|
|
537
|
+
}
|
|
370
538
|
}
|
|
371
539
|
finally {
|
|
372
540
|
state.scopeStack.pop();
|
|
@@ -375,19 +543,24 @@ function visitColumnRename(node, state) {
|
|
|
375
543
|
}
|
|
376
544
|
case 'delete': {
|
|
377
545
|
const stmt = node;
|
|
378
|
-
stmt.withClause
|
|
379
|
-
const frame = { unaliased: new Set(), aliasMap: new Map() };
|
|
380
|
-
if (stmt.table.schema === undefined || eq(stmt.table.schema, state.defaultSchema)) {
|
|
381
|
-
frame.unaliased.add(stmt.table.name.toLowerCase());
|
|
382
|
-
}
|
|
383
|
-
state.scopeStack.push(frame);
|
|
546
|
+
pushWithFrame(stmt.withClause, state);
|
|
384
547
|
try {
|
|
385
|
-
|
|
386
|
-
(stmt.
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
548
|
+
const frame = emptyFrame();
|
|
549
|
+
if (stmt.table.schema === undefined || eq(stmt.table.schema, state.defaultSchema)) {
|
|
550
|
+
frame.unaliased.add(stmt.table.name.toLowerCase());
|
|
551
|
+
}
|
|
552
|
+
state.scopeStack.push(frame);
|
|
553
|
+
try {
|
|
554
|
+
visitColumnRename(stmt.where, state);
|
|
555
|
+
(stmt.returning ?? []).forEach(r => {
|
|
556
|
+
if (r.type === 'column')
|
|
557
|
+
visitColumnRename(r.expr, state);
|
|
558
|
+
});
|
|
559
|
+
(stmt.contextValues ?? []).forEach(cv => visitColumnRename(cv.value, state));
|
|
560
|
+
}
|
|
561
|
+
finally {
|
|
562
|
+
state.scopeStack.pop();
|
|
563
|
+
}
|
|
391
564
|
}
|
|
392
565
|
finally {
|
|
393
566
|
state.scopeStack.pop();
|
|
@@ -481,7 +654,8 @@ function visitColumnRename(node, state) {
|
|
|
481
654
|
if (col.table) {
|
|
482
655
|
const qualifierLower = col.table.toLowerCase();
|
|
483
656
|
const directHit = qualifierLower === state.tableName &&
|
|
484
|
-
(col.schema === undefined || eq(col.schema, state.defaultSchema))
|
|
657
|
+
(col.schema === undefined || eq(col.schema, state.defaultSchema)) &&
|
|
658
|
+
!isQualifierShadowedInScope(state, qualifierLower);
|
|
485
659
|
const viaAlias = aliasResolvesToTable(state, col.table);
|
|
486
660
|
if (directHit || viaAlias) {
|
|
487
661
|
col.name = state.newCol;
|
|
@@ -503,4 +677,117 @@ function visitColumnRename(node, state) {
|
|
|
503
677
|
break;
|
|
504
678
|
}
|
|
505
679
|
}
|
|
680
|
+
/**
|
|
681
|
+
* Push a with-frame that registers any CTEs in the given WITH clause that
|
|
682
|
+
* re-expose the renamed column. CTEs are visited in declaration order so
|
|
683
|
+
* later CTEs see earlier ones in the same WITH.
|
|
684
|
+
*
|
|
685
|
+
* For `with recursive`, each CTE's name is registered in `ctesInScope`
|
|
686
|
+
* *before* its body is visited so self-references inside the recursive step
|
|
687
|
+
* resolve to the CTE (not to a same-named renamed table). For non-recursive
|
|
688
|
+
* WITH, the name is registered only after the body — a non-recursive body
|
|
689
|
+
* must not see itself.
|
|
690
|
+
*
|
|
691
|
+
* Caller is responsible for popping the frame via `state.scopeStack.pop()`.
|
|
692
|
+
*/
|
|
693
|
+
function pushWithFrame(withClause, state) {
|
|
694
|
+
const frame = emptyFrame();
|
|
695
|
+
state.scopeStack.push(frame);
|
|
696
|
+
if (withClause) {
|
|
697
|
+
for (const cte of withClause.ctes) {
|
|
698
|
+
const nameLower = cte.name.toLowerCase();
|
|
699
|
+
if (withClause.recursive) {
|
|
700
|
+
frame.ctesInScope.add(nameLower);
|
|
701
|
+
}
|
|
702
|
+
visitColumnRename(cte.query, state);
|
|
703
|
+
if (cteExposesRenamedColumn(cte, state)) {
|
|
704
|
+
frame.ctesExposingRenamed.add(nameLower);
|
|
705
|
+
}
|
|
706
|
+
frame.ctesInScope.add(nameLower);
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
return frame;
|
|
710
|
+
}
|
|
711
|
+
/**
|
|
712
|
+
* Rebuild a with-frame's `ctesExposingRenamed` set for exposure analysis
|
|
713
|
+
* without re-visiting CTE bodies (they were already visited).
|
|
714
|
+
*/
|
|
715
|
+
function analyzeWithFrame(withClause, state) {
|
|
716
|
+
const frame = emptyFrame();
|
|
717
|
+
if (!withClause)
|
|
718
|
+
return frame;
|
|
719
|
+
state.scopeStack.push(frame);
|
|
720
|
+
try {
|
|
721
|
+
for (const cte of withClause.ctes) {
|
|
722
|
+
if (cteExposesRenamedColumn(cte, state)) {
|
|
723
|
+
frame.ctesExposingRenamed.add(cte.name.toLowerCase());
|
|
724
|
+
}
|
|
725
|
+
frame.ctesInScope.add(cte.name.toLowerCase());
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
finally {
|
|
729
|
+
state.scopeStack.pop();
|
|
730
|
+
}
|
|
731
|
+
return frame;
|
|
732
|
+
}
|
|
733
|
+
/**
|
|
734
|
+
* Determine whether a CTE re-exposes the renamed column under name `state.newCol`
|
|
735
|
+
* (the column has already been rewritten inside its body if the body referenced it).
|
|
736
|
+
*
|
|
737
|
+
* Returns false when:
|
|
738
|
+
* - The CTE has an explicit column list (renaming the input to fixed names).
|
|
739
|
+
* - The body is not a SELECT (INSERT/UPDATE/DELETE WITH RETURNING — out of scope).
|
|
740
|
+
* - No passthrough result column references the renamed table's column.
|
|
741
|
+
*/
|
|
742
|
+
function cteExposesRenamedColumn(cte, state) {
|
|
743
|
+
if (cte.columns)
|
|
744
|
+
return false;
|
|
745
|
+
const query = cte.query;
|
|
746
|
+
if (query.type !== 'select')
|
|
747
|
+
return false;
|
|
748
|
+
const select = query;
|
|
749
|
+
// Recreate the body's own with-frame so nested CTE refs in `select.from`
|
|
750
|
+
// resolve correctly during exposure analysis.
|
|
751
|
+
const bodyWithFrame = analyzeWithFrame(select.withClause, state);
|
|
752
|
+
state.scopeStack.push(bodyWithFrame);
|
|
753
|
+
try {
|
|
754
|
+
const bodyFrame = buildScopeFrame(select.from, state);
|
|
755
|
+
for (const col of select.columns ?? []) {
|
|
756
|
+
if (isResultColumnExposure(col, bodyFrame, state))
|
|
757
|
+
return true;
|
|
758
|
+
}
|
|
759
|
+
return false;
|
|
760
|
+
}
|
|
761
|
+
finally {
|
|
762
|
+
state.scopeStack.pop();
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
function isResultColumnExposure(col, bodyFrame, state) {
|
|
766
|
+
if (col.type === 'all') {
|
|
767
|
+
if (col.table === undefined) {
|
|
768
|
+
return bodyFrame.unaliased.has(state.tableName);
|
|
769
|
+
}
|
|
770
|
+
const qualLower = col.table.toLowerCase();
|
|
771
|
+
if (qualLower === state.tableName && bodyFrame.unaliased.has(state.tableName))
|
|
772
|
+
return true;
|
|
773
|
+
return bodyFrame.aliasMap.get(qualLower) === state.tableName;
|
|
774
|
+
}
|
|
775
|
+
if (col.alias !== undefined)
|
|
776
|
+
return false;
|
|
777
|
+
const expr = col.expr;
|
|
778
|
+
if (expr.type !== 'column')
|
|
779
|
+
return false;
|
|
780
|
+
const colExpr = expr;
|
|
781
|
+
if (colExpr.name.toLowerCase() !== state.newCol.toLowerCase())
|
|
782
|
+
return false;
|
|
783
|
+
if (colExpr.table === undefined) {
|
|
784
|
+
return bodyFrame.unaliased.has(state.tableName);
|
|
785
|
+
}
|
|
786
|
+
const qualLower = colExpr.table.toLowerCase();
|
|
787
|
+
if (qualLower === state.tableName &&
|
|
788
|
+
(colExpr.schema === undefined || eq(colExpr.schema, state.defaultSchema))) {
|
|
789
|
+
return true;
|
|
790
|
+
}
|
|
791
|
+
return bodyFrame.aliasMap.get(qualLower) === state.tableName;
|
|
792
|
+
}
|
|
506
793
|
//# sourceMappingURL=rename-rewriter.js.map
|