@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,779 +0,0 @@
|
|
|
1
|
-
import type { Row } from "../../common/types.js";
|
|
2
|
-
import type { SqlValue } from "../../common/types.js";
|
|
3
|
-
import { createIntegratedTableValuedFunction } from "../registration.js";
|
|
4
|
-
import { INTEGER_TYPE, REAL_TYPE, TEXT_TYPE } from "../../types/builtin-types.js";
|
|
5
|
-
import { QuereusError } from "../../common/errors.js";
|
|
6
|
-
import { StatusCode } from "../../common/types.js";
|
|
7
|
-
import type { Database } from "../../core/database.js";
|
|
8
|
-
import { safeJsonStringify } from "../../util/serialization.js";
|
|
9
|
-
import { CollectingInstructionTracer, InstructionTraceEvent } from "../../runtime/types.js";
|
|
10
|
-
import { PlanNode, RelationalPlanNode } from "../../planner/nodes/plan-node.js";
|
|
11
|
-
import { EmissionContext } from "../../runtime/emission-context.js";
|
|
12
|
-
import { emitPlanNode } from "../../runtime/emitters.js";
|
|
13
|
-
import { Scheduler } from "../../runtime/scheduler.js";
|
|
14
|
-
import { analyzeRowSpecific } from "../../planner/analysis/constraint-extractor.js";
|
|
15
|
-
import { Parser } from "../../parser/parser.js";
|
|
16
|
-
import * as AST from "../../parser/ast.js";
|
|
17
|
-
import { GlobalScope } from "../../planner/scopes/global.js";
|
|
18
|
-
import { ParameterScope } from "../../planner/scopes/param.js";
|
|
19
|
-
import type { PlanningContext } from "../../planner/planning-context.js";
|
|
20
|
-
import { BuildTimeDependencyTracker } from "../../planner/planning-context.js";
|
|
21
|
-
import { buildBlock } from "../../planner/building/block.js";
|
|
22
|
-
|
|
23
|
-
// Helper function to safely get function name from nodes that have it
|
|
24
|
-
function getFunctionName(node: PlanNode): string | null {
|
|
25
|
-
// Check for nodes that have functionName property
|
|
26
|
-
if ('functionName' in node && typeof (node as any).functionName === 'string') {
|
|
27
|
-
return (node as any).functionName;
|
|
28
|
-
}
|
|
29
|
-
return null;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// Helper function to safely get alias from nodes that have it
|
|
33
|
-
function getAlias(node: PlanNode): string | null {
|
|
34
|
-
// Check for nodes that have alias property
|
|
35
|
-
if ('alias' in node && typeof (node as any).alias === 'string') {
|
|
36
|
-
return (node as any).alias;
|
|
37
|
-
}
|
|
38
|
-
return null;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// Helper function to safely get table name or related identifier
|
|
42
|
-
function getObjectName(node: PlanNode): string | null {
|
|
43
|
-
// Check for function name first (table functions, scalar functions, etc.)
|
|
44
|
-
const functionName = getFunctionName(node);
|
|
45
|
-
if (functionName) {
|
|
46
|
-
return functionName;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Check for table schema in table reference nodes
|
|
50
|
-
if ('tableSchema' in node) {
|
|
51
|
-
const tableSchema = (node as any).tableSchema;
|
|
52
|
-
if (tableSchema && typeof tableSchema.name === 'string') {
|
|
53
|
-
return tableSchema.schemaName ? `${tableSchema.schemaName}.${tableSchema.name}` : tableSchema.name;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// Check for CTE name
|
|
58
|
-
if ('cteName' in node && typeof (node as any).cteName === 'string') {
|
|
59
|
-
return (node as any).cteName;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// Check for view schema in view reference nodes
|
|
63
|
-
if ('viewSchema' in node) {
|
|
64
|
-
const viewSchema = (node as any).viewSchema;
|
|
65
|
-
if (viewSchema && typeof viewSchema.name === 'string') {
|
|
66
|
-
return viewSchema.schemaName ? `${viewSchema.schemaName}.${viewSchema.name}` : viewSchema.name;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
return null;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// Query plan explanation function (table-valued function)
|
|
74
|
-
export const queryPlanFunc = createIntegratedTableValuedFunction(
|
|
75
|
-
{
|
|
76
|
-
name: 'query_plan',
|
|
77
|
-
numArgs: 1,
|
|
78
|
-
deterministic: true,
|
|
79
|
-
returnType: {
|
|
80
|
-
typeClass: 'relation',
|
|
81
|
-
isReadOnly: true,
|
|
82
|
-
isSet: false,
|
|
83
|
-
columns: [
|
|
84
|
-
{ name: 'id', type: { typeClass: 'scalar', logicalType: INTEGER_TYPE, nullable: false, isReadOnly: true }, generated: true },
|
|
85
|
-
{ name: 'parent_id', type: { typeClass: 'scalar', logicalType: INTEGER_TYPE, nullable: true, isReadOnly: true }, generated: true },
|
|
86
|
-
{ name: 'subquery_level', type: { typeClass: 'scalar', logicalType: INTEGER_TYPE, nullable: false, isReadOnly: true }, generated: true },
|
|
87
|
-
{ name: 'node_type', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
|
|
88
|
-
{ name: 'op', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
|
|
89
|
-
{ name: 'detail', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
|
|
90
|
-
{ name: 'object_name', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: true, isReadOnly: true }, generated: true },
|
|
91
|
-
{ name: 'alias', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: true, isReadOnly: true }, generated: true },
|
|
92
|
-
{ name: 'properties', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: true, isReadOnly: true }, generated: true },
|
|
93
|
-
{ name: 'physical', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: true, isReadOnly: true }, generated: true },
|
|
94
|
-
{ name: 'est_cost', type: { typeClass: 'scalar', logicalType: REAL_TYPE, nullable: true, isReadOnly: true }, generated: true },
|
|
95
|
-
{ name: 'est_rows', type: { typeClass: 'scalar', logicalType: INTEGER_TYPE, nullable: true, isReadOnly: true }, generated: true }
|
|
96
|
-
],
|
|
97
|
-
keys: [],
|
|
98
|
-
rowConstraints: []
|
|
99
|
-
}
|
|
100
|
-
},
|
|
101
|
-
async function* (db: Database, sql: SqlValue): AsyncIterable<Row> {
|
|
102
|
-
if (typeof sql !== 'string') {
|
|
103
|
-
throw new QuereusError('query_plan() requires a SQL string argument', StatusCode.ERROR);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
try {
|
|
107
|
-
// Parse and plan the SQL to get the actual plan tree
|
|
108
|
-
const plan = db.getPlan(sql);
|
|
109
|
-
|
|
110
|
-
// Traverse the plan tree and yield information about each node
|
|
111
|
-
let nodeId = 1;
|
|
112
|
-
const nodeStack: Array<{ node: PlanNode; parentId: number | null; level: number }> = [
|
|
113
|
-
{ node: plan, parentId: null, level: 0 }
|
|
114
|
-
];
|
|
115
|
-
|
|
116
|
-
while (nodeStack.length > 0) {
|
|
117
|
-
const { node, parentId, level } = nodeStack.pop()!;
|
|
118
|
-
const currentId = nodeId++;
|
|
119
|
-
|
|
120
|
-
// Get node type
|
|
121
|
-
const nodeType = node.nodeType || 'UNKNOWN';
|
|
122
|
-
|
|
123
|
-
// Determine operation type and details
|
|
124
|
-
let op = 'UNKNOWN';
|
|
125
|
-
let detail = 'Unknown operation';
|
|
126
|
-
let objectName: string | null = null;
|
|
127
|
-
let alias: string | null = null;
|
|
128
|
-
const estCost = node.estimatedCost || 1.0;
|
|
129
|
-
const estRows = (node as RelationalPlanNode).estimatedRows || 10;
|
|
130
|
-
|
|
131
|
-
// Use node's toString() method for detail if available
|
|
132
|
-
if (typeof node.toString === 'function') {
|
|
133
|
-
detail = node.toString();
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
if (node.nodeType) {
|
|
137
|
-
op = node.nodeType.replace(/Node$/, '').toUpperCase();
|
|
138
|
-
|
|
139
|
-
// Extract object name and alias using helper functions
|
|
140
|
-
objectName = getObjectName(node);
|
|
141
|
-
alias = getAlias(node);
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
// Get logical properties using the correct method name
|
|
145
|
-
let properties: string | null = null;
|
|
146
|
-
const logicalAttributes = node.getLogicalAttributes();
|
|
147
|
-
if (logicalAttributes && Object.keys(logicalAttributes).length > 0) {
|
|
148
|
-
// Attach minimal QuickPick diagnostics from optimizer if available
|
|
149
|
-
const diag = db.optimizer.getLastDiagnostics?.();
|
|
150
|
-
if (diag?.quickpick) {
|
|
151
|
-
(logicalAttributes as any).quickpick = diag.quickpick;
|
|
152
|
-
}
|
|
153
|
-
properties = safeJsonStringify(logicalAttributes);
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
// Get physical properties (if available)
|
|
157
|
-
let physical: string | null = null;
|
|
158
|
-
if (node.physical) {
|
|
159
|
-
physical = safeJsonStringify(node.physical);
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
yield [
|
|
163
|
-
currentId, // id
|
|
164
|
-
parentId, // parent_id
|
|
165
|
-
level, // subquery_level
|
|
166
|
-
nodeType, // node_type
|
|
167
|
-
op, // op
|
|
168
|
-
detail, // detail
|
|
169
|
-
objectName, // object_name
|
|
170
|
-
alias, // alias
|
|
171
|
-
properties, // properties
|
|
172
|
-
physical, // physical
|
|
173
|
-
estCost, // est_cost
|
|
174
|
-
estRows // est_rows
|
|
175
|
-
];
|
|
176
|
-
|
|
177
|
-
// Add children to stack (in reverse order so they're processed in correct order)
|
|
178
|
-
// getChildren() is guaranteed to exist on all PlanNode instances
|
|
179
|
-
const children = node.getChildren();
|
|
180
|
-
for (let i = children.length - 1; i >= 0; i--) {
|
|
181
|
-
nodeStack.push({ node: children[i], parentId: currentId, level });
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
185
|
-
} catch (error: any) {
|
|
186
|
-
// If planning fails, yield an error row
|
|
187
|
-
yield [1, null, 0, 'ERROR', 'ERROR', `Failed to plan SQL: ${error.message}`, null, null, null, null, null, null];
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
);
|
|
191
|
-
|
|
192
|
-
// Scheduler program explanation function (table-valued function)
|
|
193
|
-
export const schedulerProgramFunc = createIntegratedTableValuedFunction(
|
|
194
|
-
{
|
|
195
|
-
name: 'scheduler_program',
|
|
196
|
-
numArgs: 1,
|
|
197
|
-
deterministic: true,
|
|
198
|
-
returnType: {
|
|
199
|
-
typeClass: 'relation',
|
|
200
|
-
isReadOnly: true,
|
|
201
|
-
isSet: false,
|
|
202
|
-
columns: [
|
|
203
|
-
{ name: 'addr', type: { typeClass: 'scalar', logicalType: INTEGER_TYPE, nullable: false, isReadOnly: true }, generated: true },
|
|
204
|
-
{ name: 'dependencies', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: true, isReadOnly: true }, generated: true }, // JSON array of dependency IDs
|
|
205
|
-
{ name: 'description', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
|
|
206
|
-
{ name: 'estimated_cost', type: { typeClass: 'scalar', logicalType: REAL_TYPE, nullable: true, isReadOnly: true }, generated: true },
|
|
207
|
-
{ name: 'is_subprogram', type: { typeClass: 'scalar', logicalType: INTEGER_TYPE, nullable: false, isReadOnly: true }, generated: true }, // 0/1 boolean
|
|
208
|
-
{ name: 'parent_addr', type: { typeClass: 'scalar', logicalType: INTEGER_TYPE, nullable: true, isReadOnly: true }, generated: true }
|
|
209
|
-
],
|
|
210
|
-
keys: [],
|
|
211
|
-
rowConstraints: []
|
|
212
|
-
}
|
|
213
|
-
},
|
|
214
|
-
async function* (db: Database, sql: SqlValue): AsyncIterable<Row> {
|
|
215
|
-
if (typeof sql !== 'string') {
|
|
216
|
-
throw new QuereusError('scheduler_program() requires a SQL string argument', StatusCode.ERROR);
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
try {
|
|
220
|
-
// Parse and plan the SQL to get the actual plan tree
|
|
221
|
-
const plan = db.getPlan(sql);
|
|
222
|
-
|
|
223
|
-
// Emit the plan to get the instruction tree
|
|
224
|
-
const emissionContext = new EmissionContext(db);
|
|
225
|
-
const rootInstruction = emitPlanNode(plan, emissionContext);
|
|
226
|
-
|
|
227
|
-
// Create a scheduler to get the instruction sequence
|
|
228
|
-
const scheduler = new Scheduler(rootInstruction);
|
|
229
|
-
|
|
230
|
-
// Yield information about each instruction
|
|
231
|
-
for (let i = 0; i < scheduler.instructions.length; i++) {
|
|
232
|
-
const instruction = scheduler.instructions[i];
|
|
233
|
-
const dependencies = instruction.params.map((_, idx) => idx).filter(idx => idx < i);
|
|
234
|
-
|
|
235
|
-
yield [
|
|
236
|
-
i, // addr
|
|
237
|
-
JSON.stringify(dependencies), // dependencies
|
|
238
|
-
instruction.note || `INSTRUCTION_${i}`, // instruction_id
|
|
239
|
-
null, // estimated_cost (not available in current implementation)
|
|
240
|
-
0, // is_subprogram (main program)
|
|
241
|
-
null // parent_addr (main program)
|
|
242
|
-
];
|
|
243
|
-
|
|
244
|
-
// If this instruction has sub-programs, yield those too
|
|
245
|
-
if (instruction.programs) {
|
|
246
|
-
for (let progIdx = 0; progIdx < instruction.programs.length; progIdx++) {
|
|
247
|
-
const subProgram = instruction.programs[progIdx];
|
|
248
|
-
for (let subI = 0; subI < subProgram.instructions.length; subI++) {
|
|
249
|
-
const subInstruction = subProgram.instructions[subI];
|
|
250
|
-
const subDependencies = subInstruction.params.map((_, idx) => idx).filter(idx => idx < subI);
|
|
251
|
-
|
|
252
|
-
yield [
|
|
253
|
-
scheduler.instructions.length + progIdx * 1000 + subI, // addr (offset for sub-programs)
|
|
254
|
-
JSON.stringify(subDependencies), // dependencies
|
|
255
|
-
subInstruction.note || `SUB_INSTRUCTION_${progIdx}_${subI}`, // instruction_id
|
|
256
|
-
null, // estimated_cost
|
|
257
|
-
1, // is_subprogram
|
|
258
|
-
i // parent_addr
|
|
259
|
-
];
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
265
|
-
} catch (error: any) {
|
|
266
|
-
// If compilation fails, yield an error instruction
|
|
267
|
-
yield [0, 'ERROR', '[]', `Failed to compile SQL: ${error.message}`, null, 0, null];
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
);
|
|
271
|
-
|
|
272
|
-
// Stack trace function for debugging execution
|
|
273
|
-
export const stackTraceFunc = createIntegratedTableValuedFunction(
|
|
274
|
-
{
|
|
275
|
-
name: 'stack_trace',
|
|
276
|
-
numArgs: 1,
|
|
277
|
-
deterministic: true,
|
|
278
|
-
returnType: {
|
|
279
|
-
typeClass: 'relation',
|
|
280
|
-
isReadOnly: true,
|
|
281
|
-
isSet: false,
|
|
282
|
-
columns: [
|
|
283
|
-
{ name: 'frame_id', type: { typeClass: 'scalar', logicalType: INTEGER_TYPE, nullable: false, isReadOnly: true }, generated: true },
|
|
284
|
-
{ name: 'depth', type: { typeClass: 'scalar', logicalType: INTEGER_TYPE, nullable: false, isReadOnly: true }, generated: true },
|
|
285
|
-
{ name: 'location', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
|
|
286
|
-
{ name: 'plan_node_type', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
|
|
287
|
-
{ name: 'operation', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
|
|
288
|
-
{ name: 'table_or_function', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: true, isReadOnly: true }, generated: true },
|
|
289
|
-
{ name: 'is_virtual', type: { typeClass: 'scalar', logicalType: INTEGER_TYPE, nullable: false, isReadOnly: true }, generated: true } // 0/1 boolean
|
|
290
|
-
],
|
|
291
|
-
keys: [],
|
|
292
|
-
rowConstraints: []
|
|
293
|
-
}
|
|
294
|
-
},
|
|
295
|
-
async function* (db: Database, sql: SqlValue): AsyncIterable<Row> {
|
|
296
|
-
if (typeof sql !== 'string') {
|
|
297
|
-
throw new QuereusError('stack_trace() requires a SQL string argument', StatusCode.ERROR);
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
try {
|
|
301
|
-
// Parse and plan the SQL to capture the call stack
|
|
302
|
-
const plan = db.getPlan(sql);
|
|
303
|
-
|
|
304
|
-
// Simulate a call stack based on the plan structure
|
|
305
|
-
let frameId = 0;
|
|
306
|
-
const stack: Array<{ name: string; location: string; vars: any }> = [];
|
|
307
|
-
|
|
308
|
-
// Add main execution frame
|
|
309
|
-
stack.push({
|
|
310
|
-
name: 'main',
|
|
311
|
-
location: 'database.ts:exec',
|
|
312
|
-
vars: { sql, autocommit: db.getAutocommit() }
|
|
313
|
-
});
|
|
314
|
-
|
|
315
|
-
// Add planning frames
|
|
316
|
-
stack.push({
|
|
317
|
-
name: 'buildPlan',
|
|
318
|
-
location: 'database.ts:_buildPlan',
|
|
319
|
-
vars: { planType: plan.nodeType }
|
|
320
|
-
});
|
|
321
|
-
|
|
322
|
-
// Add frames based on plan node types
|
|
323
|
-
const addPlanFrames = (node: PlanNode, depth: number = 0) => {
|
|
324
|
-
if (!node || depth > 10) return; // Prevent infinite recursion
|
|
325
|
-
|
|
326
|
-
switch (node.nodeType) {
|
|
327
|
-
case 'Block':
|
|
328
|
-
stack.push({
|
|
329
|
-
name: 'buildBlock',
|
|
330
|
-
location: 'building/block.ts:buildBlock',
|
|
331
|
-
vars: { statementCount: ('statements' in node) ? (node as any).statements?.length || 0 : 0 }
|
|
332
|
-
});
|
|
333
|
-
break;
|
|
334
|
-
case 'Filter':
|
|
335
|
-
stack.push({
|
|
336
|
-
name: 'buildFilter',
|
|
337
|
-
location: 'building/select.ts:buildSelectStmt',
|
|
338
|
-
vars: { condition: ('condition' in node) ? (node as any).condition?.toString() || 'unknown' : 'unknown' }
|
|
339
|
-
});
|
|
340
|
-
break;
|
|
341
|
-
case 'Project':
|
|
342
|
-
stack.push({
|
|
343
|
-
name: 'buildProject',
|
|
344
|
-
location: 'building/select.ts:buildSelectStmt',
|
|
345
|
-
vars: { projectionCount: ('projections' in node) ? (node as any).projections?.length || 0 : 0 }
|
|
346
|
-
});
|
|
347
|
-
break;
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
// Recursively add frames for children
|
|
351
|
-
// getChildren() is guaranteed to exist on all PlanNode instances
|
|
352
|
-
const children = node.getChildren();
|
|
353
|
-
children.forEach((child: PlanNode) => addPlanFrames(child, depth + 1));
|
|
354
|
-
};
|
|
355
|
-
|
|
356
|
-
addPlanFrames(plan);
|
|
357
|
-
|
|
358
|
-
// Yield stack frames (reverse order - deepest first)
|
|
359
|
-
for (let i = stack.length - 1; i >= 0; i--) {
|
|
360
|
-
const frame = stack[i];
|
|
361
|
-
yield [
|
|
362
|
-
frameId++, // frame_id
|
|
363
|
-
i, // depth
|
|
364
|
-
frame.location, // location
|
|
365
|
-
frame.name, // plan_node_type
|
|
366
|
-
frame.name, // operation
|
|
367
|
-
null, // table_or_function
|
|
368
|
-
0 // is_virtual
|
|
369
|
-
];
|
|
370
|
-
}
|
|
371
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
372
|
-
} catch (error: any) {
|
|
373
|
-
// If analysis fails, yield an error frame
|
|
374
|
-
yield [0, 0, 'error', 'stack_trace', JSON.stringify({ error: error.message })];
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
);
|
|
378
|
-
|
|
379
|
-
// Execution trace function for performance analysis
|
|
380
|
-
export const executionTraceFunc = createIntegratedTableValuedFunction(
|
|
381
|
-
{
|
|
382
|
-
name: 'execution_trace',
|
|
383
|
-
numArgs: 1,
|
|
384
|
-
deterministic: false, // Execution traces are not deterministic
|
|
385
|
-
returnType: {
|
|
386
|
-
typeClass: 'relation',
|
|
387
|
-
isReadOnly: true,
|
|
388
|
-
isSet: false,
|
|
389
|
-
columns: [
|
|
390
|
-
{ name: 'instruction_index', type: { typeClass: 'scalar', logicalType: INTEGER_TYPE, nullable: false, isReadOnly: true }, generated: true },
|
|
391
|
-
{ name: 'operation', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: true, isReadOnly: true }, generated: true },
|
|
392
|
-
{ name: 'dependencies', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: true, isReadOnly: true }, generated: true }, // JSON array of instruction indices this depends on
|
|
393
|
-
{ name: 'input_values', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: true, isReadOnly: true }, generated: true }, // JSON
|
|
394
|
-
{ name: 'output_value', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: true, isReadOnly: true }, generated: true }, // JSON
|
|
395
|
-
{ name: 'duration_ms', type: { typeClass: 'scalar', logicalType: REAL_TYPE, nullable: true, isReadOnly: true }, generated: true },
|
|
396
|
-
{ name: 'sub_programs', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: true, isReadOnly: true }, generated: true }, // JSON
|
|
397
|
-
{ name: 'error_message', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: true, isReadOnly: true }, generated: true },
|
|
398
|
-
{ name: 'timestamp_ms', type: { typeClass: 'scalar', logicalType: REAL_TYPE, nullable: false, isReadOnly: true }, generated: true }
|
|
399
|
-
],
|
|
400
|
-
keys: [],
|
|
401
|
-
rowConstraints: []
|
|
402
|
-
}
|
|
403
|
-
},
|
|
404
|
-
async function* (db: Database, sql: SqlValue): AsyncIterable<Row> {
|
|
405
|
-
if (typeof sql !== 'string') {
|
|
406
|
-
throw new QuereusError('execution_trace() requires a SQL string argument', StatusCode.ERROR);
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
try {
|
|
410
|
-
// First, get the scheduler program to understand instruction dependencies
|
|
411
|
-
const instructionDependencies = new Map<number, number[]>();
|
|
412
|
-
const instructionOperations = new Map<number, string>();
|
|
413
|
-
|
|
414
|
-
try {
|
|
415
|
-
// Get scheduler program information
|
|
416
|
-
for await (const row of db.eval('SELECT * FROM scheduler_program(?)', [sql])) {
|
|
417
|
-
const addr = row.addr as number;
|
|
418
|
-
const dependencies = JSON.parse((row.dependencies as string) || '[]') as number[];
|
|
419
|
-
const description = row.description as string;
|
|
420
|
-
|
|
421
|
-
instructionDependencies.set(addr, dependencies);
|
|
422
|
-
instructionOperations.set(addr, description);
|
|
423
|
-
}
|
|
424
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
425
|
-
} catch (schedulerError: any) {
|
|
426
|
-
console.warn('Could not get scheduler program info:', schedulerError.message);
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
// Import the CollectingInstructionTracer
|
|
430
|
-
const tracer = new CollectingInstructionTracer();
|
|
431
|
-
|
|
432
|
-
// Parse the query and execute with tracing
|
|
433
|
-
let stmt: any;
|
|
434
|
-
try {
|
|
435
|
-
stmt = db.prepare(sql);
|
|
436
|
-
|
|
437
|
-
// Execute the query with tracing to collect actual instruction events
|
|
438
|
-
const results: any[] = [];
|
|
439
|
-
for await (const row of stmt.iterateRowsWithTrace(undefined, tracer)) {
|
|
440
|
-
results.push(row); // We don't yield the results, just the trace events
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
await stmt.finalize();
|
|
444
|
-
} catch (executionError: unknown) {
|
|
445
|
-
// If execution fails, we might still have some trace events
|
|
446
|
-
console.warn('Query execution failed during tracing:', executionError instanceof Error ? executionError.message : String(executionError));
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
// Get the collected trace events
|
|
450
|
-
const traceEvents = tracer.getTraceEvents();
|
|
451
|
-
|
|
452
|
-
// Group events by instruction index and consolidate into single rows
|
|
453
|
-
const eventsByInstruction = new Map<number, InstructionTraceEvent[]>();
|
|
454
|
-
for (const event of traceEvents) {
|
|
455
|
-
const instructionIndex = event.instructionIndex;
|
|
456
|
-
if (!eventsByInstruction.has(instructionIndex)) {
|
|
457
|
-
eventsByInstruction.set(instructionIndex, []);
|
|
458
|
-
}
|
|
459
|
-
eventsByInstruction.get(instructionIndex)!.push(event);
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
// Get sub-program information for enhanced context
|
|
463
|
-
const subPrograms = tracer.getSubPrograms ? tracer.getSubPrograms() : new Map();
|
|
464
|
-
|
|
465
|
-
// Create one row per instruction execution
|
|
466
|
-
for (const [instructionIndex, events] of eventsByInstruction.entries()) {
|
|
467
|
-
const inputEvent = events.find(e => e.type === 'input');
|
|
468
|
-
const outputEvent = events.find(e => e.type === 'output');
|
|
469
|
-
const errorEvent = events.find(e => e.type === 'error');
|
|
470
|
-
|
|
471
|
-
// Use operation name from scheduler program, fallback to event note
|
|
472
|
-
const operationName = instructionOperations.get(instructionIndex) || inputEvent?.note || 'Unknown';
|
|
473
|
-
const dependencies = instructionDependencies.get(instructionIndex) || [];
|
|
474
|
-
|
|
475
|
-
// Calculate duration between input and output
|
|
476
|
-
let duration: number | null = null;
|
|
477
|
-
if (inputEvent && outputEvent) {
|
|
478
|
-
duration = outputEvent.timestamp - inputEvent.timestamp;
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
// Build enhanced sub-program information
|
|
482
|
-
let subProgramsInfo: any = null;
|
|
483
|
-
if (inputEvent?.subPrograms && inputEvent.subPrograms.length > 0) {
|
|
484
|
-
// Enhance sub-program info with details from the tracer
|
|
485
|
-
subProgramsInfo = inputEvent.subPrograms.map(sp => {
|
|
486
|
-
const subProgramDetail = subPrograms.get(sp.programIndex);
|
|
487
|
-
const baseInfo = {
|
|
488
|
-
programIndex: sp.programIndex,
|
|
489
|
-
instructionCount: sp.instructionCount,
|
|
490
|
-
rootNote: sp.rootNote
|
|
491
|
-
};
|
|
492
|
-
|
|
493
|
-
if (subProgramDetail) {
|
|
494
|
-
// Add instruction details from the sub-program
|
|
495
|
-
const instructions = subProgramDetail.scheduler.instructions.map((instr: any, idx: number) => ({
|
|
496
|
-
index: idx,
|
|
497
|
-
operation: instr.note || `instruction_${idx}`,
|
|
498
|
-
dependencies: instr.params.map((_: any, paramIdx: number) => paramIdx).filter((paramIdx: number) => paramIdx < idx)
|
|
499
|
-
}));
|
|
500
|
-
return { ...baseInfo, instructions };
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
return baseInfo;
|
|
504
|
-
});
|
|
505
|
-
}
|
|
506
|
-
|
|
507
|
-
const timestamp = inputEvent?.timestamp || outputEvent?.timestamp || Date.now();
|
|
508
|
-
|
|
509
|
-
yield [
|
|
510
|
-
instructionIndex, // instruction_index
|
|
511
|
-
operationName, // operation
|
|
512
|
-
safeJsonStringify(dependencies), // dependencies
|
|
513
|
-
inputEvent?.args ? safeJsonStringify(inputEvent.args) : null, // input_values
|
|
514
|
-
outputEvent?.result !== undefined ? safeJsonStringify(outputEvent.result) : null, // output_value
|
|
515
|
-
duration, // duration_ms
|
|
516
|
-
subProgramsInfo ? safeJsonStringify(subProgramsInfo) : null, // sub_programs
|
|
517
|
-
errorEvent?.error || null, // error_message
|
|
518
|
-
timestamp // timestamp_ms
|
|
519
|
-
];
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
// If no trace events were captured, yield a summary row
|
|
523
|
-
if (eventsByInstruction.size === 0) {
|
|
524
|
-
yield [
|
|
525
|
-
0, // instruction_index
|
|
526
|
-
'NO_TRACE_DATA', // operation
|
|
527
|
-
safeJsonStringify([]), // dependencies
|
|
528
|
-
null, // input_values
|
|
529
|
-
safeJsonStringify('No instruction-level trace events captured'), // output_value
|
|
530
|
-
null, // duration_ms
|
|
531
|
-
null, // sub_programs
|
|
532
|
-
null, // error_message
|
|
533
|
-
Date.now() // timestamp_ms
|
|
534
|
-
];
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
538
|
-
} catch (error: any) {
|
|
539
|
-
// If tracing setup fails, yield an error event
|
|
540
|
-
yield [
|
|
541
|
-
0, // instruction_index
|
|
542
|
-
'TRACE_SETUP', // operation
|
|
543
|
-
safeJsonStringify([]), // dependencies
|
|
544
|
-
null, // input_values
|
|
545
|
-
null, // output_value
|
|
546
|
-
null, // duration_ms
|
|
547
|
-
null, // sub_programs
|
|
548
|
-
`Failed to setup execution trace: ${error.message}`, // error_message
|
|
549
|
-
Date.now() // timestamp_ms
|
|
550
|
-
];
|
|
551
|
-
}
|
|
552
|
-
}
|
|
553
|
-
);
|
|
554
|
-
|
|
555
|
-
// Row-level execution trace function for detailed data flow analysis
|
|
556
|
-
export const rowTraceFunc = createIntegratedTableValuedFunction(
|
|
557
|
-
{
|
|
558
|
-
name: 'row_trace',
|
|
559
|
-
numArgs: 1,
|
|
560
|
-
deterministic: false, // Row traces are not deterministic
|
|
561
|
-
returnType: {
|
|
562
|
-
typeClass: 'relation',
|
|
563
|
-
isReadOnly: true,
|
|
564
|
-
isSet: false,
|
|
565
|
-
columns: [
|
|
566
|
-
{ name: 'instruction_index', type: { typeClass: 'scalar', logicalType: INTEGER_TYPE, nullable: false, isReadOnly: true }, generated: true },
|
|
567
|
-
{ name: 'operation', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: true, isReadOnly: true }, generated: true },
|
|
568
|
-
{ name: 'row_index', type: { typeClass: 'scalar', logicalType: INTEGER_TYPE, nullable: false, isReadOnly: true }, generated: true },
|
|
569
|
-
{ name: 'row_data', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true }, // JSON array of row values
|
|
570
|
-
{ name: 'timestamp_ms', type: { typeClass: 'scalar', logicalType: REAL_TYPE, nullable: false, isReadOnly: true }, generated: true },
|
|
571
|
-
{ name: 'row_count', type: { typeClass: 'scalar', logicalType: INTEGER_TYPE, nullable: true, isReadOnly: true }, generated: true } // Total rows for this instruction (filled in last row)
|
|
572
|
-
],
|
|
573
|
-
keys: [],
|
|
574
|
-
rowConstraints: []
|
|
575
|
-
}
|
|
576
|
-
},
|
|
577
|
-
async function* (db: Database, sql: SqlValue): AsyncIterable<Row> {
|
|
578
|
-
if (typeof sql !== 'string') {
|
|
579
|
-
throw new QuereusError('row_trace() requires a SQL string argument', StatusCode.ERROR);
|
|
580
|
-
}
|
|
581
|
-
|
|
582
|
-
try {
|
|
583
|
-
// Import the CollectingInstructionTracer
|
|
584
|
-
const tracer = new CollectingInstructionTracer();
|
|
585
|
-
|
|
586
|
-
// Parse the query and execute with tracing
|
|
587
|
-
let stmt: any;
|
|
588
|
-
try {
|
|
589
|
-
stmt = db.prepare(sql);
|
|
590
|
-
|
|
591
|
-
// Execute the query with tracing to collect row-level events
|
|
592
|
-
const results: any[] = [];
|
|
593
|
-
for await (const row of stmt.iterateRowsWithTrace(undefined, tracer)) {
|
|
594
|
-
results.push(row); // We don't yield the results, just the trace events
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
await stmt.finalize();
|
|
598
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
599
|
-
} catch (executionError: any) {
|
|
600
|
-
// If execution fails, we might still have some trace events
|
|
601
|
-
console.warn('Query execution failed during row tracing:', executionError.message);
|
|
602
|
-
}
|
|
603
|
-
|
|
604
|
-
// Get the collected trace events and filter for row events
|
|
605
|
-
const traceEvents = tracer.getTraceEvents();
|
|
606
|
-
const rowEvents = traceEvents.filter(event => event.type === 'row');
|
|
607
|
-
|
|
608
|
-
// Group row events by instruction index to calculate row counts
|
|
609
|
-
const rowsByInstruction = new Map<number, typeof rowEvents>();
|
|
610
|
-
for (const event of rowEvents) {
|
|
611
|
-
const instructionIndex = event.instructionIndex;
|
|
612
|
-
if (!rowsByInstruction.has(instructionIndex)) {
|
|
613
|
-
rowsByInstruction.set(instructionIndex, []);
|
|
614
|
-
}
|
|
615
|
-
rowsByInstruction.get(instructionIndex)!.push(event);
|
|
616
|
-
}
|
|
617
|
-
|
|
618
|
-
// Yield detailed information for each row
|
|
619
|
-
for (const [instructionIndex, instructionRowEvents] of rowsByInstruction.entries()) {
|
|
620
|
-
const totalRows = instructionRowEvents.length;
|
|
621
|
-
|
|
622
|
-
for (let i = 0; i < instructionRowEvents.length; i++) {
|
|
623
|
-
const event = instructionRowEvents[i];
|
|
624
|
-
const isLastRow = i === instructionRowEvents.length - 1;
|
|
625
|
-
|
|
626
|
-
yield [
|
|
627
|
-
instructionIndex, // instruction_index
|
|
628
|
-
event.note || 'Unknown', // operation
|
|
629
|
-
event.rowIndex ?? i, // row_index
|
|
630
|
-
safeJsonStringify(event.row), // row_data
|
|
631
|
-
event.timestamp, // timestamp_ms
|
|
632
|
-
isLastRow ? totalRows : null // row_count (only on last row)
|
|
633
|
-
];
|
|
634
|
-
}
|
|
635
|
-
}
|
|
636
|
-
|
|
637
|
-
// If no row events were captured, yield a summary row
|
|
638
|
-
if (rowEvents.length === 0) {
|
|
639
|
-
yield [
|
|
640
|
-
0, // instruction_index
|
|
641
|
-
'NO_ROW_DATA', // operation
|
|
642
|
-
0, // row_index
|
|
643
|
-
safeJsonStringify('No row-level trace events captured'), // row_data
|
|
644
|
-
Date.now(), // timestamp_ms
|
|
645
|
-
0 // row_count
|
|
646
|
-
];
|
|
647
|
-
}
|
|
648
|
-
|
|
649
|
-
} catch (error: unknown) {
|
|
650
|
-
// If tracing setup fails, yield an error event
|
|
651
|
-
yield [
|
|
652
|
-
0, // instruction_index
|
|
653
|
-
'ROW_TRACE_SETUP', // operation
|
|
654
|
-
0, // row_index
|
|
655
|
-
safeJsonStringify(`Failed to setup row trace: ${error instanceof Error ? error.message : String(error)}`), // row_data
|
|
656
|
-
Date.now(), // timestamp_ms
|
|
657
|
-
null // row_count
|
|
658
|
-
];
|
|
659
|
-
}
|
|
660
|
-
}
|
|
661
|
-
);
|
|
662
|
-
|
|
663
|
-
// Schema size function (table-valued function)
|
|
664
|
-
export const schemaSizeFunc = createIntegratedTableValuedFunction(
|
|
665
|
-
{
|
|
666
|
-
name: 'schema_size',
|
|
667
|
-
numArgs: 0,
|
|
668
|
-
deterministic: false, // Schema can change
|
|
669
|
-
returnType: {
|
|
670
|
-
typeClass: 'relation',
|
|
671
|
-
isReadOnly: true,
|
|
672
|
-
isSet: false,
|
|
673
|
-
columns: [
|
|
674
|
-
{ name: 'object_type', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
|
|
675
|
-
{ name: 'object_name', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
|
|
676
|
-
{ name: 'estimated_rows', type: { typeClass: 'scalar', logicalType: INTEGER_TYPE, nullable: true, isReadOnly: true }, generated: true },
|
|
677
|
-
{ name: 'estimated_size_kb', type: { typeClass: 'scalar', logicalType: REAL_TYPE, nullable: true, isReadOnly: true }, generated: true },
|
|
678
|
-
{ name: 'column_count', type: { typeClass: 'scalar', logicalType: INTEGER_TYPE, nullable: false, isReadOnly: true }, generated: true },
|
|
679
|
-
{ name: 'index_count', type: { typeClass: 'scalar', logicalType: INTEGER_TYPE, nullable: false, isReadOnly: true }, generated: true }
|
|
680
|
-
],
|
|
681
|
-
keys: [],
|
|
682
|
-
rowConstraints: []
|
|
683
|
-
}
|
|
684
|
-
},
|
|
685
|
-
async function* (_db: Database, _sql: SqlValue): AsyncIterable<Row> {
|
|
686
|
-
// TODO: Implementation of schemaSizeFunc
|
|
687
|
-
}
|
|
688
|
-
);
|
|
689
|
-
|
|
690
|
-
// Explain assertion analysis and prepared parameterization (pre-physical)
|
|
691
|
-
export const explainAssertionFunc = createIntegratedTableValuedFunction(
|
|
692
|
-
{
|
|
693
|
-
name: 'explain_assertion',
|
|
694
|
-
numArgs: 1,
|
|
695
|
-
deterministic: true,
|
|
696
|
-
returnType: {
|
|
697
|
-
typeClass: 'relation',
|
|
698
|
-
isReadOnly: true,
|
|
699
|
-
isSet: false,
|
|
700
|
-
columns: [
|
|
701
|
-
{ name: 'assertion', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
|
|
702
|
-
{ name: 'relation_key', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
|
|
703
|
-
{ name: 'base', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
|
|
704
|
-
{ name: 'classification', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true },
|
|
705
|
-
{ name: 'prepared_pk_params', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: true, isReadOnly: true }, generated: true }, // JSON array of param names or NULL
|
|
706
|
-
{ name: 'violation_sql', type: { typeClass: 'scalar', logicalType: TEXT_TYPE, nullable: false, isReadOnly: true }, generated: true }
|
|
707
|
-
],
|
|
708
|
-
keys: [],
|
|
709
|
-
rowConstraints: []
|
|
710
|
-
}
|
|
711
|
-
},
|
|
712
|
-
async function* (db: Database, assertionName: SqlValue): AsyncIterable<Row> {
|
|
713
|
-
if (typeof assertionName !== 'string') {
|
|
714
|
-
throw new QuereusError('explain_assertion(name) requires an assertion name', StatusCode.ERROR);
|
|
715
|
-
}
|
|
716
|
-
|
|
717
|
-
// Find assertion across all schemas
|
|
718
|
-
const all = db.schemaManager.getAllAssertions();
|
|
719
|
-
const assertion = all.find(a => a.name.toLowerCase() === assertionName.toLowerCase());
|
|
720
|
-
if (!assertion) {
|
|
721
|
-
throw new QuereusError(`Assertion not found: ${assertionName}`, StatusCode.NOTFOUND);
|
|
722
|
-
}
|
|
723
|
-
|
|
724
|
-
const sql = assertion.violationSql;
|
|
725
|
-
|
|
726
|
-
// Build pre-physical plan for analysis
|
|
727
|
-
let ast: AST.Statement;
|
|
728
|
-
try {
|
|
729
|
-
const parser = new Parser();
|
|
730
|
-
ast = parser.parse(sql) as AST.Statement;
|
|
731
|
-
} catch (e) {
|
|
732
|
-
throw new QuereusError(`Failed to parse assertion SQL: ${(e as Error).message}`, StatusCode.ERROR, e as Error);
|
|
733
|
-
}
|
|
734
|
-
|
|
735
|
-
const globalScope = new GlobalScope(db.schemaManager);
|
|
736
|
-
const parameterScope = new ParameterScope(globalScope);
|
|
737
|
-
const ctx: PlanningContext = {
|
|
738
|
-
db,
|
|
739
|
-
schemaManager: db.schemaManager,
|
|
740
|
-
parameters: {},
|
|
741
|
-
scope: parameterScope,
|
|
742
|
-
cteNodes: new Map(),
|
|
743
|
-
schemaDependencies: new BuildTimeDependencyTracker(),
|
|
744
|
-
schemaCache: new Map(),
|
|
745
|
-
cteReferenceCache: new Map(),
|
|
746
|
-
outputScopes: new Map()
|
|
747
|
-
};
|
|
748
|
-
|
|
749
|
-
const plan = buildBlock(ctx, [ast]);
|
|
750
|
-
const analyzed = db.optimizer.optimizeForAnalysis(plan, db) as unknown as RelationalPlanNode;
|
|
751
|
-
|
|
752
|
-
// Classify row/global per relationKey
|
|
753
|
-
const classifications = analyzeRowSpecific(analyzed);
|
|
754
|
-
|
|
755
|
-
for (const [relationKey, cls] of classifications) {
|
|
756
|
-
const base = `${relationKey.split('#')[0]}`;
|
|
757
|
-
let prepared: string | null = null;
|
|
758
|
-
if (cls === 'row' && base) {
|
|
759
|
-
// Prepared parameters are PK-based: ["pk0", "pk1", ...]
|
|
760
|
-
const [schemaName, tableName] = base.split('.');
|
|
761
|
-
const table = db._findTable(tableName, schemaName);
|
|
762
|
-
if (table) {
|
|
763
|
-
const pkCount = table.primaryKeyDefinition.length;
|
|
764
|
-
const names = Array.from({ length: pkCount }, (_, i) => `pk${i}`);
|
|
765
|
-
prepared = JSON.stringify(names);
|
|
766
|
-
}
|
|
767
|
-
}
|
|
768
|
-
|
|
769
|
-
yield [
|
|
770
|
-
assertion.name,
|
|
771
|
-
relationKey,
|
|
772
|
-
base,
|
|
773
|
-
cls,
|
|
774
|
-
prepared,
|
|
775
|
-
sql
|
|
776
|
-
];
|
|
777
|
-
}
|
|
778
|
-
}
|
|
779
|
-
);
|