@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,106 +0,0 @@
|
|
|
1
|
-
import type { Instruction, InstructionRun, RuntimeContext } from '../types.js';
|
|
2
|
-
import { emitPlanNode, createValidatedInstruction } from '../emitters.js';
|
|
3
|
-
import { QuereusError } from '../../common/errors.js';
|
|
4
|
-
import { StatusCode, type SqlValue, type Row } from '../../common/types.js';
|
|
5
|
-
import type { FunctionSchema, IntegratedTableValuedFunc, TableValuedFunc } from '../../schema/function.js';
|
|
6
|
-
import { isTableValuedFunctionSchema } from '../../schema/function.js';
|
|
7
|
-
import type { EmissionContext } from '../emission-context.js';
|
|
8
|
-
import type { TableFunctionCallNode } from '../../planner/nodes/table-function-call.js';
|
|
9
|
-
import { buildRowDescriptor } from '../../util/row-descriptor.js';
|
|
10
|
-
import { withRowContextGenerator } from '../context-helpers.js';
|
|
11
|
-
|
|
12
|
-
export function emitTableValuedFunctionCall(plan: TableFunctionCallNode, ctx: EmissionContext): Instruction {
|
|
13
|
-
const functionName = plan.functionName.toLowerCase();
|
|
14
|
-
const numArgs = plan.operands.length;
|
|
15
|
-
|
|
16
|
-
// Create row descriptor for function output attributes
|
|
17
|
-
const rowDescriptor = buildRowDescriptor(plan.getAttributes());
|
|
18
|
-
|
|
19
|
-
// Look up the function during emission and record the dependency
|
|
20
|
-
// First try exact argument count, then try variable argument function
|
|
21
|
-
let functionSchema = ctx.findFunction(functionName, numArgs);
|
|
22
|
-
if (!functionSchema) {
|
|
23
|
-
functionSchema = ctx.findFunction(functionName, -1); // Try variable argument function
|
|
24
|
-
}
|
|
25
|
-
if (!functionSchema) {
|
|
26
|
-
throw new QuereusError(`Unknown function: ${functionName}/${numArgs}`, StatusCode.ERROR);
|
|
27
|
-
}
|
|
28
|
-
if (!isTableValuedFunctionSchema(functionSchema)) {
|
|
29
|
-
throw new QuereusError(`Function ${functionName}/${numArgs} is not a table-valued function`, StatusCode.ERROR);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// Capture the function key for runtime retrieval (use the actual function's numArgs)
|
|
33
|
-
const functionKey = `function:${functionName}/${functionSchema.numArgs}`;
|
|
34
|
-
|
|
35
|
-
async function* runIntegrated(innerCtx: RuntimeContext, ...args: Array<SqlValue>): AsyncIterable<Row> {
|
|
36
|
-
// Use the captured function schema instead of doing a fresh lookup
|
|
37
|
-
const capturedFunction = ctx.getCapturedSchemaObject<FunctionSchema>(functionKey);
|
|
38
|
-
if (!capturedFunction) {
|
|
39
|
-
throw new QuereusError(`Function ${functionName}/${numArgs} was not captured during emission`, StatusCode.INTERNAL);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
if (!isTableValuedFunctionSchema(capturedFunction)) {
|
|
43
|
-
throw new QuereusError(`Function ${functionName}/${numArgs} is not a table-valued function at runtime`, StatusCode.INTERNAL);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
try {
|
|
47
|
-
// Check if this is a database-aware function
|
|
48
|
-
const result = (capturedFunction.implementation as IntegratedTableValuedFunc)!(innerCtx.db, ...args);
|
|
49
|
-
|
|
50
|
-
// Handle both direct AsyncIterable and Promise<AsyncIterable>
|
|
51
|
-
const iterable = result instanceof Promise ? await result : result;
|
|
52
|
-
|
|
53
|
-
yield* withRowContextGenerator(innerCtx, rowDescriptor, iterable, async function* (row) {
|
|
54
|
-
yield row;
|
|
55
|
-
});
|
|
56
|
-
} catch (error: any) {
|
|
57
|
-
throw new QuereusError(`Table-valued function ${functionName} failed: ${error.message}`, StatusCode.ERROR, error);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
async function* run(innerCtx: RuntimeContext, ...args: Array<SqlValue>): AsyncIterable<Row> {
|
|
62
|
-
// Use the captured function schema instead of doing a fresh lookup
|
|
63
|
-
const capturedFunction = ctx.getCapturedSchemaObject<FunctionSchema>(functionKey);
|
|
64
|
-
if (!capturedFunction) {
|
|
65
|
-
throw new QuereusError(`Function ${functionName}/${functionSchema!.numArgs} was not captured during emission`, StatusCode.INTERNAL);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
if (!isTableValuedFunctionSchema(capturedFunction)) {
|
|
69
|
-
throw new QuereusError(`Function ${functionName}/${numArgs} is not a table-valued function at runtime`, StatusCode.INTERNAL);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// Validate argument count for variable argument functions
|
|
73
|
-
if (capturedFunction.numArgs === -1) {
|
|
74
|
-
// Special validation for known variable argument functions
|
|
75
|
-
if (functionName === 'json_each' || functionName === 'json_tree') {
|
|
76
|
-
if (args.length < 1 || args.length > 2) {
|
|
77
|
-
throw new QuereusError(`${functionName} requires 1 or 2 arguments (jsonSource, [rootPath])`, StatusCode.ERROR);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
try {
|
|
83
|
-
// Check if this is a database-aware function
|
|
84
|
-
const result = (capturedFunction.implementation as TableValuedFunc)!(...args);
|
|
85
|
-
|
|
86
|
-
// Handle both direct AsyncIterable and Promise<AsyncIterable>
|
|
87
|
-
const iterable = result instanceof Promise ? await result : result;
|
|
88
|
-
|
|
89
|
-
yield* withRowContextGenerator(innerCtx, rowDescriptor, iterable, async function* (row) {
|
|
90
|
-
yield row;
|
|
91
|
-
});
|
|
92
|
-
} catch (error: any) {
|
|
93
|
-
throw new QuereusError(`Table-valued function ${functionName} failed: ${error.message}`, StatusCode.ERROR, error);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
const operandExprs = plan.operands.map(operand => emitPlanNode(operand, ctx));
|
|
98
|
-
const runFunction = functionSchema.isIntegrated ? runIntegrated : run;
|
|
99
|
-
|
|
100
|
-
return createValidatedInstruction(
|
|
101
|
-
[...operandExprs],
|
|
102
|
-
runFunction as InstructionRun,
|
|
103
|
-
ctx,
|
|
104
|
-
`TVF:${plan.functionName}(${plan.operands.length})`
|
|
105
|
-
);
|
|
106
|
-
}
|
|
@@ -1,302 +0,0 @@
|
|
|
1
|
-
import { StatusCode } from "../../common/types.js";
|
|
2
|
-
import { QuereusError } from "../../common/errors.js";
|
|
3
|
-
import type { SqlValue } from "../../common/types.js";
|
|
4
|
-
import type { Instruction, InstructionRun, RuntimeContext } from "../types.js";
|
|
5
|
-
import type { BinaryOpNode } from "../../planner/nodes/scalar.js";
|
|
6
|
-
import { emitPlanNode } from "../emitters.js";
|
|
7
|
-
import type { EmissionContext } from "../emission-context.js";
|
|
8
|
-
import { Temporal } from 'temporal-polyfill';
|
|
9
|
-
import { TIMESPAN_TYPE } from "../../types/temporal-types.js";
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Check if a value is a date string (YYYY-MM-DD format)
|
|
13
|
-
*/
|
|
14
|
-
function isDateValue(v: SqlValue): boolean {
|
|
15
|
-
if (typeof v !== 'string') return false;
|
|
16
|
-
// Simple check for ISO 8601 date format
|
|
17
|
-
return /^\d{4}-\d{2}-\d{2}$/.test(v);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Check if a value is a time string (HH:MM:SS format)
|
|
22
|
-
*/
|
|
23
|
-
function isTimeValue(v: SqlValue): boolean {
|
|
24
|
-
if (typeof v !== 'string') return false;
|
|
25
|
-
// Simple check for ISO 8601 time format
|
|
26
|
-
return /^\d{2}:\d{2}:\d{2}/.test(v);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Check if a value is a datetime string (ISO 8601 format)
|
|
31
|
-
*/
|
|
32
|
-
function isDateTimeValue(v: SqlValue): boolean {
|
|
33
|
-
if (typeof v !== 'string') return false;
|
|
34
|
-
// Check for ISO 8601 datetime format (with T separator)
|
|
35
|
-
return v.includes('T') && /^\d{4}-\d{2}-\d{2}T/.test(v);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Check if a value is a timespan/duration string (ISO 8601 duration format)
|
|
40
|
-
*/
|
|
41
|
-
function isTimespanValue(v: SqlValue): boolean {
|
|
42
|
-
if (typeof v !== 'string') return false;
|
|
43
|
-
// ISO 8601 duration starts with P (or -P for negative)
|
|
44
|
-
return v.startsWith('P') || v.startsWith('-P');
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Try to perform temporal arithmetic on two values.
|
|
49
|
-
* Returns the result if successful, or undefined if the values are not temporal types.
|
|
50
|
-
* Throws QuereusError if the operation is invalid.
|
|
51
|
-
*/
|
|
52
|
-
export function tryTemporalArithmetic(operator: string, v1: SqlValue, v2: SqlValue): SqlValue | undefined {
|
|
53
|
-
if (v1 === null || v2 === null) return null;
|
|
54
|
-
|
|
55
|
-
// Detect types at runtime
|
|
56
|
-
const isV1Date = isDateValue(v1);
|
|
57
|
-
const isV1Time = isTimeValue(v1);
|
|
58
|
-
const isV1DateTime = isDateTimeValue(v1);
|
|
59
|
-
const isV1Timespan = isTimespanValue(v1);
|
|
60
|
-
|
|
61
|
-
const isV2Date = isDateValue(v2);
|
|
62
|
-
const isV2Time = isTimeValue(v2);
|
|
63
|
-
const isV2DateTime = isDateTimeValue(v2);
|
|
64
|
-
const isV2Timespan = isTimespanValue(v2);
|
|
65
|
-
|
|
66
|
-
// If neither operand is temporal, return undefined to signal non-temporal operation
|
|
67
|
-
const isV1Temporal = isV1Date || isV1Time || isV1DateTime || isV1Timespan;
|
|
68
|
-
const isV2Temporal = isV2Date || isV2Time || isV2DateTime || isV2Timespan;
|
|
69
|
-
if (!isV1Temporal && !isV2Temporal) {
|
|
70
|
-
return undefined;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
try {
|
|
74
|
-
|
|
75
|
-
// DATE/DATETIME - DATE/DATETIME → TIMESPAN
|
|
76
|
-
if (operator === '-' &&
|
|
77
|
-
(isV1Date || isV1DateTime) &&
|
|
78
|
-
(isV2Date || isV2DateTime)) {
|
|
79
|
-
|
|
80
|
-
// Parse both values as dates
|
|
81
|
-
const date1 = isV1DateTime
|
|
82
|
-
? Temporal.PlainDateTime.from(v1 as string).toPlainDate()
|
|
83
|
-
: Temporal.PlainDate.from(v1 as string);
|
|
84
|
-
const date2 = isV2DateTime
|
|
85
|
-
? Temporal.PlainDateTime.from(v2 as string).toPlainDate()
|
|
86
|
-
: Temporal.PlainDate.from(v2 as string);
|
|
87
|
-
|
|
88
|
-
const duration = date1.since(date2);
|
|
89
|
-
return duration.toString();
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// TIME - TIME → TIMESPAN
|
|
93
|
-
if (operator === '-' && isV1Time && isV2Time) {
|
|
94
|
-
const time1 = Temporal.PlainTime.from(v1 as string);
|
|
95
|
-
const time2 = Temporal.PlainTime.from(v2 as string);
|
|
96
|
-
const duration = time1.since(time2);
|
|
97
|
-
return duration.toString();
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// DATE + TIMESPAN → DATE
|
|
101
|
-
if (operator === '+' && isV1Date && isV2Timespan) {
|
|
102
|
-
const date = Temporal.PlainDate.from(v1 as string);
|
|
103
|
-
const duration = Temporal.Duration.from(v2 as string);
|
|
104
|
-
const result = date.add(duration);
|
|
105
|
-
return result.toString();
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// TIMESPAN + DATE → DATE (commutative)
|
|
109
|
-
if (operator === '+' && isV1Timespan && isV2Date) {
|
|
110
|
-
const duration = Temporal.Duration.from(v1 as string);
|
|
111
|
-
const date = Temporal.PlainDate.from(v2 as string);
|
|
112
|
-
const result = date.add(duration);
|
|
113
|
-
return result.toString();
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// DATE - TIMESPAN → DATE
|
|
117
|
-
if (operator === '-' && isV1Date && isV2Timespan) {
|
|
118
|
-
const date = Temporal.PlainDate.from(v1 as string);
|
|
119
|
-
const duration = Temporal.Duration.from(v2 as string);
|
|
120
|
-
const result = date.subtract(duration);
|
|
121
|
-
return result.toString();
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// DATETIME + TIMESPAN → DATETIME
|
|
125
|
-
if (operator === '+' && isV1DateTime && isV2Timespan) {
|
|
126
|
-
const dt = Temporal.PlainDateTime.from(v1 as string);
|
|
127
|
-
const duration = Temporal.Duration.from(v2 as string);
|
|
128
|
-
const result = dt.add(duration);
|
|
129
|
-
return result.toString();
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// TIMESPAN + DATETIME → DATETIME (commutative)
|
|
133
|
-
if (operator === '+' && isV1Timespan && isV2DateTime) {
|
|
134
|
-
const duration = Temporal.Duration.from(v1 as string);
|
|
135
|
-
const dt = Temporal.PlainDateTime.from(v2 as string);
|
|
136
|
-
const result = dt.add(duration);
|
|
137
|
-
return result.toString();
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// DATETIME - TIMESPAN → DATETIME
|
|
141
|
-
if (operator === '-' && isV1DateTime && isV2Timespan) {
|
|
142
|
-
const dt = Temporal.PlainDateTime.from(v1 as string);
|
|
143
|
-
const duration = Temporal.Duration.from(v2 as string);
|
|
144
|
-
const result = dt.subtract(duration);
|
|
145
|
-
return result.toString();
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// TIME + TIMESPAN → TIME
|
|
149
|
-
if (operator === '+' && isV1Time && isV2Timespan) {
|
|
150
|
-
const time = Temporal.PlainTime.from(v1 as string);
|
|
151
|
-
const duration = Temporal.Duration.from(v2 as string);
|
|
152
|
-
const result = time.add(duration);
|
|
153
|
-
return result.toString();
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
// TIMESPAN + TIME → TIME (commutative)
|
|
157
|
-
if (operator === '+' && isV1Timespan && isV2Time) {
|
|
158
|
-
const duration = Temporal.Duration.from(v1 as string);
|
|
159
|
-
const time = Temporal.PlainTime.from(v2 as string);
|
|
160
|
-
const result = time.add(duration);
|
|
161
|
-
return result.toString();
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
// TIME - TIMESPAN → TIME
|
|
165
|
-
if (operator === '-' && isV1Time && isV2Timespan) {
|
|
166
|
-
const time = Temporal.PlainTime.from(v1 as string);
|
|
167
|
-
const duration = Temporal.Duration.from(v2 as string);
|
|
168
|
-
const result = time.subtract(duration);
|
|
169
|
-
return result.toString();
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// TIMESPAN + TIMESPAN → TIMESPAN
|
|
173
|
-
if (operator === '+' && isV1Timespan && isV2Timespan) {
|
|
174
|
-
const d1 = Temporal.Duration.from(v1 as string);
|
|
175
|
-
const d2 = Temporal.Duration.from(v2 as string);
|
|
176
|
-
const result = d1.add(d2);
|
|
177
|
-
return result.toString();
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
// TIMESPAN - TIMESPAN → TIMESPAN
|
|
181
|
-
if (operator === '-' && isV1Timespan && isV2Timespan) {
|
|
182
|
-
const d1 = Temporal.Duration.from(v1 as string);
|
|
183
|
-
const d2 = Temporal.Duration.from(v2 as string);
|
|
184
|
-
const result = d1.subtract(d2);
|
|
185
|
-
return result.toString();
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// TIMESPAN * NUMBER → TIMESPAN
|
|
189
|
-
if (operator === '*' && isV1Timespan && typeof v2 === 'number') {
|
|
190
|
-
const duration = Temporal.Duration.from(v1 as string);
|
|
191
|
-
// Convert to seconds, multiply, convert back
|
|
192
|
-
const totalSeconds = duration.total({ unit: 'seconds' });
|
|
193
|
-
const newDuration = Temporal.Duration.from({ seconds: totalSeconds * v2 });
|
|
194
|
-
return newDuration.toString();
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
// NUMBER * TIMESPAN → TIMESPAN (commutative)
|
|
198
|
-
if (operator === '*' && typeof v1 === 'number' && isV2Timespan) {
|
|
199
|
-
const duration = Temporal.Duration.from(v2 as string);
|
|
200
|
-
const totalSeconds = duration.total({ unit: 'seconds' });
|
|
201
|
-
const newDuration = Temporal.Duration.from({ seconds: totalSeconds * v1 });
|
|
202
|
-
return newDuration.toString();
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
// TIMESPAN / NUMBER → TIMESPAN
|
|
206
|
-
if (operator === '/' && isV1Timespan && typeof v2 === 'number') {
|
|
207
|
-
if (v2 === 0) return null;
|
|
208
|
-
const duration = Temporal.Duration.from(v1 as string);
|
|
209
|
-
const totalSeconds = duration.total({ unit: 'seconds' });
|
|
210
|
-
const newDuration = Temporal.Duration.from({ seconds: totalSeconds / v2 });
|
|
211
|
-
return newDuration.toString();
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
// TIMESPAN / TIMESPAN → NUMBER (ratio)
|
|
215
|
-
if (operator === '/' && isV1Timespan && isV2Timespan) {
|
|
216
|
-
const d1 = Temporal.Duration.from(v1 as string);
|
|
217
|
-
const d2 = Temporal.Duration.from(v2 as string);
|
|
218
|
-
const total1 = d1.total({ unit: 'seconds' });
|
|
219
|
-
const total2 = d2.total({ unit: 'seconds' });
|
|
220
|
-
if (total2 === 0) return null;
|
|
221
|
-
return total1 / total2;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
// If we get here, the operation is not supported
|
|
225
|
-
throw new QuereusError(
|
|
226
|
-
`Unsupported temporal operation`,
|
|
227
|
-
StatusCode.UNSUPPORTED
|
|
228
|
-
);
|
|
229
|
-
} catch (e) {
|
|
230
|
-
// Invalid temporal operation - return null
|
|
231
|
-
if (e instanceof QuereusError) throw e;
|
|
232
|
-
return null;
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
/**
|
|
237
|
-
* Emit temporal arithmetic operations
|
|
238
|
-
* Handles operations between temporal types (DATE, TIME, DATETIME, TIMESPAN)
|
|
239
|
-
*/
|
|
240
|
-
export function emitTemporalArithmetic(plan: BinaryOpNode, ctx: EmissionContext): Instruction {
|
|
241
|
-
const operator = plan.expression.operator;
|
|
242
|
-
|
|
243
|
-
function run(ctx: RuntimeContext, v1: SqlValue, v2: SqlValue): SqlValue {
|
|
244
|
-
return tryTemporalArithmetic(operator, v1, v2) ?? null;
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
const leftExpr = emitPlanNode(plan.left, ctx);
|
|
248
|
-
const rightExpr = emitPlanNode(plan.right, ctx);
|
|
249
|
-
|
|
250
|
-
return {
|
|
251
|
-
params: [leftExpr, rightExpr],
|
|
252
|
-
run: run as InstructionRun,
|
|
253
|
-
note: `${operator}(temporal)`
|
|
254
|
-
};
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
/**
|
|
258
|
-
* Attempts to perform temporal comparison. Returns undefined if not a temporal comparison.
|
|
259
|
-
* This allows the caller to fall back to standard comparison logic.
|
|
260
|
-
*
|
|
261
|
-
* Temporal types that need special comparison logic (beyond lexicographic string comparison):
|
|
262
|
-
* - TIMESPAN: Durations need to be compared semantically, not lexicographically
|
|
263
|
-
* (e.g., "PT30M" > "PT1H" lexicographically, but 30 minutes < 1 hour semantically)
|
|
264
|
-
*
|
|
265
|
-
* Note: DATE, TIME, and DATETIME use ISO 8601 format which compares correctly lexicographically,
|
|
266
|
-
* so they don't need special handling here.
|
|
267
|
-
*
|
|
268
|
-
* @param operator The comparison operator (=, !=, <, <=, >, >=)
|
|
269
|
-
* @param v1 First value
|
|
270
|
-
* @param v2 Second value
|
|
271
|
-
* @returns Comparison result (boolean) if temporal comparison, undefined otherwise
|
|
272
|
-
*/
|
|
273
|
-
export function tryTemporalComparison(operator: string, v1: SqlValue, v2: SqlValue): SqlValue | undefined {
|
|
274
|
-
// Check if both values are timespans
|
|
275
|
-
// Timespans are the only temporal type that needs special comparison logic
|
|
276
|
-
// because ISO 8601 duration strings don't compare correctly lexicographically
|
|
277
|
-
if (!isTimespanValue(v1) || !isTimespanValue(v2)) {
|
|
278
|
-
return undefined;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
// Use the TIMESPAN_TYPE's compare function
|
|
282
|
-
const cmp = TIMESPAN_TYPE.compare!(v1, v2);
|
|
283
|
-
|
|
284
|
-
switch (operator) {
|
|
285
|
-
case '=':
|
|
286
|
-
case '==':
|
|
287
|
-
return cmp === 0;
|
|
288
|
-
case '!=':
|
|
289
|
-
case '<>':
|
|
290
|
-
return cmp !== 0;
|
|
291
|
-
case '<':
|
|
292
|
-
return cmp < 0;
|
|
293
|
-
case '<=':
|
|
294
|
-
return cmp <= 0;
|
|
295
|
-
case '>':
|
|
296
|
-
return cmp > 0;
|
|
297
|
-
case '>=':
|
|
298
|
-
return cmp >= 0;
|
|
299
|
-
default:
|
|
300
|
-
return undefined;
|
|
301
|
-
}
|
|
302
|
-
}
|
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
import type { EmissionContext } from '../emission-context.js';
|
|
2
|
-
import type { TransactionNode } from '../../planner/nodes/transaction-node.js';
|
|
3
|
-
import type { Instruction, RuntimeContext, InstructionRun } from '../types.js';
|
|
4
|
-
import type { SqlValue } from '../../common/types.js';
|
|
5
|
-
import { createLogger } from '../../common/logger.js';
|
|
6
|
-
import { quereusError } from '../../common/errors.js';
|
|
7
|
-
import { StatusCode } from '../../common/types.js';
|
|
8
|
-
|
|
9
|
-
const log = createLogger('runtime:emit:transaction');
|
|
10
|
-
|
|
11
|
-
// Simple hash function to convert savepoint names to indices
|
|
12
|
-
function hashSavepointName(name: string): number {
|
|
13
|
-
let hash = 0;
|
|
14
|
-
for (let i = 0; i < name.length; i++) {
|
|
15
|
-
const char = name.charCodeAt(i);
|
|
16
|
-
hash = ((hash << 5) - hash) + char;
|
|
17
|
-
hash = hash & hash; // Convert to 32-bit integer
|
|
18
|
-
}
|
|
19
|
-
return Math.abs(hash);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export function emitTransaction(plan: TransactionNode, _ctx: EmissionContext): Instruction {
|
|
23
|
-
// Select the operation function at emit time
|
|
24
|
-
let run: (ctx: RuntimeContext) => Promise<SqlValue | undefined>;
|
|
25
|
-
let note: string;
|
|
26
|
-
|
|
27
|
-
switch (plan.operation) {
|
|
28
|
-
case 'begin': {
|
|
29
|
-
run = async (rctx: RuntimeContext) => {
|
|
30
|
-
const connections = rctx.db.getAllConnections();
|
|
31
|
-
log(`BEGIN: Found ${connections.length} active connections`);
|
|
32
|
-
|
|
33
|
-
for (const connection of connections) {
|
|
34
|
-
try {
|
|
35
|
-
await connection.begin();
|
|
36
|
-
log(`BEGIN: Successfully called on connection ${connection.connectionId}`);
|
|
37
|
-
} catch (error) {
|
|
38
|
-
log(`BEGIN: Error on connection ${connection.connectionId}: %O`, error);
|
|
39
|
-
throw error;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
// Reflect explicit transaction state in Database
|
|
43
|
-
rctx.db.markExplicitTransactionStart();
|
|
44
|
-
// Reset any prior change tracking at the start of an explicit transaction
|
|
45
|
-
rctx.db._clearChangeLog();
|
|
46
|
-
return null;
|
|
47
|
-
};
|
|
48
|
-
note = 'BEGIN';
|
|
49
|
-
break;
|
|
50
|
-
}
|
|
51
|
-
case 'commit': {
|
|
52
|
-
run = async (rctx: RuntimeContext) => {
|
|
53
|
-
// Snapshot connections before evaluating deferred constraints
|
|
54
|
-
// (constraint evaluation may open additional connections that shouldn't be committed)
|
|
55
|
-
const connectionsToCommit = rctx.db.getAllConnections();
|
|
56
|
-
log(`COMMIT: Found ${connectionsToCommit.length} active connections`);
|
|
57
|
-
|
|
58
|
-
try {
|
|
59
|
-
// Evaluate global assertions and deferred row-level constraints BEFORE committing connections.
|
|
60
|
-
await rctx.db.runGlobalAssertions();
|
|
61
|
-
await rctx.db.runDeferredRowConstraints();
|
|
62
|
-
|
|
63
|
-
// Mark coordinated commit to relax layer validation for sibling layers
|
|
64
|
-
rctx.db._beginCoordinatedCommit();
|
|
65
|
-
try {
|
|
66
|
-
// Commit sequentially to avoid race conditions with layer promotion
|
|
67
|
-
for (const connection of connectionsToCommit) {
|
|
68
|
-
try {
|
|
69
|
-
await connection.commit();
|
|
70
|
-
log(`COMMIT: Successfully called on connection ${connection.connectionId}`);
|
|
71
|
-
} catch (error) {
|
|
72
|
-
log(`COMMIT: Error on connection ${connection.connectionId}: %O`, error);
|
|
73
|
-
throw error;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
} finally {
|
|
77
|
-
rctx.db._endCoordinatedCommit();
|
|
78
|
-
}
|
|
79
|
-
} catch (e) {
|
|
80
|
-
// If assertions fail (or a commit throws), rollback all connections
|
|
81
|
-
await Promise.allSettled(rctx.db.getAllConnections().map(c => c.rollback()));
|
|
82
|
-
throw e;
|
|
83
|
-
} finally {
|
|
84
|
-
// Always mark end of explicit transaction and clear change tracking
|
|
85
|
-
rctx.db.markExplicitTransactionEnd();
|
|
86
|
-
rctx.db._clearChangeLog();
|
|
87
|
-
}
|
|
88
|
-
return null;
|
|
89
|
-
};
|
|
90
|
-
note = 'COMMIT';
|
|
91
|
-
break;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
case 'rollback': {
|
|
95
|
-
if (plan.savepoint) {
|
|
96
|
-
const savepointIndex = hashSavepointName(plan.savepoint); // Convert name to index
|
|
97
|
-
run = async (rctx: RuntimeContext) => {
|
|
98
|
-
const connections = rctx.db.getAllConnections();
|
|
99
|
-
log(`ROLLBACK TO SAVEPOINT ${savepointIndex}: Found ${connections.length} active connections`);
|
|
100
|
-
|
|
101
|
-
for (const connection of connections) {
|
|
102
|
-
try {
|
|
103
|
-
await connection.rollbackToSavepoint(savepointIndex);
|
|
104
|
-
log(`ROLLBACK TO SAVEPOINT ${savepointIndex}: Successfully called on connection ${connection.connectionId}`);
|
|
105
|
-
} catch (error) {
|
|
106
|
-
log(`ROLLBACK TO SAVEPOINT ${savepointIndex}: Error on connection ${connection.connectionId}: %O`, error);
|
|
107
|
-
throw error;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
// Discard top change layer
|
|
111
|
-
rctx.db._rollbackSavepointLayer();
|
|
112
|
-
return null;
|
|
113
|
-
};
|
|
114
|
-
note = `ROLLBACK TO SAVEPOINT ${plan.savepoint}`;
|
|
115
|
-
} else {
|
|
116
|
-
run = async (rctx: RuntimeContext) => {
|
|
117
|
-
const connections = rctx.db.getAllConnections();
|
|
118
|
-
log(`ROLLBACK: Found ${connections.length} active connections`);
|
|
119
|
-
|
|
120
|
-
for (const connection of connections) {
|
|
121
|
-
try {
|
|
122
|
-
await connection.rollback();
|
|
123
|
-
log(`ROLLBACK: Successfully called on connection ${connection.connectionId}`);
|
|
124
|
-
} catch (error) {
|
|
125
|
-
log(`ROLLBACK: Error on connection ${connection.connectionId}: %O`, error);
|
|
126
|
-
throw error;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
// Reflect explicit transaction end and clear change tracking
|
|
130
|
-
rctx.db.markExplicitTransactionEnd();
|
|
131
|
-
rctx.db._clearChangeLog();
|
|
132
|
-
return null;
|
|
133
|
-
};
|
|
134
|
-
note = 'ROLLBACK';
|
|
135
|
-
}
|
|
136
|
-
break;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
case 'savepoint': {
|
|
140
|
-
if (!plan.savepoint) {
|
|
141
|
-
quereusError('Savepoint name is required for SAVEPOINT operation', StatusCode.MISUSE);
|
|
142
|
-
}
|
|
143
|
-
const savepointIndex = hashSavepointName(plan.savepoint); // Convert name to index
|
|
144
|
-
run = async (rctx: RuntimeContext) => {
|
|
145
|
-
const connections = rctx.db.getAllConnections();
|
|
146
|
-
log(`SAVEPOINT ${savepointIndex}: Found ${connections.length} active connections`);
|
|
147
|
-
|
|
148
|
-
for (const connection of connections) {
|
|
149
|
-
try {
|
|
150
|
-
await connection.createSavepoint(savepointIndex);
|
|
151
|
-
log(`SAVEPOINT ${savepointIndex}: Successfully called on connection ${connection.connectionId}`);
|
|
152
|
-
} catch (error) {
|
|
153
|
-
log(`SAVEPOINT ${savepointIndex}: Error on connection ${connection.connectionId}: %O`, error);
|
|
154
|
-
throw error;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
// Mark database as in explicit transaction (savepoints require explicit transaction context)
|
|
158
|
-
rctx.db.markExplicitTransactionStart();
|
|
159
|
-
// Track change layer
|
|
160
|
-
rctx.db._beginSavepointLayer();
|
|
161
|
-
return null;
|
|
162
|
-
};
|
|
163
|
-
note = `SAVEPOINT ${plan.savepoint}`;
|
|
164
|
-
break;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
case 'release': {
|
|
168
|
-
if (!plan.savepoint) {
|
|
169
|
-
quereusError('Savepoint name is required for RELEASE operation', StatusCode.MISUSE);
|
|
170
|
-
}
|
|
171
|
-
const releaseSavepointIndex = hashSavepointName(plan.savepoint); // Convert name to index
|
|
172
|
-
run = async (rctx: RuntimeContext) => {
|
|
173
|
-
const connections = rctx.db.getAllConnections();
|
|
174
|
-
log(`RELEASE SAVEPOINT ${releaseSavepointIndex}: Found ${connections.length} active connections`);
|
|
175
|
-
|
|
176
|
-
for (const connection of connections) {
|
|
177
|
-
try {
|
|
178
|
-
await connection.releaseSavepoint(releaseSavepointIndex);
|
|
179
|
-
log(`RELEASE SAVEPOINT ${releaseSavepointIndex}: Successfully called on connection ${connection.connectionId}`);
|
|
180
|
-
} catch (error) {
|
|
181
|
-
log(`RELEASE SAVEPOINT ${releaseSavepointIndex}: Error on connection ${connection.connectionId}: %O`, error);
|
|
182
|
-
throw error;
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
// Merge top change layer into below
|
|
186
|
-
rctx.db._releaseSavepointLayer();
|
|
187
|
-
return null;
|
|
188
|
-
};
|
|
189
|
-
note = `RELEASE SAVEPOINT ${plan.savepoint}`;
|
|
190
|
-
break;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
default:
|
|
194
|
-
quereusError(
|
|
195
|
-
`Unsupported transaction operation: ${plan.operation}`,
|
|
196
|
-
StatusCode.UNSUPPORTED
|
|
197
|
-
);
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
return {
|
|
201
|
-
params: [],
|
|
202
|
-
run: run as InstructionRun,
|
|
203
|
-
note
|
|
204
|
-
};
|
|
205
|
-
}
|