@quereus/quereus 0.2.1 → 0.4.0
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/README.md +12 -1
- package/dist/src/common/errors.js.map +1 -1
- package/dist/src/common/json-types.d.ts +11 -0
- package/dist/src/common/json-types.d.ts.map +1 -0
- package/dist/src/common/json-types.js +3 -0
- package/dist/src/common/json-types.js.map +1 -0
- package/dist/src/common/types.d.ts +1 -0
- package/dist/src/common/types.d.ts.map +1 -1
- package/dist/src/core/database-options.d.ts +2 -2
- package/dist/src/core/database-options.d.ts.map +1 -1
- package/dist/src/core/database-options.js.map +1 -1
- package/dist/src/core/database.d.ts +61 -14
- package/dist/src/core/database.d.ts.map +1 -1
- package/dist/src/core/database.js +481 -54
- package/dist/src/core/database.js.map +1 -1
- package/dist/src/core/statement.d.ts.map +1 -1
- package/dist/src/core/statement.js +3 -1
- package/dist/src/core/statement.js.map +1 -1
- package/dist/src/func/builtins/builtin-window-functions.d.ts.map +1 -1
- package/dist/src/func/builtins/builtin-window-functions.js.map +1 -1
- package/dist/src/func/builtins/datetime.d.ts +2 -0
- package/dist/src/func/builtins/datetime.d.ts.map +1 -1
- package/dist/src/func/builtins/datetime.js +39 -0
- package/dist/src/func/builtins/datetime.js.map +1 -1
- package/dist/src/func/builtins/explain.d.ts +1 -0
- package/dist/src/func/builtins/explain.d.ts.map +1 -1
- package/dist/src/func/builtins/explain.js +159 -36
- package/dist/src/func/builtins/explain.js.map +1 -1
- package/dist/src/func/builtins/index.d.ts.map +1 -1
- package/dist/src/func/builtins/index.js +5 -2
- package/dist/src/func/builtins/index.js.map +1 -1
- package/dist/src/func/builtins/json-helpers.d.ts +8 -8
- package/dist/src/func/builtins/json-helpers.d.ts.map +1 -1
- package/dist/src/func/builtins/json-helpers.js +3 -3
- package/dist/src/func/builtins/json-helpers.js.map +1 -1
- package/dist/src/func/builtins/json-tvf.d.ts.map +1 -1
- package/dist/src/func/builtins/json-tvf.js +1 -1
- package/dist/src/func/builtins/json-tvf.js.map +1 -1
- package/dist/src/func/builtins/json.d.ts.map +1 -1
- package/dist/src/func/builtins/json.js +3 -2
- package/dist/src/func/builtins/json.js.map +1 -1
- package/dist/src/func/builtins/schema.d.ts.map +1 -1
- package/dist/src/func/builtins/schema.js +22 -1
- package/dist/src/func/builtins/schema.js.map +1 -1
- package/dist/src/func/context.d.ts.map +1 -1
- package/dist/src/func/context.js +5 -0
- package/dist/src/func/context.js.map +1 -1
- package/dist/src/func/registration.d.ts +2 -1
- package/dist/src/func/registration.d.ts.map +1 -1
- package/dist/src/func/registration.js.map +1 -1
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/parser/ast.d.ts +83 -4
- package/dist/src/parser/ast.d.ts.map +1 -1
- package/dist/src/parser/lexer.d.ts +11 -0
- package/dist/src/parser/lexer.d.ts.map +1 -1
- package/dist/src/parser/lexer.js +29 -21
- package/dist/src/parser/lexer.js.map +1 -1
- package/dist/src/parser/parser.d.ts +16 -0
- package/dist/src/parser/parser.d.ts.map +1 -1
- package/dist/src/parser/parser.js +542 -26
- package/dist/src/parser/parser.js.map +1 -1
- package/dist/src/parser/visitor.d.ts.map +1 -1
- package/dist/src/parser/visitor.js +1 -0
- package/dist/src/parser/visitor.js.map +1 -1
- package/dist/src/planner/analysis/binding-collector.d.ts +5 -0
- package/dist/src/planner/analysis/binding-collector.d.ts.map +1 -0
- package/dist/src/planner/analysis/binding-collector.js +73 -0
- package/dist/src/planner/analysis/binding-collector.js.map +1 -0
- package/dist/src/planner/analysis/const-evaluator.js +1 -1
- package/dist/src/planner/analysis/const-evaluator.js.map +1 -1
- package/dist/src/planner/analysis/const-pass.d.ts.map +1 -1
- package/dist/src/planner/analysis/const-pass.js +1 -1
- package/dist/src/planner/analysis/const-pass.js.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.d.ts +67 -31
- package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.js +513 -84
- package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
- package/dist/src/planner/analysis/predicate-normalizer.d.ts +17 -0
- package/dist/src/planner/analysis/predicate-normalizer.d.ts.map +1 -0
- package/dist/src/planner/analysis/predicate-normalizer.js +222 -0
- package/dist/src/planner/analysis/predicate-normalizer.js.map +1 -0
- package/dist/src/planner/building/alter-table.d.ts.map +1 -1
- package/dist/src/planner/building/alter-table.js +5 -2
- package/dist/src/planner/building/alter-table.js.map +1 -1
- package/dist/src/planner/building/block.d.ts.map +1 -1
- package/dist/src/planner/building/block.js +16 -0
- package/dist/src/planner/building/block.js.map +1 -1
- package/dist/src/planner/building/constraint-builder.d.ts +1 -1
- package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
- package/dist/src/planner/building/constraint-builder.js +52 -3
- package/dist/src/planner/building/constraint-builder.js.map +1 -1
- package/dist/src/planner/building/create-assertion.d.ts +5 -0
- package/dist/src/planner/building/create-assertion.d.ts.map +1 -0
- package/dist/src/planner/building/create-assertion.js +5 -0
- package/dist/src/planner/building/create-assertion.js.map +1 -0
- package/dist/src/planner/building/declare-schema.d.ts +8 -0
- package/dist/src/planner/building/declare-schema.d.ts.map +1 -0
- package/dist/src/planner/building/declare-schema.js +14 -0
- package/dist/src/planner/building/declare-schema.js.map +1 -0
- package/dist/src/planner/building/delete.d.ts.map +1 -1
- package/dist/src/planner/building/delete.js +37 -5
- package/dist/src/planner/building/delete.js.map +1 -1
- package/dist/src/planner/building/drop-assertion.d.ts +5 -0
- package/dist/src/planner/building/drop-assertion.d.ts.map +1 -0
- package/dist/src/planner/building/drop-assertion.js +8 -0
- package/dist/src/planner/building/drop-assertion.js.map +1 -0
- package/dist/src/planner/building/expression.d.ts.map +1 -1
- package/dist/src/planner/building/expression.js +1 -0
- package/dist/src/planner/building/expression.js.map +1 -1
- package/dist/src/planner/building/function-call.d.ts.map +1 -1
- package/dist/src/planner/building/function-call.js +2 -1
- package/dist/src/planner/building/function-call.js.map +1 -1
- package/dist/src/planner/building/insert.d.ts.map +1 -1
- package/dist/src/planner/building/insert.js +67 -10
- package/dist/src/planner/building/insert.js.map +1 -1
- package/dist/src/planner/building/pragma.d.ts.map +1 -1
- package/dist/src/planner/building/pragma.js +1 -0
- package/dist/src/planner/building/pragma.js.map +1 -1
- package/dist/src/planner/building/schema-resolution.d.ts +2 -2
- package/dist/src/planner/building/schema-resolution.d.ts.map +1 -1
- package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
- package/dist/src/planner/building/select-aggregates.js +3 -2
- package/dist/src/planner/building/select-aggregates.js.map +1 -1
- package/dist/src/planner/building/select-compound.d.ts +2 -2
- package/dist/src/planner/building/select-compound.d.ts.map +1 -1
- package/dist/src/planner/building/select-compound.js +10 -1
- package/dist/src/planner/building/select-compound.js.map +1 -1
- package/dist/src/planner/building/select-context.d.ts +3 -3
- package/dist/src/planner/building/select-context.d.ts.map +1 -1
- package/dist/src/planner/building/select-context.js.map +1 -1
- package/dist/src/planner/building/select-modifiers.d.ts +6 -5
- package/dist/src/planner/building/select-modifiers.d.ts.map +1 -1
- package/dist/src/planner/building/select-modifiers.js +5 -4
- package/dist/src/planner/building/select-modifiers.js.map +1 -1
- package/dist/src/planner/building/select-projections.d.ts.map +1 -1
- package/dist/src/planner/building/select-projections.js +4 -5
- package/dist/src/planner/building/select-projections.js.map +1 -1
- package/dist/src/planner/building/select-window.d.ts.map +1 -1
- package/dist/src/planner/building/select-window.js +6 -3
- package/dist/src/planner/building/select-window.js.map +1 -1
- package/dist/src/planner/building/select.d.ts +3 -3
- package/dist/src/planner/building/select.d.ts.map +1 -1
- package/dist/src/planner/building/select.js +18 -8
- package/dist/src/planner/building/select.js.map +1 -1
- package/dist/src/planner/building/table-function.d.ts.map +1 -1
- package/dist/src/planner/building/table-function.js +1 -1
- package/dist/src/planner/building/table-function.js.map +1 -1
- package/dist/src/planner/building/table.d.ts +5 -3
- package/dist/src/planner/building/table.d.ts.map +1 -1
- package/dist/src/planner/building/table.js +7 -2
- package/dist/src/planner/building/table.js.map +1 -1
- package/dist/src/planner/building/update.d.ts.map +1 -1
- package/dist/src/planner/building/update.js +38 -6
- package/dist/src/planner/building/update.js.map +1 -1
- package/dist/src/planner/building/with.d.ts +3 -3
- package/dist/src/planner/building/with.d.ts.map +1 -1
- package/dist/src/planner/building/with.js.map +1 -1
- package/dist/src/planner/debug.d.ts.map +1 -1
- package/dist/src/planner/debug.js.map +1 -1
- package/dist/src/planner/framework/characteristics.d.ts +235 -0
- package/dist/src/planner/framework/characteristics.d.ts.map +1 -0
- package/dist/src/planner/framework/characteristics.js +299 -0
- package/dist/src/planner/framework/characteristics.js.map +1 -0
- package/dist/src/planner/framework/context.d.ts +16 -5
- package/dist/src/planner/framework/context.d.ts.map +1 -1
- package/dist/src/planner/framework/context.js +2 -0
- package/dist/src/planner/framework/context.js.map +1 -1
- package/dist/src/planner/framework/pass.d.ts +116 -0
- package/dist/src/planner/framework/pass.d.ts.map +1 -0
- package/dist/src/planner/framework/pass.js +236 -0
- package/dist/src/planner/framework/pass.js.map +1 -0
- package/dist/src/planner/nodes/aggregate-node.d.ts +16 -6
- package/dist/src/planner/nodes/aggregate-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/aggregate-node.js +40 -4
- package/dist/src/planner/nodes/aggregate-node.js.map +1 -1
- package/dist/src/planner/nodes/array-index-node.js.map +1 -1
- package/dist/src/planner/nodes/cache-node.d.ts +5 -2
- package/dist/src/planner/nodes/cache-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/cache-node.js +6 -0
- package/dist/src/planner/nodes/cache-node.js.map +1 -1
- package/dist/src/planner/nodes/constraint-check-node.d.ts +10 -2
- package/dist/src/planner/nodes/constraint-check-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/constraint-check-node.js +12 -4
- package/dist/src/planner/nodes/constraint-check-node.js.map +1 -1
- package/dist/src/planner/nodes/create-assertion-node.d.ts +22 -0
- package/dist/src/planner/nodes/create-assertion-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/create-assertion-node.js +41 -0
- package/dist/src/planner/nodes/create-assertion-node.js.map +1 -0
- package/dist/src/planner/nodes/create-index-node.js +2 -2
- package/dist/src/planner/nodes/create-index-node.js.map +1 -1
- package/dist/src/planner/nodes/create-table-node.js +2 -2
- package/dist/src/planner/nodes/create-table-node.js.map +1 -1
- package/dist/src/planner/nodes/cte-node.d.ts +17 -2
- package/dist/src/planner/nodes/cte-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/cte-node.js +9 -1
- package/dist/src/planner/nodes/cte-node.js.map +1 -1
- package/dist/src/planner/nodes/cte-reference-node.js +1 -1
- package/dist/src/planner/nodes/cte-reference-node.js.map +1 -1
- package/dist/src/planner/nodes/declarative-schema.d.ts +62 -0
- package/dist/src/planner/nodes/declarative-schema.d.ts.map +1 -0
- package/dist/src/planner/nodes/declarative-schema.js +181 -0
- package/dist/src/planner/nodes/declarative-schema.js.map +1 -0
- package/dist/src/planner/nodes/delete-node.d.ts +8 -3
- package/dist/src/planner/nodes/delete-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/delete-node.js +10 -2
- package/dist/src/planner/nodes/delete-node.js.map +1 -1
- package/dist/src/planner/nodes/distinct-node.d.ts +3 -2
- package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/distinct-node.js +17 -4
- package/dist/src/planner/nodes/distinct-node.js.map +1 -1
- package/dist/src/planner/nodes/dml-executor-node.d.ts +1 -1
- package/dist/src/planner/nodes/dml-executor-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/drop-assertion-node.d.ts +21 -0
- package/dist/src/planner/nodes/drop-assertion-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/drop-assertion-node.js +41 -0
- package/dist/src/planner/nodes/drop-assertion-node.js.map +1 -0
- package/dist/src/planner/nodes/drop-table-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/drop-table-node.js +1 -0
- package/dist/src/planner/nodes/drop-table-node.js.map +1 -1
- package/dist/src/planner/nodes/filter.d.ts +8 -3
- package/dist/src/planner/nodes/filter.d.ts.map +1 -1
- package/dist/src/planner/nodes/filter.js +44 -0
- package/dist/src/planner/nodes/filter.js.map +1 -1
- package/dist/src/planner/nodes/insert-node.d.ts +9 -3
- package/dist/src/planner/nodes/insert-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/insert-node.js +11 -2
- package/dist/src/planner/nodes/insert-node.js.map +1 -1
- package/dist/src/planner/nodes/internal-recursive-cte-ref-node.d.ts +3 -4
- package/dist/src/planner/nodes/internal-recursive-cte-ref-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/internal-recursive-cte-ref-node.js +1 -16
- package/dist/src/planner/nodes/internal-recursive-cte-ref-node.js.map +1 -1
- package/dist/src/planner/nodes/join-node.d.ts +12 -3
- package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-node.js +111 -2
- package/dist/src/planner/nodes/join-node.js.map +1 -1
- package/dist/src/planner/nodes/limit-offset.d.ts +7 -3
- package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
- package/dist/src/planner/nodes/limit-offset.js +15 -0
- package/dist/src/planner/nodes/limit-offset.js.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.d.ts +8 -0
- package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.js +8 -0
- package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
- package/dist/src/planner/nodes/plan-node.d.ts +9 -9
- package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node.js +3 -3
- package/dist/src/planner/nodes/plan-node.js.map +1 -1
- package/dist/src/planner/nodes/pragma.d.ts +2 -1
- package/dist/src/planner/nodes/pragma.d.ts.map +1 -1
- package/dist/src/planner/nodes/pragma.js +3 -1
- package/dist/src/planner/nodes/pragma.js.map +1 -1
- package/dist/src/planner/nodes/project-node.d.ts +16 -3
- package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/project-node.js +82 -2
- package/dist/src/planner/nodes/project-node.js.map +1 -1
- package/dist/src/planner/nodes/recursive-cte-node.d.ts +2 -2
- package/dist/src/planner/nodes/recursive-cte-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/recursive-cte-node.js +1 -1
- package/dist/src/planner/nodes/recursive-cte-node.js.map +1 -1
- package/dist/src/planner/nodes/reference.d.ts +13 -4
- package/dist/src/planner/nodes/reference.d.ts.map +1 -1
- package/dist/src/planner/nodes/reference.js +16 -0
- package/dist/src/planner/nodes/reference.js.map +1 -1
- package/dist/src/planner/nodes/remote-query-node.d.ts +37 -0
- package/dist/src/planner/nodes/remote-query-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/remote-query-node.js +63 -0
- package/dist/src/planner/nodes/remote-query-node.js.map +1 -0
- package/dist/src/planner/nodes/retrieve-node.d.ts +46 -0
- package/dist/src/planner/nodes/retrieve-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/retrieve-node.js +77 -0
- package/dist/src/planner/nodes/retrieve-node.js.map +1 -0
- package/dist/src/planner/nodes/returning-node.d.ts +4 -3
- package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/returning-node.js +44 -3
- package/dist/src/planner/nodes/returning-node.js.map +1 -1
- package/dist/src/planner/nodes/sequencing-node.d.ts +1 -1
- package/dist/src/planner/nodes/sequencing-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/sequencing-node.js.map +1 -1
- package/dist/src/planner/nodes/set-operation-node.d.ts +1 -1
- package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
- package/dist/src/planner/nodes/sort.d.ts +11 -2
- package/dist/src/planner/nodes/sort.d.ts.map +1 -1
- package/dist/src/planner/nodes/sort.js +23 -2
- package/dist/src/planner/nodes/sort.js.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.js +4 -1
- package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.d.ts +7 -1
- package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.js +22 -4
- package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
- package/dist/src/planner/nodes/table-function-call.d.ts +2 -1
- package/dist/src/planner/nodes/table-function-call.d.ts.map +1 -1
- package/dist/src/planner/nodes/table-function-call.js +12 -5
- package/dist/src/planner/nodes/table-function-call.js.map +1 -1
- package/dist/src/planner/nodes/transaction-node.js +2 -2
- package/dist/src/planner/nodes/transaction-node.js.map +1 -1
- package/dist/src/planner/nodes/update-node.d.ts +7 -1
- package/dist/src/planner/nodes/update-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/update-node.js +11 -2
- package/dist/src/planner/nodes/update-node.js.map +1 -1
- package/dist/src/planner/nodes/view-reference-node.js.map +1 -1
- package/dist/src/planner/nodes/window-function.js.map +1 -1
- package/dist/src/planner/nodes/window-node.js.map +1 -1
- package/dist/src/planner/optimizer-tuning.d.ts +11 -0
- package/dist/src/planner/optimizer-tuning.d.ts.map +1 -1
- package/dist/src/planner/optimizer-tuning.js +6 -0
- package/dist/src/planner/optimizer-tuning.js.map +1 -1
- package/dist/src/planner/optimizer.d.ts +17 -3
- package/dist/src/planner/optimizer.d.ts.map +1 -1
- package/dist/src/planner/optimizer.js +159 -67
- package/dist/src/planner/optimizer.js.map +1 -1
- package/dist/src/planner/planning-context.d.ts +5 -3
- package/dist/src/planner/planning-context.d.ts.map +1 -1
- package/dist/src/planner/planning-context.js +2 -0
- package/dist/src/planner/planning-context.js.map +1 -1
- package/dist/src/planner/resolve.d.ts +3 -2
- package/dist/src/planner/resolve.d.ts.map +1 -1
- package/dist/src/planner/resolve.js +6 -5
- package/dist/src/planner/resolve.js.map +1 -1
- package/dist/src/planner/rules/access/rule-select-access-path.d.ts +8 -3
- package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
- package/dist/src/planner/rules/access/rule-select-access-path.js +206 -47
- package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.d.ts +10 -3
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.d.ts.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js +95 -87
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js.map +1 -1
- package/dist/src/planner/rules/cache/rule-cte-optimization.d.ts +8 -2
- package/dist/src/planner/rules/cache/rule-cte-optimization.d.ts.map +1 -1
- package/dist/src/planner/rules/cache/rule-cte-optimization.js +24 -13
- package/dist/src/planner/rules/cache/rule-cte-optimization.js.map +1 -1
- package/dist/src/planner/rules/cache/rule-materialization-advisory.d.ts +9 -2
- package/dist/src/planner/rules/cache/rule-materialization-advisory.d.ts.map +1 -1
- package/dist/src/planner/rules/cache/rule-materialization-advisory.js +14 -7
- package/dist/src/planner/rules/cache/rule-materialization-advisory.js.map +1 -1
- package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.d.ts +9 -3
- package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.d.ts.map +1 -1
- package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.js +34 -37
- package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.js.map +1 -1
- package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts +14 -0
- package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-join-greedy-commute.js +33 -0
- package/dist/src/planner/rules/join/rule-join-greedy-commute.js.map +1 -0
- package/dist/src/planner/rules/join/rule-join-key-inference.d.ts +11 -0
- package/dist/src/planner/rules/join/rule-join-key-inference.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-join-key-inference.js +32 -0
- package/dist/src/planner/rules/join/rule-join-key-inference.js.map +1 -0
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.d.ts +4 -0
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.js +233 -0
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.js.map +1 -0
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.d.ts +21 -0
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.d.ts.map +1 -0
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js +125 -0
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js.map +1 -0
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts +21 -0
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts.map +1 -0
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js +261 -0
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +1 -0
- package/dist/src/planner/scopes/registered.d.ts +1 -0
- package/dist/src/planner/scopes/registered.d.ts.map +1 -1
- package/dist/src/planner/scopes/registered.js +7 -0
- package/dist/src/planner/scopes/registered.js.map +1 -1
- package/dist/src/planner/stats/index.d.ts +0 -17
- package/dist/src/planner/stats/index.d.ts.map +1 -1
- package/dist/src/planner/stats/index.js +0 -58
- package/dist/src/planner/stats/index.js.map +1 -1
- package/dist/src/planner/util/deferred-constraint.d.ts +14 -0
- package/dist/src/planner/util/deferred-constraint.d.ts.map +1 -0
- package/dist/src/planner/util/deferred-constraint.js +85 -0
- package/dist/src/planner/util/deferred-constraint.js.map +1 -0
- package/dist/src/planner/util/key-utils.d.ts +15 -0
- package/dist/src/planner/util/key-utils.d.ts.map +1 -0
- package/dist/src/planner/util/key-utils.js +43 -0
- package/dist/src/planner/util/key-utils.js.map +1 -0
- package/dist/src/planner/validation/plan-validator.d.ts.map +1 -1
- package/dist/src/planner/validation/plan-validator.js +1 -0
- package/dist/src/planner/validation/plan-validator.js.map +1 -1
- package/dist/src/runtime/deferred-constraint-queue.d.ts +33 -0
- package/dist/src/runtime/deferred-constraint-queue.d.ts.map +1 -0
- package/dist/src/runtime/deferred-constraint-queue.js +172 -0
- package/dist/src/runtime/deferred-constraint-queue.js.map +1 -0
- package/dist/src/runtime/emission-context.d.ts +9 -3
- package/dist/src/runtime/emission-context.d.ts.map +1 -1
- package/dist/src/runtime/emission-context.js +5 -1
- package/dist/src/runtime/emission-context.js.map +1 -1
- package/dist/src/runtime/emit/add-constraint.d.ts.map +1 -1
- package/dist/src/runtime/emit/add-constraint.js +22 -4
- package/dist/src/runtime/emit/add-constraint.js.map +1 -1
- package/dist/src/runtime/emit/aggregate.d.ts.map +1 -1
- package/dist/src/runtime/emit/aggregate.js +3 -2
- package/dist/src/runtime/emit/aggregate.js.map +1 -1
- package/dist/src/runtime/emit/array-index.js.map +1 -1
- package/dist/src/runtime/emit/binary.d.ts.map +1 -1
- package/dist/src/runtime/emit/binary.js +9 -2
- package/dist/src/runtime/emit/binary.js.map +1 -1
- package/dist/src/runtime/emit/cache.d.ts.map +1 -1
- package/dist/src/runtime/emit/cache.js +1 -1
- package/dist/src/runtime/emit/cache.js.map +1 -1
- package/dist/src/runtime/emit/cast.d.ts.map +1 -1
- package/dist/src/runtime/emit/cast.js.map +1 -1
- package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
- package/dist/src/runtime/emit/constraint-check.js +110 -23
- package/dist/src/runtime/emit/constraint-check.js.map +1 -1
- package/dist/src/runtime/emit/create-assertion.d.ts +5 -0
- package/dist/src/runtime/emit/create-assertion.d.ts.map +1 -0
- package/dist/src/runtime/emit/create-assertion.js +70 -0
- package/dist/src/runtime/emit/create-assertion.js.map +1 -0
- package/dist/src/runtime/emit/cte-reference.d.ts.map +1 -1
- package/dist/src/runtime/emit/cte-reference.js.map +1 -1
- package/dist/src/runtime/emit/cte.d.ts.map +1 -1
- package/dist/src/runtime/emit/cte.js.map +1 -1
- package/dist/src/runtime/emit/distinct.d.ts.map +1 -1
- package/dist/src/runtime/emit/distinct.js.map +1 -1
- package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
- package/dist/src/runtime/emit/dml-executor.js +17 -9
- package/dist/src/runtime/emit/dml-executor.js.map +1 -1
- package/dist/src/runtime/emit/drop-assertion.d.ts +5 -0
- package/dist/src/runtime/emit/drop-assertion.d.ts.map +1 -0
- package/dist/src/runtime/emit/drop-assertion.js +30 -0
- package/dist/src/runtime/emit/drop-assertion.js.map +1 -0
- package/dist/src/runtime/emit/filter.d.ts.map +1 -1
- package/dist/src/runtime/emit/filter.js.map +1 -1
- package/dist/src/runtime/emit/join.d.ts.map +1 -1
- package/dist/src/runtime/emit/join.js.map +1 -1
- package/dist/src/runtime/emit/limit-offset.d.ts.map +1 -1
- package/dist/src/runtime/emit/limit-offset.js.map +1 -1
- package/dist/src/runtime/emit/pragma.js.map +1 -1
- package/dist/src/runtime/emit/project.d.ts.map +1 -1
- package/dist/src/runtime/emit/project.js.map +1 -1
- package/dist/src/runtime/emit/recursive-cte.d.ts.map +1 -1
- package/dist/src/runtime/emit/recursive-cte.js +1 -1
- package/dist/src/runtime/emit/recursive-cte.js.map +1 -1
- package/dist/src/runtime/emit/remote-query.d.ts +9 -0
- package/dist/src/runtime/emit/remote-query.d.ts.map +1 -0
- package/dist/src/runtime/emit/remote-query.js +30 -0
- package/dist/src/runtime/emit/remote-query.js.map +1 -0
- package/dist/src/runtime/emit/retrieve.d.ts +5 -0
- package/dist/src/runtime/emit/retrieve.d.ts.map +1 -0
- package/dist/src/runtime/emit/retrieve.js +9 -0
- package/dist/src/runtime/emit/retrieve.js.map +1 -0
- package/dist/src/runtime/emit/returning.d.ts.map +1 -1
- package/dist/src/runtime/emit/returning.js +1 -1
- package/dist/src/runtime/emit/returning.js.map +1 -1
- package/dist/src/runtime/emit/scalar-function.d.ts.map +1 -1
- package/dist/src/runtime/emit/scalar-function.js.map +1 -1
- package/dist/src/runtime/emit/scan.d.ts.map +1 -1
- package/dist/src/runtime/emit/scan.js +20 -5
- package/dist/src/runtime/emit/scan.js.map +1 -1
- package/dist/src/runtime/emit/schema-declarative.d.ts +8 -0
- package/dist/src/runtime/emit/schema-declarative.d.ts.map +1 -0
- package/dist/src/runtime/emit/schema-declarative.js +163 -0
- package/dist/src/runtime/emit/schema-declarative.js.map +1 -0
- package/dist/src/runtime/emit/sequencing.d.ts.map +1 -1
- package/dist/src/runtime/emit/sequencing.js.map +1 -1
- package/dist/src/runtime/emit/set-operation.d.ts.map +1 -1
- package/dist/src/runtime/emit/set-operation.js +6 -6
- package/dist/src/runtime/emit/set-operation.js.map +1 -1
- package/dist/src/runtime/emit/sort.d.ts.map +1 -1
- package/dist/src/runtime/emit/sort.js.map +1 -1
- package/dist/src/runtime/emit/subquery.d.ts +1 -1
- package/dist/src/runtime/emit/subquery.d.ts.map +1 -1
- package/dist/src/runtime/emit/subquery.js +6 -6
- package/dist/src/runtime/emit/subquery.js.map +1 -1
- package/dist/src/runtime/emit/transaction.d.ts.map +1 -1
- package/dist/src/runtime/emit/transaction.js +48 -8
- package/dist/src/runtime/emit/transaction.js.map +1 -1
- package/dist/src/runtime/emit/values.d.ts.map +1 -1
- package/dist/src/runtime/emit/values.js.map +1 -1
- package/dist/src/runtime/emit/window.d.ts.map +1 -1
- package/dist/src/runtime/emit/window.js.map +1 -1
- package/dist/src/runtime/emitters.d.ts.map +1 -1
- package/dist/src/runtime/emitters.js +1 -0
- package/dist/src/runtime/emitters.js.map +1 -1
- package/dist/src/runtime/register.d.ts.map +1 -1
- package/dist/src/runtime/register.js +16 -2
- package/dist/src/runtime/register.js.map +1 -1
- package/dist/src/runtime/scheduler.js.map +1 -1
- package/dist/src/runtime/types.d.ts +2 -2
- package/dist/src/runtime/types.d.ts.map +1 -1
- package/dist/src/runtime/types.js +4 -1
- package/dist/src/runtime/types.js.map +1 -1
- package/dist/src/runtime/utils.d.ts +2 -2
- package/dist/src/runtime/utils.d.ts.map +1 -1
- package/dist/src/runtime/utils.js +1 -0
- package/dist/src/runtime/utils.js.map +1 -1
- package/dist/src/schema/assertion.d.ts +19 -0
- package/dist/src/schema/assertion.d.ts.map +1 -0
- package/dist/src/schema/assertion.js +2 -0
- package/dist/src/schema/assertion.js.map +1 -0
- package/dist/src/schema/catalog.d.ts +44 -0
- package/dist/src/schema/catalog.d.ts.map +1 -0
- package/dist/src/schema/catalog.js +148 -0
- package/dist/src/schema/catalog.js.map +1 -0
- package/dist/src/schema/change-events.d.ts +2 -2
- package/dist/src/schema/change-events.d.ts.map +1 -1
- package/dist/src/schema/column.d.ts +2 -0
- package/dist/src/schema/column.d.ts.map +1 -1
- package/dist/src/schema/column.js.map +1 -1
- package/dist/src/schema/declared-schema-manager.d.ts +42 -0
- package/dist/src/schema/declared-schema-manager.d.ts.map +1 -0
- package/dist/src/schema/declared-schema-manager.js +71 -0
- package/dist/src/schema/declared-schema-manager.js.map +1 -0
- package/dist/src/schema/function.d.ts +3 -2
- package/dist/src/schema/function.d.ts.map +1 -1
- package/dist/src/schema/function.js.map +1 -1
- package/dist/src/schema/manager.d.ts +8 -3
- package/dist/src/schema/manager.d.ts.map +1 -1
- package/dist/src/schema/manager.js +32 -3
- package/dist/src/schema/manager.js.map +1 -1
- package/dist/src/schema/schema-differ.d.ts +34 -0
- package/dist/src/schema/schema-differ.d.ts.map +1 -0
- package/dist/src/schema/schema-differ.js +157 -0
- package/dist/src/schema/schema-differ.js.map +1 -0
- package/dist/src/schema/schema-hasher.d.ts +10 -0
- package/dist/src/schema/schema-hasher.d.ts.map +1 -0
- package/dist/src/schema/schema-hasher.js +39 -0
- package/dist/src/schema/schema-hasher.js.map +1 -0
- package/dist/src/schema/schema.d.ts +7 -0
- package/dist/src/schema/schema.d.ts.map +1 -1
- package/dist/src/schema/schema.js +19 -0
- package/dist/src/schema/schema.js.map +1 -1
- package/dist/src/schema/table.d.ts +28 -3
- package/dist/src/schema/table.d.ts.map +1 -1
- package/dist/src/schema/table.js +17 -2
- package/dist/src/schema/table.js.map +1 -1
- package/dist/src/schema/window-function.d.ts.map +1 -1
- package/dist/src/schema/window-function.js.map +1 -1
- package/dist/src/util/ast-stringify.d.ts.map +1 -1
- package/dist/src/util/ast-stringify.js +116 -3
- package/dist/src/util/ast-stringify.js.map +1 -1
- package/dist/src/util/environment.js.map +1 -1
- package/dist/src/util/plugin-loader.d.ts +25 -0
- package/dist/src/util/plugin-loader.d.ts.map +1 -1
- package/dist/src/util/plugin-loader.js +137 -0
- package/dist/src/util/plugin-loader.js.map +1 -1
- package/dist/src/util/row-descriptor.d.ts +1 -1
- package/dist/src/util/row-descriptor.d.ts.map +1 -1
- package/dist/src/util/row-descriptor.js.map +1 -1
- package/dist/src/util/serialization.d.ts +3 -0
- package/dist/src/util/serialization.d.ts.map +1 -1
- package/dist/src/util/serialization.js +1 -0
- package/dist/src/util/serialization.js.map +1 -1
- package/dist/src/vtab/best-access-plan.d.ts +1 -1
- package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
- package/dist/src/vtab/best-access-plan.js +1 -0
- package/dist/src/vtab/best-access-plan.js.map +1 -1
- package/dist/src/vtab/manifest.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/base.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/base.js +2 -0
- package/dist/src/vtab/memory/layer/base.js.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts +2 -1
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +24 -6
- package/dist/src/vtab/memory/layer/manager.js.map +1 -1
- package/dist/src/vtab/memory/layer/safe-iterate.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/safe-iterate.js.map +1 -1
- package/dist/src/vtab/memory/module.d.ts.map +1 -1
- package/dist/src/vtab/memory/module.js +5 -0
- package/dist/src/vtab/memory/module.js.map +1 -1
- package/dist/src/vtab/memory/table.d.ts +2 -1
- package/dist/src/vtab/memory/table.d.ts.map +1 -1
- package/dist/src/vtab/memory/table.js +3 -2
- package/dist/src/vtab/memory/table.js.map +1 -1
- package/dist/src/vtab/memory/utils/logging.d.ts +2 -2
- package/dist/src/vtab/memory/utils/logging.d.ts.map +1 -1
- package/dist/src/vtab/memory/utils/logging.js +6 -3
- package/dist/src/vtab/memory/utils/logging.js.map +1 -1
- package/dist/src/vtab/module.d.ts +25 -0
- package/dist/src/vtab/module.d.ts.map +1 -1
- package/dist/src/vtab/table.d.ts +17 -4
- package/dist/src/vtab/table.d.ts.map +1 -1
- package/dist/src/vtab/table.js.map +1 -1
- package/package.json +4 -2
- package/src/common/errors.ts +1 -1
- package/src/common/json-types.ts +16 -0
- package/src/common/types.ts +2 -0
- package/src/core/database-options.ts +8 -8
- package/src/core/database.ts +537 -71
- package/src/core/statement.ts +3 -1
- package/src/func/builtins/builtin-window-functions.ts +11 -10
- package/src/func/builtins/datetime.ts +42 -0
- package/src/func/builtins/explain.ts +186 -44
- package/src/func/builtins/index.ts +5 -2
- package/src/func/builtins/json-helpers.ts +21 -21
- package/src/func/builtins/json-tvf.ts +8 -9
- package/src/func/builtins/json.ts +10 -9
- package/src/func/builtins/schema.ts +24 -4
- package/src/func/context.ts +7 -0
- package/src/func/registration.ts +5 -1
- package/src/index.ts +2 -2
- package/src/parser/ast.ts +582 -481
- package/src/parser/lexer.ts +27 -21
- package/src/parser/parser.ts +3336 -2776
- package/src/parser/visitor.ts +1 -0
- package/src/planner/analysis/binding-collector.ts +83 -0
- package/src/planner/analysis/const-evaluator.ts +1 -1
- package/src/planner/analysis/const-pass.ts +3 -2
- package/src/planner/analysis/constraint-extractor.ts +610 -123
- package/src/planner/analysis/predicate-normalizer.ts +237 -0
- package/src/planner/building/alter-table.ts +3 -1
- package/src/planner/building/block.ts +93 -78
- package/src/planner/building/constraint-builder.ts +173 -114
- package/src/planner/building/create-assertion.ts +7 -0
- package/src/planner/building/declare-schema.ts +22 -0
- package/src/planner/building/delete.ts +214 -171
- package/src/planner/building/drop-assertion.ts +11 -0
- package/src/planner/building/expression.ts +1 -0
- package/src/planner/building/function-call.ts +6 -5
- package/src/planner/building/insert.ts +428 -349
- package/src/planner/building/pragma.ts +1 -0
- package/src/planner/building/schema-resolution.ts +176 -176
- package/src/planner/building/select-aggregates.ts +5 -3
- package/src/planner/building/select-compound.ts +22 -13
- package/src/planner/building/select-context.ts +6 -6
- package/src/planner/building/select-modifiers.ts +8 -7
- package/src/planner/building/select-projections.ts +177 -176
- package/src/planner/building/select-window.ts +259 -253
- package/src/planner/building/select.ts +531 -520
- package/src/planner/building/table-function.ts +49 -48
- package/src/planner/building/table.ts +9 -3
- package/src/planner/building/update.ts +319 -270
- package/src/planner/building/with.ts +7 -7
- package/src/planner/debug.ts +1 -0
- package/src/planner/framework/characteristics.ts +503 -0
- package/src/planner/framework/context.ts +23 -6
- package/src/planner/framework/pass.ts +354 -0
- package/src/planner/nodes/aggregate-node.ts +52 -7
- package/src/planner/nodes/array-index-node.ts +1 -1
- package/src/planner/nodes/cache-node.ts +11 -2
- package/src/planner/nodes/constraint-check-node.ts +14 -5
- package/src/planner/nodes/create-assertion-node.ts +51 -0
- package/src/planner/nodes/create-index-node.ts +2 -2
- package/src/planner/nodes/create-table-node.ts +2 -2
- package/src/planner/nodes/cte-node.ts +30 -4
- package/src/planner/nodes/cte-reference-node.ts +2 -2
- package/src/planner/nodes/declarative-schema.ts +221 -0
- package/src/planner/nodes/delete-node.ts +102 -96
- package/src/planner/nodes/distinct-node.ts +20 -6
- package/src/planner/nodes/dml-executor-node.ts +1 -1
- package/src/planner/nodes/drop-assertion-node.ts +50 -0
- package/src/planner/nodes/drop-table-node.ts +1 -0
- package/src/planner/nodes/filter.ts +56 -3
- package/src/planner/nodes/insert-node.ts +126 -120
- package/src/planner/nodes/internal-recursive-cte-ref-node.ts +5 -20
- package/src/planner/nodes/join-node.ts +122 -4
- package/src/planner/nodes/limit-offset.ts +132 -113
- package/src/planner/nodes/plan-node-type.ts +95 -87
- package/src/planner/nodes/plan-node.ts +8 -8
- package/src/planner/nodes/pragma.ts +6 -3
- package/src/planner/nodes/project-node.ts +101 -7
- package/src/planner/nodes/recursive-cte-node.ts +6 -6
- package/src/planner/nodes/reference.ts +334 -312
- package/src/planner/nodes/remote-query-node.ts +73 -0
- package/src/planner/nodes/retrieve-node.ts +86 -0
- package/src/planner/nodes/returning-node.ts +52 -10
- package/src/planner/nodes/sequencing-node.ts +2 -2
- package/src/planner/nodes/set-operation-node.ts +3 -3
- package/src/planner/nodes/sort.ts +33 -4
- package/src/planner/nodes/stream-aggregate.ts +5 -1
- package/src/planner/nodes/table-access-nodes.ts +31 -6
- package/src/planner/nodes/table-function-call.ts +134 -127
- package/src/planner/nodes/transaction-node.ts +2 -2
- package/src/planner/nodes/update-node.ts +138 -132
- package/src/planner/nodes/view-reference-node.ts +1 -1
- package/src/planner/nodes/window-function.ts +2 -2
- package/src/planner/nodes/window-node.ts +1 -1
- package/src/planner/optimizer-tuning.ts +18 -0
- package/src/planner/optimizer.ts +171 -96
- package/src/planner/planning-context.ts +10 -3
- package/src/planner/resolve.ts +10 -9
- package/src/planner/rules/README.md +96 -96
- package/src/planner/rules/access/rule-select-access-path.ts +384 -184
- package/src/planner/rules/aggregate/rule-aggregate-streaming.ts +118 -104
- package/src/planner/rules/cache/rule-cte-optimization.ts +29 -16
- package/src/planner/rules/cache/rule-materialization-advisory.ts +14 -7
- package/src/planner/rules/cache/rule-mutating-subquery-cache.ts +38 -44
- package/src/planner/rules/join/rule-join-greedy-commute.ts +48 -0
- package/src/planner/rules/join/rule-join-key-inference.ts +35 -0
- package/src/planner/rules/join/rule-quickpick-enumeration.ts +267 -0
- package/src/planner/rules/predicate/rule-predicate-pushdown.ts +144 -0
- package/src/planner/rules/retrieve/rule-grow-retrieve.ts +337 -0
- package/src/planner/scopes/registered.ts +8 -0
- package/src/planner/stats/index.ts +0 -65
- package/src/planner/util/key-utils.ts +46 -0
- package/src/planner/validation/plan-validator.ts +5 -3
- package/src/runtime/deferred-constraint-queue.ts +196 -0
- package/src/runtime/emission-context.ts +11 -5
- package/src/runtime/emit/add-constraint.ts +26 -5
- package/src/runtime/emit/aggregate.ts +9 -7
- package/src/runtime/emit/array-index.ts +2 -2
- package/src/runtime/emit/binary.ts +26 -8
- package/src/runtime/emit/cache.ts +2 -2
- package/src/runtime/emit/cast.ts +2 -2
- package/src/runtime/emit/constraint-check.ts +148 -26
- package/src/runtime/emit/create-assertion.ts +82 -0
- package/src/runtime/emit/cte-reference.ts +2 -2
- package/src/runtime/emit/cte.ts +2 -2
- package/src/runtime/emit/distinct.ts +2 -2
- package/src/runtime/emit/dml-executor.ts +20 -12
- package/src/runtime/emit/drop-assertion.ts +45 -0
- package/src/runtime/emit/filter.ts +4 -4
- package/src/runtime/emit/join.ts +8 -7
- package/src/runtime/emit/limit-offset.ts +2 -2
- package/src/runtime/emit/pragma.ts +2 -2
- package/src/runtime/emit/project.ts +2 -2
- package/src/runtime/emit/recursive-cte.ts +2 -2
- package/src/runtime/emit/remote-query.ts +47 -0
- package/src/runtime/emit/retrieve.ts +15 -0
- package/src/runtime/emit/returning.ts +4 -4
- package/src/runtime/emit/scalar-function.ts +2 -2
- package/src/runtime/emit/scan.ts +29 -13
- package/src/runtime/emit/schema-declarative.ts +205 -0
- package/src/runtime/emit/sequencing.ts +3 -3
- package/src/runtime/emit/set-operation.ts +7 -7
- package/src/runtime/emit/sort.ts +2 -2
- package/src/runtime/emit/subquery.ts +10 -10
- package/src/runtime/emit/transaction.ts +46 -8
- package/src/runtime/emit/values.ts +2 -2
- package/src/runtime/emit/window.ts +3 -3
- package/src/runtime/emitters.ts +1 -0
- package/src/runtime/register.ts +150 -135
- package/src/runtime/scheduler.ts +2 -2
- package/src/runtime/types.ts +10 -7
- package/src/runtime/utils.ts +3 -2
- package/src/schema/assertion.ts +21 -0
- package/src/schema/catalog.ts +208 -0
- package/src/schema/change-events.ts +2 -2
- package/src/schema/column.ts +2 -0
- package/src/schema/declared-schema-manager.ts +82 -0
- package/src/schema/function.ts +5 -2
- package/src/schema/manager.ts +742 -709
- package/src/schema/schema-differ.ts +214 -0
- package/src/schema/schema-hasher.ts +44 -0
- package/src/schema/schema.ts +23 -0
- package/src/schema/table.ts +398 -364
- package/src/schema/window-function.ts +2 -0
- package/src/util/ast-stringify.ts +869 -764
- package/src/util/environment.ts +2 -2
- package/src/util/plugin-loader.ts +184 -0
- package/src/util/row-descriptor.ts +1 -1
- package/src/util/serialization.ts +2 -0
- package/src/vtab/best-access-plan.ts +2 -1
- package/src/vtab/manifest.ts +1 -0
- package/src/vtab/memory/index.ts +178 -178
- package/src/vtab/memory/layer/base.ts +275 -273
- package/src/vtab/memory/layer/interface.ts +47 -47
- package/src/vtab/memory/layer/manager.ts +33 -11
- package/src/vtab/memory/layer/safe-iterate.ts +3 -3
- package/src/vtab/memory/layer/transaction.ts +229 -229
- package/src/vtab/memory/module.ts +24 -18
- package/src/vtab/memory/table.ts +256 -253
- package/src/vtab/memory/utils/logging.ts +6 -3
- package/src/vtab/module.ts +170 -140
- package/src/vtab/table.ts +162 -143
package/src/schema/manager.ts
CHANGED
|
@@ -1,709 +1,742 @@
|
|
|
1
|
-
import { Schema } from './schema.js';
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
import type {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
8
|
-
import type {
|
|
9
|
-
import type {
|
|
10
|
-
import {
|
|
11
|
-
import
|
|
12
|
-
import {
|
|
13
|
-
import
|
|
14
|
-
import
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
*
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
*
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
private
|
|
38
|
-
private
|
|
39
|
-
private
|
|
40
|
-
private
|
|
41
|
-
private
|
|
42
|
-
private
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
this.schemas.set('
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
* @param
|
|
83
|
-
* @param
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
* @
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
* @
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
*
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
*
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
*
|
|
172
|
-
*
|
|
173
|
-
* @
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
*
|
|
182
|
-
*
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
*
|
|
191
|
-
*
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
*
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
const
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
*
|
|
293
|
-
*
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
*
|
|
304
|
-
*
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
*
|
|
315
|
-
*
|
|
316
|
-
* @param
|
|
317
|
-
* @
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
const
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
*
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
const
|
|
340
|
-
if (
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
*
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
*
|
|
445
|
-
*
|
|
446
|
-
* @
|
|
447
|
-
* @
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
*
|
|
459
|
-
*
|
|
460
|
-
* @param
|
|
461
|
-
* @
|
|
462
|
-
* @
|
|
463
|
-
*/
|
|
464
|
-
|
|
465
|
-
const targetSchemaName =
|
|
466
|
-
const
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
const
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
}
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
if (
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
const
|
|
581
|
-
const
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
}
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
const
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
};
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
const
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
const
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
}
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
1
|
+
import { Schema } from './schema.js';
|
|
2
|
+
import type { IntegrityAssertionSchema } from './assertion.js';
|
|
3
|
+
import type { Database } from '../core/database.js';
|
|
4
|
+
import type { TableSchema, RowConstraintSchema, IndexSchema } from './table.js';
|
|
5
|
+
import type { FunctionSchema } from './function.js';
|
|
6
|
+
import { quereusError, QuereusError } from '../common/errors.js';
|
|
7
|
+
import { StatusCode, type SqlValue } from '../common/types.js';
|
|
8
|
+
import type { AnyVirtualTableModule, BaseModuleConfig } from '../vtab/module.js';
|
|
9
|
+
import type { VirtualTable } from '../vtab/table.js';
|
|
10
|
+
import type { ColumnSchema } from './column.js';
|
|
11
|
+
import { buildColumnIndexMap, columnDefToSchema, findPKDefinition, opsToMask, mutationContextVarToSchema } from './table.js';
|
|
12
|
+
import type { ViewSchema } from './view.js';
|
|
13
|
+
import { createLogger } from '../common/logger.js';
|
|
14
|
+
import type * as AST from '../parser/ast.js';
|
|
15
|
+
import { SchemaChangeNotifier } from './change-events.js';
|
|
16
|
+
|
|
17
|
+
const log = createLogger('schema:manager');
|
|
18
|
+
const warnLog = log.extend('warn');
|
|
19
|
+
const errorLog = log.extend('error');
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Generic options passed to VTab modules during CREATE TABLE.
|
|
23
|
+
* Modules are responsible for interpreting these.
|
|
24
|
+
*/
|
|
25
|
+
export interface GenericModuleCallOptions extends BaseModuleConfig {
|
|
26
|
+
moduleArgs?: readonly string[];
|
|
27
|
+
statementColumns?: readonly AST.ColumnDef[];
|
|
28
|
+
statementConstraints?: readonly AST.TableConstraint[];
|
|
29
|
+
isTemporary?: boolean;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Manages all schemas associated with a database connection (main, temp, attached).
|
|
34
|
+
* Handles lookup resolution according to SQLite's rules.
|
|
35
|
+
*/
|
|
36
|
+
export class SchemaManager {
|
|
37
|
+
private schemas: Map<string, Schema> = new Map();
|
|
38
|
+
private currentSchemaName: string = 'main';
|
|
39
|
+
private modules: Map<string, { module: AnyVirtualTableModule, auxData?: unknown }> = new Map();
|
|
40
|
+
private defaultVTabModuleName: string = 'memory';
|
|
41
|
+
private defaultVTabModuleArgs: Record<string, SqlValue> = {};
|
|
42
|
+
private db: Database;
|
|
43
|
+
private changeNotifier = new SchemaChangeNotifier();
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Creates a new schema manager
|
|
47
|
+
*
|
|
48
|
+
* @param db Reference to the parent Database instance
|
|
49
|
+
*/
|
|
50
|
+
constructor(db: Database) {
|
|
51
|
+
this.db = db;
|
|
52
|
+
// Ensure 'main' and 'temp' schemas always exist
|
|
53
|
+
this.schemas.set('main', new Schema('main'));
|
|
54
|
+
this.schemas.set('temp', new Schema('temp'));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Sets the current default schema for unqualified names
|
|
59
|
+
*
|
|
60
|
+
* @param name Schema name to set as current
|
|
61
|
+
*/
|
|
62
|
+
setCurrentSchema(name: string): void {
|
|
63
|
+
if (this.schemas.has(name.toLowerCase())) {
|
|
64
|
+
this.currentSchemaName = name.toLowerCase();
|
|
65
|
+
} else {
|
|
66
|
+
warnLog(`Attempted to set current schema to non-existent schema: %s`, name);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Gets the name of the current default schema
|
|
72
|
+
*
|
|
73
|
+
* @returns Current schema name
|
|
74
|
+
*/
|
|
75
|
+
getCurrentSchemaName(): string {
|
|
76
|
+
return this.currentSchemaName;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Registers a virtual table module
|
|
81
|
+
*
|
|
82
|
+
* @param name Module name
|
|
83
|
+
* @param module Module implementation
|
|
84
|
+
* @param auxData Optional client data associated with the module registration
|
|
85
|
+
*/
|
|
86
|
+
registerModule(name: string, module: AnyVirtualTableModule, auxData?: unknown): void {
|
|
87
|
+
const lowerName = name.toLowerCase();
|
|
88
|
+
if (this.modules.has(lowerName)) {
|
|
89
|
+
warnLog(`Replacing existing virtual table module: %s`, lowerName);
|
|
90
|
+
}
|
|
91
|
+
this.modules.set(lowerName, { module, auxData });
|
|
92
|
+
log(`Registered VTab module: %s`, lowerName);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Retrieves a registered virtual table module by name
|
|
97
|
+
*
|
|
98
|
+
* @param name Module name to look up
|
|
99
|
+
* @returns The module and its auxData, or undefined if not found
|
|
100
|
+
*/
|
|
101
|
+
getModule(name: string): { module: AnyVirtualTableModule, auxData?: unknown } | undefined {
|
|
102
|
+
return this.modules.get(name.toLowerCase());
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Sets the default virtual table module to use when USING is omitted
|
|
107
|
+
*
|
|
108
|
+
* @param name Module name. Must be a registered module.
|
|
109
|
+
* @throws QuereusError if the module name is not registered
|
|
110
|
+
*/
|
|
111
|
+
setDefaultVTabModuleName(name: string): void {
|
|
112
|
+
const lowerName = name.toLowerCase();
|
|
113
|
+
if (this.modules.has(lowerName)) {
|
|
114
|
+
this.defaultVTabModuleName = lowerName;
|
|
115
|
+
log(`Default VTab module name set to: %s`, lowerName);
|
|
116
|
+
} else {
|
|
117
|
+
warnLog(`Setting default VTab module to '${lowerName}', which is not currently registered in SchemaManager. Ensure it gets registered.`);
|
|
118
|
+
this.defaultVTabModuleName = lowerName;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Gets the currently configured default virtual table module name
|
|
124
|
+
*
|
|
125
|
+
* @returns The default module name
|
|
126
|
+
*/
|
|
127
|
+
getDefaultVTabModuleName(): string {
|
|
128
|
+
return this.defaultVTabModuleName;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** @internal Sets the default VTab args directly */
|
|
132
|
+
setDefaultVTabArgs(args: Record<string, SqlValue>): void {
|
|
133
|
+
this.defaultVTabModuleArgs = args;
|
|
134
|
+
log('Default VTab module args set to: %o', args);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/** @internal Sets the default VTab args by parsing a JSON string */
|
|
138
|
+
setDefaultVTabArgsFromJson(argsJsonString: string): void {
|
|
139
|
+
try {
|
|
140
|
+
const parsedArgs = JSON.parse(argsJsonString);
|
|
141
|
+
if (typeof parsedArgs !== 'object') {
|
|
142
|
+
quereusError("JSON value must be an object.", StatusCode.MISUSE);
|
|
143
|
+
}
|
|
144
|
+
this.setDefaultVTabArgs(parsedArgs);
|
|
145
|
+
} catch (e) {
|
|
146
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
147
|
+
quereusError(`Invalid JSON for default_vtab_args: ${msg}`, StatusCode.ERROR);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Gets the default virtual table module arguments.
|
|
153
|
+
* @returns A copy of the default arguments array.
|
|
154
|
+
*/
|
|
155
|
+
getDefaultVTabArgs(): Record<string, SqlValue> {
|
|
156
|
+
return { ...this.defaultVTabModuleArgs };
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Gets the default virtual table module name and arguments.
|
|
161
|
+
* @returns An object containing the module name and arguments.
|
|
162
|
+
*/
|
|
163
|
+
getDefaultVTabModule(): { name: string; args: Record<string, SqlValue> } {
|
|
164
|
+
return {
|
|
165
|
+
name: this.defaultVTabModuleName,
|
|
166
|
+
args: this.defaultVTabModuleArgs,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Gets a specific schema by name
|
|
172
|
+
*
|
|
173
|
+
* @param name Schema name to retrieve
|
|
174
|
+
* @returns The schema or undefined if not found
|
|
175
|
+
*/
|
|
176
|
+
getSchema(name: string): Schema | undefined {
|
|
177
|
+
return this.schemas.get(name.toLowerCase());
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Gets the 'main' schema
|
|
182
|
+
*
|
|
183
|
+
* @returns The main schema
|
|
184
|
+
*/
|
|
185
|
+
getMainSchema(): Schema {
|
|
186
|
+
return this.schemas.get('main')!;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Gets the 'temp' schema
|
|
191
|
+
*
|
|
192
|
+
* @returns The temp schema
|
|
193
|
+
*/
|
|
194
|
+
getTempSchema(): Schema {
|
|
195
|
+
return this.schemas.get('temp')!;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* @internal Returns iterator over all managed schemas
|
|
200
|
+
*/
|
|
201
|
+
_getAllSchemas(): IterableIterator<Schema> {
|
|
202
|
+
return this.schemas.values();
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Returns all assertions across all schemas
|
|
207
|
+
*/
|
|
208
|
+
getAllAssertions(): IntegrityAssertionSchema[] {
|
|
209
|
+
const result: IntegrityAssertionSchema[] = [];
|
|
210
|
+
for (const schema of this._getAllSchemas()) {
|
|
211
|
+
for (const a of schema.getAllAssertions()) {
|
|
212
|
+
result.push(a);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return result;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Gets the schema change notifier for listening to schema changes
|
|
220
|
+
*/
|
|
221
|
+
getChangeNotifier(): SchemaChangeNotifier {
|
|
222
|
+
return this.changeNotifier;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Adds a new schema (e.g., for ATTACH)
|
|
227
|
+
*
|
|
228
|
+
* @param name Name of the schema to add
|
|
229
|
+
* @returns The newly created schema
|
|
230
|
+
* @throws QuereusError if the name conflicts with an existing schema
|
|
231
|
+
*/
|
|
232
|
+
addSchema(name: string): Schema {
|
|
233
|
+
const lowerName = name.toLowerCase();
|
|
234
|
+
if (this.schemas.has(lowerName)) {
|
|
235
|
+
throw new QuereusError(`Schema '${name}' already exists`, StatusCode.ERROR);
|
|
236
|
+
}
|
|
237
|
+
const schema = new Schema(name);
|
|
238
|
+
this.schemas.set(lowerName, schema);
|
|
239
|
+
log(`Added schema '%s'`, name);
|
|
240
|
+
return schema;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Removes a schema (e.g., for DETACH)
|
|
245
|
+
*
|
|
246
|
+
* @param name Name of the schema to remove
|
|
247
|
+
* @returns true if found and removed, false otherwise
|
|
248
|
+
* @throws QuereusError if attempting to remove 'main' or 'temp'
|
|
249
|
+
*/
|
|
250
|
+
removeSchema(name: string): boolean {
|
|
251
|
+
const lowerName = name.toLowerCase();
|
|
252
|
+
if (lowerName === 'main' || lowerName === 'temp') {
|
|
253
|
+
throw new QuereusError(`Cannot detach schema '${name}'`, StatusCode.ERROR);
|
|
254
|
+
}
|
|
255
|
+
const schema = this.schemas.get(lowerName);
|
|
256
|
+
if (schema) {
|
|
257
|
+
schema.clearFunctions();
|
|
258
|
+
schema.clearTables();
|
|
259
|
+
schema.clearViews();
|
|
260
|
+
this.schemas.delete(lowerName);
|
|
261
|
+
log(`Removed schema '%s'`, name);
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* @internal Finds a table or virtual table by name across schemas
|
|
269
|
+
*/
|
|
270
|
+
_findTable(tableName: string, dbName?: string): TableSchema | undefined {
|
|
271
|
+
const lowerTableName = tableName.toLowerCase();
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
if (dbName) {
|
|
276
|
+
// Search specific schema
|
|
277
|
+
const schema = this.schemas.get(dbName.toLowerCase());
|
|
278
|
+
return schema?.getTable(lowerTableName);
|
|
279
|
+
} else {
|
|
280
|
+
// Search order: main, then temp (and attached later)
|
|
281
|
+
const mainSchema = this.schemas.get('main');
|
|
282
|
+
let table = mainSchema?.getTable(lowerTableName);
|
|
283
|
+
if (table) return table;
|
|
284
|
+
|
|
285
|
+
const tempSchema = this.schemas.get('temp');
|
|
286
|
+
table = tempSchema?.getTable(lowerTableName);
|
|
287
|
+
return table;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Finds a table by name, searching schemas according to SQLite rules
|
|
293
|
+
*
|
|
294
|
+
* @param tableName Name of the table
|
|
295
|
+
* @param dbName Optional specific schema name to search
|
|
296
|
+
* @returns The TableSchema or undefined if not found
|
|
297
|
+
*/
|
|
298
|
+
findTable(tableName: string, dbName?: string): TableSchema | undefined {
|
|
299
|
+
return this._findTable(tableName, dbName);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Finds a function by name and arg count, searching schemas
|
|
304
|
+
*
|
|
305
|
+
* @param funcName Name of the function
|
|
306
|
+
* @param nArg Number of arguments
|
|
307
|
+
* @returns The FunctionSchema or undefined if not found
|
|
308
|
+
*/
|
|
309
|
+
findFunction(funcName: string, nArg: number): FunctionSchema | undefined {
|
|
310
|
+
return this.getMainSchema().getFunction(funcName, nArg);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Retrieves a view schema definition
|
|
315
|
+
*
|
|
316
|
+
* @param schemaName The name of the schema ('main', 'temp', etc.). Defaults to current schema
|
|
317
|
+
* @param viewName The name of the view
|
|
318
|
+
* @returns The ViewSchema or undefined if not found
|
|
319
|
+
*/
|
|
320
|
+
getView(schemaName: string | null, viewName: string): ViewSchema | undefined {
|
|
321
|
+
const targetSchemaName = schemaName ?? this.currentSchemaName;
|
|
322
|
+
const schema = this.schemas.get(targetSchemaName);
|
|
323
|
+
return schema?.getView(viewName);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Retrieves any schema item (table or view) by name. Checks views first
|
|
328
|
+
*
|
|
329
|
+
* @param schemaName The name of the schema ('main', 'temp', etc.). Defaults to current schema
|
|
330
|
+
* @param itemName The name of the table or view
|
|
331
|
+
* @returns The TableSchema or ViewSchema, or undefined if not found
|
|
332
|
+
*/
|
|
333
|
+
getSchemaItem(schemaName: string | null, itemName: string): TableSchema | ViewSchema | undefined {
|
|
334
|
+
const targetSchemaName = schemaName ?? this.currentSchemaName;
|
|
335
|
+
const schema = this.schemas.get(targetSchemaName);
|
|
336
|
+
if (!schema) return undefined;
|
|
337
|
+
|
|
338
|
+
// Prioritize views over tables if names conflict
|
|
339
|
+
const view = schema.getView(itemName);
|
|
340
|
+
if (view) return view;
|
|
341
|
+
return schema.getTable(itemName);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* Drops a table from the specified schema
|
|
346
|
+
*
|
|
347
|
+
* @param schemaName The name of the schema
|
|
348
|
+
* @param tableName The name of the table to drop
|
|
349
|
+
* @param ifExists If true, do not throw an error if the table does not exist.
|
|
350
|
+
* @returns True if the table was found and dropped, false otherwise.
|
|
351
|
+
*/
|
|
352
|
+
dropTable(schemaName: string, tableName: string, ifExists: boolean = false): boolean {
|
|
353
|
+
const schema = this.schemas.get(schemaName.toLowerCase()); // Ensure schemaName is lowercased for lookup
|
|
354
|
+
if (!schema) {
|
|
355
|
+
if (ifExists) return false; // Schema not found, but IF EXISTS specified
|
|
356
|
+
throw new QuereusError(`Schema not found: ${schemaName}`, StatusCode.ERROR);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
const tableSchema = schema.getTable(tableName); // getTable should handle case-insensitivity
|
|
360
|
+
|
|
361
|
+
if (!tableSchema) {
|
|
362
|
+
if (ifExists) {
|
|
363
|
+
log(`Table %s.%s not found, but IF EXISTS was specified.`, schemaName, tableName);
|
|
364
|
+
return false; // Not found, but IF EXISTS means no error, not dropped.
|
|
365
|
+
}
|
|
366
|
+
throw new QuereusError(`Table ${tableName} not found in schema ${schemaName}`, StatusCode.NOTFOUND);
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
let destroyPromise: Promise<void> | null = null;
|
|
370
|
+
|
|
371
|
+
// Call xDestroy on the module, providing table details
|
|
372
|
+
if (tableSchema.vtabModuleName) { // tableSchema is guaranteed to be defined here
|
|
373
|
+
const moduleRegistration = this.getModule(tableSchema.vtabModuleName);
|
|
374
|
+
if (moduleRegistration && moduleRegistration.module && moduleRegistration.module.xDestroy) {
|
|
375
|
+
log(`Calling xDestroy for VTab %s.%s via module %s`, schemaName, tableName, tableSchema.vtabModuleName);
|
|
376
|
+
destroyPromise = moduleRegistration.module.xDestroy(
|
|
377
|
+
this.db,
|
|
378
|
+
moduleRegistration.auxData,
|
|
379
|
+
tableSchema.vtabModuleName,
|
|
380
|
+
schemaName,
|
|
381
|
+
tableName
|
|
382
|
+
).catch(err => {
|
|
383
|
+
errorLog(`Error during VTab module xDestroy for %s.%s: %O`, schemaName, tableName, err);
|
|
384
|
+
// Potentially re-throw or handle as a critical error if xDestroy failure is problematic
|
|
385
|
+
});
|
|
386
|
+
} else {
|
|
387
|
+
warnLog(`VTab module %s (for table %s.%s) or its xDestroy method not found during dropTable.`, tableSchema.vtabModuleName, schemaName, tableName);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
// Remove from schema map immediately
|
|
392
|
+
const removed = schema.removeTable(tableName);
|
|
393
|
+
if (!removed && !ifExists) {
|
|
394
|
+
// This should ideally not be reached if tableSchema was found above.
|
|
395
|
+
// But as a safeguard if removeTable could fail for other reasons.
|
|
396
|
+
throw new QuereusError(`Failed to remove table ${tableName} from schema ${schemaName}, though it was initially found.`, StatusCode.INTERNAL);
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
// Notify schema change listeners if table was removed
|
|
400
|
+
if (removed) {
|
|
401
|
+
this.changeNotifier.notifyChange({
|
|
402
|
+
type: 'table_removed',
|
|
403
|
+
schemaName: schemaName,
|
|
404
|
+
objectName: tableName,
|
|
405
|
+
oldObject: tableSchema
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
// Process destruction asynchronously
|
|
410
|
+
if (destroyPromise) {
|
|
411
|
+
void destroyPromise.then(() => log(`xDestroy completed for VTab %s.%s`, schemaName, tableName));
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
return removed; // True if removed from schema, false if not found and ifExists was true.
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/**
|
|
418
|
+
* Drops a view from the specified schema
|
|
419
|
+
*
|
|
420
|
+
* @param schemaName The name of the schema
|
|
421
|
+
* @param viewName The name of the view to drop
|
|
422
|
+
* @returns True if the view was found and dropped, false otherwise
|
|
423
|
+
*/
|
|
424
|
+
dropView(schemaName: string, viewName: string): boolean {
|
|
425
|
+
const schema = this.schemas.get(schemaName);
|
|
426
|
+
if (!schema) return false;
|
|
427
|
+
return schema.removeView(viewName);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
/**
|
|
431
|
+
* Clears all schema items (tables, functions, views)
|
|
432
|
+
*/
|
|
433
|
+
clearAll(): void {
|
|
434
|
+
this.schemas.forEach(schema => {
|
|
435
|
+
schema.clearTables();
|
|
436
|
+
schema.clearFunctions();
|
|
437
|
+
schema.clearViews();
|
|
438
|
+
});
|
|
439
|
+
log("Cleared all schemas.");
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
/**
|
|
443
|
+
* Retrieves a schema object, throwing if it doesn't exist
|
|
444
|
+
*
|
|
445
|
+
* @param name Schema name ('main', 'temp', or custom). Case-insensitive
|
|
446
|
+
* @returns The Schema object
|
|
447
|
+
* @throws QuereusError if the schema does not exist
|
|
448
|
+
*/
|
|
449
|
+
getSchemaOrFail(name: string): Schema {
|
|
450
|
+
const schema = this.schemas.get(name.toLowerCase());
|
|
451
|
+
if (!schema) {
|
|
452
|
+
throw new QuereusError(`Schema not found: ${name}`);
|
|
453
|
+
}
|
|
454
|
+
return schema;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
/**
|
|
458
|
+
* Retrieves a table from the specified schema
|
|
459
|
+
*
|
|
460
|
+
* @param schemaName The name of the schema ('main', 'temp', etc.). Defaults to current schema
|
|
461
|
+
* @param tableName The name of the table
|
|
462
|
+
* @returns The TableSchema or undefined if not found
|
|
463
|
+
*/
|
|
464
|
+
getTable(schemaName: string | undefined, tableName: string): TableSchema | undefined {
|
|
465
|
+
const targetSchemaName = schemaName ?? this.currentSchemaName;
|
|
466
|
+
const schema = this.schemas.get(targetSchemaName);
|
|
467
|
+
return schema?.getTable(tableName);
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/**
|
|
471
|
+
* Creates a new index on an existing table based on an AST.CreateIndexStmt.
|
|
472
|
+
* This method validates the index definition and calls the virtual table's xCreateIndex method.
|
|
473
|
+
*
|
|
474
|
+
* @param stmt The AST node for the CREATE INDEX statement.
|
|
475
|
+
* @returns A Promise that resolves when the index is created.
|
|
476
|
+
* @throws QuereusError on errors (e.g., table not found, column not found, xCreateIndex fails).
|
|
477
|
+
*/
|
|
478
|
+
async createIndex(stmt: AST.CreateIndexStmt): Promise<void> {
|
|
479
|
+
const targetSchemaName = stmt.table.schema || this.getCurrentSchemaName();
|
|
480
|
+
const tableName = stmt.table.name;
|
|
481
|
+
const indexName = stmt.index.name;
|
|
482
|
+
|
|
483
|
+
// Find the table schema
|
|
484
|
+
const tableSchema = this.getTable(targetSchemaName, tableName);
|
|
485
|
+
if (!tableSchema) {
|
|
486
|
+
throw new QuereusError(`no such table: ${tableName}`, StatusCode.ERROR, undefined, stmt.table.loc?.start.line, stmt.table.loc?.start.column);
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
// Check if the virtual table module supports xCreateIndex
|
|
490
|
+
if (!tableSchema.vtabModule.xCreateIndex) {
|
|
491
|
+
throw new QuereusError(`Virtual table module '${tableSchema.vtabModuleName}' for table '${tableName}' does not support CREATE INDEX.`, StatusCode.ERROR, undefined, stmt.table.loc?.start.line, stmt.table.loc?.start.column);
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
// Check if index already exists (if not IF NOT EXISTS)
|
|
495
|
+
const existingIndex = tableSchema.indexes?.find(idx => idx.name.toLowerCase() === indexName.toLowerCase());
|
|
496
|
+
if (existingIndex) {
|
|
497
|
+
if (stmt.ifNotExists) {
|
|
498
|
+
log(`Skipping CREATE INDEX: Index %s.%s already exists (IF NOT EXISTS).`, targetSchemaName, indexName);
|
|
499
|
+
return;
|
|
500
|
+
} else {
|
|
501
|
+
throw new QuereusError(`Index ${indexName} already exists on table ${tableName}`, StatusCode.CONSTRAINT, undefined, stmt.index.loc?.start.line, stmt.index.loc?.start.column);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
// Convert AST columns to IndexSchema columns
|
|
506
|
+
const indexColumns = stmt.columns.map((indexedCol: AST.IndexedColumn) => {
|
|
507
|
+
if (indexedCol.expr) {
|
|
508
|
+
throw new QuereusError(`Indices on expressions are not supported yet.`, StatusCode.ERROR, undefined, indexedCol.expr.loc?.start.line, indexedCol.expr.loc?.start.column);
|
|
509
|
+
}
|
|
510
|
+
const colName = indexedCol.name;
|
|
511
|
+
if (!colName) {
|
|
512
|
+
// Should not happen if expr is checked first
|
|
513
|
+
throw new QuereusError(`Indexed column must be a simple column name.`, StatusCode.ERROR);
|
|
514
|
+
}
|
|
515
|
+
const tableColIndex = tableSchema.columnIndexMap.get(colName.toLowerCase());
|
|
516
|
+
if (tableColIndex === undefined) {
|
|
517
|
+
throw new QuereusError(`Column '${colName}' not found in table '${tableName}'`, StatusCode.ERROR, undefined, stmt.loc?.start.line, stmt.loc?.start.column);
|
|
518
|
+
}
|
|
519
|
+
const tableColSchema = tableSchema.columns[tableColIndex];
|
|
520
|
+
return {
|
|
521
|
+
index: tableColIndex,
|
|
522
|
+
desc: indexedCol.direction === 'desc',
|
|
523
|
+
collation: indexedCol.collation || tableColSchema.collation // Use specified collation or inherit from table column
|
|
524
|
+
};
|
|
525
|
+
});
|
|
526
|
+
|
|
527
|
+
// Construct the IndexSchema object
|
|
528
|
+
const indexSchema: IndexSchema = {
|
|
529
|
+
name: indexName,
|
|
530
|
+
columns: Object.freeze(indexColumns),
|
|
531
|
+
};
|
|
532
|
+
|
|
533
|
+
try {
|
|
534
|
+
// Call xCreateIndex on the virtual table module
|
|
535
|
+
await tableSchema.vtabModule.xCreateIndex(
|
|
536
|
+
this.db,
|
|
537
|
+
targetSchemaName,
|
|
538
|
+
tableName,
|
|
539
|
+
indexSchema
|
|
540
|
+
);
|
|
541
|
+
|
|
542
|
+
// Update the table schema with the new index by creating a new schema object
|
|
543
|
+
const updatedIndexes = [...(tableSchema.indexes || []), indexSchema];
|
|
544
|
+
const updatedTableSchema: TableSchema = {
|
|
545
|
+
...tableSchema,
|
|
546
|
+
indexes: Object.freeze(updatedIndexes),
|
|
547
|
+
};
|
|
548
|
+
|
|
549
|
+
// Replace the table schema in the schema
|
|
550
|
+
const schema = this.getSchemaOrFail(targetSchemaName);
|
|
551
|
+
schema.addTable(updatedTableSchema);
|
|
552
|
+
|
|
553
|
+
// Notify schema change listeners that the table was modified
|
|
554
|
+
this.changeNotifier.notifyChange({
|
|
555
|
+
type: 'table_modified',
|
|
556
|
+
schemaName: targetSchemaName,
|
|
557
|
+
objectName: tableName,
|
|
558
|
+
oldObject: tableSchema,
|
|
559
|
+
newObject: updatedTableSchema
|
|
560
|
+
});
|
|
561
|
+
|
|
562
|
+
log(`Successfully created index %s on table %s.%s`, indexName, targetSchemaName, tableName);
|
|
563
|
+
} catch (e: unknown) {
|
|
564
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
565
|
+
const code = e instanceof QuereusError ? e.code : StatusCode.ERROR;
|
|
566
|
+
throw new QuereusError(`xCreateIndex failed for index '${indexName}' on table '${tableName}': ${message}`, code, e instanceof Error ? e : undefined, stmt.loc?.start.line, stmt.loc?.start.column);
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
/**
|
|
571
|
+
* Defines a new table in the schema based on an AST.CreateTableStmt.
|
|
572
|
+
* This method encapsulates the logic for interacting with VTab modules (xCreate)
|
|
573
|
+
* and registering the new table schema.
|
|
574
|
+
*
|
|
575
|
+
* @param stmt The AST node for the CREATE TABLE statement.
|
|
576
|
+
* @returns A Promise that resolves to the created TableSchema.
|
|
577
|
+
* @throws QuereusError on errors (e.g., module not found, xCreate fails, table exists).
|
|
578
|
+
*/
|
|
579
|
+
async createTable(stmt: AST.CreateTableStmt): Promise<TableSchema> {
|
|
580
|
+
const targetSchemaName = stmt.table.schema || this.getCurrentSchemaName();
|
|
581
|
+
const tableName = stmt.table.name;
|
|
582
|
+
let moduleName: string;
|
|
583
|
+
let effectiveModuleArgs: Record<string, SqlValue>;
|
|
584
|
+
|
|
585
|
+
if (stmt.moduleName) {
|
|
586
|
+
moduleName = stmt.moduleName;
|
|
587
|
+
effectiveModuleArgs = Object.freeze(stmt.moduleArgs || {});
|
|
588
|
+
} else {
|
|
589
|
+
const defaultVtab = this.getDefaultVTabModule();
|
|
590
|
+
moduleName = defaultVtab.name;
|
|
591
|
+
effectiveModuleArgs = Object.freeze(defaultVtab.args || {});
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
const moduleInfo = this.getModule(moduleName);
|
|
595
|
+
if (!moduleInfo || !moduleInfo.module) {
|
|
596
|
+
throw new QuereusError(`No virtual table module named '${moduleName}'`, StatusCode.ERROR, undefined, stmt.loc?.start.line, stmt.loc?.start.column);
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
const astColumnsToProcess = stmt.columns || [];
|
|
600
|
+
const astConstraintsToProcess = stmt.constraints;
|
|
601
|
+
|
|
602
|
+
// Get default nullability setting from database options
|
|
603
|
+
const defaultNullability = this.db.options.getStringOption('default_column_nullability');
|
|
604
|
+
const defaultNotNull = defaultNullability === 'not_null';
|
|
605
|
+
|
|
606
|
+
const preliminaryColumnSchemas: ColumnSchema[] = astColumnsToProcess.map(colDef => columnDefToSchema(colDef, defaultNotNull));
|
|
607
|
+
const pkDefinition = findPKDefinition(preliminaryColumnSchemas, astConstraintsToProcess);
|
|
608
|
+
|
|
609
|
+
const finalColumnSchemas = preliminaryColumnSchemas.map((col, idx) => {
|
|
610
|
+
const isPkColumn = pkDefinition.some(pkCol => pkCol.index === idx);
|
|
611
|
+
let pkOrder = 0;
|
|
612
|
+
if (isPkColumn) {
|
|
613
|
+
pkOrder = pkDefinition.findIndex(pkC => pkC.index === idx) + 1;
|
|
614
|
+
}
|
|
615
|
+
return {
|
|
616
|
+
...col,
|
|
617
|
+
primaryKey: isPkColumn,
|
|
618
|
+
pkOrder: pkOrder,
|
|
619
|
+
notNull: isPkColumn ? true : col.notNull,
|
|
620
|
+
};
|
|
621
|
+
});
|
|
622
|
+
|
|
623
|
+
const checkConstraintsSchema: RowConstraintSchema[] = [];
|
|
624
|
+
astColumnsToProcess.forEach(colDef => {
|
|
625
|
+
colDef.constraints?.forEach(con => {
|
|
626
|
+
if (con.type === 'check' && con.expr) {
|
|
627
|
+
checkConstraintsSchema.push({
|
|
628
|
+
name: con.name ?? `_check_${colDef.name}`,
|
|
629
|
+
expr: con.expr,
|
|
630
|
+
operations: opsToMask(con.operations),
|
|
631
|
+
deferrable: con.deferrable,
|
|
632
|
+
initiallyDeferred: con.initiallyDeferred
|
|
633
|
+
});
|
|
634
|
+
}
|
|
635
|
+
});
|
|
636
|
+
});
|
|
637
|
+
(astConstraintsToProcess || []).forEach(con => {
|
|
638
|
+
if (con.type === 'check' && con.expr) {
|
|
639
|
+
checkConstraintsSchema.push({
|
|
640
|
+
name: con.name,
|
|
641
|
+
expr: con.expr,
|
|
642
|
+
operations: opsToMask(con.operations),
|
|
643
|
+
deferrable: con.deferrable,
|
|
644
|
+
initiallyDeferred: con.initiallyDeferred
|
|
645
|
+
});
|
|
646
|
+
}
|
|
647
|
+
});
|
|
648
|
+
|
|
649
|
+
// Process mutation context definitions if present
|
|
650
|
+
const mutationContextSchemas = stmt.contextDefinitions
|
|
651
|
+
? stmt.contextDefinitions.map(varDef => mutationContextVarToSchema(varDef, defaultNotNull))
|
|
652
|
+
: undefined;
|
|
653
|
+
|
|
654
|
+
const baseTableSchema: TableSchema = {
|
|
655
|
+
name: tableName,
|
|
656
|
+
schemaName: targetSchemaName,
|
|
657
|
+
columns: Object.freeze(finalColumnSchemas),
|
|
658
|
+
columnIndexMap: buildColumnIndexMap(finalColumnSchemas),
|
|
659
|
+
primaryKeyDefinition: pkDefinition,
|
|
660
|
+
checkConstraints: Object.freeze(checkConstraintsSchema),
|
|
661
|
+
isTemporary: !!stmt.isTemporary,
|
|
662
|
+
isView: false,
|
|
663
|
+
vtabModuleName: moduleName,
|
|
664
|
+
vtabArgs: effectiveModuleArgs,
|
|
665
|
+
vtabModule: moduleInfo.module,
|
|
666
|
+
vtabAuxData: moduleInfo.auxData,
|
|
667
|
+
estimatedRows: 0,
|
|
668
|
+
mutationContext: mutationContextSchemas ? Object.freeze(mutationContextSchemas) : undefined,
|
|
669
|
+
};
|
|
670
|
+
|
|
671
|
+
let tableInstance: VirtualTable;
|
|
672
|
+
try {
|
|
673
|
+
tableInstance = moduleInfo.module.xCreate(
|
|
674
|
+
this.db,
|
|
675
|
+
baseTableSchema
|
|
676
|
+
);
|
|
677
|
+
} catch (e: unknown) {
|
|
678
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
679
|
+
const code = e instanceof QuereusError ? e.code : StatusCode.ERROR;
|
|
680
|
+
throw new QuereusError(`Module '${moduleName}' xCreate failed for table '${tableName}': ${message}`, code, e instanceof Error ? e : undefined, stmt.loc?.start.line, stmt.loc?.start.column);
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
const schema = this.getSchema(targetSchemaName);
|
|
684
|
+
if (!schema) {
|
|
685
|
+
throw new QuereusError(`Internal error: Schema '${targetSchemaName}' not found.`, StatusCode.INTERNAL);
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
const finalRegisteredSchema = tableInstance.tableSchema;
|
|
689
|
+
if (!finalRegisteredSchema) {
|
|
690
|
+
throw new QuereusError(`Module '${moduleName}' xCreate did not provide a tableSchema for '${tableName}'.`, StatusCode.INTERNAL);
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
// Create a properly typed schema object instead of mutating properties
|
|
694
|
+
let correctedSchema = finalRegisteredSchema;
|
|
695
|
+
if (finalRegisteredSchema.name.toLowerCase() !== tableName.toLowerCase() ||
|
|
696
|
+
finalRegisteredSchema.schemaName.toLowerCase() !== targetSchemaName.toLowerCase()) {
|
|
697
|
+
warnLog(`Module ${moduleName} returned schema for ${finalRegisteredSchema.schemaName}.${finalRegisteredSchema.name} but expected ${targetSchemaName}.${tableName}. Correcting name/schemaName.`);
|
|
698
|
+
correctedSchema = {
|
|
699
|
+
...finalRegisteredSchema,
|
|
700
|
+
name: tableName,
|
|
701
|
+
schemaName: targetSchemaName,
|
|
702
|
+
};
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
// Ensure all required properties are properly set
|
|
706
|
+
const completeTableSchema: TableSchema = {
|
|
707
|
+
...correctedSchema,
|
|
708
|
+
vtabModuleName: moduleName,
|
|
709
|
+
vtabArgs: effectiveModuleArgs,
|
|
710
|
+
vtabModule: moduleInfo.module,
|
|
711
|
+
vtabAuxData: moduleInfo.auxData,
|
|
712
|
+
estimatedRows: correctedSchema.estimatedRows ?? 0,
|
|
713
|
+
};
|
|
714
|
+
|
|
715
|
+
const existingTable = schema.getTable(tableName);
|
|
716
|
+
const existingView = schema.getView(tableName);
|
|
717
|
+
|
|
718
|
+
if (existingTable || existingView) {
|
|
719
|
+
if (stmt.ifNotExists) {
|
|
720
|
+
log(`Skipping CREATE TABLE: Item %s.%s already exists (IF NOT EXISTS).`, targetSchemaName, tableName);
|
|
721
|
+
if (existingTable) return existingTable;
|
|
722
|
+
throw new QuereusError(`Cannot CREATE TABLE ${targetSchemaName}.${tableName}: a VIEW with the same name already exists.`, StatusCode.CONSTRAINT, undefined, stmt.table.loc?.start.line, stmt.table.loc?.start.column);
|
|
723
|
+
} else {
|
|
724
|
+
const itemType = existingTable ? 'Table' : 'View';
|
|
725
|
+
throw new QuereusError(`${itemType} ${targetSchemaName}.${tableName} already exists`, StatusCode.CONSTRAINT, undefined, stmt.table.loc?.start.line, stmt.table.loc?.start.column);
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
schema.addTable(completeTableSchema);
|
|
730
|
+
log(`Successfully created table %s.%s using module %s`, targetSchemaName, tableName, moduleName);
|
|
731
|
+
|
|
732
|
+
// Notify schema change listeners
|
|
733
|
+
this.changeNotifier.notifyChange({
|
|
734
|
+
type: 'table_added',
|
|
735
|
+
schemaName: targetSchemaName,
|
|
736
|
+
objectName: tableName,
|
|
737
|
+
newObject: completeTableSchema
|
|
738
|
+
});
|
|
739
|
+
|
|
740
|
+
return completeTableSchema;
|
|
741
|
+
}
|
|
742
|
+
}
|