@quereus/quereus 0.17.0 → 0.18.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 +372 -361
- package/dist/src/common/errors.d.ts +2 -18
- package/dist/src/common/errors.d.ts.map +1 -1
- package/dist/src/common/errors.js +6 -29
- package/dist/src/common/errors.js.map +1 -1
- package/dist/src/common/types.d.ts +8 -0
- package/dist/src/common/types.d.ts.map +1 -1
- package/dist/src/common/types.js +20 -0
- package/dist/src/common/types.js.map +1 -1
- package/dist/src/core/database-assertions.d.ts +19 -2
- package/dist/src/core/database-assertions.d.ts.map +1 -1
- package/dist/src/core/database-assertions.js +113 -32
- package/dist/src/core/database-assertions.js.map +1 -1
- package/dist/src/core/database-events.d.ts +17 -0
- package/dist/src/core/database-events.d.ts.map +1 -1
- package/dist/src/core/database-events.js +36 -0
- package/dist/src/core/database-events.js.map +1 -1
- package/dist/src/core/database.d.ts +11 -0
- package/dist/src/core/database.d.ts.map +1 -1
- package/dist/src/core/database.js +178 -85
- package/dist/src/core/database.js.map +1 -1
- package/dist/src/core/statement.d.ts +6 -0
- package/dist/src/core/statement.d.ts.map +1 -1
- package/dist/src/core/statement.js +42 -56
- package/dist/src/core/statement.js.map +1 -1
- package/dist/src/emit/ast-stringify.d.ts +1 -0
- package/dist/src/emit/ast-stringify.d.ts.map +1 -1
- package/dist/src/emit/ast-stringify.js +12 -2
- package/dist/src/emit/ast-stringify.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 +75 -0
- package/dist/src/func/builtins/builtin-window-functions.js.map +1 -1
- package/dist/src/func/builtins/conversion.js +9 -12
- package/dist/src/func/builtins/conversion.js.map +1 -1
- package/dist/src/func/builtins/datetime.js +1 -1
- package/dist/src/func/builtins/datetime.js.map +1 -1
- package/dist/src/func/builtins/explain.d.ts.map +1 -1
- package/dist/src/func/builtins/explain.js +15 -3
- package/dist/src/func/builtins/explain.js.map +1 -1
- package/dist/src/func/builtins/index.d.ts.map +1 -1
- package/dist/src/func/builtins/index.js +1 -11
- package/dist/src/func/builtins/index.js.map +1 -1
- package/dist/src/func/builtins/json-helpers.js +1 -1
- package/dist/src/func/builtins/json-helpers.js.map +1 -1
- package/dist/src/func/builtins/json.d.ts.map +1 -1
- package/dist/src/func/builtins/json.js +2 -5
- package/dist/src/func/builtins/json.js.map +1 -1
- package/dist/src/func/builtins/schema.d.ts.map +1 -1
- package/dist/src/func/builtins/schema.js +30 -32
- 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 +40 -64
- package/dist/src/func/builtins/string.js.map +1 -1
- package/dist/src/func/builtins/timespan.d.ts.map +1 -1
- package/dist/src/func/builtins/timespan.js.map +1 -1
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/parser/ast.d.ts +9 -2
- package/dist/src/parser/ast.d.ts.map +1 -1
- package/dist/src/parser/lexer.d.ts +1 -0
- package/dist/src/parser/lexer.d.ts.map +1 -1
- package/dist/src/parser/lexer.js +3 -0
- package/dist/src/parser/lexer.js.map +1 -1
- package/dist/src/parser/parser.d.ts +11 -1
- package/dist/src/parser/parser.d.ts.map +1 -1
- package/dist/src/parser/parser.js +75 -135
- package/dist/src/parser/parser.js.map +1 -1
- package/dist/src/planner/analysis/const-evaluator.d.ts.map +1 -1
- package/dist/src/planner/analysis/const-evaluator.js +6 -3
- package/dist/src/planner/analysis/const-evaluator.js.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.d.ts +2 -1
- package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.js +154 -22
- package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
- package/dist/src/planner/building/alter-table.d.ts.map +1 -1
- package/dist/src/planner/building/alter-table.js +18 -1
- package/dist/src/planner/building/alter-table.js.map +1 -1
- package/dist/src/planner/building/analyze.d.ts +5 -0
- package/dist/src/planner/building/analyze.d.ts.map +1 -0
- package/dist/src/planner/building/analyze.js +5 -0
- package/dist/src/planner/building/analyze.js.map +1 -0
- package/dist/src/planner/building/block.d.ts.map +1 -1
- package/dist/src/planner/building/block.js +3 -0
- package/dist/src/planner/building/block.js.map +1 -1
- package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
- package/dist/src/planner/building/constraint-builder.js +25 -3
- package/dist/src/planner/building/constraint-builder.js.map +1 -1
- package/dist/src/planner/building/delete.d.ts.map +1 -1
- package/dist/src/planner/building/delete.js +11 -0
- package/dist/src/planner/building/delete.js.map +1 -1
- package/dist/src/planner/building/drop-assertion.d.ts.map +1 -1
- package/dist/src/planner/building/drop-assertion.js +2 -1
- package/dist/src/planner/building/drop-assertion.js.map +1 -1
- package/dist/src/planner/building/expression.d.ts.map +1 -1
- package/dist/src/planner/building/expression.js +55 -7
- package/dist/src/planner/building/expression.js.map +1 -1
- package/dist/src/planner/building/foreign-key-builder.d.ts +16 -0
- package/dist/src/planner/building/foreign-key-builder.d.ts.map +1 -0
- package/dist/src/planner/building/foreign-key-builder.js +269 -0
- package/dist/src/planner/building/foreign-key-builder.js.map +1 -0
- package/dist/src/planner/building/function-call.d.ts.map +1 -1
- package/dist/src/planner/building/function-call.js +3 -2
- package/dist/src/planner/building/function-call.js.map +1 -1
- package/dist/src/planner/building/insert.d.ts.map +1 -1
- package/dist/src/planner/building/insert.js +91 -10
- package/dist/src/planner/building/insert.js.map +1 -1
- package/dist/src/planner/building/schema-resolution.d.ts +4 -0
- package/dist/src/planner/building/schema-resolution.d.ts.map +1 -1
- package/dist/src/planner/building/schema-resolution.js +14 -3
- package/dist/src/planner/building/schema-resolution.js.map +1 -1
- package/dist/src/planner/building/select-aggregates.d.ts +1 -0
- package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
- package/dist/src/planner/building/select-aggregates.js +118 -3
- package/dist/src/planner/building/select-aggregates.js.map +1 -1
- package/dist/src/planner/building/select-modifiers.js +3 -3
- package/dist/src/planner/building/select-modifiers.js.map +1 -1
- package/dist/src/planner/building/select-window.js +9 -8
- package/dist/src/planner/building/select-window.js.map +1 -1
- package/dist/src/planner/building/select.d.ts.map +1 -1
- package/dist/src/planner/building/select.js +21 -10
- package/dist/src/planner/building/select.js.map +1 -1
- package/dist/src/planner/building/table.d.ts.map +1 -1
- package/dist/src/planner/building/table.js +5 -3
- package/dist/src/planner/building/table.js.map +1 -1
- package/dist/src/planner/building/update.d.ts.map +1 -1
- package/dist/src/planner/building/update.js +30 -1
- package/dist/src/planner/building/update.js.map +1 -1
- package/dist/src/planner/building/with.js +1 -1
- package/dist/src/planner/building/with.js.map +1 -1
- package/dist/src/planner/cache/reference-graph.d.ts +1 -1
- package/dist/src/planner/cache/reference-graph.js +1 -1
- package/dist/src/planner/cost/index.d.ts +10 -3
- package/dist/src/planner/cost/index.d.ts.map +1 -1
- package/dist/src/planner/cost/index.js +17 -3
- package/dist/src/planner/cost/index.js.map +1 -1
- package/dist/src/planner/debug.js +1 -1
- package/dist/src/planner/debug.js.map +1 -1
- package/dist/src/planner/framework/characteristics.d.ts +1 -1
- package/dist/src/planner/framework/characteristics.d.ts.map +1 -1
- package/dist/src/planner/framework/pass.d.ts +3 -1
- package/dist/src/planner/framework/pass.d.ts.map +1 -1
- package/dist/src/planner/framework/pass.js +62 -18
- package/dist/src/planner/framework/pass.js.map +1 -1
- package/dist/src/planner/framework/physical-utils.d.ts +5 -0
- package/dist/src/planner/framework/physical-utils.d.ts.map +1 -1
- package/dist/src/planner/framework/physical-utils.js +19 -0
- package/dist/src/planner/framework/physical-utils.js.map +1 -1
- package/dist/src/planner/framework/trace.d.ts.map +1 -1
- package/dist/src/planner/framework/trace.js +3 -2
- package/dist/src/planner/framework/trace.js.map +1 -1
- package/dist/src/planner/nodes/alias-node.d.ts +2 -1
- package/dist/src/planner/nodes/alias-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/alias-node.js +8 -0
- package/dist/src/planner/nodes/alias-node.js.map +1 -1
- package/dist/src/planner/nodes/alter-table-node.d.ts +42 -0
- package/dist/src/planner/nodes/alter-table-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/alter-table-node.js +55 -0
- package/dist/src/planner/nodes/alter-table-node.js.map +1 -0
- package/dist/src/planner/nodes/analyze-node.d.ts +25 -0
- package/dist/src/planner/nodes/analyze-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/analyze-node.js +83 -0
- package/dist/src/planner/nodes/analyze-node.js.map +1 -0
- package/dist/src/planner/nodes/bloom-join-node.d.ts +66 -0
- package/dist/src/planner/nodes/bloom-join-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/bloom-join-node.js +200 -0
- package/dist/src/planner/nodes/bloom-join-node.js.map +1 -0
- package/dist/src/planner/nodes/constraint-check-node.d.ts +1 -1
- package/dist/src/planner/nodes/constraint-check-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/cte-reference-node.js +7 -7
- package/dist/src/planner/nodes/cte-reference-node.js.map +1 -1
- package/dist/src/planner/nodes/join-node.d.ts +9 -1
- package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-node.js +69 -79
- package/dist/src/planner/nodes/join-node.js.map +1 -1
- package/dist/src/planner/nodes/merge-join-node.d.ts +60 -0
- package/dist/src/planner/nodes/merge-join-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/merge-join-node.js +207 -0
- package/dist/src/planner/nodes/merge-join-node.js.map +1 -0
- 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/project-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/project-node.js +3 -2
- package/dist/src/planner/nodes/project-node.js.map +1 -1
- package/dist/src/planner/nodes/reference.d.ts +2 -1
- package/dist/src/planner/nodes/reference.d.ts.map +1 -1
- package/dist/src/planner/nodes/reference.js +6 -2
- package/dist/src/planner/nodes/reference.js.map +1 -1
- package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/returning-node.js +3 -2
- package/dist/src/planner/nodes/returning-node.js.map +1 -1
- package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
- package/dist/src/planner/nodes/subquery.js.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.js +1 -1
- package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
- package/dist/src/planner/nodes/update-node.d.ts +2 -0
- package/dist/src/planner/nodes/update-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/update-node.js +2 -1
- package/dist/src/planner/nodes/update-node.js.map +1 -1
- package/dist/src/planner/nodes/window-function.d.ts.map +1 -1
- package/dist/src/planner/nodes/window-function.js +7 -7
- package/dist/src/planner/nodes/window-function.js.map +1 -1
- package/dist/src/planner/nodes/window-node.d.ts +2 -2
- package/dist/src/planner/nodes/window-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/window-node.js +9 -14
- package/dist/src/planner/nodes/window-node.js.map +1 -1
- package/dist/src/planner/optimizer.d.ts.map +1 -1
- package/dist/src/planner/optimizer.js +40 -2
- package/dist/src/planner/optimizer.js.map +1 -1
- package/dist/src/planner/planning-context.d.ts.map +1 -1
- package/dist/src/planner/planning-context.js +1 -6
- package/dist/src/planner/planning-context.js.map +1 -1
- package/dist/src/planner/resolve.d.ts.map +1 -1
- package/dist/src/planner/resolve.js.map +1 -1
- package/dist/src/planner/rules/access/rule-select-access-path.js +157 -28
- package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.d.ts.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js +27 -6
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js.map +1 -1
- package/dist/src/planner/rules/cache/rule-in-subquery-cache.d.ts +19 -0
- package/dist/src/planner/rules/cache/rule-in-subquery-cache.d.ts.map +1 -0
- package/dist/src/planner/rules/cache/rule-in-subquery-cache.js +53 -0
- package/dist/src/planner/rules/cache/rule-in-subquery-cache.js.map +1 -0
- package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.d.ts.map +1 -1
- package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.js +5 -0
- package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.js.map +1 -1
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.d.ts +18 -0
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.d.ts.map +1 -0
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.js +37 -0
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.js.map +1 -0
- package/dist/src/planner/rules/join/rule-join-key-inference.d.ts +8 -3
- package/dist/src/planner/rules/join/rule-join-key-inference.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-join-key-inference.js +28 -17
- package/dist/src/planner/rules/join/rule-join-key-inference.js.map +1 -1
- package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts +16 -0
- package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-join-physical-selection.js +216 -0
- package/dist/src/planner/rules/join/rule-join-physical-selection.js.map +1 -0
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts.map +1 -1
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js +34 -4
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +1 -1
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts +23 -0
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts.map +1 -0
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js +293 -0
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js.map +1 -0
- package/dist/src/planner/scopes/multi.d.ts +3 -2
- package/dist/src/planner/scopes/multi.d.ts.map +1 -1
- package/dist/src/planner/scopes/multi.js +32 -7
- package/dist/src/planner/scopes/multi.js.map +1 -1
- package/dist/src/planner/scopes/shadow.d.ts +20 -0
- package/dist/src/planner/scopes/shadow.d.ts.map +1 -0
- package/dist/src/planner/scopes/shadow.js +31 -0
- package/dist/src/planner/scopes/shadow.js.map +1 -0
- package/dist/src/planner/stats/analyze.d.ts +17 -0
- package/dist/src/planner/stats/analyze.d.ts.map +1 -0
- package/dist/src/planner/stats/analyze.js +114 -0
- package/dist/src/planner/stats/analyze.js.map +1 -0
- package/dist/src/planner/stats/catalog-stats.d.ts +80 -0
- package/dist/src/planner/stats/catalog-stats.d.ts.map +1 -0
- package/dist/src/planner/stats/catalog-stats.js +248 -0
- package/dist/src/planner/stats/catalog-stats.js.map +1 -0
- package/dist/src/planner/stats/histogram.d.ts +24 -0
- package/dist/src/planner/stats/histogram.d.ts.map +1 -0
- package/dist/src/planner/stats/histogram.js +142 -0
- package/dist/src/planner/stats/histogram.js.map +1 -0
- package/dist/src/planner/type-utils.d.ts.map +1 -1
- package/dist/src/planner/type-utils.js +8 -2
- package/dist/src/planner/type-utils.js.map +1 -1
- package/dist/src/planner/util/key-utils.d.ts +48 -2
- package/dist/src/planner/util/key-utils.d.ts.map +1 -1
- package/dist/src/planner/util/key-utils.js +123 -0
- package/dist/src/planner/util/key-utils.js.map +1 -1
- package/dist/src/planner/validation/determinism-validator.d.ts +9 -0
- package/dist/src/planner/validation/determinism-validator.d.ts.map +1 -1
- package/dist/src/planner/validation/determinism-validator.js +11 -0
- package/dist/src/planner/validation/determinism-validator.js.map +1 -1
- package/dist/src/planner/validation/plan-validator.d.ts.map +1 -1
- package/dist/src/planner/validation/plan-validator.js +1 -0
- package/dist/src/planner/validation/plan-validator.js.map +1 -1
- package/dist/src/runtime/context-helpers.d.ts +34 -10
- package/dist/src/runtime/context-helpers.d.ts.map +1 -1
- package/dist/src/runtime/context-helpers.js +115 -39
- package/dist/src/runtime/context-helpers.js.map +1 -1
- package/dist/src/runtime/deferred-constraint-queue.d.ts +0 -1
- package/dist/src/runtime/deferred-constraint-queue.d.ts.map +1 -1
- package/dist/src/runtime/deferred-constraint-queue.js +10 -23
- package/dist/src/runtime/deferred-constraint-queue.js.map +1 -1
- package/dist/src/runtime/descriptor-helpers.d.ts +7 -0
- package/dist/src/runtime/descriptor-helpers.d.ts.map +1 -0
- package/dist/src/runtime/descriptor-helpers.js +24 -0
- package/dist/src/runtime/descriptor-helpers.js.map +1 -0
- package/dist/src/runtime/emission-context.d.ts +7 -1
- package/dist/src/runtime/emission-context.d.ts.map +1 -1
- package/dist/src/runtime/emission-context.js +16 -0
- package/dist/src/runtime/emission-context.js.map +1 -1
- package/dist/src/runtime/emit/aggregate.d.ts.map +1 -1
- package/dist/src/runtime/emit/aggregate.js +97 -93
- package/dist/src/runtime/emit/aggregate.js.map +1 -1
- package/dist/src/runtime/emit/alter-table.d.ts +5 -0
- package/dist/src/runtime/emit/alter-table.d.ts.map +1 -0
- package/dist/src/runtime/emit/alter-table.js +209 -0
- package/dist/src/runtime/emit/alter-table.js.map +1 -0
- package/dist/src/runtime/emit/analyze.d.ts +9 -0
- package/dist/src/runtime/emit/analyze.d.ts.map +1 -0
- package/dist/src/runtime/emit/analyze.js +72 -0
- package/dist/src/runtime/emit/analyze.js.map +1 -0
- package/dist/src/runtime/emit/array-index.d.ts.map +1 -1
- package/dist/src/runtime/emit/array-index.js +4 -2
- package/dist/src/runtime/emit/array-index.js.map +1 -1
- package/dist/src/runtime/emit/between.d.ts.map +1 -1
- package/dist/src/runtime/emit/between.js +8 -20
- 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 +155 -126
- package/dist/src/runtime/emit/binary.js.map +1 -1
- package/dist/src/runtime/emit/bloom-join.d.ts +12 -0
- package/dist/src/runtime/emit/bloom-join.d.ts.map +1 -0
- package/dist/src/runtime/emit/bloom-join.js +114 -0
- package/dist/src/runtime/emit/bloom-join.js.map +1 -0
- package/dist/src/runtime/emit/cache.js +2 -2
- package/dist/src/runtime/emit/cache.js.map +1 -1
- package/dist/src/runtime/emit/cast.d.ts.map +1 -1
- package/dist/src/runtime/emit/cast.js +31 -117
- 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 +2 -24
- package/dist/src/runtime/emit/constraint-check.js.map +1 -1
- package/dist/src/runtime/emit/cte-reference.d.ts.map +1 -1
- package/dist/src/runtime/emit/cte-reference.js +11 -5
- package/dist/src/runtime/emit/cte-reference.js.map +1 -1
- package/dist/src/runtime/emit/distinct.d.ts.map +1 -1
- package/dist/src/runtime/emit/distinct.js +21 -12
- package/dist/src/runtime/emit/distinct.js.map +1 -1
- package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
- package/dist/src/runtime/emit/dml-executor.js +5 -1
- package/dist/src/runtime/emit/dml-executor.js.map +1 -1
- package/dist/src/runtime/emit/drop-assertion.d.ts.map +1 -1
- package/dist/src/runtime/emit/drop-assertion.js +2 -0
- package/dist/src/runtime/emit/drop-assertion.js.map +1 -1
- package/dist/src/runtime/emit/filter.d.ts.map +1 -1
- package/dist/src/runtime/emit/filter.js +26 -7
- package/dist/src/runtime/emit/filter.js.map +1 -1
- package/dist/src/runtime/emit/internal-recursive-cte-ref.d.ts.map +1 -1
- package/dist/src/runtime/emit/internal-recursive-cte-ref.js +11 -5
- package/dist/src/runtime/emit/internal-recursive-cte-ref.js.map +1 -1
- package/dist/src/runtime/emit/join.d.ts +1 -1
- package/dist/src/runtime/emit/join.d.ts.map +1 -1
- package/dist/src/runtime/emit/join.js +44 -33
- package/dist/src/runtime/emit/join.js.map +1 -1
- package/dist/src/runtime/emit/merge-join.d.ts +14 -0
- package/dist/src/runtime/emit/merge-join.d.ts.map +1 -0
- package/dist/src/runtime/emit/merge-join.js +152 -0
- package/dist/src/runtime/emit/merge-join.js.map +1 -0
- package/dist/src/runtime/emit/parameter.d.ts.map +1 -1
- package/dist/src/runtime/emit/parameter.js +10 -32
- package/dist/src/runtime/emit/parameter.js.map +1 -1
- package/dist/src/runtime/emit/project.d.ts.map +1 -1
- package/dist/src/runtime/emit/project.js +22 -12
- package/dist/src/runtime/emit/project.js.map +1 -1
- package/dist/src/runtime/emit/recursive-cte.d.ts.map +1 -1
- package/dist/src/runtime/emit/recursive-cte.js +5 -9
- package/dist/src/runtime/emit/recursive-cte.js.map +1 -1
- package/dist/src/runtime/emit/returning.d.ts.map +1 -1
- package/dist/src/runtime/emit/returning.js +14 -8
- package/dist/src/runtime/emit/returning.js.map +1 -1
- package/dist/src/runtime/emit/scan.d.ts.map +1 -1
- package/dist/src/runtime/emit/scan.js +4 -1
- package/dist/src/runtime/emit/scan.js.map +1 -1
- package/dist/src/runtime/emit/set-operation.d.ts.map +1 -1
- package/dist/src/runtime/emit/set-operation.js +8 -5
- package/dist/src/runtime/emit/set-operation.js.map +1 -1
- package/dist/src/runtime/emit/sort.js +2 -2
- package/dist/src/runtime/emit/sort.js.map +1 -1
- package/dist/src/runtime/emit/subquery.js +2 -2
- package/dist/src/runtime/emit/subquery.js.map +1 -1
- package/dist/src/runtime/emit/table-valued-function.d.ts.map +1 -1
- package/dist/src/runtime/emit/table-valued-function.js +21 -7
- package/dist/src/runtime/emit/table-valued-function.js.map +1 -1
- package/dist/src/runtime/emit/unary.js +2 -2
- package/dist/src/runtime/emit/unary.js.map +1 -1
- package/dist/src/runtime/emit/update.d.ts.map +1 -1
- package/dist/src/runtime/emit/update.js +43 -21
- package/dist/src/runtime/emit/update.js.map +1 -1
- package/dist/src/runtime/emit/window.d.ts.map +1 -1
- package/dist/src/runtime/emit/window.js +368 -126
- package/dist/src/runtime/emit/window.js.map +1 -1
- package/dist/src/runtime/foreign-key-actions.d.ts +15 -0
- package/dist/src/runtime/foreign-key-actions.d.ts.map +1 -0
- package/dist/src/runtime/foreign-key-actions.js +109 -0
- package/dist/src/runtime/foreign-key-actions.js.map +1 -0
- package/dist/src/runtime/register.d.ts.map +1 -1
- package/dist/src/runtime/register.js +8 -0
- package/dist/src/runtime/register.js.map +1 -1
- package/dist/src/runtime/scheduler.d.ts.map +1 -1
- package/dist/src/runtime/scheduler.js +4 -1
- package/dist/src/runtime/scheduler.js.map +1 -1
- package/dist/src/runtime/types.d.ts +6 -5
- package/dist/src/runtime/types.d.ts.map +1 -1
- package/dist/src/runtime/types.js.map +1 -1
- package/dist/src/schema/change-events.d.ts +36 -8
- package/dist/src/schema/change-events.d.ts.map +1 -1
- package/dist/src/schema/change-events.js.map +1 -1
- package/dist/src/schema/column.d.ts +5 -1
- package/dist/src/schema/column.d.ts.map +1 -1
- package/dist/src/schema/column.js +1 -2
- package/dist/src/schema/column.js.map +1 -1
- package/dist/src/schema/manager.d.ts +54 -4
- package/dist/src/schema/manager.d.ts.map +1 -1
- package/dist/src/schema/manager.js +353 -313
- package/dist/src/schema/manager.js.map +1 -1
- package/dist/src/schema/schema-differ.js +3 -3
- package/dist/src/schema/schema-differ.js.map +1 -1
- package/dist/src/schema/schema.d.ts +1 -1
- package/dist/src/schema/schema.js +2 -2
- package/dist/src/schema/schema.js.map +1 -1
- package/dist/src/schema/table.d.ts +49 -0
- package/dist/src/schema/table.d.ts.map +1 -1
- package/dist/src/schema/table.js +30 -11
- package/dist/src/schema/table.js.map +1 -1
- package/dist/src/types/builtin-types.d.ts.map +1 -1
- package/dist/src/types/builtin-types.js +26 -95
- package/dist/src/types/builtin-types.js.map +1 -1
- package/dist/src/types/index.d.ts +1 -1
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/types/index.js +1 -1
- package/dist/src/types/index.js.map +1 -1
- package/dist/src/types/json-type.d.ts.map +1 -1
- package/dist/src/types/json-type.js +28 -40
- package/dist/src/types/json-type.js.map +1 -1
- package/dist/src/types/logical-type.d.ts +6 -0
- package/dist/src/types/logical-type.d.ts.map +1 -1
- package/dist/src/types/logical-type.js +12 -0
- package/dist/src/types/logical-type.js.map +1 -1
- package/dist/src/types/temporal-types.d.ts.map +1 -1
- package/dist/src/types/temporal-types.js +8 -37
- package/dist/src/types/temporal-types.js.map +1 -1
- package/dist/src/util/coercion.d.ts +4 -5
- package/dist/src/util/coercion.d.ts.map +1 -1
- package/dist/src/util/coercion.js +10 -14
- package/dist/src/util/coercion.js.map +1 -1
- package/dist/src/util/comparison.d.ts +34 -21
- package/dist/src/util/comparison.d.ts.map +1 -1
- package/dist/src/util/comparison.js +77 -43
- package/dist/src/util/comparison.js.map +1 -1
- package/dist/src/util/environment.d.ts +0 -8
- package/dist/src/util/environment.d.ts.map +1 -1
- package/dist/src/util/environment.js +0 -12
- package/dist/src/util/environment.js.map +1 -1
- package/dist/src/util/key-serializer.d.ts +33 -0
- package/dist/src/util/key-serializer.d.ts.map +1 -0
- package/dist/src/util/key-serializer.js +95 -0
- package/dist/src/util/key-serializer.js.map +1 -0
- package/dist/src/util/plugin-helper.d.ts.map +1 -1
- package/dist/src/util/plugin-helper.js +21 -45
- package/dist/src/util/plugin-helper.js.map +1 -1
- package/dist/src/util/serialization.d.ts +1 -0
- package/dist/src/util/serialization.d.ts.map +1 -1
- package/dist/src/util/serialization.js +8 -1
- package/dist/src/util/serialization.js.map +1 -1
- package/dist/src/util/working-table-iterable.d.ts +6 -5
- package/dist/src/util/working-table-iterable.d.ts.map +1 -1
- package/dist/src/util/working-table-iterable.js +8 -15
- package/dist/src/util/working-table-iterable.js.map +1 -1
- package/dist/src/vtab/best-access-plan.d.ts +12 -0
- package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
- package/dist/src/vtab/best-access-plan.js +22 -0
- package/dist/src/vtab/best-access-plan.js.map +1 -1
- package/dist/src/vtab/manifest.d.ts +3 -1
- package/dist/src/vtab/manifest.d.ts.map +1 -1
- package/dist/src/vtab/memory/index.d.ts +2 -2
- package/dist/src/vtab/memory/index.d.ts.map +1 -1
- package/dist/src/vtab/memory/index.js +4 -7
- package/dist/src/vtab/memory/index.js.map +1 -1
- package/dist/src/vtab/memory/layer/base-cursor.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/base-cursor.js +37 -9
- package/dist/src/vtab/memory/layer/base-cursor.js.map +1 -1
- package/dist/src/vtab/memory/layer/base.js +1 -1
- package/dist/src/vtab/memory/layer/base.js.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts +15 -3
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +85 -37
- package/dist/src/vtab/memory/layer/manager.js.map +1 -1
- package/dist/src/vtab/memory/layer/scan-plan.d.ts +2 -0
- package/dist/src/vtab/memory/layer/scan-plan.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/scan-plan.js +153 -78
- package/dist/src/vtab/memory/layer/scan-plan.js.map +1 -1
- package/dist/src/vtab/memory/layer/transaction-cursor.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/transaction-cursor.js +39 -9
- package/dist/src/vtab/memory/layer/transaction-cursor.js.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.js +1 -5
- package/dist/src/vtab/memory/layer/transaction.js.map +1 -1
- package/dist/src/vtab/memory/module.d.ts +14 -24
- package/dist/src/vtab/memory/module.d.ts.map +1 -1
- package/dist/src/vtab/memory/module.js +88 -283
- package/dist/src/vtab/memory/module.js.map +1 -1
- package/dist/src/vtab/memory/table.d.ts +9 -0
- package/dist/src/vtab/memory/table.d.ts.map +1 -1
- package/dist/src/vtab/memory/table.js +121 -18
- package/dist/src/vtab/memory/table.js.map +1 -1
- package/dist/src/vtab/memory/types.d.ts +1 -0
- package/dist/src/vtab/memory/types.d.ts.map +1 -1
- package/dist/src/vtab/memory/utils/primary-key.js.map +1 -1
- package/dist/src/vtab/module.d.ts +13 -0
- package/dist/src/vtab/module.d.ts.map +1 -1
- package/dist/src/vtab/table.d.ts +9 -0
- package/dist/src/vtab/table.d.ts.map +1 -1
- package/dist/src/vtab/table.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Statistics collection via table scanning.
|
|
3
|
+
* Used as fallback when a VTab module doesn't implement getStatistics().
|
|
4
|
+
*/
|
|
5
|
+
import { buildHistogram } from './histogram.js';
|
|
6
|
+
import { compareSqlValues } from '../../util/comparison.js';
|
|
7
|
+
import { createLogger } from '../../common/logger.js';
|
|
8
|
+
const log = createLogger('stats:analyze');
|
|
9
|
+
/**
|
|
10
|
+
* Collect statistics by scanning all rows from a VTable instance.
|
|
11
|
+
* Computes row count, per-column distinct counts, null counts, min/max, and optional histograms.
|
|
12
|
+
*
|
|
13
|
+
* @param vtab Connected VirtualTable instance with query() support
|
|
14
|
+
* @param tableSchema Schema describing the table structure
|
|
15
|
+
* @returns Collected TableStatistics, or undefined if scanning is not supported
|
|
16
|
+
*/
|
|
17
|
+
export async function collectStatisticsFromScan(vtab, tableSchema) {
|
|
18
|
+
if (typeof vtab.query !== 'function') {
|
|
19
|
+
log('Table %s does not support query(), skipping scan-based analysis', tableSchema.name);
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
const colCount = tableSchema.columns.length;
|
|
23
|
+
const distinctSets = Array.from({ length: colCount }, () => new Set());
|
|
24
|
+
const nullCounts = new Array(colCount).fill(0);
|
|
25
|
+
const minValues = new Array(colCount).fill(undefined);
|
|
26
|
+
const maxValues = new Array(colCount).fill(undefined);
|
|
27
|
+
const sampleValues = Array.from({ length: colCount }, () => []);
|
|
28
|
+
let rowCount = 0;
|
|
29
|
+
const maxSample = 1000;
|
|
30
|
+
// Full scan with a minimal filter that returns all rows
|
|
31
|
+
const filterInfo = {
|
|
32
|
+
idxNum: 0,
|
|
33
|
+
idxStr: null,
|
|
34
|
+
constraints: [],
|
|
35
|
+
args: [],
|
|
36
|
+
indexInfoOutput: {
|
|
37
|
+
nConstraint: 0,
|
|
38
|
+
aConstraint: [],
|
|
39
|
+
nOrderBy: 0,
|
|
40
|
+
aOrderBy: [],
|
|
41
|
+
colUsed: 0n,
|
|
42
|
+
aConstraintUsage: [],
|
|
43
|
+
idxNum: 0,
|
|
44
|
+
idxStr: null,
|
|
45
|
+
orderByConsumed: false,
|
|
46
|
+
estimatedCost: Infinity,
|
|
47
|
+
estimatedRows: BigInt(Number.MAX_SAFE_INTEGER),
|
|
48
|
+
idxFlags: 0,
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
try {
|
|
52
|
+
for await (const row of vtab.query(filterInfo)) {
|
|
53
|
+
rowCount++;
|
|
54
|
+
for (let i = 0; i < colCount && i < row.length; i++) {
|
|
55
|
+
const val = row[i];
|
|
56
|
+
if (val === null || val === undefined) {
|
|
57
|
+
nullCounts[i]++;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
distinctSets[i].add(String(val));
|
|
61
|
+
// Track min/max
|
|
62
|
+
if (minValues[i] === undefined || compareSqlValues(val, minValues[i]) < 0) {
|
|
63
|
+
minValues[i] = val;
|
|
64
|
+
}
|
|
65
|
+
if (maxValues[i] === undefined || compareSqlValues(val, maxValues[i]) > 0) {
|
|
66
|
+
maxValues[i] = val;
|
|
67
|
+
}
|
|
68
|
+
// Collect sample values for histograms (reservoir sampling simplified)
|
|
69
|
+
if (sampleValues[i].length < maxSample) {
|
|
70
|
+
sampleValues[i].push(val);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
// Reservoir sampling: replace with decreasing probability
|
|
74
|
+
const j = Math.floor(Math.random() * rowCount);
|
|
75
|
+
if (j < maxSample) {
|
|
76
|
+
sampleValues[i][j] = val;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
log('Error scanning table %s: %s', tableSchema.name, e);
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
// Build column statistics
|
|
88
|
+
const columnStats = new Map();
|
|
89
|
+
for (let i = 0; i < colCount; i++) {
|
|
90
|
+
const col = tableSchema.columns[i];
|
|
91
|
+
const colName = col.name.toLowerCase();
|
|
92
|
+
const sortedSample = sampleValues[i].sort((a, b) => compareSqlValues(a, b));
|
|
93
|
+
const stats = {
|
|
94
|
+
distinctCount: distinctSets[i].size,
|
|
95
|
+
nullCount: nullCounts[i],
|
|
96
|
+
minValue: minValues[i] ?? undefined,
|
|
97
|
+
maxValue: maxValues[i] ?? undefined,
|
|
98
|
+
};
|
|
99
|
+
// Build histogram for columns with enough distinct values
|
|
100
|
+
if (sortedSample.length > 10) {
|
|
101
|
+
const hist = buildHistogram(sortedSample, Math.min(100, Math.ceil(sortedSample.length / 10)));
|
|
102
|
+
if (hist) {
|
|
103
|
+
stats.histogram = hist;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
columnStats.set(colName, stats);
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
rowCount,
|
|
110
|
+
columnStats,
|
|
111
|
+
lastAnalyzed: Date.now(),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=analyze.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../../../src/planner/stats/analyze.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,MAAM,GAAG,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;AAE1C;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC9C,IAAkB,EAClB,WAAwB;IAExB,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QACtC,GAAG,CAAC,iEAAiE,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QACzF,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;IAC5C,MAAM,YAAY,GAAkB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACtF,MAAM,UAAU,GAAa,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,SAAS,GAA6B,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAChF,MAAM,SAAS,GAA6B,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAChF,MAAM,YAAY,GAAiB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAE9E,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,MAAM,SAAS,GAAG,IAAI,CAAC;IAEvB,wDAAwD;IACxD,MAAM,UAAU,GAAe;QAC9B,MAAM,EAAE,CAAC;QACT,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,EAAE;QACf,IAAI,EAAE,EAAE;QACR,eAAe,EAAE;YAChB,WAAW,EAAE,CAAC;YACd,WAAW,EAAE,EAAE;YACf,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,EAAE;YACX,gBAAgB,EAAE,EAAE;YACpB,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,IAAI;YACZ,eAAe,EAAE,KAAK;YACtB,aAAa,EAAE,QAAQ;YACvB,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC;YAC9C,QAAQ,EAAE,CAAC;SACX;KACD,CAAC;IAEF,IAAI,CAAC;QACJ,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YAChD,QAAQ,EAAE,CAAC;YAEX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrD,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;gBACnB,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;oBACvC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjB,CAAC;qBAAM,CAAC;oBACP,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;oBAEjC,gBAAgB;oBAChB,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,gBAAgB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC5E,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;oBACpB,CAAC;oBACD,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,gBAAgB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC5E,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;oBACpB,CAAC;oBAED,uEAAuE;oBACvE,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;wBACxC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAC3B,CAAC;yBAAM,CAAC;wBACP,0DAA0D;wBAC1D,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC;wBAC/C,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC;4BACnB,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;wBAC1B,CAAC;oBACF,CAAC;gBACF,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,GAAG,CAAC,6BAA6B,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxD,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,0BAA0B;IAC1B,MAAM,WAAW,GAAG,IAAI,GAAG,EAA4B,CAAC;IACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAEvC,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAE5E,MAAM,KAAK,GAAqB;YAC/B,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI;YACnC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;YACxB,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS;YACnC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS;SACnC,CAAC;QAEF,0DAA0D;QAC1D,IAAI,YAAY,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9F,IAAI,IAAI,EAAE,CAAC;gBACV,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;YACxB,CAAC;QACF,CAAC;QAED,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,OAAO;QACN,QAAQ;QACR,WAAW;QACX,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;KACxB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Catalog-backed statistics types and provider
|
|
3
|
+
*
|
|
4
|
+
* Reads real statistics from TableSchema.statistics (populated by ANALYZE or VTab)
|
|
5
|
+
* and falls back to NaiveStatsProvider heuristics when unavailable.
|
|
6
|
+
*/
|
|
7
|
+
import type { SqlValue } from '../../common/types.js';
|
|
8
|
+
import type { ScalarPlanNode } from '../nodes/plan-node.js';
|
|
9
|
+
import type { TableSchema } from '../../schema/table.js';
|
|
10
|
+
import type { StatsProvider } from './index.js';
|
|
11
|
+
import { NaiveStatsProvider } from './index.js';
|
|
12
|
+
/**
|
|
13
|
+
* An equi-height histogram bucket.
|
|
14
|
+
* Buckets are cumulative: `cumulativeCount` is the total rows up to and including this bucket.
|
|
15
|
+
*/
|
|
16
|
+
export interface HistogramBucket {
|
|
17
|
+
/** Upper bound of this bucket (inclusive) */
|
|
18
|
+
upperBound: SqlValue;
|
|
19
|
+
/** Cumulative row count up to and including this bucket */
|
|
20
|
+
cumulativeCount: number;
|
|
21
|
+
/** Estimated distinct values in this bucket */
|
|
22
|
+
distinctCount: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Equi-height histogram for a column's value distribution.
|
|
26
|
+
*/
|
|
27
|
+
export interface EquiHeightHistogram {
|
|
28
|
+
buckets: readonly HistogramBucket[];
|
|
29
|
+
/** Number of rows sampled to build this histogram */
|
|
30
|
+
sampleSize: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Statistics for a single column.
|
|
34
|
+
*/
|
|
35
|
+
export interface ColumnStatistics {
|
|
36
|
+
/** Estimated number of distinct non-null values */
|
|
37
|
+
distinctCount: number;
|
|
38
|
+
/** Count of NULL values */
|
|
39
|
+
nullCount: number;
|
|
40
|
+
/** Minimum value (for range estimation) */
|
|
41
|
+
minValue?: SqlValue;
|
|
42
|
+
/** Maximum value (for range estimation) */
|
|
43
|
+
maxValue?: SqlValue;
|
|
44
|
+
/** Optional histogram for fine-grained selectivity */
|
|
45
|
+
histogram?: EquiHeightHistogram;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Cached statistics for a table, populated by ANALYZE or VTab reporting.
|
|
49
|
+
*/
|
|
50
|
+
export interface TableStatistics {
|
|
51
|
+
/** Exact or estimated row count */
|
|
52
|
+
rowCount: number;
|
|
53
|
+
/** Per-column statistics keyed by lowercase column name */
|
|
54
|
+
columnStats: ReadonlyMap<string, ColumnStatistics>;
|
|
55
|
+
/** Epoch ms when statistics were last collected */
|
|
56
|
+
lastAnalyzed?: number;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Statistics provider that reads cached TableStatistics from the schema catalog.
|
|
60
|
+
* Falls back to a NaiveStatsProvider when real statistics are not available.
|
|
61
|
+
*/
|
|
62
|
+
export declare class CatalogStatsProvider implements StatsProvider {
|
|
63
|
+
private readonly fallback;
|
|
64
|
+
constructor(fallback?: NaiveStatsProvider);
|
|
65
|
+
tableRows(table: TableSchema): number | undefined;
|
|
66
|
+
selectivity(table: TableSchema, predicate: ScalarPlanNode): number | undefined;
|
|
67
|
+
joinSelectivity(leftTable: TableSchema, rightTable: TableSchema, joinCondition: ScalarPlanNode): number | undefined;
|
|
68
|
+
/**
|
|
69
|
+
* Check if an equi-join column pair represents a FK→PK relationship.
|
|
70
|
+
* If so, return selectivity = 1/ndv_pk (each FK row matches at most one PK row).
|
|
71
|
+
*/
|
|
72
|
+
private fkPkSelectivity;
|
|
73
|
+
private isFkColumn;
|
|
74
|
+
private getPkDistinct;
|
|
75
|
+
distinctValues(table: TableSchema, columnName: string): number | undefined;
|
|
76
|
+
indexSelectivity(table: TableSchema, indexName: string, predicate: ScalarPlanNode): number | undefined;
|
|
77
|
+
private getDistinct;
|
|
78
|
+
private estimatePredicateSelectivity;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=catalog-stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-stats.d.ts","sourceRoot":"","sources":["../../../../src/planner/stats/catalog-stats.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAQhD;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC/B,6CAA6C;IAC7C,UAAU,EAAE,QAAQ,CAAC;IACrB,2DAA2D;IAC3D,eAAe,EAAE,MAAM,CAAC;IACxB,+CAA+C;IAC/C,aAAa,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IACnC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;IACpC,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,mDAAmD;IACnD,aAAa,EAAE,MAAM,CAAC;IACtB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,sDAAsD;IACtD,SAAS,CAAC,EAAE,mBAAmB,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACnD,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAID;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,aAAa;IACzD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;gBAElC,QAAQ,CAAC,EAAE,kBAAkB;IAIzC,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS;IASjD,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS;IAY9E,eAAe,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS;IAwBnH;;;OAGG;IACH,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,aAAa;IAMrB,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAM1E,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS;IAStG,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,4BAA4B;CAgFpC"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Catalog-backed statistics types and provider
|
|
3
|
+
*
|
|
4
|
+
* Reads real statistics from TableSchema.statistics (populated by ANALYZE or VTab)
|
|
5
|
+
* and falls back to NaiveStatsProvider heuristics when unavailable.
|
|
6
|
+
*/
|
|
7
|
+
import { NaiveStatsProvider } from './index.js';
|
|
8
|
+
import { createLogger } from '../../common/logger.js';
|
|
9
|
+
import { selectivityFromHistogram } from './histogram.js';
|
|
10
|
+
const log = createLogger('optimizer:stats:catalog');
|
|
11
|
+
// ── CatalogStatsProvider ────────────────────────────────────────────────
|
|
12
|
+
/**
|
|
13
|
+
* Statistics provider that reads cached TableStatistics from the schema catalog.
|
|
14
|
+
* Falls back to a NaiveStatsProvider when real statistics are not available.
|
|
15
|
+
*/
|
|
16
|
+
export class CatalogStatsProvider {
|
|
17
|
+
fallback;
|
|
18
|
+
constructor(fallback) {
|
|
19
|
+
this.fallback = fallback ?? new NaiveStatsProvider();
|
|
20
|
+
}
|
|
21
|
+
tableRows(table) {
|
|
22
|
+
const stats = table.statistics;
|
|
23
|
+
if (stats) {
|
|
24
|
+
log('Table %s: catalog rowCount=%d', table.name, stats.rowCount);
|
|
25
|
+
return stats.rowCount;
|
|
26
|
+
}
|
|
27
|
+
return this.fallback.tableRows(table);
|
|
28
|
+
}
|
|
29
|
+
selectivity(table, predicate) {
|
|
30
|
+
const stats = table.statistics;
|
|
31
|
+
if (!stats)
|
|
32
|
+
return this.fallback.selectivity(table, predicate);
|
|
33
|
+
const sel = this.estimatePredicateSelectivity(stats, predicate);
|
|
34
|
+
if (sel !== undefined) {
|
|
35
|
+
log('Predicate selectivity for %s on %s: %f (catalog)', predicate.nodeType, table.name, sel);
|
|
36
|
+
return sel;
|
|
37
|
+
}
|
|
38
|
+
return this.fallback.selectivity(table, predicate);
|
|
39
|
+
}
|
|
40
|
+
joinSelectivity(leftTable, rightTable, joinCondition) {
|
|
41
|
+
// For equi-joins, use 1/max(ndv_left, ndv_right) if we can extract columns
|
|
42
|
+
const colNames = extractEquiJoinColumns(joinCondition);
|
|
43
|
+
if (colNames) {
|
|
44
|
+
// Check FK→PK: if one side has an FK referencing the other's PK,
|
|
45
|
+
// use 1/ndv_pk for tighter selectivity
|
|
46
|
+
const fkSel = this.fkPkSelectivity(leftTable, rightTable, colNames.left, colNames.right);
|
|
47
|
+
if (fkSel !== undefined) {
|
|
48
|
+
log('Join selectivity %s⋈%s: %f (FK→PK)', leftTable.name, rightTable.name, fkSel);
|
|
49
|
+
return fkSel;
|
|
50
|
+
}
|
|
51
|
+
const leftNdv = this.getDistinct(leftTable, colNames.left);
|
|
52
|
+
const rightNdv = this.getDistinct(rightTable, colNames.right);
|
|
53
|
+
if (leftNdv !== undefined && rightNdv !== undefined) {
|
|
54
|
+
const sel = 1 / Math.max(leftNdv, rightNdv, 1);
|
|
55
|
+
log('Join selectivity %s⋈%s: %f (ndv left=%d, right=%d)', leftTable.name, rightTable.name, sel, leftNdv, rightNdv);
|
|
56
|
+
return sel;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return this.fallback.joinSelectivity?.(leftTable, rightTable, joinCondition);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Check if an equi-join column pair represents a FK→PK relationship.
|
|
63
|
+
* If so, return selectivity = 1/ndv_pk (each FK row matches at most one PK row).
|
|
64
|
+
*/
|
|
65
|
+
fkPkSelectivity(leftTable, rightTable, leftColName, rightColName) {
|
|
66
|
+
// Check: left FK → right PK
|
|
67
|
+
if (this.isFkColumn(leftTable, leftColName, rightTable)) {
|
|
68
|
+
const pkNdv = this.getPkDistinct(rightTable);
|
|
69
|
+
if (pkNdv !== undefined)
|
|
70
|
+
return 1 / Math.max(pkNdv, 1);
|
|
71
|
+
}
|
|
72
|
+
// Check: right FK → left PK
|
|
73
|
+
if (this.isFkColumn(rightTable, rightColName, leftTable)) {
|
|
74
|
+
const pkNdv = this.getPkDistinct(leftTable);
|
|
75
|
+
if (pkNdv !== undefined)
|
|
76
|
+
return 1 / Math.max(pkNdv, 1);
|
|
77
|
+
}
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
isFkColumn(table, colName, referencedTable) {
|
|
81
|
+
if (!table.foreignKeys)
|
|
82
|
+
return false;
|
|
83
|
+
const colIdx = table.columnIndexMap.get(colName.toLowerCase());
|
|
84
|
+
if (colIdx === undefined)
|
|
85
|
+
return false;
|
|
86
|
+
return table.foreignKeys.some(fk => fk.referencedTable.toLowerCase() === referencedTable.name.toLowerCase() &&
|
|
87
|
+
fk.columns.includes(colIdx));
|
|
88
|
+
}
|
|
89
|
+
getPkDistinct(table) {
|
|
90
|
+
if (table.primaryKeyDefinition.length !== 1)
|
|
91
|
+
return undefined;
|
|
92
|
+
const pkCol = table.columns[table.primaryKeyDefinition[0].index];
|
|
93
|
+
return this.getDistinct(table, pkCol.name);
|
|
94
|
+
}
|
|
95
|
+
distinctValues(table, columnName) {
|
|
96
|
+
const ndv = this.getDistinct(table, columnName);
|
|
97
|
+
if (ndv !== undefined)
|
|
98
|
+
return ndv;
|
|
99
|
+
return this.fallback.distinctValues?.(table, columnName);
|
|
100
|
+
}
|
|
101
|
+
indexSelectivity(table, indexName, predicate) {
|
|
102
|
+
// Delegate to base selectivity — real column stats already improve this
|
|
103
|
+
const sel = this.selectivity(table, predicate);
|
|
104
|
+
if (sel !== undefined)
|
|
105
|
+
return sel;
|
|
106
|
+
return this.fallback.indexSelectivity?.(table, indexName, predicate);
|
|
107
|
+
}
|
|
108
|
+
// ── Internal helpers ──────────────────────────────────────────────
|
|
109
|
+
getDistinct(table, columnName) {
|
|
110
|
+
const colStats = table.statistics?.columnStats.get(columnName.toLowerCase());
|
|
111
|
+
return colStats?.distinctCount;
|
|
112
|
+
}
|
|
113
|
+
estimatePredicateSelectivity(stats, predicate) {
|
|
114
|
+
if (stats.rowCount === 0)
|
|
115
|
+
return 0;
|
|
116
|
+
// Try to extract column reference from the predicate for column-level estimation
|
|
117
|
+
const colInfo = extractColumnFromPredicate(predicate);
|
|
118
|
+
if (!colInfo)
|
|
119
|
+
return undefined;
|
|
120
|
+
const colStats = stats.columnStats.get(colInfo.columnName.toLowerCase());
|
|
121
|
+
if (!colStats)
|
|
122
|
+
return undefined;
|
|
123
|
+
const { rowCount } = stats;
|
|
124
|
+
switch (predicate.nodeType) {
|
|
125
|
+
case 'BinaryOp': {
|
|
126
|
+
const op = predicate.op;
|
|
127
|
+
if (!op)
|
|
128
|
+
return undefined;
|
|
129
|
+
// Equality: 1/ndv
|
|
130
|
+
if (op === '=' || op === '==') {
|
|
131
|
+
return 1 / Math.max(colStats.distinctCount, 1);
|
|
132
|
+
}
|
|
133
|
+
// Not-equal: 1 - 1/ndv
|
|
134
|
+
if (op === '!=' || op === '<>') {
|
|
135
|
+
return 1 - (1 / Math.max(colStats.distinctCount, 1));
|
|
136
|
+
}
|
|
137
|
+
// Range operators: use histogram if available, else uniform assumption
|
|
138
|
+
if (op === '>' || op === '>=' || op === '<' || op === '<=') {
|
|
139
|
+
if (colStats.histogram) {
|
|
140
|
+
const value = extractConstantValue(predicate);
|
|
141
|
+
if (value !== undefined) {
|
|
142
|
+
return selectivityFromHistogram(colStats.histogram, op, value, rowCount);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Uniform assumption: 1/3 for open-ended range
|
|
146
|
+
return 1 / 3;
|
|
147
|
+
}
|
|
148
|
+
return undefined;
|
|
149
|
+
}
|
|
150
|
+
case 'IsNull':
|
|
151
|
+
return colStats.nullCount / Math.max(rowCount, 1);
|
|
152
|
+
case 'IsNotNull':
|
|
153
|
+
return 1 - (colStats.nullCount / Math.max(rowCount, 1));
|
|
154
|
+
case 'In': {
|
|
155
|
+
// IN list: listSize / ndv
|
|
156
|
+
const listSize = extractInListSize(predicate);
|
|
157
|
+
if (listSize !== undefined) {
|
|
158
|
+
return Math.min(1.0, listSize / Math.max(colStats.distinctCount, 1));
|
|
159
|
+
}
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
case 'Between': {
|
|
163
|
+
if (colStats.histogram) {
|
|
164
|
+
const bounds = extractBetweenBounds(predicate);
|
|
165
|
+
if (bounds) {
|
|
166
|
+
const lowSel = selectivityFromHistogram(colStats.histogram, '>=', bounds.low, rowCount);
|
|
167
|
+
const highSel = selectivityFromHistogram(colStats.histogram, '<=', bounds.high, rowCount);
|
|
168
|
+
if (lowSel !== undefined && highSel !== undefined) {
|
|
169
|
+
return Math.max(0, lowSel + highSel - 1);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return 1 / 4; // heuristic fallback
|
|
174
|
+
}
|
|
175
|
+
case 'Like':
|
|
176
|
+
return 1 / 3; // heuristic: pattern matching is moderately selective
|
|
177
|
+
default:
|
|
178
|
+
return undefined;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// ── Predicate introspection helpers ─────────────────────────────────────
|
|
183
|
+
// These extract structural info from plan nodes without importing concrete node types.
|
|
184
|
+
// They use duck typing consistent with the characteristics-based optimizer conventions.
|
|
185
|
+
function extractColumnFromPredicate(predicate) {
|
|
186
|
+
// BinaryOp, In, Between, IsNull, Like all typically have a column child
|
|
187
|
+
const children = predicate.getChildren();
|
|
188
|
+
for (const child of children) {
|
|
189
|
+
if (child.nodeType === 'ColumnReference') {
|
|
190
|
+
const colRef = child;
|
|
191
|
+
const name = colRef.columnName ?? colRef.name;
|
|
192
|
+
if (name)
|
|
193
|
+
return { columnName: name };
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return undefined;
|
|
197
|
+
}
|
|
198
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
199
|
+
function extractConstantValue(predicate) {
|
|
200
|
+
const children = predicate.getChildren();
|
|
201
|
+
for (const child of children) {
|
|
202
|
+
if (child.nodeType === 'Literal') {
|
|
203
|
+
return child.value;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return undefined;
|
|
207
|
+
}
|
|
208
|
+
function extractInListSize(predicate) {
|
|
209
|
+
const node = predicate;
|
|
210
|
+
if (Array.isArray(node.values))
|
|
211
|
+
return node.values.length;
|
|
212
|
+
// Some IN nodes store the list in children after the first (column) child
|
|
213
|
+
const children = predicate.getChildren();
|
|
214
|
+
if (children.length > 1)
|
|
215
|
+
return children.length - 1;
|
|
216
|
+
return undefined;
|
|
217
|
+
}
|
|
218
|
+
function extractBetweenBounds(predicate) {
|
|
219
|
+
const node = predicate;
|
|
220
|
+
if (node.low !== undefined && node.high !== undefined) {
|
|
221
|
+
const lowVal = node.low.nodeType === 'Literal' ? node.low.value : undefined;
|
|
222
|
+
const highVal = node.high.nodeType === 'Literal' ? node.high.value : undefined;
|
|
223
|
+
if (lowVal !== undefined && highVal !== undefined) {
|
|
224
|
+
return { low: lowVal, high: highVal };
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return undefined;
|
|
228
|
+
}
|
|
229
|
+
function extractEquiJoinColumns(condition) {
|
|
230
|
+
if (condition.nodeType !== 'BinaryOp')
|
|
231
|
+
return undefined;
|
|
232
|
+
const op = condition.op;
|
|
233
|
+
if (op !== '=' && op !== '==')
|
|
234
|
+
return undefined;
|
|
235
|
+
const children = condition.getChildren();
|
|
236
|
+
if (children.length !== 2)
|
|
237
|
+
return undefined;
|
|
238
|
+
const left = children[0];
|
|
239
|
+
const right = children[1];
|
|
240
|
+
if (left.nodeType !== 'ColumnReference' || right.nodeType !== 'ColumnReference')
|
|
241
|
+
return undefined;
|
|
242
|
+
const leftName = left.columnName ?? left.name;
|
|
243
|
+
const rightName = right.columnName ?? right.name;
|
|
244
|
+
if (!leftName || !rightName)
|
|
245
|
+
return undefined;
|
|
246
|
+
return { left: leftName, right: rightName };
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=catalog-stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-stats.js","sourceRoot":"","sources":["../../../../src/planner/stats/catalog-stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Equi-height histogram utilities for selectivity estimation
|
|
3
|
+
*/
|
|
4
|
+
import type { SqlValue } from '../../common/types.js';
|
|
5
|
+
import type { EquiHeightHistogram } from './catalog-stats.js';
|
|
6
|
+
/**
|
|
7
|
+
* Estimate selectivity for a range predicate using a histogram.
|
|
8
|
+
*
|
|
9
|
+
* @param histogram The column's equi-height histogram
|
|
10
|
+
* @param op Comparison operator: '>', '>=', '<', '<=', '='
|
|
11
|
+
* @param value The constant value being compared
|
|
12
|
+
* @param totalRows Total row count for the table
|
|
13
|
+
* @returns Selectivity in [0, 1], or undefined if estimation fails
|
|
14
|
+
*/
|
|
15
|
+
export declare function selectivityFromHistogram(histogram: EquiHeightHistogram, op: string, value: SqlValue, totalRows: number): number | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Build an equi-height histogram from sorted values.
|
|
18
|
+
*
|
|
19
|
+
* @param sortedValues Sorted array of non-null column values
|
|
20
|
+
* @param numBuckets Target number of buckets
|
|
21
|
+
* @returns Histogram, or undefined if too few values
|
|
22
|
+
*/
|
|
23
|
+
export declare function buildHistogram(sortedValues: SqlValue[], numBuckets: number): EquiHeightHistogram | undefined;
|
|
24
|
+
//# sourceMappingURL=histogram.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"histogram.d.ts","sourceRoot":"","sources":["../../../../src/planner/stats/histogram.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAmB,MAAM,oBAAoB,CAAC;AAE/E;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACvC,SAAS,EAAE,mBAAmB,EAC9B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,MAAM,GACf,MAAM,GAAG,SAAS,CAgDpB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC7B,YAAY,EAAE,QAAQ,EAAE,EACxB,UAAU,EAAE,MAAM,GAChB,mBAAmB,GAAG,SAAS,CA2BjC"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Equi-height histogram utilities for selectivity estimation
|
|
3
|
+
*/
|
|
4
|
+
import { compareSqlValues } from '../../util/comparison.js';
|
|
5
|
+
/**
|
|
6
|
+
* Estimate selectivity for a range predicate using a histogram.
|
|
7
|
+
*
|
|
8
|
+
* @param histogram The column's equi-height histogram
|
|
9
|
+
* @param op Comparison operator: '>', '>=', '<', '<=', '='
|
|
10
|
+
* @param value The constant value being compared
|
|
11
|
+
* @param totalRows Total row count for the table
|
|
12
|
+
* @returns Selectivity in [0, 1], or undefined if estimation fails
|
|
13
|
+
*/
|
|
14
|
+
export function selectivityFromHistogram(histogram, op, value, totalRows) {
|
|
15
|
+
const { buckets } = histogram;
|
|
16
|
+
if (buckets.length === 0 || totalRows === 0)
|
|
17
|
+
return undefined;
|
|
18
|
+
// Find the bucket containing `value` via binary search on upperBound
|
|
19
|
+
const idx = findBucket(buckets, value);
|
|
20
|
+
const total = buckets[buckets.length - 1].cumulativeCount;
|
|
21
|
+
if (total === 0)
|
|
22
|
+
return 0;
|
|
23
|
+
switch (op) {
|
|
24
|
+
case '=':
|
|
25
|
+
case '==': {
|
|
26
|
+
// Point query: estimate 1/distinctCount within the containing bucket
|
|
27
|
+
if (idx < 0 || idx >= buckets.length)
|
|
28
|
+
return 0;
|
|
29
|
+
const bucket = buckets[idx];
|
|
30
|
+
return Math.min(1, 1 / Math.max(bucket.distinctCount, 1));
|
|
31
|
+
}
|
|
32
|
+
case '<': {
|
|
33
|
+
if (idx < 0)
|
|
34
|
+
return 0;
|
|
35
|
+
if (idx >= buckets.length)
|
|
36
|
+
return 1;
|
|
37
|
+
return interpolateCumulative(buckets, idx, value) / total;
|
|
38
|
+
}
|
|
39
|
+
case '<=': {
|
|
40
|
+
if (idx < 0)
|
|
41
|
+
return 0;
|
|
42
|
+
if (idx >= buckets.length)
|
|
43
|
+
return 1;
|
|
44
|
+
// Include the value itself
|
|
45
|
+
const cum = interpolateCumulative(buckets, idx, value);
|
|
46
|
+
return Math.min(1, cum / total);
|
|
47
|
+
}
|
|
48
|
+
case '>': {
|
|
49
|
+
if (idx >= buckets.length)
|
|
50
|
+
return 0;
|
|
51
|
+
if (idx < 0)
|
|
52
|
+
return 1;
|
|
53
|
+
return 1 - (interpolateCumulative(buckets, idx, value) / total);
|
|
54
|
+
}
|
|
55
|
+
case '>=': {
|
|
56
|
+
if (idx >= buckets.length)
|
|
57
|
+
return 0;
|
|
58
|
+
if (idx < 0)
|
|
59
|
+
return 1;
|
|
60
|
+
return 1 - (interpolateCumulative(buckets, idx, value) / total) +
|
|
61
|
+
(1 / Math.max(buckets[idx]?.distinctCount ?? 1, 1) / total);
|
|
62
|
+
}
|
|
63
|
+
default:
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Build an equi-height histogram from sorted values.
|
|
69
|
+
*
|
|
70
|
+
* @param sortedValues Sorted array of non-null column values
|
|
71
|
+
* @param numBuckets Target number of buckets
|
|
72
|
+
* @returns Histogram, or undefined if too few values
|
|
73
|
+
*/
|
|
74
|
+
export function buildHistogram(sortedValues, numBuckets) {
|
|
75
|
+
if (sortedValues.length === 0)
|
|
76
|
+
return undefined;
|
|
77
|
+
const n = sortedValues.length;
|
|
78
|
+
const actualBuckets = Math.min(numBuckets, n);
|
|
79
|
+
const bucketSize = n / actualBuckets;
|
|
80
|
+
const buckets = [];
|
|
81
|
+
for (let i = 0; i < actualBuckets; i++) {
|
|
82
|
+
const start = Math.floor(i * bucketSize);
|
|
83
|
+
const end = Math.floor((i + 1) * bucketSize);
|
|
84
|
+
const upperIdx = Math.min(end - 1, n - 1);
|
|
85
|
+
// Count distinct values within this bucket
|
|
86
|
+
const distinct = new Set();
|
|
87
|
+
for (let j = start; j <= upperIdx; j++) {
|
|
88
|
+
distinct.add(String(sortedValues[j]));
|
|
89
|
+
}
|
|
90
|
+
buckets.push({
|
|
91
|
+
upperBound: sortedValues[upperIdx],
|
|
92
|
+
cumulativeCount: end,
|
|
93
|
+
distinctCount: distinct.size
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return { buckets, sampleSize: n };
|
|
97
|
+
}
|
|
98
|
+
// ── Internals ───────────────────────────────────────────────────────────
|
|
99
|
+
/**
|
|
100
|
+
* Binary search for the bucket whose upperBound >= value.
|
|
101
|
+
* Returns the bucket index, or -1 if value < all bounds, or buckets.length if value > all bounds.
|
|
102
|
+
*/
|
|
103
|
+
function findBucket(buckets, value) {
|
|
104
|
+
let lo = 0;
|
|
105
|
+
let hi = buckets.length - 1;
|
|
106
|
+
// Value below first bucket
|
|
107
|
+
if (compareSqlValues(value, buckets[0].upperBound) < 0) {
|
|
108
|
+
// Could still be in the first bucket range
|
|
109
|
+
return 0;
|
|
110
|
+
}
|
|
111
|
+
// Value above last bucket
|
|
112
|
+
if (compareSqlValues(value, buckets[hi].upperBound) > 0) {
|
|
113
|
+
return buckets.length;
|
|
114
|
+
}
|
|
115
|
+
while (lo < hi) {
|
|
116
|
+
const mid = (lo + hi) >>> 1;
|
|
117
|
+
if (compareSqlValues(buckets[mid].upperBound, value) < 0) {
|
|
118
|
+
lo = mid + 1;
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
hi = mid;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return lo;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Linear interpolation of cumulative count at a value within a bucket.
|
|
128
|
+
* Assumes uniform distribution within each bucket.
|
|
129
|
+
*/
|
|
130
|
+
function interpolateCumulative(buckets, idx, _value) {
|
|
131
|
+
if (idx < 0)
|
|
132
|
+
return 0;
|
|
133
|
+
if (idx >= buckets.length)
|
|
134
|
+
return buckets[buckets.length - 1].cumulativeCount;
|
|
135
|
+
const bucket = buckets[idx];
|
|
136
|
+
const prevCum = idx > 0 ? buckets[idx - 1].cumulativeCount : 0;
|
|
137
|
+
const bucketRows = bucket.cumulativeCount - prevCum;
|
|
138
|
+
// Without numeric distance computation (values may be non-numeric),
|
|
139
|
+
// assume the value is at the midpoint of the bucket
|
|
140
|
+
return prevCum + bucketRows / 2;
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=histogram.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"histogram.js","sourceRoot":"","sources":["../../../../src/planner/stats/histogram.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type-utils.d.ts","sourceRoot":"","sources":["../../../src/planner/type-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAU,MAAM,uBAAuB,CAAC;AACzF,OAAO,
|
|
1
|
+
{"version":3,"file":"type-utils.d.ts","sourceRoot":"","sources":["../../../src/planner/type-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAU,MAAM,uBAAuB,CAAC;AACzF,OAAO,EAAc,KAAK,YAAY,EAAE,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAIhD;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,WAAW,GAAG,YAAY,CAyClF;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,QAAQ,GAAG,UAAU,CASlE;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAIpI;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAE5G;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,SAAS,CAYlF"}
|