@quereus/quereus 0.7.3 → 0.7.5
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/dist/src/schema/manager.d.ts.map +1 -1
- package/dist/src/schema/manager.js +19 -18
- 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,667 +0,0 @@
|
|
|
1
|
-
import { QuereusError } from '../../common/errors.js';
|
|
2
|
-
import { StatusCode } from '../../common/types.js';
|
|
3
|
-
import type { Database } from '../../core/database.js';
|
|
4
|
-
import { type TableSchema, type IndexSchema, IndexColumnSchema } from '../../schema/table.js';
|
|
5
|
-
import { MemoryTable } from './table.js';
|
|
6
|
-
import type { VirtualTableModule } from '../module.js';
|
|
7
|
-
import { IndexConstraintOp } from '../../common/constants.js';
|
|
8
|
-
import type { IndexInfo } from '../index-info.js';
|
|
9
|
-
import { MemoryTableManager } from './layer/manager.js';
|
|
10
|
-
import type { MemoryTableConfig } from './types.js';
|
|
11
|
-
import { createMemoryTableLoggers } from './utils/logging.js';
|
|
12
|
-
import { AccessPlanBuilder, validateAccessPlan } from '../best-access-plan.js';
|
|
13
|
-
import type { BestAccessPlanRequest, BestAccessPlanResult, ColumnMeta, OrderingSpec, PredicateConstraint } from '../best-access-plan.js';
|
|
14
|
-
|
|
15
|
-
const logger = createMemoryTableLoggers('module');
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* A module that provides in-memory table functionality using digitree.
|
|
19
|
-
* Tables created with this module persist only for the lifetime of the
|
|
20
|
-
* database connection.
|
|
21
|
-
*/
|
|
22
|
-
export class MemoryTableModule implements VirtualTableModule<MemoryTable, MemoryTableConfig> {
|
|
23
|
-
public readonly tables: Map<string, MemoryTableManager> = new Map();
|
|
24
|
-
|
|
25
|
-
constructor() { }
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Creates a new memory table definition
|
|
29
|
-
*/
|
|
30
|
-
create(db: Database, tableSchema: TableSchema): MemoryTable {
|
|
31
|
-
// Ensure table doesn't already exist
|
|
32
|
-
const tableKey = `${tableSchema.schemaName}.${tableSchema.name}`.toLowerCase();
|
|
33
|
-
if (this.tables.has(tableKey)) {
|
|
34
|
-
throw new QuereusError(`Memory table '${tableSchema.name}' already exists in schema '${tableSchema.schemaName}'.`, StatusCode.ERROR);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// Create the MemoryTableManager instance
|
|
38
|
-
const manager = new MemoryTableManager(
|
|
39
|
-
db,
|
|
40
|
-
tableSchema.vtabModuleName,
|
|
41
|
-
tableSchema.schemaName,
|
|
42
|
-
tableSchema.name,
|
|
43
|
-
tableSchema,
|
|
44
|
-
tableSchema.isReadOnly ?? false
|
|
45
|
-
);
|
|
46
|
-
|
|
47
|
-
// Register the manager
|
|
48
|
-
this.tables.set(tableKey, manager);
|
|
49
|
-
logger.operation('Create Table', tableSchema.name, {
|
|
50
|
-
schema: tableSchema.schemaName,
|
|
51
|
-
readOnly: tableSchema.isReadOnly ?? false
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
// Create and return the MemoryTable instance
|
|
55
|
-
return new MemoryTable(db, this, manager);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Connects to an existing memory table definition
|
|
60
|
-
*/
|
|
61
|
-
connect(db: Database, pAux: unknown, moduleName: string, schemaName: string, tableName: string, _options: MemoryTableConfig, _tableSchema?: TableSchema): MemoryTable {
|
|
62
|
-
const tableKey = `${schemaName}.${tableName}`.toLowerCase();
|
|
63
|
-
const existingManager = this.tables.get(tableKey);
|
|
64
|
-
|
|
65
|
-
if (!existingManager) {
|
|
66
|
-
throw new QuereusError(`Memory table definition for '${tableName}' not found. Cannot connect.`, StatusCode.INTERNAL);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
logger.operation('Connect Table', tableName, { schema: schemaName });
|
|
70
|
-
|
|
71
|
-
// Create a new MemoryTable instance connected to the existing manager
|
|
72
|
-
return new MemoryTable(db, this, existingManager);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Modern, type-safe access planning interface
|
|
77
|
-
*/
|
|
78
|
-
getBestAccessPlan(
|
|
79
|
-
db: Database,
|
|
80
|
-
tableInfo: TableSchema,
|
|
81
|
-
request: BestAccessPlanRequest
|
|
82
|
-
): BestAccessPlanResult {
|
|
83
|
-
logger.debugLog(`[getBestAccessPlan] Planning access for ${tableInfo.name} with ${request.filters.length} filters`);
|
|
84
|
-
|
|
85
|
-
// Get table size estimate for cost calculations
|
|
86
|
-
const estimatedTableSize = request.estimatedRows ?? 1000;
|
|
87
|
-
|
|
88
|
-
// Find the best access strategy
|
|
89
|
-
const bestPlan = this.findBestAccessPlan(tableInfo, request, estimatedTableSize);
|
|
90
|
-
|
|
91
|
-
// Validate the plan before returning
|
|
92
|
-
validateAccessPlan(request, bestPlan);
|
|
93
|
-
|
|
94
|
-
logger.debugLog(`[getBestAccessPlan] Selected plan: ${bestPlan.explains} (cost: ${bestPlan.cost}, rows: ${bestPlan.rows})`);
|
|
95
|
-
|
|
96
|
-
return bestPlan;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Build column metadata for access planning
|
|
101
|
-
*/
|
|
102
|
-
private buildColumnMetadata(tableInfo: TableSchema): ColumnMeta[] {
|
|
103
|
-
return tableInfo.columns.map((col, index) => ({
|
|
104
|
-
index,
|
|
105
|
-
name: col.name,
|
|
106
|
-
type: col.logicalType,
|
|
107
|
-
isPrimaryKey: tableInfo.primaryKeyDefinition.some(pk => pk.index === index),
|
|
108
|
-
isUnique: col.primaryKey // Primary key columns are unique, others would be determined by constraints/indexes
|
|
109
|
-
}));
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Find the best access plan for the given request
|
|
114
|
-
*/
|
|
115
|
-
private findBestAccessPlan(
|
|
116
|
-
tableInfo: TableSchema,
|
|
117
|
-
request: BestAccessPlanRequest,
|
|
118
|
-
estimatedTableSize: number
|
|
119
|
-
): BestAccessPlanResult {
|
|
120
|
-
const availableIndexes = this.gatherAvailableIndexes(tableInfo);
|
|
121
|
-
let bestPlan: BestAccessPlanResult | undefined;
|
|
122
|
-
|
|
123
|
-
// Try to find an index-based plan
|
|
124
|
-
for (const index of availableIndexes) {
|
|
125
|
-
const indexPlan = this.evaluateIndexAccess(index, request, estimatedTableSize);
|
|
126
|
-
if (!bestPlan || indexPlan.cost < bestPlan.cost) {
|
|
127
|
-
bestPlan = indexPlan;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// Fallback to full scan if no index plan found
|
|
132
|
-
if (!bestPlan) {
|
|
133
|
-
bestPlan = AccessPlanBuilder
|
|
134
|
-
.fullScan(estimatedTableSize)
|
|
135
|
-
.setHandledFilters(new Array(request.filters.length).fill(false))
|
|
136
|
-
.build();
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
// Check if we can satisfy ordering requirements
|
|
140
|
-
if (request.requiredOrdering && request.requiredOrdering.length > 0) {
|
|
141
|
-
bestPlan = this.adjustPlanForOrdering(bestPlan, request, availableIndexes);
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
// Prefer plans that fully handle at least one filter over pure full scans when costs tie
|
|
145
|
-
if (request.filters.length > 0 && bestPlan.handledFilters?.some(Boolean) === false) {
|
|
146
|
-
// Small nudge to cost to encourage using any usable index when costs are equal
|
|
147
|
-
bestPlan = { ...bestPlan, cost: bestPlan.cost + 0.01, explains: `${bestPlan.explains} (no filters handled)` };
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
return bestPlan;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/**
|
|
154
|
-
* Evaluate access via a specific index
|
|
155
|
-
*/
|
|
156
|
-
private evaluateIndexAccess(
|
|
157
|
-
index: IndexSchema,
|
|
158
|
-
request: BestAccessPlanRequest,
|
|
159
|
-
estimatedTableSize: number
|
|
160
|
-
): BestAccessPlanResult {
|
|
161
|
-
const indexCols = index.columns;
|
|
162
|
-
if (indexCols.length === 0) {
|
|
163
|
-
return AccessPlanBuilder.fullScan(estimatedTableSize)
|
|
164
|
-
.setHandledFilters(new Array(request.filters.length).fill(false))
|
|
165
|
-
.build();
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// Check for equality constraints on index columns
|
|
169
|
-
const equalityMatches = this.findEqualityMatches(indexCols, request.filters);
|
|
170
|
-
if (equalityMatches.matchCount === indexCols.length) {
|
|
171
|
-
// Perfect equality match - index seek
|
|
172
|
-
return AccessPlanBuilder
|
|
173
|
-
.eqMatch(1) // Assuming unique index access
|
|
174
|
-
.setHandledFilters(equalityMatches.handledFilters)
|
|
175
|
-
.setIsSet(true)
|
|
176
|
-
.setExplanation(`Index seek on ${index.name}`)
|
|
177
|
-
.build();
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
// Check for range constraints on first index column
|
|
181
|
-
const rangeMatch = this.findRangeMatch(indexCols[0], request.filters);
|
|
182
|
-
if (rangeMatch.hasRange) {
|
|
183
|
-
const estimatedRangeRows = Math.max(1, Math.floor(estimatedTableSize / 4));
|
|
184
|
-
return AccessPlanBuilder
|
|
185
|
-
.rangeScan(estimatedRangeRows)
|
|
186
|
-
.setHandledFilters(rangeMatch.handledFilters)
|
|
187
|
-
.setExplanation(`Index range scan on ${index.name}`)
|
|
188
|
-
.build();
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
// No useful index access - return full scan
|
|
192
|
-
return AccessPlanBuilder.fullScan(estimatedTableSize)
|
|
193
|
-
.setHandledFilters(new Array(request.filters.length).fill(false))
|
|
194
|
-
.setExplanation(`Full scan (index ${index.name} not useful)`)
|
|
195
|
-
.build();
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
/**
|
|
199
|
-
* Find equality matches for index columns
|
|
200
|
-
*/
|
|
201
|
-
private findEqualityMatches(
|
|
202
|
-
indexCols: ReadonlyArray<IndexColumnSchema>,
|
|
203
|
-
filters: readonly PredicateConstraint[]
|
|
204
|
-
): { matchCount: number; handledFilters: boolean[] } {
|
|
205
|
-
const handledFilters = new Array(filters.length).fill(false);
|
|
206
|
-
let matchCount = 0;
|
|
207
|
-
|
|
208
|
-
for (const indexCol of indexCols) {
|
|
209
|
-
let foundMatch = false;
|
|
210
|
-
for (let i = 0; i < filters.length; i++) {
|
|
211
|
-
const filter = filters[i];
|
|
212
|
-
if (filter.columnIndex === indexCol.index &&
|
|
213
|
-
filter.op === '=' &&
|
|
214
|
-
filter.usable &&
|
|
215
|
-
filter.value !== undefined) {
|
|
216
|
-
handledFilters[i] = true;
|
|
217
|
-
foundMatch = true;
|
|
218
|
-
matchCount++;
|
|
219
|
-
break;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
if (!foundMatch) {
|
|
223
|
-
break; // Can't use remaining index columns
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
return { matchCount, handledFilters };
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* Find range match for a column
|
|
232
|
-
*/
|
|
233
|
-
private findRangeMatch(
|
|
234
|
-
indexCol: IndexColumnSchema,
|
|
235
|
-
filters: readonly PredicateConstraint[]
|
|
236
|
-
): { hasRange: boolean; handledFilters: boolean[] } {
|
|
237
|
-
const handledFilters = new Array(filters.length).fill(false);
|
|
238
|
-
let hasLower = false;
|
|
239
|
-
let hasUpper = false;
|
|
240
|
-
|
|
241
|
-
for (let i = 0; i < filters.length; i++) {
|
|
242
|
-
const filter = filters[i];
|
|
243
|
-
if (filter.columnIndex === indexCol.index && filter.usable && filter.value !== undefined) {
|
|
244
|
-
if (filter.op === '>' || filter.op === '>=') {
|
|
245
|
-
handledFilters[i] = true;
|
|
246
|
-
hasLower = true;
|
|
247
|
-
} else if (filter.op === '<' || filter.op === '<=') {
|
|
248
|
-
handledFilters[i] = true;
|
|
249
|
-
hasUpper = true;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
return { hasRange: hasLower || hasUpper, handledFilters };
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
/**
|
|
258
|
-
* Adjust plan to account for ordering requirements
|
|
259
|
-
*/
|
|
260
|
-
private adjustPlanForOrdering(
|
|
261
|
-
plan: BestAccessPlanResult,
|
|
262
|
-
request: BestAccessPlanRequest,
|
|
263
|
-
availableIndexes: IndexSchema[]
|
|
264
|
-
): BestAccessPlanResult {
|
|
265
|
-
// Check if any index can provide the required ordering
|
|
266
|
-
for (const index of availableIndexes) {
|
|
267
|
-
if (this.indexSatisfiesOrdering(index, request.requiredOrdering!)) {
|
|
268
|
-
// This index can provide ordering - prefer it even if slightly more expensive
|
|
269
|
-
const adjustedCost = plan.cost * 0.9; // 10% discount for avoiding sort
|
|
270
|
-
|
|
271
|
-
return {
|
|
272
|
-
...plan,
|
|
273
|
-
cost: adjustedCost,
|
|
274
|
-
providesOrdering: request.requiredOrdering,
|
|
275
|
-
orderingIndexName: index.name,
|
|
276
|
-
explains: `${plan.explains} with ordering from ${index.name}`
|
|
277
|
-
};
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
// No index can provide ordering - plan will need external sort
|
|
282
|
-
return plan;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
/**
|
|
286
|
-
* Check if an index can satisfy ordering requirements
|
|
287
|
-
*/
|
|
288
|
-
private indexSatisfiesOrdering(
|
|
289
|
-
index: IndexSchema,
|
|
290
|
-
requiredOrdering: readonly OrderingSpec[]
|
|
291
|
-
): boolean {
|
|
292
|
-
if (requiredOrdering.length > index.columns.length) {
|
|
293
|
-
return false;
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
for (let i = 0; i < requiredOrdering.length; i++) {
|
|
297
|
-
const required = requiredOrdering[i];
|
|
298
|
-
const indexCol = index.columns[i];
|
|
299
|
-
|
|
300
|
-
if (required.columnIndex !== indexCol.index ||
|
|
301
|
-
required.desc !== (indexCol.desc ?? false)) {
|
|
302
|
-
return false;
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
return true;
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
private createPlanningContext(_tableInfo: TableSchema, _indexInfo: IndexInfo) {
|
|
312
|
-
return {
|
|
313
|
-
// Plan type constants
|
|
314
|
-
PLAN_TYPE_FULL_ASC: 0,
|
|
315
|
-
PLAN_TYPE_FULL_DESC: 1,
|
|
316
|
-
PLAN_TYPE_EQ: 2,
|
|
317
|
-
PLAN_TYPE_RANGE_ASC: 3,
|
|
318
|
-
PLAN_TYPE_RANGE_DESC: 4,
|
|
319
|
-
|
|
320
|
-
// Utility functions
|
|
321
|
-
encodeIdxNum: (indexId: number, planType: number): number => {
|
|
322
|
-
return (indexId << 3) | planType;
|
|
323
|
-
},
|
|
324
|
-
|
|
325
|
-
// Table size estimate for costing
|
|
326
|
-
tableSize: 1000,
|
|
327
|
-
};
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
private gatherAvailableIndexes(tableInfo: TableSchema): IndexSchema[] {
|
|
331
|
-
const availableIndexes: IndexSchema[] = [];
|
|
332
|
-
|
|
333
|
-
// Add pseudo-index for primary key
|
|
334
|
-
const pkIndexSchema = {
|
|
335
|
-
name: '_primary_',
|
|
336
|
-
columns: tableInfo.primaryKeyDefinition
|
|
337
|
-
};
|
|
338
|
-
availableIndexes.push(pkIndexSchema);
|
|
339
|
-
|
|
340
|
-
// Add secondary indexes
|
|
341
|
-
availableIndexes.push(...(tableInfo.indexes ?? []));
|
|
342
|
-
|
|
343
|
-
return availableIndexes;
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
private findBestPlan(context: ReturnType<typeof this.createPlanningContext>, availableIndexes: IndexSchema[], indexInfo: IndexInfo) {
|
|
347
|
-
let bestPlan = this.createInitialPlan(context);
|
|
348
|
-
|
|
349
|
-
for (const [indexId, index] of availableIndexes.entries()) {
|
|
350
|
-
const indexPlan = this.evaluateIndexPlan(context, index, indexId, indexInfo);
|
|
351
|
-
if (indexPlan.cost < bestPlan.cost) {
|
|
352
|
-
bestPlan = indexPlan;
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
return this.ensureFallbackPlan(bestPlan, context, availableIndexes);
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
private createInitialPlan(context: ReturnType<typeof this.createPlanningContext>) {
|
|
360
|
-
return {
|
|
361
|
-
indexId: -1,
|
|
362
|
-
planType: context.PLAN_TYPE_FULL_ASC,
|
|
363
|
-
cost: context.tableSize * 10.0,
|
|
364
|
-
rows: BigInt(context.tableSize),
|
|
365
|
-
usedConstraintIndices: new Set<number>(),
|
|
366
|
-
orderByConsumed: false,
|
|
367
|
-
isDesc: false,
|
|
368
|
-
};
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
private evaluateIndexPlan(context: ReturnType<typeof this.createPlanningContext>, index: IndexSchema, indexId: number, indexInfo: IndexInfo) {
|
|
372
|
-
let currentPlan = this.createInitialPlan(context);
|
|
373
|
-
currentPlan.indexId = indexId;
|
|
374
|
-
|
|
375
|
-
// Evaluate equality plan
|
|
376
|
-
const equalityPlan = this.evaluateEqualityPlan(context, index, indexId, indexInfo);
|
|
377
|
-
if (equalityPlan && equalityPlan.cost < currentPlan.cost) {
|
|
378
|
-
currentPlan = equalityPlan;
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
// Evaluate range plan
|
|
382
|
-
const rangePlan = this.evaluateRangePlan(context, index, indexId, indexInfo, currentPlan);
|
|
383
|
-
if (rangePlan && rangePlan.cost < currentPlan.cost) {
|
|
384
|
-
currentPlan = rangePlan;
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
// Check ORDER BY consumption
|
|
388
|
-
const orderOptimizedPlan = this.evaluateOrderByConsumption(context, index, indexInfo, currentPlan);
|
|
389
|
-
if (orderOptimizedPlan) {
|
|
390
|
-
currentPlan = orderOptimizedPlan;
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
return currentPlan;
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
private evaluateEqualityPlan(context: ReturnType<typeof this.createPlanningContext>, index: IndexSchema, indexId: number, indexInfo: IndexInfo) {
|
|
397
|
-
const indexCols = index.columns;
|
|
398
|
-
const eqConstraints = this.findEqualityConstraints(indexCols, indexInfo);
|
|
399
|
-
|
|
400
|
-
if (!this.canUseEqualityPlan(indexCols, eqConstraints)) {
|
|
401
|
-
logger.debugLog(`[xBestIndex] Cannot use EQ plan for index ${index.name} - missing constraints`);
|
|
402
|
-
return null;
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
const planEqCost = Math.log2(context.tableSize + 1) + 1.0;
|
|
406
|
-
const planEqRows = BigInt(1);
|
|
407
|
-
|
|
408
|
-
logger.debugLog(`[xBestIndex] EQ Plan viable for index ${index.name}. Cost: ${planEqCost}`);
|
|
409
|
-
|
|
410
|
-
return {
|
|
411
|
-
indexId: indexId,
|
|
412
|
-
planType: context.PLAN_TYPE_EQ,
|
|
413
|
-
cost: planEqCost,
|
|
414
|
-
rows: planEqRows,
|
|
415
|
-
usedConstraintIndices: new Set(eqConstraints.values()),
|
|
416
|
-
orderByConsumed: true,
|
|
417
|
-
isDesc: false
|
|
418
|
-
};
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
private findEqualityConstraints(indexCols: ReadonlyArray<any>, indexInfo: IndexInfo): Map<number, number> {
|
|
422
|
-
const eqConstraints = new Map<number, number>();
|
|
423
|
-
|
|
424
|
-
for (const [k, indexCol] of indexCols.entries()) {
|
|
425
|
-
const colIndex = indexCol.index;
|
|
426
|
-
let foundConstraint = false;
|
|
427
|
-
|
|
428
|
-
for (let i = 0; i < indexInfo.nConstraint; i++) {
|
|
429
|
-
const constraint = indexInfo.aConstraint[i];
|
|
430
|
-
if (constraint.iColumn === colIndex &&
|
|
431
|
-
constraint.op === IndexConstraintOp.EQ &&
|
|
432
|
-
constraint.usable) {
|
|
433
|
-
eqConstraints.set(colIndex, i);
|
|
434
|
-
foundConstraint = true;
|
|
435
|
-
logger.debugLog(`[xBestIndex] Found EQ constraint ${i} for column ${colIndex}`);
|
|
436
|
-
break;
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
if (!foundConstraint) {
|
|
441
|
-
logger.debugLog(`[xBestIndex] No EQ constraint for index column ${k} (schema idx ${colIndex})`);
|
|
442
|
-
return new Map(); // Can't use equality plan without all columns
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
return eqConstraints;
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
private canUseEqualityPlan(indexCols: ReadonlyArray<any>, eqConstraints: Map<number, number>): boolean {
|
|
450
|
-
return indexCols.length > 0 && eqConstraints.size === indexCols.length;
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
private evaluateRangePlan(context: ReturnType<typeof this.createPlanningContext>, index: IndexSchema, indexId: number, indexInfo: IndexInfo, currentPlan: any) {
|
|
454
|
-
const indexCols = index.columns;
|
|
455
|
-
const firstIndexColIdx = indexCols[0]?.index ?? -2;
|
|
456
|
-
const rangeBounds = this.findRangeBounds(firstIndexColIdx, indexInfo);
|
|
457
|
-
|
|
458
|
-
if (!rangeBounds.lowerBound && !rangeBounds.upperBound) {
|
|
459
|
-
return null;
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
const planRangeRows = BigInt(Math.max(1, Math.floor(context.tableSize / 4)));
|
|
463
|
-
const planRangeCost = Math.log2(context.tableSize + 1) * 2.0 + Number(planRangeRows);
|
|
464
|
-
|
|
465
|
-
if (planRangeCost >= currentPlan.cost) {
|
|
466
|
-
return null;
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
const usedIndices = new Set<number>();
|
|
470
|
-
if (rangeBounds.lowerBound) usedIndices.add(rangeBounds.lowerBound.index);
|
|
471
|
-
if (rangeBounds.upperBound) usedIndices.add(rangeBounds.upperBound.index);
|
|
472
|
-
|
|
473
|
-
return {
|
|
474
|
-
...currentPlan,
|
|
475
|
-
planType: context.PLAN_TYPE_RANGE_ASC,
|
|
476
|
-
cost: planRangeCost,
|
|
477
|
-
rows: planRangeRows,
|
|
478
|
-
usedConstraintIndices: usedIndices,
|
|
479
|
-
orderByConsumed: false
|
|
480
|
-
};
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
private findRangeBounds(firstColIndex: number, indexInfo: IndexInfo) {
|
|
484
|
-
let lowerBound: { index: number; op: IndexConstraintOp; } | null = null;
|
|
485
|
-
let upperBound: { index: number; op: IndexConstraintOp; } | null = null;
|
|
486
|
-
|
|
487
|
-
for (let i = 0; i < indexInfo.nConstraint; i++) {
|
|
488
|
-
const constraint = indexInfo.aConstraint[i];
|
|
489
|
-
if (constraint.iColumn === firstColIndex && constraint.usable) {
|
|
490
|
-
if (constraint.op === IndexConstraintOp.GT || constraint.op === IndexConstraintOp.GE) {
|
|
491
|
-
if (!lowerBound || constraint.op > lowerBound.op) {
|
|
492
|
-
lowerBound = { index: i, op: constraint.op };
|
|
493
|
-
}
|
|
494
|
-
} else if (constraint.op === IndexConstraintOp.LT || constraint.op === IndexConstraintOp.LE) {
|
|
495
|
-
if (!upperBound || constraint.op < upperBound.op) {
|
|
496
|
-
upperBound = { index: i, op: constraint.op };
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
return { lowerBound, upperBound };
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
private evaluateOrderByConsumption(context: ReturnType<typeof this.createPlanningContext>, index: IndexSchema, indexInfo: IndexInfo, currentPlan: any) {
|
|
506
|
-
if (indexInfo.nOrderBy === 0) {
|
|
507
|
-
return null;
|
|
508
|
-
}
|
|
509
|
-
|
|
510
|
-
const indexCols = index.columns;
|
|
511
|
-
const orderByConsumption = this.checkOrderByConsumption(indexCols, indexInfo);
|
|
512
|
-
|
|
513
|
-
if (!orderByConsumption.canConsume) {
|
|
514
|
-
return null;
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
const indexScanIsDesc = indexCols[0]?.desc ?? false;
|
|
518
|
-
const requiresDescScan = orderByConsumption.isDesc !== indexScanIsDesc;
|
|
519
|
-
const basePlanType = currentPlan.planType;
|
|
520
|
-
|
|
521
|
-
if (basePlanType === context.PLAN_TYPE_FULL_ASC || basePlanType === context.PLAN_TYPE_RANGE_ASC) {
|
|
522
|
-
return {
|
|
523
|
-
...currentPlan,
|
|
524
|
-
orderByConsumed: true,
|
|
525
|
-
isDesc: orderByConsumption.isDesc,
|
|
526
|
-
planType: this.adjustPlanTypeForOrder(context, basePlanType, requiresDescScan),
|
|
527
|
-
cost: currentPlan.cost * 0.9 // Prefer consuming order
|
|
528
|
-
};
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
return null;
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
private checkOrderByConsumption(indexCols: ReadonlyArray<any>, indexInfo: IndexInfo) {
|
|
535
|
-
if (indexInfo.nOrderBy === 0 || indexCols.length < indexInfo.nOrderBy) {
|
|
536
|
-
return { canConsume: false, isDesc: false };
|
|
537
|
-
}
|
|
538
|
-
|
|
539
|
-
const isOrderDesc = indexInfo.aOrderBy[0].desc;
|
|
540
|
-
|
|
541
|
-
for (let k = 0; k < indexInfo.nOrderBy; k++) {
|
|
542
|
-
const orderByCol = indexInfo.aOrderBy[k];
|
|
543
|
-
const indexCol = indexCols[k];
|
|
544
|
-
|
|
545
|
-
if (orderByCol.iColumn !== indexCol.index || orderByCol.desc !== isOrderDesc) {
|
|
546
|
-
return { canConsume: false, isDesc: false };
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
|
|
550
|
-
return { canConsume: true, isDesc: isOrderDesc };
|
|
551
|
-
}
|
|
552
|
-
|
|
553
|
-
private adjustPlanTypeForOrder(context: ReturnType<typeof this.createPlanningContext>, basePlanType: number, requiresDescScan: boolean) {
|
|
554
|
-
if (basePlanType === context.PLAN_TYPE_FULL_ASC) {
|
|
555
|
-
return requiresDescScan ? context.PLAN_TYPE_FULL_DESC : context.PLAN_TYPE_FULL_ASC;
|
|
556
|
-
} else { // RANGE_ASC
|
|
557
|
-
return requiresDescScan ? context.PLAN_TYPE_RANGE_DESC : context.PLAN_TYPE_RANGE_ASC;
|
|
558
|
-
}
|
|
559
|
-
}
|
|
560
|
-
|
|
561
|
-
private ensureFallbackPlan(bestPlan: any, context: ReturnType<typeof this.createPlanningContext>, availableIndexes: IndexSchema[]) {
|
|
562
|
-
if (bestPlan.indexId === -1) {
|
|
563
|
-
const primaryIndex = availableIndexes.findIndex(idx => idx.name === '_primary_');
|
|
564
|
-
bestPlan.indexId = primaryIndex >= 0 ? primaryIndex : 0;
|
|
565
|
-
bestPlan.planType = context.PLAN_TYPE_FULL_ASC;
|
|
566
|
-
bestPlan.cost = context.tableSize * 10.0;
|
|
567
|
-
bestPlan.rows = BigInt(context.tableSize);
|
|
568
|
-
bestPlan.usedConstraintIndices.clear();
|
|
569
|
-
bestPlan.orderByConsumed = false;
|
|
570
|
-
}
|
|
571
|
-
return bestPlan;
|
|
572
|
-
}
|
|
573
|
-
|
|
574
|
-
private populateIndexInfoOutput(indexInfo: IndexInfo, bestPlan: any, availableIndexes: IndexSchema[]) {
|
|
575
|
-
const context = this.createPlanningContext({} as TableSchema, indexInfo);
|
|
576
|
-
|
|
577
|
-
indexInfo.idxNum = context.encodeIdxNum(bestPlan.indexId, bestPlan.planType);
|
|
578
|
-
indexInfo.estimatedCost = bestPlan.cost;
|
|
579
|
-
indexInfo.estimatedRows = bestPlan.rows;
|
|
580
|
-
indexInfo.orderByConsumed = bestPlan.orderByConsumed;
|
|
581
|
-
indexInfo.idxFlags = (bestPlan.planType === context.PLAN_TYPE_EQ) ? 1 : 0;
|
|
582
|
-
|
|
583
|
-
this.buildConstraintUsage(indexInfo, bestPlan);
|
|
584
|
-
this.buildIndexString(indexInfo, bestPlan, availableIndexes);
|
|
585
|
-
}
|
|
586
|
-
|
|
587
|
-
private buildConstraintUsage(indexInfo: IndexInfo, bestPlan: any) {
|
|
588
|
-
const constraintUsage = Array.from({ length: indexInfo.nConstraint }, () => ({
|
|
589
|
-
argvIndex: 0,
|
|
590
|
-
omit: false
|
|
591
|
-
}));
|
|
592
|
-
|
|
593
|
-
let currentArg = 1;
|
|
594
|
-
bestPlan.usedConstraintIndices.forEach((constraintIndex: number) => {
|
|
595
|
-
constraintUsage[constraintIndex].argvIndex = currentArg++;
|
|
596
|
-
constraintUsage[constraintIndex].omit = (bestPlan.planType === 2); // PLAN_TYPE_EQ
|
|
597
|
-
});
|
|
598
|
-
|
|
599
|
-
indexInfo.aConstraintUsage = constraintUsage;
|
|
600
|
-
}
|
|
601
|
-
|
|
602
|
-
private buildIndexString(indexInfo: IndexInfo, bestPlan: any, availableIndexes: IndexSchema[]) {
|
|
603
|
-
const chosenIndex = availableIndexes[bestPlan.indexId];
|
|
604
|
-
const idxStrParts = [
|
|
605
|
-
`idx=${chosenIndex?.name ?? 'unknown'}(${bestPlan.indexId})`,
|
|
606
|
-
`plan=${bestPlan.planType}`
|
|
607
|
-
];
|
|
608
|
-
|
|
609
|
-
if (bestPlan.orderByConsumed) {
|
|
610
|
-
idxStrParts.push(`ordCons=${bestPlan.isDesc ? 'DESC' : 'ASC'}`);
|
|
611
|
-
}
|
|
612
|
-
|
|
613
|
-
if (bestPlan.usedConstraintIndices.size > 0) {
|
|
614
|
-
const argvMapping = this.createArgvMapping(indexInfo.aConstraintUsage);
|
|
615
|
-
if (argvMapping.length > 0) {
|
|
616
|
-
idxStrParts.push(`argvMap=[${argvMapping.join(',')}]`);
|
|
617
|
-
}
|
|
618
|
-
}
|
|
619
|
-
|
|
620
|
-
indexInfo.idxStr = idxStrParts.join(';');
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
private createArgvMapping(constraintUsage: any[]): string[] {
|
|
624
|
-
return constraintUsage
|
|
625
|
-
.map((usage, constraintIdx) => ({
|
|
626
|
-
argIdx: usage.argvIndex,
|
|
627
|
-
constraintIdx
|
|
628
|
-
}))
|
|
629
|
-
.filter(item => item.argIdx > 0)
|
|
630
|
-
.map(item => `[${item.argIdx},${item.constraintIdx}]`);
|
|
631
|
-
}
|
|
632
|
-
/**
|
|
633
|
-
* Destroys a memory table and frees associated resources
|
|
634
|
-
*/
|
|
635
|
-
async destroy(db: Database, pAux: unknown, moduleName: string, schemaName: string, tableName: string): Promise<void> {
|
|
636
|
-
const tableKey = `${schemaName}.${tableName}`.toLowerCase();
|
|
637
|
-
const manager = this.tables.get(tableKey);
|
|
638
|
-
|
|
639
|
-
if (manager) {
|
|
640
|
-
// This will call the manager's destroy method which handles cleaning up resources
|
|
641
|
-
await manager.destroy?.();
|
|
642
|
-
this.tables.delete(tableKey);
|
|
643
|
-
logger.operation('Destroy Table', tableName, { schema: schemaName });
|
|
644
|
-
}
|
|
645
|
-
}
|
|
646
|
-
|
|
647
|
-
/**
|
|
648
|
-
* Creates an index on a memory table
|
|
649
|
-
*/
|
|
650
|
-
async createIndex(db: Database, schemaName: string, tableName: string, indexSchema: IndexSchema): Promise<void> {
|
|
651
|
-
const tableKey = `${schemaName}.${tableName}`.toLowerCase();
|
|
652
|
-
const manager = this.tables.get(tableKey);
|
|
653
|
-
|
|
654
|
-
if (!manager) {
|
|
655
|
-
throw new QuereusError(`Memory table '${tableName}' not found in schema '${schemaName}'. Cannot create index.`, StatusCode.ERROR);
|
|
656
|
-
}
|
|
657
|
-
|
|
658
|
-
// Delegate to the manager to create the index
|
|
659
|
-
await manager.createIndex(indexSchema);
|
|
660
|
-
|
|
661
|
-
logger.operation('Create Index', indexSchema.name, {
|
|
662
|
-
table: tableName,
|
|
663
|
-
schema: schemaName,
|
|
664
|
-
columns: indexSchema.columns.map(col => `${col.index}${col.desc ? ' DESC' : ''}`)
|
|
665
|
-
});
|
|
666
|
-
}
|
|
667
|
-
}
|