@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,293 +0,0 @@
|
|
|
1
|
-
import { PlanNodeType } from './plan-node-type.js';
|
|
2
|
-
import { PlanNode, type RelationalPlanNode, type UnaryRelationalNode, type ScalarPlanNode, type PhysicalProperties, type Attribute, isRelationalNode } from './plan-node.js';
|
|
3
|
-
import type { RelationType } from '../../common/datatype.js';
|
|
4
|
-
import type { Scope } from '../scopes/scope.js';
|
|
5
|
-
import { Cached } from '../../util/cached.js';
|
|
6
|
-
import { formatExpressionList } from '../../util/plan-formatter.js';
|
|
7
|
-
import { quereusError } from '../../common/errors.js';
|
|
8
|
-
import { StatusCode } from '../../common/types.js';
|
|
9
|
-
import type { ColumnReferenceNode } from './reference.js';
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Physical node representing a streaming aggregate operation.
|
|
13
|
-
* Requires input to be ordered by grouping columns.
|
|
14
|
-
*/
|
|
15
|
-
export class StreamAggregateNode extends PlanNode implements UnaryRelationalNode {
|
|
16
|
-
override readonly nodeType = PlanNodeType.StreamAggregate;
|
|
17
|
-
|
|
18
|
-
private attributesCache: Cached<Attribute[]>;
|
|
19
|
-
|
|
20
|
-
constructor(
|
|
21
|
-
scope: Scope,
|
|
22
|
-
public readonly source: RelationalPlanNode,
|
|
23
|
-
public readonly groupBy: readonly ScalarPlanNode[],
|
|
24
|
-
public readonly aggregates: readonly { expression: ScalarPlanNode; alias: string }[],
|
|
25
|
-
estimatedCostOverride?: number,
|
|
26
|
-
public readonly preserveAttributeIds?: readonly Attribute[]
|
|
27
|
-
) {
|
|
28
|
-
// Streaming aggregation is cheaper than hash aggregation
|
|
29
|
-
// Cost is linear in the number of input rows
|
|
30
|
-
const sourceRows = source.estimatedRows ?? 1000;
|
|
31
|
-
const streamingCost = sourceRows * 0.1; // Lower cost multiplier for streaming
|
|
32
|
-
|
|
33
|
-
super(scope, estimatedCostOverride ?? (source.getTotalCost() + streamingCost));
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
this.attributesCache = new Cached(() => this.buildAttributes());
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
private buildAttributes(): Attribute[] {
|
|
41
|
-
// If we have preserved attribute IDs, use them directly
|
|
42
|
-
// The optimizer rule now passes both aggregate AND source attributes
|
|
43
|
-
if (this.preserveAttributeIds) {
|
|
44
|
-
return this.preserveAttributeIds.slice();
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// Fallback: build attributes from scratch (used when not created via optimizer)
|
|
48
|
-
const attributes: Attribute[] = [];
|
|
49
|
-
|
|
50
|
-
// Group by columns come first
|
|
51
|
-
this.groupBy.forEach((expr, index) => {
|
|
52
|
-
const name = this.getGroupByColumnName(expr, index);
|
|
53
|
-
attributes.push({
|
|
54
|
-
id: PlanNode.nextAttrId(),
|
|
55
|
-
name,
|
|
56
|
-
type: expr.getType(),
|
|
57
|
-
sourceRelation: `${this.nodeType}:${this.id}`
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
// Then aggregate columns
|
|
62
|
-
this.aggregates.forEach((agg) => {
|
|
63
|
-
attributes.push({
|
|
64
|
-
id: PlanNode.nextAttrId(),
|
|
65
|
-
name: agg.alias,
|
|
66
|
-
type: agg.expression.getType(),
|
|
67
|
-
sourceRelation: `${this.nodeType}:${this.id}`
|
|
68
|
-
});
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
// Add source attributes to support HAVING clauses
|
|
72
|
-
const sourceAttributes = this.source.getAttributes();
|
|
73
|
-
const existingAttrNames = new Set(attributes.map(attr => attr.name));
|
|
74
|
-
|
|
75
|
-
for (const sourceAttr of sourceAttributes) {
|
|
76
|
-
// Only add if not already present by name (avoid duplicates for GROUP BY columns)
|
|
77
|
-
if (!existingAttrNames.has(sourceAttr.name)) {
|
|
78
|
-
attributes.push(sourceAttr);
|
|
79
|
-
existingAttrNames.add(sourceAttr.name);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
return attributes;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// Helper function to extract a meaningful name from a GROUP BY expression
|
|
87
|
-
private getGroupByColumnName(expr: ScalarPlanNode, index: number): string {
|
|
88
|
-
// If it's a column reference, use the column name
|
|
89
|
-
if (expr.nodeType === PlanNodeType.ColumnReference) {
|
|
90
|
-
const colRef = expr as ColumnReferenceNode;
|
|
91
|
-
return colRef.expression.name;
|
|
92
|
-
}
|
|
93
|
-
// Otherwise, use a generic name
|
|
94
|
-
return `group_${index}`;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
getType(): RelationType {
|
|
98
|
-
const columns = [];
|
|
99
|
-
|
|
100
|
-
// Start with preserved attributes if we have them, otherwise build GROUP BY + aggregates
|
|
101
|
-
if (this.preserveAttributeIds) {
|
|
102
|
-
// Use preserved attributes to match getAttributes() exactly
|
|
103
|
-
for (const attr of this.preserveAttributeIds) {
|
|
104
|
-
columns.push({
|
|
105
|
-
name: attr.name,
|
|
106
|
-
type: attr.type,
|
|
107
|
-
generated: false // Source attributes are not generated
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
} else {
|
|
111
|
-
// Group by columns come first
|
|
112
|
-
columns.push(...this.groupBy.map((expr, index) => ({
|
|
113
|
-
name: this.getGroupByColumnName(expr, index),
|
|
114
|
-
type: expr.getType(),
|
|
115
|
-
generated: false
|
|
116
|
-
})));
|
|
117
|
-
|
|
118
|
-
// Then aggregate columns
|
|
119
|
-
columns.push(...this.aggregates.map(agg => ({
|
|
120
|
-
name: agg.alias,
|
|
121
|
-
type: agg.expression.getType(),
|
|
122
|
-
generated: true
|
|
123
|
-
})));
|
|
124
|
-
|
|
125
|
-
// Add all source columns to support HAVING clauses (consistent with getAttributes())
|
|
126
|
-
const sourceType = this.source.getType();
|
|
127
|
-
const existingNames = new Set(columns.map(col => col.name));
|
|
128
|
-
|
|
129
|
-
for (const sourceCol of sourceType.columns) {
|
|
130
|
-
// Only add if not already present (avoid duplicates for GROUP BY columns)
|
|
131
|
-
if (!existingNames.has(sourceCol.name)) {
|
|
132
|
-
columns.push(sourceCol);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
return {
|
|
138
|
-
typeClass: 'relation',
|
|
139
|
-
columns,
|
|
140
|
-
// TODO: Infer keys based on DISTINCT and projection's effect on input keys
|
|
141
|
-
keys: [], // No keys for aggregate results
|
|
142
|
-
rowConstraints: [],
|
|
143
|
-
isReadOnly: true,
|
|
144
|
-
isSet: true // Aggregates produce sets (one row per unique group)
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
getAttributes(): Attribute[] {
|
|
149
|
-
return this.attributesCache.value;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
getProducingExprs(): Map<number, ScalarPlanNode> {
|
|
153
|
-
const attributes = this.getAttributes();
|
|
154
|
-
const map = new Map<number, ScalarPlanNode>();
|
|
155
|
-
|
|
156
|
-
// Map GROUP BY expressions to their attribute IDs
|
|
157
|
-
for (let i = 0; i < this.groupBy.length; i++) {
|
|
158
|
-
const expr = this.groupBy[i];
|
|
159
|
-
const attr = attributes[i];
|
|
160
|
-
if (attr) {
|
|
161
|
-
map.set(attr.id, expr);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
// Map aggregate expressions to their attribute IDs
|
|
166
|
-
for (let i = 0; i < this.aggregates.length; i++) {
|
|
167
|
-
const agg = this.aggregates[i];
|
|
168
|
-
const attr = attributes[this.groupBy.length + i]; // Aggregates come after GROUP BY
|
|
169
|
-
if (attr) {
|
|
170
|
-
map.set(attr.id, agg.expression);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
return map;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
getChildren(): readonly PlanNode[] {
|
|
178
|
-
return [this.source, ...this.groupBy, ...this.aggregates.map(agg => agg.expression)];
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
getRelations(): readonly [RelationalPlanNode] {
|
|
182
|
-
return [this.source];
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
get estimatedRows(): number | undefined {
|
|
186
|
-
const sourceRows = this.source.estimatedRows;
|
|
187
|
-
if (sourceRows === undefined) return undefined;
|
|
188
|
-
|
|
189
|
-
if (this.groupBy.length > 0) {
|
|
190
|
-
// For streaming aggregate, we assume groups are somewhat clustered
|
|
191
|
-
// so we estimate fewer groups than hash aggregate would
|
|
192
|
-
return Math.max(1, Math.floor(sourceRows / 10));
|
|
193
|
-
} else {
|
|
194
|
-
// No GROUP BY means single output row
|
|
195
|
-
return 1;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
computePhysical(_childrenPhysical: PhysicalProperties[]): Partial<PhysicalProperties> {
|
|
200
|
-
return {
|
|
201
|
-
estimatedRows: this.estimatedRows,
|
|
202
|
-
// Stream aggregate preserves ordering on GROUP BY columns
|
|
203
|
-
ordering: this.groupBy.length > 0 ?
|
|
204
|
-
this.groupBy.map((_, idx) => ({ column: idx, desc: false })) :
|
|
205
|
-
undefined,
|
|
206
|
-
// Aggregation creates unique keys on GROUP BY columns
|
|
207
|
-
uniqueKeys: this.groupBy.length > 0 ?
|
|
208
|
-
[this.groupBy.map((_, idx) => idx)] :
|
|
209
|
-
[[]], // Single row if no GROUP BY
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
override toString(): string {
|
|
214
|
-
const parts: string[] = [];
|
|
215
|
-
|
|
216
|
-
if (this.groupBy.length > 0) {
|
|
217
|
-
parts.push(`GROUP BY ${formatExpressionList(this.groupBy)}`);
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
if (this.aggregates.length > 0) {
|
|
221
|
-
const aggregatesStr = this.aggregates.map(agg =>
|
|
222
|
-
`${agg.expression.toString()} AS ${agg.alias}`
|
|
223
|
-
).join(', ');
|
|
224
|
-
parts.push(`STREAM AGG ${aggregatesStr}`);
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
return parts.join(' ');
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
override getLogicalAttributes(): Record<string, unknown> {
|
|
231
|
-
const props: Record<string, unknown> = {
|
|
232
|
-
implementation: 'streaming',
|
|
233
|
-
requiresOrdering: true
|
|
234
|
-
};
|
|
235
|
-
|
|
236
|
-
if (this.groupBy.length > 0) {
|
|
237
|
-
props.groupBy = this.groupBy.map(expr => expr.toString());
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
if (this.aggregates.length > 0) {
|
|
241
|
-
props.aggregates = this.aggregates.map(agg => ({
|
|
242
|
-
expression: agg.expression.toString(),
|
|
243
|
-
alias: agg.alias
|
|
244
|
-
}));
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
// Expose logical unique keys: group-by columns (0..groupCount-1) or [[]] for global aggregate
|
|
248
|
-
const groupCount = this.groupBy.length;
|
|
249
|
-
(props as any).uniqueKeys = groupCount > 0 ? [Array.from({ length: groupCount }, (_, i) => i)] : [[]];
|
|
250
|
-
return props;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
withChildren(newChildren: readonly PlanNode[]): PlanNode {
|
|
254
|
-
const expectedLength = 1 + this.groupBy.length + this.aggregates.length;
|
|
255
|
-
if (newChildren.length !== expectedLength) {
|
|
256
|
-
quereusError(`StreamAggregateNode expects ${expectedLength} children, got ${newChildren.length}`, StatusCode.INTERNAL);
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
const [newSource, ...restChildren] = newChildren;
|
|
260
|
-
const newGroupBy = restChildren.slice(0, this.groupBy.length);
|
|
261
|
-
const newAggregateExpressions = restChildren.slice(this.groupBy.length);
|
|
262
|
-
|
|
263
|
-
// Type check
|
|
264
|
-
if (!isRelationalNode(newSource)) {
|
|
265
|
-
quereusError('StreamAggregateNode: first child must be a RelationalPlanNode', StatusCode.INTERNAL);
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
// Check if anything changed
|
|
269
|
-
const sourceChanged = newSource !== this.source;
|
|
270
|
-
const groupByChanged = newGroupBy.some((expr, i) => expr !== this.groupBy[i]);
|
|
271
|
-
const aggregatesChanged = newAggregateExpressions.some((expr, i) => expr !== this.aggregates[i].expression);
|
|
272
|
-
|
|
273
|
-
if (!sourceChanged && !groupByChanged && !aggregatesChanged) {
|
|
274
|
-
return this;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
// Build new aggregates array
|
|
278
|
-
const newAggregates = newAggregateExpressions.map((expr, i) => ({
|
|
279
|
-
expression: expr as ScalarPlanNode,
|
|
280
|
-
alias: this.aggregates[i].alias
|
|
281
|
-
}));
|
|
282
|
-
|
|
283
|
-
// Create new instance preserving attribute IDs if they were preserved originally
|
|
284
|
-
return new StreamAggregateNode(
|
|
285
|
-
this.scope,
|
|
286
|
-
newSource as RelationalPlanNode,
|
|
287
|
-
newGroupBy as ScalarPlanNode[],
|
|
288
|
-
newAggregates,
|
|
289
|
-
undefined, // Let it recalculate cost
|
|
290
|
-
this.preserveAttributeIds // Preserve the original attribute IDs
|
|
291
|
-
);
|
|
292
|
-
}
|
|
293
|
-
}
|
|
@@ -1,268 +0,0 @@
|
|
|
1
|
-
import { PlanNode, type ScalarPlanNode } from "./plan-node.js";
|
|
2
|
-
import type { ScalarType } from "../../common/datatype.js";
|
|
3
|
-
import type { RelationalPlanNode } from "./plan-node.js";
|
|
4
|
-
import { type CompareFn } from "../../common/types.js";
|
|
5
|
-
import { PlanNodeType } from "./plan-node-type.js";
|
|
6
|
-
import type { Scope } from "../scopes/scope.js";
|
|
7
|
-
import { compareSqlValues } from "../../util/comparison.js";
|
|
8
|
-
import type { Expression } from "../../parser/ast.js";
|
|
9
|
-
import { formatExpression, formatScalarType } from "../../util/plan-formatter.js";
|
|
10
|
-
import { quereusError } from "../../common/errors.js";
|
|
11
|
-
import { BLOB_TYPE, BOOLEAN_TYPE, INTEGER_TYPE } from "../../types/builtin-types.js";
|
|
12
|
-
import { StatusCode } from "../../common/types.js";
|
|
13
|
-
|
|
14
|
-
export class ScalarSubqueryNode extends PlanNode implements ScalarPlanNode {
|
|
15
|
-
override readonly nodeType = PlanNodeType.ScalarSubquery;
|
|
16
|
-
|
|
17
|
-
constructor(
|
|
18
|
-
readonly scope: Scope,
|
|
19
|
-
readonly expression: Expression, // The original SubqueryExpr AST node
|
|
20
|
-
readonly subquery: RelationalPlanNode,
|
|
21
|
-
) {
|
|
22
|
-
super(scope);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
getType(): ScalarType {
|
|
26
|
-
// Scalar subqueries produce a single value, type depends on the subquery's first column
|
|
27
|
-
const subqueryType = this.subquery.getType();
|
|
28
|
-
if (subqueryType.typeClass === 'relation' && subqueryType.columns.length > 0) {
|
|
29
|
-
const firstColumn = subqueryType.columns[0];
|
|
30
|
-
return firstColumn.type;
|
|
31
|
-
}
|
|
32
|
-
// Fallback to nullable BLOB if we can't determine type
|
|
33
|
-
return {
|
|
34
|
-
typeClass: 'scalar',
|
|
35
|
-
logicalType: BLOB_TYPE,
|
|
36
|
-
nullable: true,
|
|
37
|
-
isReadOnly: true,
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
getChildren(): readonly PlanNode[] {
|
|
42
|
-
// Include the subquery so the optimizer can visit it
|
|
43
|
-
return [this.subquery];
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
getRelations(): readonly [RelationalPlanNode] {
|
|
47
|
-
return [this.subquery];
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
withChildren(newChildren: readonly PlanNode[]): PlanNode {
|
|
51
|
-
if (newChildren.length !== 1) {
|
|
52
|
-
quereusError(`ScalarSubqueryNode expects 1 child, got ${newChildren.length}`, StatusCode.INTERNAL);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const [newSubquery] = newChildren;
|
|
56
|
-
|
|
57
|
-
// Type check
|
|
58
|
-
if (newSubquery.getType().typeClass !== 'relation') {
|
|
59
|
-
quereusError('ScalarSubqueryNode: child must be a RelationalPlanNode', StatusCode.INTERNAL);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// Check if anything changed
|
|
63
|
-
if (newSubquery === this.subquery) {
|
|
64
|
-
return this;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// Create new instance
|
|
68
|
-
return new ScalarSubqueryNode(
|
|
69
|
-
this.scope,
|
|
70
|
-
this.expression,
|
|
71
|
-
newSubquery as RelationalPlanNode
|
|
72
|
-
);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
override toString(): string {
|
|
76
|
-
return `(subquery)`;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
override getLogicalAttributes(): Record<string, unknown> {
|
|
80
|
-
return {
|
|
81
|
-
subqueryType: 'scalar',
|
|
82
|
-
resultType: formatScalarType(this.getType()),
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
export class InNode extends PlanNode implements ScalarPlanNode {
|
|
88
|
-
override readonly nodeType = PlanNodeType.In;
|
|
89
|
-
|
|
90
|
-
public readonly comparator: CompareFn;
|
|
91
|
-
|
|
92
|
-
constructor(
|
|
93
|
-
readonly scope: Scope,
|
|
94
|
-
readonly expression: Expression, // The original InExpr AST node
|
|
95
|
-
readonly condition: ScalarPlanNode,
|
|
96
|
-
readonly source?: RelationalPlanNode, // For IN subquery
|
|
97
|
-
readonly values?: ScalarPlanNode[], // For IN value list
|
|
98
|
-
) {
|
|
99
|
-
super(scope);
|
|
100
|
-
this.comparator = (a, b) => compareSqlValues(a, b);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
getType(): ScalarType {
|
|
104
|
-
return {
|
|
105
|
-
typeClass: 'scalar',
|
|
106
|
-
logicalType: BOOLEAN_TYPE,
|
|
107
|
-
nullable: false,
|
|
108
|
-
isReadOnly: true,
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
getChildren(): readonly PlanNode[] {
|
|
113
|
-
// Include condition, values (if any), and source subquery (if any)
|
|
114
|
-
const children: PlanNode[] = [this.condition];
|
|
115
|
-
if (this.values) {
|
|
116
|
-
children.push(...this.values);
|
|
117
|
-
}
|
|
118
|
-
if (this.source) {
|
|
119
|
-
children.push(this.source);
|
|
120
|
-
}
|
|
121
|
-
return children;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
getRelations(): readonly RelationalPlanNode[] {
|
|
125
|
-
if (this.source) {
|
|
126
|
-
return [this.source];
|
|
127
|
-
}
|
|
128
|
-
return [];
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
withChildren(newChildren: readonly PlanNode[]): PlanNode {
|
|
132
|
-
const expectedLength = 1 + (this.values?.length ?? 0) + (this.source ? 1 : 0);
|
|
133
|
-
if (newChildren.length !== expectedLength) {
|
|
134
|
-
quereusError(`InNode expects ${expectedLength} children, got ${newChildren.length}`, StatusCode.INTERNAL);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
let childIndex = 0;
|
|
138
|
-
const newCondition = newChildren[childIndex++];
|
|
139
|
-
|
|
140
|
-
// Type check condition
|
|
141
|
-
if (newCondition.getType().typeClass !== 'scalar') {
|
|
142
|
-
quereusError('InNode: condition must be a ScalarPlanNode', StatusCode.INTERNAL);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// Extract new values if they exist
|
|
146
|
-
let newValues: ScalarPlanNode[] | undefined;
|
|
147
|
-
if (this.values) {
|
|
148
|
-
newValues = [];
|
|
149
|
-
for (let i = 0; i < this.values.length; i++) {
|
|
150
|
-
const value = newChildren[childIndex++];
|
|
151
|
-
if (value.getType().typeClass !== 'scalar') {
|
|
152
|
-
quereusError('InNode: values must be ScalarPlanNodes', StatusCode.INTERNAL);
|
|
153
|
-
}
|
|
154
|
-
newValues.push(value as ScalarPlanNode);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// Extract new source if it exists
|
|
159
|
-
let newSource: RelationalPlanNode | undefined;
|
|
160
|
-
if (this.source) {
|
|
161
|
-
newSource = newChildren[childIndex++] as RelationalPlanNode;
|
|
162
|
-
if (newSource.getType().typeClass !== 'relation') {
|
|
163
|
-
quereusError('InNode: source must be a RelationalPlanNode', StatusCode.INTERNAL);
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
// Check if anything changed
|
|
168
|
-
const conditionChanged = newCondition !== this.condition;
|
|
169
|
-
const valuesChanged = this.values && newValues && newValues.some((val, i) => val !== this.values![i]);
|
|
170
|
-
const sourceChanged = newSource !== this.source;
|
|
171
|
-
|
|
172
|
-
if (!conditionChanged && !valuesChanged && !sourceChanged) {
|
|
173
|
-
return this;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
// Create new instance
|
|
177
|
-
return new InNode(
|
|
178
|
-
this.scope,
|
|
179
|
-
this.expression,
|
|
180
|
-
newCondition as ScalarPlanNode,
|
|
181
|
-
newSource,
|
|
182
|
-
newValues
|
|
183
|
-
);
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
override toString(): string {
|
|
187
|
-
if (this.source) {
|
|
188
|
-
return `${formatExpression(this.condition)} IN (subquery)`;
|
|
189
|
-
} else {
|
|
190
|
-
return `${formatExpression(this.condition)} IN (values)`;
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
override getLogicalAttributes(): Record<string, unknown> {
|
|
195
|
-
return {
|
|
196
|
-
condition: formatExpression(this.condition),
|
|
197
|
-
subqueryType: this.source ? 'subquery' : 'values',
|
|
198
|
-
valueCount: this.values?.length,
|
|
199
|
-
resultType: formatScalarType(this.getType())
|
|
200
|
-
};
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
export class ExistsNode extends PlanNode implements ScalarPlanNode {
|
|
205
|
-
override readonly nodeType = PlanNodeType.Exists;
|
|
206
|
-
|
|
207
|
-
constructor(
|
|
208
|
-
readonly scope: Scope,
|
|
209
|
-
readonly expression: Expression, // The original ExistsExpr AST node
|
|
210
|
-
readonly subquery: RelationalPlanNode,
|
|
211
|
-
) {
|
|
212
|
-
super(scope);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
getType(): ScalarType {
|
|
216
|
-
return {
|
|
217
|
-
typeClass: 'scalar',
|
|
218
|
-
logicalType: BOOLEAN_TYPE,
|
|
219
|
-
nullable: false,
|
|
220
|
-
isReadOnly: true,
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
getChildren(): readonly PlanNode[] {
|
|
225
|
-
// Include the subquery so the optimizer can visit it
|
|
226
|
-
return [this.subquery];
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
getRelations(): readonly RelationalPlanNode[] {
|
|
230
|
-
return [this.subquery];
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
withChildren(newChildren: readonly PlanNode[]): PlanNode {
|
|
234
|
-
if (newChildren.length !== 1) {
|
|
235
|
-
quereusError(`ExistsNode expects 1 child, got ${newChildren.length}`, StatusCode.INTERNAL);
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
const [newSubquery] = newChildren;
|
|
239
|
-
|
|
240
|
-
// Type check
|
|
241
|
-
if (newSubquery.getType().typeClass !== 'relation') {
|
|
242
|
-
quereusError('ExistsNode: child must be a RelationalPlanNode', StatusCode.INTERNAL);
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
// Check if anything changed
|
|
246
|
-
if (newSubquery === this.subquery) {
|
|
247
|
-
return this;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
// Create new instance
|
|
251
|
-
return new ExistsNode(
|
|
252
|
-
this.scope,
|
|
253
|
-
this.expression,
|
|
254
|
-
newSubquery as RelationalPlanNode
|
|
255
|
-
);
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
override toString(): string {
|
|
259
|
-
return `EXISTS (subquery)`;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
override getLogicalAttributes(): Record<string, unknown> {
|
|
263
|
-
return {
|
|
264
|
-
subqueryType: 'exists',
|
|
265
|
-
resultType: formatScalarType(this.getType()),
|
|
266
|
-
};
|
|
267
|
-
}
|
|
268
|
-
}
|