@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,337 +0,0 @@
|
|
|
1
|
-
import { PlanNodeType } from './plan-node-type.js';
|
|
2
|
-
import { PlanNode, type RelationalPlanNode, type UnaryRelationalNode, type ScalarPlanNode, 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 { projectKeys } from '../util/key-utils.js';
|
|
7
|
-
import { expressionToString } from '../../util/ast-stringify.js';
|
|
8
|
-
import { formatProjection } from '../../util/plan-formatter.js';
|
|
9
|
-
import { ColumnReferenceNode } from './reference.js';
|
|
10
|
-
import { quereusError } from '../../common/errors.js';
|
|
11
|
-
import { StatusCode } from '../../common/types.js';
|
|
12
|
-
import { ProjectionCapable } from '../framework/characteristics.js';
|
|
13
|
-
import type { PhysicalProperties } from './plan-node.js';
|
|
14
|
-
|
|
15
|
-
export interface Projection {
|
|
16
|
-
node: ScalarPlanNode;
|
|
17
|
-
alias?: string;
|
|
18
|
-
/** Optional predefined attribute ID to preserve during optimization */
|
|
19
|
-
attributeId?: number;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Represents a projection operation (SELECT list) without DISTINCT.
|
|
24
|
-
* It takes an input relation and outputs a new relation with specified columns/expressions.
|
|
25
|
-
*/
|
|
26
|
-
export class ProjectNode extends PlanNode implements UnaryRelationalNode, ProjectionCapable {
|
|
27
|
-
override readonly nodeType = PlanNodeType.Project;
|
|
28
|
-
|
|
29
|
-
private outputTypeCache: Cached<RelationType>;
|
|
30
|
-
private attributesCache: Cached<readonly Attribute[]>;
|
|
31
|
-
|
|
32
|
-
constructor(
|
|
33
|
-
scope: Scope,
|
|
34
|
-
public readonly source: RelationalPlanNode,
|
|
35
|
-
public readonly projections: ReadonlyArray<Projection>,
|
|
36
|
-
estimatedCostOverride?: number,
|
|
37
|
-
/** Optional predefined attributes for preserving IDs during optimization */
|
|
38
|
-
predefinedAttributes?: readonly Attribute[],
|
|
39
|
-
/** Whether to preserve input columns in the output (default: true) */
|
|
40
|
-
public readonly preserveInputColumns: boolean = true
|
|
41
|
-
) {
|
|
42
|
-
super(scope, estimatedCostOverride);
|
|
43
|
-
|
|
44
|
-
const sourceType = this.source.getType();
|
|
45
|
-
|
|
46
|
-
this.outputTypeCache = new Cached(() => {
|
|
47
|
-
// Build column names with proper duplicate handling
|
|
48
|
-
const columnNames: string[] = [];
|
|
49
|
-
const nameCount = new Map<string, number>();
|
|
50
|
-
|
|
51
|
-
const columns = this.projections.map((proj) => {
|
|
52
|
-
// Determine base column name
|
|
53
|
-
let baseName: string;
|
|
54
|
-
if (proj.alias) {
|
|
55
|
-
baseName = proj.alias;
|
|
56
|
-
} else if (proj.node instanceof ColumnReferenceNode) {
|
|
57
|
-
// For column references, use the unqualified column name
|
|
58
|
-
baseName = proj.node.expression.name;
|
|
59
|
-
} else {
|
|
60
|
-
// For expressions, use the string representation
|
|
61
|
-
baseName = expressionToString(proj.node.expression);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// Handle duplicate names
|
|
65
|
-
let finalName: string;
|
|
66
|
-
const currentCount = nameCount.get(baseName) || 0;
|
|
67
|
-
if (currentCount === 0) {
|
|
68
|
-
// First occurrence - use the base name
|
|
69
|
-
finalName = baseName;
|
|
70
|
-
} else {
|
|
71
|
-
// Subsequent occurrences - add numbered suffix
|
|
72
|
-
finalName = `${baseName}:${currentCount}`;
|
|
73
|
-
}
|
|
74
|
-
nameCount.set(baseName, currentCount + 1);
|
|
75
|
-
columnNames.push(finalName);
|
|
76
|
-
|
|
77
|
-
return {
|
|
78
|
-
name: finalName,
|
|
79
|
-
type: proj.node.getType(),
|
|
80
|
-
generated: proj.node.nodeType !== PlanNodeType.ColumnReference,
|
|
81
|
-
};
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
return {
|
|
85
|
-
typeClass: 'relation',
|
|
86
|
-
isReadOnly: sourceType.isReadOnly,
|
|
87
|
-
isSet: sourceType.isSet,
|
|
88
|
-
columns,
|
|
89
|
-
keys: (() => {
|
|
90
|
-
// Build source->output index map for simple column references
|
|
91
|
-
const map = new Map<number, number>();
|
|
92
|
-
this.projections.forEach((proj, outIdx) => {
|
|
93
|
-
if (proj.node instanceof ColumnReferenceNode) {
|
|
94
|
-
const colRef = proj.node as ColumnReferenceNode;
|
|
95
|
-
const srcIndex = this.source.getAttributes().findIndex(a => a.id === colRef.attributeId);
|
|
96
|
-
if (srcIndex >= 0) map.set(srcIndex, outIdx);
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
return projectKeys(sourceType.keys, map);
|
|
100
|
-
})(),
|
|
101
|
-
// TODO: propagate row constraints that don't have projected off columns
|
|
102
|
-
rowConstraints: [],
|
|
103
|
-
} satisfies RelationType;
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
this.attributesCache = new Cached(() => {
|
|
107
|
-
// If predefined attributes are provided, use them (for optimization)
|
|
108
|
-
if (predefinedAttributes) {
|
|
109
|
-
return predefinedAttributes;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// Get the computed column names from the type
|
|
113
|
-
const outputType = this.getType();
|
|
114
|
-
|
|
115
|
-
// If preserveInputColumns is false, only create attributes for projections
|
|
116
|
-
if (!this.preserveInputColumns) {
|
|
117
|
-
return this.projections.map((proj, index) => ({
|
|
118
|
-
id: proj.attributeId ?? PlanNode.nextAttrId(),
|
|
119
|
-
name: outputType.columns[index].name,
|
|
120
|
-
type: proj.node.getType(),
|
|
121
|
-
sourceRelation: `${this.nodeType}:${this.id}`,
|
|
122
|
-
relationName: 'projection'
|
|
123
|
-
}));
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// For each projection, preserve attribute ID for simple column references
|
|
127
|
-
return this.projections.map((proj, index) => {
|
|
128
|
-
// Use predefined attribute ID if supplied (optimizer path)
|
|
129
|
-
if (proj.attributeId !== undefined) {
|
|
130
|
-
return {
|
|
131
|
-
id: proj.attributeId,
|
|
132
|
-
name: outputType.columns[index].name,
|
|
133
|
-
type: proj.node.getType(),
|
|
134
|
-
sourceRelation: `${this.nodeType}:${this.id}`,
|
|
135
|
-
relationName: 'projection'
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
if (proj.node instanceof ColumnReferenceNode) {
|
|
140
|
-
// Always preserve the original attribute ID so that any reference
|
|
141
|
-
// to the underlying column (e.g., in ORDER BY) remains valid even
|
|
142
|
-
// after aliasing. The alias is purely a name change, not a new column.
|
|
143
|
-
const colRef = proj.node as ColumnReferenceNode;
|
|
144
|
-
return {
|
|
145
|
-
id: colRef.attributeId,
|
|
146
|
-
name: outputType.columns[index].name,
|
|
147
|
-
type: proj.node.getType(),
|
|
148
|
-
sourceRelation: `${this.nodeType}:${this.id}`,
|
|
149
|
-
relationName: 'projection'
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// Computed expression or aliased column – generate fresh attribute ID
|
|
154
|
-
return {
|
|
155
|
-
id: PlanNode.nextAttrId(),
|
|
156
|
-
name: outputType.columns[index].name,
|
|
157
|
-
type: proj.node.getType(),
|
|
158
|
-
sourceRelation: `${this.nodeType}:${this.id}`,
|
|
159
|
-
relationName: 'projection'
|
|
160
|
-
};
|
|
161
|
-
});
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
computePhysical(childrenPhysical: PhysicalProperties[]): Partial<PhysicalProperties> {
|
|
166
|
-
const sourcePhysical = childrenPhysical[0];
|
|
167
|
-
// Build mapping from source index -> projected index for ColumnReferences
|
|
168
|
-
const map = new Map<number, number>();
|
|
169
|
-
const sourceAttrs = this.source.getAttributes();
|
|
170
|
-
this.projections.forEach((proj, outIdx) => {
|
|
171
|
-
if (proj.node instanceof ColumnReferenceNode) {
|
|
172
|
-
const colRef = proj.node as ColumnReferenceNode;
|
|
173
|
-
const srcIndex = sourceAttrs.findIndex(a => a.id === colRef.attributeId);
|
|
174
|
-
if (srcIndex >= 0) map.set(srcIndex, outIdx);
|
|
175
|
-
}
|
|
176
|
-
});
|
|
177
|
-
const uniqueKeys = (sourcePhysical?.uniqueKeys || [])
|
|
178
|
-
.map(key => {
|
|
179
|
-
const projected: number[] = [];
|
|
180
|
-
for (const col of key) {
|
|
181
|
-
const outIdx = map.get(col);
|
|
182
|
-
if (outIdx === undefined) return null;
|
|
183
|
-
projected.push(outIdx);
|
|
184
|
-
}
|
|
185
|
-
return projected;
|
|
186
|
-
})
|
|
187
|
-
.filter((k): k is number[] => k !== null);
|
|
188
|
-
return {
|
|
189
|
-
estimatedRows: this.source.estimatedRows,
|
|
190
|
-
ordering: sourcePhysical?.ordering,
|
|
191
|
-
uniqueKeys,
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
getType(): RelationType {
|
|
196
|
-
return this.outputTypeCache.value;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
getAttributes(): readonly Attribute[] {
|
|
200
|
-
return this.attributesCache.value;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
getProducingExprs(): Map<number, ScalarPlanNode> {
|
|
204
|
-
const attributes = this.getAttributes();
|
|
205
|
-
const map = new Map<number, ScalarPlanNode>();
|
|
206
|
-
|
|
207
|
-
for (let i = 0; i < this.projections.length; i++) {
|
|
208
|
-
const proj = this.projections[i];
|
|
209
|
-
const attr = attributes[i];
|
|
210
|
-
if (attr) {
|
|
211
|
-
map.set(attr.id, proj.node);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
return map;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
getChildren(): readonly PlanNode[] {
|
|
219
|
-
return [this.source, ...this.projections.map(p => p.node)];
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
getRelations(): readonly [RelationalPlanNode] {
|
|
223
|
-
return [this.source];
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
get estimatedRows(): number | undefined {
|
|
227
|
-
return this.source.estimatedRows; // Projection doesn't change row count - use DistinctNode to handle DISTINCT
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
override toString(): string {
|
|
231
|
-
const projectionStrings = this.projections.map(p =>
|
|
232
|
-
formatProjection(p.node, p.alias)
|
|
233
|
-
).join(', ');
|
|
234
|
-
return `SELECT ${projectionStrings}`;
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
override getLogicalAttributes(): Record<string, unknown> {
|
|
238
|
-
return {
|
|
239
|
-
projectionCount: this.projections.length,
|
|
240
|
-
uniqueKeys: this.getType().keys.map(k => k.map(ref => ref.index)),
|
|
241
|
-
projections: this.projections.map(p => ({
|
|
242
|
-
expression: expressionToString(p.node.expression),
|
|
243
|
-
alias: p.alias
|
|
244
|
-
}))
|
|
245
|
-
};
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
withChildren(newChildren: readonly PlanNode[]): PlanNode {
|
|
249
|
-
if (newChildren.length !== 1 + this.projections.length) {
|
|
250
|
-
quereusError(`ProjectNode expects ${1 + this.projections.length} children, got ${newChildren.length}`, StatusCode.INTERNAL);
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
const [newSource, ...newProjectionNodes] = newChildren;
|
|
254
|
-
|
|
255
|
-
// Type check
|
|
256
|
-
if (!isRelationalNode(newSource)) {
|
|
257
|
-
quereusError('ProjectNode: first child must be a RelationalPlanNode', StatusCode.INTERNAL);
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
// Check if anything changed
|
|
261
|
-
const sourceChanged = newSource !== this.source;
|
|
262
|
-
const projectionsChanged = newProjectionNodes.some((node, i) => node !== this.projections[i].node);
|
|
263
|
-
|
|
264
|
-
if (!sourceChanged && !projectionsChanged) {
|
|
265
|
-
return this;
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
// **CRITICAL**: Preserve original attribute IDs to maintain column reference stability
|
|
269
|
-
const originalAttributes = this.getAttributes();
|
|
270
|
-
|
|
271
|
-
// Build new projections array with preserved attribute IDs
|
|
272
|
-
const newProjections = newProjectionNodes.map((node, i) => ({
|
|
273
|
-
node: node as ScalarPlanNode,
|
|
274
|
-
alias: this.projections[i].alias,
|
|
275
|
-
attributeId: originalAttributes[i].id // Preserve original attribute ID
|
|
276
|
-
}));
|
|
277
|
-
|
|
278
|
-
// Create new instance with predefined attributes
|
|
279
|
-
return new ProjectNode(
|
|
280
|
-
this.scope,
|
|
281
|
-
newSource as RelationalPlanNode,
|
|
282
|
-
newProjections,
|
|
283
|
-
undefined, // estimatedCostOverride
|
|
284
|
-
originalAttributes, // Pass original attributes to preserve IDs
|
|
285
|
-
this.preserveInputColumns // Preserve the flag
|
|
286
|
-
);
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
// ProjectionCapable interface implementation
|
|
290
|
-
getProjections(): readonly { node: ScalarPlanNode; alias: string; attributeId: number }[] {
|
|
291
|
-
const attributes = this.getAttributes();
|
|
292
|
-
return this.projections.map((proj, index) => ({
|
|
293
|
-
node: proj.node,
|
|
294
|
-
alias: proj.alias || attributes[index].name,
|
|
295
|
-
attributeId: attributes[index].id
|
|
296
|
-
}));
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
withProjections(projections: readonly { node: ScalarPlanNode; alias: string; attributeId: number }[]): PlanNode {
|
|
300
|
-
// Convert to internal Projection format
|
|
301
|
-
const newProjections = projections.map(proj => ({
|
|
302
|
-
node: proj.node,
|
|
303
|
-
alias: proj.alias,
|
|
304
|
-
attributeId: proj.attributeId
|
|
305
|
-
}));
|
|
306
|
-
|
|
307
|
-
// Check if anything changed
|
|
308
|
-
const changed = newProjections.length !== this.projections.length ||
|
|
309
|
-
newProjections.some((proj, i) =>
|
|
310
|
-
proj.node !== this.projections[i].node ||
|
|
311
|
-
proj.alias !== this.projections[i].alias ||
|
|
312
|
-
proj.attributeId !== this.projections[i].attributeId
|
|
313
|
-
);
|
|
314
|
-
|
|
315
|
-
if (!changed) {
|
|
316
|
-
return this;
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
// Create predefined attributes from the new projections
|
|
320
|
-
const predefinedAttributes = projections.map(proj => ({
|
|
321
|
-
id: proj.attributeId,
|
|
322
|
-
name: proj.alias,
|
|
323
|
-
type: proj.node.getType(),
|
|
324
|
-
sourceRelation: `${this.nodeType}:${this.id}`,
|
|
325
|
-
relationName: 'projection'
|
|
326
|
-
}));
|
|
327
|
-
|
|
328
|
-
return new ProjectNode(
|
|
329
|
-
this.scope,
|
|
330
|
-
this.source,
|
|
331
|
-
newProjections,
|
|
332
|
-
undefined, // estimatedCostOverride
|
|
333
|
-
predefinedAttributes,
|
|
334
|
-
this.preserveInputColumns
|
|
335
|
-
);
|
|
336
|
-
}
|
|
337
|
-
}
|
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
import { PlanNode, type RelationalPlanNode, type Attribute, type TableDescriptor, isRelationalNode } from './plan-node.js';
|
|
2
|
-
import type { RelationType } from '../../common/datatype.js';
|
|
3
|
-
import { PlanNodeType } from './plan-node-type.js';
|
|
4
|
-
import type { Scope } from '../scopes/scope.js';
|
|
5
|
-
import { Cached } from '../../util/cached.js';
|
|
6
|
-
import type { CTEPlanNode, CTEScopeNode } from './cte-node.js';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Plan node for Recursive Common Table Expressions.
|
|
10
|
-
* This handles the special structure of recursive CTEs with base and recursive cases.
|
|
11
|
-
*/
|
|
12
|
-
export class RecursiveCTENode extends PlanNode implements CTEPlanNode, CTEScopeNode {
|
|
13
|
-
readonly nodeType = PlanNodeType.RecursiveCTE;
|
|
14
|
-
readonly isRecursive = true; // Always true for recursive CTEs
|
|
15
|
-
readonly tableDescriptor: TableDescriptor;
|
|
16
|
-
|
|
17
|
-
private attributesCache: Cached<Attribute[]>;
|
|
18
|
-
private typeCache: Cached<RelationType>;
|
|
19
|
-
private _recursiveCaseQuery: RelationalPlanNode;
|
|
20
|
-
|
|
21
|
-
constructor(
|
|
22
|
-
scope: Scope,
|
|
23
|
-
public readonly cteName: string,
|
|
24
|
-
public readonly columns: string[] | undefined,
|
|
25
|
-
public readonly baseCaseQuery: RelationalPlanNode,
|
|
26
|
-
recursiveCaseQuery: RelationalPlanNode,
|
|
27
|
-
public readonly isUnionAll: boolean,
|
|
28
|
-
public readonly materializationHint: 'materialized' | 'not_materialized' | undefined = 'materialized',
|
|
29
|
-
public readonly maxRecursion?: number,
|
|
30
|
-
tableDescriptor?: TableDescriptor
|
|
31
|
-
) {
|
|
32
|
-
super(scope, baseCaseQuery.getTotalCost() + recursiveCaseQuery.getTotalCost() + 50); // Higher cost for recursion
|
|
33
|
-
this._recursiveCaseQuery = recursiveCaseQuery;
|
|
34
|
-
this.tableDescriptor = tableDescriptor || {}; // Identity object for table context lookup
|
|
35
|
-
this.attributesCache = new Cached(() => this.buildAttributes());
|
|
36
|
-
this.typeCache = new Cached(() => this.buildType());
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
get recursiveCaseQuery(): RelationalPlanNode {
|
|
40
|
-
return this._recursiveCaseQuery;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Sets the recursive case query after construction.
|
|
45
|
-
* This is needed to handle the circular dependency during planning.
|
|
46
|
-
*/
|
|
47
|
-
setRecursiveCaseQuery(query: RelationalPlanNode): void {
|
|
48
|
-
this._recursiveCaseQuery = query;
|
|
49
|
-
// Clear caches since they might depend on the recursive case
|
|
50
|
-
this.attributesCache = new Cached(() => this.buildAttributes());
|
|
51
|
-
this.typeCache = new Cached(() => this.buildType());
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
private buildAttributes(): Attribute[] {
|
|
55
|
-
// Use the base case query's attributes as the template
|
|
56
|
-
const baseCaseAttributes = this.baseCaseQuery.getAttributes();
|
|
57
|
-
|
|
58
|
-
// Use explicit column names if provided, otherwise use base case column names
|
|
59
|
-
const baseCaseType = this.baseCaseQuery.getType();
|
|
60
|
-
const columnNames = this.columns || baseCaseType.columns.map((c) => c.name);
|
|
61
|
-
|
|
62
|
-
return baseCaseAttributes.map((attr, index) => ({
|
|
63
|
-
id: attr.id, // Preserve original attribute ID for proper context resolution
|
|
64
|
-
name: columnNames[index] || attr.name,
|
|
65
|
-
type: attr.type,
|
|
66
|
-
sourceRelation: `recursive_cte:${this.cteName}`
|
|
67
|
-
}));
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
private buildType(): RelationType {
|
|
71
|
-
return {
|
|
72
|
-
typeClass: 'relation',
|
|
73
|
-
isReadOnly: false,
|
|
74
|
-
isSet: false, // Recursive CTEs can generate duplicates
|
|
75
|
-
columns: this.getAttributes().map((attr) => ({
|
|
76
|
-
name: attr.name,
|
|
77
|
-
type: attr.type
|
|
78
|
-
})),
|
|
79
|
-
keys: [], // Recursive CTEs don't have inherent keys
|
|
80
|
-
rowConstraints: []
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
getAttributes(): Attribute[] {
|
|
85
|
-
return this.attributesCache.value;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
getType(): RelationType {
|
|
89
|
-
return this.typeCache.value;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
getChildren(): readonly [RelationalPlanNode, RelationalPlanNode] {
|
|
93
|
-
return [this.baseCaseQuery, this.recursiveCaseQuery];
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// For recursive CTEs, we consider the base case as the primary source
|
|
97
|
-
get source(): RelationalPlanNode {
|
|
98
|
-
return this.baseCaseQuery;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
getRelations(): readonly [RelationalPlanNode] {
|
|
102
|
-
return [this.baseCaseQuery];
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
withChildren(newChildren: readonly PlanNode[]): PlanNode {
|
|
106
|
-
if (newChildren.length !== 2) {
|
|
107
|
-
throw new Error(`RecursiveCTENode expects 2 children, got ${newChildren.length}`);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
const [newBaseCaseQuery, newRecursiveCaseQuery] = newChildren;
|
|
111
|
-
|
|
112
|
-
// Type check
|
|
113
|
-
if (!isRelationalNode(newBaseCaseQuery) || !isRelationalNode(newRecursiveCaseQuery)) {
|
|
114
|
-
throw new Error('RecursiveCTENode: children must be RelationalPlanNodes');
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// Return same instance if nothing changed
|
|
118
|
-
if (newBaseCaseQuery === this.baseCaseQuery && newRecursiveCaseQuery === this.recursiveCaseQuery) {
|
|
119
|
-
return this;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// Create new instance with updated children
|
|
123
|
-
const newNode = new RecursiveCTENode(
|
|
124
|
-
this.scope,
|
|
125
|
-
this.cteName,
|
|
126
|
-
this.columns,
|
|
127
|
-
newBaseCaseQuery as RelationalPlanNode,
|
|
128
|
-
newRecursiveCaseQuery as RelationalPlanNode,
|
|
129
|
-
this.isUnionAll,
|
|
130
|
-
this.materializationHint,
|
|
131
|
-
this.maxRecursion,
|
|
132
|
-
this.tableDescriptor
|
|
133
|
-
);
|
|
134
|
-
|
|
135
|
-
return newNode;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
override toString(): string {
|
|
139
|
-
const recursiveText = 'RECURSIVE ';
|
|
140
|
-
const columnsText = this.columns ? `(${this.columns.join(', ')})` : '';
|
|
141
|
-
const unionText = this.isUnionAll ? 'UNION ALL' : 'UNION';
|
|
142
|
-
const materializationText = this.materializationHint ? ` ${this.materializationHint.toUpperCase()}` : '';
|
|
143
|
-
return `${recursiveText}CTE ${this.cteName}${columnsText} [${unionText}]${materializationText}`;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
override getLogicalAttributes(): Record<string, unknown> {
|
|
147
|
-
return {
|
|
148
|
-
cteName: this.cteName,
|
|
149
|
-
columns: this.columns,
|
|
150
|
-
isUnionAll: this.isUnionAll,
|
|
151
|
-
materializationHint: this.materializationHint,
|
|
152
|
-
isRecursive: true,
|
|
153
|
-
maxRecursion: this.maxRecursion,
|
|
154
|
-
baseCaseType: this.baseCaseQuery.getType(),
|
|
155
|
-
recursiveCaseType: this.recursiveCaseQuery.getType()
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
}
|