@quereus/quereus 0.7.3 → 0.7.4
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/package.json +3 -3
- package/dist/src/common/constants.js.map +0 -1
- package/dist/src/common/datatype.js.map +0 -1
- package/dist/src/common/errors.js.map +0 -1
- package/dist/src/common/json-types.js.map +0 -1
- package/dist/src/common/logger.js.map +0 -1
- package/dist/src/common/type-inference.js.map +0 -1
- package/dist/src/common/types.js.map +0 -1
- package/dist/src/core/database-options.js.map +0 -1
- package/dist/src/core/database.js.map +0 -1
- package/dist/src/core/param.js.map +0 -1
- package/dist/src/core/statement.js.map +0 -1
- package/dist/src/func/builtins/aggregate.js.map +0 -1
- package/dist/src/func/builtins/builtin-window-functions.js.map +0 -1
- package/dist/src/func/builtins/conversion.js.map +0 -1
- package/dist/src/func/builtins/datetime.js.map +0 -1
- package/dist/src/func/builtins/explain.js.map +0 -1
- package/dist/src/func/builtins/generation.js.map +0 -1
- package/dist/src/func/builtins/index.js.map +0 -1
- package/dist/src/func/builtins/json-helpers.js.map +0 -1
- package/dist/src/func/builtins/json-tvf.js.map +0 -1
- package/dist/src/func/builtins/json.js.map +0 -1
- package/dist/src/func/builtins/scalar.js.map +0 -1
- package/dist/src/func/builtins/schema.js.map +0 -1
- package/dist/src/func/builtins/string.js.map +0 -1
- package/dist/src/func/builtins/timespan.js.map +0 -1
- package/dist/src/func/context.js.map +0 -1
- package/dist/src/func/registration.js.map +0 -1
- package/dist/src/index.js.map +0 -1
- package/dist/src/parser/ast.js.map +0 -1
- package/dist/src/parser/index.js.map +0 -1
- package/dist/src/parser/lexer.js.map +0 -1
- package/dist/src/parser/parser.js.map +0 -1
- package/dist/src/parser/utils.js.map +0 -1
- package/dist/src/parser/visitor.js.map +0 -1
- package/dist/src/planner/analysis/binding-collector.js.map +0 -1
- package/dist/src/planner/analysis/const-evaluator.js.map +0 -1
- package/dist/src/planner/analysis/const-pass.js.map +0 -1
- package/dist/src/planner/analysis/constraint-extractor.js.map +0 -1
- package/dist/src/planner/analysis/predicate-normalizer.js.map +0 -1
- package/dist/src/planner/building/alter-table.js.map +0 -1
- package/dist/src/planner/building/block.js.map +0 -1
- package/dist/src/planner/building/constraint-builder.js.map +0 -1
- package/dist/src/planner/building/create-assertion.js.map +0 -1
- package/dist/src/planner/building/create-view.js.map +0 -1
- package/dist/src/planner/building/ddl.js.map +0 -1
- package/dist/src/planner/building/declare-schema.js.map +0 -1
- package/dist/src/planner/building/delete.js.map +0 -1
- package/dist/src/planner/building/drop-assertion.js.map +0 -1
- package/dist/src/planner/building/drop-table.js.map +0 -1
- package/dist/src/planner/building/drop-view.js.map +0 -1
- package/dist/src/planner/building/expression.js.map +0 -1
- package/dist/src/planner/building/function-call.js.map +0 -1
- package/dist/src/planner/building/insert.js.map +0 -1
- package/dist/src/planner/building/pragma.js.map +0 -1
- package/dist/src/planner/building/schema-resolution.js.map +0 -1
- package/dist/src/planner/building/select-aggregates.js.map +0 -1
- package/dist/src/planner/building/select-compound.js.map +0 -1
- package/dist/src/planner/building/select-context.js.map +0 -1
- package/dist/src/planner/building/select-modifiers.js.map +0 -1
- package/dist/src/planner/building/select-projections.js.map +0 -1
- package/dist/src/planner/building/select-window.js.map +0 -1
- package/dist/src/planner/building/select.js.map +0 -1
- package/dist/src/planner/building/table-function.js.map +0 -1
- package/dist/src/planner/building/table.js.map +0 -1
- package/dist/src/planner/building/transaction.js.map +0 -1
- package/dist/src/planner/building/update.js.map +0 -1
- package/dist/src/planner/building/with.js.map +0 -1
- package/dist/src/planner/cache/correlation-detector.js.map +0 -1
- package/dist/src/planner/cache/materialization-advisory.js.map +0 -1
- package/dist/src/planner/cache/reference-graph.js.map +0 -1
- package/dist/src/planner/cost/index.js.map +0 -1
- package/dist/src/planner/debug/logger-utils.js.map +0 -1
- package/dist/src/planner/debug.js.map +0 -1
- package/dist/src/planner/framework/characteristics.js.map +0 -1
- package/dist/src/planner/framework/context.js.map +0 -1
- package/dist/src/planner/framework/pass.js.map +0 -1
- package/dist/src/planner/framework/physical-utils.js.map +0 -1
- package/dist/src/planner/framework/registry.js.map +0 -1
- package/dist/src/planner/framework/trace.js.map +0 -1
- package/dist/src/planner/nodes/add-constraint-node.js.map +0 -1
- package/dist/src/planner/nodes/aggregate-function.js.map +0 -1
- package/dist/src/planner/nodes/aggregate-node.js.map +0 -1
- package/dist/src/planner/nodes/array-index-node.js.map +0 -1
- package/dist/src/planner/nodes/block.js.map +0 -1
- package/dist/src/planner/nodes/cache-node.js.map +0 -1
- package/dist/src/planner/nodes/constraint-check-node.js.map +0 -1
- package/dist/src/planner/nodes/create-assertion-node.js.map +0 -1
- package/dist/src/planner/nodes/create-index-node.js.map +0 -1
- package/dist/src/planner/nodes/create-table-node.js.map +0 -1
- package/dist/src/planner/nodes/create-view-node.js.map +0 -1
- package/dist/src/planner/nodes/cte-node.js.map +0 -1
- package/dist/src/planner/nodes/cte-reference-node.js.map +0 -1
- package/dist/src/planner/nodes/declarative-schema.js.map +0 -1
- package/dist/src/planner/nodes/delete-node.js.map +0 -1
- package/dist/src/planner/nodes/distinct-node.js.map +0 -1
- package/dist/src/planner/nodes/dml-executor-node.js.map +0 -1
- package/dist/src/planner/nodes/drop-assertion-node.js.map +0 -1
- package/dist/src/planner/nodes/drop-table-node.js.map +0 -1
- package/dist/src/planner/nodes/drop-view-node.js.map +0 -1
- package/dist/src/planner/nodes/filter.js.map +0 -1
- package/dist/src/planner/nodes/function.js.map +0 -1
- package/dist/src/planner/nodes/insert-node.js.map +0 -1
- package/dist/src/planner/nodes/internal-recursive-cte-ref-node.js.map +0 -1
- package/dist/src/planner/nodes/join-node.js.map +0 -1
- package/dist/src/planner/nodes/limit-offset.js.map +0 -1
- package/dist/src/planner/nodes/plan-node-type.js.map +0 -1
- package/dist/src/planner/nodes/plan-node.js.map +0 -1
- package/dist/src/planner/nodes/pragma.js.map +0 -1
- package/dist/src/planner/nodes/project-node.js.map +0 -1
- package/dist/src/planner/nodes/recursive-cte-node.js.map +0 -1
- package/dist/src/planner/nodes/reference.js.map +0 -1
- package/dist/src/planner/nodes/remote-query-node.js.map +0 -1
- package/dist/src/planner/nodes/retrieve-node.js.map +0 -1
- package/dist/src/planner/nodes/returning-node.js.map +0 -1
- package/dist/src/planner/nodes/scalar.js.map +0 -1
- package/dist/src/planner/nodes/sequencing-node.js.map +0 -1
- package/dist/src/planner/nodes/set-operation-node.js.map +0 -1
- package/dist/src/planner/nodes/single-row.js.map +0 -1
- package/dist/src/planner/nodes/sink-node.js.map +0 -1
- package/dist/src/planner/nodes/sort.js.map +0 -1
- package/dist/src/planner/nodes/stream-aggregate.js.map +0 -1
- package/dist/src/planner/nodes/subquery.js.map +0 -1
- package/dist/src/planner/nodes/table-access-nodes.js.map +0 -1
- package/dist/src/planner/nodes/table-function-call.js.map +0 -1
- package/dist/src/planner/nodes/transaction-node.js.map +0 -1
- package/dist/src/planner/nodes/update-node.js.map +0 -1
- package/dist/src/planner/nodes/values-node.js.map +0 -1
- package/dist/src/planner/nodes/view-reference-node.js.map +0 -1
- package/dist/src/planner/nodes/window-function.js.map +0 -1
- package/dist/src/planner/nodes/window-node.js.map +0 -1
- package/dist/src/planner/optimizer-tuning.js.map +0 -1
- package/dist/src/planner/optimizer.js.map +0 -1
- package/dist/src/planner/planning-context.js.map +0 -1
- package/dist/src/planner/resolve.js.map +0 -1
- package/dist/src/planner/rules/access/rule-select-access-path.js.map +0 -1
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js.map +0 -1
- package/dist/src/planner/rules/cache/rule-cte-optimization.js.map +0 -1
- package/dist/src/planner/rules/cache/rule-materialization-advisory.js.map +0 -1
- package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.js.map +0 -1
- package/dist/src/planner/rules/join/rule-join-greedy-commute.js.map +0 -1
- package/dist/src/planner/rules/join/rule-join-key-inference.js.map +0 -1
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.js.map +0 -1
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js.map +0 -1
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +0 -1
- package/dist/src/planner/scopes/aliased.js.map +0 -1
- package/dist/src/planner/scopes/base.js.map +0 -1
- package/dist/src/planner/scopes/empty.js.map +0 -1
- package/dist/src/planner/scopes/global.js.map +0 -1
- package/dist/src/planner/scopes/multi.js.map +0 -1
- package/dist/src/planner/scopes/param.js.map +0 -1
- package/dist/src/planner/scopes/registered.js.map +0 -1
- package/dist/src/planner/scopes/scope.js.map +0 -1
- package/dist/src/planner/stats/basic-estimates.js.map +0 -1
- package/dist/src/planner/stats/index.js.map +0 -1
- package/dist/src/planner/type-utils.js.map +0 -1
- package/dist/src/planner/util/key-utils.js.map +0 -1
- package/dist/src/planner/validation/determinism-validator.js.map +0 -1
- package/dist/src/planner/validation/plan-validator.js.map +0 -1
- package/dist/src/runtime/async-util.js.map +0 -1
- package/dist/src/runtime/cache/shared-cache.js.map +0 -1
- package/dist/src/runtime/context-helpers.js.map +0 -1
- package/dist/src/runtime/deferred-constraint-queue.js.map +0 -1
- package/dist/src/runtime/emission-context.js.map +0 -1
- package/dist/src/runtime/emit/add-constraint.js.map +0 -1
- package/dist/src/runtime/emit/aggregate.js.map +0 -1
- package/dist/src/runtime/emit/array-index.js.map +0 -1
- package/dist/src/runtime/emit/between.js.map +0 -1
- package/dist/src/runtime/emit/binary.js.map +0 -1
- package/dist/src/runtime/emit/block.js.map +0 -1
- package/dist/src/runtime/emit/cache.js.map +0 -1
- package/dist/src/runtime/emit/case.js.map +0 -1
- package/dist/src/runtime/emit/cast.js.map +0 -1
- package/dist/src/runtime/emit/collate.js.map +0 -1
- package/dist/src/runtime/emit/column-reference.js.map +0 -1
- package/dist/src/runtime/emit/constraint-check.js.map +0 -1
- package/dist/src/runtime/emit/create-assertion.js.map +0 -1
- package/dist/src/runtime/emit/create-index.js.map +0 -1
- package/dist/src/runtime/emit/create-table.js.map +0 -1
- package/dist/src/runtime/emit/create-view.js.map +0 -1
- package/dist/src/runtime/emit/cte-reference.js.map +0 -1
- package/dist/src/runtime/emit/cte.js.map +0 -1
- package/dist/src/runtime/emit/delete.js.map +0 -1
- package/dist/src/runtime/emit/distinct.js.map +0 -1
- package/dist/src/runtime/emit/dml-executor.js.map +0 -1
- package/dist/src/runtime/emit/drop-assertion.js.map +0 -1
- package/dist/src/runtime/emit/drop-table.js.map +0 -1
- package/dist/src/runtime/emit/drop-view.js.map +0 -1
- package/dist/src/runtime/emit/filter.js.map +0 -1
- package/dist/src/runtime/emit/insert.js.map +0 -1
- package/dist/src/runtime/emit/internal-recursive-cte-ref.js.map +0 -1
- package/dist/src/runtime/emit/join.js.map +0 -1
- package/dist/src/runtime/emit/limit-offset.js.map +0 -1
- package/dist/src/runtime/emit/literal.js.map +0 -1
- package/dist/src/runtime/emit/parameter.js.map +0 -1
- package/dist/src/runtime/emit/pragma.js.map +0 -1
- package/dist/src/runtime/emit/project.js.map +0 -1
- package/dist/src/runtime/emit/recursive-cte.js.map +0 -1
- package/dist/src/runtime/emit/remote-query.js.map +0 -1
- package/dist/src/runtime/emit/retrieve.js.map +0 -1
- package/dist/src/runtime/emit/returning.js.map +0 -1
- package/dist/src/runtime/emit/scalar-function.js.map +0 -1
- package/dist/src/runtime/emit/scan.js.map +0 -1
- package/dist/src/runtime/emit/schema-declarative.js.map +0 -1
- package/dist/src/runtime/emit/sequencing.js.map +0 -1
- package/dist/src/runtime/emit/set-operation.js.map +0 -1
- package/dist/src/runtime/emit/sink.js.map +0 -1
- package/dist/src/runtime/emit/sort.js.map +0 -1
- package/dist/src/runtime/emit/subquery.js.map +0 -1
- package/dist/src/runtime/emit/table-valued-function.js.map +0 -1
- package/dist/src/runtime/emit/temporal-arithmetic.js.map +0 -1
- package/dist/src/runtime/emit/transaction.js.map +0 -1
- package/dist/src/runtime/emit/unary.js.map +0 -1
- package/dist/src/runtime/emit/update.js.map +0 -1
- package/dist/src/runtime/emit/values.js.map +0 -1
- package/dist/src/runtime/emit/window-function.js.map +0 -1
- package/dist/src/runtime/emit/window.js.map +0 -1
- package/dist/src/runtime/emitters.js.map +0 -1
- package/dist/src/runtime/register.js.map +0 -1
- package/dist/src/runtime/scheduler.js.map +0 -1
- package/dist/src/runtime/types.js.map +0 -1
- package/dist/src/runtime/utils.js.map +0 -1
- package/dist/src/schema/assertion.js.map +0 -1
- package/dist/src/schema/catalog.js.map +0 -1
- package/dist/src/schema/change-events.js.map +0 -1
- package/dist/src/schema/column.js.map +0 -1
- package/dist/src/schema/declared-schema-manager.js.map +0 -1
- package/dist/src/schema/function.js.map +0 -1
- package/dist/src/schema/manager.js.map +0 -1
- package/dist/src/schema/schema-differ.js.map +0 -1
- package/dist/src/schema/schema-hasher.js.map +0 -1
- package/dist/src/schema/schema.js.map +0 -1
- package/dist/src/schema/table.js.map +0 -1
- package/dist/src/schema/view.js.map +0 -1
- package/dist/src/schema/window-function.js.map +0 -1
- package/dist/src/types/builtin-types.js.map +0 -1
- package/dist/src/types/index.js.map +0 -1
- package/dist/src/types/json-type.js.map +0 -1
- package/dist/src/types/logical-type.js.map +0 -1
- package/dist/src/types/plugin-interface.js.map +0 -1
- package/dist/src/types/registry.js.map +0 -1
- package/dist/src/types/temporal-types.js.map +0 -1
- package/dist/src/types/validation.js.map +0 -1
- package/dist/src/util/affinity.js.map +0 -1
- package/dist/src/util/ast-stringify.js.map +0 -1
- package/dist/src/util/cached.js.map +0 -1
- package/dist/src/util/coercion.js.map +0 -1
- package/dist/src/util/comparison.js.map +0 -1
- package/dist/src/util/environment.js.map +0 -1
- package/dist/src/util/hash.js.map +0 -1
- package/dist/src/util/latches.js.map +0 -1
- package/dist/src/util/mutation-statement.js.map +0 -1
- package/dist/src/util/patterns.js.map +0 -1
- package/dist/src/util/plan-formatter.js.map +0 -1
- package/dist/src/util/plugin-helper.js.map +0 -1
- package/dist/src/util/row-descriptor.js.map +0 -1
- package/dist/src/util/serialization.js.map +0 -1
- package/dist/src/util/sql-literal.js.map +0 -1
- package/dist/src/util/working-table-iterable.js.map +0 -1
- package/dist/src/vtab/best-access-plan.js.map +0 -1
- package/dist/src/vtab/connection.js.map +0 -1
- package/dist/src/vtab/filter-info.js.map +0 -1
- package/dist/src/vtab/index-info.js.map +0 -1
- package/dist/src/vtab/manifest.js.map +0 -1
- package/dist/src/vtab/memory/connection.js.map +0 -1
- package/dist/src/vtab/memory/index.js.map +0 -1
- package/dist/src/vtab/memory/layer/base-cursor.js.map +0 -1
- package/dist/src/vtab/memory/layer/base.js.map +0 -1
- package/dist/src/vtab/memory/layer/connection.js.map +0 -1
- package/dist/src/vtab/memory/layer/interface.js.map +0 -1
- package/dist/src/vtab/memory/layer/manager.js.map +0 -1
- package/dist/src/vtab/memory/layer/safe-iterate.js.map +0 -1
- package/dist/src/vtab/memory/layer/scan-plan.js.map +0 -1
- package/dist/src/vtab/memory/layer/transaction-cursor.js.map +0 -1
- package/dist/src/vtab/memory/layer/transaction.js.map +0 -1
- package/dist/src/vtab/memory/module.js.map +0 -1
- package/dist/src/vtab/memory/table.js.map +0 -1
- package/dist/src/vtab/memory/types.js.map +0 -1
- package/dist/src/vtab/memory/utils/logging.js.map +0 -1
- package/dist/src/vtab/memory/utils/primary-key.js.map +0 -1
- package/dist/src/vtab/module.js.map +0 -1
- package/dist/src/vtab/table.js.map +0 -1
- package/src/common/constants.ts +0 -60
- package/src/common/datatype.ts +0 -85
- package/src/common/errors.ts +0 -189
- package/src/common/json-types.ts +0 -16
- package/src/common/logger.ts +0 -97
- package/src/common/type-inference.ts +0 -39
- package/src/common/types.ts +0 -151
- package/src/core/database-options.ts +0 -258
- package/src/core/database.ts +0 -1461
- package/src/core/param.ts +0 -56
- package/src/core/statement.ts +0 -528
- package/src/func/builtins/aggregate.ts +0 -269
- package/src/func/builtins/builtin-window-functions.ts +0 -166
- package/src/func/builtins/conversion.ts +0 -226
- package/src/func/builtins/datetime.ts +0 -500
- package/src/func/builtins/explain.ts +0 -779
- package/src/func/builtins/generation.ts +0 -43
- package/src/func/builtins/index.ts +0 -167
- package/src/func/builtins/json-helpers.ts +0 -237
- package/src/func/builtins/json-tvf.ts +0 -224
- package/src/func/builtins/json.ts +0 -588
- package/src/func/builtins/scalar.ts +0 -423
- package/src/func/builtins/schema.ts +0 -213
- package/src/func/builtins/string.ts +0 -306
- package/src/func/builtins/timespan.ts +0 -179
- package/src/func/context.ts +0 -258
- package/src/func/registration.ts +0 -201
- package/src/index.ts +0 -172
- package/src/parser/ast.ts +0 -581
- package/src/parser/index.ts +0 -65
- package/src/parser/lexer.ts +0 -806
- package/src/parser/parser.ts +0 -3352
- package/src/parser/utils.ts +0 -10
- package/src/parser/visitor.ts +0 -188
- package/src/planner/analysis/README.md +0 -93
- package/src/planner/analysis/binding-collector.ts +0 -83
- package/src/planner/analysis/const-evaluator.ts +0 -63
- package/src/planner/analysis/const-pass.ts +0 -282
- package/src/planner/analysis/constraint-extractor.ts +0 -764
- package/src/planner/analysis/predicate-normalizer.ts +0 -237
- package/src/planner/building/alter-table.ts +0 -49
- package/src/planner/building/block.ts +0 -93
- package/src/planner/building/constraint-builder.ts +0 -178
- package/src/planner/building/create-assertion.ts +0 -7
- package/src/planner/building/create-view.ts +0 -29
- package/src/planner/building/ddl.ts +0 -24
- package/src/planner/building/declare-schema.ts +0 -22
- package/src/planner/building/delete.ts +0 -218
- package/src/planner/building/drop-assertion.ts +0 -11
- package/src/planner/building/drop-table.ts +0 -13
- package/src/planner/building/drop-view.ts +0 -19
- package/src/planner/building/expression.ts +0 -205
- package/src/planner/building/function-call.ts +0 -129
- package/src/planner/building/insert.ts +0 -435
- package/src/planner/building/pragma.ts +0 -34
- package/src/planner/building/schema-resolution.ts +0 -176
- package/src/planner/building/select-aggregates.ts +0 -318
- package/src/planner/building/select-compound.ts +0 -119
- package/src/planner/building/select-context.ts +0 -85
- package/src/planner/building/select-modifiers.ts +0 -236
- package/src/planner/building/select-projections.ts +0 -177
- package/src/planner/building/select-window.ts +0 -259
- package/src/planner/building/select.ts +0 -567
- package/src/planner/building/table-function.ts +0 -49
- package/src/planner/building/table.ts +0 -40
- package/src/planner/building/transaction.ts +0 -23
- package/src/planner/building/update.ts +0 -331
- package/src/planner/building/with.ts +0 -180
- package/src/planner/cache/correlation-detector.ts +0 -83
- package/src/planner/cache/materialization-advisory.ts +0 -265
- package/src/planner/cache/reference-graph.ts +0 -196
- package/src/planner/cost/index.ts +0 -169
- package/src/planner/debug/logger-utils.ts +0 -68
- package/src/planner/debug.ts +0 -480
- package/src/planner/framework/README.md +0 -132
- package/src/planner/framework/characteristics.ts +0 -503
- package/src/planner/framework/context.ts +0 -239
- package/src/planner/framework/pass.ts +0 -354
- package/src/planner/framework/physical-utils.ts +0 -210
- package/src/planner/framework/registry.ts +0 -261
- package/src/planner/framework/trace.ts +0 -259
- package/src/planner/nodes/add-constraint-node.ts +0 -62
- package/src/planner/nodes/aggregate-function.ts +0 -155
- package/src/planner/nodes/aggregate-node.ts +0 -267
- package/src/planner/nodes/array-index-node.ts +0 -50
- package/src/planner/nodes/block.ts +0 -80
- package/src/planner/nodes/cache-node.ts +0 -103
- package/src/planner/nodes/constraint-check-node.ts +0 -138
- package/src/planner/nodes/create-assertion-node.ts +0 -51
- package/src/planner/nodes/create-index-node.ts +0 -41
- package/src/planner/nodes/create-table-node.ts +0 -35
- package/src/planner/nodes/create-view-node.ts +0 -44
- package/src/planner/nodes/cte-node.ts +0 -168
- package/src/planner/nodes/cte-reference-node.ts +0 -125
- package/src/planner/nodes/declarative-schema.ts +0 -221
- package/src/planner/nodes/delete-node.ts +0 -102
- package/src/planner/nodes/distinct-node.ts +0 -107
- package/src/planner/nodes/dml-executor-node.ts +0 -104
- package/src/planner/nodes/drop-assertion-node.ts +0 -50
- package/src/planner/nodes/drop-table-node.ts +0 -36
- package/src/planner/nodes/drop-view-node.ts +0 -37
- package/src/planner/nodes/filter.ts +0 -144
- package/src/planner/nodes/function.ts +0 -98
- package/src/planner/nodes/insert-node.ts +0 -126
- package/src/planner/nodes/internal-recursive-cte-ref-node.ts +0 -61
- package/src/planner/nodes/join-node.ts +0 -336
- package/src/planner/nodes/limit-offset.ts +0 -144
- package/src/planner/nodes/plan-node-type.ts +0 -95
- package/src/planner/nodes/plan-node.ts +0 -503
- package/src/planner/nodes/pragma.ts +0 -98
- package/src/planner/nodes/project-node.ts +0 -337
- package/src/planner/nodes/recursive-cte-node.ts +0 -158
- package/src/planner/nodes/reference.ts +0 -334
- package/src/planner/nodes/remote-query-node.ts +0 -73
- package/src/planner/nodes/retrieve-node.ts +0 -86
- package/src/planner/nodes/returning-node.ts +0 -269
- package/src/planner/nodes/scalar.ts +0 -772
- package/src/planner/nodes/sequencing-node.ts +0 -113
- package/src/planner/nodes/set-operation-node.ts +0 -87
- package/src/planner/nodes/single-row.ts +0 -85
- package/src/planner/nodes/sink-node.ts +0 -61
- package/src/planner/nodes/sort.ts +0 -166
- package/src/planner/nodes/stream-aggregate.ts +0 -293
- package/src/planner/nodes/subquery.ts +0 -268
- package/src/planner/nodes/table-access-nodes.ts +0 -323
- package/src/planner/nodes/table-function-call.ts +0 -134
- package/src/planner/nodes/transaction-node.ts +0 -55
- package/src/planner/nodes/update-node.ts +0 -138
- package/src/planner/nodes/values-node.ts +0 -244
- package/src/planner/nodes/view-reference-node.ts +0 -97
- package/src/planner/nodes/window-function.ts +0 -73
- package/src/planner/nodes/window-node.ts +0 -199
- package/src/planner/optimizer-tuning.ts +0 -105
- package/src/planner/optimizer.ts +0 -332
- package/src/planner/planning-context.ts +0 -190
- package/src/planner/resolve.ts +0 -101
- package/src/planner/rules/README.md +0 -96
- package/src/planner/rules/access/rule-select-access-path.ts +0 -399
- package/src/planner/rules/aggregate/rule-aggregate-streaming.ts +0 -162
- package/src/planner/rules/cache/rule-cte-optimization.ts +0 -79
- package/src/planner/rules/cache/rule-materialization-advisory.ts +0 -77
- package/src/planner/rules/cache/rule-mutating-subquery-cache.ts +0 -104
- package/src/planner/rules/join/rule-join-greedy-commute.ts +0 -48
- package/src/planner/rules/join/rule-join-key-inference.ts +0 -35
- package/src/planner/rules/join/rule-quickpick-enumeration.ts +0 -267
- package/src/planner/rules/predicate/rule-predicate-pushdown.ts +0 -144
- package/src/planner/rules/retrieve/rule-grow-retrieve.ts +0 -337
- package/src/planner/scopes/aliased.ts +0 -50
- package/src/planner/scopes/base.ts +0 -10
- package/src/planner/scopes/empty.ts +0 -12
- package/src/planner/scopes/global.ts +0 -73
- package/src/planner/scopes/multi.ts +0 -40
- package/src/planner/scopes/param.ts +0 -95
- package/src/planner/scopes/registered.ts +0 -67
- package/src/planner/scopes/scope.ts +0 -16
- package/src/planner/stats/basic-estimates.ts +0 -107
- package/src/planner/stats/index.ts +0 -158
- package/src/planner/type-utils.ts +0 -87
- package/src/planner/util/key-utils.ts +0 -46
- package/src/planner/validation/determinism-validator.ts +0 -104
- package/src/planner/validation/plan-validator.ts +0 -335
- package/src/runtime/async-util.ts +0 -283
- package/src/runtime/cache/shared-cache.ts +0 -169
- package/src/runtime/context-helpers.ts +0 -191
- package/src/runtime/deferred-constraint-queue.ts +0 -196
- package/src/runtime/emission-context.ts +0 -319
- package/src/runtime/emit/add-constraint.ts +0 -78
- package/src/runtime/emit/aggregate.ts +0 -581
- package/src/runtime/emit/array-index.ts +0 -25
- package/src/runtime/emit/between.ts +0 -51
- package/src/runtime/emit/binary.ts +0 -357
- package/src/runtime/emit/block.ts +0 -23
- package/src/runtime/emit/cache.ts +0 -64
- package/src/runtime/emit/case.ts +0 -87
- package/src/runtime/emit/cast.ts +0 -151
- package/src/runtime/emit/collate.ts +0 -9
- package/src/runtime/emit/column-reference.ts +0 -17
- package/src/runtime/emit/constraint-check.ts +0 -290
- package/src/runtime/emit/create-assertion.ts +0 -82
- package/src/runtime/emit/create-index.ts +0 -15
- package/src/runtime/emit/create-table.ts +0 -15
- package/src/runtime/emit/create-view.ts +0 -52
- package/src/runtime/emit/cte-reference.ts +0 -38
- package/src/runtime/emit/cte.ts +0 -39
- package/src/runtime/emit/delete.ts +0 -24
- package/src/runtime/emit/distinct.ts +0 -40
- package/src/runtime/emit/dml-executor.ts +0 -198
- package/src/runtime/emit/drop-assertion.ts +0 -45
- package/src/runtime/emit/drop-table.ts +0 -27
- package/src/runtime/emit/drop-view.ts +0 -49
- package/src/runtime/emit/filter.ts +0 -30
- package/src/runtime/emit/insert.ts +0 -42
- package/src/runtime/emit/internal-recursive-cte-ref.ts +0 -37
- package/src/runtime/emit/join.ts +0 -148
- package/src/runtime/emit/limit-offset.ts +0 -73
- package/src/runtime/emit/literal.ts +0 -17
- package/src/runtime/emit/parameter.ts +0 -59
- package/src/runtime/emit/pragma.ts +0 -56
- package/src/runtime/emit/project.ts +0 -46
- package/src/runtime/emit/recursive-cte.ts +0 -111
- package/src/runtime/emit/remote-query.ts +0 -47
- package/src/runtime/emit/retrieve.ts +0 -15
- package/src/runtime/emit/returning.ts +0 -41
- package/src/runtime/emit/scalar-function.ts +0 -69
- package/src/runtime/emit/scan.ts +0 -106
- package/src/runtime/emit/schema-declarative.ts +0 -215
- package/src/runtime/emit/sequencing.ts +0 -24
- package/src/runtime/emit/set-operation.ts +0 -141
- package/src/runtime/emit/sink.ts +0 -27
- package/src/runtime/emit/sort.ts +0 -75
- package/src/runtime/emit/subquery.ts +0 -203
- package/src/runtime/emit/table-valued-function.ts +0 -106
- package/src/runtime/emit/temporal-arithmetic.ts +0 -302
- package/src/runtime/emit/transaction.ts +0 -205
- package/src/runtime/emit/unary.ts +0 -101
- package/src/runtime/emit/update.ts +0 -66
- package/src/runtime/emit/values.ts +0 -66
- package/src/runtime/emit/window-function.ts +0 -42
- package/src/runtime/emit/window.ts +0 -458
- package/src/runtime/emitters.ts +0 -183
- package/src/runtime/register.ts +0 -150
- package/src/runtime/scheduler.ts +0 -488
- package/src/runtime/types.ts +0 -242
- package/src/runtime/utils.ts +0 -177
- package/src/schema/assertion.ts +0 -21
- package/src/schema/catalog.ts +0 -269
- package/src/schema/change-events.ts +0 -80
- package/src/schema/column.ts +0 -51
- package/src/schema/declared-schema-manager.ts +0 -82
- package/src/schema/function.ts +0 -188
- package/src/schema/manager.ts +0 -1034
- package/src/schema/schema-differ.ts +0 -214
- package/src/schema/schema-hasher.ts +0 -26
- package/src/schema/schema.ts +0 -222
- package/src/schema/table.ts +0 -409
- package/src/schema/view.ts +0 -19
- package/src/schema/window-function.ts +0 -56
- package/src/types/builtin-types.ts +0 -350
- package/src/types/index.ts +0 -17
- package/src/types/json-type.ts +0 -152
- package/src/types/logical-type.ts +0 -91
- package/src/types/plugin-interface.ts +0 -10
- package/src/types/registry.ts +0 -204
- package/src/types/temporal-types.ts +0 -290
- package/src/types/validation.ts +0 -120
- package/src/util/affinity.ts +0 -151
- package/src/util/ast-stringify.ts +0 -887
- package/src/util/cached.ts +0 -25
- package/src/util/coercion.ts +0 -113
- package/src/util/comparison.ts +0 -510
- package/src/util/environment.ts +0 -52
- package/src/util/hash.ts +0 -90
- package/src/util/latches.ts +0 -47
- package/src/util/mutation-statement.ts +0 -135
- package/src/util/patterns.ts +0 -56
- package/src/util/plan-formatter.ts +0 -48
- package/src/util/plugin-helper.ts +0 -110
- package/src/util/row-descriptor.ts +0 -105
- package/src/util/serialization.ts +0 -47
- package/src/util/sql-literal.ts +0 -22
- package/src/util/working-table-iterable.ts +0 -38
- package/src/vtab/best-access-plan.ts +0 -244
- package/src/vtab/connection.ts +0 -36
- package/src/vtab/filter-info.ts +0 -23
- package/src/vtab/index-info.ts +0 -84
- package/src/vtab/manifest.ts +0 -86
- package/src/vtab/memory/connection.ts +0 -73
- package/src/vtab/memory/index.ts +0 -191
- package/src/vtab/memory/layer/base-cursor.ts +0 -124
- package/src/vtab/memory/layer/base.ts +0 -275
- package/src/vtab/memory/layer/connection.ts +0 -203
- package/src/vtab/memory/layer/interface.ts +0 -47
- package/src/vtab/memory/layer/manager.ts +0 -909
- package/src/vtab/memory/layer/safe-iterate.ts +0 -49
- package/src/vtab/memory/layer/scan-plan.ts +0 -84
- package/src/vtab/memory/layer/transaction-cursor.ts +0 -162
- package/src/vtab/memory/layer/transaction.ts +0 -229
- package/src/vtab/memory/module.ts +0 -667
- package/src/vtab/memory/table.ts +0 -251
- package/src/vtab/memory/types.ts +0 -23
- package/src/vtab/memory/utils/logging.ts +0 -36
- package/src/vtab/memory/utils/primary-key.ts +0 -163
- package/src/vtab/module.ts +0 -162
- package/src/vtab/table.ts +0 -177
|
@@ -1,267 +0,0 @@
|
|
|
1
|
-
import { createLogger } from '../../../common/logger.js';
|
|
2
|
-
import type { PlanNode, RelationalPlanNode, ScalarPlanNode } from '../../nodes/plan-node.js';
|
|
3
|
-
import { isRelationalNode } from '../../nodes/plan-node.js';
|
|
4
|
-
import type { OptContext } from '../../framework/context.js';
|
|
5
|
-
import { JoinNode } from '../../nodes/join-node.js';
|
|
6
|
-
import { normalizePredicate } from '../../analysis/predicate-normalizer.js';
|
|
7
|
-
import { BinaryOpNode } from '../../nodes/scalar.js';
|
|
8
|
-
import { ColumnReferenceNode } from '../../nodes/reference.js';
|
|
9
|
-
|
|
10
|
-
const log = createLogger('optimizer:rule:quickpick');
|
|
11
|
-
|
|
12
|
-
interface JoinPredicate {
|
|
13
|
-
leftIndex: number;
|
|
14
|
-
rightIndex: number;
|
|
15
|
-
condition: ScalarPlanNode; // equi-predicate (or AND of equis) connecting the pair
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
interface JoinGraph {
|
|
19
|
-
relations: RelationalPlanNode[];
|
|
20
|
-
predicates: JoinPredicate[];
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function extractJoinGraph(node: PlanNode): JoinGraph | null {
|
|
24
|
-
// Flatten INNER/CROSS join subtree into leaves (relations) and equi-predicates between them
|
|
25
|
-
const relations: RelationalPlanNode[] = [];
|
|
26
|
-
const attrIdToRel = new Map<number, number>();
|
|
27
|
-
const pairToConds = new Map<string, ScalarPlanNode[]>();
|
|
28
|
-
|
|
29
|
-
function addRelation(rel: RelationalPlanNode): number {
|
|
30
|
-
const idx = relations.length;
|
|
31
|
-
relations.push(rel);
|
|
32
|
-
for (const attr of rel.getAttributes()) {
|
|
33
|
-
attrIdToRel.set(attr.id, idx);
|
|
34
|
-
}
|
|
35
|
-
return idx;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function addPairCond(aIdx: number, bIdx: number, cond: ScalarPlanNode): void {
|
|
39
|
-
const [x, y] = aIdx < bIdx ? [aIdx, bIdx] : [bIdx, aIdx];
|
|
40
|
-
const key = `${x}:${y}`;
|
|
41
|
-
if (!pairToConds.has(key)) pairToConds.set(key, []);
|
|
42
|
-
pairToConds.get(key)!.push(cond);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
function visit(n: PlanNode): void {
|
|
46
|
-
if (n instanceof JoinNode) {
|
|
47
|
-
// Only enumerate INNER/CROSS joins; bail if OUTER join encountered
|
|
48
|
-
if (n.getJoinType() !== 'inner' && n.getJoinType() !== 'cross') {
|
|
49
|
-
relations.length = 0; // mark failure
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
visit(n.getLeftSource());
|
|
53
|
-
visit(n.getRightSource());
|
|
54
|
-
|
|
55
|
-
// Analyze equi-join predicates
|
|
56
|
-
const cond = n.getJoinCondition();
|
|
57
|
-
if (cond) {
|
|
58
|
-
const norm = normalizePredicate(cond);
|
|
59
|
-
const stack: ScalarPlanNode[] = [norm];
|
|
60
|
-
while (stack.length) {
|
|
61
|
-
const expr = stack.pop()!;
|
|
62
|
-
if (expr instanceof BinaryOpNode && expr.expression.operator === 'AND') {
|
|
63
|
-
stack.push(expr.left, expr.right);
|
|
64
|
-
} else if (expr instanceof BinaryOpNode && expr.expression.operator === '=') {
|
|
65
|
-
if (expr.left instanceof ColumnReferenceNode && expr.right instanceof ColumnReferenceNode) {
|
|
66
|
-
const lRel = attrIdToRel.get((expr.left as ColumnReferenceNode).attributeId);
|
|
67
|
-
const rRel = attrIdToRel.get((expr.right as ColumnReferenceNode).attributeId);
|
|
68
|
-
if (lRel !== undefined && rRel !== undefined && lRel !== rRel) {
|
|
69
|
-
addPairCond(lRel, rRel, expr);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
if (isRelationalNode(n)) {
|
|
78
|
-
addRelation(n);
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
// Traverse generic children otherwise
|
|
82
|
-
for (const c of n.getChildren()) visit(c);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
visit(node);
|
|
86
|
-
if (relations.length === 0) return null; // failure or non-join
|
|
87
|
-
|
|
88
|
-
// Build predicates array (AND-combine multiple per pair later during plan build)
|
|
89
|
-
const predicates: JoinPredicate[] = [];
|
|
90
|
-
for (const [key, conds] of pairToConds) {
|
|
91
|
-
const [aStr, bStr] = key.split(':');
|
|
92
|
-
const a = parseInt(aStr, 10);
|
|
93
|
-
const b = parseInt(bStr, 10);
|
|
94
|
-
// Leave multiple conditions to be AND-combined when consumed
|
|
95
|
-
const combined = conds.length === 1 ? conds[0] : conds.reduce((acc, cur) =>
|
|
96
|
-
new BinaryOpNode(relations[a].scope, { type: 'binary', operator: 'AND' } as any, acc, cur)
|
|
97
|
-
);
|
|
98
|
-
predicates.push({ leftIndex: a, rightIndex: b, condition: combined });
|
|
99
|
-
}
|
|
100
|
-
return { relations, predicates };
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
function estimatePlanCost(plan: RelationalPlanNode): number {
|
|
104
|
-
// Use total cost, but apply penalties for cross products (no predicates between recent components)
|
|
105
|
-
// and reward key-covered joins via lower estimatedRows coming from computePhysical.
|
|
106
|
-
// Total cost already accumulates subtree costs; keep it as primary signal.
|
|
107
|
-
return plan.getTotalCost();
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
function buildLeftDeepPlan(order: number[], graph: JoinGraph): RelationalPlanNode {
|
|
111
|
-
let current: RelationalPlanNode | null = null;
|
|
112
|
-
const chosen = new Set<number>();
|
|
113
|
-
for (let i = 0; i < order.length; i++) {
|
|
114
|
-
const idx = order[i];
|
|
115
|
-
if (current === null) {
|
|
116
|
-
current = graph.relations[idx];
|
|
117
|
-
chosen.add(idx);
|
|
118
|
-
continue;
|
|
119
|
-
}
|
|
120
|
-
const next = graph.relations[idx];
|
|
121
|
-
// Gather all predicates that connect next to the chosen set
|
|
122
|
-
const connectors: ScalarPlanNode[] = [];
|
|
123
|
-
for (const p of graph.predicates) {
|
|
124
|
-
const connects = (chosen.has(p.leftIndex) && p.rightIndex === idx) || (chosen.has(p.rightIndex) && p.leftIndex === idx);
|
|
125
|
-
if (connects) connectors.push(p.condition);
|
|
126
|
-
}
|
|
127
|
-
const cond = connectors.length === 0 ? undefined : connectors.reduce((acc, cur) =>
|
|
128
|
-
acc ? new BinaryOpNode(current!.scope, { type: 'binary', operator: 'AND' } as any, acc, cur) : cur
|
|
129
|
-
, undefined as unknown as ScalarPlanNode | undefined);
|
|
130
|
-
current = new JoinNode(current.scope, current, next, 'inner', cond);
|
|
131
|
-
chosen.add(idx);
|
|
132
|
-
}
|
|
133
|
-
return current!;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// Greedy bushy: repeatedly merge the pair of components with minimal estimated join cost
|
|
137
|
-
function buildBushyPlan(graph: JoinGraph): RelationalPlanNode {
|
|
138
|
-
type Component = { members: Set<number>; plan: RelationalPlanNode };
|
|
139
|
-
const components: Component[] = graph.relations.map((r, i) => ({ members: new Set([i]), plan: r }));
|
|
140
|
-
|
|
141
|
-
function predicatesBetween(a: Component, b: Component): ScalarPlanNode | undefined {
|
|
142
|
-
const conns: ScalarPlanNode[] = [];
|
|
143
|
-
for (const p of graph.predicates) {
|
|
144
|
-
const lInA = a.members.has(p.leftIndex);
|
|
145
|
-
const rInA = a.members.has(p.rightIndex);
|
|
146
|
-
const lInB = b.members.has(p.leftIndex);
|
|
147
|
-
const rInB = b.members.has(p.rightIndex);
|
|
148
|
-
const crosses = (lInA && rInB) || (rInA && lInB);
|
|
149
|
-
if (crosses) conns.push(p.condition);
|
|
150
|
-
}
|
|
151
|
-
if (conns.length === 0) return undefined;
|
|
152
|
-
return conns.reduce((acc, cur) => acc ? new BinaryOpNode(graph.relations[0].scope, { type: 'binary', operator: 'AND' } as any, acc, cur) : cur, undefined as unknown as ScalarPlanNode | undefined);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
while (components.length > 1) {
|
|
156
|
-
let bestI = -1, bestJ = -1;
|
|
157
|
-
let bestCost = Number.POSITIVE_INFINITY;
|
|
158
|
-
let bestPlan: RelationalPlanNode | null = null;
|
|
159
|
-
|
|
160
|
-
for (let i = 0; i < components.length; i++) {
|
|
161
|
-
for (let j = i + 1; j < components.length; j++) {
|
|
162
|
-
const a = components[i];
|
|
163
|
-
const b = components[j];
|
|
164
|
-
const cond = predicatesBetween(a, b);
|
|
165
|
-
const joined = new JoinNode(a.plan.scope, a.plan, b.plan, 'inner', cond);
|
|
166
|
-
const cost = estimatePlanCost(joined);
|
|
167
|
-
if (cost < bestCost) {
|
|
168
|
-
bestCost = cost;
|
|
169
|
-
bestI = i;
|
|
170
|
-
bestJ = j;
|
|
171
|
-
bestPlan = joined;
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
// Merge best pair
|
|
177
|
-
const a = components[bestI];
|
|
178
|
-
const b = components[bestJ];
|
|
179
|
-
const merged: Component = { members: new Set([...a.members, ...b.members]), plan: bestPlan! };
|
|
180
|
-
// Remove higher index first
|
|
181
|
-
components.splice(bestJ, 1);
|
|
182
|
-
components.splice(bestI, 1);
|
|
183
|
-
components.push(merged);
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
return components[0].plan;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
export function ruleQuickPickJoinEnumeration(node: PlanNode, context: OptContext): PlanNode | null {
|
|
190
|
-
const qk = context.tuning.quickpick;
|
|
191
|
-
if (!qk?.enabled) return null;
|
|
192
|
-
if (!(node instanceof JoinNode)) return null;
|
|
193
|
-
|
|
194
|
-
const graph = extractJoinGraph(node);
|
|
195
|
-
if (!graph) return null;
|
|
196
|
-
if (graph.relations.length < 3) return null; // Only helpful for 3+ relations
|
|
197
|
-
|
|
198
|
-
const baselineCost = estimatePlanCost(node as unknown as RelationalPlanNode);
|
|
199
|
-
if (baselineCost < (qk.minTriggerCost ?? 0)) return null;
|
|
200
|
-
|
|
201
|
-
const maxTours = qk.maxTours ?? 100;
|
|
202
|
-
let bestPlan: RelationalPlanNode | null = null;
|
|
203
|
-
let bestCost = Number.POSITIVE_INFINITY;
|
|
204
|
-
|
|
205
|
-
// Try multiple strategies: left-deep greedy from small bases and bushy greedy
|
|
206
|
-
const sizes = graph.relations.map(r => r.estimatedRows ?? 1e9);
|
|
207
|
-
const baseOrder = [...graph.relations.keys()].sort((a, b) => (sizes[a] - sizes[b]));
|
|
208
|
-
|
|
209
|
-
const start = Date.now();
|
|
210
|
-
let tours = 0;
|
|
211
|
-
while (tours < maxTours && (Date.now() - start) <= (qk.timeLimitMs ?? 100)) {
|
|
212
|
-
// Greedy NN tour: start with random among top-2 smallest
|
|
213
|
-
const startIdx = baseOrder[Math.min(tours % 2, baseOrder.length - 1)];
|
|
214
|
-
const remaining = new Set<number>(graph.relations.keys());
|
|
215
|
-
remaining.delete(startIdx);
|
|
216
|
-
const order: number[] = [startIdx];
|
|
217
|
-
|
|
218
|
-
while (remaining.size > 0) {
|
|
219
|
-
let bestNext: number | null = null;
|
|
220
|
-
let bestIncCost = Number.POSITIVE_INFINITY;
|
|
221
|
-
|
|
222
|
-
for (const cand of remaining) {
|
|
223
|
-
// Prefer connected joins (has predicate to chosen set); penalize cross-products
|
|
224
|
-
const connected = graph.predicates.some(p =>
|
|
225
|
-
(order.some(o => o === p.leftIndex) && p.rightIndex === cand) ||
|
|
226
|
-
(order.some(o => o === p.rightIndex) && p.leftIndex === cand)
|
|
227
|
-
);
|
|
228
|
-
const plan = buildLeftDeepPlan([...order, cand], graph);
|
|
229
|
-
let cost = estimatePlanCost(plan);
|
|
230
|
-
if (!connected) cost *= 10; // strong penalty for cross product
|
|
231
|
-
if (cost < bestIncCost) {
|
|
232
|
-
bestIncCost = cost;
|
|
233
|
-
bestNext = cand;
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
order.push(bestNext!);
|
|
237
|
-
remaining.delete(bestNext!);
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
const plan = buildLeftDeepPlan(order, graph);
|
|
241
|
-
const cost = estimatePlanCost(plan);
|
|
242
|
-
if (cost < bestCost) {
|
|
243
|
-
bestCost = cost;
|
|
244
|
-
bestPlan = plan;
|
|
245
|
-
}
|
|
246
|
-
tours++;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
// Bushy attempt (one per invocation)
|
|
250
|
-
const bushy = buildBushyPlan(graph);
|
|
251
|
-
const bushyCost = estimatePlanCost(bushy);
|
|
252
|
-
if (bushyCost < bestCost) {
|
|
253
|
-
bestCost = bushyCost;
|
|
254
|
-
bestPlan = bushy;
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
if (!bestPlan) return null;
|
|
258
|
-
// Always record diagnostics for visibility
|
|
259
|
-
context.diagnostics.quickpick = { tours, bestCost };
|
|
260
|
-
if (bestCost < baselineCost * 0.9) {
|
|
261
|
-
log('QuickPick replaced join plan (%.2f -> %.2f)', baselineCost, bestCost);
|
|
262
|
-
return bestPlan as unknown as PlanNode;
|
|
263
|
-
}
|
|
264
|
-
return null;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Rule: Predicate Pushdown (characteristic-driven)
|
|
3
|
-
*
|
|
4
|
-
* Goal: Move Filter predicates downward across safe commuting nodes (Sort, Distinct, eligible Project)
|
|
5
|
-
* and into the Retrieve pipeline boundary so modules can execute or exploit them.
|
|
6
|
-
*
|
|
7
|
-
* Safe moves implemented now:
|
|
8
|
-
* - Across Sort: always safe (ordering unaffected by selection)
|
|
9
|
-
* - Across Distinct: safe for selection predicates (commute)
|
|
10
|
-
* - Across Project: only if predicate references attribute IDs available below the Project source
|
|
11
|
-
* (we verify attribute-id coverage), and we keep predicate unchanged (IDs preserved by design)
|
|
12
|
-
* - Into Retrieve: wrap Retrieve.source with a Filter
|
|
13
|
-
*
|
|
14
|
-
* Non-moves (for now):
|
|
15
|
-
* - Across Limit/Offset (changes semantics)
|
|
16
|
-
* - Across Aggregate/Window/Join (requires deeper analysis)
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
import { createLogger } from '../../../common/logger.js';
|
|
20
|
-
import type { PlanNode, RelationalPlanNode } from '../../nodes/plan-node.js';
|
|
21
|
-
import { isRelationalNode } from '../../nodes/plan-node.js';
|
|
22
|
-
import type { OptContext } from '../../framework/context.js';
|
|
23
|
-
import { PlanNodeType } from '../../nodes/plan-node-type.js';
|
|
24
|
-
import { FilterNode } from '../../nodes/filter.js';
|
|
25
|
-
import { SortNode } from '../../nodes/sort.js';
|
|
26
|
-
import { DistinctNode } from '../../nodes/distinct-node.js';
|
|
27
|
-
import { ProjectNode } from '../../nodes/project-node.js';
|
|
28
|
-
import { RetrieveNode } from '../../nodes/retrieve-node.js';
|
|
29
|
-
import { CapabilityDetectors } from '../../framework/characteristics.js';
|
|
30
|
-
import type { ScalarPlanNode } from '../../nodes/plan-node.js';
|
|
31
|
-
import { normalizePredicate } from '../../analysis/predicate-normalizer.js';
|
|
32
|
-
import { collectBindingsInExpr } from '../../analysis/binding-collector.js';
|
|
33
|
-
import { extractConstraints, createTableInfoFromNode } from '../../analysis/constraint-extractor.js';
|
|
34
|
-
|
|
35
|
-
const log = createLogger('optimizer:rule:predicate-pushdown');
|
|
36
|
-
|
|
37
|
-
export function rulePredicatePushdown(node: PlanNode, _context: OptContext): PlanNode | null {
|
|
38
|
-
// Only act on Filter nodes
|
|
39
|
-
if (node.nodeType !== PlanNodeType.Filter) return null;
|
|
40
|
-
|
|
41
|
-
const filter = node as FilterNode;
|
|
42
|
-
const normalized = normalizePredicate(filter.predicate);
|
|
43
|
-
|
|
44
|
-
// If no relational child, nothing to do
|
|
45
|
-
if (!isRelationalNode(filter.source)) return null;
|
|
46
|
-
|
|
47
|
-
const pushed = tryPushDown(filter.source, normalized, filter.scope);
|
|
48
|
-
if (!pushed) return null;
|
|
49
|
-
|
|
50
|
-
return pushed;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function tryPushDown(child: RelationalPlanNode, predicate: ScalarPlanNode, scope: any): PlanNode | null {
|
|
54
|
-
// Reach a Retrieve boundary: insert only the supported portion inside pipeline
|
|
55
|
-
if (child instanceof RetrieveNode) {
|
|
56
|
-
log('Pushing predicate into Retrieve pipeline (supported-only)');
|
|
57
|
-
const tableInfo = createTableInfoFromNode(child.tableRef, `${child.tableRef.tableSchema.name}`);
|
|
58
|
-
const extraction = extractConstraints(predicate, [tableInfo]);
|
|
59
|
-
const supported = extraction.supportedPredicateByTable?.get(tableInfo.relationKey);
|
|
60
|
-
|
|
61
|
-
if (!supported) {
|
|
62
|
-
log('No supported portion for this retrieve; not pushing');
|
|
63
|
-
return null;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const newInner = new FilterNode(child.source.scope, child.source, supported);
|
|
67
|
-
const newBindings = [
|
|
68
|
-
...(child.bindings ?? []),
|
|
69
|
-
...collectBindingsInExpr(supported, child.tableRef)
|
|
70
|
-
];
|
|
71
|
-
const updatedRetrieve = child.withPipeline(newInner, child.moduleCtx, newBindings);
|
|
72
|
-
|
|
73
|
-
// If the supported portion equals the whole filter, remove original filter; else keep residual above
|
|
74
|
-
if (!extraction.residualPredicate) {
|
|
75
|
-
return updatedRetrieve;
|
|
76
|
-
}
|
|
77
|
-
return new FilterNode(scope, updatedRetrieve as unknown as RelationalPlanNode, extraction.residualPredicate);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// Across Sort
|
|
81
|
-
if (child instanceof SortNode) {
|
|
82
|
-
log('Pushing predicate below Sort');
|
|
83
|
-
const under = child.source;
|
|
84
|
-
const newUnder = new FilterNode(under.scope, under, predicate);
|
|
85
|
-
return new SortNode(child.scope, newUnder, child.sortKeys);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// Across Distinct
|
|
89
|
-
if (child instanceof DistinctNode) {
|
|
90
|
-
log('Pushing predicate below Distinct');
|
|
91
|
-
const under = child.source;
|
|
92
|
-
const newUnder = new FilterNode(under.scope, under, predicate);
|
|
93
|
-
return new DistinctNode(child.scope, newUnder);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// Across eligible Project
|
|
97
|
-
if (child instanceof ProjectNode) {
|
|
98
|
-
if (canPushAcrossProject(child, predicate)) {
|
|
99
|
-
log('Pushing predicate below Project (eligible)');
|
|
100
|
-
const under = child.source;
|
|
101
|
-
const newUnder = new FilterNode(under.scope, under, predicate);
|
|
102
|
-
// Rebuild Project with same projections over the filtered source
|
|
103
|
-
return new ProjectNode(child.scope, newUnder, child.projections, undefined, undefined, child.preserveInputColumns);
|
|
104
|
-
}
|
|
105
|
-
return null;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// Default: do not push across other nodes
|
|
109
|
-
return null;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
function canPushAcrossProject(project: ProjectNode, predicate: ScalarPlanNode): boolean {
|
|
113
|
-
// If project preserves input columns and all predicate-attested attributes exist below, it's safe.
|
|
114
|
-
const sourceAttrIds = new Set(project.source.getAttributes().map(a => a.id));
|
|
115
|
-
const referenced = collectReferencedAttributeIds(predicate);
|
|
116
|
-
for (const id of referenced) {
|
|
117
|
-
if (!sourceAttrIds.has(id)) return false;
|
|
118
|
-
}
|
|
119
|
-
return true;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
function collectReferencedAttributeIds(expr: ScalarPlanNode): Set<number> {
|
|
123
|
-
const ids = new Set<number>();
|
|
124
|
-
walkExpr(expr, node => {
|
|
125
|
-
if (CapabilityDetectors.isColumnReference(node)) {
|
|
126
|
-
ids.add((node as any).attributeId as number);
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
return ids;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
function walkExpr(expr: ScalarPlanNode, fn: (n: ScalarPlanNode) => void): void {
|
|
133
|
-
fn(expr);
|
|
134
|
-
for (const c of expr.getChildren()) {
|
|
135
|
-
// Only scalar children
|
|
136
|
-
if (!isRelationalNode(c)) {
|
|
137
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
138
|
-
walkExpr(c as any as ScalarPlanNode, fn);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|