@quereus/quereus 0.7.3 → 0.7.5
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/dist/src/schema/manager.d.ts.map +1 -1
- package/dist/src/schema/manager.js +19 -18
- 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,162 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Rule: Aggregate Streaming
|
|
3
|
-
*
|
|
4
|
-
* Required Characteristics:
|
|
5
|
-
* - Node must support aggregation operations (AggregationCapable interface)
|
|
6
|
-
* - Node must be relational (produces rows)
|
|
7
|
-
* - Node must be read-only (no side effects for streaming)
|
|
8
|
-
*
|
|
9
|
-
* Applied When:
|
|
10
|
-
* - Logical aggregate node needs physical streaming implementation
|
|
11
|
-
* - Source data can be processed incrementally
|
|
12
|
-
*
|
|
13
|
-
* Benefits: Enables streaming aggregation with proper grouping order, memory efficient processing
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
import { createLogger } from '../../../common/logger.js';
|
|
17
|
-
import type { PlanNode, ScalarPlanNode, Attribute } from '../../nodes/plan-node.js';
|
|
18
|
-
import type { OptContext } from '../../framework/context.js';
|
|
19
|
-
import { StreamAggregateNode } from '../../nodes/stream-aggregate.js';
|
|
20
|
-
import { SortNode } from '../../nodes/sort.js';
|
|
21
|
-
import {
|
|
22
|
-
PlanNodeCharacteristics,
|
|
23
|
-
CapabilityDetectors,
|
|
24
|
-
type AggregationCapable
|
|
25
|
-
} from '../../framework/characteristics.js';
|
|
26
|
-
|
|
27
|
-
const log = createLogger('optimizer:rule:aggregate-streaming');
|
|
28
|
-
|
|
29
|
-
export function ruleAggregateStreaming(node: PlanNode, _context: OptContext): PlanNode | null {
|
|
30
|
-
// Guard: node must support aggregation operations
|
|
31
|
-
if (!CapabilityDetectors.isAggregating(node)) {
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
log('Applying aggregate streaming rule to node %s', node.id);
|
|
36
|
-
|
|
37
|
-
// Get aggregation characteristics
|
|
38
|
-
const aggregateNode = node as AggregationCapable;
|
|
39
|
-
const groupingKeys = aggregateNode.getGroupingKeys();
|
|
40
|
-
const aggregateExpressions = aggregateNode.getAggregateExpressions();
|
|
41
|
-
|
|
42
|
-
// Check if we can stream the aggregation over the source
|
|
43
|
-
const source = aggregateNode.getSource();
|
|
44
|
-
|
|
45
|
-
// Check if streaming aggregation is beneficial
|
|
46
|
-
if (!aggregateNode.canStreamAggregate()) {
|
|
47
|
-
log('Node cannot use streaming aggregation, skipping');
|
|
48
|
-
return null;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
if (groupingKeys.length > 0) {
|
|
52
|
-
// Need to ensure ordering for streaming aggregate
|
|
53
|
-
// Check if source already provides the required ordering
|
|
54
|
-
const sourceOrdering = PlanNodeCharacteristics.getOrdering(source);
|
|
55
|
-
const needsSort = !isOrderedForGrouping(sourceOrdering, groupingKeys);
|
|
56
|
-
|
|
57
|
-
let sortedSource = source;
|
|
58
|
-
if (needsSort) {
|
|
59
|
-
// Insert sort to ensure proper grouping order
|
|
60
|
-
const sortKeys = groupingKeys.map(expr => ({
|
|
61
|
-
expression: expr,
|
|
62
|
-
direction: 'asc' as const,
|
|
63
|
-
nulls: undefined
|
|
64
|
-
}));
|
|
65
|
-
|
|
66
|
-
sortedSource = new SortNode(node.scope, source, sortKeys);
|
|
67
|
-
log('Inserted sort for grouping keys');
|
|
68
|
-
} else {
|
|
69
|
-
log('Source already provides required ordering for streaming');
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// Create combined attributes preserving attribute IDs
|
|
73
|
-
const finalAttrs = combineAttributes(node.getAttributes(), source.getAttributes());
|
|
74
|
-
|
|
75
|
-
// Convert aggregate expressions to match StreamAggregateNode interface
|
|
76
|
-
const streamAggregates = aggregateExpressions.map(agg => ({
|
|
77
|
-
expression: agg.expr,
|
|
78
|
-
alias: agg.alias
|
|
79
|
-
}));
|
|
80
|
-
|
|
81
|
-
const result = new StreamAggregateNode(
|
|
82
|
-
node.scope,
|
|
83
|
-
sortedSource,
|
|
84
|
-
groupingKeys,
|
|
85
|
-
streamAggregates,
|
|
86
|
-
undefined, // estimatedCostOverride
|
|
87
|
-
finalAttrs
|
|
88
|
-
);
|
|
89
|
-
|
|
90
|
-
log('Transformed aggregation to StreamAggregateNode with %s', needsSort ? 'sort' : 'existing order');
|
|
91
|
-
return result;
|
|
92
|
-
} else {
|
|
93
|
-
// No GROUP BY - can stream aggregate without sorting
|
|
94
|
-
const finalAttrs = combineAttributes(node.getAttributes(), source.getAttributes());
|
|
95
|
-
|
|
96
|
-
// Convert aggregate expressions to match StreamAggregateNode interface
|
|
97
|
-
const streamAggregates = aggregateExpressions.map(agg => ({
|
|
98
|
-
expression: agg.expr,
|
|
99
|
-
alias: agg.alias
|
|
100
|
-
}));
|
|
101
|
-
|
|
102
|
-
const result = new StreamAggregateNode(
|
|
103
|
-
node.scope,
|
|
104
|
-
source,
|
|
105
|
-
groupingKeys,
|
|
106
|
-
streamAggregates,
|
|
107
|
-
undefined, // estimatedCostOverride
|
|
108
|
-
finalAttrs
|
|
109
|
-
);
|
|
110
|
-
|
|
111
|
-
log('Transformed aggregation to StreamAggregateNode without sort');
|
|
112
|
-
return result;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Check if source ordering matches grouping requirements for streaming
|
|
118
|
-
*/
|
|
119
|
-
function isOrderedForGrouping(
|
|
120
|
-
_ordering: { column: number; desc: boolean }[] | undefined,
|
|
121
|
-
_groupingKeys: readonly ScalarPlanNode[]
|
|
122
|
-
): boolean {
|
|
123
|
-
// TODO: Implement proper ordering analysis
|
|
124
|
-
// For now, conservatively return false to always sort
|
|
125
|
-
// This should check if the ordering covers all grouping keys in order
|
|
126
|
-
return false;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* Combine attributes from aggregate and source, avoiding duplicates by name
|
|
131
|
-
* This preserves attribute IDs while ensuring unique column names
|
|
132
|
-
*/
|
|
133
|
-
function combineAttributes(aggregateAttrs: readonly Attribute[], sourceAttrs: readonly Attribute[]): Attribute[] {
|
|
134
|
-
const seenNames = new Set<string>();
|
|
135
|
-
const combinedAttrs: Attribute[] = [];
|
|
136
|
-
|
|
137
|
-
// Add aggregate attributes first (GROUP BY + aggregates)
|
|
138
|
-
for (const attr of aggregateAttrs) {
|
|
139
|
-
combinedAttrs.push(attr);
|
|
140
|
-
seenNames.add(attr.name);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// Add source attributes that aren't already present by name
|
|
144
|
-
for (const attr of sourceAttrs) {
|
|
145
|
-
if (!seenNames.has(attr.name)) {
|
|
146
|
-
combinedAttrs.push(attr);
|
|
147
|
-
seenNames.add(attr.name);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
// Final deduplication pass
|
|
152
|
-
const uniqueByName = new Set<string>();
|
|
153
|
-
const deduped: any[] = [];
|
|
154
|
-
for (const attr of combinedAttrs) {
|
|
155
|
-
if (!uniqueByName.has(attr.name)) {
|
|
156
|
-
deduped.push(attr);
|
|
157
|
-
uniqueByName.add(attr.name);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
return deduped;
|
|
162
|
-
}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Rule: CTE Optimization
|
|
3
|
-
*
|
|
4
|
-
* Required Characteristics:
|
|
5
|
-
* - Node must support CTE operations (CTECapable interface)
|
|
6
|
-
* - Node must be relational (produces rows)
|
|
7
|
-
* - Source must be cacheable for materialization
|
|
8
|
-
*
|
|
9
|
-
* Applied When:
|
|
10
|
-
* - CTE would benefit from materialization/caching based on cost analysis
|
|
11
|
-
*
|
|
12
|
-
* Benefits: Reduces redundant computation for repeated CTE access
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import { createLogger } from '../../../common/logger.js';
|
|
16
|
-
import type { PlanNode } from '../../nodes/plan-node.js';
|
|
17
|
-
import type { OptContext } from '../../framework/context.js';
|
|
18
|
-
import { CTENode } from '../../nodes/cte-node.js';
|
|
19
|
-
import { CacheNode } from '../../nodes/cache-node.js';
|
|
20
|
-
import { CapabilityDetectors, CachingAnalysis, PlanNodeCharacteristics, type CTECapable } from '../../framework/characteristics.js';
|
|
21
|
-
|
|
22
|
-
const log = createLogger('optimizer:rule:cte-optimization');
|
|
23
|
-
|
|
24
|
-
export function ruleCteOptimization(node: PlanNode, context: OptContext): PlanNode | null {
|
|
25
|
-
// Guard: node must support CTE operations
|
|
26
|
-
if (!CapabilityDetectors.isCTE(node)) {
|
|
27
|
-
return null;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// Get CTE characteristics
|
|
31
|
-
const cteNode = node as CTECapable;
|
|
32
|
-
log('Optimizing CTE %s', cteNode.cteName);
|
|
33
|
-
|
|
34
|
-
// Source is already optimized by framework
|
|
35
|
-
const source = cteNode.getCTESource();
|
|
36
|
-
|
|
37
|
-
// Heuristics for when to cache CTEs:
|
|
38
|
-
// 1. CTE has materialization hint
|
|
39
|
-
// 2. CTE is estimated to be reasonably sized
|
|
40
|
-
// 3. CTE is not already cached
|
|
41
|
-
const sourceSize = PlanNodeCharacteristics.estimatesRows(source);
|
|
42
|
-
const isAlreadyCached = CapabilityDetectors.isCached(source) && source.isCached();
|
|
43
|
-
const shouldCache = (
|
|
44
|
-
cteNode.materializationHint === 'materialized' ||
|
|
45
|
-
(sourceSize > 0 && sourceSize < context.tuning.cte.maxSizeForCaching)
|
|
46
|
-
) && !isAlreadyCached;
|
|
47
|
-
|
|
48
|
-
if (shouldCache) {
|
|
49
|
-
log('Adding cache to CTE %s (estimated rows: %d)', cteNode.cteName, sourceSize);
|
|
50
|
-
|
|
51
|
-
// Use characteristics-based cache threshold calculation
|
|
52
|
-
const cacheThreshold = Math.min(
|
|
53
|
-
CachingAnalysis.getCacheThreshold(source),
|
|
54
|
-
context.tuning.cte.maxCacheThreshold
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
const cachedSource = new CacheNode(
|
|
58
|
-
source.scope,
|
|
59
|
-
source,
|
|
60
|
-
'memory',
|
|
61
|
-
cacheThreshold
|
|
62
|
-
);
|
|
63
|
-
|
|
64
|
-
// Create new CTE with cached source (specific to CTENode implementation)
|
|
65
|
-
const result = new CTENode(
|
|
66
|
-
node.scope,
|
|
67
|
-
cteNode.cteName,
|
|
68
|
-
cteNode.columns,
|
|
69
|
-
cachedSource,
|
|
70
|
-
cteNode.materializationHint,
|
|
71
|
-
cteNode.isRecursive
|
|
72
|
-
);
|
|
73
|
-
|
|
74
|
-
log('Created CTE with caching');
|
|
75
|
-
return result;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
return null; // No transformation needed
|
|
79
|
-
}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Rule: Materialization Advisory
|
|
3
|
-
*
|
|
4
|
-
* Required Characteristics:
|
|
5
|
-
* - Node must be non-relational with relational children
|
|
6
|
-
* - Children must be cacheable based on reference analysis
|
|
7
|
-
* - Children must benefit from materialization
|
|
8
|
-
*
|
|
9
|
-
* Applied When:
|
|
10
|
-
* - Transition from non-relational to relational subtrees
|
|
11
|
-
* - Relational subtrees would benefit from caching
|
|
12
|
-
*
|
|
13
|
-
* Benefits: Reduces redundant computation for repeated scans and loop contexts
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
import { createLogger } from '../../../common/logger.js';
|
|
17
|
-
import type { PlanNode } from '../../nodes/plan-node.js';
|
|
18
|
-
import type { OptContext } from '../../framework/context.js';
|
|
19
|
-
import { MaterializationAdvisory } from '../../cache/materialization-advisory.js';
|
|
20
|
-
import { PlanNodeCharacteristics } from '../../framework/characteristics.js';
|
|
21
|
-
|
|
22
|
-
const log = createLogger('optimizer:rule:materialization-advisory');
|
|
23
|
-
|
|
24
|
-
export function ruleMaterializationAdvisory(node: PlanNode, context: OptContext): PlanNode | null {
|
|
25
|
-
// Apply this rule when we're at a non-relational node that has relational children
|
|
26
|
-
// This captures transitions into relational subtrees (queries, subqueries, CTEs, etc.)
|
|
27
|
-
|
|
28
|
-
// Check if this is a non-relational node using characteristics
|
|
29
|
-
if (PlanNodeCharacteristics.isRelational(node)) {
|
|
30
|
-
// This is already a relational node, don't apply here
|
|
31
|
-
return null;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// Check if this node has any relational children
|
|
35
|
-
const relations = node.getRelations();
|
|
36
|
-
if (relations.length === 0) {
|
|
37
|
-
// No relational children, nothing to analyze
|
|
38
|
-
return null;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
log('Applying materialization advisory at transition from %s to relational children', node.getType().typeClass);
|
|
42
|
-
|
|
43
|
-
try {
|
|
44
|
-
// Create advisory with current tuning parameters
|
|
45
|
-
const advisory = new MaterializationAdvisory(context.tuning);
|
|
46
|
-
|
|
47
|
-
// We need to analyze and potentially transform each relational subtree
|
|
48
|
-
let anyTransformed = false;
|
|
49
|
-
|
|
50
|
-
// For each relational child, analyze and transform its entire subtree
|
|
51
|
-
for (const relation of relations) {
|
|
52
|
-
const transformedRelation = advisory.analyzeAndTransform(relation);
|
|
53
|
-
if (transformedRelation !== relation) {
|
|
54
|
-
anyTransformed = true;
|
|
55
|
-
log('Transformed relational subtree under %s node', node.getType().typeClass);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// If any relational children were transformed, we need to return a transformed node
|
|
60
|
-
// However, since we can't easily reconstruct the parent node with new relational children
|
|
61
|
-
// (as discussed in the earlier implementation), we'll analyze the entire node
|
|
62
|
-
if (anyTransformed) {
|
|
63
|
-
// Re-analyze the entire tree rooted at this node
|
|
64
|
-
const fullTransform = advisory.analyzeAndTransform(node);
|
|
65
|
-
if (fullTransform !== node) {
|
|
66
|
-
return fullTransform;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
return null;
|
|
71
|
-
|
|
72
|
-
} catch (error) {
|
|
73
|
-
log('Error in materialization advisory: %s', error);
|
|
74
|
-
// Don't fail optimization - just skip caching
|
|
75
|
-
return null;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Rule: Mutating Subquery Cache Injection
|
|
3
|
-
*
|
|
4
|
-
* Required Characteristics:
|
|
5
|
-
* - Node must be a join operation (JoinCapable interface)
|
|
6
|
-
* - Right side must contain operations with side effects (readonly=false)
|
|
7
|
-
* - Right side must not already be cached
|
|
8
|
-
*
|
|
9
|
-
* Applied When:
|
|
10
|
-
* - Join has mutating operations on right side that could be executed multiple times
|
|
11
|
-
*
|
|
12
|
-
* Benefits: Prevents mutating subqueries from being executed multiple times in nested loop joins
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import { createLogger } from '../../../common/logger.js';
|
|
16
|
-
import { PlanNode } from '../../nodes/plan-node.js';
|
|
17
|
-
import type { OptContext } from '../../framework/context.js';
|
|
18
|
-
import { CacheNode } from '../../nodes/cache-node.js';
|
|
19
|
-
import { JoinNode } from '../../nodes/join-node.js';
|
|
20
|
-
import { PlanNodeCharacteristics, CapabilityDetectors, CachingAnalysis, type JoinCapable } from '../../framework/characteristics.js';
|
|
21
|
-
|
|
22
|
-
const log = createLogger('optimizer:rule:mutating-subquery-cache');
|
|
23
|
-
|
|
24
|
-
export function ruleMutatingSubqueryCache(node: PlanNode, _context: OptContext): PlanNode | null {
|
|
25
|
-
// Guard: node must support join operations
|
|
26
|
-
if (!CapabilityDetectors.isJoin(node)) {
|
|
27
|
-
return null;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
log('Checking join operation for side effects on right side');
|
|
31
|
-
|
|
32
|
-
// Get join-specific characteristics
|
|
33
|
-
const joinNode = node as JoinCapable;
|
|
34
|
-
const rightSide = joinNode.getRightSource();
|
|
35
|
-
|
|
36
|
-
// Check if right side contains operations with side effects
|
|
37
|
-
const hasSideEffects = containsOperationsWithSideEffects(rightSide);
|
|
38
|
-
if (!hasSideEffects) {
|
|
39
|
-
log('Right side does not contain operations with side effects, skipping');
|
|
40
|
-
return null;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// Check if right side is already cached
|
|
44
|
-
if (CapabilityDetectors.isCached(rightSide) && rightSide.isCached()) {
|
|
45
|
-
log('Right side is already cached, skipping');
|
|
46
|
-
return null;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
log('Detected operations with side effects on right side of join, injecting cache');
|
|
50
|
-
|
|
51
|
-
// Calculate appropriate cache threshold using characteristics
|
|
52
|
-
const threshold = CachingAnalysis.getCacheThreshold(rightSide);
|
|
53
|
-
|
|
54
|
-
// Wrap the right side with a cache node
|
|
55
|
-
const cachedRightSide = new CacheNode(
|
|
56
|
-
rightSide.scope,
|
|
57
|
-
rightSide,
|
|
58
|
-
'memory',
|
|
59
|
-
threshold
|
|
60
|
-
);
|
|
61
|
-
|
|
62
|
-
// Create new join node with cached right side
|
|
63
|
-
// Note: We still need to use specific constructor since we don't have a generic join builder yet
|
|
64
|
-
const result = new JoinNode(
|
|
65
|
-
node.scope,
|
|
66
|
-
joinNode.getLeftSource(),
|
|
67
|
-
cachedRightSide,
|
|
68
|
-
joinNode.getJoinType(),
|
|
69
|
-
joinNode.getJoinCondition(),
|
|
70
|
-
// Special case: for JOINs, we also need to check if any of the join conditions
|
|
71
|
-
// reference columns from the mutating subquery (via USING clause)
|
|
72
|
-
joinNode.getUsingColumns()
|
|
73
|
-
);
|
|
74
|
-
|
|
75
|
-
log('Successfully injected cache for operations with side effects (threshold: %d)', threshold);
|
|
76
|
-
return result;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Recursively check if a plan tree contains operations with side effects
|
|
81
|
-
* Uses characteristics-based analysis instead of hard-coded node type checks
|
|
82
|
-
*/
|
|
83
|
-
function containsOperationsWithSideEffects(node: PlanNode): boolean {
|
|
84
|
-
// Check this node's characteristics
|
|
85
|
-
if (PlanNodeCharacteristics.hasSideEffects(node)) {
|
|
86
|
-
return true;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// Recursively check all children
|
|
90
|
-
for (const child of node.getChildren()) {
|
|
91
|
-
if (containsOperationsWithSideEffects(child)) {
|
|
92
|
-
return true;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// Check relational children if available (preserved for compatibility)
|
|
97
|
-
for (const relation of node.getRelations()) {
|
|
98
|
-
if (containsOperationsWithSideEffects(relation)) {
|
|
99
|
-
return true;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
return false;
|
|
104
|
-
}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { createLogger } from '../../../common/logger.js';
|
|
2
|
-
import type { PlanNode, RelationalPlanNode } from '../../nodes/plan-node.js';
|
|
3
|
-
import type { OptContext } from '../../framework/context.js';
|
|
4
|
-
import { JoinNode } from '../../nodes/join-node.js';
|
|
5
|
-
|
|
6
|
-
const log = createLogger('optimizer:rule:join-greedy-commute');
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Rule: Join Greedy Commute
|
|
10
|
-
*
|
|
11
|
-
* Simple heuristic: for INNER joins, prefer the smaller input on the left to drive nested-loop-like cost.
|
|
12
|
-
* This uses children estimatedRows (influenced by pushdown/growth) and swaps left/right when beneficial.
|
|
13
|
-
*
|
|
14
|
-
* Safety:
|
|
15
|
-
* - INNER joins are commutative; ColumnReferenceNode uses attribute IDs, so swapping sides preserves semantics.
|
|
16
|
-
* - We do NOT change associativity; we only commute immediate children of a JoinNode.
|
|
17
|
-
*/
|
|
18
|
-
export function ruleJoinGreedyCommute(node: PlanNode, _context: OptContext): PlanNode | null {
|
|
19
|
-
if (!(node instanceof JoinNode)) return null;
|
|
20
|
-
if (node.joinType !== 'inner' && node.joinType !== 'cross') return null;
|
|
21
|
-
|
|
22
|
-
const leftRows = node.getLeftSource().estimatedRows ?? Number.POSITIVE_INFINITY;
|
|
23
|
-
const rightRows = node.getRightSource().estimatedRows ?? Number.POSITIVE_INFINITY;
|
|
24
|
-
|
|
25
|
-
// Prefer known finite estimatedRows; also detect <=1 row driver on either side
|
|
26
|
-
const leftIsSingleton = node.getLeftSource().physical.uniqueKeys?.some(k => k.length === 0) === true;
|
|
27
|
-
const rightIsSingleton = node.getRightSource().physical.uniqueKeys?.some(k => k.length === 0) === true;
|
|
28
|
-
|
|
29
|
-
// If right is strictly better driver (smaller or singleton), swap
|
|
30
|
-
const shouldSwap = (rightIsSingleton && !leftIsSingleton) || (!rightIsSingleton && !leftIsSingleton && rightRows < leftRows);
|
|
31
|
-
if (!shouldSwap) return null;
|
|
32
|
-
|
|
33
|
-
log('Commuting join children to place smaller input on the left (leftRows=%s, rightRows=%s)', String(leftRows), String(rightRows));
|
|
34
|
-
|
|
35
|
-
// Swap children; condition stays the same (attribute IDs are stable)
|
|
36
|
-
const swapped = new JoinNode(
|
|
37
|
-
node.scope,
|
|
38
|
-
node.getRightSource() as RelationalPlanNode,
|
|
39
|
-
node.getLeftSource() as RelationalPlanNode,
|
|
40
|
-
node.getJoinType(),
|
|
41
|
-
node.getJoinCondition(),
|
|
42
|
-
node.getUsingColumns()
|
|
43
|
-
);
|
|
44
|
-
|
|
45
|
-
return swapped;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { createLogger } from '../../../common/logger.js';
|
|
2
|
-
import type { PlanNode } from '../../nodes/plan-node.js';
|
|
3
|
-
import type { OptContext } from '../../framework/context.js';
|
|
4
|
-
import { JoinNode } from '../../nodes/join-node.js';
|
|
5
|
-
import { BinaryOpNode } from '../../nodes/scalar.js';
|
|
6
|
-
import { ColumnReferenceNode } from '../../nodes/reference.js';
|
|
7
|
-
|
|
8
|
-
const log = createLogger('optimizer:rule:join-key-inference');
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Rule: Join Key Inference
|
|
12
|
-
*
|
|
13
|
-
* Detect simple equi-join predicates (left.col = right.pk) and propagate
|
|
14
|
-
* inner/cross join unique keys (already handled by JoinNode.computePhysical),
|
|
15
|
-
* with a hook for future FK->PK inference (not implemented here yet).
|
|
16
|
-
*/
|
|
17
|
-
export function ruleJoinKeyInference(node: PlanNode, _context: OptContext): PlanNode | null {
|
|
18
|
-
if (!(node instanceof JoinNode)) return null;
|
|
19
|
-
if (node.joinType !== 'inner' && node.joinType !== 'cross') return null;
|
|
20
|
-
|
|
21
|
-
const cond = node.getJoinCondition();
|
|
22
|
-
if (!cond || !(cond instanceof BinaryOpNode)) return null;
|
|
23
|
-
if (cond.expression.operator !== '=') return null;
|
|
24
|
-
|
|
25
|
-
// Simple left.col = right.col pattern check; placeholder for future FK->PK detection
|
|
26
|
-
const leftIsCol = cond.left instanceof ColumnReferenceNode;
|
|
27
|
-
const rightIsCol = cond.right instanceof ColumnReferenceNode;
|
|
28
|
-
if (!leftIsCol || !rightIsCol) return null;
|
|
29
|
-
|
|
30
|
-
log('Detected equi-join predicate; JoinNode.computePhysical will preserve side keys');
|
|
31
|
-
// No structural change needed now; computePhysical on JoinNode already preserves side keys
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
|