@quereus/quereus 0.7.3 → 0.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +3 -3
- package/dist/src/common/constants.js.map +0 -1
- package/dist/src/common/datatype.js.map +0 -1
- package/dist/src/common/errors.js.map +0 -1
- package/dist/src/common/json-types.js.map +0 -1
- package/dist/src/common/logger.js.map +0 -1
- package/dist/src/common/type-inference.js.map +0 -1
- package/dist/src/common/types.js.map +0 -1
- package/dist/src/core/database-options.js.map +0 -1
- package/dist/src/core/database.js.map +0 -1
- package/dist/src/core/param.js.map +0 -1
- package/dist/src/core/statement.js.map +0 -1
- package/dist/src/func/builtins/aggregate.js.map +0 -1
- package/dist/src/func/builtins/builtin-window-functions.js.map +0 -1
- package/dist/src/func/builtins/conversion.js.map +0 -1
- package/dist/src/func/builtins/datetime.js.map +0 -1
- package/dist/src/func/builtins/explain.js.map +0 -1
- package/dist/src/func/builtins/generation.js.map +0 -1
- package/dist/src/func/builtins/index.js.map +0 -1
- package/dist/src/func/builtins/json-helpers.js.map +0 -1
- package/dist/src/func/builtins/json-tvf.js.map +0 -1
- package/dist/src/func/builtins/json.js.map +0 -1
- package/dist/src/func/builtins/scalar.js.map +0 -1
- package/dist/src/func/builtins/schema.js.map +0 -1
- package/dist/src/func/builtins/string.js.map +0 -1
- package/dist/src/func/builtins/timespan.js.map +0 -1
- package/dist/src/func/context.js.map +0 -1
- package/dist/src/func/registration.js.map +0 -1
- package/dist/src/index.js.map +0 -1
- package/dist/src/parser/ast.js.map +0 -1
- package/dist/src/parser/index.js.map +0 -1
- package/dist/src/parser/lexer.js.map +0 -1
- package/dist/src/parser/parser.js.map +0 -1
- package/dist/src/parser/utils.js.map +0 -1
- package/dist/src/parser/visitor.js.map +0 -1
- package/dist/src/planner/analysis/binding-collector.js.map +0 -1
- package/dist/src/planner/analysis/const-evaluator.js.map +0 -1
- package/dist/src/planner/analysis/const-pass.js.map +0 -1
- package/dist/src/planner/analysis/constraint-extractor.js.map +0 -1
- package/dist/src/planner/analysis/predicate-normalizer.js.map +0 -1
- package/dist/src/planner/building/alter-table.js.map +0 -1
- package/dist/src/planner/building/block.js.map +0 -1
- package/dist/src/planner/building/constraint-builder.js.map +0 -1
- package/dist/src/planner/building/create-assertion.js.map +0 -1
- package/dist/src/planner/building/create-view.js.map +0 -1
- package/dist/src/planner/building/ddl.js.map +0 -1
- package/dist/src/planner/building/declare-schema.js.map +0 -1
- package/dist/src/planner/building/delete.js.map +0 -1
- package/dist/src/planner/building/drop-assertion.js.map +0 -1
- package/dist/src/planner/building/drop-table.js.map +0 -1
- package/dist/src/planner/building/drop-view.js.map +0 -1
- package/dist/src/planner/building/expression.js.map +0 -1
- package/dist/src/planner/building/function-call.js.map +0 -1
- package/dist/src/planner/building/insert.js.map +0 -1
- package/dist/src/planner/building/pragma.js.map +0 -1
- package/dist/src/planner/building/schema-resolution.js.map +0 -1
- package/dist/src/planner/building/select-aggregates.js.map +0 -1
- package/dist/src/planner/building/select-compound.js.map +0 -1
- package/dist/src/planner/building/select-context.js.map +0 -1
- package/dist/src/planner/building/select-modifiers.js.map +0 -1
- package/dist/src/planner/building/select-projections.js.map +0 -1
- package/dist/src/planner/building/select-window.js.map +0 -1
- package/dist/src/planner/building/select.js.map +0 -1
- package/dist/src/planner/building/table-function.js.map +0 -1
- package/dist/src/planner/building/table.js.map +0 -1
- package/dist/src/planner/building/transaction.js.map +0 -1
- package/dist/src/planner/building/update.js.map +0 -1
- package/dist/src/planner/building/with.js.map +0 -1
- package/dist/src/planner/cache/correlation-detector.js.map +0 -1
- package/dist/src/planner/cache/materialization-advisory.js.map +0 -1
- package/dist/src/planner/cache/reference-graph.js.map +0 -1
- package/dist/src/planner/cost/index.js.map +0 -1
- package/dist/src/planner/debug/logger-utils.js.map +0 -1
- package/dist/src/planner/debug.js.map +0 -1
- package/dist/src/planner/framework/characteristics.js.map +0 -1
- package/dist/src/planner/framework/context.js.map +0 -1
- package/dist/src/planner/framework/pass.js.map +0 -1
- package/dist/src/planner/framework/physical-utils.js.map +0 -1
- package/dist/src/planner/framework/registry.js.map +0 -1
- package/dist/src/planner/framework/trace.js.map +0 -1
- package/dist/src/planner/nodes/add-constraint-node.js.map +0 -1
- package/dist/src/planner/nodes/aggregate-function.js.map +0 -1
- package/dist/src/planner/nodes/aggregate-node.js.map +0 -1
- package/dist/src/planner/nodes/array-index-node.js.map +0 -1
- package/dist/src/planner/nodes/block.js.map +0 -1
- package/dist/src/planner/nodes/cache-node.js.map +0 -1
- package/dist/src/planner/nodes/constraint-check-node.js.map +0 -1
- package/dist/src/planner/nodes/create-assertion-node.js.map +0 -1
- package/dist/src/planner/nodes/create-index-node.js.map +0 -1
- package/dist/src/planner/nodes/create-table-node.js.map +0 -1
- package/dist/src/planner/nodes/create-view-node.js.map +0 -1
- package/dist/src/planner/nodes/cte-node.js.map +0 -1
- package/dist/src/planner/nodes/cte-reference-node.js.map +0 -1
- package/dist/src/planner/nodes/declarative-schema.js.map +0 -1
- package/dist/src/planner/nodes/delete-node.js.map +0 -1
- package/dist/src/planner/nodes/distinct-node.js.map +0 -1
- package/dist/src/planner/nodes/dml-executor-node.js.map +0 -1
- package/dist/src/planner/nodes/drop-assertion-node.js.map +0 -1
- package/dist/src/planner/nodes/drop-table-node.js.map +0 -1
- package/dist/src/planner/nodes/drop-view-node.js.map +0 -1
- package/dist/src/planner/nodes/filter.js.map +0 -1
- package/dist/src/planner/nodes/function.js.map +0 -1
- package/dist/src/planner/nodes/insert-node.js.map +0 -1
- package/dist/src/planner/nodes/internal-recursive-cte-ref-node.js.map +0 -1
- package/dist/src/planner/nodes/join-node.js.map +0 -1
- package/dist/src/planner/nodes/limit-offset.js.map +0 -1
- package/dist/src/planner/nodes/plan-node-type.js.map +0 -1
- package/dist/src/planner/nodes/plan-node.js.map +0 -1
- package/dist/src/planner/nodes/pragma.js.map +0 -1
- package/dist/src/planner/nodes/project-node.js.map +0 -1
- package/dist/src/planner/nodes/recursive-cte-node.js.map +0 -1
- package/dist/src/planner/nodes/reference.js.map +0 -1
- package/dist/src/planner/nodes/remote-query-node.js.map +0 -1
- package/dist/src/planner/nodes/retrieve-node.js.map +0 -1
- package/dist/src/planner/nodes/returning-node.js.map +0 -1
- package/dist/src/planner/nodes/scalar.js.map +0 -1
- package/dist/src/planner/nodes/sequencing-node.js.map +0 -1
- package/dist/src/planner/nodes/set-operation-node.js.map +0 -1
- package/dist/src/planner/nodes/single-row.js.map +0 -1
- package/dist/src/planner/nodes/sink-node.js.map +0 -1
- package/dist/src/planner/nodes/sort.js.map +0 -1
- package/dist/src/planner/nodes/stream-aggregate.js.map +0 -1
- package/dist/src/planner/nodes/subquery.js.map +0 -1
- package/dist/src/planner/nodes/table-access-nodes.js.map +0 -1
- package/dist/src/planner/nodes/table-function-call.js.map +0 -1
- package/dist/src/planner/nodes/transaction-node.js.map +0 -1
- package/dist/src/planner/nodes/update-node.js.map +0 -1
- package/dist/src/planner/nodes/values-node.js.map +0 -1
- package/dist/src/planner/nodes/view-reference-node.js.map +0 -1
- package/dist/src/planner/nodes/window-function.js.map +0 -1
- package/dist/src/planner/nodes/window-node.js.map +0 -1
- package/dist/src/planner/optimizer-tuning.js.map +0 -1
- package/dist/src/planner/optimizer.js.map +0 -1
- package/dist/src/planner/planning-context.js.map +0 -1
- package/dist/src/planner/resolve.js.map +0 -1
- package/dist/src/planner/rules/access/rule-select-access-path.js.map +0 -1
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js.map +0 -1
- package/dist/src/planner/rules/cache/rule-cte-optimization.js.map +0 -1
- package/dist/src/planner/rules/cache/rule-materialization-advisory.js.map +0 -1
- package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.js.map +0 -1
- package/dist/src/planner/rules/join/rule-join-greedy-commute.js.map +0 -1
- package/dist/src/planner/rules/join/rule-join-key-inference.js.map +0 -1
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.js.map +0 -1
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js.map +0 -1
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +0 -1
- package/dist/src/planner/scopes/aliased.js.map +0 -1
- package/dist/src/planner/scopes/base.js.map +0 -1
- package/dist/src/planner/scopes/empty.js.map +0 -1
- package/dist/src/planner/scopes/global.js.map +0 -1
- package/dist/src/planner/scopes/multi.js.map +0 -1
- package/dist/src/planner/scopes/param.js.map +0 -1
- package/dist/src/planner/scopes/registered.js.map +0 -1
- package/dist/src/planner/scopes/scope.js.map +0 -1
- package/dist/src/planner/stats/basic-estimates.js.map +0 -1
- package/dist/src/planner/stats/index.js.map +0 -1
- package/dist/src/planner/type-utils.js.map +0 -1
- package/dist/src/planner/util/key-utils.js.map +0 -1
- package/dist/src/planner/validation/determinism-validator.js.map +0 -1
- package/dist/src/planner/validation/plan-validator.js.map +0 -1
- package/dist/src/runtime/async-util.js.map +0 -1
- package/dist/src/runtime/cache/shared-cache.js.map +0 -1
- package/dist/src/runtime/context-helpers.js.map +0 -1
- package/dist/src/runtime/deferred-constraint-queue.js.map +0 -1
- package/dist/src/runtime/emission-context.js.map +0 -1
- package/dist/src/runtime/emit/add-constraint.js.map +0 -1
- package/dist/src/runtime/emit/aggregate.js.map +0 -1
- package/dist/src/runtime/emit/array-index.js.map +0 -1
- package/dist/src/runtime/emit/between.js.map +0 -1
- package/dist/src/runtime/emit/binary.js.map +0 -1
- package/dist/src/runtime/emit/block.js.map +0 -1
- package/dist/src/runtime/emit/cache.js.map +0 -1
- package/dist/src/runtime/emit/case.js.map +0 -1
- package/dist/src/runtime/emit/cast.js.map +0 -1
- package/dist/src/runtime/emit/collate.js.map +0 -1
- package/dist/src/runtime/emit/column-reference.js.map +0 -1
- package/dist/src/runtime/emit/constraint-check.js.map +0 -1
- package/dist/src/runtime/emit/create-assertion.js.map +0 -1
- package/dist/src/runtime/emit/create-index.js.map +0 -1
- package/dist/src/runtime/emit/create-table.js.map +0 -1
- package/dist/src/runtime/emit/create-view.js.map +0 -1
- package/dist/src/runtime/emit/cte-reference.js.map +0 -1
- package/dist/src/runtime/emit/cte.js.map +0 -1
- package/dist/src/runtime/emit/delete.js.map +0 -1
- package/dist/src/runtime/emit/distinct.js.map +0 -1
- package/dist/src/runtime/emit/dml-executor.js.map +0 -1
- package/dist/src/runtime/emit/drop-assertion.js.map +0 -1
- package/dist/src/runtime/emit/drop-table.js.map +0 -1
- package/dist/src/runtime/emit/drop-view.js.map +0 -1
- package/dist/src/runtime/emit/filter.js.map +0 -1
- package/dist/src/runtime/emit/insert.js.map +0 -1
- package/dist/src/runtime/emit/internal-recursive-cte-ref.js.map +0 -1
- package/dist/src/runtime/emit/join.js.map +0 -1
- package/dist/src/runtime/emit/limit-offset.js.map +0 -1
- package/dist/src/runtime/emit/literal.js.map +0 -1
- package/dist/src/runtime/emit/parameter.js.map +0 -1
- package/dist/src/runtime/emit/pragma.js.map +0 -1
- package/dist/src/runtime/emit/project.js.map +0 -1
- package/dist/src/runtime/emit/recursive-cte.js.map +0 -1
- package/dist/src/runtime/emit/remote-query.js.map +0 -1
- package/dist/src/runtime/emit/retrieve.js.map +0 -1
- package/dist/src/runtime/emit/returning.js.map +0 -1
- package/dist/src/runtime/emit/scalar-function.js.map +0 -1
- package/dist/src/runtime/emit/scan.js.map +0 -1
- package/dist/src/runtime/emit/schema-declarative.js.map +0 -1
- package/dist/src/runtime/emit/sequencing.js.map +0 -1
- package/dist/src/runtime/emit/set-operation.js.map +0 -1
- package/dist/src/runtime/emit/sink.js.map +0 -1
- package/dist/src/runtime/emit/sort.js.map +0 -1
- package/dist/src/runtime/emit/subquery.js.map +0 -1
- package/dist/src/runtime/emit/table-valued-function.js.map +0 -1
- package/dist/src/runtime/emit/temporal-arithmetic.js.map +0 -1
- package/dist/src/runtime/emit/transaction.js.map +0 -1
- package/dist/src/runtime/emit/unary.js.map +0 -1
- package/dist/src/runtime/emit/update.js.map +0 -1
- package/dist/src/runtime/emit/values.js.map +0 -1
- package/dist/src/runtime/emit/window-function.js.map +0 -1
- package/dist/src/runtime/emit/window.js.map +0 -1
- package/dist/src/runtime/emitters.js.map +0 -1
- package/dist/src/runtime/register.js.map +0 -1
- package/dist/src/runtime/scheduler.js.map +0 -1
- package/dist/src/runtime/types.js.map +0 -1
- package/dist/src/runtime/utils.js.map +0 -1
- package/dist/src/schema/assertion.js.map +0 -1
- package/dist/src/schema/catalog.js.map +0 -1
- package/dist/src/schema/change-events.js.map +0 -1
- package/dist/src/schema/column.js.map +0 -1
- package/dist/src/schema/declared-schema-manager.js.map +0 -1
- package/dist/src/schema/function.js.map +0 -1
- package/dist/src/schema/manager.js.map +0 -1
- package/dist/src/schema/schema-differ.js.map +0 -1
- package/dist/src/schema/schema-hasher.js.map +0 -1
- package/dist/src/schema/schema.js.map +0 -1
- package/dist/src/schema/table.js.map +0 -1
- package/dist/src/schema/view.js.map +0 -1
- package/dist/src/schema/window-function.js.map +0 -1
- package/dist/src/types/builtin-types.js.map +0 -1
- package/dist/src/types/index.js.map +0 -1
- package/dist/src/types/json-type.js.map +0 -1
- package/dist/src/types/logical-type.js.map +0 -1
- package/dist/src/types/plugin-interface.js.map +0 -1
- package/dist/src/types/registry.js.map +0 -1
- package/dist/src/types/temporal-types.js.map +0 -1
- package/dist/src/types/validation.js.map +0 -1
- package/dist/src/util/affinity.js.map +0 -1
- package/dist/src/util/ast-stringify.js.map +0 -1
- package/dist/src/util/cached.js.map +0 -1
- package/dist/src/util/coercion.js.map +0 -1
- package/dist/src/util/comparison.js.map +0 -1
- package/dist/src/util/environment.js.map +0 -1
- package/dist/src/util/hash.js.map +0 -1
- package/dist/src/util/latches.js.map +0 -1
- package/dist/src/util/mutation-statement.js.map +0 -1
- package/dist/src/util/patterns.js.map +0 -1
- package/dist/src/util/plan-formatter.js.map +0 -1
- package/dist/src/util/plugin-helper.js.map +0 -1
- package/dist/src/util/row-descriptor.js.map +0 -1
- package/dist/src/util/serialization.js.map +0 -1
- package/dist/src/util/sql-literal.js.map +0 -1
- package/dist/src/util/working-table-iterable.js.map +0 -1
- package/dist/src/vtab/best-access-plan.js.map +0 -1
- package/dist/src/vtab/connection.js.map +0 -1
- package/dist/src/vtab/filter-info.js.map +0 -1
- package/dist/src/vtab/index-info.js.map +0 -1
- package/dist/src/vtab/manifest.js.map +0 -1
- package/dist/src/vtab/memory/connection.js.map +0 -1
- package/dist/src/vtab/memory/index.js.map +0 -1
- package/dist/src/vtab/memory/layer/base-cursor.js.map +0 -1
- package/dist/src/vtab/memory/layer/base.js.map +0 -1
- package/dist/src/vtab/memory/layer/connection.js.map +0 -1
- package/dist/src/vtab/memory/layer/interface.js.map +0 -1
- package/dist/src/vtab/memory/layer/manager.js.map +0 -1
- package/dist/src/vtab/memory/layer/safe-iterate.js.map +0 -1
- package/dist/src/vtab/memory/layer/scan-plan.js.map +0 -1
- package/dist/src/vtab/memory/layer/transaction-cursor.js.map +0 -1
- package/dist/src/vtab/memory/layer/transaction.js.map +0 -1
- package/dist/src/vtab/memory/module.js.map +0 -1
- package/dist/src/vtab/memory/table.js.map +0 -1
- package/dist/src/vtab/memory/types.js.map +0 -1
- package/dist/src/vtab/memory/utils/logging.js.map +0 -1
- package/dist/src/vtab/memory/utils/primary-key.js.map +0 -1
- package/dist/src/vtab/module.js.map +0 -1
- package/dist/src/vtab/table.js.map +0 -1
- package/src/common/constants.ts +0 -60
- package/src/common/datatype.ts +0 -85
- package/src/common/errors.ts +0 -189
- package/src/common/json-types.ts +0 -16
- package/src/common/logger.ts +0 -97
- package/src/common/type-inference.ts +0 -39
- package/src/common/types.ts +0 -151
- package/src/core/database-options.ts +0 -258
- package/src/core/database.ts +0 -1461
- package/src/core/param.ts +0 -56
- package/src/core/statement.ts +0 -528
- package/src/func/builtins/aggregate.ts +0 -269
- package/src/func/builtins/builtin-window-functions.ts +0 -166
- package/src/func/builtins/conversion.ts +0 -226
- package/src/func/builtins/datetime.ts +0 -500
- package/src/func/builtins/explain.ts +0 -779
- package/src/func/builtins/generation.ts +0 -43
- package/src/func/builtins/index.ts +0 -167
- package/src/func/builtins/json-helpers.ts +0 -237
- package/src/func/builtins/json-tvf.ts +0 -224
- package/src/func/builtins/json.ts +0 -588
- package/src/func/builtins/scalar.ts +0 -423
- package/src/func/builtins/schema.ts +0 -213
- package/src/func/builtins/string.ts +0 -306
- package/src/func/builtins/timespan.ts +0 -179
- package/src/func/context.ts +0 -258
- package/src/func/registration.ts +0 -201
- package/src/index.ts +0 -172
- package/src/parser/ast.ts +0 -581
- package/src/parser/index.ts +0 -65
- package/src/parser/lexer.ts +0 -806
- package/src/parser/parser.ts +0 -3352
- package/src/parser/utils.ts +0 -10
- package/src/parser/visitor.ts +0 -188
- package/src/planner/analysis/README.md +0 -93
- package/src/planner/analysis/binding-collector.ts +0 -83
- package/src/planner/analysis/const-evaluator.ts +0 -63
- package/src/planner/analysis/const-pass.ts +0 -282
- package/src/planner/analysis/constraint-extractor.ts +0 -764
- package/src/planner/analysis/predicate-normalizer.ts +0 -237
- package/src/planner/building/alter-table.ts +0 -49
- package/src/planner/building/block.ts +0 -93
- package/src/planner/building/constraint-builder.ts +0 -178
- package/src/planner/building/create-assertion.ts +0 -7
- package/src/planner/building/create-view.ts +0 -29
- package/src/planner/building/ddl.ts +0 -24
- package/src/planner/building/declare-schema.ts +0 -22
- package/src/planner/building/delete.ts +0 -218
- package/src/planner/building/drop-assertion.ts +0 -11
- package/src/planner/building/drop-table.ts +0 -13
- package/src/planner/building/drop-view.ts +0 -19
- package/src/planner/building/expression.ts +0 -205
- package/src/planner/building/function-call.ts +0 -129
- package/src/planner/building/insert.ts +0 -435
- package/src/planner/building/pragma.ts +0 -34
- package/src/planner/building/schema-resolution.ts +0 -176
- package/src/planner/building/select-aggregates.ts +0 -318
- package/src/planner/building/select-compound.ts +0 -119
- package/src/planner/building/select-context.ts +0 -85
- package/src/planner/building/select-modifiers.ts +0 -236
- package/src/planner/building/select-projections.ts +0 -177
- package/src/planner/building/select-window.ts +0 -259
- package/src/planner/building/select.ts +0 -567
- package/src/planner/building/table-function.ts +0 -49
- package/src/planner/building/table.ts +0 -40
- package/src/planner/building/transaction.ts +0 -23
- package/src/planner/building/update.ts +0 -331
- package/src/planner/building/with.ts +0 -180
- package/src/planner/cache/correlation-detector.ts +0 -83
- package/src/planner/cache/materialization-advisory.ts +0 -265
- package/src/planner/cache/reference-graph.ts +0 -196
- package/src/planner/cost/index.ts +0 -169
- package/src/planner/debug/logger-utils.ts +0 -68
- package/src/planner/debug.ts +0 -480
- package/src/planner/framework/README.md +0 -132
- package/src/planner/framework/characteristics.ts +0 -503
- package/src/planner/framework/context.ts +0 -239
- package/src/planner/framework/pass.ts +0 -354
- package/src/planner/framework/physical-utils.ts +0 -210
- package/src/planner/framework/registry.ts +0 -261
- package/src/planner/framework/trace.ts +0 -259
- package/src/planner/nodes/add-constraint-node.ts +0 -62
- package/src/planner/nodes/aggregate-function.ts +0 -155
- package/src/planner/nodes/aggregate-node.ts +0 -267
- package/src/planner/nodes/array-index-node.ts +0 -50
- package/src/planner/nodes/block.ts +0 -80
- package/src/planner/nodes/cache-node.ts +0 -103
- package/src/planner/nodes/constraint-check-node.ts +0 -138
- package/src/planner/nodes/create-assertion-node.ts +0 -51
- package/src/planner/nodes/create-index-node.ts +0 -41
- package/src/planner/nodes/create-table-node.ts +0 -35
- package/src/planner/nodes/create-view-node.ts +0 -44
- package/src/planner/nodes/cte-node.ts +0 -168
- package/src/planner/nodes/cte-reference-node.ts +0 -125
- package/src/planner/nodes/declarative-schema.ts +0 -221
- package/src/planner/nodes/delete-node.ts +0 -102
- package/src/planner/nodes/distinct-node.ts +0 -107
- package/src/planner/nodes/dml-executor-node.ts +0 -104
- package/src/planner/nodes/drop-assertion-node.ts +0 -50
- package/src/planner/nodes/drop-table-node.ts +0 -36
- package/src/planner/nodes/drop-view-node.ts +0 -37
- package/src/planner/nodes/filter.ts +0 -144
- package/src/planner/nodes/function.ts +0 -98
- package/src/planner/nodes/insert-node.ts +0 -126
- package/src/planner/nodes/internal-recursive-cte-ref-node.ts +0 -61
- package/src/planner/nodes/join-node.ts +0 -336
- package/src/planner/nodes/limit-offset.ts +0 -144
- package/src/planner/nodes/plan-node-type.ts +0 -95
- package/src/planner/nodes/plan-node.ts +0 -503
- package/src/planner/nodes/pragma.ts +0 -98
- package/src/planner/nodes/project-node.ts +0 -337
- package/src/planner/nodes/recursive-cte-node.ts +0 -158
- package/src/planner/nodes/reference.ts +0 -334
- package/src/planner/nodes/remote-query-node.ts +0 -73
- package/src/planner/nodes/retrieve-node.ts +0 -86
- package/src/planner/nodes/returning-node.ts +0 -269
- package/src/planner/nodes/scalar.ts +0 -772
- package/src/planner/nodes/sequencing-node.ts +0 -113
- package/src/planner/nodes/set-operation-node.ts +0 -87
- package/src/planner/nodes/single-row.ts +0 -85
- package/src/planner/nodes/sink-node.ts +0 -61
- package/src/planner/nodes/sort.ts +0 -166
- package/src/planner/nodes/stream-aggregate.ts +0 -293
- package/src/planner/nodes/subquery.ts +0 -268
- package/src/planner/nodes/table-access-nodes.ts +0 -323
- package/src/planner/nodes/table-function-call.ts +0 -134
- package/src/planner/nodes/transaction-node.ts +0 -55
- package/src/planner/nodes/update-node.ts +0 -138
- package/src/planner/nodes/values-node.ts +0 -244
- package/src/planner/nodes/view-reference-node.ts +0 -97
- package/src/planner/nodes/window-function.ts +0 -73
- package/src/planner/nodes/window-node.ts +0 -199
- package/src/planner/optimizer-tuning.ts +0 -105
- package/src/planner/optimizer.ts +0 -332
- package/src/planner/planning-context.ts +0 -190
- package/src/planner/resolve.ts +0 -101
- package/src/planner/rules/README.md +0 -96
- package/src/planner/rules/access/rule-select-access-path.ts +0 -399
- package/src/planner/rules/aggregate/rule-aggregate-streaming.ts +0 -162
- package/src/planner/rules/cache/rule-cte-optimization.ts +0 -79
- package/src/planner/rules/cache/rule-materialization-advisory.ts +0 -77
- package/src/planner/rules/cache/rule-mutating-subquery-cache.ts +0 -104
- package/src/planner/rules/join/rule-join-greedy-commute.ts +0 -48
- package/src/planner/rules/join/rule-join-key-inference.ts +0 -35
- package/src/planner/rules/join/rule-quickpick-enumeration.ts +0 -267
- package/src/planner/rules/predicate/rule-predicate-pushdown.ts +0 -144
- package/src/planner/rules/retrieve/rule-grow-retrieve.ts +0 -337
- package/src/planner/scopes/aliased.ts +0 -50
- package/src/planner/scopes/base.ts +0 -10
- package/src/planner/scopes/empty.ts +0 -12
- package/src/planner/scopes/global.ts +0 -73
- package/src/planner/scopes/multi.ts +0 -40
- package/src/planner/scopes/param.ts +0 -95
- package/src/planner/scopes/registered.ts +0 -67
- package/src/planner/scopes/scope.ts +0 -16
- package/src/planner/stats/basic-estimates.ts +0 -107
- package/src/planner/stats/index.ts +0 -158
- package/src/planner/type-utils.ts +0 -87
- package/src/planner/util/key-utils.ts +0 -46
- package/src/planner/validation/determinism-validator.ts +0 -104
- package/src/planner/validation/plan-validator.ts +0 -335
- package/src/runtime/async-util.ts +0 -283
- package/src/runtime/cache/shared-cache.ts +0 -169
- package/src/runtime/context-helpers.ts +0 -191
- package/src/runtime/deferred-constraint-queue.ts +0 -196
- package/src/runtime/emission-context.ts +0 -319
- package/src/runtime/emit/add-constraint.ts +0 -78
- package/src/runtime/emit/aggregate.ts +0 -581
- package/src/runtime/emit/array-index.ts +0 -25
- package/src/runtime/emit/between.ts +0 -51
- package/src/runtime/emit/binary.ts +0 -357
- package/src/runtime/emit/block.ts +0 -23
- package/src/runtime/emit/cache.ts +0 -64
- package/src/runtime/emit/case.ts +0 -87
- package/src/runtime/emit/cast.ts +0 -151
- package/src/runtime/emit/collate.ts +0 -9
- package/src/runtime/emit/column-reference.ts +0 -17
- package/src/runtime/emit/constraint-check.ts +0 -290
- package/src/runtime/emit/create-assertion.ts +0 -82
- package/src/runtime/emit/create-index.ts +0 -15
- package/src/runtime/emit/create-table.ts +0 -15
- package/src/runtime/emit/create-view.ts +0 -52
- package/src/runtime/emit/cte-reference.ts +0 -38
- package/src/runtime/emit/cte.ts +0 -39
- package/src/runtime/emit/delete.ts +0 -24
- package/src/runtime/emit/distinct.ts +0 -40
- package/src/runtime/emit/dml-executor.ts +0 -198
- package/src/runtime/emit/drop-assertion.ts +0 -45
- package/src/runtime/emit/drop-table.ts +0 -27
- package/src/runtime/emit/drop-view.ts +0 -49
- package/src/runtime/emit/filter.ts +0 -30
- package/src/runtime/emit/insert.ts +0 -42
- package/src/runtime/emit/internal-recursive-cte-ref.ts +0 -37
- package/src/runtime/emit/join.ts +0 -148
- package/src/runtime/emit/limit-offset.ts +0 -73
- package/src/runtime/emit/literal.ts +0 -17
- package/src/runtime/emit/parameter.ts +0 -59
- package/src/runtime/emit/pragma.ts +0 -56
- package/src/runtime/emit/project.ts +0 -46
- package/src/runtime/emit/recursive-cte.ts +0 -111
- package/src/runtime/emit/remote-query.ts +0 -47
- package/src/runtime/emit/retrieve.ts +0 -15
- package/src/runtime/emit/returning.ts +0 -41
- package/src/runtime/emit/scalar-function.ts +0 -69
- package/src/runtime/emit/scan.ts +0 -106
- package/src/runtime/emit/schema-declarative.ts +0 -215
- package/src/runtime/emit/sequencing.ts +0 -24
- package/src/runtime/emit/set-operation.ts +0 -141
- package/src/runtime/emit/sink.ts +0 -27
- package/src/runtime/emit/sort.ts +0 -75
- package/src/runtime/emit/subquery.ts +0 -203
- package/src/runtime/emit/table-valued-function.ts +0 -106
- package/src/runtime/emit/temporal-arithmetic.ts +0 -302
- package/src/runtime/emit/transaction.ts +0 -205
- package/src/runtime/emit/unary.ts +0 -101
- package/src/runtime/emit/update.ts +0 -66
- package/src/runtime/emit/values.ts +0 -66
- package/src/runtime/emit/window-function.ts +0 -42
- package/src/runtime/emit/window.ts +0 -458
- package/src/runtime/emitters.ts +0 -183
- package/src/runtime/register.ts +0 -150
- package/src/runtime/scheduler.ts +0 -488
- package/src/runtime/types.ts +0 -242
- package/src/runtime/utils.ts +0 -177
- package/src/schema/assertion.ts +0 -21
- package/src/schema/catalog.ts +0 -269
- package/src/schema/change-events.ts +0 -80
- package/src/schema/column.ts +0 -51
- package/src/schema/declared-schema-manager.ts +0 -82
- package/src/schema/function.ts +0 -188
- package/src/schema/manager.ts +0 -1034
- package/src/schema/schema-differ.ts +0 -214
- package/src/schema/schema-hasher.ts +0 -26
- package/src/schema/schema.ts +0 -222
- package/src/schema/table.ts +0 -409
- package/src/schema/view.ts +0 -19
- package/src/schema/window-function.ts +0 -56
- package/src/types/builtin-types.ts +0 -350
- package/src/types/index.ts +0 -17
- package/src/types/json-type.ts +0 -152
- package/src/types/logical-type.ts +0 -91
- package/src/types/plugin-interface.ts +0 -10
- package/src/types/registry.ts +0 -204
- package/src/types/temporal-types.ts +0 -290
- package/src/types/validation.ts +0 -120
- package/src/util/affinity.ts +0 -151
- package/src/util/ast-stringify.ts +0 -887
- package/src/util/cached.ts +0 -25
- package/src/util/coercion.ts +0 -113
- package/src/util/comparison.ts +0 -510
- package/src/util/environment.ts +0 -52
- package/src/util/hash.ts +0 -90
- package/src/util/latches.ts +0 -47
- package/src/util/mutation-statement.ts +0 -135
- package/src/util/patterns.ts +0 -56
- package/src/util/plan-formatter.ts +0 -48
- package/src/util/plugin-helper.ts +0 -110
- package/src/util/row-descriptor.ts +0 -105
- package/src/util/serialization.ts +0 -47
- package/src/util/sql-literal.ts +0 -22
- package/src/util/working-table-iterable.ts +0 -38
- package/src/vtab/best-access-plan.ts +0 -244
- package/src/vtab/connection.ts +0 -36
- package/src/vtab/filter-info.ts +0 -23
- package/src/vtab/index-info.ts +0 -84
- package/src/vtab/manifest.ts +0 -86
- package/src/vtab/memory/connection.ts +0 -73
- package/src/vtab/memory/index.ts +0 -191
- package/src/vtab/memory/layer/base-cursor.ts +0 -124
- package/src/vtab/memory/layer/base.ts +0 -275
- package/src/vtab/memory/layer/connection.ts +0 -203
- package/src/vtab/memory/layer/interface.ts +0 -47
- package/src/vtab/memory/layer/manager.ts +0 -909
- package/src/vtab/memory/layer/safe-iterate.ts +0 -49
- package/src/vtab/memory/layer/scan-plan.ts +0 -84
- package/src/vtab/memory/layer/transaction-cursor.ts +0 -162
- package/src/vtab/memory/layer/transaction.ts +0 -229
- package/src/vtab/memory/module.ts +0 -667
- package/src/vtab/memory/table.ts +0 -251
- package/src/vtab/memory/types.ts +0 -23
- package/src/vtab/memory/utils/logging.ts +0 -36
- package/src/vtab/memory/utils/primary-key.ts +0 -163
- package/src/vtab/module.ts +0 -162
- package/src/vtab/table.ts +0 -177
|
@@ -1,331 +0,0 @@
|
|
|
1
|
-
import type * as AST from '../../parser/ast.js';
|
|
2
|
-
import type { PlanningContext } from '../planning-context.js';
|
|
3
|
-
import { UpdateNode, type UpdateAssignment } from '../nodes/update-node.js';
|
|
4
|
-
import { DmlExecutorNode } from '../nodes/dml-executor-node.js';
|
|
5
|
-
import { buildTableReference } from './table.js';
|
|
6
|
-
import { buildExpression } from './expression.js';
|
|
7
|
-
import { PlanNode, type RelationalPlanNode, type ScalarPlanNode, type Attribute, type RowDescriptor } from '../nodes/plan-node.js';
|
|
8
|
-
import { FilterNode } from '../nodes/filter.js';
|
|
9
|
-
import { QuereusError } from '../../common/errors.js';
|
|
10
|
-
import { StatusCode } from '../../common/types.js';
|
|
11
|
-
import { RegisteredScope } from '../scopes/registered.js';
|
|
12
|
-
import { ColumnReferenceNode } from '../nodes/reference.js';
|
|
13
|
-
import { SinkNode } from '../nodes/sink-node.js';
|
|
14
|
-
import { ConstraintCheckNode } from '../nodes/constraint-check-node.js';
|
|
15
|
-
import { RowOpFlag } from '../../schema/table.js';
|
|
16
|
-
import { ReturningNode } from '../nodes/returning-node.js';
|
|
17
|
-
import { buildOldNewRowDescriptors } from '../../util/row-descriptor.js';
|
|
18
|
-
import { buildConstraintChecks } from './constraint-builder.js';
|
|
19
|
-
|
|
20
|
-
export function buildUpdateStmt(
|
|
21
|
-
ctx: PlanningContext,
|
|
22
|
-
stmt: AST.UpdateStmt,
|
|
23
|
-
): PlanNode {
|
|
24
|
-
const tableRetrieve = buildTableReference({ type: 'table', table: stmt.table }, ctx);
|
|
25
|
-
const tableReference = tableRetrieve.tableRef; // Extract the actual TableReferenceNode
|
|
26
|
-
|
|
27
|
-
// Process mutation context assignments if present
|
|
28
|
-
const mutationContextValues = new Map<string, ScalarPlanNode>();
|
|
29
|
-
const contextAttributes: Attribute[] = [];
|
|
30
|
-
|
|
31
|
-
if (stmt.contextValues && tableReference.tableSchema.mutationContext) {
|
|
32
|
-
// Create context attributes
|
|
33
|
-
tableReference.tableSchema.mutationContext.forEach((contextVar) => {
|
|
34
|
-
contextAttributes.push({
|
|
35
|
-
id: PlanNode.nextAttrId(),
|
|
36
|
-
name: contextVar.name,
|
|
37
|
-
type: {
|
|
38
|
-
typeClass: 'scalar' as const,
|
|
39
|
-
logicalType: contextVar.logicalType,
|
|
40
|
-
nullable: !contextVar.notNull,
|
|
41
|
-
isReadOnly: true
|
|
42
|
-
},
|
|
43
|
-
sourceRelation: `context.${tableReference.tableSchema.name}`
|
|
44
|
-
});
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
// Build context value expressions (evaluated in the base scope, before table scope)
|
|
48
|
-
stmt.contextValues.forEach((assignment) => {
|
|
49
|
-
const valueExpr = buildExpression(ctx, assignment.value) as ScalarPlanNode;
|
|
50
|
-
mutationContextValues.set(assignment.name, valueExpr);
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// Plan the source of rows to update. This is typically the table itself, potentially filtered.
|
|
55
|
-
let sourceNode: RelationalPlanNode = buildTableReference({ type: 'table', table: stmt.table }, ctx);
|
|
56
|
-
|
|
57
|
-
// Create a new scope with the table columns registered for column resolution
|
|
58
|
-
const tableScope = new RegisteredScope(ctx.scope);
|
|
59
|
-
const sourceAttributes = sourceNode.getAttributes();
|
|
60
|
-
sourceNode.getType().columns.forEach((c, i) => {
|
|
61
|
-
const attr = sourceAttributes[i];
|
|
62
|
-
tableScope.registerSymbol(c.name.toLowerCase(), (exp, s) =>
|
|
63
|
-
new ColumnReferenceNode(s, exp as AST.ColumnExpr, c.type, attr.id, i));
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
// Create a new planning context with the updated scope for WHERE clause resolution
|
|
67
|
-
const updateCtx = { ...ctx, scope: tableScope };
|
|
68
|
-
|
|
69
|
-
// IMPORTANT: Build assignments FIRST to ensure parameter indices match SQL text order.
|
|
70
|
-
// SQL: UPDATE t SET col = ?1 WHERE id = ?2
|
|
71
|
-
// The SET clause parameters must be resolved before WHERE clause parameters.
|
|
72
|
-
const assignments: UpdateAssignment[] = stmt.assignments.map(assign => {
|
|
73
|
-
// TODO: Validate assign.column against tableReference.tableSchema
|
|
74
|
-
const targetColumn: AST.ColumnExpr = { type: 'column', name: assign.column, table: stmt.table.name, schema: stmt.table.schema };
|
|
75
|
-
return {
|
|
76
|
-
targetColumn, // Keep as AST for now, emitter can resolve index
|
|
77
|
-
value: buildExpression(updateCtx, assign.value),
|
|
78
|
-
};
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
// Now build the WHERE filter (parameters here get indices after SET clause parameters)
|
|
82
|
-
if (stmt.where) {
|
|
83
|
-
const filterExpression = buildExpression(updateCtx, stmt.where);
|
|
84
|
-
sourceNode = new FilterNode(updateCtx.scope, sourceNode, filterExpression);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// Create OLD/NEW attributes for UPDATE (used for both RETURNING and non-RETURNING paths)
|
|
88
|
-
const oldAttributes = tableReference.tableSchema.columns.map((col) => ({
|
|
89
|
-
id: PlanNode.nextAttrId(),
|
|
90
|
-
name: col.name,
|
|
91
|
-
type: {
|
|
92
|
-
typeClass: 'scalar' as const,
|
|
93
|
-
logicalType: col.logicalType,
|
|
94
|
-
nullable: !col.notNull,
|
|
95
|
-
isReadOnly: false
|
|
96
|
-
},
|
|
97
|
-
sourceRelation: `OLD.${tableReference.tableSchema.name}`
|
|
98
|
-
}));
|
|
99
|
-
|
|
100
|
-
const newAttributes = tableReference.tableSchema.columns.map((col) => ({
|
|
101
|
-
id: PlanNode.nextAttrId(),
|
|
102
|
-
name: col.name,
|
|
103
|
-
type: {
|
|
104
|
-
typeClass: 'scalar' as const,
|
|
105
|
-
logicalType: col.logicalType,
|
|
106
|
-
nullable: !col.notNull,
|
|
107
|
-
isReadOnly: false
|
|
108
|
-
},
|
|
109
|
-
sourceRelation: `NEW.${tableReference.tableSchema.name}`
|
|
110
|
-
}));
|
|
111
|
-
|
|
112
|
-
const { oldRowDescriptor, newRowDescriptor, flatRowDescriptor } = buildOldNewRowDescriptors(oldAttributes, newAttributes);
|
|
113
|
-
|
|
114
|
-
// Build context descriptor if we have context attributes
|
|
115
|
-
const contextDescriptor: RowDescriptor = contextAttributes.length > 0 ? [] : undefined as any;
|
|
116
|
-
if (contextDescriptor) {
|
|
117
|
-
contextAttributes.forEach((attr, index) => {
|
|
118
|
-
contextDescriptor[attr.id] = index;
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// Build constraint checks at plan time
|
|
123
|
-
const constraintChecks = buildConstraintChecks(
|
|
124
|
-
updateCtx,
|
|
125
|
-
tableReference.tableSchema,
|
|
126
|
-
RowOpFlag.UPDATE,
|
|
127
|
-
oldAttributes,
|
|
128
|
-
newAttributes,
|
|
129
|
-
flatRowDescriptor,
|
|
130
|
-
contextAttributes
|
|
131
|
-
);
|
|
132
|
-
|
|
133
|
-
if (stmt.returning && stmt.returning.length > 0) {
|
|
134
|
-
// For RETURNING, create coordinated attribute IDs like we do for INSERT
|
|
135
|
-
const returningScope = new RegisteredScope(updateCtx.scope);
|
|
136
|
-
|
|
137
|
-
// Create consistent attribute IDs for all table columns (both NEW and OLD)
|
|
138
|
-
const newColumnAttributeIds: number[] = [];
|
|
139
|
-
const oldColumnAttributeIds: number[] = [];
|
|
140
|
-
newAttributes.forEach((attr, columnIndex) => {
|
|
141
|
-
newColumnAttributeIds[columnIndex] = attr.id;
|
|
142
|
-
});
|
|
143
|
-
oldAttributes.forEach((attr, columnIndex) => {
|
|
144
|
-
oldColumnAttributeIds[columnIndex] = attr.id;
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
tableReference.tableSchema.columns.forEach((tableColumn, columnIndex) => {
|
|
148
|
-
const newAttributeId = newAttributes[columnIndex].id;
|
|
149
|
-
const oldAttributeId = oldAttributes[columnIndex].id;
|
|
150
|
-
|
|
151
|
-
// Register the unqualified column name in the RETURNING scope (defaults to NEW values)
|
|
152
|
-
returningScope.registerSymbol(tableColumn.name.toLowerCase(), (exp, s) => {
|
|
153
|
-
return new ColumnReferenceNode(
|
|
154
|
-
s,
|
|
155
|
-
exp as AST.ColumnExpr,
|
|
156
|
-
{
|
|
157
|
-
typeClass: 'scalar',
|
|
158
|
-
logicalType: tableColumn.logicalType,
|
|
159
|
-
nullable: !tableColumn.notNull,
|
|
160
|
-
isReadOnly: false
|
|
161
|
-
},
|
|
162
|
-
newAttributeId,
|
|
163
|
-
columnIndex
|
|
164
|
-
);
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
// Also register the table-qualified form (table.column) - defaults to NEW values
|
|
168
|
-
const tblQualified = `${tableReference.tableSchema.name.toLowerCase()}.${tableColumn.name.toLowerCase()}`;
|
|
169
|
-
returningScope.registerSymbol(tblQualified, (exp, s) =>
|
|
170
|
-
new ColumnReferenceNode(
|
|
171
|
-
s,
|
|
172
|
-
exp as AST.ColumnExpr,
|
|
173
|
-
{
|
|
174
|
-
typeClass: 'scalar',
|
|
175
|
-
logicalType: tableColumn.logicalType,
|
|
176
|
-
nullable: !tableColumn.notNull,
|
|
177
|
-
isReadOnly: false
|
|
178
|
-
},
|
|
179
|
-
newAttributeId,
|
|
180
|
-
columnIndex
|
|
181
|
-
)
|
|
182
|
-
);
|
|
183
|
-
|
|
184
|
-
// Register NEW.column for UPDATE RETURNING (updated values)
|
|
185
|
-
returningScope.registerSymbol(`new.${tableColumn.name.toLowerCase()}`, (exp, s) =>
|
|
186
|
-
new ColumnReferenceNode(
|
|
187
|
-
s,
|
|
188
|
-
exp as AST.ColumnExpr,
|
|
189
|
-
{
|
|
190
|
-
typeClass: 'scalar',
|
|
191
|
-
logicalType: tableColumn.logicalType,
|
|
192
|
-
nullable: !tableColumn.notNull,
|
|
193
|
-
isReadOnly: false
|
|
194
|
-
},
|
|
195
|
-
newAttributeId,
|
|
196
|
-
columnIndex
|
|
197
|
-
)
|
|
198
|
-
);
|
|
199
|
-
|
|
200
|
-
// Register OLD.column for UPDATE RETURNING (original values)
|
|
201
|
-
returningScope.registerSymbol(`old.${tableColumn.name.toLowerCase()}`, (exp, s) =>
|
|
202
|
-
new ColumnReferenceNode(
|
|
203
|
-
s,
|
|
204
|
-
exp as AST.ColumnExpr,
|
|
205
|
-
{
|
|
206
|
-
typeClass: 'scalar',
|
|
207
|
-
logicalType: tableColumn.logicalType,
|
|
208
|
-
nullable: !tableColumn.notNull,
|
|
209
|
-
isReadOnly: false
|
|
210
|
-
},
|
|
211
|
-
oldAttributeId,
|
|
212
|
-
columnIndex
|
|
213
|
-
)
|
|
214
|
-
);
|
|
215
|
-
});
|
|
216
|
-
|
|
217
|
-
const returningProjections = stmt.returning.map(rc => {
|
|
218
|
-
// TODO: Support RETURNING *
|
|
219
|
-
if (rc.type === 'all') throw new QuereusError('RETURNING * not yet supported', StatusCode.UNSUPPORTED);
|
|
220
|
-
|
|
221
|
-
// Infer alias from column name if not explicitly provided
|
|
222
|
-
let alias = rc.alias;
|
|
223
|
-
if (!alias && rc.expr.type === 'column') {
|
|
224
|
-
// For qualified column references like NEW.id or OLD.id, normalize to lowercase
|
|
225
|
-
if (rc.expr.table) {
|
|
226
|
-
alias = `${rc.expr.table.toLowerCase()}.${rc.expr.name.toLowerCase()}`;
|
|
227
|
-
} else {
|
|
228
|
-
alias = rc.expr.name.toLowerCase();
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
const columnIndex = tableReference.tableSchema.columns.findIndex(col => col.name.toLowerCase() === (rc.expr.type === 'column' ? rc.expr.name.toLowerCase() : ''));
|
|
233
|
-
const projAttributeId = rc.expr.type === 'column' && columnIndex !== -1 ? newColumnAttributeIds[columnIndex] : undefined;
|
|
234
|
-
|
|
235
|
-
return {
|
|
236
|
-
node: buildExpression({ ...updateCtx, scope: returningScope }, rc.expr) as ScalarPlanNode,
|
|
237
|
-
alias: alias,
|
|
238
|
-
attributeId: projAttributeId
|
|
239
|
-
};
|
|
240
|
-
});
|
|
241
|
-
|
|
242
|
-
// Create UpdateNode with both row descriptors for RETURNING coordination
|
|
243
|
-
const updateNodeWithDescriptor = new UpdateNode(
|
|
244
|
-
updateCtx.scope,
|
|
245
|
-
tableReference,
|
|
246
|
-
assignments,
|
|
247
|
-
sourceNode,
|
|
248
|
-
stmt.onConflict,
|
|
249
|
-
oldRowDescriptor,
|
|
250
|
-
newRowDescriptor,
|
|
251
|
-
flatRowDescriptor,
|
|
252
|
-
mutationContextValues.size > 0 ? mutationContextValues : undefined,
|
|
253
|
-
contextAttributes.length > 0 ? contextAttributes : undefined,
|
|
254
|
-
contextDescriptor
|
|
255
|
-
);
|
|
256
|
-
|
|
257
|
-
// For returning, we still need to execute the update before projecting
|
|
258
|
-
// Always inject ConstraintCheckNode for UPDATE operations (provides required metadata)
|
|
259
|
-
const constraintCheckNode = new ConstraintCheckNode(
|
|
260
|
-
updateCtx.scope,
|
|
261
|
-
updateNodeWithDescriptor,
|
|
262
|
-
tableReference,
|
|
263
|
-
RowOpFlag.UPDATE,
|
|
264
|
-
oldRowDescriptor,
|
|
265
|
-
newRowDescriptor,
|
|
266
|
-
flatRowDescriptor,
|
|
267
|
-
constraintChecks,
|
|
268
|
-
mutationContextValues.size > 0 ? mutationContextValues : undefined,
|
|
269
|
-
contextAttributes.length > 0 ? contextAttributes : undefined,
|
|
270
|
-
contextDescriptor
|
|
271
|
-
);
|
|
272
|
-
|
|
273
|
-
const updateExecutorNode = new DmlExecutorNode(
|
|
274
|
-
updateCtx.scope,
|
|
275
|
-
constraintCheckNode,
|
|
276
|
-
tableReference,
|
|
277
|
-
'update',
|
|
278
|
-
undefined, // onConflict not used for UPDATE
|
|
279
|
-
mutationContextValues.size > 0 ? mutationContextValues : undefined,
|
|
280
|
-
contextAttributes.length > 0 ? contextAttributes : undefined,
|
|
281
|
-
contextDescriptor
|
|
282
|
-
);
|
|
283
|
-
|
|
284
|
-
// Return the RETURNING results from the executed update
|
|
285
|
-
return new ReturningNode(updateCtx.scope, updateExecutorNode, returningProjections);
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
// Step 1: Create UpdateNode that produces updated rows (but doesn't execute them)
|
|
289
|
-
// Create newRowDescriptor and oldRowDescriptor for constraint checking with NEW/OLD references
|
|
290
|
-
const updateNode = new UpdateNode(
|
|
291
|
-
updateCtx.scope,
|
|
292
|
-
tableReference,
|
|
293
|
-
assignments,
|
|
294
|
-
sourceNode,
|
|
295
|
-
stmt.onConflict,
|
|
296
|
-
oldRowDescriptor,
|
|
297
|
-
newRowDescriptor,
|
|
298
|
-
flatRowDescriptor,
|
|
299
|
-
mutationContextValues.size > 0 ? mutationContextValues : undefined,
|
|
300
|
-
contextAttributes.length > 0 ? contextAttributes : undefined,
|
|
301
|
-
contextDescriptor
|
|
302
|
-
);
|
|
303
|
-
|
|
304
|
-
// Step 2: inject constraint checking AFTER update row generation
|
|
305
|
-
const constraintCheckNode = new ConstraintCheckNode(
|
|
306
|
-
updateCtx.scope,
|
|
307
|
-
updateNode,
|
|
308
|
-
tableReference,
|
|
309
|
-
RowOpFlag.UPDATE,
|
|
310
|
-
oldRowDescriptor,
|
|
311
|
-
newRowDescriptor,
|
|
312
|
-
flatRowDescriptor,
|
|
313
|
-
constraintChecks,
|
|
314
|
-
mutationContextValues.size > 0 ? mutationContextValues : undefined,
|
|
315
|
-
contextAttributes.length > 0 ? contextAttributes : undefined,
|
|
316
|
-
contextDescriptor
|
|
317
|
-
);
|
|
318
|
-
|
|
319
|
-
const updateExecutorNode = new DmlExecutorNode(
|
|
320
|
-
updateCtx.scope,
|
|
321
|
-
constraintCheckNode,
|
|
322
|
-
tableReference,
|
|
323
|
-
'update',
|
|
324
|
-
undefined, // onConflict not used for UPDATE
|
|
325
|
-
mutationContextValues.size > 0 ? mutationContextValues : undefined,
|
|
326
|
-
contextAttributes.length > 0 ? contextAttributes : undefined,
|
|
327
|
-
contextDescriptor
|
|
328
|
-
);
|
|
329
|
-
|
|
330
|
-
return new SinkNode(updateCtx.scope, updateExecutorNode, 'update');
|
|
331
|
-
}
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
import type * as AST from '../../parser/ast.js';
|
|
2
|
-
import type { PlanningContext } from '../planning-context.js';
|
|
3
|
-
import { CTENode, type CTEPlanNode, type CTEScopeNode } from '../nodes/cte-node.js';
|
|
4
|
-
import { RecursiveCTENode } from '../nodes/recursive-cte-node.js';
|
|
5
|
-
import { InternalRecursiveCTERefNode } from '../nodes/internal-recursive-cte-ref-node.js';
|
|
6
|
-
import { buildSelectStmt } from './select.js';
|
|
7
|
-
import type { RelationalPlanNode } from '../nodes/plan-node.js';
|
|
8
|
-
import { QuereusError } from '../../common/errors.js';
|
|
9
|
-
import { StatusCode } from '../../common/types.js';
|
|
10
|
-
import { RegisteredScope } from '../scopes/registered.js';
|
|
11
|
-
import { ColumnReferenceNode } from '../nodes/reference.js';
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Builds plan nodes for Common Table Expressions (CTEs) within a WITH clause.
|
|
15
|
-
* Returns a map of CTE names to their corresponding CTENode instances.
|
|
16
|
-
*/
|
|
17
|
-
export function buildWithClause(
|
|
18
|
-
ctx: PlanningContext,
|
|
19
|
-
withClause: AST.WithClause
|
|
20
|
-
): Map<string, CTEScopeNode> {
|
|
21
|
-
const cteNodes = new Map<string, CTEScopeNode>();
|
|
22
|
-
|
|
23
|
-
// Check for duplicate CTE names
|
|
24
|
-
const cteNames = new Set<string>();
|
|
25
|
-
for (const cte of withClause.ctes) {
|
|
26
|
-
const cteName = cte.name.toLowerCase();
|
|
27
|
-
if (cteNames.has(cteName)) {
|
|
28
|
-
throw new QuereusError(
|
|
29
|
-
`Duplicate CTE name '${cte.name}' in WITH clause`,
|
|
30
|
-
StatusCode.ERROR
|
|
31
|
-
);
|
|
32
|
-
}
|
|
33
|
-
cteNames.add(cteName);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// Build each CTE in order
|
|
37
|
-
// Note: For recursive CTEs, we may need to handle forward references
|
|
38
|
-
for (const cte of withClause.ctes) {
|
|
39
|
-
const cteNode = buildCommonTableExpr(ctx, cte, withClause.recursive, cteNodes, withClause.options) as CTEScopeNode;
|
|
40
|
-
cteNodes.set(cte.name.toLowerCase(), cteNode);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return cteNodes;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Builds a plan node for a single Common Table Expression.
|
|
48
|
-
*/
|
|
49
|
-
export function buildCommonTableExpr(
|
|
50
|
-
ctx: PlanningContext,
|
|
51
|
-
cte: AST.CommonTableExpr,
|
|
52
|
-
isRecursive: boolean,
|
|
53
|
-
existingCTEs: Map<string, CTEScopeNode>,
|
|
54
|
-
options?: AST.WithClauseOptions
|
|
55
|
-
): CTEPlanNode {
|
|
56
|
-
// Create a context that includes previously defined CTEs in scope
|
|
57
|
-
// This allows later CTEs to reference earlier ones
|
|
58
|
-
const cteContext = { ...ctx };
|
|
59
|
-
|
|
60
|
-
// Add existing CTEs to the scope for forward references
|
|
61
|
-
const cteScope = new RegisteredScope(ctx.scope);
|
|
62
|
-
for (const [cteName, cteNode] of existingCTEs) {
|
|
63
|
-
const attributes = cteNode.getAttributes();
|
|
64
|
-
cteNode.getType().columns.forEach((col, i) => {
|
|
65
|
-
const attr = attributes[i];
|
|
66
|
-
// Register CTE columns with qualified names only to avoid conflicts with table columns
|
|
67
|
-
const qualifiedColumnName = `${cteName}.${col.name.toLowerCase()}`;
|
|
68
|
-
cteScope.registerSymbol(qualifiedColumnName, (exp, s) =>
|
|
69
|
-
new ColumnReferenceNode(s, exp as AST.ColumnExpr, col.type, attr.id, i));
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
cteContext.scope = cteScope;
|
|
73
|
-
|
|
74
|
-
// Check if this is a recursive CTE with UNION structure
|
|
75
|
-
if (isRecursive && cte.query.type === 'select' && cte.query.compound) {
|
|
76
|
-
return buildRecursiveCTE(cteContext, cte, options);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// For non-recursive CTEs or recursive CTEs without UNION structure
|
|
80
|
-
let query: RelationalPlanNode;
|
|
81
|
-
|
|
82
|
-
if (cte.query.type === 'select') {
|
|
83
|
-
query = buildSelectStmt(cteContext, cte.query) as RelationalPlanNode;
|
|
84
|
-
} else {
|
|
85
|
-
// CTE can also be INSERT, UPDATE, or DELETE statements
|
|
86
|
-
throw new QuereusError(
|
|
87
|
-
'Non-SELECT CTEs are not yet supported',
|
|
88
|
-
StatusCode.UNSUPPORTED
|
|
89
|
-
);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// Determine materialization strategy
|
|
93
|
-
let materializationHint = cte.materializationHint;
|
|
94
|
-
if (!materializationHint) {
|
|
95
|
-
// Default strategy: materialize if CTE is likely to be reused
|
|
96
|
-
// For now, we'll default to not materialized for simplicity
|
|
97
|
-
materializationHint = 'not_materialized';
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
return new CTENode(
|
|
101
|
-
ctx.scope,
|
|
102
|
-
cte.name,
|
|
103
|
-
cte.columns,
|
|
104
|
-
query,
|
|
105
|
-
materializationHint,
|
|
106
|
-
isRecursive
|
|
107
|
-
);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Builds a recursive CTE node from a CTE with UNION structure.
|
|
112
|
-
*/
|
|
113
|
-
function buildRecursiveCTE(
|
|
114
|
-
ctx: PlanningContext,
|
|
115
|
-
cte: AST.CommonTableExpr,
|
|
116
|
-
options?: AST.WithClauseOptions
|
|
117
|
-
): RecursiveCTENode {
|
|
118
|
-
const selectStmt = cte.query as AST.SelectStmt;
|
|
119
|
-
|
|
120
|
-
// Validate recursive CTE structure - check for compound operation
|
|
121
|
-
if (!selectStmt.compound) {
|
|
122
|
-
throw new QuereusError(
|
|
123
|
-
`Recursive CTE '${cte.name}' must use UNION or UNION ALL`,
|
|
124
|
-
StatusCode.ERROR
|
|
125
|
-
);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// Extract base case (the main SELECT) and recursive case (the compound part)
|
|
129
|
-
const baseCaseStmt: AST.SelectStmt = {
|
|
130
|
-
...selectStmt,
|
|
131
|
-
compound: undefined
|
|
132
|
-
};
|
|
133
|
-
|
|
134
|
-
const recursiveCaseStmt = selectStmt.compound.select;
|
|
135
|
-
const isUnionAll = selectStmt.compound.op === 'unionAll';
|
|
136
|
-
|
|
137
|
-
// Build the base case query (without CTE self-reference)
|
|
138
|
-
const baseCaseQuery = buildSelectStmt(ctx, baseCaseStmt) as RelationalPlanNode;
|
|
139
|
-
|
|
140
|
-
// Determine materialization strategy (recursive CTEs should typically be materialized)
|
|
141
|
-
const materializationHint = cte.materializationHint || 'materialized';
|
|
142
|
-
|
|
143
|
-
// Create the final recursive CTE node first (so we have the tableDescriptor)
|
|
144
|
-
const recursiveCTENode = new RecursiveCTENode(
|
|
145
|
-
ctx.scope,
|
|
146
|
-
cte.name,
|
|
147
|
-
cte.columns,
|
|
148
|
-
baseCaseQuery,
|
|
149
|
-
baseCaseQuery, // Temporary - will be replaced with actual recursive case
|
|
150
|
-
isUnionAll,
|
|
151
|
-
materializationHint,
|
|
152
|
-
options?.maxRecursion
|
|
153
|
-
);
|
|
154
|
-
|
|
155
|
-
// For the recursive case, we need to create a special context where the CTE name
|
|
156
|
-
// references the working table (this will be handled at runtime)
|
|
157
|
-
const recursiveContext = { ...ctx };
|
|
158
|
-
|
|
159
|
-
// Create an internal recursive reference node that will look up the working table at runtime
|
|
160
|
-
const internalRefNode = new InternalRecursiveCTERefNode(
|
|
161
|
-
ctx.scope,
|
|
162
|
-
cte.name,
|
|
163
|
-
recursiveCTENode.getAttributes(),
|
|
164
|
-
recursiveCTENode.getType(),
|
|
165
|
-
recursiveCTENode.tableDescriptor
|
|
166
|
-
);
|
|
167
|
-
|
|
168
|
-
// Build the recursive case query with a simple replacement strategy
|
|
169
|
-
// We'll replace CTE references with the internal recursive reference during the FROM clause processing
|
|
170
|
-
const recursiveCteMap = new Map<string, CTEScopeNode>();
|
|
171
|
-
recursiveCteMap.set(cte.name.toLowerCase(), internalRefNode);
|
|
172
|
-
|
|
173
|
-
// Build the recursive case query
|
|
174
|
-
const recursiveCaseQuery = buildSelectStmt(recursiveContext, recursiveCaseStmt, recursiveCteMap) as RelationalPlanNode;
|
|
175
|
-
|
|
176
|
-
// Now update the recursive CTE node with the actual recursive case query
|
|
177
|
-
recursiveCTENode.setRecursiveCaseQuery(recursiveCaseQuery);
|
|
178
|
-
|
|
179
|
-
return recursiveCTENode;
|
|
180
|
-
}
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Utility to detect correlated subqueries
|
|
3
|
-
* A subquery is correlated if it references columns from outer query scopes
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { isRelationalNode, type PlanNode, type RelationalPlanNode } from '../nodes/plan-node.js';
|
|
7
|
-
import { PlanNodeType } from '../nodes/plan-node-type.js';
|
|
8
|
-
import type { ColumnReferenceNode } from '../nodes/reference.js';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Detects if a subquery is correlated by checking if it references any attributes
|
|
12
|
-
* that are not defined within its own scope.
|
|
13
|
-
*/
|
|
14
|
-
export function isCorrelatedSubquery(subqueryNode: RelationalPlanNode): boolean {
|
|
15
|
-
// Collect all attributes defined within the subquery
|
|
16
|
-
const definedAttributes = new Set<number>();
|
|
17
|
-
collectDefinedAttributes(subqueryNode, definedAttributes);
|
|
18
|
-
|
|
19
|
-
// Check if any column references use attributes not defined within the subquery
|
|
20
|
-
return hasExternalReferences(subqueryNode, definedAttributes);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Recursively collect all attributes defined by relational nodes within a subtree
|
|
25
|
-
*/
|
|
26
|
-
function collectDefinedAttributes(node: PlanNode, definedAttributes: Set<number>): void {
|
|
27
|
-
// If this is a relational node, add its attributes
|
|
28
|
-
const isRelational = isRelationalNode(node);
|
|
29
|
-
if (isRelational) {
|
|
30
|
-
const attributes = node.getAttributes();
|
|
31
|
-
for (const attr of attributes) {
|
|
32
|
-
definedAttributes.add(attr.id);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// Recursively process all children
|
|
37
|
-
const children = node.getChildren();
|
|
38
|
-
for (const child of children) {
|
|
39
|
-
collectDefinedAttributes(child, definedAttributes);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// Also process relational children if any
|
|
43
|
-
if (isRelational) {
|
|
44
|
-
const relations = node.getRelations();
|
|
45
|
-
for (const relation of relations) {
|
|
46
|
-
collectDefinedAttributes(relation, definedAttributes);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Check if the subtree contains any column references to attributes not in the defined set
|
|
53
|
-
*/
|
|
54
|
-
function hasExternalReferences(node: PlanNode, definedAttributes: Set<number>): boolean {
|
|
55
|
-
// Check if this is a column reference
|
|
56
|
-
if (node.nodeType === PlanNodeType.ColumnReference) {
|
|
57
|
-
const colRef = node as ColumnReferenceNode;
|
|
58
|
-
// If the referenced attribute is not defined within the subquery, it's an external reference
|
|
59
|
-
if (!definedAttributes.has(colRef.attributeId)) {
|
|
60
|
-
return true; // Found a correlated reference
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// Check all children
|
|
65
|
-
const children = node.getChildren();
|
|
66
|
-
for (const child of children) {
|
|
67
|
-
if (hasExternalReferences(child, definedAttributes)) {
|
|
68
|
-
return true;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// Also check relational children if any
|
|
73
|
-
if (isRelationalNode(node)) {
|
|
74
|
-
const relations = node.getRelations();
|
|
75
|
-
for (const relation of relations) {
|
|
76
|
-
if (hasExternalReferences(relation, definedAttributes)) {
|
|
77
|
-
return true;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
return false;
|
|
83
|
-
}
|