@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-groupby-fd-simplification.js","sourceRoot":"","sources":["../../../../../src/planner/rules/aggregate/rule-groupby-fd-simplification.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,15 +3,15 @@ import type { OptContext } from '../../framework/context.js';
|
|
|
3
3
|
/**
|
|
4
4
|
* Rule: DISTINCT Elimination
|
|
5
5
|
*
|
|
6
|
-
* When a DistinctNode's source already guarantees unique rows
|
|
7
|
-
*
|
|
8
|
-
* be removed.
|
|
6
|
+
* When a DistinctNode's source already guarantees unique rows, the DISTINCT is
|
|
7
|
+
* redundant and can be removed.
|
|
9
8
|
*
|
|
10
|
-
*
|
|
11
|
-
* 1.
|
|
12
|
-
* 2.
|
|
9
|
+
* Sources of uniqueness proof:
|
|
10
|
+
* 1. Logical keys (`RelationType.keys`) — schema-declared, available at any time.
|
|
11
|
+
* 2. Physical FD set — encodes derived keys as `K → all_other_cols` FDs, plus
|
|
12
|
+
* the singleton `∅ → all_cols` for at-most-one-row claims.
|
|
13
13
|
*
|
|
14
|
-
* A key
|
|
14
|
+
* A non-empty key proof on the source proves it already produces unique rows —
|
|
15
15
|
* DISTINCT is a no-op.
|
|
16
16
|
*/
|
|
17
17
|
export declare function ruleDistinctElimination(node: PlanNode, _context: OptContext): PlanNode | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-distinct-elimination.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/distinct/rule-distinct-elimination.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"rule-distinct-elimination.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/distinct/rule-distinct-elimination.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAM7D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAqB7F"}
|
|
@@ -1,37 +1,39 @@
|
|
|
1
1
|
import { createLogger } from '../../../common/logger.js';
|
|
2
2
|
import { DistinctNode } from '../../nodes/distinct-node.js';
|
|
3
|
+
import { hasAnyKey, hasSingletonFd } from '../../util/fd-utils.js';
|
|
3
4
|
const log = createLogger('optimizer:rule:distinct-elimination');
|
|
4
5
|
/**
|
|
5
6
|
* Rule: DISTINCT Elimination
|
|
6
7
|
*
|
|
7
|
-
* When a DistinctNode's source already guarantees unique rows
|
|
8
|
-
*
|
|
9
|
-
* be removed.
|
|
8
|
+
* When a DistinctNode's source already guarantees unique rows, the DISTINCT is
|
|
9
|
+
* redundant and can be removed.
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
* 1.
|
|
13
|
-
* 2.
|
|
11
|
+
* Sources of uniqueness proof:
|
|
12
|
+
* 1. Logical keys (`RelationType.keys`) — schema-declared, available at any time.
|
|
13
|
+
* 2. Physical FD set — encodes derived keys as `K → all_other_cols` FDs, plus
|
|
14
|
+
* the singleton `∅ → all_cols` for at-most-one-row claims.
|
|
14
15
|
*
|
|
15
|
-
* A key
|
|
16
|
+
* A non-empty key proof on the source proves it already produces unique rows —
|
|
16
17
|
* DISTINCT is a no-op.
|
|
17
18
|
*/
|
|
18
19
|
export function ruleDistinctElimination(node, _context) {
|
|
19
20
|
if (!(node instanceof DistinctNode))
|
|
20
21
|
return null;
|
|
21
|
-
//
|
|
22
|
-
const sourcePhys = node.source.physical;
|
|
23
|
-
if (sourcePhys?.uniqueKeys && sourcePhys.uniqueKeys.length > 0) {
|
|
24
|
-
log('Eliminating redundant DISTINCT: source has physical uniqueKeys %j', sourcePhys.uniqueKeys);
|
|
25
|
-
return node.source;
|
|
26
|
-
}
|
|
27
|
-
// Check logical keys from RelationType
|
|
28
|
-
// If the source's logical type declares any key, the source already produces
|
|
29
|
-
// unique rows (since any superset of a key is also unique).
|
|
22
|
+
// Logical keys (RelationType.keys) are the schema-level claim.
|
|
30
23
|
const sourceType = node.source.getType();
|
|
31
24
|
if (sourceType.keys && sourceType.keys.length > 0) {
|
|
32
25
|
log('Eliminating redundant DISTINCT: source has logical keys %j', sourceType.keys);
|
|
33
26
|
return node.source;
|
|
34
27
|
}
|
|
28
|
+
// Physical FDs: an FD whose determinants form a non-trivial superkey of the
|
|
29
|
+
// source columns proves uniqueness; the singleton `∅ → all_cols` proves
|
|
30
|
+
// at-most-one-row (also unique).
|
|
31
|
+
const sourcePhys = node.source.physical;
|
|
32
|
+
const colCount = node.source.getAttributes().length;
|
|
33
|
+
if (hasAnyKey(sourcePhys?.fds, colCount) || hasSingletonFd(sourcePhys?.fds, colCount)) {
|
|
34
|
+
log('Eliminating redundant DISTINCT: source FDs imply unique rows');
|
|
35
|
+
return node.source;
|
|
36
|
+
}
|
|
35
37
|
return null;
|
|
36
38
|
}
|
|
37
39
|
//# sourceMappingURL=rule-distinct-elimination.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-distinct-elimination.js","sourceRoot":"","sources":["../../../../../src/planner/rules/distinct/rule-distinct-elimination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"rule-distinct-elimination.js","sourceRoot":"","sources":["../../../../../src/planner/rules/distinct/rule-distinct-elimination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAEnE,MAAM,GAAG,GAAG,YAAY,CAAC,qCAAqC,CAAC,CAAC;AAEhE;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAc,EAAE,QAAoB;IAC3E,IAAI,CAAC,CAAC,IAAI,YAAY,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAEjD,+DAA+D;IAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IACzC,IAAI,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,4DAA4D,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;QACnF,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAED,4EAA4E;IAC5E,wEAAwE;IACxE,iCAAiC;IACjC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC;IACpD,IAAI,SAAS,CAAC,UAAU,EAAE,GAAG,EAAE,QAAQ,CAAC,IAAI,cAAc,CAAC,UAAU,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC;QACvF,GAAG,CAAC,8DAA8D,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: Join Elimination (FK→PK)
|
|
3
|
+
*
|
|
4
|
+
* Eliminates a join whose non-preserved side is never referenced above the join
|
|
5
|
+
* and is guaranteed at-most-one-matching per FK→PK alignment.
|
|
6
|
+
*
|
|
7
|
+
* The rule fires on ProjectNode and walks down through a whitelist of
|
|
8
|
+
* pass-through nodes (Filter, Sort, LimitOffset, Distinct, Alias) collecting
|
|
9
|
+
* the set of attribute IDs that any caller above the join still demands. When
|
|
10
|
+
* the walk reaches a JoinNode, the demanded set is final for that chain:
|
|
11
|
+
*
|
|
12
|
+
* - If the demanded set only references the preserved side and the equi-join
|
|
13
|
+
* condition aligns FK columns on the preserved side with the PK on the
|
|
14
|
+
* other side, the join is rewritten away.
|
|
15
|
+
* - For LEFT/RIGHT outer joins, only the non-preserved side may be eliminated
|
|
16
|
+
* (the preserved side is required by SQL semantics).
|
|
17
|
+
* - For INNER joins, either side may be eliminated, but additionally the FK
|
|
18
|
+
* columns must be NOT NULL — otherwise NULL FK rows that wouldn't have
|
|
19
|
+
* matched on the join would now survive.
|
|
20
|
+
*
|
|
21
|
+
* Non-equi residual conjuncts in the ON-clause disqualify the rewrite (they
|
|
22
|
+
* may alter cardinality beyond the FK→PK guarantee).
|
|
23
|
+
*/
|
|
24
|
+
import type { PlanNode, ScalarPlanNode } from '../../nodes/plan-node.js';
|
|
25
|
+
import type { OptContext } from '../../framework/context.js';
|
|
26
|
+
export declare function ruleJoinElimination(node: PlanNode, _context: OptContext): PlanNode | null;
|
|
27
|
+
/**
|
|
28
|
+
* AND-of-equalities check: every conjunct must be `colRef = colRef`. Any other
|
|
29
|
+
* predicate shape (range comparison, non-equality, OR, function calls, …)
|
|
30
|
+
* disqualifies the rewrite — those residuals can change row counts beyond what
|
|
31
|
+
* the FK→PK guarantee covers.
|
|
32
|
+
*/
|
|
33
|
+
export declare function isAndOfColumnEqualities(expr: ScalarPlanNode): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Aggregate counterpart of `ruleJoinElimination`: when an Aggregate sits over
|
|
36
|
+
* a chain ending in an FK-covered inner join and the aggregate's payload only
|
|
37
|
+
* depends on the FK (left) side, drop the join.
|
|
38
|
+
*
|
|
39
|
+
* Why correct for `count(*)` and similar cardinality-only aggregates: a
|
|
40
|
+
* non-null FK with the IND `L.fk ⊆ R.pk` and an unfiltered R guarantees
|
|
41
|
+
* `|L ⋈ R| == |L|`, so `count(*)` over the join equals `count(*)` over L.
|
|
42
|
+
* More generally, when no aggregate argument or group key references R, the
|
|
43
|
+
* inner join's only effect is to gate L by `fk IS NOT NULL`, which the
|
|
44
|
+
* NOT-NULL precondition already rules out.
|
|
45
|
+
*
|
|
46
|
+
* Implementation mirrors the Project entrypoint: collect attribute IDs the
|
|
47
|
+
* Aggregate demands (group-key expressions + every aggregate expression),
|
|
48
|
+
* walk the wrapper chain to find the Join, run the same FK-PK alignment +
|
|
49
|
+
* row-preserving checks as the inner-join case, then rebuild the chain on
|
|
50
|
+
* the preserved side.
|
|
51
|
+
*
|
|
52
|
+
* Only `inner` joins are eligible here — outer joins reduce to inner in this
|
|
53
|
+
* context only when both sides demand attrs, which we'd have rejected already.
|
|
54
|
+
*/
|
|
55
|
+
export declare function ruleJoinEliminationUnderAggregate(node: PlanNode, _context: OptContext): PlanNode | null;
|
|
56
|
+
//# sourceMappingURL=rule-join-elimination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-join-elimination.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-join-elimination.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAsB,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE7F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AA6B7D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAuDzF;AA+DD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAgBrE;AA8ED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAwDvG"}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: Join Elimination (FK→PK)
|
|
3
|
+
*
|
|
4
|
+
* Eliminates a join whose non-preserved side is never referenced above the join
|
|
5
|
+
* and is guaranteed at-most-one-matching per FK→PK alignment.
|
|
6
|
+
*
|
|
7
|
+
* The rule fires on ProjectNode and walks down through a whitelist of
|
|
8
|
+
* pass-through nodes (Filter, Sort, LimitOffset, Distinct, Alias) collecting
|
|
9
|
+
* the set of attribute IDs that any caller above the join still demands. When
|
|
10
|
+
* the walk reaches a JoinNode, the demanded set is final for that chain:
|
|
11
|
+
*
|
|
12
|
+
* - If the demanded set only references the preserved side and the equi-join
|
|
13
|
+
* condition aligns FK columns on the preserved side with the PK on the
|
|
14
|
+
* other side, the join is rewritten away.
|
|
15
|
+
* - For LEFT/RIGHT outer joins, only the non-preserved side may be eliminated
|
|
16
|
+
* (the preserved side is required by SQL semantics).
|
|
17
|
+
* - For INNER joins, either side may be eliminated, but additionally the FK
|
|
18
|
+
* columns must be NOT NULL — otherwise NULL FK rows that wouldn't have
|
|
19
|
+
* matched on the join would now survive.
|
|
20
|
+
*
|
|
21
|
+
* Non-equi residual conjuncts in the ON-clause disqualify the rewrite (they
|
|
22
|
+
* may alter cardinality beyond the FK→PK guarantee).
|
|
23
|
+
*/
|
|
24
|
+
import { createLogger } from '../../../common/logger.js';
|
|
25
|
+
import { isRelationalNode } from '../../nodes/plan-node.js';
|
|
26
|
+
import { ProjectNode } from '../../nodes/project-node.js';
|
|
27
|
+
import { FilterNode } from '../../nodes/filter.js';
|
|
28
|
+
import { SortNode } from '../../nodes/sort.js';
|
|
29
|
+
import { LimitOffsetNode } from '../../nodes/limit-offset.js';
|
|
30
|
+
import { DistinctNode } from '../../nodes/distinct-node.js';
|
|
31
|
+
import { AliasNode } from '../../nodes/alias-node.js';
|
|
32
|
+
import { AggregateNode } from '../../nodes/aggregate-node.js';
|
|
33
|
+
import { JoinNode, extractEquiPairsFromCondition } from '../../nodes/join-node.js';
|
|
34
|
+
import { ColumnReferenceNode } from '../../nodes/reference.js';
|
|
35
|
+
import { BinaryOpNode } from '../../nodes/scalar.js';
|
|
36
|
+
import { normalizePredicate } from '../../analysis/predicate-normalizer.js';
|
|
37
|
+
import { checkFkPkAlignment, extractTableSchema } from '../../util/key-utils.js';
|
|
38
|
+
import { lookupCoveringFK, isRowPreservingPathToTable } from '../../util/ind-utils.js';
|
|
39
|
+
const log = createLogger('optimizer:rule:join-elimination');
|
|
40
|
+
export function ruleJoinElimination(node, _context) {
|
|
41
|
+
if (!(node instanceof ProjectNode))
|
|
42
|
+
return null;
|
|
43
|
+
const demanded = new Set();
|
|
44
|
+
for (const proj of node.projections) {
|
|
45
|
+
collectAttrIds(proj.node, demanded);
|
|
46
|
+
}
|
|
47
|
+
const walk = walkChain(node.source, demanded);
|
|
48
|
+
if (!walk)
|
|
49
|
+
return null;
|
|
50
|
+
const { join, chain } = walk;
|
|
51
|
+
if (join.joinType !== 'left' && join.joinType !== 'right' && join.joinType !== 'inner')
|
|
52
|
+
return null;
|
|
53
|
+
if (!join.condition)
|
|
54
|
+
return null;
|
|
55
|
+
const leftAttrs = join.left.getAttributes();
|
|
56
|
+
const rightAttrs = join.right.getAttributes();
|
|
57
|
+
const pairs = extractEquiPairsFromCondition(join.condition, leftAttrs, rightAttrs);
|
|
58
|
+
if (pairs.length === 0)
|
|
59
|
+
return null;
|
|
60
|
+
const normalized = normalizePredicate(join.condition);
|
|
61
|
+
if (!isAndOfColumnEqualities(normalized))
|
|
62
|
+
return null;
|
|
63
|
+
const leftIds = new Set(leftAttrs.map(a => a.id));
|
|
64
|
+
const rightIds = new Set(rightAttrs.map(a => a.id));
|
|
65
|
+
const usesLeft = setsIntersect(demanded, leftIds);
|
|
66
|
+
const usesRight = setsIntersect(demanded, rightIds);
|
|
67
|
+
let preserved = null;
|
|
68
|
+
switch (join.joinType) {
|
|
69
|
+
case 'left':
|
|
70
|
+
if (usesRight)
|
|
71
|
+
return null;
|
|
72
|
+
preserved = tryEliminate(join, 'right', pairs);
|
|
73
|
+
break;
|
|
74
|
+
case 'right':
|
|
75
|
+
if (usesLeft)
|
|
76
|
+
return null;
|
|
77
|
+
preserved = tryEliminate(join, 'left', pairs);
|
|
78
|
+
break;
|
|
79
|
+
case 'inner':
|
|
80
|
+
if (!usesRight) {
|
|
81
|
+
preserved = tryEliminate(join, 'right', pairs);
|
|
82
|
+
}
|
|
83
|
+
if (!preserved && !usesLeft) {
|
|
84
|
+
preserved = tryEliminate(join, 'left', pairs);
|
|
85
|
+
}
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
if (!preserved)
|
|
89
|
+
return null;
|
|
90
|
+
log('Eliminating %s join under Project; preserved side has %d attrs', join.joinType, preserved.getAttributes().length);
|
|
91
|
+
const newSource = rebuildChain(chain, preserved);
|
|
92
|
+
return rebuildProject(node, newSource);
|
|
93
|
+
}
|
|
94
|
+
function collectAttrIds(expr, out) {
|
|
95
|
+
if (expr instanceof ColumnReferenceNode) {
|
|
96
|
+
out.add(expr.attributeId);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
for (const child of expr.getChildren()) {
|
|
100
|
+
collectAttrIds(child, out);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function walkChain(root, demanded) {
|
|
104
|
+
const chain = [];
|
|
105
|
+
let current = root;
|
|
106
|
+
while (true) {
|
|
107
|
+
if (current instanceof JoinNode) {
|
|
108
|
+
return { join: current, chain };
|
|
109
|
+
}
|
|
110
|
+
if (current instanceof FilterNode) {
|
|
111
|
+
collectAttrIds(current.predicate, demanded);
|
|
112
|
+
chain.push({ kind: 'filter', node: current });
|
|
113
|
+
current = current.source;
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (current instanceof SortNode) {
|
|
117
|
+
for (const k of current.sortKeys) {
|
|
118
|
+
collectAttrIds(k.expression, demanded);
|
|
119
|
+
}
|
|
120
|
+
chain.push({ kind: 'sort', node: current });
|
|
121
|
+
current = current.source;
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
if (current instanceof LimitOffsetNode) {
|
|
125
|
+
chain.push({ kind: 'limit', node: current });
|
|
126
|
+
current = current.source;
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
if (current instanceof DistinctNode) {
|
|
130
|
+
// DISTINCT collapses duplicates that the join (with at-most-one matching)
|
|
131
|
+
// would never have produced anyway; safe to walk through.
|
|
132
|
+
chain.push({ kind: 'distinct', node: current });
|
|
133
|
+
current = current.source;
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
if (current instanceof AliasNode) {
|
|
137
|
+
chain.push({ kind: 'alias', node: current });
|
|
138
|
+
current = current.source;
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
function setsIntersect(a, b) {
|
|
145
|
+
const [small, large] = a.size <= b.size ? [a, b] : [b, a];
|
|
146
|
+
for (const v of small) {
|
|
147
|
+
if (large.has(v))
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* AND-of-equalities check: every conjunct must be `colRef = colRef`. Any other
|
|
154
|
+
* predicate shape (range comparison, non-equality, OR, function calls, …)
|
|
155
|
+
* disqualifies the rewrite — those residuals can change row counts beyond what
|
|
156
|
+
* the FK→PK guarantee covers.
|
|
157
|
+
*/
|
|
158
|
+
export function isAndOfColumnEqualities(expr) {
|
|
159
|
+
if (!(expr instanceof BinaryOpNode))
|
|
160
|
+
return false;
|
|
161
|
+
const stack = [expr];
|
|
162
|
+
while (stack.length > 0) {
|
|
163
|
+
const n = stack.pop();
|
|
164
|
+
if (!(n instanceof BinaryOpNode))
|
|
165
|
+
return false;
|
|
166
|
+
const op = n.expression.operator;
|
|
167
|
+
if (op === 'AND') {
|
|
168
|
+
stack.push(n.left, n.right);
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
if (op !== '=')
|
|
172
|
+
return false;
|
|
173
|
+
if (!(n.left instanceof ColumnReferenceNode))
|
|
174
|
+
return false;
|
|
175
|
+
if (!(n.right instanceof ColumnReferenceNode))
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Validate FK→PK alignment for eliminating `sideToRemove` and return the
|
|
182
|
+
* preserved side relational node when safe.
|
|
183
|
+
*/
|
|
184
|
+
function tryEliminate(join, sideToRemove, pairs) {
|
|
185
|
+
const leftSchema = extractTableSchema(join.left);
|
|
186
|
+
const rightSchema = extractTableSchema(join.right);
|
|
187
|
+
if (!leftSchema || !rightSchema)
|
|
188
|
+
return null;
|
|
189
|
+
// FK side is the preserved side; PK side is the side being removed.
|
|
190
|
+
const fkSchema = sideToRemove === 'right' ? leftSchema : rightSchema;
|
|
191
|
+
const pkSchema = sideToRemove === 'right' ? rightSchema : leftSchema;
|
|
192
|
+
const fkEquiCols = pairs.map(p => sideToRemove === 'right' ? p.left : p.right);
|
|
193
|
+
const pkEquiCols = pairs.map(p => sideToRemove === 'right' ? p.right : p.left);
|
|
194
|
+
if (!checkFkPkAlignment(fkSchema, pkSchema, fkEquiCols, pkEquiCols))
|
|
195
|
+
return null;
|
|
196
|
+
// INNER joins additionally require:
|
|
197
|
+
// 1. NOT NULL on every FK column — with nullable FK, rows with NULL FKs
|
|
198
|
+
// wouldn't survive the inner join but would survive elimination.
|
|
199
|
+
// 2. The eliminable side must produce the underlying PK table's full row
|
|
200
|
+
// set — any row-reducing wrapper (Filter, LimitOffset, Distinct,
|
|
201
|
+
// RetrieveNode with a non-trivial pipeline) between the join and the
|
|
202
|
+
// base table would have dropped rows that the FK→PK guarantee assumes
|
|
203
|
+
// are present, so eliminating would silently survive orphaned FK rows.
|
|
204
|
+
if (join.joinType === 'inner') {
|
|
205
|
+
const match = lookupCoveringFK(fkSchema, pkSchema, fkEquiCols, pkEquiCols);
|
|
206
|
+
if (!match)
|
|
207
|
+
return null;
|
|
208
|
+
if (match.nullable)
|
|
209
|
+
return null;
|
|
210
|
+
const eliminableSide = sideToRemove === 'right' ? join.right : join.left;
|
|
211
|
+
if (!isRowPreservingPathToTable(eliminableSide))
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
return (sideToRemove === 'right' ? join.left : join.right);
|
|
215
|
+
}
|
|
216
|
+
function rebuildChain(chain, bottom) {
|
|
217
|
+
let current = bottom;
|
|
218
|
+
// Chain was collected top→bottom (root pushed first); rebuild bottom→top.
|
|
219
|
+
for (let i = chain.length - 1; i >= 0; i--) {
|
|
220
|
+
const entry = chain[i];
|
|
221
|
+
switch (entry.kind) {
|
|
222
|
+
case 'filter': {
|
|
223
|
+
current = new FilterNode(entry.node.scope, current, entry.node.predicate);
|
|
224
|
+
break;
|
|
225
|
+
}
|
|
226
|
+
case 'sort': {
|
|
227
|
+
current = new SortNode(entry.node.scope, current, entry.node.sortKeys);
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
case 'limit': {
|
|
231
|
+
current = new LimitOffsetNode(entry.node.scope, current, entry.node.limit, entry.node.offset);
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
case 'distinct': {
|
|
235
|
+
current = new DistinctNode(entry.node.scope, current);
|
|
236
|
+
break;
|
|
237
|
+
}
|
|
238
|
+
case 'alias': {
|
|
239
|
+
current = new AliasNode(entry.node.scope, current, entry.node.alias);
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return current;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Aggregate counterpart of `ruleJoinElimination`: when an Aggregate sits over
|
|
248
|
+
* a chain ending in an FK-covered inner join and the aggregate's payload only
|
|
249
|
+
* depends on the FK (left) side, drop the join.
|
|
250
|
+
*
|
|
251
|
+
* Why correct for `count(*)` and similar cardinality-only aggregates: a
|
|
252
|
+
* non-null FK with the IND `L.fk ⊆ R.pk` and an unfiltered R guarantees
|
|
253
|
+
* `|L ⋈ R| == |L|`, so `count(*)` over the join equals `count(*)` over L.
|
|
254
|
+
* More generally, when no aggregate argument or group key references R, the
|
|
255
|
+
* inner join's only effect is to gate L by `fk IS NOT NULL`, which the
|
|
256
|
+
* NOT-NULL precondition already rules out.
|
|
257
|
+
*
|
|
258
|
+
* Implementation mirrors the Project entrypoint: collect attribute IDs the
|
|
259
|
+
* Aggregate demands (group-key expressions + every aggregate expression),
|
|
260
|
+
* walk the wrapper chain to find the Join, run the same FK-PK alignment +
|
|
261
|
+
* row-preserving checks as the inner-join case, then rebuild the chain on
|
|
262
|
+
* the preserved side.
|
|
263
|
+
*
|
|
264
|
+
* Only `inner` joins are eligible here — outer joins reduce to inner in this
|
|
265
|
+
* context only when both sides demand attrs, which we'd have rejected already.
|
|
266
|
+
*/
|
|
267
|
+
export function ruleJoinEliminationUnderAggregate(node, _context) {
|
|
268
|
+
if (!(node instanceof AggregateNode))
|
|
269
|
+
return null;
|
|
270
|
+
const demanded = new Set();
|
|
271
|
+
for (const groupExpr of node.groupBy) {
|
|
272
|
+
collectAttrIds(groupExpr, demanded);
|
|
273
|
+
}
|
|
274
|
+
for (const agg of node.aggregates) {
|
|
275
|
+
collectAttrIds(agg.expression, demanded);
|
|
276
|
+
}
|
|
277
|
+
const walk = walkChain(node.source, demanded);
|
|
278
|
+
if (!walk)
|
|
279
|
+
return null;
|
|
280
|
+
const { join, chain } = walk;
|
|
281
|
+
// Only inner-eliminable shapes — see `ruleJoinElimination` notes.
|
|
282
|
+
if (join.joinType !== 'inner')
|
|
283
|
+
return null;
|
|
284
|
+
if (!join.condition)
|
|
285
|
+
return null;
|
|
286
|
+
const leftAttrs = join.left.getAttributes();
|
|
287
|
+
const rightAttrs = join.right.getAttributes();
|
|
288
|
+
const pairs = extractEquiPairsFromCondition(join.condition, leftAttrs, rightAttrs);
|
|
289
|
+
if (pairs.length === 0)
|
|
290
|
+
return null;
|
|
291
|
+
const normalized = normalizePredicate(join.condition);
|
|
292
|
+
if (!isAndOfColumnEqualities(normalized))
|
|
293
|
+
return null;
|
|
294
|
+
const leftIds = new Set(leftAttrs.map(a => a.id));
|
|
295
|
+
const rightIds = new Set(rightAttrs.map(a => a.id));
|
|
296
|
+
const usesLeft = setsIntersect(demanded, leftIds);
|
|
297
|
+
const usesRight = setsIntersect(demanded, rightIds);
|
|
298
|
+
let preserved = null;
|
|
299
|
+
if (!usesRight) {
|
|
300
|
+
preserved = tryEliminate(join, 'right', pairs);
|
|
301
|
+
}
|
|
302
|
+
if (!preserved && !usesLeft) {
|
|
303
|
+
preserved = tryEliminate(join, 'left', pairs);
|
|
304
|
+
}
|
|
305
|
+
if (!preserved)
|
|
306
|
+
return null;
|
|
307
|
+
log('Eliminating inner join under Aggregate; preserved side has %d attrs', preserved.getAttributes().length);
|
|
308
|
+
const newSource = rebuildChain(chain, preserved);
|
|
309
|
+
if (!isRelationalNode(newSource)) {
|
|
310
|
+
throw new Error('rule-join-elimination-aggregate: rebuilt source must be relational');
|
|
311
|
+
}
|
|
312
|
+
return new AggregateNode(node.scope, newSource, node.groupBy, node.aggregates, undefined, node.getAttributes());
|
|
313
|
+
}
|
|
314
|
+
function rebuildProject(project, newSource) {
|
|
315
|
+
const attributes = project.getAttributes();
|
|
316
|
+
const newProjections = project.projections.map((p, i) => ({
|
|
317
|
+
node: p.node,
|
|
318
|
+
alias: p.alias,
|
|
319
|
+
attributeId: attributes[i].id,
|
|
320
|
+
}));
|
|
321
|
+
if (!isRelationalNode(newSource)) {
|
|
322
|
+
throw new Error('rule-join-elimination: rebuilt source must be relational');
|
|
323
|
+
}
|
|
324
|
+
return new ProjectNode(project.scope, newSource, newProjections, undefined, attributes, project.preserveInputColumns);
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=rule-join-elimination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-join-elimination.js","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-join-elimination.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-join-greedy-commute.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-join-greedy-commute.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAsB,MAAM,0BAA0B,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"rule-join-greedy-commute.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-join-greedy-commute.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAsB,MAAM,0BAA0B,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAa7D;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CA4B3F"}
|
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import { createLogger } from '../../../common/logger.js';
|
|
2
2
|
import { JoinNode } from '../../nodes/join-node.js';
|
|
3
|
+
import { hasSingletonFd } from '../../util/fd-utils.js';
|
|
3
4
|
const log = createLogger('optimizer:rule:join-greedy-commute');
|
|
5
|
+
/** True when the relation provably emits at most one row. */
|
|
6
|
+
function isSingleton(node) {
|
|
7
|
+
const colCount = node.getAttributes().length;
|
|
8
|
+
if (colCount === 0)
|
|
9
|
+
return node.physical?.estimatedRows === 1;
|
|
10
|
+
return hasSingletonFd(node.physical?.fds, colCount);
|
|
11
|
+
}
|
|
4
12
|
/**
|
|
5
13
|
* Rule: Join Greedy Commute
|
|
6
14
|
*
|
|
@@ -19,8 +27,8 @@ export function ruleJoinGreedyCommute(node, _context) {
|
|
|
19
27
|
const leftRows = node.getLeftSource().estimatedRows ?? Number.POSITIVE_INFINITY;
|
|
20
28
|
const rightRows = node.getRightSource().estimatedRows ?? Number.POSITIVE_INFINITY;
|
|
21
29
|
// Prefer known finite estimatedRows; also detect <=1 row driver on either side
|
|
22
|
-
const leftIsSingleton = node.getLeftSource()
|
|
23
|
-
const rightIsSingleton = node.getRightSource()
|
|
30
|
+
const leftIsSingleton = isSingleton(node.getLeftSource());
|
|
31
|
+
const rightIsSingleton = isSingleton(node.getRightSource());
|
|
24
32
|
// If right is strictly better driver (smaller or singleton), swap
|
|
25
33
|
const shouldSwap = (rightIsSingleton && !leftIsSingleton) || (!rightIsSingleton && !leftIsSingleton && rightRows < leftRows);
|
|
26
34
|
if (!shouldSwap)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-join-greedy-commute.js","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-join-greedy-commute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"rule-join-greedy-commute.js","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-join-greedy-commute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,GAAG,GAAG,YAAY,CAAC,oCAAoC,CAAC,CAAC;AAE/D,6DAA6D;AAC7D,SAAS,WAAW,CAAC,IAAwB;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC;IAC7C,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,aAAa,KAAK,CAAC,CAAC;IAC9D,OAAO,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;AACrD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAc,EAAE,QAAoB;IACxE,IAAI,CAAC,CAAC,IAAI,YAAY,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IAExE,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,aAAa,IAAI,MAAM,CAAC,iBAAiB,CAAC;IAChF,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,aAAa,IAAI,MAAM,CAAC,iBAAiB,CAAC;IAElF,+EAA+E;IAC/E,MAAM,eAAe,GAAG,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1D,MAAM,gBAAgB,GAAG,WAAW,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;IAE5D,kEAAkE;IAClE,MAAM,UAAU,GAAG,CAAC,gBAAgB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,gBAAgB,IAAI,CAAC,eAAe,IAAI,SAAS,GAAG,QAAQ,CAAC,CAAC;IAC7H,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAE7B,GAAG,CAAC,wFAAwF,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IAEnI,qEAAqE;IACrE,MAAM,OAAO,GAAG,IAAI,QAAQ,CAC1B,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,cAAc,EAAwB,EAC3C,IAAI,CAAC,aAAa,EAAwB,EAC1C,IAAI,CAAC,WAAW,EAAE,EAClB,IAAI,CAAC,gBAAgB,EAAE,EACvB,IAAI,CAAC,eAAe,EAAE,CACvB,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: Aggregate Predicate Pushdown
|
|
3
|
+
*
|
|
4
|
+
* Subsumes WHERE-on-group-by-column and HAVING-on-group-by-column. For a
|
|
5
|
+
* FilterNode(predicate, AggregateNode|StreamAggregateNode|HashAggregateNode)
|
|
6
|
+
* each conjunct of `predicate` that references only GROUP-BY columns (or
|
|
7
|
+
* columns FD-determined by them in the aggregate's output FDs) is rewritten
|
|
8
|
+
* onto the aggregate's source attribute IDs and moved below the aggregate.
|
|
9
|
+
* Conjuncts referencing aggregate outputs (sum/count/etc.) or non-column
|
|
10
|
+
* GROUP-BY expressions stay above.
|
|
11
|
+
*
|
|
12
|
+
* Aggregate output indices in `physical.fds` come exclusively from
|
|
13
|
+
* bare-`ColumnReferenceNode` GROUP BYs (per `propagateAggregateFds`), so every
|
|
14
|
+
* output column in the FD closure has a known source attribute and can be
|
|
15
|
+
* rewritten.
|
|
16
|
+
*/
|
|
17
|
+
import type { PlanNode } from '../../nodes/plan-node.js';
|
|
18
|
+
import type { OptContext } from '../../framework/context.js';
|
|
19
|
+
export declare function ruleAggregatePredicatePushdown(node: PlanNode, _context: OptContext): PlanNode | null;
|
|
20
|
+
//# sourceMappingURL=rule-aggregate-predicate-pushdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-aggregate-predicate-pushdown.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/predicate/rule-aggregate-predicate-pushdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAiD,MAAM,0BAA0B,CAAC;AAExG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAqB7D,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CA8EpG"}
|