@quereus/quereus 2.7.0 → 2.9.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/dist/src/common/errors.d.ts +21 -0
- package/dist/src/common/errors.d.ts.map +1 -1
- package/dist/src/common/errors.js +29 -0
- package/dist/src/common/errors.js.map +1 -1
- package/dist/src/core/database.d.ts.map +1 -1
- package/dist/src/core/database.js +20 -7
- 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 +15 -5
- package/dist/src/core/statement.js.map +1 -1
- package/dist/src/emit/ast-stringify.d.ts.map +1 -1
- package/dist/src/emit/ast-stringify.js +0 -4
- package/dist/src/emit/ast-stringify.js.map +1 -1
- package/dist/src/func/builtins/explain.d.ts.map +1 -1
- package/dist/src/func/builtins/explain.js +39 -36
- package/dist/src/func/builtins/explain.js.map +1 -1
- package/dist/src/func/builtins/json-helpers.d.ts +1 -1
- package/dist/src/func/builtins/json-helpers.d.ts.map +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 +5 -7
- package/dist/src/func/builtins/json.js.map +1 -1
- package/dist/src/func/builtins/scalar.d.ts.map +1 -1
- package/dist/src/func/builtins/scalar.js +17 -2
- package/dist/src/func/builtins/scalar.js.map +1 -1
- package/dist/src/func/builtins/string.d.ts.map +1 -1
- package/dist/src/func/builtins/string.js +4 -2
- package/dist/src/func/builtins/string.js.map +1 -1
- package/dist/src/parser/ast.d.ts +4 -3
- package/dist/src/parser/ast.d.ts.map +1 -1
- package/dist/src/parser/lexer.d.ts.map +1 -1
- package/dist/src/parser/lexer.js +8 -48
- package/dist/src/parser/lexer.js.map +1 -1
- package/dist/src/parser/parser.d.ts.map +1 -1
- package/dist/src/parser/parser.js +43 -11
- package/dist/src/parser/parser.js.map +1 -1
- package/dist/src/parser/utils.d.ts +10 -1
- package/dist/src/parser/utils.d.ts.map +1 -1
- package/dist/src/parser/utils.js +23 -0
- package/dist/src/parser/utils.js.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.js +0 -1
- package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
- package/dist/src/planner/building/constraint-builder.d.ts +12 -1
- package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
- package/dist/src/planner/building/constraint-builder.js +60 -1
- package/dist/src/planner/building/constraint-builder.js.map +1 -1
- package/dist/src/planner/building/create-view.d.ts.map +1 -1
- package/dist/src/planner/building/create-view.js +16 -0
- package/dist/src/planner/building/create-view.js.map +1 -1
- package/dist/src/planner/building/delete.d.ts.map +1 -1
- package/dist/src/planner/building/delete.js +13 -7
- package/dist/src/planner/building/delete.js.map +1 -1
- package/dist/src/planner/building/foreign-key-builder.d.ts.map +1 -1
- package/dist/src/planner/building/foreign-key-builder.js +27 -17
- package/dist/src/planner/building/foreign-key-builder.js.map +1 -1
- package/dist/src/planner/building/insert.d.ts.map +1 -1
- package/dist/src/planner/building/insert.js +51 -43
- package/dist/src/planner/building/insert.js.map +1 -1
- package/dist/src/planner/building/select-aggregates.d.ts +4 -1
- package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
- package/dist/src/planner/building/select-aggregates.js +122 -21
- package/dist/src/planner/building/select-aggregates.js.map +1 -1
- package/dist/src/planner/building/select-modifiers.d.ts +6 -2
- package/dist/src/planner/building/select-modifiers.d.ts.map +1 -1
- package/dist/src/planner/building/select-modifiers.js +20 -5
- package/dist/src/planner/building/select-modifiers.js.map +1 -1
- package/dist/src/planner/building/select-ordinal.d.ts +20 -0
- package/dist/src/planner/building/select-ordinal.d.ts.map +1 -0
- package/dist/src/planner/building/select-ordinal.js +62 -0
- package/dist/src/planner/building/select-ordinal.js.map +1 -0
- package/dist/src/planner/building/select.d.ts.map +1 -1
- package/dist/src/planner/building/select.js +78 -19
- package/dist/src/planner/building/select.js.map +1 -1
- package/dist/src/planner/building/update.d.ts.map +1 -1
- package/dist/src/planner/building/update.js +38 -27
- package/dist/src/planner/building/update.js.map +1 -1
- package/dist/src/planner/building/with.d.ts.map +1 -1
- package/dist/src/planner/building/with.js +25 -2
- package/dist/src/planner/building/with.js.map +1 -1
- package/dist/src/planner/framework/characteristics.d.ts +3 -1
- package/dist/src/planner/framework/characteristics.d.ts.map +1 -1
- package/dist/src/planner/framework/characteristics.js +7 -0
- package/dist/src/planner/framework/characteristics.js.map +1 -1
- package/dist/src/planner/framework/physical-utils.d.ts +22 -1
- package/dist/src/planner/framework/physical-utils.d.ts.map +1 -1
- package/dist/src/planner/framework/physical-utils.js +47 -0
- package/dist/src/planner/framework/physical-utils.js.map +1 -1
- package/dist/src/planner/nodes/alias-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/alias-node.js +2 -0
- package/dist/src/planner/nodes/alias-node.js.map +1 -1
- package/dist/src/planner/nodes/asof-scan-node.d.ts +137 -0
- package/dist/src/planner/nodes/asof-scan-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/asof-scan-node.js +223 -0
- package/dist/src/planner/nodes/asof-scan-node.js.map +1 -0
- package/dist/src/planner/nodes/constraint-check-node.d.ts +25 -1
- package/dist/src/planner/nodes/constraint-check-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/constraint-check-node.js +36 -6
- package/dist/src/planner/nodes/constraint-check-node.js.map +1 -1
- package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/distinct-node.js +7 -0
- package/dist/src/planner/nodes/distinct-node.js.map +1 -1
- package/dist/src/planner/nodes/filter.d.ts.map +1 -1
- package/dist/src/planner/nodes/filter.js +8 -2
- package/dist/src/planner/nodes/filter.js.map +1 -1
- package/dist/src/planner/nodes/function.d.ts +11 -1
- package/dist/src/planner/nodes/function.d.ts.map +1 -1
- package/dist/src/planner/nodes/function.js +94 -1
- package/dist/src/planner/nodes/function.js.map +1 -1
- package/dist/src/planner/nodes/hash-aggregate.d.ts.map +1 -1
- package/dist/src/planner/nodes/hash-aggregate.js +2 -0
- package/dist/src/planner/nodes/hash-aggregate.js.map +1 -1
- package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-node.js +10 -2
- package/dist/src/planner/nodes/join-node.js.map +1 -1
- package/dist/src/planner/nodes/join-utils.d.ts +19 -1
- package/dist/src/planner/nodes/join-utils.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-utils.js +46 -0
- package/dist/src/planner/nodes/join-utils.js.map +1 -1
- package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
- package/dist/src/planner/nodes/limit-offset.js +2 -0
- package/dist/src/planner/nodes/limit-offset.js.map +1 -1
- package/dist/src/planner/nodes/merge-join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/merge-join-node.js +4 -1
- package/dist/src/planner/nodes/merge-join-node.js.map +1 -1
- package/dist/src/planner/nodes/ordinal-slice-node.d.ts +50 -0
- package/dist/src/planner/nodes/ordinal-slice-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/ordinal-slice-node.js +127 -0
- package/dist/src/planner/nodes/ordinal-slice-node.js.map +1 -0
- package/dist/src/planner/nodes/plan-node-type.d.ts +2 -0
- package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.js +2 -0
- package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
- package/dist/src/planner/nodes/plan-node.d.ts +130 -1
- package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node.js +49 -0
- package/dist/src/planner/nodes/plan-node.js.map +1 -1
- package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/project-node.js +6 -1
- package/dist/src/planner/nodes/project-node.js.map +1 -1
- package/dist/src/planner/nodes/recursive-cte-node.d.ts +5 -3
- package/dist/src/planner/nodes/recursive-cte-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/recursive-cte-node.js +24 -8
- package/dist/src/planner/nodes/recursive-cte-node.js.map +1 -1
- package/dist/src/planner/nodes/reference.d.ts +4 -1
- 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/returning-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/returning-node.js +5 -12
- package/dist/src/planner/nodes/returning-node.js.map +1 -1
- package/dist/src/planner/nodes/scalar.d.ts +7 -1
- package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
- package/dist/src/planner/nodes/scalar.js +100 -1
- package/dist/src/planner/nodes/scalar.js.map +1 -1
- package/dist/src/planner/nodes/set-operation-node.d.ts +2 -1
- package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/set-operation-node.js +9 -0
- package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
- package/dist/src/planner/nodes/sort.d.ts.map +1 -1
- package/dist/src/planner/nodes/sort.js +20 -0
- 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 +2 -0
- package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.d.ts +37 -2
- package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.js +87 -10
- package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
- package/dist/src/planner/nodes/update-node.d.ts +1 -3
- package/dist/src/planner/nodes/update-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/update-node.js +3 -9
- package/dist/src/planner/nodes/update-node.js.map +1 -1
- package/dist/src/planner/nodes/window-node.d.ts +61 -2
- package/dist/src/planner/nodes/window-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/window-node.js +64 -3
- package/dist/src/planner/nodes/window-node.js.map +1 -1
- package/dist/src/planner/optimizer-tuning.d.ts +9 -0
- package/dist/src/planner/optimizer-tuning.d.ts.map +1 -1
- package/dist/src/planner/optimizer-tuning.js +3 -0
- package/dist/src/planner/optimizer-tuning.js.map +1 -1
- package/dist/src/planner/optimizer.d.ts.map +1 -1
- package/dist/src/planner/optimizer.js +91 -0
- package/dist/src/planner/optimizer.js.map +1 -1
- package/dist/src/planner/rules/access/rule-asof-strategy-select.d.ts +30 -0
- package/dist/src/planner/rules/access/rule-asof-strategy-select.d.ts.map +1 -0
- package/dist/src/planner/rules/access/rule-asof-strategy-select.js +112 -0
- package/dist/src/planner/rules/access/rule-asof-strategy-select.js.map +1 -0
- package/dist/src/planner/rules/access/rule-monotonic-limit-pushdown.d.ts +33 -0
- package/dist/src/planner/rules/access/rule-monotonic-limit-pushdown.d.ts.map +1 -0
- package/dist/src/planner/rules/access/rule-monotonic-limit-pushdown.js +162 -0
- package/dist/src/planner/rules/access/rule-monotonic-limit-pushdown.js.map +1 -0
- package/dist/src/planner/rules/access/rule-monotonic-range-access.d.ts +29 -0
- package/dist/src/planner/rules/access/rule-monotonic-range-access.d.ts.map +1 -0
- package/dist/src/planner/rules/access/rule-monotonic-range-access.js +175 -0
- package/dist/src/planner/rules/access/rule-monotonic-range-access.js.map +1 -0
- 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 +53 -36
- package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
- package/dist/src/planner/rules/join/equi-pair-extractor.d.ts +61 -0
- package/dist/src/planner/rules/join/equi-pair-extractor.d.ts.map +1 -0
- package/dist/src/planner/rules/join/equi-pair-extractor.js +155 -0
- package/dist/src/planner/rules/join/equi-pair-extractor.js.map +1 -0
- package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-join-physical-selection.js +3 -123
- package/dist/src/planner/rules/join/rule-join-physical-selection.js.map +1 -1
- package/dist/src/planner/rules/join/rule-lateral-top1-asof.d.ts +21 -0
- package/dist/src/planner/rules/join/rule-lateral-top1-asof.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-lateral-top1-asof.js +405 -0
- package/dist/src/planner/rules/join/rule-lateral-top1-asof.js.map +1 -0
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.d.ts +31 -0
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.js +113 -0
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.js.map +1 -0
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.js +7 -3
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-filter-merge.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js.map +1 -1
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts.map +1 -1
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js +161 -9
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +1 -1
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts.map +1 -1
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js +2 -2
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js.map +1 -1
- package/dist/src/planner/rules/window/rule-monotonic-window.d.ts +47 -0
- package/dist/src/planner/rules/window/rule-monotonic-window.d.ts.map +1 -0
- package/dist/src/planner/rules/window/rule-monotonic-window.js +341 -0
- package/dist/src/planner/rules/window/rule-monotonic-window.js.map +1 -0
- package/dist/src/runtime/context-helpers.d.ts +9 -0
- package/dist/src/runtime/context-helpers.d.ts.map +1 -1
- package/dist/src/runtime/context-helpers.js +5 -0
- package/dist/src/runtime/context-helpers.js.map +1 -1
- package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
- package/dist/src/runtime/emit/alter-table.js +286 -7
- package/dist/src/runtime/emit/alter-table.js.map +1 -1
- package/dist/src/runtime/emit/asof-scan.d.ts +10 -0
- package/dist/src/runtime/emit/asof-scan.d.ts.map +1 -0
- package/dist/src/runtime/emit/asof-scan.js +467 -0
- package/dist/src/runtime/emit/asof-scan.js.map +1 -0
- package/dist/src/runtime/emit/binary.d.ts.map +1 -1
- package/dist/src/runtime/emit/binary.js +12 -7
- package/dist/src/runtime/emit/binary.js.map +1 -1
- package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
- package/dist/src/runtime/emit/constraint-check.js +145 -62
- package/dist/src/runtime/emit/constraint-check.js.map +1 -1
- package/dist/src/runtime/emit/create-assertion.d.ts.map +1 -1
- package/dist/src/runtime/emit/create-assertion.js +6 -6
- package/dist/src/runtime/emit/create-assertion.js.map +1 -1
- package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
- package/dist/src/runtime/emit/dml-executor.js +133 -76
- package/dist/src/runtime/emit/dml-executor.js.map +1 -1
- package/dist/src/runtime/emit/ordinal-slice.d.ts +13 -0
- package/dist/src/runtime/emit/ordinal-slice.d.ts.map +1 -0
- package/dist/src/runtime/emit/ordinal-slice.js +89 -0
- package/dist/src/runtime/emit/ordinal-slice.js.map +1 -0
- package/dist/src/runtime/emit/recursive-cte.d.ts.map +1 -1
- package/dist/src/runtime/emit/recursive-cte.js +61 -10
- 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 +9 -4
- 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 +2 -1
- package/dist/src/runtime/emit/scalar-function.js.map +1 -1
- package/dist/src/runtime/emit/scan.d.ts +19 -3
- package/dist/src/runtime/emit/scan.d.ts.map +1 -1
- package/dist/src/runtime/emit/scan.js +12 -8
- package/dist/src/runtime/emit/scan.js.map +1 -1
- package/dist/src/runtime/emit/schema-declarative.d.ts.map +1 -1
- package/dist/src/runtime/emit/schema-declarative.js +91 -14
- package/dist/src/runtime/emit/schema-declarative.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 +4 -2
- package/dist/src/runtime/emit/table-valued-function.js.map +1 -1
- package/dist/src/runtime/emit/update.d.ts.map +1 -1
- package/dist/src/runtime/emit/update.js +8 -5
- 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 +732 -37
- package/dist/src/runtime/emit/window.js.map +1 -1
- package/dist/src/runtime/foreign-key-actions.js +7 -6
- package/dist/src/runtime/foreign-key-actions.js.map +1 -1
- package/dist/src/runtime/register.d.ts.map +1 -1
- package/dist/src/runtime/register.js +4 -0
- package/dist/src/runtime/register.js.map +1 -1
- package/dist/src/schema/catalog.d.ts +12 -0
- package/dist/src/schema/catalog.d.ts.map +1 -1
- package/dist/src/schema/catalog.js +47 -6
- package/dist/src/schema/catalog.js.map +1 -1
- package/dist/src/schema/column.d.ts +7 -0
- package/dist/src/schema/column.d.ts.map +1 -1
- package/dist/src/schema/column.js.map +1 -1
- package/dist/src/schema/function.d.ts +28 -3
- 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 +42 -6
- package/dist/src/schema/manager.d.ts.map +1 -1
- package/dist/src/schema/manager.js +175 -23
- package/dist/src/schema/manager.js.map +1 -1
- package/dist/src/schema/rename-rewriter.d.ts +4 -0
- package/dist/src/schema/rename-rewriter.d.ts.map +1 -0
- package/dist/src/schema/rename-rewriter.js +506 -0
- package/dist/src/schema/rename-rewriter.js.map +1 -0
- package/dist/src/schema/schema-differ.d.ts +18 -1
- package/dist/src/schema/schema-differ.d.ts.map +1 -1
- package/dist/src/schema/schema-differ.js +344 -42
- package/dist/src/schema/schema-differ.js.map +1 -1
- package/dist/src/schema/table.d.ts +65 -2
- package/dist/src/schema/table.d.ts.map +1 -1
- package/dist/src/schema/table.js +144 -0
- package/dist/src/schema/table.js.map +1 -1
- package/dist/src/types/logical-type.d.ts +11 -0
- package/dist/src/types/logical-type.d.ts.map +1 -1
- package/dist/src/types/logical-type.js.map +1 -1
- package/dist/src/util/ast-literal.d.ts +11 -0
- package/dist/src/util/ast-literal.d.ts.map +1 -0
- package/dist/src/util/ast-literal.js +26 -0
- package/dist/src/util/ast-literal.js.map +1 -0
- package/dist/src/util/async-iterator.d.ts +2 -1
- package/dist/src/util/async-iterator.d.ts.map +1 -1
- package/dist/src/util/async-iterator.js +4 -4
- package/dist/src/util/async-iterator.js.map +1 -1
- package/dist/src/util/patterns.d.ts.map +1 -1
- package/dist/src/util/patterns.js +58 -10
- package/dist/src/util/patterns.js.map +1 -1
- package/dist/src/vtab/best-access-plan.d.ts +48 -0
- package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
- package/dist/src/vtab/best-access-plan.js +29 -0
- package/dist/src/vtab/best-access-plan.js.map +1 -1
- package/dist/src/vtab/filter-info.d.ts +14 -0
- package/dist/src/vtab/filter-info.d.ts.map +1 -1
- package/dist/src/vtab/memory/index.d.ts +8 -0
- package/dist/src/vtab/memory/index.d.ts.map +1 -1
- package/dist/src/vtab/memory/index.js +11 -0
- package/dist/src/vtab/memory/index.js.map +1 -1
- package/dist/src/vtab/memory/layer/base.d.ts +8 -1
- package/dist/src/vtab/memory/layer/base.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/base.js +36 -2
- package/dist/src/vtab/memory/layer/base.js.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts +5 -1
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +63 -13
- package/dist/src/vtab/memory/layer/manager.js.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.js +21 -2
- package/dist/src/vtab/memory/layer/transaction.js.map +1 -1
- package/dist/src/vtab/memory/module.d.ts +45 -2
- package/dist/src/vtab/memory/module.d.ts.map +1 -1
- package/dist/src/vtab/memory/module.js +268 -27
- package/dist/src/vtab/memory/module.js.map +1 -1
- package/dist/src/vtab/memory/utils/predicate.d.ts +27 -0
- package/dist/src/vtab/memory/utils/predicate.d.ts.map +1 -0
- package/dist/src/vtab/memory/utils/predicate.js +182 -0
- package/dist/src/vtab/memory/utils/predicate.js.map +1 -0
- package/dist/src/vtab/module.d.ts +24 -0
- package/dist/src/vtab/module.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -66,6 +66,16 @@ export declare class SchemaManager {
|
|
|
66
66
|
module: AnyVirtualTableModule;
|
|
67
67
|
auxData?: unknown;
|
|
68
68
|
} | undefined;
|
|
69
|
+
/**
|
|
70
|
+
* Iterates registered virtual table modules in registration order.
|
|
71
|
+
* Each entry yields the registered (lowercased) name, the module, and
|
|
72
|
+
* any auxData supplied at registration time.
|
|
73
|
+
*/
|
|
74
|
+
allModules(): IterableIterator<{
|
|
75
|
+
name: string;
|
|
76
|
+
module: AnyVirtualTableModule;
|
|
77
|
+
auxData?: unknown;
|
|
78
|
+
}>;
|
|
69
79
|
/**
|
|
70
80
|
* Sets the default virtual table module to use when USING is omitted
|
|
71
81
|
*
|
|
@@ -192,6 +202,12 @@ export declare class SchemaManager {
|
|
|
192
202
|
* @param schemaName Optional schema name (defaults to current schema)
|
|
193
203
|
*/
|
|
194
204
|
setTableTags(tableName: string, tags: Record<string, SqlValue>, schemaName?: string): void;
|
|
205
|
+
/**
|
|
206
|
+
* Asserts that no other table has FK rows referencing the table being dropped.
|
|
207
|
+
* Self-referential FKs are skipped — those rows go away with the table.
|
|
208
|
+
* No-op when foreign_keys is off.
|
|
209
|
+
*/
|
|
210
|
+
private assertNoReferencingChildrenForDrop;
|
|
195
211
|
/**
|
|
196
212
|
* Drops a table from the specified schema
|
|
197
213
|
*
|
|
@@ -260,16 +276,36 @@ export declare class SchemaManager {
|
|
|
260
276
|
*/
|
|
261
277
|
private buildTableSchemaFromAST;
|
|
262
278
|
/**
|
|
263
|
-
*
|
|
264
|
-
*
|
|
279
|
+
* Walks an expression AST and rejects bind-parameter and (optionally)
|
|
280
|
+
* column-reference nodes. Used by DDL-time DEFAULT/CHECK validators where
|
|
281
|
+
* such references are illegal even though they may otherwise build cleanly.
|
|
282
|
+
*
|
|
283
|
+
* Throws a QuereusError on the first offending node, with a message
|
|
284
|
+
* produced by the supplied formatters.
|
|
285
|
+
*/
|
|
286
|
+
private rejectIllegalReferences;
|
|
287
|
+
/**
|
|
288
|
+
* Validates that all DEFAULT expressions in the column schemas are
|
|
289
|
+
* deterministic and free of bind parameters or (when no mutation
|
|
290
|
+
* context is defined) column references. Bind parameters and column
|
|
291
|
+
* references are rejected up-front via an AST pre-walk so the error
|
|
292
|
+
* messages stay specific (rather than degrading into "column not
|
|
293
|
+
* found" during expression building).
|
|
294
|
+
*
|
|
295
|
+
* When `hasMutationContext` is true, column-style identifiers are
|
|
296
|
+
* preserved because they may resolve to mutation-context variables at
|
|
297
|
+
* INSERT time (the AST cannot distinguish a real column from a
|
|
298
|
+
* context variable, and the build attempt is permitted to fail —
|
|
299
|
+
* scope resolution is deferred to row-time).
|
|
265
300
|
*/
|
|
266
301
|
private validateDefaultDeterminism;
|
|
267
302
|
/**
|
|
268
303
|
* Validates that CHECK constraint expressions don't call non-deterministic
|
|
269
|
-
* functions. Walks the AST and looks
|
|
270
|
-
* registry; raises if any function
|
|
271
|
-
*
|
|
272
|
-
* whose scope is not yet
|
|
304
|
+
* functions and don't reference bind parameters. Walks the AST and looks
|
|
305
|
+
* up each function call against the registry; raises if any function
|
|
306
|
+
* lacks the DETERMINISTIC flag. Avoids the full planning pipeline because
|
|
307
|
+
* CHECK expressions reference table columns whose scope is not yet
|
|
308
|
+
* established at CREATE TABLE time.
|
|
273
309
|
*/
|
|
274
310
|
private validateCheckConstraintDeterminism;
|
|
275
311
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/schema/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAsI,MAAM,YAAY,CAAC;AAClL,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAIjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,KAAK,KAAK,GAAG,MAAM,kBAAkB,CAAC;AAI7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/schema/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Schema } from './schema.js';
|
|
2
2
|
import { quereusError, QuereusError } from '../common/errors.js';
|
|
3
3
|
import { StatusCode } from '../common/types.js';
|
|
4
|
-
import { buildColumnIndexMap, columnDefToSchema, findPKDefinition, opsToMask, mutationContextVarToSchema } from './table.js';
|
|
4
|
+
import { buildColumnIndexMap, columnDefToSchema, findPKDefinition, opsToMask, mutationContextVarToSchema, extractGeneratedColumnDependencies, topoSortGeneratedColumns } from './table.js';
|
|
5
5
|
import { createLogger } from '../common/logger.js';
|
|
6
6
|
import { Parser } from '../parser/parser.js';
|
|
7
7
|
import { traverseAst } from '../parser/visitor.js';
|
|
@@ -13,6 +13,7 @@ import { BuildTimeDependencyTracker } from '../planner/planning-context.js';
|
|
|
13
13
|
import { GlobalScope } from '../planner/scopes/global.js';
|
|
14
14
|
import { ParameterScope } from '../planner/scopes/param.js';
|
|
15
15
|
import { hasNativeEventSupport } from '../util/event-support.js';
|
|
16
|
+
import { quoteIdentifier } from '../emit/ast-stringify.js';
|
|
16
17
|
const log = createLogger('schema:manager');
|
|
17
18
|
const warnLog = log.extend('warn');
|
|
18
19
|
const errorLog = log.extend('error');
|
|
@@ -84,6 +85,16 @@ export class SchemaManager {
|
|
|
84
85
|
getModule(name) {
|
|
85
86
|
return this.modules.get(name.toLowerCase());
|
|
86
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* Iterates registered virtual table modules in registration order.
|
|
90
|
+
* Each entry yields the registered (lowercased) name, the module, and
|
|
91
|
+
* any auxData supplied at registration time.
|
|
92
|
+
*/
|
|
93
|
+
*allModules() {
|
|
94
|
+
for (const [name, reg] of this.modules) {
|
|
95
|
+
yield { name, module: reg.module, auxData: reg.auxData };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
87
98
|
/**
|
|
88
99
|
* Sets the default virtual table module to use when USING is omitted
|
|
89
100
|
*
|
|
@@ -372,6 +383,55 @@ export class SchemaManager {
|
|
|
372
383
|
const schema = this.getSchemaOrFail(targetSchemaName);
|
|
373
384
|
schema.addTable(updatedSchema);
|
|
374
385
|
}
|
|
386
|
+
/**
|
|
387
|
+
* Asserts that no other table has FK rows referencing the table being dropped.
|
|
388
|
+
* Self-referential FKs are skipped — those rows go away with the table.
|
|
389
|
+
* No-op when foreign_keys is off.
|
|
390
|
+
*/
|
|
391
|
+
async assertNoReferencingChildrenForDrop(parentSchemaName, parentTableName) {
|
|
392
|
+
if (!this.db.options.getBooleanOption('foreign_keys'))
|
|
393
|
+
return;
|
|
394
|
+
const parentSchemaLower = parentSchemaName.toLowerCase();
|
|
395
|
+
const parentTableLower = parentTableName.toLowerCase();
|
|
396
|
+
for (const schema of this._getAllSchemas()) {
|
|
397
|
+
for (const childTable of schema.getAllTables()) {
|
|
398
|
+
if (!childTable.foreignKeys)
|
|
399
|
+
continue;
|
|
400
|
+
// Skip the table being dropped itself — self-FK rows are going away with it.
|
|
401
|
+
if (childTable.schemaName.toLowerCase() === parentSchemaLower &&
|
|
402
|
+
childTable.name.toLowerCase() === parentTableLower)
|
|
403
|
+
continue;
|
|
404
|
+
for (const fk of childTable.foreignKeys) {
|
|
405
|
+
if (fk.referencedTable.toLowerCase() !== parentTableLower)
|
|
406
|
+
continue;
|
|
407
|
+
const targetSchema = fk.referencedSchema ?? childTable.schemaName;
|
|
408
|
+
if (targetSchema.toLowerCase() !== parentSchemaLower)
|
|
409
|
+
continue;
|
|
410
|
+
// MATCH SIMPLE: row is referencing iff every FK column is non-NULL.
|
|
411
|
+
const childColNames = fk.columns.map(idx => quoteIdentifier(childTable.columns[idx].name));
|
|
412
|
+
const whereClause = childColNames.map(c => `${c} IS NOT NULL`).join(' AND ');
|
|
413
|
+
const schemaPrefix = childTable.schemaName.toLowerCase() !== 'main'
|
|
414
|
+
? `${quoteIdentifier(childTable.schemaName)}.`
|
|
415
|
+
: '';
|
|
416
|
+
const sql = `select 1 from ${schemaPrefix}${quoteIdentifier(childTable.name)} where ${whereClause} limit 1`;
|
|
417
|
+
const stmt = this.db.prepare(sql);
|
|
418
|
+
try {
|
|
419
|
+
let referenced = false;
|
|
420
|
+
for await (const _row of stmt._iterateRowsRaw()) {
|
|
421
|
+
referenced = true;
|
|
422
|
+
break;
|
|
423
|
+
}
|
|
424
|
+
if (referenced) {
|
|
425
|
+
throw new QuereusError(`FOREIGN KEY constraint failed: cannot drop table '${parentTableName}' because table '${childTable.name}' still has rows referencing it`, StatusCode.CONSTRAINT);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
finally {
|
|
429
|
+
await stmt.finalize();
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
}
|
|
375
435
|
/**
|
|
376
436
|
* Drops a table from the specified schema
|
|
377
437
|
*
|
|
@@ -395,6 +455,11 @@ export class SchemaManager {
|
|
|
395
455
|
}
|
|
396
456
|
throw new QuereusError(`Table ${tableName} not found in schema ${schemaName}`, StatusCode.NOTFOUND);
|
|
397
457
|
}
|
|
458
|
+
// FK guard: when foreign_keys is on, refuse to drop a parent that still has
|
|
459
|
+
// non-NULL FK rows in any child table (excluding self-FK; those rows go away
|
|
460
|
+
// with the table). MATCH SIMPLE: a row is "referencing" iff every FK column
|
|
461
|
+
// is non-NULL.
|
|
462
|
+
await this.assertNoReferencingChildrenForDrop(schemaName, tableName);
|
|
398
463
|
// Remove any active connections for this table before destroying the module.
|
|
399
464
|
// Connections become stale once the table is dropped and must not be reused
|
|
400
465
|
// if the table is later recreated with the same name.
|
|
@@ -555,6 +620,7 @@ export class SchemaManager {
|
|
|
555
620
|
operations: opsToMask(con.operations),
|
|
556
621
|
deferrable: con.deferrable,
|
|
557
622
|
initiallyDeferred: con.initiallyDeferred,
|
|
623
|
+
defaultConflict: con.onConflict,
|
|
558
624
|
tags: con.tags && Object.keys(con.tags).length > 0 ? Object.freeze({ ...con.tags }) : undefined,
|
|
559
625
|
});
|
|
560
626
|
}
|
|
@@ -568,6 +634,7 @@ export class SchemaManager {
|
|
|
568
634
|
operations: opsToMask(con.operations),
|
|
569
635
|
deferrable: con.deferrable,
|
|
570
636
|
initiallyDeferred: con.initiallyDeferred,
|
|
637
|
+
defaultConflict: con.onConflict,
|
|
571
638
|
tags: con.tags && Object.keys(con.tags).length > 0 ? Object.freeze({ ...con.tags }) : undefined,
|
|
572
639
|
});
|
|
573
640
|
}
|
|
@@ -592,6 +659,9 @@ export class SchemaManager {
|
|
|
592
659
|
}
|
|
593
660
|
// Parent column resolution is deferred — store names for now
|
|
594
661
|
// We need the parent table schema to resolve indices, but it may not exist yet
|
|
662
|
+
if (fk.columns && fk.columns.length !== 1) {
|
|
663
|
+
throw new QuereusError(`FK constraint '${con.name ?? `_fk_${tableName}_${colDef.name}`}' on table '${tableName}': child column count (1) does not match parent column count (${fk.columns.length})`, StatusCode.ERROR);
|
|
664
|
+
}
|
|
595
665
|
result.push({
|
|
596
666
|
name: con.name ?? `_fk_${tableName}_${colDef.name}`,
|
|
597
667
|
columns: Object.freeze([childColIndex]),
|
|
@@ -599,8 +669,8 @@ export class SchemaManager {
|
|
|
599
669
|
referencedSchema: schemaName,
|
|
600
670
|
referencedColumns: Object.freeze([]), // resolved at enforcement time
|
|
601
671
|
referencedColumnNames: fk.columns, // deferred resolution via resolveReferencedColumns
|
|
602
|
-
onDelete: fk.onDelete ?? '
|
|
603
|
-
onUpdate: fk.onUpdate ?? '
|
|
672
|
+
onDelete: fk.onDelete ?? 'restrict',
|
|
673
|
+
onUpdate: fk.onUpdate ?? 'restrict',
|
|
604
674
|
deferred: fk.initiallyDeferred ?? false,
|
|
605
675
|
tags: con.tags && Object.keys(con.tags).length > 0 ? Object.freeze({ ...con.tags }) : undefined,
|
|
606
676
|
});
|
|
@@ -618,6 +688,9 @@ export class SchemaManager {
|
|
|
618
688
|
}
|
|
619
689
|
return idx;
|
|
620
690
|
});
|
|
691
|
+
if (fk.columns && fk.columns.length !== childColIndices.length) {
|
|
692
|
+
throw new QuereusError(`FK constraint '${con.name ?? `_fk_${tableName}_${con.columns.map(c => c.name).join('_')}`}' on table '${tableName}': child column count (${childColIndices.length}) does not match parent column count (${fk.columns.length})`, StatusCode.ERROR);
|
|
693
|
+
}
|
|
621
694
|
result.push({
|
|
622
695
|
name: con.name ?? `_fk_${tableName}_${con.columns.map(c => c.name).join('_')}`,
|
|
623
696
|
columns: Object.freeze(childColIndices),
|
|
@@ -625,8 +698,8 @@ export class SchemaManager {
|
|
|
625
698
|
referencedSchema: schemaName,
|
|
626
699
|
referencedColumns: Object.freeze([]), // resolved at enforcement time
|
|
627
700
|
referencedColumnNames: fk.columns, // deferred resolution via resolveReferencedColumns
|
|
628
|
-
onDelete: fk.onDelete ?? '
|
|
629
|
-
onUpdate: fk.onUpdate ?? '
|
|
701
|
+
onDelete: fk.onDelete ?? 'restrict',
|
|
702
|
+
onUpdate: fk.onUpdate ?? 'restrict',
|
|
630
703
|
deferred: fk.initiallyDeferred ?? false,
|
|
631
704
|
tags: con.tags && Object.keys(con.tags).length > 0 ? Object.freeze({ ...con.tags }) : undefined,
|
|
632
705
|
});
|
|
@@ -649,6 +722,7 @@ export class SchemaManager {
|
|
|
649
722
|
result.push({
|
|
650
723
|
name: con.name,
|
|
651
724
|
columns: Object.freeze([colIndex]),
|
|
725
|
+
defaultConflict: con.onConflict,
|
|
652
726
|
tags: con.tags && Object.keys(con.tags).length > 0 ? Object.freeze({ ...con.tags }) : undefined,
|
|
653
727
|
});
|
|
654
728
|
}
|
|
@@ -668,6 +742,7 @@ export class SchemaManager {
|
|
|
668
742
|
result.push({
|
|
669
743
|
name: con.name,
|
|
670
744
|
columns: Object.freeze(colIndices),
|
|
745
|
+
defaultConflict: con.onConflict,
|
|
671
746
|
tags: con.tags && Object.keys(con.tags).length > 0 ? Object.freeze({ ...con.tags }) : undefined,
|
|
672
747
|
});
|
|
673
748
|
}
|
|
@@ -692,6 +767,16 @@ export class SchemaManager {
|
|
|
692
767
|
const mutationContextSchemas = stmt.contextDefinitions
|
|
693
768
|
? stmt.contextDefinitions.map(varDef => mutationContextVarToSchema(varDef, defaultNotNull))
|
|
694
769
|
: undefined;
|
|
770
|
+
// Extract generated-column dependencies and validate that they form a DAG.
|
|
771
|
+
// Cycle detection runs before module.create so an invalid schema never
|
|
772
|
+
// reaches storage.
|
|
773
|
+
const rawGenDeps = extractGeneratedColumnDependencies(columns, tableName);
|
|
774
|
+
const genTopoOrder = rawGenDeps.size > 0
|
|
775
|
+
? topoSortGeneratedColumns(columns, rawGenDeps)
|
|
776
|
+
: undefined;
|
|
777
|
+
const generatedColumnDependencies = rawGenDeps.size > 0
|
|
778
|
+
? Object.freeze(new Map(Array.from(rawGenDeps.entries()).map(([k, v]) => [k, Object.freeze(v)])))
|
|
779
|
+
: undefined;
|
|
695
780
|
return {
|
|
696
781
|
name: tableName,
|
|
697
782
|
schemaName: targetSchemaName,
|
|
@@ -709,14 +794,57 @@ export class SchemaManager {
|
|
|
709
794
|
vtabAuxData: moduleInfo.auxData,
|
|
710
795
|
estimatedRows: 0,
|
|
711
796
|
mutationContext: mutationContextSchemas ? Object.freeze(mutationContextSchemas) : undefined,
|
|
797
|
+
generatedColumnDependencies,
|
|
798
|
+
generatedColumnTopoOrder: genTopoOrder ? Object.freeze(genTopoOrder) : undefined,
|
|
712
799
|
tags: stmt.tags && Object.keys(stmt.tags).length > 0 ? Object.freeze({ ...stmt.tags }) : undefined,
|
|
713
800
|
};
|
|
714
801
|
}
|
|
715
802
|
/**
|
|
716
|
-
*
|
|
717
|
-
*
|
|
803
|
+
* Walks an expression AST and rejects bind-parameter and (optionally)
|
|
804
|
+
* column-reference nodes. Used by DDL-time DEFAULT/CHECK validators where
|
|
805
|
+
* such references are illegal even though they may otherwise build cleanly.
|
|
806
|
+
*
|
|
807
|
+
* Throws a QuereusError on the first offending node, with a message
|
|
808
|
+
* produced by the supplied formatters.
|
|
718
809
|
*/
|
|
719
|
-
|
|
810
|
+
rejectIllegalReferences(expr, options) {
|
|
811
|
+
let offendingType;
|
|
812
|
+
traverseAst(expr, {
|
|
813
|
+
enterNode: (node) => {
|
|
814
|
+
if (offendingType)
|
|
815
|
+
return false;
|
|
816
|
+
if (node.type === 'parameter') {
|
|
817
|
+
offendingType = 'parameter';
|
|
818
|
+
return false;
|
|
819
|
+
}
|
|
820
|
+
if (options.rejectColumns && node.type === 'column') {
|
|
821
|
+
offendingType = 'column';
|
|
822
|
+
return false;
|
|
823
|
+
}
|
|
824
|
+
},
|
|
825
|
+
});
|
|
826
|
+
if (offendingType === 'parameter') {
|
|
827
|
+
throw new QuereusError(options.formatParamError(), StatusCode.ERROR);
|
|
828
|
+
}
|
|
829
|
+
if (offendingType === 'column') {
|
|
830
|
+
throw new QuereusError(options.formatColumnError(), StatusCode.ERROR);
|
|
831
|
+
}
|
|
832
|
+
}
|
|
833
|
+
/**
|
|
834
|
+
* Validates that all DEFAULT expressions in the column schemas are
|
|
835
|
+
* deterministic and free of bind parameters or (when no mutation
|
|
836
|
+
* context is defined) column references. Bind parameters and column
|
|
837
|
+
* references are rejected up-front via an AST pre-walk so the error
|
|
838
|
+
* messages stay specific (rather than degrading into "column not
|
|
839
|
+
* found" during expression building).
|
|
840
|
+
*
|
|
841
|
+
* When `hasMutationContext` is true, column-style identifiers are
|
|
842
|
+
* preserved because they may resolve to mutation-context variables at
|
|
843
|
+
* INSERT time (the AST cannot distinguish a real column from a
|
|
844
|
+
* context variable, and the build attempt is permitted to fail —
|
|
845
|
+
* scope resolution is deferred to row-time).
|
|
846
|
+
*/
|
|
847
|
+
validateDefaultDeterminism(columns, tableName, hasMutationContext) {
|
|
720
848
|
const globalScope = new GlobalScope(this.db.schemaManager);
|
|
721
849
|
const parameterScope = new ParameterScope(globalScope);
|
|
722
850
|
const planningCtx = {
|
|
@@ -734,32 +862,54 @@ export class SchemaManager {
|
|
|
734
862
|
if (!col.defaultValue || typeof col.defaultValue !== 'object' || col.defaultValue === null || !('type' in col.defaultValue)) {
|
|
735
863
|
continue;
|
|
736
864
|
}
|
|
865
|
+
this.rejectIllegalReferences(col.defaultValue, {
|
|
866
|
+
rejectColumns: !hasMutationContext,
|
|
867
|
+
formatParamError: () => `DEFAULT for column '${col.name}' in table '${tableName}' may not reference bind parameters.`,
|
|
868
|
+
formatColumnError: () => `DEFAULT for column '${col.name}' in table '${tableName}' may not reference columns; use a generated column instead.`,
|
|
869
|
+
});
|
|
737
870
|
let defaultExpr;
|
|
738
871
|
try {
|
|
739
872
|
defaultExpr = buildExpression(planningCtx, col.defaultValue);
|
|
740
873
|
}
|
|
741
|
-
catch (
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
874
|
+
catch (e) {
|
|
875
|
+
if (hasMutationContext) {
|
|
876
|
+
// Column-style identifiers in DEFAULT may resolve to mutation
|
|
877
|
+
// context variables at INSERT time; the row scope isn't
|
|
878
|
+
// available here, so a build failure isn't necessarily a bug.
|
|
879
|
+
// Determinism is re-checked at INSERT time.
|
|
880
|
+
log('Skipping determinism validation for default on column %s.%s at CREATE TABLE time (deferred to INSERT, mutation context present): %s', tableName, col.name, e.message);
|
|
881
|
+
}
|
|
882
|
+
else {
|
|
883
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
884
|
+
const code = e instanceof QuereusError ? e.code : StatusCode.ERROR;
|
|
885
|
+
throw new QuereusError(`DEFAULT for column '${col.name}' in table '${tableName}' is invalid: ${message}`, code, e instanceof Error ? e : undefined);
|
|
750
886
|
}
|
|
751
887
|
}
|
|
888
|
+
if (!defaultExpr)
|
|
889
|
+
continue;
|
|
890
|
+
const result = checkDeterministic(defaultExpr);
|
|
891
|
+
if (!result.valid) {
|
|
892
|
+
throw new QuereusError(`Non-deterministic expression not allowed in DEFAULT for column '${col.name}' in table '${tableName}'. ` +
|
|
893
|
+
`Expression: ${result.expression}. ` +
|
|
894
|
+
`Use mutation context to pass non-deterministic values (e.g., WITH CONTEXT (timestamp = datetime('now'))).`, StatusCode.ERROR);
|
|
895
|
+
}
|
|
752
896
|
}
|
|
753
897
|
}
|
|
754
898
|
/**
|
|
755
899
|
* Validates that CHECK constraint expressions don't call non-deterministic
|
|
756
|
-
* functions. Walks the AST and looks
|
|
757
|
-
* registry; raises if any function
|
|
758
|
-
*
|
|
759
|
-
* whose scope is not yet
|
|
900
|
+
* functions and don't reference bind parameters. Walks the AST and looks
|
|
901
|
+
* up each function call against the registry; raises if any function
|
|
902
|
+
* lacks the DETERMINISTIC flag. Avoids the full planning pipeline because
|
|
903
|
+
* CHECK expressions reference table columns whose scope is not yet
|
|
904
|
+
* established at CREATE TABLE time.
|
|
760
905
|
*/
|
|
761
906
|
validateCheckConstraintDeterminism(checkConstraints, tableName) {
|
|
762
907
|
for (const cc of checkConstraints) {
|
|
908
|
+
const constraintName = cc.name ?? `_check_${tableName}`;
|
|
909
|
+
this.rejectIllegalReferences(cc.expr, {
|
|
910
|
+
rejectColumns: false,
|
|
911
|
+
formatParamError: () => `CHECK constraint '${constraintName}' on table '${tableName}' may not reference bind parameters.`,
|
|
912
|
+
});
|
|
763
913
|
let offendingExpr;
|
|
764
914
|
traverseAst(cc.expr, {
|
|
765
915
|
enterNode: (node) => {
|
|
@@ -778,7 +928,6 @@ export class SchemaManager {
|
|
|
778
928
|
},
|
|
779
929
|
});
|
|
780
930
|
if (offendingExpr) {
|
|
781
|
-
const constraintName = cc.name ?? `_check_${tableName}`;
|
|
782
931
|
throw new QuereusError(`Non-deterministic expression not allowed in CHECK constraint '${constraintName}' on table '${tableName}'. ` +
|
|
783
932
|
`Function '${offendingExpr.name}' is not deterministic. ` +
|
|
784
933
|
`Use mutation context to pass non-deterministic values (e.g., WITH CONTEXT (timestamp = datetime('now'))).`, StatusCode.ERROR);
|
|
@@ -892,6 +1041,7 @@ export class SchemaManager {
|
|
|
892
1041
|
name: indexName,
|
|
893
1042
|
columns: Object.freeze(indexColumns),
|
|
894
1043
|
unique: stmt.isUnique || undefined,
|
|
1044
|
+
predicate: stmt.where,
|
|
895
1045
|
tags: stmt.tags && Object.keys(stmt.tags).length > 0 ? Object.freeze({ ...stmt.tags }) : undefined,
|
|
896
1046
|
};
|
|
897
1047
|
}
|
|
@@ -910,6 +1060,7 @@ export class SchemaManager {
|
|
|
910
1060
|
const newConstraint = {
|
|
911
1061
|
name: indexSchema.name,
|
|
912
1062
|
columns: Object.freeze(indexSchema.columns.map(c => c.index)),
|
|
1063
|
+
predicate: indexSchema.predicate,
|
|
913
1064
|
};
|
|
914
1065
|
const updatedConstraints = [...(tableSchema.uniqueConstraints ?? []), newConstraint];
|
|
915
1066
|
result.uniqueConstraints = Object.freeze(updatedConstraints);
|
|
@@ -1028,7 +1179,8 @@ export class SchemaManager {
|
|
|
1028
1179
|
}
|
|
1029
1180
|
const { moduleName, effectiveModuleArgs, moduleInfo } = this.resolveModuleInfo(stmt);
|
|
1030
1181
|
const baseTableSchema = this.buildTableSchemaFromAST(stmt, moduleName, effectiveModuleArgs, moduleInfo);
|
|
1031
|
-
|
|
1182
|
+
const hasMutationContext = !!baseTableSchema.mutationContext && baseTableSchema.mutationContext.length > 0;
|
|
1183
|
+
this.validateDefaultDeterminism(baseTableSchema.columns, tableName, hasMutationContext);
|
|
1032
1184
|
this.validateCheckConstraintDeterminism(baseTableSchema.checkConstraints, tableName);
|
|
1033
1185
|
let tableInstance;
|
|
1034
1186
|
try {
|