@quereus/quereus 3.2.1 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/dist/src/common/datatype.d.ts +12 -0
- package/dist/src/common/datatype.d.ts.map +1 -1
- package/dist/src/common/datatype.js.map +1 -1
- package/dist/src/common/types.d.ts +24 -0
- package/dist/src/common/types.d.ts.map +1 -1
- package/dist/src/common/types.js.map +1 -1
- package/dist/src/core/database-assertions.d.ts +37 -9
- package/dist/src/core/database-assertions.d.ts.map +1 -1
- package/dist/src/core/database-assertions.js +62 -106
- package/dist/src/core/database-assertions.js.map +1 -1
- package/dist/src/core/database-events.d.ts +163 -0
- package/dist/src/core/database-events.d.ts.map +1 -1
- package/dist/src/core/database-events.js +235 -21
- package/dist/src/core/database-events.js.map +1 -1
- package/dist/src/core/database-external-changes.d.ts +28 -0
- package/dist/src/core/database-external-changes.d.ts.map +1 -0
- package/dist/src/core/database-external-changes.js +242 -0
- package/dist/src/core/database-external-changes.js.map +1 -0
- package/dist/src/core/database-internal.d.ts +50 -1
- package/dist/src/core/database-internal.d.ts.map +1 -1
- package/dist/src/core/database-materialized-views.d.ts +1253 -0
- package/dist/src/core/database-materialized-views.d.ts.map +1 -0
- package/dist/src/core/database-materialized-views.js +3064 -0
- package/dist/src/core/database-materialized-views.js.map +1 -0
- package/dist/src/core/database-options.d.ts +4 -0
- package/dist/src/core/database-options.d.ts.map +1 -1
- package/dist/src/core/database-options.js +10 -0
- package/dist/src/core/database-options.js.map +1 -1
- package/dist/src/core/database-transaction.d.ts +19 -3
- package/dist/src/core/database-transaction.d.ts.map +1 -1
- package/dist/src/core/database-transaction.js +30 -3
- package/dist/src/core/database-transaction.js.map +1 -1
- package/dist/src/core/database-watchers.d.ts +19 -0
- package/dist/src/core/database-watchers.d.ts.map +1 -1
- package/dist/src/core/database-watchers.js +63 -3
- package/dist/src/core/database-watchers.js.map +1 -1
- package/dist/src/core/database.d.ts +203 -11
- package/dist/src/core/database.d.ts.map +1 -1
- package/dist/src/core/database.js +493 -29
- package/dist/src/core/database.js.map +1 -1
- package/dist/src/core/derived-row-validator.d.ts +137 -0
- package/dist/src/core/derived-row-validator.d.ts.map +1 -0
- package/dist/src/core/derived-row-validator.js +314 -0
- package/dist/src/core/derived-row-validator.js.map +1 -0
- package/dist/src/core/statement.d.ts.map +1 -1
- package/dist/src/core/statement.js +30 -9
- package/dist/src/core/statement.js.map +1 -1
- package/dist/src/emit/ast-stringify.d.ts +135 -1
- package/dist/src/emit/ast-stringify.d.ts.map +1 -1
- package/dist/src/emit/ast-stringify.js +795 -120
- package/dist/src/emit/ast-stringify.js.map +1 -1
- package/dist/src/func/builtins/aggregate.d.ts.map +1 -1
- package/dist/src/func/builtins/aggregate.js +11 -10
- package/dist/src/func/builtins/aggregate.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 +32 -0
- package/dist/src/func/builtins/builtin-window-functions.js.map +1 -1
- package/dist/src/func/builtins/explain.d.ts +3 -0
- package/dist/src/func/builtins/explain.d.ts.map +1 -1
- package/dist/src/func/builtins/explain.js +229 -0
- 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 +10 -2
- package/dist/src/func/builtins/index.js.map +1 -1
- package/dist/src/func/builtins/json.d.ts.map +1 -1
- package/dist/src/func/builtins/json.js +3 -2
- package/dist/src/func/builtins/json.js.map +1 -1
- package/dist/src/func/builtins/mutation.d.ts +2 -0
- package/dist/src/func/builtins/mutation.d.ts.map +1 -0
- package/dist/src/func/builtins/mutation.js +53 -0
- package/dist/src/func/builtins/mutation.js.map +1 -0
- package/dist/src/func/builtins/schema.d.ts +2 -0
- package/dist/src/func/builtins/schema.d.ts.map +1 -1
- package/dist/src/func/builtins/schema.js +713 -26
- package/dist/src/func/builtins/schema.js.map +1 -1
- package/dist/src/func/builtins/string.js +1 -1
- package/dist/src/func/builtins/string.js.map +1 -1
- package/dist/src/func/registration.d.ts +9 -0
- package/dist/src/func/registration.d.ts.map +1 -1
- package/dist/src/func/registration.js +4 -0
- package/dist/src/func/registration.js.map +1 -1
- package/dist/src/index.d.ts +25 -6
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +27 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/parser/ast.d.ts +353 -21
- package/dist/src/parser/ast.d.ts.map +1 -1
- package/dist/src/parser/index.d.ts +14 -1
- package/dist/src/parser/index.d.ts.map +1 -1
- package/dist/src/parser/index.js +19 -0
- package/dist/src/parser/index.js.map +1 -1
- package/dist/src/parser/lexer.d.ts +9 -0
- package/dist/src/parser/lexer.d.ts.map +1 -1
- package/dist/src/parser/lexer.js +9 -0
- package/dist/src/parser/lexer.js.map +1 -1
- package/dist/src/parser/parser.d.ts +277 -8
- package/dist/src/parser/parser.d.ts.map +1 -1
- package/dist/src/parser/parser.js +1393 -471
- package/dist/src/parser/parser.js.map +1 -1
- package/dist/src/parser/visitor.d.ts.map +1 -1
- package/dist/src/parser/visitor.js +12 -8
- package/dist/src/parser/visitor.js.map +1 -1
- package/dist/src/planner/analysis/assertion-classifier.d.ts.map +1 -1
- package/dist/src/planner/analysis/assertion-classifier.js +4 -0
- package/dist/src/planner/analysis/assertion-classifier.js.map +1 -1
- package/dist/src/planner/analysis/assertion-hoist-cache.d.ts.map +1 -1
- package/dist/src/planner/analysis/assertion-hoist-cache.js +8 -4
- package/dist/src/planner/analysis/assertion-hoist-cache.js.map +1 -1
- package/dist/src/planner/analysis/authored-inverse.d.ts +22 -0
- package/dist/src/planner/analysis/authored-inverse.d.ts.map +1 -0
- package/dist/src/planner/analysis/authored-inverse.js +267 -0
- package/dist/src/planner/analysis/authored-inverse.js.map +1 -0
- package/dist/src/planner/analysis/binding-extractor.d.ts.map +1 -1
- package/dist/src/planner/analysis/binding-extractor.js +9 -6
- package/dist/src/planner/analysis/binding-extractor.js.map +1 -1
- package/dist/src/planner/analysis/change-scope.d.ts +34 -4
- package/dist/src/planner/analysis/change-scope.d.ts.map +1 -1
- package/dist/src/planner/analysis/change-scope.js +115 -7
- package/dist/src/planner/analysis/change-scope.js.map +1 -1
- package/dist/src/planner/analysis/check-extraction.d.ts +36 -2
- package/dist/src/planner/analysis/check-extraction.d.ts.map +1 -1
- package/dist/src/planner/analysis/check-extraction.js +174 -46
- package/dist/src/planner/analysis/check-extraction.js.map +1 -1
- package/dist/src/planner/analysis/coarsened-key.d.ts +109 -0
- package/dist/src/planner/analysis/coarsened-key.d.ts.map +1 -0
- package/dist/src/planner/analysis/coarsened-key.js +228 -0
- package/dist/src/planner/analysis/coarsened-key.js.map +1 -0
- package/dist/src/planner/analysis/comparison-collation.d.ts +216 -0
- package/dist/src/planner/analysis/comparison-collation.d.ts.map +1 -0
- package/dist/src/planner/analysis/comparison-collation.js +341 -0
- package/dist/src/planner/analysis/comparison-collation.js.map +1 -0
- package/dist/src/planner/analysis/constraint-extractor.d.ts +13 -1
- package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.js +220 -21
- package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
- package/dist/src/planner/analysis/coverage-prover.d.ts +321 -0
- package/dist/src/planner/analysis/coverage-prover.d.ts.map +1 -0
- package/dist/src/planner/analysis/coverage-prover.js +1038 -0
- package/dist/src/planner/analysis/coverage-prover.js.map +1 -0
- package/dist/src/planner/analysis/key-filter.d.ts +22 -0
- package/dist/src/planner/analysis/key-filter.d.ts.map +1 -0
- package/dist/src/planner/analysis/key-filter.js +105 -0
- package/dist/src/planner/analysis/key-filter.js.map +1 -0
- package/dist/src/planner/analysis/partial-unique-extraction.d.ts +36 -1
- package/dist/src/planner/analysis/partial-unique-extraction.d.ts.map +1 -1
- package/dist/src/planner/analysis/partial-unique-extraction.js +148 -22
- package/dist/src/planner/analysis/partial-unique-extraction.js.map +1 -1
- package/dist/src/planner/analysis/predicate-normalizer.d.ts.map +1 -1
- package/dist/src/planner/analysis/predicate-normalizer.js +30 -1
- package/dist/src/planner/analysis/predicate-normalizer.js.map +1 -1
- package/dist/src/planner/analysis/predicate-shape.d.ts +36 -1
- package/dist/src/planner/analysis/predicate-shape.d.ts.map +1 -1
- package/dist/src/planner/analysis/predicate-shape.js +51 -13
- package/dist/src/planner/analysis/predicate-shape.js.map +1 -1
- package/dist/src/planner/analysis/query-rewrite-matcher.d.ts +314 -0
- package/dist/src/planner/analysis/query-rewrite-matcher.d.ts.map +1 -0
- package/dist/src/planner/analysis/query-rewrite-matcher.js +1081 -0
- package/dist/src/planner/analysis/query-rewrite-matcher.js.map +1 -0
- package/dist/src/planner/analysis/scalar-invertibility.d.ts +92 -0
- package/dist/src/planner/analysis/scalar-invertibility.d.ts.map +1 -0
- package/dist/src/planner/analysis/scalar-invertibility.js +129 -0
- package/dist/src/planner/analysis/scalar-invertibility.js.map +1 -0
- package/dist/src/planner/analysis/update-lineage.d.ts +196 -0
- package/dist/src/planner/analysis/update-lineage.d.ts.map +1 -0
- package/dist/src/planner/analysis/update-lineage.js +322 -0
- package/dist/src/planner/analysis/update-lineage.js.map +1 -0
- package/dist/src/planner/analysis/view-complement.d.ts +42 -0
- package/dist/src/planner/analysis/view-complement.d.ts.map +1 -0
- package/dist/src/planner/analysis/view-complement.js +54 -0
- package/dist/src/planner/analysis/view-complement.js.map +1 -0
- package/dist/src/planner/building/alter-table.d.ts +1 -1
- package/dist/src/planner/building/alter-table.d.ts.map +1 -1
- package/dist/src/planner/building/alter-table.js +211 -2
- package/dist/src/planner/building/alter-table.js.map +1 -1
- package/dist/src/planner/building/block.d.ts.map +1 -1
- package/dist/src/planner/building/block.js +18 -1
- package/dist/src/planner/building/block.js.map +1 -1
- package/dist/src/planner/building/constraint-builder.d.ts +33 -5
- package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
- package/dist/src/planner/building/constraint-builder.js +63 -28
- package/dist/src/planner/building/constraint-builder.js.map +1 -1
- package/dist/src/planner/building/create-view.d.ts +9 -0
- package/dist/src/planner/building/create-view.d.ts.map +1 -1
- package/dist/src/planner/building/create-view.js +41 -12
- package/dist/src/planner/building/create-view.js.map +1 -1
- package/dist/src/planner/building/ddl.d.ts.map +1 -1
- package/dist/src/planner/building/ddl.js +94 -0
- package/dist/src/planner/building/ddl.js.map +1 -1
- package/dist/src/planner/building/declare-schema.d.ts +1 -0
- package/dist/src/planner/building/declare-schema.d.ts.map +1 -1
- package/dist/src/planner/building/declare-schema.js +4 -1
- package/dist/src/planner/building/declare-schema.js.map +1 -1
- package/dist/src/planner/building/default-scope.d.ts +26 -0
- package/dist/src/planner/building/default-scope.d.ts.map +1 -0
- package/dist/src/planner/building/default-scope.js +41 -0
- package/dist/src/planner/building/default-scope.js.map +1 -0
- package/dist/src/planner/building/delete.d.ts +19 -1
- package/dist/src/planner/building/delete.d.ts.map +1 -1
- package/dist/src/planner/building/delete.js +116 -34
- package/dist/src/planner/building/delete.js.map +1 -1
- package/dist/src/planner/building/dml-target.d.ts +118 -0
- package/dist/src/planner/building/dml-target.d.ts.map +1 -0
- package/dist/src/planner/building/dml-target.js +282 -0
- package/dist/src/planner/building/dml-target.js.map +1 -0
- package/dist/src/planner/building/drop-index.d.ts.map +1 -1
- package/dist/src/planner/building/drop-index.js +4 -1
- package/dist/src/planner/building/drop-index.js.map +1 -1
- package/dist/src/planner/building/drop-view.d.ts.map +1 -1
- package/dist/src/planner/building/drop-view.js +4 -2
- package/dist/src/planner/building/drop-view.js.map +1 -1
- package/dist/src/planner/building/expression.d.ts.map +1 -1
- package/dist/src/planner/building/expression.js +60 -21
- package/dist/src/planner/building/expression.js.map +1 -1
- package/dist/src/planner/building/foreign-key-builder.d.ts +30 -0
- package/dist/src/planner/building/foreign-key-builder.d.ts.map +1 -1
- package/dist/src/planner/building/foreign-key-builder.js +160 -129
- package/dist/src/planner/building/foreign-key-builder.js.map +1 -1
- package/dist/src/planner/building/insert.d.ts +45 -2
- package/dist/src/planner/building/insert.d.ts.map +1 -1
- package/dist/src/planner/building/insert.js +257 -88
- package/dist/src/planner/building/insert.js.map +1 -1
- package/dist/src/planner/building/lens-auxiliary-access.d.ts +22 -0
- package/dist/src/planner/building/lens-auxiliary-access.d.ts.map +1 -0
- package/dist/src/planner/building/lens-auxiliary-access.js +132 -0
- package/dist/src/planner/building/lens-auxiliary-access.js.map +1 -0
- package/dist/src/planner/building/materialized-view.d.ts +16 -0
- package/dist/src/planner/building/materialized-view.d.ts.map +1 -0
- package/dist/src/planner/building/materialized-view.js +57 -0
- package/dist/src/planner/building/materialized-view.js.map +1 -0
- package/dist/src/planner/building/returning-star.d.ts +32 -0
- package/dist/src/planner/building/returning-star.d.ts.map +1 -0
- package/dist/src/planner/building/returning-star.js +45 -0
- package/dist/src/planner/building/returning-star.js.map +1 -0
- package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
- package/dist/src/planner/building/select-aggregates.js +51 -13
- package/dist/src/planner/building/select-aggregates.js.map +1 -1
- package/dist/src/planner/building/select-compound.d.ts.map +1 -1
- package/dist/src/planner/building/select-compound.js +84 -11
- package/dist/src/planner/building/select-compound.js.map +1 -1
- package/dist/src/planner/building/select-context.d.ts +10 -2
- package/dist/src/planner/building/select-context.d.ts.map +1 -1
- package/dist/src/planner/building/select-context.js +7 -1
- package/dist/src/planner/building/select-context.js.map +1 -1
- package/dist/src/planner/building/select-modifiers.js +6 -0
- package/dist/src/planner/building/select-modifiers.js.map +1 -1
- package/dist/src/planner/building/select-ordinal.d.ts +18 -0
- package/dist/src/planner/building/select-ordinal.d.ts.map +1 -1
- package/dist/src/planner/building/select-ordinal.js +30 -0
- package/dist/src/planner/building/select-ordinal.js.map +1 -1
- package/dist/src/planner/building/select-projections.d.ts +8 -2
- package/dist/src/planner/building/select-projections.d.ts.map +1 -1
- package/dist/src/planner/building/select-projections.js +26 -4
- package/dist/src/planner/building/select-projections.js.map +1 -1
- package/dist/src/planner/building/select-window.d.ts.map +1 -1
- package/dist/src/planner/building/select-window.js +8 -5
- 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 +164 -59
- package/dist/src/planner/building/select.js.map +1 -1
- package/dist/src/planner/building/set-object-tags.d.ts +7 -0
- package/dist/src/planner/building/set-object-tags.d.ts.map +1 -0
- package/dist/src/planner/building/set-object-tags.js +38 -0
- package/dist/src/planner/building/set-object-tags.js.map +1 -0
- package/dist/src/planner/building/tag-diagnostics.d.ts +27 -0
- package/dist/src/planner/building/tag-diagnostics.d.ts.map +1 -0
- package/dist/src/planner/building/tag-diagnostics.js +37 -0
- package/dist/src/planner/building/tag-diagnostics.js.map +1 -0
- package/dist/src/planner/building/update.d.ts +18 -1
- package/dist/src/planner/building/update.d.ts.map +1 -1
- package/dist/src/planner/building/update.js +134 -58
- package/dist/src/planner/building/update.js.map +1 -1
- package/dist/src/planner/building/view-mutation-builder.d.ts +15 -0
- package/dist/src/planner/building/view-mutation-builder.d.ts.map +1 -0
- package/dist/src/planner/building/view-mutation-builder.js +1158 -0
- package/dist/src/planner/building/view-mutation-builder.js.map +1 -0
- package/dist/src/planner/building/with.d.ts +11 -0
- package/dist/src/planner/building/with.d.ts.map +1 -1
- package/dist/src/planner/building/with.js +48 -10
- package/dist/src/planner/building/with.js.map +1 -1
- package/dist/src/planner/cost/index.d.ts +83 -0
- package/dist/src/planner/cost/index.d.ts.map +1 -1
- package/dist/src/planner/cost/index.js +114 -0
- package/dist/src/planner/cost/index.js.map +1 -1
- package/dist/src/planner/framework/characteristics.d.ts +38 -4
- package/dist/src/planner/framework/characteristics.d.ts.map +1 -1
- package/dist/src/planner/framework/characteristics.js +50 -6
- package/dist/src/planner/framework/characteristics.js.map +1 -1
- package/dist/src/planner/framework/pass.d.ts.map +1 -1
- package/dist/src/planner/framework/pass.js +2 -1
- package/dist/src/planner/framework/pass.js.map +1 -1
- package/dist/src/planner/framework/physical-utils.d.ts.map +1 -1
- package/dist/src/planner/framework/physical-utils.js +7 -1
- package/dist/src/planner/framework/physical-utils.js.map +1 -1
- package/dist/src/planner/framework/registry.d.ts +39 -1
- package/dist/src/planner/framework/registry.d.ts.map +1 -1
- package/dist/src/planner/framework/registry.js +18 -2
- package/dist/src/planner/framework/registry.js.map +1 -1
- package/dist/src/planner/mutation/backward-body.d.ts +131 -0
- package/dist/src/planner/mutation/backward-body.d.ts.map +1 -0
- package/dist/src/planner/mutation/backward-body.js +135 -0
- package/dist/src/planner/mutation/backward-body.js.map +1 -0
- package/dist/src/planner/mutation/cte-flatten.d.ts +17 -0
- package/dist/src/planner/mutation/cte-flatten.d.ts.map +1 -0
- package/dist/src/planner/mutation/cte-flatten.js +364 -0
- package/dist/src/planner/mutation/cte-flatten.js.map +1 -0
- package/dist/src/planner/mutation/decomposition.d.ts +273 -0
- package/dist/src/planner/mutation/decomposition.d.ts.map +1 -0
- package/dist/src/planner/mutation/decomposition.js +1719 -0
- package/dist/src/planner/mutation/decomposition.js.map +1 -0
- package/dist/src/planner/mutation/lens-enforcement.d.ts +165 -0
- package/dist/src/planner/mutation/lens-enforcement.d.ts.map +1 -0
- package/dist/src/planner/mutation/lens-enforcement.js +745 -0
- package/dist/src/planner/mutation/lens-enforcement.js.map +1 -0
- package/dist/src/planner/mutation/multi-source.d.ts +568 -0
- package/dist/src/planner/mutation/multi-source.d.ts.map +1 -0
- package/dist/src/planner/mutation/multi-source.js +2915 -0
- package/dist/src/planner/mutation/multi-source.js.map +1 -0
- package/dist/src/planner/mutation/mutation-diagnostic.d.ts +37 -0
- package/dist/src/planner/mutation/mutation-diagnostic.d.ts.map +1 -0
- package/dist/src/planner/mutation/mutation-diagnostic.js +24 -0
- package/dist/src/planner/mutation/mutation-diagnostic.js.map +1 -0
- package/dist/src/planner/mutation/mutation-tags.d.ts +33 -0
- package/dist/src/planner/mutation/mutation-tags.d.ts.map +1 -0
- package/dist/src/planner/mutation/mutation-tags.js +31 -0
- package/dist/src/planner/mutation/mutation-tags.js.map +1 -0
- package/dist/src/planner/mutation/propagate.d.ts +97 -0
- package/dist/src/planner/mutation/propagate.d.ts.map +1 -0
- package/dist/src/planner/mutation/propagate.js +220 -0
- package/dist/src/planner/mutation/propagate.js.map +1 -0
- package/dist/src/planner/mutation/scope-transform.d.ts +181 -0
- package/dist/src/planner/mutation/scope-transform.d.ts.map +1 -0
- package/dist/src/planner/mutation/scope-transform.js +574 -0
- package/dist/src/planner/mutation/scope-transform.js.map +1 -0
- package/dist/src/planner/mutation/set-op.d.ts +242 -0
- package/dist/src/planner/mutation/set-op.d.ts.map +1 -0
- package/dist/src/planner/mutation/set-op.js +1687 -0
- package/dist/src/planner/mutation/set-op.js.map +1 -0
- package/dist/src/planner/mutation/single-source.d.ts +261 -0
- package/dist/src/planner/mutation/single-source.d.ts.map +1 -0
- package/dist/src/planner/mutation/single-source.js +1096 -0
- package/dist/src/planner/mutation/single-source.js.map +1 -0
- package/dist/src/planner/nodes/aggregate-node.d.ts +6 -4
- package/dist/src/planner/nodes/aggregate-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/aggregate-node.js +11 -9
- package/dist/src/planner/nodes/aggregate-node.js.map +1 -1
- package/dist/src/planner/nodes/alias-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/alias-node.js +5 -1
- package/dist/src/planner/nodes/alias-node.js.map +1 -1
- package/dist/src/planner/nodes/alter-table-node.d.ts +124 -1
- package/dist/src/planner/nodes/alter-table-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/alter-table-node.js +27 -0
- package/dist/src/planner/nodes/alter-table-node.js.map +1 -1
- package/dist/src/planner/nodes/analyze-node.d.ts +2 -1
- package/dist/src/planner/nodes/analyze-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/analyze-node.js +21 -1
- package/dist/src/planner/nodes/analyze-node.js.map +1 -1
- package/dist/src/planner/nodes/asserted-keys-node.d.ts +43 -0
- package/dist/src/planner/nodes/asserted-keys-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/asserted-keys-node.js +99 -0
- package/dist/src/planner/nodes/asserted-keys-node.js.map +1 -0
- package/dist/src/planner/nodes/async-gather-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/async-gather-node.js +33 -8
- package/dist/src/planner/nodes/async-gather-node.js.map +1 -1
- package/dist/src/planner/nodes/bloom-join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/bloom-join-node.js +2 -1
- package/dist/src/planner/nodes/bloom-join-node.js.map +1 -1
- package/dist/src/planner/nodes/create-view-node.d.ts +7 -2
- package/dist/src/planner/nodes/create-view-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/create-view-node.js +4 -1
- package/dist/src/planner/nodes/create-view-node.js.map +1 -1
- package/dist/src/planner/nodes/declarative-schema.d.ts +13 -1
- package/dist/src/planner/nodes/declarative-schema.d.ts.map +1 -1
- package/dist/src/planner/nodes/declarative-schema.js +32 -0
- package/dist/src/planner/nodes/declarative-schema.js.map +1 -1
- package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/distinct-node.js +2 -0
- package/dist/src/planner/nodes/distinct-node.js.map +1 -1
- package/dist/src/planner/nodes/dml-executor-node.d.ts +29 -1
- package/dist/src/planner/nodes/dml-executor-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/dml-executor-node.js +27 -3
- package/dist/src/planner/nodes/dml-executor-node.js.map +1 -1
- package/dist/src/planner/nodes/eager-prefetch-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/eager-prefetch-node.js +2 -0
- package/dist/src/planner/nodes/eager-prefetch-node.js.map +1 -1
- package/dist/src/planner/nodes/envelope-scan-node.d.ts +42 -0
- package/dist/src/planner/nodes/envelope-scan-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/envelope-scan-node.js +62 -0
- package/dist/src/planner/nodes/envelope-scan-node.js.map +1 -0
- package/dist/src/planner/nodes/fanout-lookup-join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/fanout-lookup-join-node.js +11 -1
- package/dist/src/planner/nodes/fanout-lookup-join-node.js.map +1 -1
- package/dist/src/planner/nodes/filter.d.ts.map +1 -1
- package/dist/src/planner/nodes/filter.js +63 -13
- package/dist/src/planner/nodes/filter.js.map +1 -1
- package/dist/src/planner/nodes/hash-aggregate.d.ts.map +1 -1
- package/dist/src/planner/nodes/hash-aggregate.js +6 -16
- package/dist/src/planner/nodes/hash-aggregate.js.map +1 -1
- package/dist/src/planner/nodes/join-node.d.ts +41 -1
- package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-node.js +78 -8
- package/dist/src/planner/nodes/join-node.js.map +1 -1
- package/dist/src/planner/nodes/join-utils.d.ts +33 -6
- package/dist/src/planner/nodes/join-utils.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-utils.js +131 -10
- package/dist/src/planner/nodes/join-utils.js.map +1 -1
- package/dist/src/planner/nodes/lens-auxiliary-access-node.d.ts +104 -0
- package/dist/src/planner/nodes/lens-auxiliary-access-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/lens-auxiliary-access-node.js +91 -0
- package/dist/src/planner/nodes/lens-auxiliary-access-node.js.map +1 -0
- package/dist/src/planner/nodes/limit-offset.d.ts +12 -0
- package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
- package/dist/src/planner/nodes/limit-offset.js +52 -3
- package/dist/src/planner/nodes/limit-offset.js.map +1 -1
- package/dist/src/planner/nodes/materialized-view-nodes.d.ts +69 -0
- package/dist/src/planner/nodes/materialized-view-nodes.d.ts.map +1 -0
- package/dist/src/planner/nodes/materialized-view-nodes.js +111 -0
- package/dist/src/planner/nodes/materialized-view-nodes.js.map +1 -0
- package/dist/src/planner/nodes/merge-join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/merge-join-node.js +2 -1
- package/dist/src/planner/nodes/merge-join-node.js.map +1 -1
- package/dist/src/planner/nodes/ordinal-slice-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/ordinal-slice-node.js +2 -0
- package/dist/src/planner/nodes/ordinal-slice-node.js.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.d.ts +9 -0
- package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.js +9 -0
- package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
- package/dist/src/planner/nodes/plan-node.d.ts +265 -5
- package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node.js.map +1 -1
- package/dist/src/planner/nodes/pragma.d.ts +2 -1
- package/dist/src/planner/nodes/pragma.d.ts.map +1 -1
- package/dist/src/planner/nodes/pragma.js +12 -0
- package/dist/src/planner/nodes/pragma.js.map +1 -1
- package/dist/src/planner/nodes/project-node.d.ts +14 -1
- package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/project-node.js +103 -16
- package/dist/src/planner/nodes/project-node.js.map +1 -1
- package/dist/src/planner/nodes/reference.d.ts.map +1 -1
- package/dist/src/planner/nodes/reference.js +63 -30
- package/dist/src/planner/nodes/reference.js.map +1 -1
- package/dist/src/planner/nodes/retrieve-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/retrieve-node.js +7 -0
- package/dist/src/planner/nodes/retrieve-node.js.map +1 -1
- package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/returning-node.js +10 -3
- package/dist/src/planner/nodes/returning-node.js.map +1 -1
- package/dist/src/planner/nodes/scalar.d.ts +20 -0
- package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
- package/dist/src/planner/nodes/scalar.js +71 -14
- package/dist/src/planner/nodes/scalar.js.map +1 -1
- package/dist/src/planner/nodes/set-object-tags-node.d.ts +39 -0
- package/dist/src/planner/nodes/set-object-tags-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/set-object-tags-node.js +41 -0
- package/dist/src/planner/nodes/set-object-tags-node.js.map +1 -0
- package/dist/src/planner/nodes/set-operation-node.d.ts +123 -1
- package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/set-operation-node.js +302 -18
- package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
- package/dist/src/planner/nodes/single-row.d.ts.map +1 -1
- package/dist/src/planner/nodes/single-row.js +3 -0
- package/dist/src/planner/nodes/single-row.js.map +1 -1
- package/dist/src/planner/nodes/sort.d.ts.map +1 -1
- package/dist/src/planner/nodes/sort.js +8 -7
- 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 +8 -23
- package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
- package/dist/src/planner/nodes/subquery.d.ts +2 -0
- package/dist/src/planner/nodes/subquery.d.ts.map +1 -1
- package/dist/src/planner/nodes/subquery.js +18 -2
- package/dist/src/planner/nodes/subquery.js.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.js +23 -3
- package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
- package/dist/src/planner/nodes/table-function-call.js +6 -0
- package/dist/src/planner/nodes/table-function-call.js.map +1 -1
- package/dist/src/planner/nodes/values-node.d.ts +3 -1
- package/dist/src/planner/nodes/values-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/values-node.js +26 -0
- package/dist/src/planner/nodes/values-node.js.map +1 -1
- package/dist/src/planner/nodes/view-mutation-node.d.ts +259 -0
- package/dist/src/planner/nodes/view-mutation-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/view-mutation-node.js +273 -0
- package/dist/src/planner/nodes/view-mutation-node.js.map +1 -0
- package/dist/src/planner/nodes/window-function.d.ts +17 -1
- package/dist/src/planner/nodes/window-function.d.ts.map +1 -1
- package/dist/src/planner/nodes/window-function.js +15 -1
- package/dist/src/planner/nodes/window-function.js.map +1 -1
- package/dist/src/planner/nodes/window-node.js +3 -3
- 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 +372 -39
- package/dist/src/planner/optimizer.js.map +1 -1
- package/dist/src/planner/planning-context.d.ts +1 -1
- package/dist/src/planner/planning-context.d.ts.map +1 -1
- package/dist/src/planner/rules/access/lens-access-form-matcher.d.ts +70 -0
- package/dist/src/planner/rules/access/lens-access-form-matcher.d.ts.map +1 -0
- package/dist/src/planner/rules/access/lens-access-form-matcher.js +156 -0
- package/dist/src/planner/rules/access/lens-access-form-matcher.js.map +1 -0
- package/dist/src/planner/rules/access/rule-lens-auxiliary-access.d.ts +31 -0
- package/dist/src/planner/rules/access/rule-lens-auxiliary-access.d.ts.map +1 -0
- package/dist/src/planner/rules/access/rule-lens-auxiliary-access.js +176 -0
- package/dist/src/planner/rules/access/rule-lens-auxiliary-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 +435 -37
- 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 +8 -27
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts +9 -3
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js +56 -5
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js.map +1 -1
- package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.d.ts +39 -0
- package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.d.ts.map +1 -0
- package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.js +616 -0
- package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.js.map +1 -0
- package/dist/src/planner/rules/cache/rule-scalar-cse.d.ts.map +1 -1
- package/dist/src/planner/rules/cache/rule-scalar-cse.js +8 -1
- package/dist/src/planner/rules/cache/rule-scalar-cse.js.map +1 -1
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.d.ts +8 -7
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.d.ts.map +1 -1
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.js +14 -21
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.js.map +1 -1
- package/dist/src/planner/rules/join/equi-pair-extractor.d.ts +36 -0
- package/dist/src/planner/rules/join/equi-pair-extractor.d.ts.map +1 -1
- package/dist/src/planner/rules/join/equi-pair-extractor.js +42 -5
- package/dist/src/planner/rules/join/equi-pair-extractor.js.map +1 -1
- package/dist/src/planner/rules/join/rule-fanout-batched-outer.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-fanout-batched-outer.js +10 -0
- package/dist/src/planner/rules/join/rule-fanout-batched-outer.js.map +1 -1
- package/dist/src/planner/rules/join/rule-fanout-lookup-join.js +25 -9
- package/dist/src/planner/rules/join/rule-fanout-lookup-join.js.map +1 -1
- package/dist/src/planner/rules/join/rule-inner-join-existence-recovery.d.ts +130 -0
- package/dist/src/planner/rules/join/rule-inner-join-existence-recovery.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-inner-join-existence-recovery.js +206 -0
- package/dist/src/planner/rules/join/rule-inner-join-existence-recovery.js.map +1 -0
- package/dist/src/planner/rules/join/rule-join-elimination.d.ts +67 -14
- package/dist/src/planner/rules/join/rule-join-elimination.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-join-elimination.js +81 -25
- package/dist/src/planner/rules/join/rule-join-elimination.js.map +1 -1
- package/dist/src/planner/rules/join/rule-join-existence-pruning.d.ts +84 -0
- package/dist/src/planner/rules/join/rule-join-existence-pruning.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-join-existence-pruning.js +138 -0
- package/dist/src/planner/rules/join/rule-join-existence-pruning.js.map +1 -0
- package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-join-greedy-commute.js +19 -1
- package/dist/src/planner/rules/join/rule-join-greedy-commute.js.map +1 -1
- 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 +14 -2
- 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.map +1 -1
- package/dist/src/planner/rules/join/rule-lateral-top1-asof.js +5 -2
- package/dist/src/planner/rules/join/rule-lateral-top1-asof.js.map +1 -1
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.js +4 -0
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.js.map +1 -1
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.js +10 -0
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.js.map +1 -1
- package/dist/src/planner/rules/join/rule-semijoin-existence-recovery.d.ts +286 -0
- package/dist/src/planner/rules/join/rule-semijoin-existence-recovery.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-semijoin-existence-recovery.js +548 -0
- package/dist/src/planner/rules/join/rule-semijoin-existence-recovery.js.map +1 -0
- package/dist/src/planner/rules/parallel/rule-async-gather-union-all.d.ts.map +1 -1
- package/dist/src/planner/rules/parallel/rule-async-gather-union-all.js +9 -1
- package/dist/src/planner/rules/parallel/rule-async-gather-union-all.js.map +1 -1
- package/dist/src/planner/rules/parallel/rule-async-gather-zip-by-key.d.ts.map +1 -1
- package/dist/src/planner/rules/parallel/rule-async-gather-zip-by-key.js +7 -0
- package/dist/src/planner/rules/parallel/rule-async-gather-zip-by-key.js.map +1 -1
- package/dist/src/planner/rules/parallel/rule-eager-prefetch-probe.d.ts.map +1 -1
- package/dist/src/planner/rules/parallel/rule-eager-prefetch-probe.js +10 -1
- package/dist/src/planner/rules/parallel/rule-eager-prefetch-probe.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.d.ts.map +1 -1
- package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js +10 -1
- package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-empty-relation-folding.d.ts.map +1 -1
- package/dist/src/planner/rules/predicate/rule-empty-relation-folding.js +18 -0
- package/dist/src/planner/rules/predicate/rule-empty-relation-folding.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-filter-contradiction.d.ts.map +1 -1
- package/dist/src/planner/rules/predicate/rule-filter-contradiction.js +7 -0
- package/dist/src/planner/rules/predicate/rule-filter-contradiction.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.d.ts.map +1 -1
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js +9 -0
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js +13 -3
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js.map +1 -1
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js +2 -2
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +1 -1
- package/dist/src/planner/rules/retrieve/rule-projection-pruning.d.ts.map +1 -1
- package/dist/src/planner/rules/retrieve/rule-projection-pruning.js +14 -0
- package/dist/src/planner/rules/retrieve/rule-projection-pruning.js.map +1 -1
- package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.d.ts +16 -0
- package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.d.ts.map +1 -1
- package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.js +47 -4
- package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.js.map +1 -1
- package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.d.ts.map +1 -1
- package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js +8 -0
- package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js.map +1 -1
- package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.d.ts.map +1 -1
- package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js +7 -0
- package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.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 +12 -0
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js.map +1 -1
- package/dist/src/planner/rules/window/rule-monotonic-window.js +1 -1
- package/dist/src/planner/rules/window/rule-monotonic-window.js.map +1 -1
- package/dist/src/planner/type-utils.d.ts +14 -0
- package/dist/src/planner/type-utils.d.ts.map +1 -1
- package/dist/src/planner/type-utils.js +66 -21
- package/dist/src/planner/type-utils.js.map +1 -1
- package/dist/src/planner/util/fd-utils.d.ts +228 -36
- package/dist/src/planner/util/fd-utils.d.ts.map +1 -1
- package/dist/src/planner/util/fd-utils.js +501 -84
- package/dist/src/planner/util/fd-utils.js.map +1 -1
- package/dist/src/planner/util/ind-utils.d.ts +27 -1
- package/dist/src/planner/util/ind-utils.d.ts.map +1 -1
- package/dist/src/planner/util/ind-utils.js +80 -6
- package/dist/src/planner/util/ind-utils.js.map +1 -1
- package/dist/src/planner/util/key-utils.d.ts +26 -3
- package/dist/src/planner/util/key-utils.d.ts.map +1 -1
- package/dist/src/planner/util/key-utils.js +182 -33
- package/dist/src/planner/util/key-utils.js.map +1 -1
- package/dist/src/planner/util/set-op-wrapper.d.ts +37 -0
- package/dist/src/planner/util/set-op-wrapper.d.ts.map +1 -0
- package/dist/src/planner/util/set-op-wrapper.js +82 -0
- package/dist/src/planner/util/set-op-wrapper.js.map +1 -0
- package/dist/src/planner/validation/plan-validator.d.ts.map +1 -1
- package/dist/src/planner/validation/plan-validator.js +1 -0
- package/dist/src/planner/validation/plan-validator.js.map +1 -1
- package/dist/src/runtime/context-helpers.d.ts +13 -1
- package/dist/src/runtime/context-helpers.d.ts.map +1 -1
- package/dist/src/runtime/context-helpers.js +7 -1
- package/dist/src/runtime/context-helpers.js.map +1 -1
- package/dist/src/runtime/delta-executor.d.ts +30 -1
- package/dist/src/runtime/delta-executor.d.ts.map +1 -1
- package/dist/src/runtime/delta-executor.js +38 -4
- package/dist/src/runtime/delta-executor.js.map +1 -1
- package/dist/src/runtime/emit/add-constraint.d.ts.map +1 -1
- package/dist/src/runtime/emit/add-constraint.js +38 -5
- package/dist/src/runtime/emit/add-constraint.js.map +1 -1
- package/dist/src/runtime/emit/aggregate.d.ts.map +1 -1
- package/dist/src/runtime/emit/aggregate.js +10 -8
- package/dist/src/runtime/emit/aggregate.js.map +1 -1
- package/dist/src/runtime/emit/alter-table.d.ts +1 -1
- package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
- package/dist/src/runtime/emit/alter-table.js +664 -108
- package/dist/src/runtime/emit/alter-table.js.map +1 -1
- package/dist/src/runtime/emit/analyze.d.ts.map +1 -1
- package/dist/src/runtime/emit/analyze.js +2 -1
- package/dist/src/runtime/emit/analyze.js.map +1 -1
- package/dist/src/runtime/emit/asof-scan.d.ts.map +1 -1
- package/dist/src/runtime/emit/asof-scan.js +24 -9
- package/dist/src/runtime/emit/asof-scan.js.map +1 -1
- package/dist/src/runtime/emit/asserted-keys.d.ts +13 -0
- package/dist/src/runtime/emit/asserted-keys.d.ts.map +1 -0
- package/dist/src/runtime/emit/asserted-keys.js +13 -0
- package/dist/src/runtime/emit/asserted-keys.js.map +1 -0
- package/dist/src/runtime/emit/between.d.ts.map +1 -1
- package/dist/src/runtime/emit/between.js +24 -19
- 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 +24 -36
- package/dist/src/runtime/emit/binary.js.map +1 -1
- package/dist/src/runtime/emit/block.d.ts.map +1 -1
- package/dist/src/runtime/emit/block.js +11 -2
- package/dist/src/runtime/emit/block.js.map +1 -1
- package/dist/src/runtime/emit/bloom-join.d.ts.map +1 -1
- package/dist/src/runtime/emit/bloom-join.js +12 -4
- package/dist/src/runtime/emit/bloom-join.js.map +1 -1
- package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
- package/dist/src/runtime/emit/constraint-check.js +50 -1
- package/dist/src/runtime/emit/constraint-check.js.map +1 -1
- package/dist/src/runtime/emit/create-table.d.ts.map +1 -1
- package/dist/src/runtime/emit/create-table.js +8 -0
- package/dist/src/runtime/emit/create-table.js.map +1 -1
- package/dist/src/runtime/emit/create-view.d.ts.map +1 -1
- package/dist/src/runtime/emit/create-view.js +16 -1
- package/dist/src/runtime/emit/create-view.js.map +1 -1
- package/dist/src/runtime/emit/delete.d.ts.map +1 -1
- package/dist/src/runtime/emit/delete.js +15 -5
- package/dist/src/runtime/emit/delete.js.map +1 -1
- package/dist/src/runtime/emit/dml-executor.d.ts +27 -0
- package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
- package/dist/src/runtime/emit/dml-executor.js +413 -193
- package/dist/src/runtime/emit/dml-executor.js.map +1 -1
- package/dist/src/runtime/emit/drop-table.d.ts.map +1 -1
- package/dist/src/runtime/emit/drop-table.js +10 -0
- package/dist/src/runtime/emit/drop-table.js.map +1 -1
- package/dist/src/runtime/emit/drop-view.d.ts.map +1 -1
- package/dist/src/runtime/emit/drop-view.js +17 -0
- package/dist/src/runtime/emit/drop-view.js.map +1 -1
- package/dist/src/runtime/emit/envelope-scan.d.ts +13 -0
- package/dist/src/runtime/emit/envelope-scan.d.ts.map +1 -0
- package/dist/src/runtime/emit/envelope-scan.js +22 -0
- package/dist/src/runtime/emit/envelope-scan.js.map +1 -0
- package/dist/src/runtime/emit/join.d.ts +10 -2
- package/dist/src/runtime/emit/join.d.ts.map +1 -1
- package/dist/src/runtime/emit/join.js +128 -38
- package/dist/src/runtime/emit/join.js.map +1 -1
- package/dist/src/runtime/emit/lens-auxiliary-access.d.ts +16 -0
- package/dist/src/runtime/emit/lens-auxiliary-access.d.ts.map +1 -0
- package/dist/src/runtime/emit/lens-auxiliary-access.js +16 -0
- package/dist/src/runtime/emit/lens-auxiliary-access.js.map +1 -0
- package/dist/src/runtime/emit/materialized-view-helpers.d.ts +640 -0
- package/dist/src/runtime/emit/materialized-view-helpers.d.ts.map +1 -0
- package/dist/src/runtime/emit/materialized-view-helpers.js +2576 -0
- package/dist/src/runtime/emit/materialized-view-helpers.js.map +1 -0
- package/dist/src/runtime/emit/materialized-view.d.ts +31 -0
- package/dist/src/runtime/emit/materialized-view.d.ts.map +1 -0
- package/dist/src/runtime/emit/materialized-view.js +187 -0
- package/dist/src/runtime/emit/materialized-view.js.map +1 -0
- package/dist/src/runtime/emit/merge-join.d.ts.map +1 -1
- package/dist/src/runtime/emit/merge-join.js +19 -5
- package/dist/src/runtime/emit/merge-join.js.map +1 -1
- package/dist/src/runtime/emit/project.d.ts.map +1 -1
- package/dist/src/runtime/emit/project.js +10 -5
- package/dist/src/runtime/emit/project.js.map +1 -1
- package/dist/src/runtime/emit/schema-declarative.d.ts +1 -0
- package/dist/src/runtime/emit/schema-declarative.d.ts.map +1 -1
- package/dist/src/runtime/emit/schema-declarative.js +101 -5
- package/dist/src/runtime/emit/schema-declarative.js.map +1 -1
- package/dist/src/runtime/emit/set-object-tags.d.ts +16 -0
- package/dist/src/runtime/emit/set-object-tags.d.ts.map +1 -0
- package/dist/src/runtime/emit/set-object-tags.js +57 -0
- package/dist/src/runtime/emit/set-object-tags.js.map +1 -0
- package/dist/src/runtime/emit/set-operation.d.ts.map +1 -1
- package/dist/src/runtime/emit/set-operation.js +140 -24
- package/dist/src/runtime/emit/set-operation.js.map +1 -1
- package/dist/src/runtime/emit/subquery.d.ts.map +1 -1
- package/dist/src/runtime/emit/subquery.js +110 -5
- package/dist/src/runtime/emit/subquery.js.map +1 -1
- package/dist/src/runtime/emit/unary.d.ts.map +1 -1
- package/dist/src/runtime/emit/unary.js +34 -6
- package/dist/src/runtime/emit/unary.js.map +1 -1
- package/dist/src/runtime/emit/view-mutation.d.ts +70 -0
- package/dist/src/runtime/emit/view-mutation.d.ts.map +1 -0
- package/dist/src/runtime/emit/view-mutation.js +299 -0
- package/dist/src/runtime/emit/view-mutation.js.map +1 -0
- package/dist/src/runtime/emit/window.js +29 -5
- package/dist/src/runtime/emit/window.js.map +1 -1
- package/dist/src/runtime/foreign-key-actions.d.ts +66 -3
- package/dist/src/runtime/foreign-key-actions.d.ts.map +1 -1
- package/dist/src/runtime/foreign-key-actions.js +580 -172
- package/dist/src/runtime/foreign-key-actions.js.map +1 -1
- package/dist/src/runtime/parallel-driver.d.ts +4 -1
- package/dist/src/runtime/parallel-driver.d.ts.map +1 -1
- package/dist/src/runtime/parallel-driver.js +5 -1
- package/dist/src/runtime/parallel-driver.js.map +1 -1
- package/dist/src/runtime/register.d.ts.map +1 -1
- package/dist/src/runtime/register.js +17 -1
- package/dist/src/runtime/register.js.map +1 -1
- package/dist/src/runtime/types.d.ts +10 -0
- package/dist/src/runtime/types.d.ts.map +1 -1
- package/dist/src/runtime/types.js.map +1 -1
- package/dist/src/schema/basis-backfill.d.ts +63 -0
- package/dist/src/schema/basis-backfill.d.ts.map +1 -0
- package/dist/src/schema/basis-backfill.js +161 -0
- package/dist/src/schema/basis-backfill.js.map +1 -0
- package/dist/src/schema/catalog.d.ts +115 -1
- package/dist/src/schema/catalog.d.ts.map +1 -1
- package/dist/src/schema/catalog.js +249 -22
- package/dist/src/schema/catalog.js.map +1 -1
- package/dist/src/schema/change-events.d.ts +42 -1
- 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 +16 -0
- package/dist/src/schema/column.d.ts.map +1 -1
- package/dist/src/schema/column.js.map +1 -1
- package/dist/src/schema/constraint-builder.d.ts +182 -0
- package/dist/src/schema/constraint-builder.d.ts.map +1 -0
- package/dist/src/schema/constraint-builder.js +424 -0
- package/dist/src/schema/constraint-builder.js.map +1 -0
- package/dist/src/schema/ddl-generator.d.ts +86 -1
- package/dist/src/schema/ddl-generator.d.ts.map +1 -1
- package/dist/src/schema/ddl-generator.js +316 -20
- package/dist/src/schema/ddl-generator.js.map +1 -1
- package/dist/src/schema/declared-schema-manager.d.ts +51 -0
- package/dist/src/schema/declared-schema-manager.d.ts.map +1 -1
- package/dist/src/schema/declared-schema-manager.js +61 -0
- package/dist/src/schema/declared-schema-manager.js.map +1 -1
- package/dist/src/schema/derivation.d.ts +106 -0
- package/dist/src/schema/derivation.d.ts.map +1 -0
- package/dist/src/schema/derivation.js +25 -0
- package/dist/src/schema/derivation.js.map +1 -0
- package/dist/src/schema/function.d.ts +13 -0
- package/dist/src/schema/function.d.ts.map +1 -1
- package/dist/src/schema/function.js.map +1 -1
- package/dist/src/schema/lens-ack.d.ts +90 -0
- package/dist/src/schema/lens-ack.d.ts.map +1 -0
- package/dist/src/schema/lens-ack.js +361 -0
- package/dist/src/schema/lens-ack.js.map +1 -0
- package/dist/src/schema/lens-compiler.d.ts +62 -0
- package/dist/src/schema/lens-compiler.d.ts.map +1 -0
- package/dist/src/schema/lens-compiler.js +1594 -0
- package/dist/src/schema/lens-compiler.js.map +1 -0
- package/dist/src/schema/lens-fk-discovery.d.ts +175 -0
- package/dist/src/schema/lens-fk-discovery.d.ts.map +1 -0
- package/dist/src/schema/lens-fk-discovery.js +336 -0
- package/dist/src/schema/lens-fk-discovery.js.map +1 -0
- package/dist/src/schema/lens-prover.d.ts +336 -0
- package/dist/src/schema/lens-prover.d.ts.map +1 -0
- package/dist/src/schema/lens-prover.js +1988 -0
- package/dist/src/schema/lens-prover.js.map +1 -0
- package/dist/src/schema/lens.d.ts +254 -0
- package/dist/src/schema/lens.d.ts.map +1 -0
- package/dist/src/schema/lens.js +21 -0
- package/dist/src/schema/lens.js.map +1 -0
- package/dist/src/schema/manager.d.ts +676 -18
- package/dist/src/schema/manager.d.ts.map +1 -1
- package/dist/src/schema/manager.js +1573 -238
- package/dist/src/schema/manager.js.map +1 -1
- package/dist/src/schema/mapping-advertisement-tags.d.ts +39 -0
- package/dist/src/schema/mapping-advertisement-tags.d.ts.map +1 -0
- package/dist/src/schema/mapping-advertisement-tags.js +216 -0
- package/dist/src/schema/mapping-advertisement-tags.js.map +1 -0
- package/dist/src/schema/rename-rewriter.d.ts +45 -4
- package/dist/src/schema/rename-rewriter.d.ts.map +1 -1
- package/dist/src/schema/rename-rewriter.js +412 -19
- package/dist/src/schema/rename-rewriter.js.map +1 -1
- package/dist/src/schema/reserved-tags-policy.d.ts +32 -0
- package/dist/src/schema/reserved-tags-policy.d.ts.map +1 -0
- package/dist/src/schema/reserved-tags-policy.js +34 -0
- package/dist/src/schema/reserved-tags-policy.js.map +1 -0
- package/dist/src/schema/reserved-tags.d.ts +170 -0
- package/dist/src/schema/reserved-tags.d.ts.map +1 -0
- package/dist/src/schema/reserved-tags.js +507 -0
- package/dist/src/schema/reserved-tags.js.map +1 -0
- package/dist/src/schema/schema-differ.d.ts +158 -2
- package/dist/src/schema/schema-differ.d.ts.map +1 -1
- package/dist/src/schema/schema-differ.js +1460 -78
- package/dist/src/schema/schema-differ.js.map +1 -1
- package/dist/src/schema/schema-hasher.d.ts +8 -3
- package/dist/src/schema/schema-hasher.d.ts.map +1 -1
- package/dist/src/schema/schema-hasher.js +22 -2
- package/dist/src/schema/schema-hasher.js.map +1 -1
- package/dist/src/schema/schema.d.ts +25 -1
- package/dist/src/schema/schema.d.ts.map +1 -1
- package/dist/src/schema/schema.js +36 -2
- package/dist/src/schema/schema.js.map +1 -1
- package/dist/src/schema/table.d.ts +259 -10
- package/dist/src/schema/table.d.ts.map +1 -1
- package/dist/src/schema/table.js +309 -26
- package/dist/src/schema/table.js.map +1 -1
- package/dist/src/schema/unique-enforcement.d.ts +78 -0
- package/dist/src/schema/unique-enforcement.d.ts.map +1 -0
- package/dist/src/schema/unique-enforcement.js +93 -0
- package/dist/src/schema/unique-enforcement.js.map +1 -0
- package/dist/src/schema/view.d.ts +83 -2
- package/dist/src/schema/view.d.ts.map +1 -1
- package/dist/src/schema/view.js +67 -1
- package/dist/src/schema/view.js.map +1 -1
- package/dist/src/schema/window-function.d.ts +9 -1
- package/dist/src/schema/window-function.d.ts.map +1 -1
- package/dist/src/schema/window-function.js.map +1 -1
- package/dist/src/types/temporal-types.d.ts.map +1 -1
- package/dist/src/types/temporal-types.js +71 -36
- package/dist/src/types/temporal-types.js.map +1 -1
- package/dist/src/util/comparison.d.ts +24 -0
- package/dist/src/util/comparison.d.ts.map +1 -1
- package/dist/src/util/comparison.js +34 -0
- package/dist/src/util/comparison.js.map +1 -1
- package/dist/src/util/mutation-statement.d.ts.map +1 -1
- package/dist/src/util/mutation-statement.js +4 -1
- package/dist/src/util/mutation-statement.js.map +1 -1
- package/dist/src/util/serialization.d.ts +9 -0
- package/dist/src/util/serialization.d.ts.map +1 -1
- package/dist/src/util/serialization.js +26 -0
- package/dist/src/util/serialization.js.map +1 -1
- package/dist/src/vtab/backing-host.d.ts +286 -0
- package/dist/src/vtab/backing-host.d.ts.map +1 -0
- package/dist/src/vtab/backing-host.js +118 -0
- package/dist/src/vtab/backing-host.js.map +1 -0
- package/dist/src/vtab/best-access-plan.d.ts +21 -0
- package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
- package/dist/src/vtab/best-access-plan.js.map +1 -1
- package/dist/src/vtab/capabilities.d.ts +5 -5
- package/dist/src/vtab/capabilities.d.ts.map +1 -1
- package/dist/src/vtab/mapping-advertisement.d.ts +163 -0
- package/dist/src/vtab/mapping-advertisement.d.ts.map +1 -0
- package/dist/src/vtab/mapping-advertisement.js +2 -0
- package/dist/src/vtab/mapping-advertisement.js.map +1 -0
- package/dist/src/vtab/memory/index.d.ts +64 -4
- package/dist/src/vtab/memory/index.d.ts.map +1 -1
- package/dist/src/vtab/memory/index.js +119 -12
- package/dist/src/vtab/memory/index.js.map +1 -1
- package/dist/src/vtab/memory/layer/base.d.ts +38 -1
- package/dist/src/vtab/memory/layer/base.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/base.js +112 -24
- package/dist/src/vtab/memory/layer/base.js.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts +291 -4
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +1050 -91
- package/dist/src/vtab/memory/layer/manager.js.map +1 -1
- package/dist/src/vtab/memory/layer/plan-filter.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/plan-filter.js +35 -6
- package/dist/src/vtab/memory/layer/plan-filter.js.map +1 -1
- package/dist/src/vtab/memory/layer/scan-layer.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/scan-layer.js +66 -14
- package/dist/src/vtab/memory/layer/scan-layer.js.map +1 -1
- package/dist/src/vtab/memory/layer/scan-plan.d.ts +14 -0
- package/dist/src/vtab/memory/layer/scan-plan.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/scan-plan.js +27 -4
- package/dist/src/vtab/memory/layer/scan-plan.js.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.js +5 -1
- package/dist/src/vtab/memory/layer/transaction.js.map +1 -1
- package/dist/src/vtab/memory/module.d.ts +17 -0
- package/dist/src/vtab/memory/module.d.ts.map +1 -1
- package/dist/src/vtab/memory/module.js +82 -3
- package/dist/src/vtab/memory/module.js.map +1 -1
- package/dist/src/vtab/memory/table.d.ts.map +1 -1
- package/dist/src/vtab/memory/table.js +15 -5
- package/dist/src/vtab/memory/table.js.map +1 -1
- package/dist/src/vtab/memory/types.d.ts +20 -2
- package/dist/src/vtab/memory/types.d.ts.map +1 -1
- package/dist/src/vtab/memory/utils/predicate.d.ts.map +1 -1
- package/dist/src/vtab/memory/utils/predicate.js +46 -24
- package/dist/src/vtab/memory/utils/predicate.js.map +1 -1
- package/dist/src/vtab/memory/utils/primary-key-encode.d.ts +31 -0
- package/dist/src/vtab/memory/utils/primary-key-encode.d.ts.map +1 -0
- package/dist/src/vtab/memory/utils/primary-key-encode.js +101 -0
- package/dist/src/vtab/memory/utils/primary-key-encode.js.map +1 -0
- package/dist/src/vtab/memory/utils/primary-key.d.ts +8 -0
- package/dist/src/vtab/memory/utils/primary-key.d.ts.map +1 -1
- package/dist/src/vtab/memory/utils/primary-key.js +12 -5
- package/dist/src/vtab/memory/utils/primary-key.js.map +1 -1
- package/dist/src/vtab/module.d.ts +203 -4
- 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 +6 -5
|
@@ -5,10 +5,11 @@ import { getVTable, disconnectVTable } from '../utils.js';
|
|
|
5
5
|
import { ConflictResolution } from '../../common/constants.js';
|
|
6
6
|
import { extractOldRowFromFlat, extractNewRowFromFlat } from '../../util/row-descriptor.js';
|
|
7
7
|
import { buildInsertStatement, buildUpdateStatement, buildDeleteStatement } from '../../util/mutation-statement.js';
|
|
8
|
+
import { isMaintainedTable } from '../../schema/derivation.js';
|
|
8
9
|
import { hasNativeEventSupport } from '../../util/event-support.js';
|
|
9
10
|
import { sqlValuesEqual } from '../../util/comparison.js';
|
|
10
11
|
import { withAsyncRowContext } from '../context-helpers.js';
|
|
11
|
-
import {
|
|
12
|
+
import { executeForeignKeyActionsAndLens, assertTransitiveRestrictsForParentMutation } from '../foreign-key-actions.js';
|
|
12
13
|
/**
|
|
13
14
|
* Module-scope counter producing unique statement-savepoint names across
|
|
14
15
|
* concurrent emissions. Names must be unique within the TransactionManager's
|
|
@@ -16,6 +17,19 @@ import { executeForeignKeyActions, assertTransitiveRestrictsForParentMutation }
|
|
|
16
17
|
* (e.g. FK cascade during the parent insert).
|
|
17
18
|
*/
|
|
18
19
|
let stmtSavepointCounter = 0;
|
|
20
|
+
/**
|
|
21
|
+
* Returns true when the table's owning *module* natively emits data events.
|
|
22
|
+
* The gate must consult the MODULE, not the vtab instance: StoreModule exposes
|
|
23
|
+
* getEventEmitter only at the module level — its table instances do not — so an
|
|
24
|
+
* instance check spuriously reports "no native support" and the engine double-emits
|
|
25
|
+
* alongside the module's native emitter. Mirrors the schema-event gate in
|
|
26
|
+
* schema/manager.ts (emitAutoSchemaEventIfNeeded).
|
|
27
|
+
*/
|
|
28
|
+
function moduleHasNativeDataEvents(ctx, tableSchema) {
|
|
29
|
+
const moduleName = tableSchema.vtabModuleName;
|
|
30
|
+
const moduleReg = moduleName ? ctx.db._getVtabModule(moduleName) : undefined;
|
|
31
|
+
return hasNativeEventSupport(moduleReg?.module);
|
|
32
|
+
}
|
|
19
33
|
/**
|
|
20
34
|
* Emit an automatic data change event for modules without native event support.
|
|
21
35
|
*/
|
|
@@ -31,8 +45,82 @@ function emitAutoDataEvent(ctx, tableSchema, type, key, oldRow, newRow, changedC
|
|
|
31
45
|
remote: false, // Auto-emitted events are always local
|
|
32
46
|
});
|
|
33
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Synchronously drive row-time (write-through) materialized-view maintenance for
|
|
50
|
+
* one source row-write, immediately after the change is recorded. A no-op fast
|
|
51
|
+
* path (one synchronous map lookup) when no `row-time` MV depends on `tableKey`,
|
|
52
|
+
* so non-covered tables pay effectively nothing. The maintenance writes the
|
|
53
|
+
* covering MV's backing table within the same transaction (visible mid-statement;
|
|
54
|
+
* committed/rolled-back in lockstep with this write) — see
|
|
55
|
+
* `core/database-materialized-views.ts` § row-time write-through.
|
|
56
|
+
*
|
|
57
|
+
* `cache` is the per-statement {@link BackingConnectionCache} the generator owns: it
|
|
58
|
+
* amortizes the backing-connection resolution over the whole statement (one scan per
|
|
59
|
+
* backing instead of one per source row) while still applying each bounded-delta arm's
|
|
60
|
+
* ops immediately, so within-statement enforcement visibility is unchanged.
|
|
61
|
+
*
|
|
62
|
+
* `deferred` is the per-statement deferred-rebuild set the generator owns: a full-rebuild
|
|
63
|
+
* covering MV is marked dirty here (not applied per row) and rebuilt once at the
|
|
64
|
+
* end-of-statement flush ({@link runWithStatementSavepoints}). Bounded-delta arms stay
|
|
65
|
+
* per-row-immediate.
|
|
66
|
+
*/
|
|
67
|
+
async function maintainRowTimeStructures(ctx, tableKey, change, cache, deferred) {
|
|
68
|
+
if (!ctx.db._hasRowTimeCoveringStructures(tableKey))
|
|
69
|
+
return;
|
|
70
|
+
await ctx.db._maintainRowTimeCoveringStructures(tableKey, change, cache, deferred);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Evaluate the per-statement mutation-context evaluators once, producing the
|
|
74
|
+
* context row passed to the mutation-statement builders (or undefined when
|
|
75
|
+
* there are no context evaluators). Shared by all three DML generators.
|
|
76
|
+
*/
|
|
77
|
+
async function evaluateContextRow(ctx, contextEvaluators) {
|
|
78
|
+
if (contextEvaluators.length === 0)
|
|
79
|
+
return undefined;
|
|
80
|
+
const contextRow = [];
|
|
81
|
+
for (const evaluator of contextEvaluators) {
|
|
82
|
+
contextRow.push(await evaluator(ctx));
|
|
83
|
+
}
|
|
84
|
+
return contextRow;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Engine-level READONLY backstop for maintained tables — the defense-in-depth
|
|
88
|
+
* second net behind plan-time write-through dispatch.
|
|
89
|
+
*
|
|
90
|
+
* A maintained table's rows are *derived* (it carries a {@link TableDerivation};
|
|
91
|
+
* `schema/derivation.ts`). The only engine surfaces permitted to write them are
|
|
92
|
+
* the privileged backing-host paths (`applyMaintenance` / `replaceContents`, the
|
|
93
|
+
* attach/refresh reconcile, the store rehydrate-refill, the isolation flush
|
|
94
|
+
* `trustedWrite`) — none of which route through the DML executor. User DML naming
|
|
95
|
+
* a maintained table is rewritten to **write-through** against the body's base
|
|
96
|
+
* source at plan time (the three DML builders' view-mutation dispatch + the
|
|
97
|
+
* resolved-schema backstop), so a `DmlExecutorNode` whose target still carries a
|
|
98
|
+
* derivation can only be a plan-time mis-dispatch — a direct-write plan that
|
|
99
|
+
* would silently diverge the derived contents from the source. This converts that
|
|
100
|
+
* whole bug class into a loud READONLY error at emit time.
|
|
101
|
+
*
|
|
102
|
+
* Keyed structurally on `derivation` presence ({@link isMaintainedTable}) — never
|
|
103
|
+
* on the table name. Emit-time (a single prepare-time check), not per-row: zero
|
|
104
|
+
* runtime cost, and re-checked on every re-plan because `set / drop maintained`
|
|
105
|
+
* invalidate the `'table'` statement-cache dependency. Exported so a spec test can
|
|
106
|
+
* exercise it directly with a derivation-bearing schema: the backstop is
|
|
107
|
+
* deliberately unreachable from SQL (plan-time dispatch routes every reachable
|
|
108
|
+
* spelling away from it), so the exported guard plus the one wiring call site is
|
|
109
|
+
* the honest pin.
|
|
110
|
+
*/
|
|
111
|
+
export function assertNotMaintainedTableTarget(tableSchema) {
|
|
112
|
+
if (isMaintainedTable(tableSchema)) {
|
|
113
|
+
throw new QuereusError(`table '${tableSchema.schemaName}.${tableSchema.name}' is a maintained table — its contents are derived `
|
|
114
|
+
+ `and may not be written directly (user DML routes through write-through; this plan bypassed the dispatch — engine bug)`, StatusCode.READONLY);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
34
117
|
export function emitDmlExecutor(plan, ctx) {
|
|
35
118
|
const tableSchema = plan.table.tableSchema;
|
|
119
|
+
// READONLY backstop: a DmlExecutorNode targeting a maintained table is a
|
|
120
|
+
// plan-time mis-dispatch (user DML should have been rewritten to write-through
|
|
121
|
+
// against the base source). Reject loudly rather than letting a direct write
|
|
122
|
+
// silently diverge the derived contents — see assertNotMaintainedTableTarget.
|
|
123
|
+
assertNotMaintainedTableTarget(tableSchema);
|
|
36
124
|
// Pre-calculate primary key column indices from schema (needed for update/delete)
|
|
37
125
|
const pkColumnIndicesInSchema = tableSchema.primaryKeyDefinition.map(pkColDef => pkColDef.index);
|
|
38
126
|
// Emit mutation context evaluators if present
|
|
@@ -179,39 +267,43 @@ export function emitDmlExecutor(plan, ctx) {
|
|
|
179
267
|
}
|
|
180
268
|
return err;
|
|
181
269
|
}
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
270
|
+
/**
|
|
271
|
+
* Shared statement-/row-level savepoint scaffold for multi-row DML, used by
|
|
272
|
+
* all three generators. Owns the savepoint lifecycle that makes a multi-row
|
|
273
|
+
* mutation atomic inside an explicit transaction, plus the per-row OR FAIL
|
|
274
|
+
* savepoint that keeps prior rows while undoing only the failing row.
|
|
275
|
+
* INSERT/UPDATE/DELETE reduce to a `processRow` closure carrying the
|
|
276
|
+
* operation-specific body (vtab.update + bookkeeping + FK actions + events).
|
|
277
|
+
*
|
|
278
|
+
* - non-FAIL (ABORT default / IGNORE / REPLACE / ROLLBACK): one
|
|
279
|
+
* statement-scope savepoint, released after the loop completes and
|
|
280
|
+
* rolled-back-and-released on ANY throw escaping the loop — whether from
|
|
281
|
+
* the source iterator (e.g. a ConstraintCheckNode above the executor
|
|
282
|
+
* raising NOT NULL / CHECK before a row is yielded) or from `processRow`
|
|
283
|
+
* (a vtab-returned constraint, or a RESTRICT pre-check). This is the
|
|
284
|
+
* statement-atomicity guarantee, mirroring SQLite's implicit
|
|
285
|
+
* per-statement savepoint: all of a statement's row effects apply or none.
|
|
286
|
+
* - OR FAIL: per-row savepoint, released on success, rolled back on throw,
|
|
287
|
+
* so the failing row's partial work (incl. a row-time backing write that
|
|
288
|
+
* lands before a later maintenance throw) is undone while earlier rows
|
|
289
|
+
* survive. FAIL deliberately skips the statement-scope wrap.
|
|
290
|
+
*
|
|
291
|
+
* Always uses the broadcast savepoint helpers so per-connection savepoint
|
|
292
|
+
* stacks stay in lockstep with the TransactionManager's stack — including a
|
|
293
|
+
* connection registered lazily mid-statement (the row-time backing
|
|
294
|
+
* connection registers on the first maintenance call; Database.registerConnection
|
|
295
|
+
* replays the active savepoint depth onto it, which already includes the
|
|
296
|
+
* statement savepoint created before the row loop).
|
|
297
|
+
*/
|
|
298
|
+
async function* runWithStatementSavepoints(ctx, vtab, rows, isFailMode, processRow, deferredRebuilds, backingConnCache) {
|
|
205
299
|
let failSavepointCounter = 0;
|
|
206
|
-
// For non-FAIL modes
|
|
207
|
-
//
|
|
208
|
-
//
|
|
209
|
-
//
|
|
210
|
-
//
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
const stmtSavepointName = wrapStatementSavepoint
|
|
214
|
-
? `__or_abort_${stmtSavepointCounter++}`
|
|
300
|
+
// For non-FAIL modes wrap the whole statement so a mid-statement failure
|
|
301
|
+
// unwinds partial writes from earlier rows. FAIL keeps prior rows, so it
|
|
302
|
+
// uses the per-row savepoint (opened inside the loop) instead. Share the
|
|
303
|
+
// module-scope counter so a cascade-nested savepoint name (e.g. an FK
|
|
304
|
+
// cascade UPDATE during a parent UPDATE) can't collide with the parent's.
|
|
305
|
+
const stmtSavepointName = !isFailMode
|
|
306
|
+
? `__stmt_atomic_${stmtSavepointCounter++}`
|
|
215
307
|
: undefined;
|
|
216
308
|
if (stmtSavepointName) {
|
|
217
309
|
await ctx.db._createSavepointBroadcast(stmtSavepointName);
|
|
@@ -219,14 +311,9 @@ export function emitDmlExecutor(plan, ctx) {
|
|
|
219
311
|
try {
|
|
220
312
|
try {
|
|
221
313
|
for await (const flatRow of rows) {
|
|
222
|
-
// OR FAIL per-row savepoint.
|
|
223
|
-
//
|
|
224
|
-
//
|
|
225
|
-
// registers mid-row (e.g. via CTE materialization that
|
|
226
|
-
// instantiates a new memory-backed table), Database.registerConnection
|
|
227
|
-
// replays the active depth onto it — without broadcasting our
|
|
228
|
-
// create here, that replay would offset its stack by one and a
|
|
229
|
-
// subsequent user-level ROLLBACK TO would restore the wrong layer.
|
|
314
|
+
// OR FAIL per-row savepoint. Broadcast (not the bare variant)
|
|
315
|
+
// so a connection registering mid-row keeps its stack in
|
|
316
|
+
// lockstep — see the doc comment above.
|
|
230
317
|
let savepointName;
|
|
231
318
|
if (isFailMode) {
|
|
232
319
|
savepointName = `__or_fail_${failSavepointCounter++}`;
|
|
@@ -235,7 +322,7 @@ export function emitDmlExecutor(plan, ctx) {
|
|
|
235
322
|
let rowToYield;
|
|
236
323
|
let succeeded = false;
|
|
237
324
|
try {
|
|
238
|
-
rowToYield = await
|
|
325
|
+
rowToYield = await processRow(flatRow);
|
|
239
326
|
succeeded = true;
|
|
240
327
|
}
|
|
241
328
|
catch (e) {
|
|
@@ -243,8 +330,9 @@ export function emitDmlExecutor(plan, ctx) {
|
|
|
243
330
|
await ctx.db._rollbackAndReleaseSavepointBroadcast(savepointName);
|
|
244
331
|
savepointName = undefined;
|
|
245
332
|
}
|
|
246
|
-
// Translate plain constraint violations to FAIL/ROLLBACK error
|
|
247
|
-
// so the iterator-level cleanup picks the right
|
|
333
|
+
// Translate plain constraint violations to FAIL/ROLLBACK error
|
|
334
|
+
// subclasses so the iterator-level cleanup picks the right
|
|
335
|
+
// finalization branch.
|
|
248
336
|
throw translateConflictError(e, plan.onConflict);
|
|
249
337
|
}
|
|
250
338
|
if (succeeded && savepointName) {
|
|
@@ -254,6 +342,14 @@ export function emitDmlExecutor(plan, ctx) {
|
|
|
254
342
|
yield rowToYield;
|
|
255
343
|
}
|
|
256
344
|
}
|
|
345
|
+
// End-of-statement boundary: drain the deferred full-rebuild set NOW — after
|
|
346
|
+
// every source row has been applied (so each rebuild reads all this
|
|
347
|
+
// statement's writes) and BEFORE the statement savepoint releases (so a
|
|
348
|
+
// failed rebuild rolls the whole statement back). Inside the try, so a flush
|
|
349
|
+
// error routes to the rollback branch below. A no-op when nothing deferred.
|
|
350
|
+
if (deferredRebuilds.size > 0) {
|
|
351
|
+
await ctx.db._flushDeferredRebuilds(deferredRebuilds, backingConnCache);
|
|
352
|
+
}
|
|
257
353
|
if (stmtSavepointName) {
|
|
258
354
|
await ctx.db._releaseSavepointBroadcast(stmtSavepointName);
|
|
259
355
|
}
|
|
@@ -262,6 +358,19 @@ export function emitDmlExecutor(plan, ctx) {
|
|
|
262
358
|
if (stmtSavepointName) {
|
|
263
359
|
await ctx.db._rollbackAndReleaseSavepointBroadcast(stmtSavepointName);
|
|
264
360
|
}
|
|
361
|
+
else if (deferredRebuilds.size > 0) {
|
|
362
|
+
// OR FAIL keeps the rows that already succeeded (it runs with no
|
|
363
|
+
// statement-scope savepoint), so a mid-statement abort does NOT unwind
|
|
364
|
+
// them. Their deferred full-rebuild MVs must therefore still be flushed
|
|
365
|
+
// before the conflict error propagates — otherwise the backing would lag
|
|
366
|
+
// the surviving source rows mid-transaction (read(MV) != evaluate(body)).
|
|
367
|
+
// The failing row's own per-row savepoint already reverted its writes, so
|
|
368
|
+
// the rebuild re-evaluates over exactly the surviving rows. The original
|
|
369
|
+
// conflict error is re-thrown after the flush. (A flush failure here is a
|
|
370
|
+
// genuine maintenance error and supersedes the conflict error, matching
|
|
371
|
+
// "a maintenance error fails the source write".)
|
|
372
|
+
await ctx.db._flushDeferredRebuilds(deferredRebuilds, backingConnCache);
|
|
373
|
+
}
|
|
265
374
|
throw e;
|
|
266
375
|
}
|
|
267
376
|
}
|
|
@@ -269,6 +378,62 @@ export function emitDmlExecutor(plan, ctx) {
|
|
|
269
378
|
await disconnectVTable(ctx, vtab);
|
|
270
379
|
}
|
|
271
380
|
}
|
|
381
|
+
// INSERT ----------------------------------------------------
|
|
382
|
+
// Number of context evaluators (used to split params in runInsert)
|
|
383
|
+
const numContextEvaluators = contextEvaluatorInstructions.length;
|
|
384
|
+
async function* runInsert(ctx, rows, ...allEvaluators) {
|
|
385
|
+
// Split evaluators: first numContextEvaluators are context, rest are upsert
|
|
386
|
+
const contextEvaluators = allEvaluators.slice(0, numContextEvaluators);
|
|
387
|
+
const upsertEvaluators = allEvaluators.slice(numContextEvaluators);
|
|
388
|
+
// Ensure we're in a transaction before any mutations (lazy/JIT transaction start)
|
|
389
|
+
await ctx.db._ensureTransaction();
|
|
390
|
+
const vtab = await getVTable(ctx, tableSchema);
|
|
391
|
+
const needsAutoEvents = ctx.db._needsDataEvents() && !moduleHasNativeDataEvents(ctx, tableSchema);
|
|
392
|
+
const contextRow = await evaluateContextRow(ctx, contextEvaluators);
|
|
393
|
+
// Per-statement backing-connection cache: resolve each covering MV's backing
|
|
394
|
+
// connection once for the whole statement rather than once per source row.
|
|
395
|
+
const backingConnCache = new Map();
|
|
396
|
+
// Per-statement deferred full-rebuild set (MV keys): full-rebuild covering MVs
|
|
397
|
+
// are marked dirty during the row loop and rebuilt once at the end-of-statement
|
|
398
|
+
// flush in runWithStatementSavepoints.
|
|
399
|
+
const deferredRebuilds = new Set();
|
|
400
|
+
const isFailMode = plan.onConflict === ConflictResolution.FAIL;
|
|
401
|
+
// Stamp the per-row mutation ordinal so a column `default` referencing
|
|
402
|
+
// `mutation_ordinal()` (a per-row surrogate allocator) resolves to the 1-based
|
|
403
|
+
// position of the row being produced. The defaults are evaluated upstream as
|
|
404
|
+
// each row is *pulled*, so the ordinal is set BEFORE pulling — see
|
|
405
|
+
// `stampMutationOrdinal`.
|
|
406
|
+
yield* runWithStatementSavepoints(ctx, vtab, stampMutationOrdinal(ctx, rows), isFailMode, (flatRow) => processInsertRow(ctx, vtab, needsAutoEvents, flatRow, contextRow, runtimeUpsertClauses, upsertEvaluators, backingConnCache, deferredRebuilds), deferredRebuilds, backingConnCache);
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Wrap the INSERT source so `rctx.mutationOrdinal` holds the 1-based ordinal of the
|
|
410
|
+
* row about to be produced. The column-default projection runs upstream when each
|
|
411
|
+
* row is *pulled*, so the ordinal is set immediately before `it.next()` — that pull
|
|
412
|
+
* drives the default evaluation for exactly that row, and `mutation_ordinal()` reads
|
|
413
|
+
* the just-set value. Saved/restored so a nested mutation (an FK cascade, a
|
|
414
|
+
* row-time backing write) does not see a stale ordinal, and cleared in `finally` so
|
|
415
|
+
* it never leaks past the statement.
|
|
416
|
+
*/
|
|
417
|
+
async function* stampMutationOrdinal(rctx, rows) {
|
|
418
|
+
const saved = rctx.mutationOrdinal;
|
|
419
|
+
const it = rows[Symbol.asyncIterator]();
|
|
420
|
+
let ordinal = 0;
|
|
421
|
+
try {
|
|
422
|
+
while (true) {
|
|
423
|
+
rctx.mutationOrdinal = ordinal + 1;
|
|
424
|
+
const next = await it.next();
|
|
425
|
+
if (next.done)
|
|
426
|
+
break;
|
|
427
|
+
ordinal += 1;
|
|
428
|
+
yield next.value;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
finally {
|
|
432
|
+
rctx.mutationOrdinal = saved;
|
|
433
|
+
if (it.return)
|
|
434
|
+
await it.return();
|
|
435
|
+
}
|
|
436
|
+
}
|
|
272
437
|
/**
|
|
273
438
|
* Performs a single row's INSERT side-effects (vtab.update + bookkeeping +
|
|
274
439
|
* UPSERT handling + REPLACE handling). Returns the row to yield downstream,
|
|
@@ -276,8 +441,9 @@ export function emitDmlExecutor(plan, ctx) {
|
|
|
276
441
|
*
|
|
277
442
|
* Throws ConstraintError on violations the executor cannot recover from.
|
|
278
443
|
*/
|
|
279
|
-
async function processInsertRow(ctx, vtab, needsAutoEvents, flatRow, contextRow, runtimeUpsertClauses, upsertEvaluators) {
|
|
444
|
+
async function processInsertRow(ctx, vtab, needsAutoEvents, flatRow, contextRow, runtimeUpsertClauses, upsertEvaluators, backingConnCache, deferredRebuilds) {
|
|
280
445
|
const newRow = extractNewRowFromFlat(flatRow, tableSchema.columns.length);
|
|
446
|
+
const tableKey = `${tableSchema.schemaName}.${tableSchema.name}`;
|
|
281
447
|
let mutationStatement;
|
|
282
448
|
if (vtab.wantStatements) {
|
|
283
449
|
mutationStatement = buildInsertStatement(tableSchema, newRow, contextRow);
|
|
@@ -304,8 +470,9 @@ export function emitDmlExecutor(plan, ctx) {
|
|
|
304
470
|
if (!updateResult)
|
|
305
471
|
return undefined;
|
|
306
472
|
const existingKeyValues = pkColumnIndicesInSchema.map(idx => result.existingRow[idx]);
|
|
307
|
-
ctx.db._recordUpdate(
|
|
308
|
-
await
|
|
473
|
+
ctx.db._recordUpdate(tableKey, result.existingRow, updateResult.updatedRow, pkColumnIndicesInSchema);
|
|
474
|
+
await maintainRowTimeStructures(ctx, tableKey, { op: 'update', oldRow: result.existingRow, newRow: updateResult.updatedRow }, backingConnCache, deferredRebuilds);
|
|
475
|
+
await executeForeignKeyActionsAndLens(ctx.db, tableSchema, 'update', result.existingRow, updateResult.updatedRow, plan.lensRouted);
|
|
309
476
|
if (needsAutoEvents) {
|
|
310
477
|
const changedColumns = [];
|
|
311
478
|
for (let i = 0; i < tableSchema.columns.length; i++) {
|
|
@@ -325,12 +492,16 @@ export function emitDmlExecutor(plan, ctx) {
|
|
|
325
492
|
if (!result.row) {
|
|
326
493
|
return undefined;
|
|
327
494
|
}
|
|
328
|
-
|
|
495
|
+
// Internal REPLACE evictions (rows at OTHER PKs removed to resolve a non-PK
|
|
496
|
+
// UNIQUE conflict) run the full delete pipeline here, before the new row's
|
|
497
|
+
// own bookkeeping — evict-then-write, matching the substrate journal order.
|
|
498
|
+
await processEvictions(ctx, needsAutoEvents, tableKey, result.evictedRows, backingConnCache, deferredRebuilds);
|
|
329
499
|
const replacedRow = result.replacedRow;
|
|
330
500
|
if (replacedRow) {
|
|
331
501
|
const newKeyValues = pkColumnIndicesInSchema.map(idx => newRow[idx]);
|
|
332
502
|
ctx.db._recordUpdate(tableKey, replacedRow, newRow, pkColumnIndicesInSchema);
|
|
333
|
-
await
|
|
503
|
+
await maintainRowTimeStructures(ctx, tableKey, { op: 'update', oldRow: replacedRow, newRow }, backingConnCache, deferredRebuilds);
|
|
504
|
+
await executeForeignKeyActionsAndLens(ctx.db, tableSchema, 'delete', replacedRow, undefined, plan.lensRouted);
|
|
334
505
|
if (needsAutoEvents) {
|
|
335
506
|
const changedColumns = [];
|
|
336
507
|
for (let i = 0; i < tableSchema.columns.length; i++) {
|
|
@@ -344,176 +515,225 @@ export function emitDmlExecutor(plan, ctx) {
|
|
|
344
515
|
else {
|
|
345
516
|
const pkValues = pkColumnIndicesInSchema.map(idx => newRow[idx]);
|
|
346
517
|
ctx.db._recordInsert(tableKey, newRow, pkColumnIndicesInSchema);
|
|
518
|
+
await maintainRowTimeStructures(ctx, tableKey, { op: 'insert', newRow }, backingConnCache, deferredRebuilds);
|
|
347
519
|
if (needsAutoEvents) {
|
|
348
520
|
emitAutoDataEvent(ctx, tableSchema, 'insert', pkValues, undefined, [...newRow]);
|
|
349
521
|
}
|
|
350
522
|
}
|
|
351
523
|
return flatRow;
|
|
352
524
|
}
|
|
525
|
+
/**
|
|
526
|
+
* Drive the full delete pipeline for every internal REPLACE eviction reported
|
|
527
|
+
* in `evictedRows` — rows at *other PKs* a substrate removed to resolve a non-PK
|
|
528
|
+
* UNIQUE conflict for this same `vtab.update()` call. The substrate deletes the
|
|
529
|
+
* row from its own storage but cannot run the cross-cutting post-write steps
|
|
530
|
+
* (change-tracking, row-time MV maintenance, FK cascade, auto-events) — those
|
|
531
|
+
* live solely here. So each evicted row is processed as a full DELETE, exactly
|
|
532
|
+
* like {@link processDeleteRow}'s own bookkeeping.
|
|
533
|
+
*
|
|
534
|
+
* Called *before* the writing row's own insert/update bookkeeping so the
|
|
535
|
+
* eviction's row-time maintenance and FK cascade land in the substrate's
|
|
536
|
+
* evict-then-write order (a later same-key backing write must not be undone by
|
|
537
|
+
* an earlier-PK eviction's delete).
|
|
538
|
+
*/
|
|
539
|
+
async function processEvictions(ctx, needsAutoEvents, tableKey, evictedRows, backingConnCache, deferredRebuilds) {
|
|
540
|
+
if (!evictedRows || evictedRows.length === 0)
|
|
541
|
+
return;
|
|
542
|
+
for (const evicted of evictedRows) {
|
|
543
|
+
// RESTRICT / NO ACTION enforcement for the eviction's would-be delete.
|
|
544
|
+
// The substrate already physically removed the evicted row inside
|
|
545
|
+
// vtab.update(), so there is no pre-mutation point. Run the transitive
|
|
546
|
+
// RESTRICT scan post-eviction (the child rows it keys off remain) and,
|
|
547
|
+
// on a violation, throw — runWithStatementSavepoints rolls back the
|
|
548
|
+
// statement savepoint, unwinding both the eviction and the writing row.
|
|
549
|
+
// Mirrors the pre-check processDeleteRow runs for a plain DELETE.
|
|
550
|
+
//
|
|
551
|
+
// lensRouted = false (the default) on both FK calls: an internal REPLACE
|
|
552
|
+
// eviction is a physical basis effect (a row at another PK the substrate
|
|
553
|
+
// removed to resolve a non-PK UNIQUE conflict), not a write through the
|
|
554
|
+
// lens, so it bears only physical (basis-declared) FK semantics.
|
|
555
|
+
await assertTransitiveRestrictsForParentMutation(ctx.db, tableSchema, 'delete', evicted);
|
|
556
|
+
const evictedKeyValues = pkColumnIndicesInSchema.map(idx => evicted[idx]);
|
|
557
|
+
ctx.db._recordDelete(tableKey, evicted, pkColumnIndicesInSchema);
|
|
558
|
+
await maintainRowTimeStructures(ctx, tableKey, { op: 'delete', oldRow: evicted }, backingConnCache, deferredRebuilds);
|
|
559
|
+
await executeForeignKeyActionsAndLens(ctx.db, tableSchema, 'delete', evicted);
|
|
560
|
+
if (needsAutoEvents) {
|
|
561
|
+
emitAutoDataEvent(ctx, tableSchema, 'delete', evictedKeyValues, [...evicted]);
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
}
|
|
353
565
|
// UPDATE ----------------------------------------------------
|
|
354
566
|
async function* runUpdate(ctx, rows, ...contextEvaluators) {
|
|
355
567
|
// Ensure we're in a transaction before any mutations (lazy/JIT transaction start)
|
|
356
568
|
await ctx.db._ensureTransaction();
|
|
357
569
|
const vtab = await getVTable(ctx, tableSchema);
|
|
358
|
-
const needsAutoEvents = ctx.db.
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
570
|
+
const needsAutoEvents = ctx.db._needsDataEvents() && !moduleHasNativeDataEvents(ctx, tableSchema);
|
|
571
|
+
const contextRow = await evaluateContextRow(ctx, contextEvaluators);
|
|
572
|
+
// Per-statement backing-connection cache + deferred full-rebuild set (see runInsert).
|
|
573
|
+
const backingConnCache = new Map();
|
|
574
|
+
const deferredRebuilds = new Set();
|
|
575
|
+
const isFailMode = plan.onConflict === ConflictResolution.FAIL;
|
|
576
|
+
yield* runWithStatementSavepoints(ctx, vtab, rows, isFailMode, (flatRow) => processUpdateRow(ctx, vtab, needsAutoEvents, flatRow, contextRow, backingConnCache, deferredRebuilds), deferredRebuilds, backingConnCache);
|
|
577
|
+
}
|
|
578
|
+
/**
|
|
579
|
+
* Performs a single row's UPDATE side-effects (RESTRICT pre-check +
|
|
580
|
+
* vtab.update + REPLACE eviction + bookkeeping + FK actions + events).
|
|
581
|
+
* Returns the row to yield downstream, or undefined if the row was not
|
|
582
|
+
* updated (row not found). Throws ConstraintError on violations the executor
|
|
583
|
+
* cannot recover from; the caller (runWithStatementSavepoints) translates it
|
|
584
|
+
* for FAIL/ROLLBACK modes.
|
|
585
|
+
*/
|
|
586
|
+
async function processUpdateRow(ctx, vtab, needsAutoEvents, flatRow, contextRow, backingConnCache, deferredRebuilds) {
|
|
587
|
+
const oldRow = extractOldRowFromFlat(flatRow, tableSchema.columns.length);
|
|
588
|
+
const newRow = extractNewRowFromFlat(flatRow, tableSchema.columns.length);
|
|
589
|
+
const tableKey = `${tableSchema.schemaName}.${tableSchema.name}`;
|
|
590
|
+
// Extract primary key values from the OLD row (these identify which row to update)
|
|
591
|
+
const keyValues = pkColumnIndicesInSchema.map(pkColIdx => {
|
|
592
|
+
if (pkColIdx >= oldRow.length) {
|
|
593
|
+
throw new QuereusError(`PK column index ${pkColIdx} out of bounds for OLD row length ${oldRow.length} in UPDATE on '${tableSchema.name}'.`, StatusCode.INTERNAL);
|
|
366
594
|
}
|
|
595
|
+
return oldRow[pkColIdx];
|
|
596
|
+
});
|
|
597
|
+
// Build mutation statement if logging is enabled
|
|
598
|
+
let mutationStatement;
|
|
599
|
+
if (vtab.wantStatements) {
|
|
600
|
+
mutationStatement = buildUpdateStatement(tableSchema, newRow, keyValues, contextRow);
|
|
367
601
|
}
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
continue;
|
|
411
|
-
}
|
|
412
|
-
// If the UPDATE moved this row onto an occupied PK under REPLACE,
|
|
413
|
-
// the vtab returns the displaced row. Surface its deletion BEFORE
|
|
414
|
-
// the move bookkeeping so change tracking, FK cascade, and auto-events
|
|
415
|
-
// see the same evict-then-move sequence the vtab journals (manager.ts
|
|
416
|
-
// records delete(newPk, evicted) before the move). Running the
|
|
417
|
-
// eviction's FK cascade first also avoids ON UPDATE CASCADE pulling
|
|
418
|
-
// children onto PK_new and then having an unrelated ON DELETE CASCADE
|
|
419
|
-
// for the evicted row wipe them out.
|
|
420
|
-
if (result.replacedRow) {
|
|
421
|
-
const evictedKeyValues = pkColumnIndicesInSchema.map(idx => result.replacedRow[idx]);
|
|
422
|
-
ctx.db._recordDelete(`${tableSchema.schemaName}.${tableSchema.name}`, result.replacedRow, pkColumnIndicesInSchema);
|
|
423
|
-
await executeForeignKeyActions(ctx.db, tableSchema, 'delete', result.replacedRow);
|
|
424
|
-
if (needsAutoEvents) {
|
|
425
|
-
emitAutoDataEvent(ctx, tableSchema, 'delete', evictedKeyValues, [...result.replacedRow]);
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
// Track change (UPDATE): pass full rows so the change capture can
|
|
429
|
-
// project the columns any active subscription cares about.
|
|
430
|
-
ctx.db._recordUpdate(`${tableSchema.schemaName}.${tableSchema.name}`, oldRow, newRow, pkColumnIndicesInSchema);
|
|
431
|
-
// Execute FK cascading actions (CASCADE, SET NULL, SET DEFAULT)
|
|
432
|
-
await executeForeignKeyActions(ctx.db, tableSchema, 'update', oldRow, newRow);
|
|
433
|
-
// Emit auto event for modules without native event support
|
|
434
|
-
if (needsAutoEvents) {
|
|
435
|
-
// Compute changed columns
|
|
436
|
-
const changedColumns = [];
|
|
437
|
-
for (let i = 0; i < tableSchema.columns.length; i++) {
|
|
438
|
-
const oldVal = oldRow[i];
|
|
439
|
-
const newVal = newRow[i];
|
|
440
|
-
if (!sqlValuesEqual(oldVal, newVal)) {
|
|
441
|
-
changedColumns.push(tableSchema.columns[i].name);
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
emitAutoDataEvent(ctx, tableSchema, 'update', keyValues, [...oldRow], [...newRow], changedColumns);
|
|
445
|
-
}
|
|
446
|
-
yield flatRow;
|
|
602
|
+
// Defense-in-depth RESTRICT enforcement: the plan-time `NOT EXISTS`
|
|
603
|
+
// check is the primary path, but some vtab modules evaluate the
|
|
604
|
+
// embedded subquery differently from a plain row scan. Pre-walk
|
|
605
|
+
// the transitive cascade closure so RESTRICTs at any depth fire
|
|
606
|
+
// BEFORE vtab.update — needed for rowid-mode backends (lamina)
|
|
607
|
+
// where post-mutation OLD-value scans dereference through the
|
|
608
|
+
// just-mutated parent and find zero rows.
|
|
609
|
+
await assertTransitiveRestrictsForParentMutation(ctx.db, tableSchema, 'update', oldRow, newRow, plan.lensRouted);
|
|
610
|
+
const args = {
|
|
611
|
+
operation: 'update',
|
|
612
|
+
values: newRow,
|
|
613
|
+
oldKeyValues: keyValues,
|
|
614
|
+
// Pass undefined when there's no statement-level OR clause so the vtab
|
|
615
|
+
// can fall back to per-constraint defaultConflict directives. The memory
|
|
616
|
+
// module treats undefined as ABORT when no constraint default is set.
|
|
617
|
+
onConflict: plan.onConflict,
|
|
618
|
+
mutationStatement
|
|
619
|
+
};
|
|
620
|
+
const result = await vtab.update(args);
|
|
621
|
+
// Handle constraint violations — caller translates for FAIL/ROLLBACK.
|
|
622
|
+
if (isConstraintViolation(result)) {
|
|
623
|
+
throw new ConstraintError(result.message ?? `${result.constraint} constraint failed`, StatusCode.CONSTRAINT);
|
|
624
|
+
}
|
|
625
|
+
// Skip if row was not updated (row not found returns ok with no row)
|
|
626
|
+
if (!result.row) {
|
|
627
|
+
return undefined;
|
|
628
|
+
}
|
|
629
|
+
// If the UPDATE moved this row onto an occupied PK under REPLACE,
|
|
630
|
+
// the vtab returns the displaced row. Surface its deletion BEFORE
|
|
631
|
+
// the move bookkeeping so change tracking, FK cascade, and auto-events
|
|
632
|
+
// see the same evict-then-move sequence the vtab journals (manager.ts
|
|
633
|
+
// records delete(newPk, evicted) before the move). Running the
|
|
634
|
+
// eviction's FK cascade first also avoids ON UPDATE CASCADE pulling
|
|
635
|
+
// children onto PK_new and then having an unrelated ON DELETE CASCADE
|
|
636
|
+
// for the evicted row wipe them out.
|
|
637
|
+
if (result.replacedRow) {
|
|
638
|
+
const evictedKeyValues = pkColumnIndicesInSchema.map(idx => result.replacedRow[idx]);
|
|
639
|
+
ctx.db._recordDelete(tableKey, result.replacedRow, pkColumnIndicesInSchema);
|
|
640
|
+
await maintainRowTimeStructures(ctx, tableKey, { op: 'delete', oldRow: result.replacedRow }, backingConnCache, deferredRebuilds);
|
|
641
|
+
await executeForeignKeyActionsAndLens(ctx.db, tableSchema, 'delete', result.replacedRow, undefined, plan.lensRouted);
|
|
642
|
+
if (needsAutoEvents) {
|
|
643
|
+
emitAutoDataEvent(ctx, tableSchema, 'delete', evictedKeyValues, [...result.replacedRow]);
|
|
447
644
|
}
|
|
448
645
|
}
|
|
449
|
-
|
|
450
|
-
|
|
646
|
+
// Internal REPLACE evictions (rows at OTHER PKs removed to resolve a non-PK
|
|
647
|
+
// UNIQUE conflict for this same update) run the full delete pipeline here,
|
|
648
|
+
// after any same-PK replacedRow handling and before the moved row's own
|
|
649
|
+
// bookkeeping — evict-then-write, matching the substrate journal order.
|
|
650
|
+
await processEvictions(ctx, needsAutoEvents, tableKey, result.evictedRows, backingConnCache, deferredRebuilds);
|
|
651
|
+
// Track change (UPDATE): pass full rows so the change capture can
|
|
652
|
+
// project the columns any active subscription cares about.
|
|
653
|
+
ctx.db._recordUpdate(tableKey, oldRow, newRow, pkColumnIndicesInSchema);
|
|
654
|
+
await maintainRowTimeStructures(ctx, tableKey, { op: 'update', oldRow, newRow }, backingConnCache, deferredRebuilds);
|
|
655
|
+
// Execute FK cascading actions (CASCADE, SET NULL, SET DEFAULT)
|
|
656
|
+
await executeForeignKeyActionsAndLens(ctx.db, tableSchema, 'update', oldRow, newRow, plan.lensRouted);
|
|
657
|
+
// Emit auto event for modules without native event support
|
|
658
|
+
if (needsAutoEvents) {
|
|
659
|
+
// Compute changed columns
|
|
660
|
+
const changedColumns = [];
|
|
661
|
+
for (let i = 0; i < tableSchema.columns.length; i++) {
|
|
662
|
+
const oldVal = oldRow[i];
|
|
663
|
+
const newVal = newRow[i];
|
|
664
|
+
if (!sqlValuesEqual(oldVal, newVal)) {
|
|
665
|
+
changedColumns.push(tableSchema.columns[i].name);
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
emitAutoDataEvent(ctx, tableSchema, 'update', keyValues, [...oldRow], [...newRow], changedColumns);
|
|
451
669
|
}
|
|
670
|
+
return flatRow;
|
|
452
671
|
}
|
|
453
672
|
// DELETE ----------------------------------------------------
|
|
454
673
|
async function* runDelete(ctx, rows, ...contextEvaluators) {
|
|
455
674
|
// Ensure we're in a transaction before any mutations (lazy/JIT transaction start)
|
|
456
675
|
await ctx.db._ensureTransaction();
|
|
457
676
|
const vtab = await getVTable(ctx, tableSchema);
|
|
458
|
-
const needsAutoEvents = ctx.db.
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
677
|
+
const needsAutoEvents = ctx.db._needsDataEvents() && !moduleHasNativeDataEvents(ctx, tableSchema);
|
|
678
|
+
const contextRow = await evaluateContextRow(ctx, contextEvaluators);
|
|
679
|
+
// Per-statement backing-connection cache + deferred full-rebuild set (see runInsert).
|
|
680
|
+
const backingConnCache = new Map();
|
|
681
|
+
const deferredRebuilds = new Set();
|
|
682
|
+
const isFailMode = plan.onConflict === ConflictResolution.FAIL;
|
|
683
|
+
yield* runWithStatementSavepoints(ctx, vtab, rows, isFailMode, (flatRow) => processDeleteRow(ctx, vtab, needsAutoEvents, flatRow, contextRow, backingConnCache, deferredRebuilds), deferredRebuilds, backingConnCache);
|
|
684
|
+
}
|
|
685
|
+
/**
|
|
686
|
+
* Performs a single row's DELETE side-effects (RESTRICT pre-check +
|
|
687
|
+
* vtab.update + bookkeeping + FK actions + events). Returns the row to yield
|
|
688
|
+
* downstream, or undefined if the row was not deleted (row not found).
|
|
689
|
+
* Throws ConstraintError / RESTRICT errors; the caller
|
|
690
|
+
* (runWithStatementSavepoints) translates constraint violations for
|
|
691
|
+
* FAIL/ROLLBACK modes.
|
|
692
|
+
*/
|
|
693
|
+
async function processDeleteRow(ctx, vtab, needsAutoEvents, flatRow, contextRow, backingConnCache, deferredRebuilds) {
|
|
694
|
+
const oldRow = extractOldRowFromFlat(flatRow, tableSchema.columns.length);
|
|
695
|
+
const tableKey = `${tableSchema.schemaName}.${tableSchema.name}`;
|
|
696
|
+
const keyValues = pkColumnIndicesInSchema.map(pkColIdx => {
|
|
697
|
+
if (pkColIdx >= oldRow.length) {
|
|
698
|
+
throw new QuereusError(`PK column index ${pkColIdx} out of bounds for OLD row length ${oldRow.length} in DELETE on '${tableSchema.name}'.`, StatusCode.INTERNAL);
|
|
466
699
|
}
|
|
700
|
+
return oldRow[pkColIdx];
|
|
701
|
+
});
|
|
702
|
+
// Build mutation statement if logging is enabled
|
|
703
|
+
let mutationStatement;
|
|
704
|
+
if (vtab.wantStatements) {
|
|
705
|
+
mutationStatement = buildDeleteStatement(tableSchema, keyValues, contextRow);
|
|
467
706
|
}
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
// Defense-in-depth RESTRICT enforcement — see comment on the UPDATE
|
|
483
|
-
// path above.
|
|
484
|
-
await assertTransitiveRestrictsForParentMutation(ctx.db, tableSchema, 'delete', oldRow);
|
|
485
|
-
const args = {
|
|
486
|
-
operation: 'delete',
|
|
487
|
-
values: undefined,
|
|
488
|
-
oldKeyValues: keyValues,
|
|
489
|
-
onConflict: plan.onConflict ?? ConflictResolution.ABORT,
|
|
490
|
-
mutationStatement
|
|
491
|
-
};
|
|
492
|
-
const result = await vtab.update(args);
|
|
493
|
-
// Handle constraint violations (unlikely for DELETE, but be consistent)
|
|
494
|
-
if (isConstraintViolation(result)) {
|
|
495
|
-
const baseErr = new ConstraintError(result.message ?? `${result.constraint} constraint failed`, StatusCode.CONSTRAINT);
|
|
496
|
-
throw translateConflictError(baseErr, plan.onConflict);
|
|
497
|
-
}
|
|
498
|
-
// Skip if row was not deleted (row not found returns ok with no row)
|
|
499
|
-
if (!result.row) {
|
|
500
|
-
continue;
|
|
501
|
-
}
|
|
502
|
-
// Track change (DELETE): record OLD row + PK indices so capture
|
|
503
|
-
// can project the columns subscribers care about.
|
|
504
|
-
ctx.db._recordDelete(`${tableSchema.schemaName}.${tableSchema.name}`, oldRow, pkColumnIndicesInSchema);
|
|
505
|
-
// Execute FK cascading actions (CASCADE, SET NULL, SET DEFAULT)
|
|
506
|
-
await executeForeignKeyActions(ctx.db, tableSchema, 'delete', oldRow);
|
|
507
|
-
// Emit auto event for modules without native event support
|
|
508
|
-
if (needsAutoEvents) {
|
|
509
|
-
emitAutoDataEvent(ctx, tableSchema, 'delete', keyValues, [...oldRow]);
|
|
510
|
-
}
|
|
511
|
-
yield flatRow;
|
|
512
|
-
}
|
|
707
|
+
// Defense-in-depth RESTRICT enforcement — see comment on the UPDATE
|
|
708
|
+
// path above.
|
|
709
|
+
await assertTransitiveRestrictsForParentMutation(ctx.db, tableSchema, 'delete', oldRow, undefined, plan.lensRouted);
|
|
710
|
+
const args = {
|
|
711
|
+
operation: 'delete',
|
|
712
|
+
values: undefined,
|
|
713
|
+
oldKeyValues: keyValues,
|
|
714
|
+
onConflict: plan.onConflict ?? ConflictResolution.ABORT,
|
|
715
|
+
mutationStatement
|
|
716
|
+
};
|
|
717
|
+
const result = await vtab.update(args);
|
|
718
|
+
// Handle constraint violations (unlikely for DELETE, but be consistent).
|
|
719
|
+
if (isConstraintViolation(result)) {
|
|
720
|
+
throw new ConstraintError(result.message ?? `${result.constraint} constraint failed`, StatusCode.CONSTRAINT);
|
|
513
721
|
}
|
|
514
|
-
|
|
515
|
-
|
|
722
|
+
// Skip if row was not deleted (row not found returns ok with no row)
|
|
723
|
+
if (!result.row) {
|
|
724
|
+
return undefined;
|
|
516
725
|
}
|
|
726
|
+
// Track change (DELETE): record OLD row + PK indices so capture
|
|
727
|
+
// can project the columns subscribers care about.
|
|
728
|
+
ctx.db._recordDelete(tableKey, oldRow, pkColumnIndicesInSchema);
|
|
729
|
+
await maintainRowTimeStructures(ctx, tableKey, { op: 'delete', oldRow }, backingConnCache, deferredRebuilds);
|
|
730
|
+
// Execute FK cascading actions (CASCADE, SET NULL, SET DEFAULT)
|
|
731
|
+
await executeForeignKeyActionsAndLens(ctx.db, tableSchema, 'delete', oldRow, undefined, plan.lensRouted);
|
|
732
|
+
// Emit auto event for modules without native event support
|
|
733
|
+
if (needsAutoEvents) {
|
|
734
|
+
emitAutoDataEvent(ctx, tableSchema, 'delete', keyValues, [...oldRow]);
|
|
735
|
+
}
|
|
736
|
+
return flatRow;
|
|
517
737
|
}
|
|
518
738
|
// Select the correct generator based on operation
|
|
519
739
|
let run;
|