@quereus/quereus 0.16.4 → 0.17.1
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 +372 -345
- package/dist/src/common/errors.d.ts +2 -18
- package/dist/src/common/errors.d.ts.map +1 -1
- package/dist/src/common/errors.js +6 -29
- package/dist/src/common/errors.js.map +1 -1
- package/dist/src/common/types.d.ts +8 -0
- package/dist/src/common/types.d.ts.map +1 -1
- package/dist/src/common/types.js +20 -0
- package/dist/src/common/types.js.map +1 -1
- package/dist/src/core/database-assertions.d.ts +19 -2
- package/dist/src/core/database-assertions.d.ts.map +1 -1
- package/dist/src/core/database-assertions.js +113 -32
- package/dist/src/core/database-assertions.js.map +1 -1
- package/dist/src/core/database-events.d.ts +17 -0
- package/dist/src/core/database-events.d.ts.map +1 -1
- package/dist/src/core/database-events.js +39 -2
- package/dist/src/core/database-events.js.map +1 -1
- package/dist/src/core/database-transaction.d.ts +31 -4
- package/dist/src/core/database-transaction.d.ts.map +1 -1
- package/dist/src/core/database-transaction.js +68 -2
- package/dist/src/core/database-transaction.js.map +1 -1
- package/dist/src/core/database.d.ts +17 -4
- package/dist/src/core/database.d.ts.map +1 -1
- package/dist/src/core/database.js +189 -154
- package/dist/src/core/database.js.map +1 -1
- package/dist/src/core/statement.d.ts +8 -2
- package/dist/src/core/statement.d.ts.map +1 -1
- package/dist/src/core/statement.js +54 -71
- package/dist/src/core/statement.js.map +1 -1
- package/dist/src/emit/ast-stringify.d.ts +1 -0
- package/dist/src/emit/ast-stringify.d.ts.map +1 -1
- package/dist/src/emit/ast-stringify.js +12 -2
- package/dist/src/emit/ast-stringify.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 +75 -0
- package/dist/src/func/builtins/builtin-window-functions.js.map +1 -1
- package/dist/src/func/builtins/conversion.js +9 -12
- package/dist/src/func/builtins/conversion.js.map +1 -1
- package/dist/src/func/builtins/datetime.d.ts +21 -0
- package/dist/src/func/builtins/datetime.d.ts.map +1 -1
- package/dist/src/func/builtins/datetime.js +452 -368
- package/dist/src/func/builtins/datetime.js.map +1 -1
- package/dist/src/func/builtins/explain.d.ts.map +1 -1
- package/dist/src/func/builtins/explain.js +15 -3
- 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 -12
- package/dist/src/func/builtins/index.js.map +1 -1
- package/dist/src/func/builtins/json-helpers.js +1 -1
- package/dist/src/func/builtins/json-helpers.js.map +1 -1
- package/dist/src/func/builtins/json.d.ts.map +1 -1
- package/dist/src/func/builtins/json.js +2 -5
- 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 +30 -32
- package/dist/src/func/builtins/schema.js.map +1 -1
- package/dist/src/func/builtins/string.d.ts.map +1 -1
- package/dist/src/func/builtins/string.js +40 -64
- package/dist/src/func/builtins/string.js.map +1 -1
- package/dist/src/func/builtins/timespan.d.ts.map +1 -1
- package/dist/src/func/builtins/timespan.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 +9 -2
- package/dist/src/parser/ast.d.ts.map +1 -1
- package/dist/src/parser/lexer.d.ts +1 -0
- package/dist/src/parser/lexer.d.ts.map +1 -1
- package/dist/src/parser/lexer.js +3 -0
- package/dist/src/parser/lexer.js.map +1 -1
- package/dist/src/parser/parser.d.ts +11 -1
- package/dist/src/parser/parser.d.ts.map +1 -1
- package/dist/src/parser/parser.js +75 -135
- package/dist/src/parser/parser.js.map +1 -1
- package/dist/src/planner/analysis/const-evaluator.d.ts.map +1 -1
- package/dist/src/planner/analysis/const-evaluator.js +6 -3
- package/dist/src/planner/analysis/const-evaluator.js.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.d.ts +2 -1
- package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.js +154 -22
- package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
- package/dist/src/planner/building/alter-table.d.ts.map +1 -1
- package/dist/src/planner/building/alter-table.js +18 -1
- package/dist/src/planner/building/alter-table.js.map +1 -1
- package/dist/src/planner/building/analyze.d.ts +5 -0
- package/dist/src/planner/building/analyze.d.ts.map +1 -0
- package/dist/src/planner/building/analyze.js +5 -0
- package/dist/src/planner/building/analyze.js.map +1 -0
- package/dist/src/planner/building/block.d.ts.map +1 -1
- package/dist/src/planner/building/block.js +3 -0
- package/dist/src/planner/building/block.js.map +1 -1
- package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
- package/dist/src/planner/building/constraint-builder.js +25 -3
- package/dist/src/planner/building/constraint-builder.js.map +1 -1
- package/dist/src/planner/building/delete.d.ts.map +1 -1
- package/dist/src/planner/building/delete.js +11 -0
- package/dist/src/planner/building/delete.js.map +1 -1
- package/dist/src/planner/building/drop-assertion.d.ts.map +1 -1
- package/dist/src/planner/building/drop-assertion.js +2 -1
- package/dist/src/planner/building/drop-assertion.js.map +1 -1
- package/dist/src/planner/building/expression.d.ts.map +1 -1
- package/dist/src/planner/building/expression.js +55 -7
- package/dist/src/planner/building/expression.js.map +1 -1
- package/dist/src/planner/building/foreign-key-builder.d.ts +16 -0
- package/dist/src/planner/building/foreign-key-builder.d.ts.map +1 -0
- package/dist/src/planner/building/foreign-key-builder.js +269 -0
- package/dist/src/planner/building/foreign-key-builder.js.map +1 -0
- package/dist/src/planner/building/function-call.d.ts.map +1 -1
- package/dist/src/planner/building/function-call.js +3 -2
- 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 +91 -10
- package/dist/src/planner/building/insert.js.map +1 -1
- package/dist/src/planner/building/schema-resolution.d.ts +4 -0
- package/dist/src/planner/building/schema-resolution.d.ts.map +1 -1
- package/dist/src/planner/building/schema-resolution.js +14 -3
- package/dist/src/planner/building/schema-resolution.js.map +1 -1
- package/dist/src/planner/building/select-aggregates.d.ts +1 -0
- package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
- package/dist/src/planner/building/select-aggregates.js +118 -3
- package/dist/src/planner/building/select-aggregates.js.map +1 -1
- package/dist/src/planner/building/select-modifiers.js +3 -3
- package/dist/src/planner/building/select-modifiers.js.map +1 -1
- package/dist/src/planner/building/select-window.js +9 -8
- package/dist/src/planner/building/select-window.js.map +1 -1
- package/dist/src/planner/building/select.d.ts.map +1 -1
- package/dist/src/planner/building/select.js +21 -10
- package/dist/src/planner/building/select.js.map +1 -1
- package/dist/src/planner/building/table.d.ts.map +1 -1
- package/dist/src/planner/building/table.js +5 -3
- 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 +30 -1
- package/dist/src/planner/building/update.js.map +1 -1
- package/dist/src/planner/building/with.js +1 -1
- package/dist/src/planner/building/with.js.map +1 -1
- package/dist/src/planner/cache/reference-graph.d.ts +1 -1
- package/dist/src/planner/cache/reference-graph.js +1 -1
- package/dist/src/planner/cost/index.d.ts +10 -3
- package/dist/src/planner/cost/index.d.ts.map +1 -1
- package/dist/src/planner/cost/index.js +17 -3
- package/dist/src/planner/cost/index.js.map +1 -1
- package/dist/src/planner/debug.js +1 -1
- package/dist/src/planner/debug.js.map +1 -1
- package/dist/src/planner/framework/characteristics.d.ts +1 -1
- package/dist/src/planner/framework/characteristics.d.ts.map +1 -1
- package/dist/src/planner/framework/pass.d.ts +3 -1
- package/dist/src/planner/framework/pass.d.ts.map +1 -1
- package/dist/src/planner/framework/pass.js +62 -18
- package/dist/src/planner/framework/pass.js.map +1 -1
- package/dist/src/planner/framework/physical-utils.d.ts +5 -0
- package/dist/src/planner/framework/physical-utils.d.ts.map +1 -1
- package/dist/src/planner/framework/physical-utils.js +19 -0
- package/dist/src/planner/framework/physical-utils.js.map +1 -1
- package/dist/src/planner/framework/trace.d.ts.map +1 -1
- package/dist/src/planner/framework/trace.js +3 -2
- package/dist/src/planner/framework/trace.js.map +1 -1
- package/dist/src/planner/nodes/alias-node.d.ts +2 -1
- package/dist/src/planner/nodes/alias-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/alias-node.js +8 -0
- package/dist/src/planner/nodes/alias-node.js.map +1 -1
- package/dist/src/planner/nodes/alter-table-node.d.ts +42 -0
- package/dist/src/planner/nodes/alter-table-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/alter-table-node.js +55 -0
- package/dist/src/planner/nodes/alter-table-node.js.map +1 -0
- package/dist/src/planner/nodes/analyze-node.d.ts +25 -0
- package/dist/src/planner/nodes/analyze-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/analyze-node.js +83 -0
- package/dist/src/planner/nodes/analyze-node.js.map +1 -0
- package/dist/src/planner/nodes/bloom-join-node.d.ts +66 -0
- package/dist/src/planner/nodes/bloom-join-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/bloom-join-node.js +200 -0
- package/dist/src/planner/nodes/bloom-join-node.js.map +1 -0
- package/dist/src/planner/nodes/constraint-check-node.d.ts +1 -1
- package/dist/src/planner/nodes/constraint-check-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/cte-reference-node.js +7 -7
- package/dist/src/planner/nodes/cte-reference-node.js.map +1 -1
- package/dist/src/planner/nodes/join-node.d.ts +9 -1
- package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-node.js +69 -79
- package/dist/src/planner/nodes/join-node.js.map +1 -1
- package/dist/src/planner/nodes/merge-join-node.d.ts +60 -0
- package/dist/src/planner/nodes/merge-join-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/merge-join-node.js +207 -0
- package/dist/src/planner/nodes/merge-join-node.js.map +1 -0
- package/dist/src/planner/nodes/plan-node-type.d.ts +1 -0
- package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.js +1 -0
- package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
- package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/project-node.js +3 -2
- package/dist/src/planner/nodes/project-node.js.map +1 -1
- package/dist/src/planner/nodes/reference.d.ts +2 -1
- package/dist/src/planner/nodes/reference.d.ts.map +1 -1
- package/dist/src/planner/nodes/reference.js +6 -2
- package/dist/src/planner/nodes/reference.js.map +1 -1
- package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/returning-node.js +3 -2
- package/dist/src/planner/nodes/returning-node.js.map +1 -1
- package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
- package/dist/src/planner/nodes/subquery.js.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.js +1 -1
- package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
- package/dist/src/planner/nodes/update-node.d.ts +2 -0
- package/dist/src/planner/nodes/update-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/update-node.js +2 -1
- package/dist/src/planner/nodes/update-node.js.map +1 -1
- package/dist/src/planner/nodes/window-function.d.ts.map +1 -1
- package/dist/src/planner/nodes/window-function.js +7 -7
- package/dist/src/planner/nodes/window-function.js.map +1 -1
- package/dist/src/planner/nodes/window-node.d.ts +2 -2
- package/dist/src/planner/nodes/window-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/window-node.js +9 -14
- package/dist/src/planner/nodes/window-node.js.map +1 -1
- package/dist/src/planner/optimizer.d.ts.map +1 -1
- package/dist/src/planner/optimizer.js +40 -2
- package/dist/src/planner/optimizer.js.map +1 -1
- package/dist/src/planner/planning-context.d.ts.map +1 -1
- package/dist/src/planner/planning-context.js +1 -6
- package/dist/src/planner/planning-context.js.map +1 -1
- package/dist/src/planner/resolve.d.ts.map +1 -1
- package/dist/src/planner/resolve.js.map +1 -1
- package/dist/src/planner/rules/access/rule-select-access-path.js +157 -28
- 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.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js +27 -6
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js.map +1 -1
- package/dist/src/planner/rules/cache/rule-in-subquery-cache.d.ts +19 -0
- package/dist/src/planner/rules/cache/rule-in-subquery-cache.d.ts.map +1 -0
- package/dist/src/planner/rules/cache/rule-in-subquery-cache.js +53 -0
- package/dist/src/planner/rules/cache/rule-in-subquery-cache.js.map +1 -0
- 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 +5 -0
- package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.js.map +1 -1
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.d.ts +18 -0
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.d.ts.map +1 -0
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.js +37 -0
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.js.map +1 -0
- package/dist/src/planner/rules/join/rule-join-key-inference.d.ts +8 -3
- package/dist/src/planner/rules/join/rule-join-key-inference.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-join-key-inference.js +28 -17
- package/dist/src/planner/rules/join/rule-join-key-inference.js.map +1 -1
- package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts +16 -0
- package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-join-physical-selection.js +216 -0
- package/dist/src/planner/rules/join/rule-join-physical-selection.js.map +1 -0
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts.map +1 -1
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js +34 -4
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +1 -1
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts +23 -0
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts.map +1 -0
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js +293 -0
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js.map +1 -0
- package/dist/src/planner/scopes/multi.d.ts +3 -2
- package/dist/src/planner/scopes/multi.d.ts.map +1 -1
- package/dist/src/planner/scopes/multi.js +32 -7
- package/dist/src/planner/scopes/multi.js.map +1 -1
- package/dist/src/planner/scopes/shadow.d.ts +20 -0
- package/dist/src/planner/scopes/shadow.d.ts.map +1 -0
- package/dist/src/planner/scopes/shadow.js +31 -0
- package/dist/src/planner/scopes/shadow.js.map +1 -0
- package/dist/src/planner/stats/analyze.d.ts +17 -0
- package/dist/src/planner/stats/analyze.d.ts.map +1 -0
- package/dist/src/planner/stats/analyze.js +114 -0
- package/dist/src/planner/stats/analyze.js.map +1 -0
- package/dist/src/planner/stats/catalog-stats.d.ts +80 -0
- package/dist/src/planner/stats/catalog-stats.d.ts.map +1 -0
- package/dist/src/planner/stats/catalog-stats.js +248 -0
- package/dist/src/planner/stats/catalog-stats.js.map +1 -0
- package/dist/src/planner/stats/histogram.d.ts +24 -0
- package/dist/src/planner/stats/histogram.d.ts.map +1 -0
- package/dist/src/planner/stats/histogram.js +142 -0
- package/dist/src/planner/stats/histogram.js.map +1 -0
- package/dist/src/planner/type-utils.d.ts.map +1 -1
- package/dist/src/planner/type-utils.js +8 -2
- package/dist/src/planner/type-utils.js.map +1 -1
- package/dist/src/planner/util/key-utils.d.ts +48 -2
- package/dist/src/planner/util/key-utils.d.ts.map +1 -1
- package/dist/src/planner/util/key-utils.js +123 -0
- package/dist/src/planner/util/key-utils.js.map +1 -1
- package/dist/src/planner/validation/determinism-validator.d.ts +9 -0
- package/dist/src/planner/validation/determinism-validator.d.ts.map +1 -1
- package/dist/src/planner/validation/determinism-validator.js +11 -0
- package/dist/src/planner/validation/determinism-validator.js.map +1 -1
- 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/context-helpers.d.ts +34 -10
- package/dist/src/runtime/context-helpers.d.ts.map +1 -1
- package/dist/src/runtime/context-helpers.js +115 -39
- package/dist/src/runtime/context-helpers.js.map +1 -1
- package/dist/src/runtime/deferred-constraint-queue.d.ts +0 -1
- package/dist/src/runtime/deferred-constraint-queue.d.ts.map +1 -1
- package/dist/src/runtime/deferred-constraint-queue.js +10 -23
- package/dist/src/runtime/deferred-constraint-queue.js.map +1 -1
- package/dist/src/runtime/descriptor-helpers.d.ts +7 -0
- package/dist/src/runtime/descriptor-helpers.d.ts.map +1 -0
- package/dist/src/runtime/descriptor-helpers.js +24 -0
- package/dist/src/runtime/descriptor-helpers.js.map +1 -0
- package/dist/src/runtime/emission-context.d.ts +7 -1
- package/dist/src/runtime/emission-context.d.ts.map +1 -1
- package/dist/src/runtime/emission-context.js +16 -0
- package/dist/src/runtime/emission-context.js.map +1 -1
- package/dist/src/runtime/emit/aggregate.d.ts.map +1 -1
- package/dist/src/runtime/emit/aggregate.js +97 -93
- package/dist/src/runtime/emit/aggregate.js.map +1 -1
- package/dist/src/runtime/emit/alter-table.d.ts +5 -0
- package/dist/src/runtime/emit/alter-table.d.ts.map +1 -0
- package/dist/src/runtime/emit/alter-table.js +209 -0
- package/dist/src/runtime/emit/alter-table.js.map +1 -0
- package/dist/src/runtime/emit/analyze.d.ts +9 -0
- package/dist/src/runtime/emit/analyze.d.ts.map +1 -0
- package/dist/src/runtime/emit/analyze.js +72 -0
- package/dist/src/runtime/emit/analyze.js.map +1 -0
- package/dist/src/runtime/emit/array-index.d.ts.map +1 -1
- package/dist/src/runtime/emit/array-index.js +4 -2
- package/dist/src/runtime/emit/array-index.js.map +1 -1
- package/dist/src/runtime/emit/between.d.ts.map +1 -1
- package/dist/src/runtime/emit/between.js +8 -20
- package/dist/src/runtime/emit/between.js.map +1 -1
- package/dist/src/runtime/emit/binary.d.ts.map +1 -1
- package/dist/src/runtime/emit/binary.js +155 -126
- package/dist/src/runtime/emit/binary.js.map +1 -1
- package/dist/src/runtime/emit/bloom-join.d.ts +12 -0
- package/dist/src/runtime/emit/bloom-join.d.ts.map +1 -0
- package/dist/src/runtime/emit/bloom-join.js +114 -0
- package/dist/src/runtime/emit/bloom-join.js.map +1 -0
- package/dist/src/runtime/emit/cache.js +2 -2
- 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 +31 -117
- 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 +2 -24
- package/dist/src/runtime/emit/constraint-check.js.map +1 -1
- package/dist/src/runtime/emit/cte-reference.d.ts.map +1 -1
- package/dist/src/runtime/emit/cte-reference.js +11 -5
- package/dist/src/runtime/emit/cte-reference.js.map +1 -1
- package/dist/src/runtime/emit/distinct.d.ts.map +1 -1
- package/dist/src/runtime/emit/distinct.js +21 -12
- 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 +5 -1
- package/dist/src/runtime/emit/dml-executor.js.map +1 -1
- package/dist/src/runtime/emit/drop-assertion.d.ts.map +1 -1
- package/dist/src/runtime/emit/drop-assertion.js +2 -0
- package/dist/src/runtime/emit/drop-assertion.js.map +1 -1
- package/dist/src/runtime/emit/filter.d.ts.map +1 -1
- package/dist/src/runtime/emit/filter.js +26 -7
- package/dist/src/runtime/emit/filter.js.map +1 -1
- package/dist/src/runtime/emit/internal-recursive-cte-ref.d.ts.map +1 -1
- package/dist/src/runtime/emit/internal-recursive-cte-ref.js +11 -5
- package/dist/src/runtime/emit/internal-recursive-cte-ref.js.map +1 -1
- package/dist/src/runtime/emit/join.d.ts +1 -1
- package/dist/src/runtime/emit/join.d.ts.map +1 -1
- package/dist/src/runtime/emit/join.js +44 -33
- package/dist/src/runtime/emit/join.js.map +1 -1
- package/dist/src/runtime/emit/merge-join.d.ts +14 -0
- package/dist/src/runtime/emit/merge-join.d.ts.map +1 -0
- package/dist/src/runtime/emit/merge-join.js +152 -0
- package/dist/src/runtime/emit/merge-join.js.map +1 -0
- package/dist/src/runtime/emit/parameter.d.ts.map +1 -1
- package/dist/src/runtime/emit/parameter.js +10 -32
- package/dist/src/runtime/emit/parameter.js.map +1 -1
- package/dist/src/runtime/emit/project.d.ts.map +1 -1
- package/dist/src/runtime/emit/project.js +22 -12
- 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 +5 -9
- package/dist/src/runtime/emit/recursive-cte.js.map +1 -1
- package/dist/src/runtime/emit/returning.d.ts.map +1 -1
- package/dist/src/runtime/emit/returning.js +14 -8
- package/dist/src/runtime/emit/returning.js.map +1 -1
- package/dist/src/runtime/emit/scan.d.ts.map +1 -1
- package/dist/src/runtime/emit/scan.js +4 -1
- package/dist/src/runtime/emit/scan.js.map +1 -1
- package/dist/src/runtime/emit/set-operation.d.ts.map +1 -1
- package/dist/src/runtime/emit/set-operation.js +8 -5
- package/dist/src/runtime/emit/set-operation.js.map +1 -1
- package/dist/src/runtime/emit/sort.js +2 -2
- package/dist/src/runtime/emit/sort.js.map +1 -1
- package/dist/src/runtime/emit/subquery.js +2 -2
- package/dist/src/runtime/emit/subquery.js.map +1 -1
- package/dist/src/runtime/emit/table-valued-function.d.ts.map +1 -1
- package/dist/src/runtime/emit/table-valued-function.js +21 -7
- package/dist/src/runtime/emit/table-valued-function.js.map +1 -1
- package/dist/src/runtime/emit/transaction.d.ts.map +1 -1
- package/dist/src/runtime/emit/transaction.js +18 -46
- package/dist/src/runtime/emit/transaction.js.map +1 -1
- package/dist/src/runtime/emit/unary.js +2 -2
- package/dist/src/runtime/emit/unary.js.map +1 -1
- package/dist/src/runtime/emit/update.d.ts.map +1 -1
- package/dist/src/runtime/emit/update.js +43 -21
- package/dist/src/runtime/emit/update.js.map +1 -1
- package/dist/src/runtime/emit/window.d.ts.map +1 -1
- package/dist/src/runtime/emit/window.js +368 -126
- package/dist/src/runtime/emit/window.js.map +1 -1
- package/dist/src/runtime/foreign-key-actions.d.ts +15 -0
- package/dist/src/runtime/foreign-key-actions.d.ts.map +1 -0
- package/dist/src/runtime/foreign-key-actions.js +109 -0
- package/dist/src/runtime/foreign-key-actions.js.map +1 -0
- package/dist/src/runtime/register.d.ts.map +1 -1
- package/dist/src/runtime/register.js +8 -0
- package/dist/src/runtime/register.js.map +1 -1
- package/dist/src/runtime/scheduler.d.ts.map +1 -1
- package/dist/src/runtime/scheduler.js +4 -1
- package/dist/src/runtime/scheduler.js.map +1 -1
- package/dist/src/runtime/types.d.ts +6 -5
- package/dist/src/runtime/types.d.ts.map +1 -1
- package/dist/src/runtime/types.js.map +1 -1
- package/dist/src/schema/change-events.d.ts +36 -8
- package/dist/src/schema/change-events.d.ts.map +1 -1
- package/dist/src/schema/change-events.js.map +1 -1
- package/dist/src/schema/column.d.ts +5 -1
- package/dist/src/schema/column.d.ts.map +1 -1
- package/dist/src/schema/column.js +1 -2
- package/dist/src/schema/column.js.map +1 -1
- package/dist/src/schema/manager.d.ts +54 -4
- package/dist/src/schema/manager.d.ts.map +1 -1
- package/dist/src/schema/manager.js +353 -313
- package/dist/src/schema/manager.js.map +1 -1
- package/dist/src/schema/schema-differ.js +3 -3
- package/dist/src/schema/schema-differ.js.map +1 -1
- package/dist/src/schema/schema.d.ts +1 -1
- package/dist/src/schema/schema.js +2 -2
- package/dist/src/schema/schema.js.map +1 -1
- package/dist/src/schema/table.d.ts +49 -0
- package/dist/src/schema/table.d.ts.map +1 -1
- package/dist/src/schema/table.js +30 -11
- package/dist/src/schema/table.js.map +1 -1
- package/dist/src/types/builtin-types.d.ts.map +1 -1
- package/dist/src/types/builtin-types.js +26 -95
- package/dist/src/types/builtin-types.js.map +1 -1
- package/dist/src/types/index.d.ts +1 -1
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/types/index.js +1 -1
- package/dist/src/types/index.js.map +1 -1
- package/dist/src/types/json-type.d.ts.map +1 -1
- package/dist/src/types/json-type.js +28 -40
- package/dist/src/types/json-type.js.map +1 -1
- package/dist/src/types/logical-type.d.ts +6 -0
- package/dist/src/types/logical-type.d.ts.map +1 -1
- package/dist/src/types/logical-type.js +12 -0
- package/dist/src/types/logical-type.js.map +1 -1
- package/dist/src/types/temporal-types.d.ts.map +1 -1
- package/dist/src/types/temporal-types.js +8 -37
- package/dist/src/types/temporal-types.js.map +1 -1
- package/dist/src/util/async-iterator.d.ts +30 -0
- package/dist/src/util/async-iterator.d.ts.map +1 -0
- package/dist/src/util/async-iterator.js +101 -0
- package/dist/src/util/async-iterator.js.map +1 -0
- package/dist/src/util/coercion.d.ts +4 -5
- package/dist/src/util/coercion.d.ts.map +1 -1
- package/dist/src/util/coercion.js +10 -14
- package/dist/src/util/coercion.js.map +1 -1
- package/dist/src/util/comparison.d.ts +34 -21
- package/dist/src/util/comparison.d.ts.map +1 -1
- package/dist/src/util/comparison.js +77 -43
- package/dist/src/util/comparison.js.map +1 -1
- package/dist/src/util/environment.d.ts +0 -8
- package/dist/src/util/environment.d.ts.map +1 -1
- package/dist/src/util/environment.js +0 -12
- package/dist/src/util/environment.js.map +1 -1
- package/dist/src/util/key-serializer.d.ts +33 -0
- package/dist/src/util/key-serializer.d.ts.map +1 -0
- package/dist/src/util/key-serializer.js +95 -0
- package/dist/src/util/key-serializer.js.map +1 -0
- package/dist/src/util/plugin-helper.d.ts.map +1 -1
- package/dist/src/util/plugin-helper.js +21 -45
- package/dist/src/util/plugin-helper.js.map +1 -1
- package/dist/src/util/serialization.d.ts +1 -0
- package/dist/src/util/serialization.d.ts.map +1 -1
- package/dist/src/util/serialization.js +8 -1
- package/dist/src/util/serialization.js.map +1 -1
- package/dist/src/util/working-table-iterable.d.ts +6 -5
- package/dist/src/util/working-table-iterable.d.ts.map +1 -1
- package/dist/src/util/working-table-iterable.js +8 -15
- package/dist/src/util/working-table-iterable.js.map +1 -1
- package/dist/src/vtab/best-access-plan.d.ts +12 -0
- package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
- package/dist/src/vtab/best-access-plan.js +22 -0
- package/dist/src/vtab/best-access-plan.js.map +1 -1
- package/dist/src/vtab/events.d.ts.map +1 -1
- package/dist/src/vtab/events.js +6 -3
- package/dist/src/vtab/events.js.map +1 -1
- package/dist/src/vtab/manifest.d.ts +3 -1
- package/dist/src/vtab/manifest.d.ts.map +1 -1
- package/dist/src/vtab/memory/index.d.ts +2 -2
- package/dist/src/vtab/memory/index.d.ts.map +1 -1
- package/dist/src/vtab/memory/index.js +4 -7
- package/dist/src/vtab/memory/index.js.map +1 -1
- package/dist/src/vtab/memory/layer/base-cursor.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/base-cursor.js +37 -9
- package/dist/src/vtab/memory/layer/base-cursor.js.map +1 -1
- package/dist/src/vtab/memory/layer/base.js +1 -1
- package/dist/src/vtab/memory/layer/base.js.map +1 -1
- package/dist/src/vtab/memory/layer/connection.d.ts +11 -7
- package/dist/src/vtab/memory/layer/connection.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/connection.js +32 -44
- package/dist/src/vtab/memory/layer/connection.js.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts +15 -3
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +85 -37
- package/dist/src/vtab/memory/layer/manager.js.map +1 -1
- package/dist/src/vtab/memory/layer/scan-plan.d.ts +2 -0
- package/dist/src/vtab/memory/layer/scan-plan.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/scan-plan.js +153 -78
- package/dist/src/vtab/memory/layer/scan-plan.js.map +1 -1
- package/dist/src/vtab/memory/layer/transaction-cursor.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/transaction-cursor.js +39 -9
- package/dist/src/vtab/memory/layer/transaction-cursor.js.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.d.ts +1 -0
- package/dist/src/vtab/memory/layer/transaction.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.js +6 -20
- package/dist/src/vtab/memory/layer/transaction.js.map +1 -1
- package/dist/src/vtab/memory/module.d.ts +14 -24
- package/dist/src/vtab/memory/module.d.ts.map +1 -1
- package/dist/src/vtab/memory/module.js +88 -283
- package/dist/src/vtab/memory/module.js.map +1 -1
- package/dist/src/vtab/memory/table.d.ts +9 -0
- package/dist/src/vtab/memory/table.d.ts.map +1 -1
- package/dist/src/vtab/memory/table.js +121 -18
- package/dist/src/vtab/memory/table.js.map +1 -1
- package/dist/src/vtab/memory/types.d.ts +1 -0
- package/dist/src/vtab/memory/types.d.ts.map +1 -1
- package/dist/src/vtab/memory/utils/primary-key.js.map +1 -1
- package/dist/src/vtab/module.d.ts +13 -0
- package/dist/src/vtab/module.d.ts.map +1 -1
- package/dist/src/vtab/table.d.ts +9 -0
- package/dist/src/vtab/table.d.ts.map +1 -1
- package/dist/src/vtab/table.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createLogger } from '../common/logger.js';
|
|
2
|
-
import { MisuseError,
|
|
2
|
+
import { MisuseError, QuereusError } from '../common/errors.js';
|
|
3
3
|
import { StatusCode } from '../common/types.js';
|
|
4
4
|
import { Statement } from './statement.js';
|
|
5
5
|
import { SchemaManager } from '../schema/manager.js';
|
|
@@ -7,11 +7,12 @@ import { BUILTIN_FUNCTIONS } from '../func/builtins/index.js';
|
|
|
7
7
|
import { createScalarFunction, createAggregateFunction } from '../func/registration.js';
|
|
8
8
|
import { FunctionFlags } from '../common/constants.js';
|
|
9
9
|
import { MemoryTableModule } from '../vtab/memory/module.js';
|
|
10
|
-
import { BINARY_COLLATION,
|
|
11
|
-
import { Parser
|
|
10
|
+
import { BINARY_COLLATION, NOCASE_COLLATION, RTRIM_COLLATION } from '../util/comparison.js';
|
|
11
|
+
import { Parser } from '../parser/parser.js';
|
|
12
12
|
import { buildBlock } from '../planner/building/block.js';
|
|
13
13
|
import { emitPlanNode } from '../runtime/emitters.js';
|
|
14
14
|
import { Scheduler } from '../runtime/scheduler.js';
|
|
15
|
+
import { RowContextMap } from '../runtime/context-helpers.js';
|
|
15
16
|
import { BuildTimeDependencyTracker } from '../planner/planning-context.js';
|
|
16
17
|
import { ParameterScope } from '../planner/scopes/param.js';
|
|
17
18
|
import { GlobalScope } from '../planner/scopes/global.js';
|
|
@@ -23,13 +24,35 @@ import { registerBuiltinWindowFunctions } from '../func/builtins/builtin-window-
|
|
|
23
24
|
import { DatabaseOptionsManager } from './database-options.js';
|
|
24
25
|
import { DeclaredSchemaManager } from '../schema/declared-schema-manager.js';
|
|
25
26
|
import { DeferredConstraintQueue } from '../runtime/deferred-constraint-queue.js';
|
|
27
|
+
import { registerType as registerTypeInRegistry } from '../types/registry.js';
|
|
26
28
|
import { getParameterTypes } from './param.js';
|
|
27
29
|
import { rowToObject } from './utils.js';
|
|
30
|
+
import { wrapAsyncIterator } from '../util/async-iterator.js';
|
|
28
31
|
import { DatabaseEventEmitter, } from './database-events.js';
|
|
29
32
|
import { TransactionManager } from './database-transaction.js';
|
|
30
33
|
import { AssertionEvaluator } from './database-assertions.js';
|
|
31
34
|
const log = createLogger('core:database');
|
|
32
35
|
const errorLog = log.extend('error');
|
|
36
|
+
/** Parse a comma-separated schema path string into an array of trimmed, non-empty names. */
|
|
37
|
+
function parseSchemaPath(pathString) {
|
|
38
|
+
if (!pathString)
|
|
39
|
+
return undefined;
|
|
40
|
+
const parts = pathString.split(',').map(s => s.trim()).filter(s => s.length > 0);
|
|
41
|
+
return parts.length > 0 ? parts : undefined;
|
|
42
|
+
}
|
|
43
|
+
/** Extract a VTableEventEmitter from a module if it supports one. */
|
|
44
|
+
function tryGetEventEmitter(module) {
|
|
45
|
+
const asSource = module;
|
|
46
|
+
if (typeof asSource.getEventEmitter !== 'function')
|
|
47
|
+
return undefined;
|
|
48
|
+
const emitter = asSource.getEventEmitter();
|
|
49
|
+
if (!emitter || typeof emitter !== 'object')
|
|
50
|
+
return undefined;
|
|
51
|
+
const typed = emitter;
|
|
52
|
+
if (typeof typed.onDataChange !== 'function' && typeof typed.onSchemaChange !== 'function')
|
|
53
|
+
return undefined;
|
|
54
|
+
return emitter;
|
|
55
|
+
}
|
|
33
56
|
/**
|
|
34
57
|
* Represents a connection to an Quereus database (in-memory in this port).
|
|
35
58
|
* Manages schema, prepared statements, virtual tables, and functions.
|
|
@@ -57,6 +80,8 @@ export class Database {
|
|
|
57
80
|
transactionManager;
|
|
58
81
|
/** Assertion evaluation */
|
|
59
82
|
assertionEvaluator;
|
|
83
|
+
/** Per-database collation registry */
|
|
84
|
+
collations = new Map();
|
|
60
85
|
constructor() {
|
|
61
86
|
this.schemaManager = new SchemaManager(this);
|
|
62
87
|
this.declaredSchemaManager = new DeclaredSchemaManager();
|
|
@@ -64,11 +89,6 @@ export class Database {
|
|
|
64
89
|
log("Database instance created.");
|
|
65
90
|
// Register built-in functions
|
|
66
91
|
this.registerBuiltinFunctions();
|
|
67
|
-
// Register default virtual table modules via SchemaManager
|
|
68
|
-
// The SchemaManager.defaultVTabModuleName is already initialized (e.g. to 'memory')
|
|
69
|
-
// No need to set defaultVtabModuleName explicitly here unless it's different from SchemaManager's init value.
|
|
70
|
-
// this.schemaManager.setDefaultVTabModuleName('memory'); // Already 'memory' by default in SchemaManager
|
|
71
|
-
// this.schemaManager.setDefaultVTabArgs([]); // Already [] by default in SchemaManager
|
|
72
92
|
this.schemaManager.registerModule('memory', new MemoryTableModule());
|
|
73
93
|
// Register built-in collations
|
|
74
94
|
this.registerDefaultCollations();
|
|
@@ -176,6 +196,12 @@ export class Database {
|
|
|
176
196
|
defaultValue: false,
|
|
177
197
|
description: 'Enable plan stack tracing',
|
|
178
198
|
});
|
|
199
|
+
this.options.registerOption('foreign_keys', {
|
|
200
|
+
type: 'boolean',
|
|
201
|
+
defaultValue: false,
|
|
202
|
+
aliases: ['fk_enforcement'],
|
|
203
|
+
description: 'Enable foreign key constraint enforcement (default off for backwards compatibility)',
|
|
204
|
+
});
|
|
179
205
|
}
|
|
180
206
|
/** @internal Registers default built-in SQL functions */
|
|
181
207
|
registerBuiltinFunctions() {
|
|
@@ -192,10 +218,10 @@ export class Database {
|
|
|
192
218
|
}
|
|
193
219
|
/** @internal Registers default collation sequences */
|
|
194
220
|
registerDefaultCollations() {
|
|
195
|
-
// Register the built-in collations
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
221
|
+
// Register the built-in collations into per-instance registry
|
|
222
|
+
this.collations.set('BINARY', BINARY_COLLATION);
|
|
223
|
+
this.collations.set('NOCASE', NOCASE_COLLATION);
|
|
224
|
+
this.collations.set('RTRIM', RTRIM_COLLATION);
|
|
199
225
|
log("Default collations registered (BINARY, NOCASE, RTRIM)");
|
|
200
226
|
}
|
|
201
227
|
/**
|
|
@@ -341,6 +367,21 @@ export class Database {
|
|
|
341
367
|
_isImplicitTransaction() {
|
|
342
368
|
return this.transactionManager.isImplicitTransaction();
|
|
343
369
|
}
|
|
370
|
+
/**
|
|
371
|
+
* Commits or rolls back an implicit transaction based on success.
|
|
372
|
+
* No-op if no implicit transaction is active.
|
|
373
|
+
* @internal
|
|
374
|
+
*/
|
|
375
|
+
async _finalizeImplicitTransaction(success) {
|
|
376
|
+
if (this.transactionManager.isImplicitTransaction()) {
|
|
377
|
+
if (success) {
|
|
378
|
+
await this._commitTransaction();
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
await this._rollbackTransaction();
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
344
385
|
/**
|
|
345
386
|
* Upgrades an implicit transaction to explicit.
|
|
346
387
|
* @internal
|
|
@@ -354,18 +395,26 @@ export class Database {
|
|
|
354
395
|
* Used as the innermost execution primitive.
|
|
355
396
|
*/
|
|
356
397
|
async _executeSingleStatement(statementAst, params) {
|
|
357
|
-
const plan = this._buildPlan([statementAst], params);
|
|
398
|
+
const { plan } = this._buildPlan([statementAst], params);
|
|
358
399
|
if (plan.statements.length === 0)
|
|
359
400
|
return; // No-op for this AST
|
|
360
401
|
const optimizedPlan = this.optimizer.optimize(plan, this);
|
|
361
402
|
const emissionContext = new EmissionContext(this);
|
|
362
403
|
const rootInstruction = emitPlanNode(optimizedPlan, emissionContext);
|
|
363
404
|
const scheduler = new Scheduler(rootInstruction);
|
|
405
|
+
// Normalize array params to a record keyed by 1-based index, matching Statement.bindAll
|
|
406
|
+
let boundArgs = {};
|
|
407
|
+
if (Array.isArray(params)) {
|
|
408
|
+
params.forEach((value, index) => { boundArgs[index + 1] = value; });
|
|
409
|
+
}
|
|
410
|
+
else if (params) {
|
|
411
|
+
boundArgs = { ...params };
|
|
412
|
+
}
|
|
364
413
|
const runtimeCtx = {
|
|
365
414
|
db: this,
|
|
366
415
|
stmt: undefined,
|
|
367
|
-
params:
|
|
368
|
-
context: new
|
|
416
|
+
params: boundArgs,
|
|
417
|
+
context: new RowContextMap(),
|
|
369
418
|
tableContexts: new Map(),
|
|
370
419
|
tracer: this.instructionTracer,
|
|
371
420
|
enableMetrics: this.options.getBooleanOption('runtime_stats'),
|
|
@@ -386,15 +435,7 @@ export class Database {
|
|
|
386
435
|
* Parses SQL into a statement batch.
|
|
387
436
|
*/
|
|
388
437
|
_parseSql(sql) {
|
|
389
|
-
|
|
390
|
-
try {
|
|
391
|
-
return parser.parseAll(sql);
|
|
392
|
-
}
|
|
393
|
-
catch (e) {
|
|
394
|
-
if (e instanceof ParseError)
|
|
395
|
-
throw new QuereusError(`Parse error: ${e.message}`, StatusCode.ERROR, e);
|
|
396
|
-
throw e;
|
|
397
|
-
}
|
|
438
|
+
return new Parser().parseAll(sql);
|
|
398
439
|
}
|
|
399
440
|
// ============================================================================
|
|
400
441
|
// Statement Execution - Public API
|
|
@@ -465,6 +506,21 @@ export class Database {
|
|
|
465
506
|
*/
|
|
466
507
|
registerModule(name, module, auxData) {
|
|
467
508
|
this.checkOpen();
|
|
509
|
+
if (typeof name !== 'string' || !name) {
|
|
510
|
+
throw new MisuseError('registerModule: name must be a non-empty string');
|
|
511
|
+
}
|
|
512
|
+
if (!module || typeof module !== 'object') {
|
|
513
|
+
throw new MisuseError('registerModule: module must be an object');
|
|
514
|
+
}
|
|
515
|
+
if (typeof module.create !== 'function') {
|
|
516
|
+
throw new MisuseError('registerModule: module.create must be a function');
|
|
517
|
+
}
|
|
518
|
+
if (typeof module.connect !== 'function') {
|
|
519
|
+
throw new MisuseError('registerModule: module.connect must be a function');
|
|
520
|
+
}
|
|
521
|
+
if (typeof module.destroy !== 'function') {
|
|
522
|
+
throw new MisuseError('registerModule: module.destroy must be a function');
|
|
523
|
+
}
|
|
468
524
|
this.schemaManager.registerModule(name, module, auxData);
|
|
469
525
|
// Check if the module has a getEventEmitter method and hook it up
|
|
470
526
|
this.hookModuleEvents(name, module);
|
|
@@ -474,18 +530,10 @@ export class Database {
|
|
|
474
530
|
* @internal
|
|
475
531
|
*/
|
|
476
532
|
hookModuleEvents(name, module) {
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
if (emitter && typeof emitter === 'object') {
|
|
482
|
-
// Check if emitter has the expected methods
|
|
483
|
-
const vtabEmitter = emitter;
|
|
484
|
-
if (typeof vtabEmitter.onDataChange === 'function' || typeof vtabEmitter.onSchemaChange === 'function') {
|
|
485
|
-
this.eventEmitter.hookModuleEmitter(name, emitter);
|
|
486
|
-
log('Hooked event emitter for module: %s', name);
|
|
487
|
-
}
|
|
488
|
-
}
|
|
533
|
+
const emitter = tryGetEventEmitter(module);
|
|
534
|
+
if (emitter) {
|
|
535
|
+
this.eventEmitter.hookModuleEmitter(name, emitter);
|
|
536
|
+
log('Hooked event emitter for module: %s', name);
|
|
489
537
|
}
|
|
490
538
|
}
|
|
491
539
|
// ============================================================================
|
|
@@ -608,6 +656,8 @@ export class Database {
|
|
|
608
656
|
const finalizePromises = Array.from(this.statements).map(stmt => stmt.finalize());
|
|
609
657
|
await Promise.allSettled(finalizePromises); // Wait even if some fail
|
|
610
658
|
this.statements.clear();
|
|
659
|
+
// Clean up assertion evaluator (unsubscribe schema change listener, clear plan cache)
|
|
660
|
+
this.assertionEvaluator.dispose();
|
|
611
661
|
// Clear schemas, ensuring VTabs are potentially disconnected
|
|
612
662
|
// This will also call destroy on VTabs via SchemaManager.clearAll -> schema.clearTables -> schemaManager.dropTable
|
|
613
663
|
this.schemaManager.clearAll();
|
|
@@ -638,6 +688,18 @@ export class Database {
|
|
|
638
688
|
}
|
|
639
689
|
this.schemaManager.getMainSchema().addTable(definition);
|
|
640
690
|
}
|
|
691
|
+
/** Wraps function registration with consistent error logging and re-throw. */
|
|
692
|
+
registerFunctionWithErrorHandling(funcType, funcName, numArgs, register) {
|
|
693
|
+
try {
|
|
694
|
+
register();
|
|
695
|
+
}
|
|
696
|
+
catch (e) {
|
|
697
|
+
errorLog(`Failed to register ${funcType} function ${funcName}/${numArgs}: %O`, e);
|
|
698
|
+
if (e instanceof QuereusError)
|
|
699
|
+
throw e;
|
|
700
|
+
throw new QuereusError(`Failed to register ${funcType} function ${funcName}/${numArgs}: ${e instanceof Error ? e.message : String(e)}`, StatusCode.ERROR, e instanceof Error ? e : undefined);
|
|
701
|
+
}
|
|
702
|
+
}
|
|
641
703
|
/**
|
|
642
704
|
* Registers a user-defined scalar function.
|
|
643
705
|
*
|
|
@@ -650,16 +712,9 @@ export class Database {
|
|
|
650
712
|
const baseFlags = (options.deterministic ? FunctionFlags.DETERMINISTIC : 0) | FunctionFlags.UTF8;
|
|
651
713
|
const flags = options.flags ?? baseFlags;
|
|
652
714
|
const schema = createScalarFunction({ name, numArgs: options.numArgs, flags }, func);
|
|
653
|
-
|
|
715
|
+
this.registerFunctionWithErrorHandling('scalar', name, options.numArgs, () => {
|
|
654
716
|
this.schemaManager.getMainSchema().addFunction(schema);
|
|
655
|
-
}
|
|
656
|
-
catch (e) {
|
|
657
|
-
errorLog(`Failed to register scalar function ${name}/${options.numArgs}: %O`, e);
|
|
658
|
-
if (e instanceof Error)
|
|
659
|
-
throw e;
|
|
660
|
-
else
|
|
661
|
-
quereusError(String(e));
|
|
662
|
-
}
|
|
717
|
+
});
|
|
663
718
|
}
|
|
664
719
|
/**
|
|
665
720
|
* Registers a user-defined aggregate function.
|
|
@@ -673,16 +728,9 @@ export class Database {
|
|
|
673
728
|
this.checkOpen();
|
|
674
729
|
const flags = options.flags ?? FunctionFlags.UTF8;
|
|
675
730
|
const schema = createAggregateFunction({ name, numArgs: options.numArgs, flags, initialValue: options.initialState }, stepFunc, finalFunc);
|
|
676
|
-
|
|
731
|
+
this.registerFunctionWithErrorHandling('aggregate', name, options.numArgs, () => {
|
|
677
732
|
this.schemaManager.getMainSchema().addFunction(schema);
|
|
678
|
-
}
|
|
679
|
-
catch (e) {
|
|
680
|
-
errorLog(`Failed to register aggregate function ${name}/${options.numArgs}: %O`, e);
|
|
681
|
-
if (e instanceof Error)
|
|
682
|
-
throw e;
|
|
683
|
-
else
|
|
684
|
-
quereusError(String(e));
|
|
685
|
-
}
|
|
733
|
+
});
|
|
686
734
|
}
|
|
687
735
|
/**
|
|
688
736
|
* Registers a function using a pre-defined FunctionSchema.
|
|
@@ -692,16 +740,35 @@ export class Database {
|
|
|
692
740
|
*/
|
|
693
741
|
registerFunction(schema) {
|
|
694
742
|
this.checkOpen();
|
|
695
|
-
|
|
696
|
-
|
|
743
|
+
if (!schema || typeof schema !== 'object') {
|
|
744
|
+
throw new MisuseError('registerFunction: schema must be an object');
|
|
697
745
|
}
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
if (e instanceof Error)
|
|
701
|
-
throw e;
|
|
702
|
-
else
|
|
703
|
-
quereusError(String(e));
|
|
746
|
+
if (typeof schema.name !== 'string' || !schema.name) {
|
|
747
|
+
throw new MisuseError('registerFunction: schema.name must be a non-empty string');
|
|
704
748
|
}
|
|
749
|
+
if (!Number.isInteger(schema.numArgs) || schema.numArgs < -1) {
|
|
750
|
+
throw new MisuseError('registerFunction: schema.numArgs must be an integer >= -1');
|
|
751
|
+
}
|
|
752
|
+
// Validate that appropriate implementation functions exist
|
|
753
|
+
if ('stepFunction' in schema) {
|
|
754
|
+
if (typeof schema.stepFunction !== 'function') {
|
|
755
|
+
throw new MisuseError('registerFunction: aggregate schema.stepFunction must be a function');
|
|
756
|
+
}
|
|
757
|
+
if (typeof schema.finalizeFunction !== 'function') {
|
|
758
|
+
throw new MisuseError('registerFunction: aggregate schema.finalizeFunction must be a function');
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
else if ('implementation' in schema) {
|
|
762
|
+
if (typeof schema.implementation !== 'function') {
|
|
763
|
+
throw new MisuseError('registerFunction: schema.implementation must be a function');
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
else {
|
|
767
|
+
throw new MisuseError('registerFunction: schema must have implementation (scalar/TVF) or stepFunction+finalizeFunction (aggregate)');
|
|
768
|
+
}
|
|
769
|
+
this.registerFunctionWithErrorHandling('user', schema.name, schema.numArgs, () => {
|
|
770
|
+
this.schemaManager.getMainSchema().addFunction(schema);
|
|
771
|
+
});
|
|
705
772
|
}
|
|
706
773
|
/** Sets only the name of the default module. */
|
|
707
774
|
setDefaultVtabName(name) {
|
|
@@ -756,8 +823,7 @@ export class Database {
|
|
|
756
823
|
*/
|
|
757
824
|
getSchemaPath() {
|
|
758
825
|
this.checkOpen();
|
|
759
|
-
|
|
760
|
-
return pathString.split(',').map(s => s.trim()).filter(s => s.length > 0);
|
|
826
|
+
return parseSchemaPath(this.options.getStringOption('schema_path')) ?? [];
|
|
761
827
|
}
|
|
762
828
|
/**
|
|
763
829
|
* Set database configuration options
|
|
@@ -800,8 +866,18 @@ export class Database {
|
|
|
800
866
|
*/
|
|
801
867
|
registerCollation(name, func) {
|
|
802
868
|
this.checkOpen();
|
|
803
|
-
|
|
804
|
-
|
|
869
|
+
if (typeof name !== 'string' || !name) {
|
|
870
|
+
throw new MisuseError('registerCollation: name must be a non-empty string');
|
|
871
|
+
}
|
|
872
|
+
if (typeof func !== 'function') {
|
|
873
|
+
throw new MisuseError('registerCollation: func must be a function');
|
|
874
|
+
}
|
|
875
|
+
const upperName = name.toUpperCase();
|
|
876
|
+
if (this.collations.has(upperName)) {
|
|
877
|
+
log('Overwriting existing collation: %s', upperName);
|
|
878
|
+
}
|
|
879
|
+
this.collations.set(upperName, func);
|
|
880
|
+
log('Registered collation: %s', upperName);
|
|
805
881
|
}
|
|
806
882
|
/**
|
|
807
883
|
* Registers a custom logical type.
|
|
@@ -821,8 +897,31 @@ export class Database {
|
|
|
821
897
|
*/
|
|
822
898
|
registerType(name, definition) {
|
|
823
899
|
this.checkOpen();
|
|
824
|
-
|
|
825
|
-
|
|
900
|
+
if (typeof name !== 'string' || !name) {
|
|
901
|
+
throw new MisuseError('registerType: name must be a non-empty string');
|
|
902
|
+
}
|
|
903
|
+
if (!definition || typeof definition !== 'object') {
|
|
904
|
+
throw new MisuseError('registerType: definition must be an object');
|
|
905
|
+
}
|
|
906
|
+
if (typeof definition.name !== 'string' || !definition.name) {
|
|
907
|
+
throw new MisuseError('registerType: definition.name must be a non-empty string');
|
|
908
|
+
}
|
|
909
|
+
// Validate physicalType is a valid enum value (0-5)
|
|
910
|
+
if (typeof definition.physicalType !== 'number' || !Number.isInteger(definition.physicalType) || definition.physicalType < 0 || definition.physicalType > 5) {
|
|
911
|
+
throw new MisuseError('registerType: definition.physicalType must be a valid PhysicalType enum value (0-5)');
|
|
912
|
+
}
|
|
913
|
+
if (definition.name.toLowerCase() !== name.toLowerCase()) {
|
|
914
|
+
throw new QuereusError(`Type name mismatch: registerType('${name}', ...) does not match definition.name '${definition.name}'`, StatusCode.ERROR);
|
|
915
|
+
}
|
|
916
|
+
try {
|
|
917
|
+
registerTypeInRegistry(definition);
|
|
918
|
+
}
|
|
919
|
+
catch (e) {
|
|
920
|
+
errorLog('Failed to register type %s: %O', name, e);
|
|
921
|
+
if (e instanceof QuereusError)
|
|
922
|
+
throw e;
|
|
923
|
+
throw new QuereusError(`Failed to register type '${name}': ${e instanceof Error ? e.message : String(e)}`, StatusCode.ERROR, e instanceof Error ? e : undefined);
|
|
924
|
+
}
|
|
826
925
|
log('Registered type: %s', name);
|
|
827
926
|
}
|
|
828
927
|
/**
|
|
@@ -843,7 +942,7 @@ export class Database {
|
|
|
843
942
|
}
|
|
844
943
|
/** @internal Gets a registered collation function */
|
|
845
944
|
_getCollation(name) {
|
|
846
|
-
return
|
|
945
|
+
return this.collations.get(name.toUpperCase());
|
|
847
946
|
}
|
|
848
947
|
_queueDeferredConstraintRow(baseTable, constraintName, row, descriptor, evaluator, connectionId, contextRow, contextDescriptor) {
|
|
849
948
|
this.deferredConstraints.enqueue(baseTable, constraintName, row, descriptor, evaluator, connectionId, contextRow, contextDescriptor);
|
|
@@ -869,15 +968,17 @@ export class Database {
|
|
|
869
968
|
_recordUpdate(baseTable, oldKey, newKey) {
|
|
870
969
|
this.transactionManager.recordUpdate(baseTable, oldKey, newKey);
|
|
871
970
|
}
|
|
872
|
-
/**
|
|
873
|
-
|
|
874
|
-
this.transactionManager.
|
|
971
|
+
/** Create a named savepoint, returning its depth index */
|
|
972
|
+
_createSavepoint(name) {
|
|
973
|
+
return this.transactionManager.createSavepoint(name);
|
|
875
974
|
}
|
|
876
|
-
|
|
877
|
-
|
|
975
|
+
/** Release a named savepoint (merges layers down to target), returns target depth */
|
|
976
|
+
_releaseSavepoint(name) {
|
|
977
|
+
return this.transactionManager.releaseSavepoint(name);
|
|
878
978
|
}
|
|
879
|
-
|
|
880
|
-
|
|
979
|
+
/** Rollback to a named savepoint (discards layers down to target) */
|
|
980
|
+
_rollbackToSavepoint(name) {
|
|
981
|
+
return this.transactionManager.rollbackToSavepoint(name);
|
|
881
982
|
}
|
|
882
983
|
_clearChangeLog() {
|
|
883
984
|
this.transactionManager.clearChangeLog();
|
|
@@ -910,56 +1011,7 @@ export class Database {
|
|
|
910
1011
|
* ```
|
|
911
1012
|
*/
|
|
912
1013
|
eval(sql, params) {
|
|
913
|
-
|
|
914
|
-
const generator = this._evalGenerator(sql, params);
|
|
915
|
-
// Track whether the transaction has been finalized
|
|
916
|
-
let transactionFinalized = false;
|
|
917
|
-
// Helper to finalize the implicit transaction (idempotent)
|
|
918
|
-
const finalizeImplicitTransaction = async (commit) => {
|
|
919
|
-
if (transactionFinalized)
|
|
920
|
-
return;
|
|
921
|
-
transactionFinalized = true;
|
|
922
|
-
if (this.transactionManager.isImplicitTransaction()) {
|
|
923
|
-
if (commit) {
|
|
924
|
-
await this._commitTransaction();
|
|
925
|
-
}
|
|
926
|
-
else {
|
|
927
|
-
await this._rollbackTransaction();
|
|
928
|
-
}
|
|
929
|
-
}
|
|
930
|
-
};
|
|
931
|
-
// Wrap the generator to intercept return() and throw()
|
|
932
|
-
const wrappedIterator = {
|
|
933
|
-
[Symbol.asyncIterator]() {
|
|
934
|
-
return this;
|
|
935
|
-
},
|
|
936
|
-
async next() {
|
|
937
|
-
return generator.next();
|
|
938
|
-
},
|
|
939
|
-
async return(value) {
|
|
940
|
-
// Called on early termination (break, return, etc.)
|
|
941
|
-
// Commit the implicit transaction before delegating to the generator
|
|
942
|
-
try {
|
|
943
|
-
await finalizeImplicitTransaction(true);
|
|
944
|
-
}
|
|
945
|
-
finally {
|
|
946
|
-
// Delegate to generator.return() to trigger cleanup (finally block)
|
|
947
|
-
return generator.return(value);
|
|
948
|
-
}
|
|
949
|
-
},
|
|
950
|
-
async throw(error) {
|
|
951
|
-
// Called when an error is thrown into the iterator
|
|
952
|
-
// Rollback the implicit transaction before delegating
|
|
953
|
-
try {
|
|
954
|
-
await finalizeImplicitTransaction(false);
|
|
955
|
-
}
|
|
956
|
-
finally {
|
|
957
|
-
// Delegate to generator.throw() to propagate the error
|
|
958
|
-
return generator.throw(error);
|
|
959
|
-
}
|
|
960
|
-
}
|
|
961
|
-
};
|
|
962
|
-
return wrappedIterator;
|
|
1014
|
+
return wrapAsyncIterator(this._evalGenerator(sql, params), (commit) => this._finalizeImplicitTransaction(commit));
|
|
963
1015
|
}
|
|
964
1016
|
/**
|
|
965
1017
|
* Internal generator for eval() that yields result rows.
|
|
@@ -968,27 +1020,20 @@ export class Database {
|
|
|
968
1020
|
*/
|
|
969
1021
|
async *_evalGenerator(sql, params) {
|
|
970
1022
|
this.checkOpen();
|
|
971
|
-
// Acquire mutex for the entire iteration
|
|
972
1023
|
const releaseMutex = await this._acquireExecMutex();
|
|
973
1024
|
let stmt = null;
|
|
974
|
-
let normalCompletion = false;
|
|
975
1025
|
try {
|
|
976
|
-
// Execute - transactions are started JIT by runtime when needed
|
|
977
1026
|
stmt = this.prepare(sql);
|
|
978
1027
|
if (stmt.astBatch.length === 0) {
|
|
979
|
-
// No statements, yield nothing.
|
|
980
|
-
normalCompletion = true;
|
|
981
1028
|
return;
|
|
982
1029
|
}
|
|
983
1030
|
if (stmt.astBatch.length > 1) {
|
|
984
1031
|
// Multi-statement batch: execute all but the last statement,
|
|
985
1032
|
// then yield results from the last statement
|
|
986
1033
|
const batch = this._parseSql(sql);
|
|
987
|
-
// Execute all statements except the last one
|
|
988
1034
|
for (let i = 0; i < batch.length - 1; i++) {
|
|
989
1035
|
await this._executeSingleStatement(batch[i], params);
|
|
990
1036
|
}
|
|
991
|
-
// Now prepare and execute the last statement to yield its results
|
|
992
1037
|
const lastStmt = new Statement(this, [batch[batch.length - 1]]);
|
|
993
1038
|
this.statements.add(lastStmt);
|
|
994
1039
|
try {
|
|
@@ -1002,25 +1047,11 @@ export class Database {
|
|
|
1002
1047
|
}
|
|
1003
1048
|
}
|
|
1004
1049
|
else {
|
|
1005
|
-
// Single statement: execute and yield results
|
|
1006
1050
|
const names = stmt.getColumnNames();
|
|
1007
1051
|
for await (const row of stmt._iterateRowsRaw(params)) {
|
|
1008
1052
|
yield rowToObject(row, names);
|
|
1009
1053
|
}
|
|
1010
1054
|
}
|
|
1011
|
-
normalCompletion = true;
|
|
1012
|
-
// Commit implicit transaction on normal completion
|
|
1013
|
-
// (The wrapper also handles this for early termination via return())
|
|
1014
|
-
if (this.transactionManager.isImplicitTransaction()) {
|
|
1015
|
-
await this._commitTransaction();
|
|
1016
|
-
}
|
|
1017
|
-
}
|
|
1018
|
-
catch (err) {
|
|
1019
|
-
// Rollback implicit transaction on error
|
|
1020
|
-
if (this.transactionManager.isImplicitTransaction()) {
|
|
1021
|
-
await this._rollbackTransaction();
|
|
1022
|
-
}
|
|
1023
|
-
throw err;
|
|
1024
1055
|
}
|
|
1025
1056
|
finally {
|
|
1026
1057
|
if (stmt) {
|
|
@@ -1040,7 +1071,7 @@ export class Database {
|
|
|
1040
1071
|
ast = parser.parse(originalSqlString);
|
|
1041
1072
|
}
|
|
1042
1073
|
catch (err) {
|
|
1043
|
-
const error = err instanceof
|
|
1074
|
+
const error = err instanceof QuereusError ? err : new QuereusError(String(err), StatusCode.ERROR, err instanceof Error ? err : undefined);
|
|
1044
1075
|
errorLog("Failed to parse SQL for query plan: %O", error);
|
|
1045
1076
|
throw error;
|
|
1046
1077
|
}
|
|
@@ -1048,7 +1079,7 @@ export class Database {
|
|
|
1048
1079
|
else {
|
|
1049
1080
|
ast = sqlOrAst;
|
|
1050
1081
|
}
|
|
1051
|
-
const plan = this._buildPlan([ast]);
|
|
1082
|
+
const { plan } = this._buildPlan([ast]);
|
|
1052
1083
|
if (plan.statements.length === 0)
|
|
1053
1084
|
return plan; // No-op for this AST
|
|
1054
1085
|
return this.optimizer.optimize(plan, this);
|
|
@@ -1086,7 +1117,6 @@ export class Database {
|
|
|
1086
1117
|
this.checkOpen();
|
|
1087
1118
|
log('Preparing SQL with debug options: %s', sql);
|
|
1088
1119
|
const stmt = new Statement(this, sql);
|
|
1089
|
-
// Set debug options on the statement
|
|
1090
1120
|
stmt._debugOptions = debug;
|
|
1091
1121
|
this.statements.add(stmt);
|
|
1092
1122
|
return stmt;
|
|
@@ -1116,21 +1146,22 @@ export class Database {
|
|
|
1116
1146
|
// This ParameterScope is for the entire batch. It has globalScope as its parent.
|
|
1117
1147
|
const parameterScope = new ParameterScope(globalScope, parameterTypes);
|
|
1118
1148
|
// Get default schema path from options
|
|
1119
|
-
const
|
|
1120
|
-
const
|
|
1149
|
+
const schemaPath = parseSchemaPath(this.options.getStringOption('schema_path'));
|
|
1150
|
+
const schemaDependencies = new BuildTimeDependencyTracker();
|
|
1121
1151
|
const ctx = {
|
|
1122
1152
|
db: this,
|
|
1123
1153
|
schemaManager: this.schemaManager,
|
|
1124
1154
|
parameters: paramsOrTypes instanceof Map ? {} : (paramsOrTypes ?? {}),
|
|
1125
1155
|
scope: parameterScope,
|
|
1126
1156
|
cteNodes: new Map(),
|
|
1127
|
-
schemaDependencies
|
|
1157
|
+
schemaDependencies,
|
|
1128
1158
|
schemaCache: new Map(),
|
|
1129
1159
|
cteReferenceCache: new Map(),
|
|
1130
1160
|
outputScopes: new Map(),
|
|
1131
1161
|
schemaPath
|
|
1132
1162
|
};
|
|
1133
|
-
|
|
1163
|
+
const plan = buildBlock(ctx, statements);
|
|
1164
|
+
return { plan, schemaDependencies };
|
|
1134
1165
|
}
|
|
1135
1166
|
/**
|
|
1136
1167
|
* @internal Registers an active VirtualTable connection for transaction management.
|
|
@@ -1226,5 +1257,9 @@ export class Database {
|
|
|
1226
1257
|
async runGlobalAssertions() {
|
|
1227
1258
|
await this.assertionEvaluator.runGlobalAssertions();
|
|
1228
1259
|
}
|
|
1260
|
+
/** @internal Invalidate cached assertion plan (called on DROP ASSERTION) */
|
|
1261
|
+
invalidateAssertionCache(name) {
|
|
1262
|
+
this.assertionEvaluator.invalidateAssertion(name);
|
|
1263
|
+
}
|
|
1229
1264
|
}
|
|
1230
1265
|
//# sourceMappingURL=database.js.map
|