@quereus/quereus 0.7.2 → 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,265 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Materialization advisory framework
|
|
3
|
-
* Decides when and how to inject caching based on reference graph analysis
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { createLogger } from '../../common/logger.js';
|
|
7
|
-
import { isRelationalNode, type PlanNode, type RelationalPlanNode } from '../nodes/plan-node.js';
|
|
8
|
-
import { CacheNode, type CacheStrategy } from '../nodes/cache-node.js';
|
|
9
|
-
import { PlanNodeType } from '../nodes/plan-node-type.js';
|
|
10
|
-
import type { OptimizerTuning } from '../optimizer-tuning.js';
|
|
11
|
-
import { ReferenceGraphBuilder, type RefStats } from './reference-graph.js';
|
|
12
|
-
import { isCorrelatedSubquery } from './correlation-detector.js';
|
|
13
|
-
|
|
14
|
-
const log = createLogger('optimizer:cache:materialization');
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Cache recommendation for a specific node
|
|
18
|
-
*/
|
|
19
|
-
export interface CacheRecommendation {
|
|
20
|
-
/** Whether to inject caching for this node */
|
|
21
|
-
shouldCache: boolean;
|
|
22
|
-
/** Recommended cache strategy */
|
|
23
|
-
strategy: CacheStrategy;
|
|
24
|
-
/** Recommended cache threshold */
|
|
25
|
-
threshold: number;
|
|
26
|
-
/** Reason for the recommendation (for debugging) */
|
|
27
|
-
reason: string;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Materialization advisory that analyzes plan trees and recommends caching
|
|
32
|
-
*/
|
|
33
|
-
export class MaterializationAdvisory {
|
|
34
|
-
private referenceBuilder: ReferenceGraphBuilder;
|
|
35
|
-
|
|
36
|
-
constructor(private tuning: OptimizerTuning) {
|
|
37
|
-
this.referenceBuilder = new ReferenceGraphBuilder(tuning);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Analyze a plan tree and inject caching where beneficial
|
|
42
|
-
* Returns the transformed tree or the original if no caching was added
|
|
43
|
-
*/
|
|
44
|
-
analyzeAndTransform(root: PlanNode): PlanNode {
|
|
45
|
-
// Build reference graph
|
|
46
|
-
const refGraph = this.referenceBuilder.buildReferenceGraph(root);
|
|
47
|
-
|
|
48
|
-
// Build recommendations
|
|
49
|
-
const recommendations = new Map<PlanNode, CacheRecommendation>();
|
|
50
|
-
|
|
51
|
-
for (const [node, stats] of refGraph) {
|
|
52
|
-
// Only consider relational nodes for caching
|
|
53
|
-
if (!isRelationalNode(node)) {
|
|
54
|
-
continue;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
const recommendation = this.adviseCaching(node, stats);
|
|
58
|
-
if (recommendation.shouldCache) {
|
|
59
|
-
recommendations.set(node, recommendation);
|
|
60
|
-
log('Recommending cache for %s: %s', node.nodeType, recommendation.reason);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (recommendations.size === 0) {
|
|
65
|
-
log('No caching opportunities identified');
|
|
66
|
-
return root;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
log('Found %d caching opportunities', recommendations.size);
|
|
70
|
-
|
|
71
|
-
// Transform the tree by wrapping recommended nodes with CacheNode
|
|
72
|
-
return this.transformTree(root, recommendations);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Core advisory algorithm
|
|
77
|
-
*/
|
|
78
|
-
private adviseCaching(node: PlanNode, stats: RefStats): CacheRecommendation {
|
|
79
|
-
// Rule 1: Non-deterministic nodes should not be cached
|
|
80
|
-
if (!stats.deterministic) {
|
|
81
|
-
return {
|
|
82
|
-
shouldCache: false,
|
|
83
|
-
strategy: 'memory',
|
|
84
|
-
threshold: 0,
|
|
85
|
-
reason: 'Non-deterministic node'
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// Rule 2: Nodes that are already cached don't need additional caching
|
|
90
|
-
if (node.nodeType === PlanNodeType.Cache) {
|
|
91
|
-
return {
|
|
92
|
-
shouldCache: false,
|
|
93
|
-
strategy: 'memory',
|
|
94
|
-
threshold: 0,
|
|
95
|
-
reason: 'Already cached'
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// Rule 3: Correlated subqueries should not be cached
|
|
100
|
-
// Check if this node is part of a subquery context and if it's correlated
|
|
101
|
-
if (isRelationalNode(node) && this.isCorrelatedNode(node)) {
|
|
102
|
-
return {
|
|
103
|
-
shouldCache: false,
|
|
104
|
-
strategy: 'memory',
|
|
105
|
-
threshold: 0,
|
|
106
|
-
reason: 'Correlated subquery - must re-execute for each outer row'
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// Rule 4: Single-parent nodes that don't appear in loops typically don't benefit from caching
|
|
111
|
-
if (stats.parentCount <= 1 && !stats.appearsInLoop) {
|
|
112
|
-
return {
|
|
113
|
-
shouldCache: false,
|
|
114
|
-
strategy: 'memory',
|
|
115
|
-
threshold: 0,
|
|
116
|
-
reason: 'Single parent, not in loop'
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// Rule 5: Multi-parent nodes benefit from caching
|
|
121
|
-
if (stats.parentCount > 1) {
|
|
122
|
-
const strategy = this.selectStrategy(stats.estimatedRows);
|
|
123
|
-
const threshold = this.calculateThreshold(stats.estimatedRows, strategy);
|
|
124
|
-
|
|
125
|
-
return {
|
|
126
|
-
shouldCache: true,
|
|
127
|
-
strategy,
|
|
128
|
-
threshold,
|
|
129
|
-
reason: `Multiple parents (${stats.parentCount})`
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// Rule 6: Nodes in loop contexts benefit from caching even with single parent
|
|
134
|
-
if (stats.appearsInLoop) {
|
|
135
|
-
// Check if the estimated size is reasonable for caching
|
|
136
|
-
if (stats.estimatedRows > this.tuning.join.maxRightRowsForCaching) {
|
|
137
|
-
return {
|
|
138
|
-
shouldCache: false,
|
|
139
|
-
strategy: 'memory',
|
|
140
|
-
threshold: 0,
|
|
141
|
-
reason: `In loop but too large (${stats.estimatedRows} rows)`
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
const strategy = this.selectStrategy(stats.estimatedRows);
|
|
146
|
-
const threshold = this.calculateThreshold(stats.estimatedRows, strategy);
|
|
147
|
-
|
|
148
|
-
return {
|
|
149
|
-
shouldCache: true,
|
|
150
|
-
strategy,
|
|
151
|
-
threshold,
|
|
152
|
-
reason: 'Appears in loop context'
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
// Default: no caching
|
|
157
|
-
return {
|
|
158
|
-
shouldCache: false,
|
|
159
|
-
strategy: 'memory',
|
|
160
|
-
threshold: 0,
|
|
161
|
-
reason: 'No caching criteria met'
|
|
162
|
-
};
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/**
|
|
166
|
-
* Select appropriate cache strategy based on estimated size
|
|
167
|
-
*/
|
|
168
|
-
private selectStrategy(estimatedRows: number): CacheStrategy {
|
|
169
|
-
// Use tuning configuration for strategy selection
|
|
170
|
-
if (this.tuning.cache.spillEnabled && estimatedRows > this.tuning.cache.spillThreshold) {
|
|
171
|
-
return 'spill';
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
return 'memory';
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* Calculate appropriate cache threshold
|
|
179
|
-
*/
|
|
180
|
-
private calculateThreshold(estimatedRows: number, strategy: CacheStrategy): number {
|
|
181
|
-
const multiplier = this.tuning.join.cacheThresholdMultiplier;
|
|
182
|
-
const maxThreshold = strategy === 'spill' ?
|
|
183
|
-
this.tuning.join.maxCacheThreshold * 2 : // Allow larger thresholds for spill
|
|
184
|
-
this.tuning.join.maxCacheThreshold;
|
|
185
|
-
|
|
186
|
-
return Math.min(
|
|
187
|
-
Math.max(estimatedRows * multiplier, 1000), // Minimum threshold
|
|
188
|
-
maxThreshold
|
|
189
|
-
);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* Check if a node is part of a correlated subquery
|
|
194
|
-
*/
|
|
195
|
-
private isCorrelatedNode(node: PlanNode): boolean {
|
|
196
|
-
// Check if this is a relational node that could be correlated
|
|
197
|
-
if (isRelationalNode(node)) {
|
|
198
|
-
return isCorrelatedSubquery(node as RelationalPlanNode);
|
|
199
|
-
}
|
|
200
|
-
return false;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* Transform a tree by wrapping recommended nodes with CacheNode
|
|
205
|
-
* Uses a bottom-up approach to ensure proper transformation
|
|
206
|
-
*/
|
|
207
|
-
private transformTree(node: PlanNode, recommendations: Map<PlanNode, CacheRecommendation>): PlanNode {
|
|
208
|
-
// First, transform all children recursively
|
|
209
|
-
const transformedNode = this.transformChildren(node, recommendations);
|
|
210
|
-
|
|
211
|
-
// Then check if this node itself should be cached
|
|
212
|
-
const recommendation = recommendations.get(node);
|
|
213
|
-
if (recommendation?.shouldCache && isRelationalNode(transformedNode)) {
|
|
214
|
-
log('Injecting %s cache for %s (threshold: %d)',
|
|
215
|
-
recommendation.strategy, transformedNode.nodeType, recommendation.threshold);
|
|
216
|
-
|
|
217
|
-
return new CacheNode(
|
|
218
|
-
transformedNode.scope,
|
|
219
|
-
transformedNode as RelationalPlanNode,
|
|
220
|
-
recommendation.strategy,
|
|
221
|
-
recommendation.threshold
|
|
222
|
-
);
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
return transformedNode;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
/**
|
|
229
|
-
* Transform children of a node
|
|
230
|
-
* This handles both scalar and relational children using a simpler approach
|
|
231
|
-
*/
|
|
232
|
-
private transformChildren(node: PlanNode, recommendations: Map<PlanNode, CacheRecommendation>): PlanNode {
|
|
233
|
-
// For nodes that we know how to handle, transform their children
|
|
234
|
-
// For others, return the node as-is (the optimizer will handle it)
|
|
235
|
-
|
|
236
|
-
// First, try to transform scalar children using withChildren
|
|
237
|
-
const scalarChildren = node.getChildren();
|
|
238
|
-
const transformedScalarChildren = scalarChildren.map(child =>
|
|
239
|
-
this.transformTree(child, recommendations)
|
|
240
|
-
);
|
|
241
|
-
|
|
242
|
-
const scalarChanged = transformedScalarChildren.some((child, idx) =>
|
|
243
|
-
child !== scalarChildren[idx]
|
|
244
|
-
);
|
|
245
|
-
|
|
246
|
-
if (scalarChanged) {
|
|
247
|
-
// Let withChildren handle the transformation
|
|
248
|
-
// This will maintain proper attribute IDs and node structure
|
|
249
|
-
try {
|
|
250
|
-
return node.withChildren(transformedScalarChildren);
|
|
251
|
-
} catch (e) {
|
|
252
|
-
// If withChildren fails, log and return original
|
|
253
|
-
log('Warning: withChildren failed for %s: %s', node.nodeType, e);
|
|
254
|
-
return node;
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
// If no scalar children changed, check if this node has relational children
|
|
259
|
-
// that might need caching. For now, we'll return the node as-is and let
|
|
260
|
-
// individual optimization rules handle relational transformations.
|
|
261
|
-
// This is safer than trying to recreate complex nodes.
|
|
262
|
-
|
|
263
|
-
return node;
|
|
264
|
-
}
|
|
265
|
-
}
|
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Reference graph builder for materialization advisory
|
|
3
|
-
* Analyzes plan tree to identify nodes that would benefit from caching
|
|
4
|
-
*
|
|
5
|
-
* Note: This builder works with logical plan nodes and their properties.
|
|
6
|
-
* It does not make assumptions about execution strategies (e.g., whether
|
|
7
|
-
* a join will use nested loops vs hash join). Loop detection and execution
|
|
8
|
-
* multipliers should be determined during physical optimization when
|
|
9
|
-
* concrete execution strategies are chosen.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { createLogger } from '../../common/logger.js';
|
|
13
|
-
import { isRelationalNode, type PlanNode } from '../nodes/plan-node.js';
|
|
14
|
-
import type { OptimizerTuning } from '../optimizer-tuning.js';
|
|
15
|
-
|
|
16
|
-
const log = createLogger('optimizer:cache:reference-graph');
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Statistics about how a node is referenced in the plan tree
|
|
20
|
-
*/
|
|
21
|
-
export interface RefStats {
|
|
22
|
-
/** Number of parent nodes referencing this node */
|
|
23
|
-
parentCount: number;
|
|
24
|
-
/** Whether this node appears on the inner side of a nested loop or correlated subquery */
|
|
25
|
-
appearsInLoop: boolean;
|
|
26
|
-
/** Estimated number of rows this node produces */
|
|
27
|
-
estimatedRows: number;
|
|
28
|
-
/** Whether this node is deterministic (same inputs produce same outputs) */
|
|
29
|
-
deterministic: boolean;
|
|
30
|
-
/** Parent nodes that reference this node (for debugging) */
|
|
31
|
-
parents: Set<PlanNode>;
|
|
32
|
-
/** Estimated execution multiplier due to loop contexts */
|
|
33
|
-
loopMultiplier: number;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Node traversal context
|
|
38
|
-
*/
|
|
39
|
-
interface TraversalContext {
|
|
40
|
-
/** Current parent node */
|
|
41
|
-
parent: PlanNode | null;
|
|
42
|
-
/** Whether we're in a loop context */
|
|
43
|
-
inLoop: boolean;
|
|
44
|
-
/** Estimated loop iteration count */
|
|
45
|
-
loopIterations: number;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Builds a reference graph for materialization decisions
|
|
50
|
-
*/
|
|
51
|
-
export class ReferenceGraphBuilder {
|
|
52
|
-
private refMap = new Map<PlanNode, RefStats>();
|
|
53
|
-
|
|
54
|
-
constructor(private tuning: OptimizerTuning) {}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Build reference statistics for all nodes in the plan tree
|
|
58
|
-
*/
|
|
59
|
-
buildReferenceGraph(root: PlanNode): Map<PlanNode, RefStats> {
|
|
60
|
-
if (!root) {
|
|
61
|
-
log('Warning: buildReferenceGraph called with null root');
|
|
62
|
-
return new Map();
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
this.refMap.clear();
|
|
66
|
-
|
|
67
|
-
// Build the reference graph with proper parent tracking
|
|
68
|
-
const context: TraversalContext = {
|
|
69
|
-
parent: null,
|
|
70
|
-
inLoop: false,
|
|
71
|
-
loopIterations: 1
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
this.buildReferences(root, context);
|
|
75
|
-
|
|
76
|
-
log('Built reference graph with %d nodes', this.refMap.size);
|
|
77
|
-
return new Map(this.refMap);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Build reference statistics recursively
|
|
82
|
-
*/
|
|
83
|
-
private buildReferences(node: PlanNode | null | undefined, context: TraversalContext): void {
|
|
84
|
-
if (!node) {
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// Get or create stats for this node
|
|
89
|
-
let stats = this.refMap.get(node);
|
|
90
|
-
if (!stats) {
|
|
91
|
-
// First time seeing this node
|
|
92
|
-
stats = {
|
|
93
|
-
parentCount: 0,
|
|
94
|
-
appearsInLoop: context.inLoop,
|
|
95
|
-
estimatedRows: this.getEstimatedRows(node),
|
|
96
|
-
deterministic: this.isDeterministic(node),
|
|
97
|
-
parents: new Set<PlanNode>(),
|
|
98
|
-
loopMultiplier: context.loopIterations
|
|
99
|
-
};
|
|
100
|
-
this.refMap.set(node, stats);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// Update stats based on current traversal
|
|
104
|
-
if (context.parent && !stats.parents.has(context.parent)) {
|
|
105
|
-
stats.parents.add(context.parent);
|
|
106
|
-
stats.parentCount++;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// Update loop context
|
|
110
|
-
if (context.inLoop) {
|
|
111
|
-
stats.appearsInLoop = true;
|
|
112
|
-
stats.loopMultiplier = Math.max(stats.loopMultiplier, context.loopIterations);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// Create child context - for now, we propagate the parent context
|
|
116
|
-
// In the future, if nodes expose execution strategy hints, we could use those
|
|
117
|
-
const childContext: TraversalContext = {
|
|
118
|
-
parent: node,
|
|
119
|
-
inLoop: context.inLoop,
|
|
120
|
-
loopIterations: context.loopIterations
|
|
121
|
-
};
|
|
122
|
-
|
|
123
|
-
// Visit all children uniformly
|
|
124
|
-
this.visitAllChildren(node, childContext);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Visit all children of a node
|
|
129
|
-
*/
|
|
130
|
-
private visitAllChildren(node: PlanNode, childContext: TraversalContext): void {
|
|
131
|
-
// 1. Scalar children (expressions)
|
|
132
|
-
try {
|
|
133
|
-
const children = node.getChildren();
|
|
134
|
-
for (const child of children) {
|
|
135
|
-
if (child) {
|
|
136
|
-
this.buildReferences(child, childContext);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
} catch (e) {
|
|
140
|
-
log('Warning: Failed to get children for node %s: %s', node.nodeType, e);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// 2. Relational children
|
|
144
|
-
// Note: getRelations() returns a subset of getChildren() for nodes that have relational children
|
|
145
|
-
// We need to be careful not to double-count, but since we're using a Set for parents,
|
|
146
|
-
// and checking if we've already added a parent, this should be fine
|
|
147
|
-
if (isRelationalNode(node)) {
|
|
148
|
-
try {
|
|
149
|
-
const relations = node.getRelations();
|
|
150
|
-
for (const relation of relations) {
|
|
151
|
-
if (relation) {
|
|
152
|
-
// For now, treat all relational children the same
|
|
153
|
-
// In the future, nodes could provide hints about execution patterns
|
|
154
|
-
this.buildReferences(relation, childContext);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
} catch (e) {
|
|
158
|
-
log('Warning: Failed to get relations for node %s: %s', node.nodeType, e);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* Get estimated row count for a node
|
|
165
|
-
*/
|
|
166
|
-
private getEstimatedRows(node: PlanNode | null | undefined): number {
|
|
167
|
-
if (!node) {
|
|
168
|
-
return this.tuning.defaultRowEstimate;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
// Use physical properties if available
|
|
172
|
-
if (node.physical?.estimatedRows !== undefined) {
|
|
173
|
-
return node.physical.estimatedRows;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
// Fall back to node-specific estimates (for relational nodes)
|
|
177
|
-
if (isRelationalNode(node) && node.estimatedRows !== undefined) {
|
|
178
|
-
return node.estimatedRows;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
// Default estimate
|
|
182
|
-
return this.tuning.defaultRowEstimate;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* Determine if a node is deterministic
|
|
187
|
-
*/
|
|
188
|
-
private isDeterministic(node: PlanNode | null | undefined): boolean {
|
|
189
|
-
if (!node) {
|
|
190
|
-
return true;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
// Use physical properties to determine determinism
|
|
194
|
-
return node.physical?.deterministic ?? true;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cost model helpers for query optimization
|
|
3
|
-
* Provides consistent cost estimation formulas across the optimizer
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { quereusError } from "../../common/errors.js";
|
|
7
|
-
import { StatusCode } from "../../common/types.js";
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Basic cost constants (in arbitrary "virtual CPU units")
|
|
11
|
-
*/
|
|
12
|
-
export const COST_CONSTANTS = {
|
|
13
|
-
/** Cost per row for sequential scan */
|
|
14
|
-
SEQ_SCAN_PER_ROW: 1.0,
|
|
15
|
-
/** Base cost for starting a sequential scan */
|
|
16
|
-
SEQ_SCAN_BASE: 0.1,
|
|
17
|
-
|
|
18
|
-
/** Cost per row for index seek */
|
|
19
|
-
INDEX_SEEK_PER_ROW: 0.3,
|
|
20
|
-
/** Base cost for index seek operation */
|
|
21
|
-
INDEX_SEEK_BASE: 0.5,
|
|
22
|
-
|
|
23
|
-
/** Cost per row for index scan */
|
|
24
|
-
INDEX_SCAN_PER_ROW: 0.5,
|
|
25
|
-
/** Base cost for index scan operation */
|
|
26
|
-
INDEX_SCAN_BASE: 0.3,
|
|
27
|
-
|
|
28
|
-
/** Cost per row for sorting */
|
|
29
|
-
SORT_PER_ROW: 2.0,
|
|
30
|
-
/** Log base for sort cost calculations */
|
|
31
|
-
SORT_LOG_BASE: 2,
|
|
32
|
-
|
|
33
|
-
/** Cost per row for filtering */
|
|
34
|
-
FILTER_PER_ROW: 0.2,
|
|
35
|
-
|
|
36
|
-
/** Cost per row for projection */
|
|
37
|
-
PROJECT_PER_ROW: 0.1,
|
|
38
|
-
|
|
39
|
-
/** Cost per output row for aggregation */
|
|
40
|
-
AGGREGATE_PER_GROUP: 1.5,
|
|
41
|
-
/** Cost per input row for aggregation */
|
|
42
|
-
AGGREGATE_PER_INPUT_ROW: 0.3,
|
|
43
|
-
|
|
44
|
-
/** Cost per row for nested loop join (inner side) */
|
|
45
|
-
NL_JOIN_PER_INNER_ROW: 0.1,
|
|
46
|
-
/** Cost per row for nested loop join (outer side) */
|
|
47
|
-
NL_JOIN_PER_OUTER_ROW: 1.0,
|
|
48
|
-
|
|
49
|
-
/** Cost per row for hash join build phase */
|
|
50
|
-
HASH_JOIN_BUILD_PER_ROW: 0.8,
|
|
51
|
-
/** Cost per row for hash join probe phase */
|
|
52
|
-
HASH_JOIN_PROBE_PER_ROW: 0.4,
|
|
53
|
-
|
|
54
|
-
/** Cost per row for distinct operation */
|
|
55
|
-
DISTINCT_PER_ROW: 1.2,
|
|
56
|
-
|
|
57
|
-
/** Cost per row for limit operation */
|
|
58
|
-
LIMIT_PER_ROW: 0.05,
|
|
59
|
-
|
|
60
|
-
/** Cost per row for cache access */
|
|
61
|
-
CACHE_ACCESS_PER_ROW: 0.1,
|
|
62
|
-
/** Cost per row for cache population */
|
|
63
|
-
CACHE_POPULATE_PER_ROW: 0.2,
|
|
64
|
-
} as const;
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Calculate cost for sequential scan
|
|
68
|
-
*/
|
|
69
|
-
export function seqScanCost(rows: number): number {
|
|
70
|
-
return COST_CONSTANTS.SEQ_SCAN_BASE + (rows * COST_CONSTANTS.SEQ_SCAN_PER_ROW);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Calculate cost for index seek (point lookup or tight range)
|
|
75
|
-
*/
|
|
76
|
-
export function indexSeekCost(rows: number): number {
|
|
77
|
-
return COST_CONSTANTS.INDEX_SEEK_BASE + (rows * COST_CONSTANTS.INDEX_SEEK_PER_ROW);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Calculate cost for index scan (range scan with ordering)
|
|
82
|
-
*/
|
|
83
|
-
export function indexScanCost(rows: number): number {
|
|
84
|
-
return COST_CONSTANTS.INDEX_SCAN_BASE + (rows * COST_CONSTANTS.INDEX_SCAN_PER_ROW);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Calculate cost for sorting operation
|
|
89
|
-
* Uses O(n log n) complexity
|
|
90
|
-
*/
|
|
91
|
-
export function sortCost(rows: number): number {
|
|
92
|
-
if (rows <= 1) return COST_CONSTANTS.SORT_PER_ROW;
|
|
93
|
-
return rows * Math.log2(rows) * COST_CONSTANTS.SORT_PER_ROW;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Calculate cost for filter operation
|
|
98
|
-
*/
|
|
99
|
-
export function filterCost(inputRows: number): number {
|
|
100
|
-
return inputRows * COST_CONSTANTS.FILTER_PER_ROW;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Calculate cost for projection operation
|
|
105
|
-
*/
|
|
106
|
-
export function projectCost(rows: number, projectionCount: number = 1): number {
|
|
107
|
-
return rows * projectionCount * COST_CONSTANTS.PROJECT_PER_ROW;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Calculate cost for aggregation operation
|
|
112
|
-
*/
|
|
113
|
-
export function aggregateCost(inputRows: number, outputRows: number): number {
|
|
114
|
-
return (inputRows * COST_CONSTANTS.AGGREGATE_PER_INPUT_ROW) +
|
|
115
|
-
(outputRows * COST_CONSTANTS.AGGREGATE_PER_GROUP);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Calculate cost for nested loop join
|
|
120
|
-
*/
|
|
121
|
-
export function nestedLoopJoinCost(outerRows: number, innerRows: number): number {
|
|
122
|
-
return (outerRows * COST_CONSTANTS.NL_JOIN_PER_OUTER_ROW) +
|
|
123
|
-
(outerRows * innerRows * COST_CONSTANTS.NL_JOIN_PER_INNER_ROW);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Calculate cost for hash join
|
|
128
|
-
*/
|
|
129
|
-
export function hashJoinCost(buildRows: number, probeRows: number): number {
|
|
130
|
-
return (buildRows * COST_CONSTANTS.HASH_JOIN_BUILD_PER_ROW) +
|
|
131
|
-
(probeRows * COST_CONSTANTS.HASH_JOIN_PROBE_PER_ROW);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Calculate cost for distinct operation
|
|
136
|
-
*/
|
|
137
|
-
export function distinctCost(rows: number): number {
|
|
138
|
-
// Distinct typically involves sorting or hashing
|
|
139
|
-
return rows * COST_CONSTANTS.DISTINCT_PER_ROW;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Calculate cost for limit operation
|
|
144
|
-
*/
|
|
145
|
-
export function limitCost(inputRows: number, limitValue: number): number {
|
|
146
|
-
const processedRows = Math.min(inputRows, limitValue);
|
|
147
|
-
return processedRows * COST_CONSTANTS.LIMIT_PER_ROW;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Calculate cost for cache operations
|
|
152
|
-
*/
|
|
153
|
-
export function cacheCost(rows: number, accessCount: number = 1): number {
|
|
154
|
-
const populateCost = rows * COST_CONSTANTS.CACHE_POPULATE_PER_ROW;
|
|
155
|
-
const accessCost = rows * accessCount * COST_CONSTANTS.CACHE_ACCESS_PER_ROW;
|
|
156
|
-
return populateCost + accessCost;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* Helper to choose the minimum cost option
|
|
161
|
-
*/
|
|
162
|
-
export function chooseCheapest<T>(options: Array<{ cost: number; option: T }>): T {
|
|
163
|
-
if (options.length === 0) {
|
|
164
|
-
quereusError('No options provided to chooseCheapest', StatusCode.INTERNAL);
|
|
165
|
-
}
|
|
166
|
-
return options.reduce((min, current) =>
|
|
167
|
-
current.cost < min.cost ? current : min
|
|
168
|
-
).option;
|
|
169
|
-
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Debug namespace utilities for the Titan optimizer
|
|
3
|
-
* Provides standardized logger creation and debug conventions
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { createLogger } from '../../common/logger.js';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Create a logger for optimizer rules
|
|
10
|
-
* @param ruleName The name of the optimization rule
|
|
11
|
-
* @returns A debug logger with the standard optimizer:rule namespace
|
|
12
|
-
*/
|
|
13
|
-
export function ruleLog(ruleName: string) {
|
|
14
|
-
return createLogger(`optimizer:rule:${ruleName}`);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Create a logger for optimizer validation
|
|
19
|
-
* @param component The validation component (e.g., 'plan', 'attributes', 'ordering')
|
|
20
|
-
* @returns A debug logger with the standard optimizer:validate namespace
|
|
21
|
-
*/
|
|
22
|
-
export function validateLog(component: string = '') {
|
|
23
|
-
const namespace = component ? `optimizer:validate:${component}` : 'optimizer:validate';
|
|
24
|
-
return createLogger(namespace);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Create a logger for runtime statistics
|
|
29
|
-
* @param component The stats component (e.g., 'metrics', 'summary', 'cache')
|
|
30
|
-
* @returns A debug logger with the standard runtime:stats namespace
|
|
31
|
-
*/
|
|
32
|
-
export function statsLog(component: string = '') {
|
|
33
|
-
const namespace = component ? `runtime:stats:${component}` : 'runtime:stats';
|
|
34
|
-
return createLogger(namespace);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Create a logger for constant folding operations
|
|
39
|
-
* @param component The folding component (e.g., 'evaluation', 'binary-ops', 'functions')
|
|
40
|
-
* @returns A debug logger with the standard optimizer:folding namespace
|
|
41
|
-
*/
|
|
42
|
-
export function foldingLog(component: string = '') {
|
|
43
|
-
const namespace = component ? `optimizer:folding:${component}` : 'optimizer:folding';
|
|
44
|
-
return createLogger(namespace);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Create a logger for plan emission
|
|
49
|
-
* @param emitterName The name of the emitter
|
|
50
|
-
* @returns A debug logger with the standard runtime:emit namespace
|
|
51
|
-
*/
|
|
52
|
-
export function emitLog(emitterName: string) {
|
|
53
|
-
return createLogger(`runtime:emit:${emitterName}`);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Examples of debug namespace usage
|
|
62
|
-
*
|
|
63
|
-
* Enable all optimizer rules: DEBUG=optimizer:rule:* yarn test
|
|
64
|
-
* Enable plan validation: DEBUG=optimizer:validate yarn test
|
|
65
|
-
* Enable runtime stats: DEBUG=runtime:stats yarn test
|
|
66
|
-
* Enable specific rule: DEBUG=optimizer:rule:aggregate-streaming yarn test
|
|
67
|
-
* Enable everything: DEBUG=* yarn test
|
|
68
|
-
*/
|