@quereus/quereus 4.4.1 → 4.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -4
- package/dist/src/core/database-events.d.ts +99 -1
- package/dist/src/core/database-events.d.ts.map +1 -1
- package/dist/src/core/database-events.js +219 -3
- package/dist/src/core/database-events.js.map +1 -1
- package/dist/src/core/database-materialized-views-analysis.d.ts.map +1 -1
- package/dist/src/core/database-materialized-views-analysis.js +1 -0
- package/dist/src/core/database-materialized-views-analysis.js.map +1 -1
- package/dist/src/core/database-materialized-views-plan-builders.d.ts.map +1 -1
- package/dist/src/core/database-materialized-views-plan-builders.js +29 -2
- package/dist/src/core/database-materialized-views-plan-builders.js.map +1 -1
- package/dist/src/core/database-transaction.d.ts +9 -0
- package/dist/src/core/database-transaction.d.ts.map +1 -1
- package/dist/src/core/database-transaction.js +9 -0
- package/dist/src/core/database-transaction.js.map +1 -1
- package/dist/src/core/database.d.ts +7 -1
- package/dist/src/core/database.d.ts.map +1 -1
- package/dist/src/core/database.js +20 -5
- package/dist/src/core/database.js.map +1 -1
- package/dist/src/func/builtins/aggregate.js +11 -11
- package/dist/src/func/builtins/aggregate.js.map +1 -1
- package/dist/src/func/builtins/builtin-window-functions.d.ts.map +1 -1
- package/dist/src/func/builtins/builtin-window-functions.js +15 -85
- package/dist/src/func/builtins/builtin-window-functions.js.map +1 -1
- package/dist/src/func/builtins/conversion.d.ts.map +1 -1
- package/dist/src/func/builtins/conversion.js +10 -9
- package/dist/src/func/builtins/conversion.js.map +1 -1
- package/dist/src/func/builtins/datetime.d.ts.map +1 -1
- package/dist/src/func/builtins/datetime.js +28 -10
- package/dist/src/func/builtins/datetime.js.map +1 -1
- package/dist/src/func/builtins/json.d.ts.map +1 -1
- package/dist/src/func/builtins/json.js +23 -17
- package/dist/src/func/builtins/json.js.map +1 -1
- package/dist/src/func/builtins/mutation.js +2 -2
- package/dist/src/func/builtins/mutation.js.map +1 -1
- package/dist/src/func/builtins/return-types.d.ts +327 -0
- package/dist/src/func/builtins/return-types.d.ts.map +1 -0
- package/dist/src/func/builtins/return-types.js +43 -0
- package/dist/src/func/builtins/return-types.js.map +1 -0
- package/dist/src/func/builtins/scalar.d.ts.map +1 -1
- package/dist/src/func/builtins/scalar.js +193 -37
- package/dist/src/func/builtins/scalar.js.map +1 -1
- package/dist/src/func/builtins/schema.d.ts.map +1 -1
- package/dist/src/func/builtins/schema.js +11 -3
- package/dist/src/func/builtins/schema.js.map +1 -1
- package/dist/src/func/builtins/string.d.ts.map +1 -1
- package/dist/src/func/builtins/string.js +4 -2
- package/dist/src/func/builtins/string.js.map +1 -1
- package/dist/src/func/builtins/timespan.d.ts +3 -0
- package/dist/src/func/builtins/timespan.d.ts.map +1 -1
- package/dist/src/func/builtins/timespan.js +15 -11
- package/dist/src/func/builtins/timespan.js.map +1 -1
- package/dist/src/func/registration.d.ts +39 -1
- package/dist/src/func/registration.d.ts.map +1 -1
- package/dist/src/func/registration.js +236 -41
- package/dist/src/func/registration.js.map +1 -1
- package/dist/src/index.d.ts +14 -7
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +14 -5
- package/dist/src/index.js.map +1 -1
- package/dist/src/parser/parser.d.ts +46 -0
- package/dist/src/parser/parser.d.ts.map +1 -1
- package/dist/src/parser/parser.js +160 -44
- package/dist/src/parser/parser.js.map +1 -1
- package/dist/src/planner/analysis/check-extraction.d.ts.map +1 -1
- package/dist/src/planner/analysis/check-extraction.js +37 -4
- package/dist/src/planner/analysis/check-extraction.js.map +1 -1
- package/dist/src/planner/analysis/coarsened-key.d.ts +4 -3
- package/dist/src/planner/analysis/coarsened-key.d.ts.map +1 -1
- package/dist/src/planner/analysis/coarsened-key.js +37 -3
- package/dist/src/planner/analysis/coarsened-key.js.map +1 -1
- package/dist/src/planner/analysis/comparison-collation.d.ts +41 -13
- package/dist/src/planner/analysis/comparison-collation.d.ts.map +1 -1
- package/dist/src/planner/analysis/comparison-collation.js +51 -14
- package/dist/src/planner/analysis/comparison-collation.js.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.d.ts +0 -7
- package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.js +59 -59
- package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
- package/dist/src/planner/analysis/coverage-prover.d.ts +13 -2
- package/dist/src/planner/analysis/coverage-prover.d.ts.map +1 -1
- package/dist/src/planner/analysis/coverage-prover.js +10 -14
- package/dist/src/planner/analysis/coverage-prover.js.map +1 -1
- package/dist/src/planner/analysis/predicate-conjuncts.d.ts +10 -4
- package/dist/src/planner/analysis/predicate-conjuncts.d.ts.map +1 -1
- package/dist/src/planner/analysis/predicate-conjuncts.js +28 -7
- package/dist/src/planner/analysis/predicate-conjuncts.js.map +1 -1
- package/dist/src/planner/analysis/query-rewrite-matcher.d.ts.map +1 -1
- package/dist/src/planner/analysis/query-rewrite-matcher.js +8 -27
- package/dist/src/planner/analysis/query-rewrite-matcher.js.map +1 -1
- package/dist/src/planner/analysis/scalar-subqueries.d.ts +22 -3
- package/dist/src/planner/analysis/scalar-subqueries.d.ts.map +1 -1
- package/dist/src/planner/analysis/scalar-subqueries.js +32 -3
- package/dist/src/planner/analysis/scalar-subqueries.js.map +1 -1
- package/dist/src/planner/analysis/set-op-type-merge.d.ts +64 -0
- package/dist/src/planner/analysis/set-op-type-merge.d.ts.map +1 -0
- package/dist/src/planner/analysis/set-op-type-merge.js +97 -0
- package/dist/src/planner/analysis/set-op-type-merge.js.map +1 -0
- package/dist/src/planner/building/alter-table.d.ts.map +1 -1
- package/dist/src/planner/building/alter-table.js +65 -27
- package/dist/src/planner/building/alter-table.js.map +1 -1
- package/dist/src/planner/building/coercion.d.ts +54 -0
- package/dist/src/planner/building/coercion.d.ts.map +1 -0
- package/dist/src/planner/building/coercion.js +88 -0
- package/dist/src/planner/building/coercion.js.map +1 -0
- package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
- package/dist/src/planner/building/constraint-builder.js +5 -18
- package/dist/src/planner/building/constraint-builder.js.map +1 -1
- package/dist/src/planner/building/expression.d.ts +17 -0
- package/dist/src/planner/building/expression.d.ts.map +1 -1
- package/dist/src/planner/building/expression.js +23 -115
- package/dist/src/planner/building/expression.js.map +1 -1
- package/dist/src/planner/building/function-call.d.ts.map +1 -1
- package/dist/src/planner/building/function-call.js +13 -0
- package/dist/src/planner/building/function-call.js.map +1 -1
- package/dist/src/planner/building/select-aggregates.d.ts +1 -1
- package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
- package/dist/src/planner/building/select-aggregates.js +53 -2
- package/dist/src/planner/building/select-aggregates.js.map +1 -1
- package/dist/src/planner/building/select-compound.d.ts.map +1 -1
- package/dist/src/planner/building/select-compound.js +10 -6
- package/dist/src/planner/building/select-compound.js.map +1 -1
- package/dist/src/planner/building/select-context.d.ts +7 -0
- package/dist/src/planner/building/select-context.d.ts.map +1 -1
- package/dist/src/planner/building/select-context.js +10 -40
- package/dist/src/planner/building/select-context.js.map +1 -1
- package/dist/src/planner/building/select.d.ts +37 -1
- package/dist/src/planner/building/select.d.ts.map +1 -1
- package/dist/src/planner/building/select.js +112 -51
- package/dist/src/planner/building/select.js.map +1 -1
- package/dist/src/planner/cost/conjunct-cost.d.ts +82 -0
- package/dist/src/planner/cost/conjunct-cost.d.ts.map +1 -0
- package/dist/src/planner/cost/conjunct-cost.js +107 -0
- package/dist/src/planner/cost/conjunct-cost.js.map +1 -0
- package/dist/src/planner/cost/index.d.ts +10 -0
- package/dist/src/planner/cost/index.d.ts.map +1 -1
- package/dist/src/planner/cost/index.js +15 -0
- package/dist/src/planner/cost/index.js.map +1 -1
- package/dist/src/planner/mutation/propagate.d.ts.map +1 -1
- package/dist/src/planner/mutation/propagate.js +1 -0
- package/dist/src/planner/mutation/propagate.js.map +1 -1
- package/dist/src/planner/nodes/aggregate-node.d.ts +6 -0
- package/dist/src/planner/nodes/aggregate-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/aggregate-node.js +10 -2
- 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 +2 -1
- package/dist/src/planner/nodes/alias-node.js.map +1 -1
- package/dist/src/planner/nodes/alter-table-node.d.ts +24 -8
- package/dist/src/planner/nodes/alter-table-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/alter-table-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 +4 -1
- package/dist/src/planner/nodes/asof-scan-node.js.map +1 -1
- package/dist/src/planner/nodes/asserted-keys-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/asserted-keys-node.js +2 -1
- package/dist/src/planner/nodes/asserted-keys-node.js.map +1 -1
- package/dist/src/planner/nodes/async-gather-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/async-gather-node.js +19 -8
- package/dist/src/planner/nodes/async-gather-node.js.map +1 -1
- package/dist/src/planner/nodes/bloom-join-node.d.ts +2 -0
- package/dist/src/planner/nodes/bloom-join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/bloom-join-node.js +17 -7
- package/dist/src/planner/nodes/bloom-join-node.js.map +1 -1
- package/dist/src/planner/nodes/cache-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/cache-node.js +2 -1
- package/dist/src/planner/nodes/cache-node.js.map +1 -1
- package/dist/src/planner/nodes/distinct-node.d.ts +6 -0
- package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/distinct-node.js +10 -2
- package/dist/src/planner/nodes/distinct-node.js.map +1 -1
- package/dist/src/planner/nodes/eager-prefetch-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/eager-prefetch-node.js +2 -1
- package/dist/src/planner/nodes/eager-prefetch-node.js.map +1 -1
- package/dist/src/planner/nodes/fanout-lookup-join-node.d.ts +5 -0
- package/dist/src/planner/nodes/fanout-lookup-join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/fanout-lookup-join-node.js +13 -6
- package/dist/src/planner/nodes/fanout-lookup-join-node.js.map +1 -1
- package/dist/src/planner/nodes/filter.d.ts.map +1 -1
- package/dist/src/planner/nodes/filter.js +12 -5
- package/dist/src/planner/nodes/filter.js.map +1 -1
- package/dist/src/planner/nodes/hash-aggregate.d.ts +6 -0
- package/dist/src/planner/nodes/hash-aggregate.d.ts.map +1 -1
- package/dist/src/planner/nodes/hash-aggregate.js +10 -2
- package/dist/src/planner/nodes/hash-aggregate.js.map +1 -1
- package/dist/src/planner/nodes/join-node.d.ts +25 -1
- package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-node.js +38 -10
- package/dist/src/planner/nodes/join-node.js.map +1 -1
- package/dist/src/planner/nodes/join-utils.d.ts +78 -0
- package/dist/src/planner/nodes/join-utils.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-utils.js +73 -0
- package/dist/src/planner/nodes/join-utils.js.map +1 -1
- package/dist/src/planner/nodes/key-set-semi-join-node.d.ts +87 -0
- package/dist/src/planner/nodes/key-set-semi-join-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/key-set-semi-join-node.js +141 -0
- package/dist/src/planner/nodes/key-set-semi-join-node.js.map +1 -0
- package/dist/src/planner/nodes/lens-auxiliary-access-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/lens-auxiliary-access-node.js +2 -1
- package/dist/src/planner/nodes/lens-auxiliary-access-node.js.map +1 -1
- package/dist/src/planner/nodes/limit-offset.d.ts +6 -0
- package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
- package/dist/src/planner/nodes/limit-offset.js +10 -2
- package/dist/src/planner/nodes/limit-offset.js.map +1 -1
- package/dist/src/planner/nodes/merge-join-node.d.ts +2 -0
- package/dist/src/planner/nodes/merge-join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/merge-join-node.js +21 -8
- package/dist/src/planner/nodes/merge-join-node.js.map +1 -1
- package/dist/src/planner/nodes/ordinal-slice-node.d.ts +5 -0
- package/dist/src/planner/nodes/ordinal-slice-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/ordinal-slice-node.js +9 -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 +24 -0
- 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 +2 -1
- package/dist/src/planner/nodes/project-node.js.map +1 -1
- package/dist/src/planner/nodes/reference.d.ts.map +1 -1
- package/dist/src/planner/nodes/reference.js +3 -2
- package/dist/src/planner/nodes/reference.js.map +1 -1
- package/dist/src/planner/nodes/retrieve-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/retrieve-node.js +2 -1
- package/dist/src/planner/nodes/retrieve-node.js.map +1 -1
- package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
- package/dist/src/planner/nodes/scalar.js +5 -18
- package/dist/src/planner/nodes/scalar.js.map +1 -1
- package/dist/src/planner/nodes/set-operation-node.d.ts +68 -16
- package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/set-operation-node.js +147 -26
- package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
- package/dist/src/planner/nodes/sort.d.ts.map +1 -1
- package/dist/src/planner/nodes/sort.js +3 -1
- package/dist/src/planner/nodes/sort.js.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.d.ts +6 -0
- package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.js +10 -2
- package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.d.ts +19 -1
- package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.js +18 -2
- package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
- package/dist/src/planner/nodes/window-function.d.ts.map +1 -1
- package/dist/src/planner/nodes/window-function.js +8 -0
- package/dist/src/planner/nodes/window-function.js.map +1 -1
- package/dist/src/planner/nodes/window-node.d.ts +1 -1
- package/dist/src/planner/nodes/window-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/window-node.js +3 -1
- package/dist/src/planner/nodes/window-node.js.map +1 -1
- package/dist/src/planner/optimizer.d.ts +9 -1
- package/dist/src/planner/optimizer.d.ts.map +1 -1
- package/dist/src/planner/optimizer.js +126 -6
- package/dist/src/planner/optimizer.js.map +1 -1
- package/dist/src/planner/rules/access/rule-key-set-seek.d.ts +68 -0
- package/dist/src/planner/rules/access/rule-key-set-seek.d.ts.map +1 -0
- package/dist/src/planner/rules/access/rule-key-set-seek.js +343 -0
- package/dist/src/planner/rules/access/rule-key-set-seek.js.map +1 -0
- package/dist/src/planner/rules/access/rule-monotonic-range-access.d.ts.map +1 -1
- package/dist/src/planner/rules/access/rule-monotonic-range-access.js +2 -2
- package/dist/src/planner/rules/access/rule-monotonic-range-access.js.map +1 -1
- package/dist/src/planner/rules/access/rule-select-access-path.d.ts +46 -0
- package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
- package/dist/src/planner/rules/access/rule-select-access-path.js +54 -13
- package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
- package/dist/src/planner/rules/cache/rule-cte-optimization.d.ts.map +1 -1
- package/dist/src/planner/rules/cache/rule-cte-optimization.js +9 -0
- package/dist/src/planner/rules/cache/rule-cte-optimization.js.map +1 -1
- package/dist/src/planner/rules/cache/rule-nested-loop-right-cache.d.ts.map +1 -1
- package/dist/src/planner/rules/cache/rule-nested-loop-right-cache.js +6 -4
- package/dist/src/planner/rules/cache/rule-nested-loop-right-cache.js.map +1 -1
- package/dist/src/planner/rules/join/equi-pair-extractor.d.ts +49 -49
- package/dist/src/planner/rules/join/equi-pair-extractor.d.ts.map +1 -1
- package/dist/src/planner/rules/join/equi-pair-extractor.js +54 -58
- package/dist/src/planner/rules/join/equi-pair-extractor.js.map +1 -1
- package/dist/src/planner/rules/join/index-nested-loop.d.ts +49 -0
- package/dist/src/planner/rules/join/index-nested-loop.d.ts.map +1 -0
- package/dist/src/planner/rules/join/index-nested-loop.js +285 -0
- package/dist/src/planner/rules/join/index-nested-loop.js.map +1 -0
- package/dist/src/planner/rules/join/rule-fanout-batched-outer.js +8 -8
- package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts +10 -4
- package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-join-physical-selection.js +97 -29
- package/dist/src/planner/rules/join/rule-join-physical-selection.js.map +1 -1
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.js +15 -5
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-empty-relation-folding.d.ts +1 -1
- package/dist/src/planner/rules/predicate/rule-empty-relation-folding.js +1 -1
- package/dist/src/planner/rules/predicate/rule-filter-conjunct-ordering.d.ts +43 -0
- package/dist/src/planner/rules/predicate/rule-filter-conjunct-ordering.d.ts.map +1 -0
- package/dist/src/planner/rules/predicate/rule-filter-conjunct-ordering.js +119 -0
- package/dist/src/planner/rules/predicate/rule-filter-conjunct-ordering.js.map +1 -0
- package/dist/src/planner/rules/predicate/rule-filter-selectivity.d.ts +44 -3
- package/dist/src/planner/rules/predicate/rule-filter-selectivity.d.ts.map +1 -1
- package/dist/src/planner/rules/predicate/rule-filter-selectivity.js +142 -18
- package/dist/src/planner/rules/predicate/rule-filter-selectivity.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-join-predicate-pushdown.d.ts +73 -0
- package/dist/src/planner/rules/predicate/rule-join-predicate-pushdown.d.ts.map +1 -0
- package/dist/src/planner/rules/predicate/rule-join-predicate-pushdown.js +205 -0
- package/dist/src/planner/rules/predicate/rule-join-predicate-pushdown.js.map +1 -0
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.d.ts +14 -11
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.d.ts.map +1 -1
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js +21 -85
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.d.ts +10 -2
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.d.ts.map +1 -1
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js +20 -2
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js.map +1 -1
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts.map +1 -1
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js +18 -3
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +1 -1
- package/dist/src/planner/rules/shared/access-leaf.d.ts +39 -0
- package/dist/src/planner/rules/shared/access-leaf.d.ts.map +1 -0
- package/dist/src/planner/rules/shared/access-leaf.js +79 -0
- package/dist/src/planner/rules/shared/access-leaf.js.map +1 -0
- package/dist/src/planner/rules/shared/index-style-context.d.ts +17 -0
- package/dist/src/planner/rules/shared/index-style-context.d.ts.map +1 -1
- package/dist/src/planner/rules/shared/index-style-context.js +7 -0
- package/dist/src/planner/rules/shared/index-style-context.js.map +1 -1
- package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.d.ts.map +1 -1
- package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js +18 -8
- package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js.map +1 -1
- package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.d.ts +3 -1
- package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.d.ts.map +1 -1
- package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js +27 -10
- package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js.map +1 -1
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts +24 -6
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts.map +1 -1
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js +243 -70
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js.map +1 -1
- package/dist/src/planner/rules/window/rule-monotonic-window.d.ts +17 -7
- package/dist/src/planner/rules/window/rule-monotonic-window.d.ts.map +1 -1
- package/dist/src/planner/rules/window/rule-monotonic-window.js +124 -87
- package/dist/src/planner/rules/window/rule-monotonic-window.js.map +1 -1
- package/dist/src/planner/scopes/aliased.d.ts.map +1 -1
- package/dist/src/planner/scopes/aliased.js +6 -0
- package/dist/src/planner/scopes/aliased.js.map +1 -1
- package/dist/src/planner/stats/catalog-stats.d.ts +87 -4
- package/dist/src/planner/stats/catalog-stats.d.ts.map +1 -1
- package/dist/src/planner/stats/catalog-stats.js +250 -28
- package/dist/src/planner/stats/catalog-stats.js.map +1 -1
- package/dist/src/planner/stats/conjunct-selectivity.d.ts +48 -0
- package/dist/src/planner/stats/conjunct-selectivity.d.ts.map +1 -0
- package/dist/src/planner/stats/conjunct-selectivity.js +168 -0
- package/dist/src/planner/stats/conjunct-selectivity.js.map +1 -0
- package/dist/src/planner/stats/index.d.ts +36 -2
- package/dist/src/planner/stats/index.d.ts.map +1 -1
- package/dist/src/planner/stats/index.js.map +1 -1
- package/dist/src/planner/stats/selectivity-combine.d.ts +53 -0
- package/dist/src/planner/stats/selectivity-combine.d.ts.map +1 -0
- package/dist/src/planner/stats/selectivity-combine.js +75 -0
- package/dist/src/planner/stats/selectivity-combine.js.map +1 -0
- package/dist/src/planner/stats/table-cardinality.d.ts +28 -0
- package/dist/src/planner/stats/table-cardinality.d.ts.map +1 -0
- package/dist/src/planner/stats/table-cardinality.js +29 -0
- package/dist/src/planner/stats/table-cardinality.js.map +1 -0
- package/dist/src/planner/util/column-origins.d.ts +79 -0
- package/dist/src/planner/util/column-origins.d.ts.map +1 -0
- package/dist/src/planner/util/column-origins.js +150 -0
- package/dist/src/planner/util/column-origins.js.map +1 -0
- package/dist/src/planner/util/fd-utils.d.ts +32 -8
- package/dist/src/planner/util/fd-utils.d.ts.map +1 -1
- package/dist/src/planner/util/fd-utils.js +46 -9
- package/dist/src/planner/util/fd-utils.js.map +1 -1
- package/dist/src/planner/util/ind-utils.d.ts +56 -17
- package/dist/src/planner/util/ind-utils.d.ts.map +1 -1
- package/dist/src/planner/util/ind-utils.js +82 -21
- package/dist/src/planner/util/ind-utils.js.map +1 -1
- package/dist/src/planner/util/key-utils.d.ts +20 -2
- package/dist/src/planner/util/key-utils.d.ts.map +1 -1
- package/dist/src/planner/util/key-utils.js +37 -3
- package/dist/src/planner/util/key-utils.js.map +1 -1
- package/dist/src/planner/util/row-estimates.d.ts +28 -0
- package/dist/src/planner/util/row-estimates.d.ts.map +1 -0
- package/dist/src/planner/util/row-estimates.js +40 -0
- package/dist/src/planner/util/row-estimates.js.map +1 -0
- package/dist/src/planner/util/row-population.d.ts +42 -0
- package/dist/src/planner/util/row-population.d.ts.map +1 -0
- package/dist/src/planner/util/row-population.js +71 -0
- package/dist/src/planner/util/row-population.js.map +1 -0
- package/dist/src/runtime/deferred-constraint-queue.d.ts +40 -0
- package/dist/src/runtime/deferred-constraint-queue.d.ts.map +1 -1
- package/dist/src/runtime/deferred-constraint-queue.js +90 -9
- package/dist/src/runtime/deferred-constraint-queue.js.map +1 -1
- package/dist/src/runtime/emit/add-constraint.d.ts.map +1 -1
- package/dist/src/runtime/emit/add-constraint.js +39 -1
- package/dist/src/runtime/emit/add-constraint.js.map +1 -1
- package/dist/src/runtime/emit/aggregate.d.ts.map +1 -1
- package/dist/src/runtime/emit/aggregate.js +4 -4
- package/dist/src/runtime/emit/aggregate.js.map +1 -1
- package/dist/src/runtime/emit/alter-schema-event.d.ts +42 -0
- package/dist/src/runtime/emit/alter-schema-event.d.ts.map +1 -0
- package/dist/src/runtime/emit/alter-schema-event.js +28 -0
- package/dist/src/runtime/emit/alter-schema-event.js.map +1 -0
- package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
- package/dist/src/runtime/emit/alter-table.js +386 -154
- package/dist/src/runtime/emit/alter-table.js.map +1 -1
- package/dist/src/runtime/emit/analyze.d.ts.map +1 -1
- package/dist/src/runtime/emit/analyze.js +35 -3
- package/dist/src/runtime/emit/analyze.js.map +1 -1
- package/dist/src/runtime/emit/asof-scan.d.ts.map +1 -1
- package/dist/src/runtime/emit/asof-scan.js +8 -3
- package/dist/src/runtime/emit/asof-scan.js.map +1 -1
- package/dist/src/runtime/emit/between.d.ts.map +1 -1
- package/dist/src/runtime/emit/between.js +4 -38
- package/dist/src/runtime/emit/between.js.map +1 -1
- package/dist/src/runtime/emit/binary.d.ts.map +1 -1
- package/dist/src/runtime/emit/binary.js +2 -23
- package/dist/src/runtime/emit/binary.js.map +1 -1
- package/dist/src/runtime/emit/bloom-join.d.ts.map +1 -1
- package/dist/src/runtime/emit/bloom-join.js +6 -35
- package/dist/src/runtime/emit/bloom-join.js.map +1 -1
- package/dist/src/runtime/emit/case.d.ts.map +1 -1
- package/dist/src/runtime/emit/case.js +40 -6
- package/dist/src/runtime/emit/case.js.map +1 -1
- package/dist/src/runtime/emit/cast.d.ts.map +1 -1
- package/dist/src/runtime/emit/cast.js +4 -19
- package/dist/src/runtime/emit/cast.js.map +1 -1
- package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
- package/dist/src/runtime/emit/constraint-check.js +32 -8
- package/dist/src/runtime/emit/constraint-check.js.map +1 -1
- package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
- package/dist/src/runtime/emit/dml-executor.js +90 -50
- package/dist/src/runtime/emit/dml-executor.js.map +1 -1
- package/dist/src/runtime/emit/drop-index.d.ts.map +1 -1
- package/dist/src/runtime/emit/drop-index.js +4 -3
- package/dist/src/runtime/emit/drop-index.js.map +1 -1
- package/dist/src/runtime/emit/filter.d.ts +18 -0
- package/dist/src/runtime/emit/filter.d.ts.map +1 -1
- package/dist/src/runtime/emit/filter.js +52 -10
- package/dist/src/runtime/emit/filter.js.map +1 -1
- package/dist/src/runtime/emit/hash-aggregate.d.ts.map +1 -1
- package/dist/src/runtime/emit/hash-aggregate.js +2 -2
- package/dist/src/runtime/emit/hash-aggregate.js.map +1 -1
- package/dist/src/runtime/emit/join-key-extractor.d.ts +46 -0
- package/dist/src/runtime/emit/join-key-extractor.d.ts.map +1 -0
- package/dist/src/runtime/emit/join-key-extractor.js +60 -0
- package/dist/src/runtime/emit/join-key-extractor.js.map +1 -0
- package/dist/src/runtime/emit/join.d.ts.map +1 -1
- package/dist/src/runtime/emit/join.js +8 -46
- package/dist/src/runtime/emit/join.js.map +1 -1
- package/dist/src/runtime/emit/key-set-semi-join.d.ts +29 -0
- package/dist/src/runtime/emit/key-set-semi-join.d.ts.map +1 -0
- package/dist/src/runtime/emit/key-set-semi-join.js +149 -0
- package/dist/src/runtime/emit/key-set-semi-join.js.map +1 -0
- package/dist/src/runtime/emit/merge-join.d.ts.map +1 -1
- package/dist/src/runtime/emit/merge-join.js +15 -8
- package/dist/src/runtime/emit/merge-join.js.map +1 -1
- package/dist/src/runtime/emit/operand-comparator.d.ts +70 -0
- package/dist/src/runtime/emit/operand-comparator.d.ts.map +1 -0
- package/dist/src/runtime/emit/operand-comparator.js +93 -0
- package/dist/src/runtime/emit/operand-comparator.js.map +1 -0
- package/dist/src/runtime/emit/scan.d.ts.map +1 -1
- package/dist/src/runtime/emit/scan.js +11 -2
- package/dist/src/runtime/emit/scan.js.map +1 -1
- package/dist/src/runtime/emit/schema-declarative.d.ts.map +1 -1
- package/dist/src/runtime/emit/schema-declarative.js +30 -0
- package/dist/src/runtime/emit/schema-declarative.js.map +1 -1
- package/dist/src/runtime/emit/subquery.d.ts.map +1 -1
- package/dist/src/runtime/emit/subquery.js +153 -52
- package/dist/src/runtime/emit/subquery.js.map +1 -1
- package/dist/src/runtime/emit/window.js +36 -23
- package/dist/src/runtime/emit/window.js.map +1 -1
- package/dist/src/runtime/parallel-driver.d.ts +5 -2
- package/dist/src/runtime/parallel-driver.d.ts.map +1 -1
- package/dist/src/runtime/parallel-driver.js +6 -2
- package/dist/src/runtime/parallel-driver.js.map +1 -1
- package/dist/src/runtime/register.d.ts.map +1 -1
- package/dist/src/runtime/register.js +2 -0
- package/dist/src/runtime/register.js.map +1 -1
- package/dist/src/runtime/types.d.ts +7 -0
- package/dist/src/runtime/types.d.ts.map +1 -1
- package/dist/src/runtime/types.js.map +1 -1
- package/dist/src/schema/catalog-persistability.d.ts +19 -16
- package/dist/src/schema/catalog-persistability.d.ts.map +1 -1
- package/dist/src/schema/catalog-persistability.js +76 -20
- package/dist/src/schema/catalog-persistability.js.map +1 -1
- package/dist/src/schema/catalog.d.ts +67 -2
- package/dist/src/schema/catalog.d.ts.map +1 -1
- package/dist/src/schema/catalog.js +194 -3
- package/dist/src/schema/catalog.js.map +1 -1
- package/dist/src/schema/column.d.ts +26 -3
- package/dist/src/schema/column.d.ts.map +1 -1
- package/dist/src/schema/column.js.map +1 -1
- package/dist/src/schema/ddl-generator.d.ts.map +1 -1
- package/dist/src/schema/ddl-generator.js +19 -6
- package/dist/src/schema/ddl-generator.js.map +1 -1
- package/dist/src/schema/function.d.ts +40 -0
- package/dist/src/schema/function.d.ts.map +1 -1
- package/dist/src/schema/function.js +10 -2
- package/dist/src/schema/function.js.map +1 -1
- package/dist/src/schema/manager.d.ts +84 -7
- package/dist/src/schema/manager.d.ts.map +1 -1
- package/dist/src/schema/manager.js +153 -53
- package/dist/src/schema/manager.js.map +1 -1
- package/dist/src/schema/schema-differ.d.ts.map +1 -1
- package/dist/src/schema/schema-differ.js +104 -28
- package/dist/src/schema/schema-differ.js.map +1 -1
- package/dist/src/schema/table.d.ts +149 -1
- package/dist/src/schema/table.d.ts.map +1 -1
- package/dist/src/schema/table.js +248 -1
- package/dist/src/schema/table.js.map +1 -1
- package/dist/src/schema/unique-enforcement.d.ts +5 -3
- package/dist/src/schema/unique-enforcement.d.ts.map +1 -1
- package/dist/src/schema/unique-enforcement.js +5 -3
- package/dist/src/schema/unique-enforcement.js.map +1 -1
- package/dist/src/types/builtin-types.d.ts +16 -0
- package/dist/src/types/builtin-types.d.ts.map +1 -1
- package/dist/src/types/builtin-types.js +76 -12
- package/dist/src/types/builtin-types.js.map +1 -1
- package/dist/src/types/cast-semantics.d.ts +42 -0
- package/dist/src/types/cast-semantics.d.ts.map +1 -1
- package/dist/src/types/cast-semantics.js +64 -0
- package/dist/src/types/cast-semantics.js.map +1 -1
- package/dist/src/types/comparison-coercion.d.ts +101 -0
- package/dist/src/types/comparison-coercion.d.ts.map +1 -0
- package/dist/src/types/comparison-coercion.js +162 -0
- package/dist/src/types/comparison-coercion.js.map +1 -0
- package/dist/src/types/index.d.ts +2 -2
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/types/index.js +2 -2
- package/dist/src/types/index.js.map +1 -1
- package/dist/src/types/logical-type.d.ts +7 -0
- package/dist/src/types/logical-type.d.ts.map +1 -1
- package/dist/src/types/logical-type.js.map +1 -1
- package/dist/src/types/validation.d.ts +56 -0
- package/dist/src/types/validation.d.ts.map +1 -1
- package/dist/src/types/validation.js +68 -0
- package/dist/src/types/validation.js.map +1 -1
- package/dist/src/util/coercion.d.ts +8 -0
- package/dist/src/util/coercion.d.ts.map +1 -1
- package/dist/src/util/coercion.js +8 -0
- package/dist/src/util/coercion.js.map +1 -1
- package/dist/src/util/comparison.d.ts +41 -3
- package/dist/src/util/comparison.d.ts.map +1 -1
- package/dist/src/util/comparison.js +52 -5
- package/dist/src/util/comparison.js.map +1 -1
- package/dist/src/util/key-serializer.d.ts +46 -0
- package/dist/src/util/key-serializer.d.ts.map +1 -1
- package/dist/src/util/key-serializer.js +47 -0
- package/dist/src/util/key-serializer.js.map +1 -1
- package/dist/src/util/value-set.d.ts +21 -0
- package/dist/src/util/value-set.d.ts.map +1 -0
- package/dist/src/util/value-set.js +22 -0
- package/dist/src/util/value-set.js.map +1 -0
- package/dist/src/vtab/best-access-plan.d.ts +87 -0
- package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
- package/dist/src/vtab/best-access-plan.js +87 -0
- package/dist/src/vtab/best-access-plan.js.map +1 -1
- package/dist/src/vtab/capabilities.d.ts +1 -1
- package/dist/src/vtab/events.d.ts +5 -1
- package/dist/src/vtab/events.d.ts.map +1 -1
- package/dist/src/vtab/events.js.map +1 -1
- package/dist/src/vtab/memory/layer/alter-column.d.ts +147 -0
- package/dist/src/vtab/memory/layer/alter-column.d.ts.map +1 -0
- package/dist/src/vtab/memory/layer/alter-column.js +214 -0
- package/dist/src/vtab/memory/layer/alter-column.js.map +1 -0
- package/dist/src/vtab/memory/layer/base.d.ts +6 -4
- package/dist/src/vtab/memory/layer/base.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/base.js +10 -7
- package/dist/src/vtab/memory/layer/base.js.map +1 -1
- package/dist/src/vtab/memory/layer/interface.d.ts +2 -2
- package/dist/src/vtab/memory/layer/interface.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts +232 -39
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +657 -519
- package/dist/src/vtab/memory/layer/manager.js.map +1 -1
- package/dist/src/vtab/memory/layer/scan-layer.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/scan-layer.js +32 -5
- package/dist/src/vtab/memory/layer/scan-layer.js.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.d.ts +111 -16
- package/dist/src/vtab/memory/layer/transaction.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.js +154 -51
- package/dist/src/vtab/memory/layer/transaction.js.map +1 -1
- package/dist/src/vtab/memory/module.d.ts +14 -2
- package/dist/src/vtab/memory/module.d.ts.map +1 -1
- package/dist/src/vtab/memory/module.js +53 -40
- package/dist/src/vtab/memory/module.js.map +1 -1
- package/dist/src/vtab/memory/table.d.ts +1 -1
- package/dist/src/vtab/memory/table.d.ts.map +1 -1
- package/dist/src/vtab/memory/table.js +15 -3
- package/dist/src/vtab/memory/table.js.map +1 -1
- package/dist/src/vtab/module.d.ts +51 -21
- package/dist/src/vtab/module.d.ts.map +1 -1
- package/dist/src/vtab/table.d.ts +10 -2
- package/dist/src/vtab/table.d.ts.map +1 -1
- package/dist/src/vtab/table.js +1 -1
- package/dist/src/vtab/table.js.map +1 -1
- package/package.json +3 -3
|
@@ -6,8 +6,19 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { NaiveStatsProvider } from './index.js';
|
|
8
8
|
import { createLogger } from '../../common/logger.js';
|
|
9
|
+
import { catalogRowCount } from './table-cardinality.js';
|
|
9
10
|
import { selectivityFromHistogram } from './histogram.js';
|
|
11
|
+
import { combineConjunctive, combineDisjunctive } from './selectivity-combine.js';
|
|
12
|
+
import { splitConjuncts, splitDisjuncts } from '../analysis/predicate-conjuncts.js';
|
|
10
13
|
const log = createLogger('optimizer:stats:catalog');
|
|
14
|
+
/**
|
|
15
|
+
* Guard against unbounded recursion through nested OR / NOT structures.
|
|
16
|
+
* (AND and OR levels are each flattened in one step, so this only bites on
|
|
17
|
+
* genuinely alternating boolean nesting.)
|
|
18
|
+
*/
|
|
19
|
+
const MAX_BOOLEAN_DEPTH = 16;
|
|
20
|
+
const complete = (value) => ({ kind: 'complete', value });
|
|
21
|
+
const lowerBound = (value) => ({ kind: 'lowerBound', value });
|
|
11
22
|
// ── CatalogStatsProvider ────────────────────────────────────────────────
|
|
12
23
|
/**
|
|
13
24
|
* Statistics provider that reads cached TableStatistics from the schema catalog.
|
|
@@ -19,27 +30,51 @@ export class CatalogStatsProvider {
|
|
|
19
30
|
this.fallback = fallback ?? new NaiveStatsProvider();
|
|
20
31
|
}
|
|
21
32
|
tableRows(table) {
|
|
22
|
-
const
|
|
23
|
-
if (
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
return this.fallback.tableRows(table);
|
|
33
|
+
const rows = catalogRowCount(table);
|
|
34
|
+
if (rows === undefined)
|
|
35
|
+
return this.fallback.tableRows(table);
|
|
36
|
+
log('Table %s: rowCount=%d (source: %s)', table.name, rows, table.statistics ? 'catalog' : 'schema');
|
|
37
|
+
return rows;
|
|
28
38
|
}
|
|
29
|
-
selectivity(table, predicate) {
|
|
30
|
-
const
|
|
31
|
-
if (
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
if (sel !== undefined) {
|
|
35
|
-
log('Predicate selectivity for %s on %s: %f (catalog)', predicate.nodeType, table.name, sel);
|
|
36
|
-
return sel;
|
|
39
|
+
selectivity(table, predicate, resolve) {
|
|
40
|
+
const estimate = this.estimate(table, predicate, resolve);
|
|
41
|
+
if (estimate?.kind === 'complete') {
|
|
42
|
+
log('Predicate selectivity for %s on %s: %f (catalog)', predicate.nodeType, table.name, estimate.value);
|
|
43
|
+
return estimate.value;
|
|
37
44
|
}
|
|
38
|
-
|
|
45
|
+
const naive = this.fallback.selectivity(table, predicate);
|
|
46
|
+
if (estimate === undefined)
|
|
47
|
+
return naive;
|
|
48
|
+
// A partly-known OR: keep the naive guess's caution, but never report below the
|
|
49
|
+
// floor the statistics already prove. Reporting the floor on its own would be
|
|
50
|
+
// wrong in the other direction — an unread branch may match far more rows than
|
|
51
|
+
// the branch that was read.
|
|
52
|
+
const lifted = naive === undefined ? estimate.value : Math.max(naive, estimate.value);
|
|
53
|
+
log('Predicate selectivity for %s on %s: %f (naive %o against catalog floor %f)', predicate.nodeType, table.name, lifted, naive, estimate.value);
|
|
54
|
+
return lifted;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* The catalog half of {@link selectivity}: undefined rather than a naive guess
|
|
58
|
+
* when the table carries no statistics, or when the predicate's shape puts it out
|
|
59
|
+
* of reach of the ones it has —
|
|
60
|
+
*
|
|
61
|
+
* - the column is not a direct child of the comparison (`lower(cat) = 'x'` —
|
|
62
|
+
* {@link extractColumnFromPredicate} looks one level down and finds none), or
|
|
63
|
+
* - the column was minted above the base table (a computed projection, an
|
|
64
|
+
* aggregate or window output), which a caller-supplied
|
|
65
|
+
* {@link ColumnStatsResolver} reports by resolving the attribute to nothing.
|
|
66
|
+
*
|
|
67
|
+
* A partly-known OR reads as undefined here: this method means "real statistics
|
|
68
|
+
* answered *the predicate*", and `rule-filter-selectivity` uses it as its
|
|
69
|
+
* does-this-relation-have-usable-statistics gate. A floor is not an answer.
|
|
70
|
+
*/
|
|
71
|
+
statsOnlySelectivity(table, predicate, resolve) {
|
|
72
|
+
const estimate = this.estimate(table, predicate, resolve);
|
|
73
|
+
return estimate?.kind === 'complete' ? estimate.value : undefined;
|
|
39
74
|
}
|
|
40
|
-
joinSelectivity(leftTable, rightTable, joinCondition) {
|
|
75
|
+
joinSelectivity(leftTable, rightTable, joinCondition, resolve) {
|
|
41
76
|
// For equi-joins, use 1/max(ndv_left, ndv_right) if we can extract columns
|
|
42
|
-
const colNames = extractEquiJoinColumns(joinCondition);
|
|
77
|
+
const colNames = extractEquiJoinColumns(joinCondition, resolve);
|
|
43
78
|
if (colNames) {
|
|
44
79
|
// Check FK→PK: if one side has an FK referencing the other's PK,
|
|
45
80
|
// use 1/ndv_pk for tighter selectivity
|
|
@@ -98,6 +133,13 @@ export class CatalogStatsProvider {
|
|
|
98
133
|
return ndv;
|
|
99
134
|
return this.fallback.distinctValues?.(table, columnName);
|
|
100
135
|
}
|
|
136
|
+
/**
|
|
137
|
+
* NOTE: no {@link ColumnStatsResolver} is threaded here, so the delegated estimate
|
|
138
|
+
* matches columns by AST name. Nothing in the engine calls this today (only its own
|
|
139
|
+
* tests do), so nothing is wrong now — but the first production caller must widen
|
|
140
|
+
* this signature to take a resolver and pass it down, or it will silently get the
|
|
141
|
+
* name matching the selectivity family no longer uses.
|
|
142
|
+
*/
|
|
101
143
|
indexSelectivity(table, indexName, predicate) {
|
|
102
144
|
// Delegate to base selectivity — real column stats already improve this
|
|
103
145
|
const sel = this.selectivity(table, predicate);
|
|
@@ -110,17 +152,172 @@ export class CatalogStatsProvider {
|
|
|
110
152
|
const colStats = table.statistics?.columnStats.get(columnName.toLowerCase());
|
|
111
153
|
return colStats?.distinctCount;
|
|
112
154
|
}
|
|
113
|
-
|
|
155
|
+
/**
|
|
156
|
+
* Entry point for predicate selectivity: no statistics at all, or the empty
|
|
157
|
+
* table, short-circuit; otherwise walk the predicate's boolean structure.
|
|
158
|
+
*/
|
|
159
|
+
estimate(table, predicate, resolve) {
|
|
160
|
+
const stats = table.statistics;
|
|
161
|
+
if (!stats)
|
|
162
|
+
return undefined;
|
|
114
163
|
if (stats.rowCount === 0)
|
|
115
|
-
return 0;
|
|
164
|
+
return complete(0);
|
|
165
|
+
return this.estimateNode({ stats, resolve }, predicate, 0);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Recurse over the boolean structure (AND / OR / NOT) of a predicate,
|
|
169
|
+
* delegating anything else to {@link estimateLeaf}.
|
|
170
|
+
*
|
|
171
|
+
* Returns undefined when nothing useful can be said, which lets `selectivity`
|
|
172
|
+
* fall through to the naive provider exactly as it did before this recursion
|
|
173
|
+
* existed.
|
|
174
|
+
*/
|
|
175
|
+
estimateNode(ctx, node, depth) {
|
|
176
|
+
if (depth > MAX_BOOLEAN_DEPTH)
|
|
177
|
+
return undefined;
|
|
178
|
+
if (node.nodeType === 'BinaryOp') {
|
|
179
|
+
// Planner convention is uppercase 'AND' / 'OR' (see predicate-normalizer).
|
|
180
|
+
const op = node.expression.operator;
|
|
181
|
+
if (op === 'AND')
|
|
182
|
+
return this.estimateConjunction(ctx, node, depth);
|
|
183
|
+
if (op === 'OR')
|
|
184
|
+
return this.estimateDisjunction(ctx, node, depth);
|
|
185
|
+
}
|
|
186
|
+
if (node.nodeType === 'UnaryOp') {
|
|
187
|
+
// 'NOT' is boolean structure; the other unary operators ('IS NULL' etc.)
|
|
188
|
+
// are leaves and fall through to estimateLeaf below.
|
|
189
|
+
if (node.expression.operator === 'NOT') {
|
|
190
|
+
// Read the operand through getChildren() rather than `.operand`, matching
|
|
191
|
+
// how the rest of this file introspects nodes structurally.
|
|
192
|
+
const operand = node.getChildren()[0];
|
|
193
|
+
if (!operand)
|
|
194
|
+
return undefined;
|
|
195
|
+
const inner = this.estimateNode(ctx, operand, depth + 1);
|
|
196
|
+
// A lower bound negates into an UPPER bound, which nothing downstream
|
|
197
|
+
// models, so a partly-known operand makes the negation unknown.
|
|
198
|
+
if (inner?.kind !== 'complete')
|
|
199
|
+
return undefined;
|
|
200
|
+
// NOTE: estimateConjunction's "unknown conjunct counts as 1.0" makes an AND
|
|
201
|
+
// estimate an UPPER bound, and negating flips that into a LOWER bound — so
|
|
202
|
+
// `not (a = 1 and lower(s) = 'x')` errs low where the AND path claims to err
|
|
203
|
+
// high. Bounded (the true value is between this and 1) and the direction only
|
|
204
|
+
// inverts under an explicit NOT, which the planner rarely leaves standing. If
|
|
205
|
+
// negated mixed-knowledge predicates ever drive a bad plan, widen `Estimate`
|
|
206
|
+
// to carry an upper-bound kind as well.
|
|
207
|
+
return complete(1 - inner.value);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return this.leafEstimate(ctx, node);
|
|
211
|
+
}
|
|
212
|
+
/** {@link estimateLeaf} lifted into the {@link Estimate} vocabulary. */
|
|
213
|
+
leafEstimate(ctx, node) {
|
|
214
|
+
const sel = this.estimateLeaf(ctx, node);
|
|
215
|
+
return sel === undefined ? undefined : complete(sel);
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* AND: estimate each conjunct and combine the ones we could estimate.
|
|
219
|
+
*
|
|
220
|
+
* An unestimable conjunct is treated as selectivity 1.0 (claim no reduction)
|
|
221
|
+
* rather than handed to NaiveStatsProvider's flat 0.1. That number is
|
|
222
|
+
* fabricated, and multiplying it in biases the whole estimate downward;
|
|
223
|
+
* over-estimating surviving rows is the safer error direction for plan choice.
|
|
224
|
+
* Concretely `a = 1 and lower(b) = 'x'` now estimates 1/ndv(a) where it used to
|
|
225
|
+
* estimate 0.1 — a deliberate change, not a regression.
|
|
226
|
+
*
|
|
227
|
+
* If *every* conjunct is unknown we return undefined so the whole-predicate
|
|
228
|
+
* naive fallback in `selectivity()` still runs.
|
|
229
|
+
*
|
|
230
|
+
* A conjunct that only produced a lower bound (a partly-known OR) counts as
|
|
231
|
+
* unknown here for the same reason: folding a floor into the product would drag
|
|
232
|
+
* the result down, and AND deliberately errs high.
|
|
233
|
+
*/
|
|
234
|
+
estimateConjunction(ctx, node, depth) {
|
|
235
|
+
const conjuncts = splitConjuncts(node);
|
|
236
|
+
// splitConjuncts only descends through real BinaryOpNode instances; if it
|
|
237
|
+
// handed back the node itself there is nothing to decompose.
|
|
238
|
+
if (conjuncts.length === 1 && conjuncts[0] === node)
|
|
239
|
+
return this.leafEstimate(ctx, node);
|
|
240
|
+
const known = [];
|
|
241
|
+
for (const conjunct of conjuncts) {
|
|
242
|
+
const est = this.estimateNode(ctx, conjunct, depth + 1);
|
|
243
|
+
if (est?.kind === 'complete')
|
|
244
|
+
known.push(est.value);
|
|
245
|
+
}
|
|
246
|
+
if (known.length === 0)
|
|
247
|
+
return undefined;
|
|
248
|
+
// NOTE: conjuncts on the *same* column (`a > 1 and a < 10`) are strongly
|
|
249
|
+
// anti-correlated and are not paired into a single range here. Exponential
|
|
250
|
+
// backoff damps the error (0.333 · √0.333 ≈ 0.19 instead of 0.11) but does
|
|
251
|
+
// not remove it; same-column range pairing would.
|
|
252
|
+
return complete(this.floorCombined(ctx.stats, combineConjunctive(known), known.length));
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* OR: estimate every disjunct; combine them when all were readable, otherwise
|
|
256
|
+
* report what was proved as a lower bound.
|
|
257
|
+
*
|
|
258
|
+
* Unlike AND there is no safe default for an unknown disjunct — assuming 1.0
|
|
259
|
+
* would make the whole disjunction 1.0 (safe but useless), and assuming 0 would
|
|
260
|
+
* silently drop a branch that may match everything. But giving up outright
|
|
261
|
+
* discards a bound already in hand: `a or b` keeps at least as many rows as `a`,
|
|
262
|
+
* so the most permissive branch that COULD be read floors the whole disjunction.
|
|
263
|
+
* That floor travels out as a `lowerBound`, which `selectivity` uses to lift the
|
|
264
|
+
* naive guess (see there) and `statsOnlySelectivity` still reports as unknown.
|
|
265
|
+
*
|
|
266
|
+
* The floor is the max of the readable branches, NOT their disjunctive
|
|
267
|
+
* combination: `1 - Π(1 - sᵢ)` assumes the branches are independent, which is an
|
|
268
|
+
* estimate rather than a proof — if one readable branch subsumes another the true
|
|
269
|
+
* value is only the max.
|
|
270
|
+
*/
|
|
271
|
+
estimateDisjunction(ctx, node, depth) {
|
|
272
|
+
const disjuncts = splitDisjuncts(node);
|
|
273
|
+
// See estimateConjunction: nothing to decompose when the walk is a no-op.
|
|
274
|
+
if (disjuncts.length === 1 && disjuncts[0] === node)
|
|
275
|
+
return this.leafEstimate(ctx, node);
|
|
276
|
+
const sels = [];
|
|
277
|
+
let anyUnreadable = false;
|
|
278
|
+
for (const disjunct of disjuncts) {
|
|
279
|
+
const est = this.estimateNode(ctx, disjunct, depth + 1);
|
|
280
|
+
if (est === undefined) {
|
|
281
|
+
anyUnreadable = true;
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
// A branch's own lower bound is still a lower bound on the disjunction.
|
|
285
|
+
// NOTE: unreachable today — splitDisjuncts flattens nested ORs, and no other
|
|
286
|
+
// node kind produces a lowerBound, so no disjunct can carry one. Kept because
|
|
287
|
+
// it is the correct handling the moment another kind does.
|
|
288
|
+
if (est.kind === 'lowerBound')
|
|
289
|
+
anyUnreadable = true;
|
|
290
|
+
sels.push(est.value);
|
|
291
|
+
}
|
|
292
|
+
if (sels.length === 0)
|
|
293
|
+
return undefined;
|
|
294
|
+
if (anyUnreadable)
|
|
295
|
+
return lowerBound(Math.max(...sels));
|
|
296
|
+
return complete(this.floorCombined(ctx.stats, combineDisjunctive(sels), sels.length));
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Never claim fewer than one surviving row once two or more selectivities were
|
|
300
|
+
* actually combined. Deliberately not applied to a single leaf estimate:
|
|
301
|
+
* `IS NULL` on a column with nullCount 0 legitimately returns 0 today, and
|
|
302
|
+
* `FilterNode.estimatedRows` already floors the row count at 1.
|
|
303
|
+
*/
|
|
304
|
+
floorCombined(stats, sel, combinedCount) {
|
|
305
|
+
if (combinedCount < 2)
|
|
306
|
+
return sel;
|
|
307
|
+
// rowCount === 0 short-circuits in estimatePredicateSelectivity, so the
|
|
308
|
+
// max() here only guards against a negative / absent count.
|
|
309
|
+
return Math.max(sel, 1 / Math.max(stats.rowCount, 1));
|
|
310
|
+
}
|
|
311
|
+
/** Estimate a single (non-boolean) comparison against column statistics. */
|
|
312
|
+
estimateLeaf(ctx, predicate) {
|
|
116
313
|
// Try to extract column reference from the predicate for column-level estimation
|
|
117
|
-
const colInfo = extractColumnFromPredicate(predicate);
|
|
314
|
+
const colInfo = extractColumnFromPredicate(predicate, ctx.resolve);
|
|
118
315
|
if (!colInfo)
|
|
119
316
|
return undefined;
|
|
120
|
-
const colStats = stats.columnStats.get(colInfo.columnName.toLowerCase());
|
|
317
|
+
const colStats = ctx.stats.columnStats.get(colInfo.columnName.toLowerCase());
|
|
121
318
|
if (!colStats)
|
|
122
319
|
return undefined;
|
|
123
|
-
const { rowCount } = stats;
|
|
320
|
+
const { rowCount } = ctx.stats;
|
|
124
321
|
switch (predicate.nodeType) {
|
|
125
322
|
case 'BinaryOp': {
|
|
126
323
|
const op = predicate.expression.operator;
|
|
@@ -190,12 +387,27 @@ export class CatalogStatsProvider {
|
|
|
190
387
|
// ── Predicate introspection helpers ─────────────────────────────────────
|
|
191
388
|
// These extract structural info from plan nodes using typed imports of the
|
|
192
389
|
// concrete node classes (BinaryOpNode, UnaryOpNode, etc.).
|
|
193
|
-
function extractColumnFromPredicate(predicate) {
|
|
390
|
+
function extractColumnFromPredicate(predicate, resolve) {
|
|
194
391
|
// BinaryOp, In, Between, UnaryOp all typically have a column child
|
|
392
|
+
// NOTE: for a column-vs-column comparison on one table (`where x = y`) this
|
|
393
|
+
// picks the first ColumnReference and the caller finds no literal, so `=`
|
|
394
|
+
// yields 1/ndv(x) — wrong, since it models "x equals a constant" rather than
|
|
395
|
+
// "x equals another varying column". Pre-existing; fixing it needs a real
|
|
396
|
+
// two-sided comparison classifier.
|
|
195
397
|
const children = predicate.getChildren();
|
|
196
398
|
for (const child of children) {
|
|
197
399
|
if (child.nodeType === 'ColumnReference') {
|
|
198
|
-
const
|
|
400
|
+
const col = child;
|
|
401
|
+
if (resolve) {
|
|
402
|
+
// Identity path: an attribute minted above the base table resolves to
|
|
403
|
+
// nothing, and the estimate declines rather than borrowing whichever base
|
|
404
|
+
// column happens to share its AST name. Note this returns outright instead
|
|
405
|
+
// of trying the next child — "the compared column has no statistics" is the
|
|
406
|
+
// answer, not a reason to read the other operand.
|
|
407
|
+
const resolved = resolve(col.attributeId);
|
|
408
|
+
return resolved === undefined ? undefined : { columnName: resolved };
|
|
409
|
+
}
|
|
410
|
+
const name = col.expression.name;
|
|
199
411
|
if (name)
|
|
200
412
|
return { columnName: name };
|
|
201
413
|
}
|
|
@@ -219,7 +431,10 @@ function extractInListSize(predicate) {
|
|
|
219
431
|
const node = predicate;
|
|
220
432
|
if (Array.isArray(node.values))
|
|
221
433
|
return node.values.length;
|
|
222
|
-
// Some IN nodes store the list in children after the first (column) child
|
|
434
|
+
// Some IN nodes store the list in children after the first (column) child.
|
|
435
|
+
// NOTE: `x in (select …)` has no value list, so this falls to children.length-1
|
|
436
|
+
// === 1 and the caller reports 1/ndv — the estimate for a single equality
|
|
437
|
+
// rather than for the subquery's real cardinality. Pre-existing.
|
|
223
438
|
const children = predicate.getChildren();
|
|
224
439
|
if (children.length > 1)
|
|
225
440
|
return children.length - 1;
|
|
@@ -241,7 +456,7 @@ function extractBetweenBounds(predicate) {
|
|
|
241
456
|
}
|
|
242
457
|
return undefined;
|
|
243
458
|
}
|
|
244
|
-
function extractEquiJoinColumns(condition) {
|
|
459
|
+
function extractEquiJoinColumns(condition, resolve) {
|
|
245
460
|
if (condition.nodeType !== 'BinaryOp')
|
|
246
461
|
return undefined;
|
|
247
462
|
const op = condition.expression.operator;
|
|
@@ -254,10 +469,17 @@ function extractEquiJoinColumns(condition) {
|
|
|
254
469
|
const right = children[1];
|
|
255
470
|
if (left.nodeType !== 'ColumnReference' || right.nodeType !== 'ColumnReference')
|
|
256
471
|
return undefined;
|
|
257
|
-
const leftName = left
|
|
258
|
-
const rightName = right
|
|
472
|
+
const leftName = columnStatsName(left, resolve);
|
|
473
|
+
const rightName = columnStatsName(right, resolve);
|
|
259
474
|
if (!leftName || !rightName)
|
|
260
475
|
return undefined;
|
|
261
476
|
return { left: leftName, right: rightName };
|
|
262
477
|
}
|
|
478
|
+
/**
|
|
479
|
+
* The base-table column a reference's statistics live under: by attribute identity
|
|
480
|
+
* when a resolver is available, otherwise by the name in the AST.
|
|
481
|
+
*/
|
|
482
|
+
function columnStatsName(col, resolve) {
|
|
483
|
+
return resolve ? resolve(col.attributeId) : col.expression.name;
|
|
484
|
+
}
|
|
263
485
|
//# sourceMappingURL=catalog-stats.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog-stats.js","sourceRoot":"","sources":["../../../../src/planner/stats/catalog-stats.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"catalog-stats.js","sourceRoot":"","sources":["../../../../src/planner/stats/catalog-stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-conjunct selectivity estimation shared by `rule-filter-selectivity`
|
|
3
|
+
* (which folds the estimates into one stamped number) and
|
|
4
|
+
* `rule-filter-conjunct-ordering` (which ranks conjuncts individually).
|
|
5
|
+
* Extracted verbatim from the former so the two cannot drift.
|
|
6
|
+
*
|
|
7
|
+
* Everything here is gated on REAL statistics: a single-relation conjunct goes
|
|
8
|
+
* through `statsOnlySelectivity` (never `selectivity`, whose NaiveStatsProvider
|
|
9
|
+
* fallback fabricates a per-nodeType guess), and a cross-relation conjunct
|
|
10
|
+
* requires `columnStats` for both compared columns. Undefined always means
|
|
11
|
+
* "no real statistics answered", never "here is a guess".
|
|
12
|
+
*
|
|
13
|
+
* Do NOT re-export this module from `stats/index.ts`: `framework/context.ts`
|
|
14
|
+
* imports `stats/index.ts`, and this module type-imports `OptContext` from
|
|
15
|
+
* `framework/context.ts`, so a barrel re-export would create an import cycle
|
|
16
|
+
* (mirroring the same note on `cost/conjunct-cost.ts`).
|
|
17
|
+
*
|
|
18
|
+
* NOTE: a CORRELATED subquery conjunct (`exists (select … where i.oid = o.id)`)
|
|
19
|
+
* can resolve an outer attribute id through `conjunctRelations` — the walk
|
|
20
|
+
* descends relational children — and come back with a base-column estimate that
|
|
21
|
+
* describes the OUTER column rather than the subquery's result. Pre-existing in
|
|
22
|
+
* the stamping path, and bounded in the ordering path because the cost tier is
|
|
23
|
+
* the primary sort key: such a conjunct is `Subquery` tier, so a bogus estimate
|
|
24
|
+
* can only reorder it against other `Subquery`-tier conjuncts, never lift it
|
|
25
|
+
* ahead of a `Pure` one.
|
|
26
|
+
*/
|
|
27
|
+
import type { ScalarPlanNode } from '../nodes/plan-node.js';
|
|
28
|
+
import type { OptContext } from '../framework/context.js';
|
|
29
|
+
import type { ColumnOrigin } from '../util/column-origins.js';
|
|
30
|
+
import type { ColumnStatsResolver } from './index.js';
|
|
31
|
+
/**
|
|
32
|
+
* Selectivity of an inequality (`<` `<=` `>` `>=`) comparing a column of one table
|
|
33
|
+
* to a column of another. The standard uniform-distribution estimate for a
|
|
34
|
+
* two-sided inequality is 1/3: there is no cross-table histogram, so nothing
|
|
35
|
+
* better than the uniform assumption is available here.
|
|
36
|
+
*/
|
|
37
|
+
export declare const CROSS_RELATION_INEQUALITY_SELECTIVITY: number;
|
|
38
|
+
/**
|
|
39
|
+
* A resolver over `origins`, restricted to the origins `accept` allows.
|
|
40
|
+
*
|
|
41
|
+
* An attribute with no origin — or one belonging to a relation the caller is not
|
|
42
|
+
* currently estimating — resolves to undefined, which the provider reads as "this
|
|
43
|
+
* column has no statistics" rather than falling back to its AST name.
|
|
44
|
+
*/
|
|
45
|
+
export declare function makeColumnStatsResolver(origins: ReadonlyMap<number, ColumnOrigin>, accept: (origin: ColumnOrigin) => boolean): ColumnStatsResolver;
|
|
46
|
+
/** Estimate one conjunct, or undefined when it cannot be attributed / estimated. */
|
|
47
|
+
export declare function estimateConjunctSelectivity(conjunct: ScalarPlanNode, origins: ReadonlyMap<number, ColumnOrigin>, context: OptContext): number | undefined;
|
|
48
|
+
//# sourceMappingURL=conjunct-selectivity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conjunct-selectivity.d.ts","sourceRoot":"","sources":["../../../../src/planner/stats/conjunct-selectivity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAY,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAI1D,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,2BAA2B,CAAC;AAChF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD;;;;;GAKG;AACH,eAAO,MAAM,qCAAqC,QAAQ,CAAC;AAE3D;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACtC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,EAC1C,MAAM,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,GACvC,mBAAmB,CAKrB;AAED,oFAAoF;AACpF,wBAAgB,2BAA2B,CAC1C,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,EAC1C,OAAO,EAAE,UAAU,GACjB,MAAM,GAAG,SAAS,CAkBpB"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-conjunct selectivity estimation shared by `rule-filter-selectivity`
|
|
3
|
+
* (which folds the estimates into one stamped number) and
|
|
4
|
+
* `rule-filter-conjunct-ordering` (which ranks conjuncts individually).
|
|
5
|
+
* Extracted verbatim from the former so the two cannot drift.
|
|
6
|
+
*
|
|
7
|
+
* Everything here is gated on REAL statistics: a single-relation conjunct goes
|
|
8
|
+
* through `statsOnlySelectivity` (never `selectivity`, whose NaiveStatsProvider
|
|
9
|
+
* fallback fabricates a per-nodeType guess), and a cross-relation conjunct
|
|
10
|
+
* requires `columnStats` for both compared columns. Undefined always means
|
|
11
|
+
* "no real statistics answered", never "here is a guess".
|
|
12
|
+
*
|
|
13
|
+
* Do NOT re-export this module from `stats/index.ts`: `framework/context.ts`
|
|
14
|
+
* imports `stats/index.ts`, and this module type-imports `OptContext` from
|
|
15
|
+
* `framework/context.ts`, so a barrel re-export would create an import cycle
|
|
16
|
+
* (mirroring the same note on `cost/conjunct-cost.ts`).
|
|
17
|
+
*
|
|
18
|
+
* NOTE: a CORRELATED subquery conjunct (`exists (select … where i.oid = o.id)`)
|
|
19
|
+
* can resolve an outer attribute id through `conjunctRelations` — the walk
|
|
20
|
+
* descends relational children — and come back with a base-column estimate that
|
|
21
|
+
* describes the OUTER column rather than the subquery's result. Pre-existing in
|
|
22
|
+
* the stamping path, and bounded in the ordering path because the cost tier is
|
|
23
|
+
* the primary sort key: such a conjunct is `Subquery` tier, so a bogus estimate
|
|
24
|
+
* can only reorder it against other `Subquery`-tier conjuncts, never lift it
|
|
25
|
+
* ahead of a `Pure` one.
|
|
26
|
+
*/
|
|
27
|
+
import { BinaryOpNode } from '../nodes/scalar.js';
|
|
28
|
+
import { ColumnReferenceNode } from '../nodes/reference.js';
|
|
29
|
+
/**
|
|
30
|
+
* Selectivity of an inequality (`<` `<=` `>` `>=`) comparing a column of one table
|
|
31
|
+
* to a column of another. The standard uniform-distribution estimate for a
|
|
32
|
+
* two-sided inequality is 1/3: there is no cross-table histogram, so nothing
|
|
33
|
+
* better than the uniform assumption is available here.
|
|
34
|
+
*/
|
|
35
|
+
export const CROSS_RELATION_INEQUALITY_SELECTIVITY = 1 / 3;
|
|
36
|
+
/**
|
|
37
|
+
* A resolver over `origins`, restricted to the origins `accept` allows.
|
|
38
|
+
*
|
|
39
|
+
* An attribute with no origin — or one belonging to a relation the caller is not
|
|
40
|
+
* currently estimating — resolves to undefined, which the provider reads as "this
|
|
41
|
+
* column has no statistics" rather than falling back to its AST name.
|
|
42
|
+
*/
|
|
43
|
+
export function makeColumnStatsResolver(origins, accept) {
|
|
44
|
+
return (attributeId) => {
|
|
45
|
+
const origin = origins.get(attributeId);
|
|
46
|
+
return origin && accept(origin) ? origin.columnName : undefined;
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** Estimate one conjunct, or undefined when it cannot be attributed / estimated. */
|
|
50
|
+
export function estimateConjunctSelectivity(conjunct, origins, context) {
|
|
51
|
+
const relations = conjunctRelations(conjunct, origins);
|
|
52
|
+
if (relations === undefined)
|
|
53
|
+
return undefined;
|
|
54
|
+
if (relations.size === 1) {
|
|
55
|
+
const [[relation, table]] = relations;
|
|
56
|
+
// Relation-instance identity, not schema: `from t a join t b` gives two
|
|
57
|
+
// instances sharing one TableSchema, so schema equality would not separate the
|
|
58
|
+
// sides. `conjunctRelations` has already established that this conjunct touches
|
|
59
|
+
// exactly this one instance.
|
|
60
|
+
const resolve = makeColumnStatsResolver(origins, origin => origin.relation === relation);
|
|
61
|
+
return singleRelationConjunct(table, conjunct, resolve, context);
|
|
62
|
+
}
|
|
63
|
+
if (relations.size === 2) {
|
|
64
|
+
return crossRelationConjunct(conjunct, origins, context);
|
|
65
|
+
}
|
|
66
|
+
// Three or more relations in one conjunct: no model for it here.
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* The distinct relation instances a conjunct's column references come from, each
|
|
71
|
+
* mapped to the schema whose statistics describe it.
|
|
72
|
+
*
|
|
73
|
+
* Returns undefined when the conjunct references no column at all, or references
|
|
74
|
+
* any attribute that is not a base-table column (a computed projection, an
|
|
75
|
+
* aggregate output, a join existence flag, a set-operation output, a column of a
|
|
76
|
+
* table inside a scalar subquery) — in either case there are no statistics to
|
|
77
|
+
* consult.
|
|
78
|
+
*/
|
|
79
|
+
function conjunctRelations(conjunct, origins) {
|
|
80
|
+
const relations = new Map();
|
|
81
|
+
const stack = [conjunct];
|
|
82
|
+
while (stack.length > 0) {
|
|
83
|
+
const n = stack.pop();
|
|
84
|
+
if (n instanceof ColumnReferenceNode) {
|
|
85
|
+
const origin = origins.get(n.attributeId);
|
|
86
|
+
if (!origin)
|
|
87
|
+
return undefined;
|
|
88
|
+
relations.set(origin.relation, origin.table);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
for (const child of n.getChildren())
|
|
92
|
+
stack.push(child);
|
|
93
|
+
}
|
|
94
|
+
return relations.size > 0 ? relations : undefined;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* A conjunct over exactly one relation: hand it to the provider as if it were a
|
|
98
|
+
* single-table predicate.
|
|
99
|
+
*
|
|
100
|
+
* `statsOnlySelectivity` — not `selectivity` — IS the statistics gate. `selectivity`
|
|
101
|
+
* always returns a number (CatalogStatsProvider falls through to NaiveStatsProvider,
|
|
102
|
+
* which answers a flat 0.1 for any BinaryOp), so using it here would replace 0.5 with
|
|
103
|
+
* 0.1 on essentially every filter-over-join in the codebase — including the many tests
|
|
104
|
+
* that never run ANALYZE — churning plan shapes with no information behind the change.
|
|
105
|
+
* It also covers the subtler case of an analyzed table with a predicate the catalog
|
|
106
|
+
* cannot read (`lower(o.cat) = 'x'`), which a column-stats-presence check would let
|
|
107
|
+
* through. A provider that does not implement it is treated as having no statistics.
|
|
108
|
+
*/
|
|
109
|
+
function singleRelationConjunct(table, conjunct, resolve, context) {
|
|
110
|
+
return context.stats.statsOnlySelectivity?.(table, conjunct, resolve);
|
|
111
|
+
}
|
|
112
|
+
function hasColumnStats(origin) {
|
|
113
|
+
return origin.table.statistics?.columnStats.has(origin.columnName.toLowerCase()) ?? false;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* A conjunct comparing a column of one relation to a column of another
|
|
117
|
+
* (`o.qty > l.qty`, `a.id = b.id`). Only a plain binary comparison with a bare
|
|
118
|
+
* column reference on each side is modelled; anything else is unknown.
|
|
119
|
+
*
|
|
120
|
+
* Gated on real column statistics for BOTH compared columns, for the same reason as
|
|
121
|
+
* {@link singleRelationConjunct}: `joinSelectivity` falls back to
|
|
122
|
+
* `NaiveStatsProvider`'s `1/max(rowCount)` whenever it cannot read a distinct count,
|
|
123
|
+
* so table-level `statistics` being present is not enough on its own.
|
|
124
|
+
*/
|
|
125
|
+
function crossRelationConjunct(conjunct, origins, context) {
|
|
126
|
+
if (!(conjunct instanceof BinaryOpNode))
|
|
127
|
+
return undefined;
|
|
128
|
+
if (!(conjunct.left instanceof ColumnReferenceNode))
|
|
129
|
+
return undefined;
|
|
130
|
+
if (!(conjunct.right instanceof ColumnReferenceNode))
|
|
131
|
+
return undefined;
|
|
132
|
+
const leftOrigin = origins.get(conjunct.left.attributeId);
|
|
133
|
+
const rightOrigin = origins.get(conjunct.right.attributeId);
|
|
134
|
+
if (!leftOrigin || !rightOrigin)
|
|
135
|
+
return undefined;
|
|
136
|
+
if (!hasColumnStats(leftOrigin) || !hasColumnStats(rightOrigin))
|
|
137
|
+
return undefined;
|
|
138
|
+
const op = conjunct.expression.operator;
|
|
139
|
+
// Both origins were resolved and stats-checked by identity just above, so no
|
|
140
|
+
// further narrowing is needed — the resolver only has to replace the AST names
|
|
141
|
+
// with the base columns those two attributes actually are.
|
|
142
|
+
const resolve = makeColumnStatsResolver(origins, () => true);
|
|
143
|
+
if (op === '=' || op === '==')
|
|
144
|
+
return equiJoinSelectivity(conjunct, leftOrigin, rightOrigin, resolve, context);
|
|
145
|
+
// `extractEquiJoinColumns` accepts only `=`, so the catalog declines a `<>` and
|
|
146
|
+
// `joinSelectivity` answers from NaiveStatsProvider, which is capped at 0.5. The
|
|
147
|
+
// complement is therefore bounded to [0.5, 1] — it can only ever relax the
|
|
148
|
+
// estimate relative to DEFAULT_FILTER_SELECTIVITY, and the true value for a
|
|
149
|
+
// cross-relation `<>` is near 1, so the bound errs in the right direction.
|
|
150
|
+
if (op === '!=' || op === '<>') {
|
|
151
|
+
const eq = equiJoinSelectivity(conjunct, leftOrigin, rightOrigin, resolve, context);
|
|
152
|
+
return eq === undefined ? undefined : 1 - eq;
|
|
153
|
+
}
|
|
154
|
+
if (op === '<' || op === '<=' || op === '>' || op === '>=') {
|
|
155
|
+
return CROSS_RELATION_INEQUALITY_SELECTIVITY;
|
|
156
|
+
}
|
|
157
|
+
return undefined;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Argument order matters: `CatalogStatsProvider.joinSelectivity` reads the column
|
|
161
|
+
* pair off the condition's own child order (`extractEquiJoinColumns`) and
|
|
162
|
+
* `fkPkSelectivity` interprets left/right against the tables it was handed. So the
|
|
163
|
+
* table owning the conjunct's LEFT child must be passed first.
|
|
164
|
+
*/
|
|
165
|
+
function equiJoinSelectivity(conjunct, leftOrigin, rightOrigin, resolve, context) {
|
|
166
|
+
return context.stats.joinSelectivity?.(leftOrigin.table, rightOrigin.table, conjunct, resolve);
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=conjunct-selectivity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conjunct-selectivity.js","sourceRoot":"","sources":["../../../../src/planner/stats/conjunct-selectivity.ts"],"names":[],"mappings":"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"}
|