@quereus/quereus 3.3.0 → 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 -110
- 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 +793 -118
- 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 +276 -7
- package/dist/src/parser/parser.d.ts.map +1 -1
- package/dist/src/parser/parser.js +1387 -469
- 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/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 +108 -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 +3 -1
- package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.js +192 -9
- 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 +109 -30
- 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 +47 -0
- 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/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.js +3 -3
- 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 +18 -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/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 +124 -9
- 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.map +1 -1
- package/dist/src/planner/nodes/limit-offset.js +4 -5
- 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 +85 -11
- 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 +62 -27
- 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 +291 -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 +7 -6
- package/dist/src/planner/nodes/sort.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 +1 -0
- package/dist/src/planner/nodes/values-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/values-node.js +16 -6
- 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 +2 -2
- 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-groupby-fd-simplification.d.ts.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js +9 -0
- 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/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 +38 -1
- 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.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-fanout-lookup-join.js +19 -1
- 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 +9 -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 +12 -1
- 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 +4 -0
- 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 +9 -0
- 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-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 +1 -1
- package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.js +4 -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/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 +177 -43
- package/dist/src/planner/util/fd-utils.d.ts.map +1 -1
- package/dist/src/planner/util/fd-utils.js +396 -101
- 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.map +1 -1
- package/dist/src/planner/util/key-utils.js +81 -12
- 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 +29 -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 +18 -5
- 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 +5 -9
- 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 +8 -2
- package/dist/src/runtime/emit/bloom-join.js.map +1 -1
- package/dist/src/runtime/emit/constraint-check.js +15 -0
- 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/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 +15 -3
- 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/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
|
@@ -0,0 +1,548 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: Semi/Anti-Join Existence-Flag Recovery (demand-SHAPE gated)
|
|
3
|
+
*
|
|
4
|
+
* The complement of `join-existence-pruning`. That rule drops an `exists … as`
|
|
5
|
+
* flag only when **nothing** demands its attr id (a demand-PRESENCE prune). This
|
|
6
|
+
* rule handles the opposite shape: the flag **is** demanded, but **only** as a
|
|
7
|
+
* pure boolean existence probe at the top level
|
|
8
|
+
* (`where <flag>` / `where not <flag>`). That is exactly a semi / anti-join, and
|
|
9
|
+
* rewriting it as one re-opens the access-path choice the live flag forfeits
|
|
10
|
+
* (`join-physical-selection`) and threads into the IND-folding cascade
|
|
11
|
+
* (`semi-join-fk-trivial` / `anti-join-fk-empty`).
|
|
12
|
+
*
|
|
13
|
+
* select c.* from child c left join parent p on p.pk = c.fk exists right as h
|
|
14
|
+
* where h; -- ⇒ SemiJoin(child, parent, p.pk = c.fk) (rows WITH a match)
|
|
15
|
+
* where not h; -- ⇒ AntiJoin(child, parent, p.pk = c.fk) (rows with NO match)
|
|
16
|
+
*
|
|
17
|
+
* This is a **pure optimization**: the nested-loop+flag plan is already correct,
|
|
18
|
+
* just slower than the semi/anti shape. The deliverable is byte-identical rows
|
|
19
|
+
* plus a re-enabled physical/IND cascade.
|
|
20
|
+
*
|
|
21
|
+
* ## Two entrypoints (mirrors `join-existence-pruning` / `…UnderAggregate`)
|
|
22
|
+
*
|
|
23
|
+
* The rule has two anchors sharing ALL of the probe-detection + chain-rewrite
|
|
24
|
+
* machinery below. `ruleSemijoinExistenceRecovery` fires on a `ProjectNode` (the
|
|
25
|
+
* common `select … where flag` shape). `ruleSemijoinExistenceRecoveryUnderAggregate`
|
|
26
|
+
* fires on an `AggregateNode` for the bare `count(*) … where flag` / `group by`
|
|
27
|
+
* shape that plans with **no enclosing Project** — the probe Filter and the
|
|
28
|
+
* flag-bearing join sit *under* the Aggregate, so the Project entrypoint walks
|
|
29
|
+
* right past them. The two differ only in the demand-seed prologue (projections
|
|
30
|
+
* vs group-by + aggregate expressions — each anchor's only scalar children) and
|
|
31
|
+
* the rebuild epilogue (`rebuildProject` vs reconstructing the `AggregateNode`
|
|
32
|
+
* with `preserveAttributeIds`); the sole-spec / `left` / `side==='right'` gates,
|
|
33
|
+
* the demand-SHAPE proof (`analyzeChain`, which takes a *pre-seeded* demand set),
|
|
34
|
+
* the fan-out guard (semi only), the impure-R guard, and the probe-strip rebuild
|
|
35
|
+
* are identical. NOTE: the Aggregate anchor has **no** inner-join fallback — a
|
|
36
|
+
* right-column-demanded or fan-out *positive* probe under an aggregate stays a
|
|
37
|
+
* flag-bearing `left` join (sound, just unoptimized), unlike the Project anchor
|
|
38
|
+
* which hands those off to `rule-inner-join-existence-recovery`.
|
|
39
|
+
*
|
|
40
|
+
* ## Q1 — Anchor: `ProjectNode`, not `FilterNode`
|
|
41
|
+
*
|
|
42
|
+
* A `FilterNode` anchor (mirroring `ruleSubqueryDecorrelation`) would be UNSOUND
|
|
43
|
+
* here. Decorrelation is output-preserving at the Filter level
|
|
44
|
+
* (`Filter[EXISTS](outer)` and `SemiJoin(outer,inner)` both expose *outer*'s
|
|
45
|
+
* columns), so it never has to look above the Filter. Our probe Filter sits above
|
|
46
|
+
* a `left join` whose output is `[left…, right…, flag]` and passes all of it
|
|
47
|
+
* through; rewriting the join to semi changes the Filter's output to `[left…]` —
|
|
48
|
+
* dropping the right columns and the flag. Soundness therefore REQUIRES proving
|
|
49
|
+
* that nothing above the Filter references a right-side column or the flag (except
|
|
50
|
+
* the probe we strip), and a rule only sees its own subtree. `ProjectNode` is the
|
|
51
|
+
* correct anchor for the same reason `join-existence-pruning` uses it: a Project's
|
|
52
|
+
* output is exactly one attribute per projection, so collecting demand from the
|
|
53
|
+
* projections bounds everything any ancestor can reference. The probe Filter is
|
|
54
|
+
* reached via the same whitelisted pass-through chain (`walkChain`) and rewritten
|
|
55
|
+
* in place during chain reconstruction.
|
|
56
|
+
*
|
|
57
|
+
* ## Q2 — Demand-SHAPE proof ("used ONLY as a boolean probe")
|
|
58
|
+
*
|
|
59
|
+
* Let `J` be the flag-bearing `JoinNode` reached by the chain walk, with sole
|
|
60
|
+
* existence spec `f` (`flagId = f.attrId`). The rewrite is legal iff:
|
|
61
|
+
*
|
|
62
|
+
* 1. **Sole probe conjunct.** Across all chain `FilterNode`s, split each
|
|
63
|
+
* predicate with `splitConjuncts`. Exactly **one** conjunct references
|
|
64
|
+
* `flagId`, and it is in an accepted probe normal form (below). Any other
|
|
65
|
+
* reference to `flagId` anywhere disqualifies.
|
|
66
|
+
* 2. **Flag absent from the residual demand set.** `demanded` is built from the
|
|
67
|
+
* anchor Project's projections, every chain Filter's **non-probe** conjuncts,
|
|
68
|
+
* and every chain Sort's keys (Limit/Distinct/Alias contribute nothing).
|
|
69
|
+
* Require `!demanded.has(flagId)` — this catches a flag selected or sorted on.
|
|
70
|
+
* 3. **No right-side column demanded.** The semi/anti output is left columns
|
|
71
|
+
* only, so `demanded ∩ {J.right attr ids} === ∅`. `select c.*, p.col … where
|
|
72
|
+
* f` lands here and abstains — `rule-inner-join-existence-recovery` then picks
|
|
73
|
+
* it up and rewrites to an inner join (NOT a semi-join shape). Unqualified
|
|
74
|
+
* `select * … where f` is different: `*` expands the join-appended flag too, so
|
|
75
|
+
* the flag itself is demanded — this rule abstains on (2), and the inner rule
|
|
76
|
+
* abstains on `!demanded.has(flagId)`; the flag is correctly retained (the
|
|
77
|
+
* caller selected it).
|
|
78
|
+
*
|
|
79
|
+
* **Accepted probe normal forms** (each conjunct normalized with
|
|
80
|
+
* `normalizePredicate` first — collapses `not not f`, pushes NOT down):
|
|
81
|
+
*
|
|
82
|
+
* | Form | Node shape after normalize | Polarity |
|
|
83
|
+
* |-------------------|-----------------------------------------------------|----------|
|
|
84
|
+
* | `f` | `ColumnReferenceNode`, `attributeId === flagId` | semi |
|
|
85
|
+
* | `not f` | `UnaryOpNode` NOT over that colref | anti |
|
|
86
|
+
* | `f = true` | `BinaryOpNode` `=`, flag colref vs boolean `true` | semi |
|
|
87
|
+
* | `f = false` | `BinaryOpNode` `=`, flag colref vs boolean `false` | anti |
|
|
88
|
+
* | `f is true` | `UnaryOpNode` `IS TRUE` over that colref | semi |
|
|
89
|
+
* | `f is not false` | `UnaryOpNode` `IS NOT FALSE` over that colref | semi |
|
|
90
|
+
* | `f is false` | `UnaryOpNode` `IS FALSE` over that colref | anti |
|
|
91
|
+
* | `f is not true` | `UnaryOpNode` `IS NOT TRUE` over that colref | anti |
|
|
92
|
+
*
|
|
93
|
+
* The `is not false` / `is not true` collapses (≡ `= true` / `= false`) are exact
|
|
94
|
+
* only because the flag is provably non-null (`EXISTENCE_FLAG_TYPE.nullable ===
|
|
95
|
+
* false`): with no NULL row there is no third bucket for `is not` to admit. For the
|
|
96
|
+
* same reason `f is [not] null` is NOT a probe over the non-null flag (`is not null`
|
|
97
|
+
* is a constant `true`, `is null` a constant `false`) and the matcher abstains.
|
|
98
|
+
* `case`-wrapped probes are out of scope (file a fresh backlog ticket if a real
|
|
99
|
+
* workload ever produces them).
|
|
100
|
+
*
|
|
101
|
+
* ## Q3 — left/right/inner → semi/anti mapping
|
|
102
|
+
*
|
|
103
|
+
* The parser (`resolveExistenceSide`) rejects `exists … as` on inner/cross joins.
|
|
104
|
+
* RIGHT/FULL flag-bearing joins now execute (`emitLoopJoin` drives them directly),
|
|
105
|
+
* but this rule deliberately handles only the `left join … exists right as` shape,
|
|
106
|
+
* giving the complete table:
|
|
107
|
+
*
|
|
108
|
+
* | Join type | spec.side | probe | rewrite | rows kept |
|
|
109
|
+
* |-----------|-----------|---------------|-----------------------|---------------------|
|
|
110
|
+
* | `left` | `right` | `where f` | `semi(L, R, cond)` | L rows WITH a match |
|
|
111
|
+
* | `left` | `right` | `where not f` | `anti(L, R, cond)` | L rows with NO match |
|
|
112
|
+
*
|
|
113
|
+
* The rule is guarded by `joinType === 'left' && spec.side === 'right'`; a RIGHT /
|
|
114
|
+
* FULL origin keeps its nested-loop join (abstaining is always sound — it merely
|
|
115
|
+
* forgoes the semi/anti rewrite), and inner flags are unreachable. Both are
|
|
116
|
+
* explicitly out of scope.
|
|
117
|
+
* The semi/anti node takes the LEFT side's attributes only (the flag column
|
|
118
|
+
* disappears), which the Q2 checks guarantee the consuming Project tolerates.
|
|
119
|
+
*
|
|
120
|
+
* ## Q4 — Multi-flag joins: only fire when the probe is the SOLE existence spec
|
|
121
|
+
*
|
|
122
|
+
* A semi/anti join collapses the right side and cannot also emit other flags, so a
|
|
123
|
+
* mixed join (one probe flag + other selected flags) cannot be split. We require
|
|
124
|
+
* `J.existence.length === 1`. When other flags are merely *undemanded*, the base
|
|
125
|
+
* `join-existence-pruning` rule (runs first) drops them, leaving a sole flag this
|
|
126
|
+
* rule then recovers in a later `applyRules` iteration. The genuinely-mixed case
|
|
127
|
+
* (≥2 demanded flags) is left unoptimized.
|
|
128
|
+
*
|
|
129
|
+
* ## Q5 — Fan-out guard (SEMI only) + residual ON-condition
|
|
130
|
+
*
|
|
131
|
+
* **A plain `left join … exists right as` does NOT collapse to one row per left
|
|
132
|
+
* row.** `emitLoopJoin` yields one output row per MATCHING right row, each
|
|
133
|
+
* carrying flag=true (it is a normal left join with an extra computed bit, not an
|
|
134
|
+
* existence-semantics join). So `where f` keeps **K rows** for a left row with K
|
|
135
|
+
* matches, while `semi(L,R,cond)` keeps exactly **one**. The two are row-equal
|
|
136
|
+
* iff every left row matches AT MOST ONE right row. We therefore gate the SEMI
|
|
137
|
+
* rewrite on `rightMatchesAtMostOne(J)` — the equi-join columns of `J.condition`
|
|
138
|
+
* must cover a unique key of R (`isUnique`), which holds for FK→PK joins (R's PK
|
|
139
|
+
* covered) and ≤1-row R (the empty key). A non-equi / non-unique condition (where
|
|
140
|
+
* a left row can match several R rows) makes the SEMI shape unsound and the rule
|
|
141
|
+
* abstains. **`rule-inner-join-existence-recovery` now picks up that abstention
|
|
142
|
+
* point:** a positive no-right-col probe over a fan-out (non-unique) R is recovered
|
|
143
|
+
* to a fan-out-safe **inner** join (which does NOT collapse K→1) — so the two rules
|
|
144
|
+
* partition the entire positive-probe space (unique-R → semi here; fan-out → inner
|
|
145
|
+
* fallback), both consulting the SAME `rightMatchesAtMostOne` so the boundary never
|
|
146
|
+
* drifts. The condition is otherwise carried `J.condition` UNCHANGED: a residual
|
|
147
|
+
* conjunct on top of a covered unique key only narrows the ≤1 match further (still
|
|
148
|
+
* ≤1), so the downstream IND folders may abstain on the residual and leave a plain
|
|
149
|
+
* semi join — still a win.
|
|
150
|
+
*
|
|
151
|
+
* The **ANTI** path needs no such guard (and `rightMatchesAtMostOne` is not
|
|
152
|
+
* consulted for it): see Q6.
|
|
153
|
+
*
|
|
154
|
+
* ## Q6 — Outer-side preservation / NULL semantics + anti fan-out immunity
|
|
155
|
+
*
|
|
156
|
+
* The flag is `{true,false}` and never NULL (`EXISTENCE_FLAG_TYPE.nullable ===
|
|
157
|
+
* false`; `emitLoopJoin` pre-computes matched=`true` / unmatched=`false` for an
|
|
158
|
+
* `exists right as` spec). For the ANTI rewrite this makes the split exact under
|
|
159
|
+
* arbitrary fan-out: an UNMATCHED left row yields exactly one null-extended row
|
|
160
|
+
* (flag=false) — one per left row, never K — and every MATCHED row carries
|
|
161
|
+
* flag=true and is dropped by `where not f`. So `where not f` keeps exactly the
|
|
162
|
+
* unmatched left rows, one each = `anti(L,R,cond)` for any `cond`, no fan-out
|
|
163
|
+
* hazard. (The SEMI side keeps matched rows, where the K-vs-1 divergence lives —
|
|
164
|
+
* hence the Q5 guard.)
|
|
165
|
+
*
|
|
166
|
+
* ## Q7 — Write-half safety (excluded by construction) + impure-R guard
|
|
167
|
+
*
|
|
168
|
+
* A flag writable through a view is always SELECTed by that view's routing
|
|
169
|
+
* Project, so it lands in `demanded` and Q2's "flag absent from demanded" check
|
|
170
|
+
* abstains — the write path can never reach this rewrite. (Mirrors
|
|
171
|
+
* `join-existence-pruning`'s by-construction argument.) Separately, a semi join
|
|
172
|
+
* short-circuits the R scan at the first match, changing R's *execution count*, so
|
|
173
|
+
* we guard impure R with `subtreeHasSideEffects(J.right)` and register the rule
|
|
174
|
+
* `sideEffectMode: 'aware'` (mirroring `subquery-decorrelation`, which likewise
|
|
175
|
+
* refuses an impure inner). The flag-drop itself is read-only; the guard is purely
|
|
176
|
+
* about R's iteration count.
|
|
177
|
+
*
|
|
178
|
+
* **Termination.** The output is a semi/anti join with no existence spec, so
|
|
179
|
+
* re-running the rule no-ops (the anchor requires a flag-bearing `left` join
|
|
180
|
+
* below). No rewrite loop.
|
|
181
|
+
*/
|
|
182
|
+
import { createLogger } from '../../../common/logger.js';
|
|
183
|
+
import { isRelationalNode } from '../../nodes/plan-node.js';
|
|
184
|
+
import { ProjectNode } from '../../nodes/project-node.js';
|
|
185
|
+
import { AggregateNode } from '../../nodes/aggregate-node.js';
|
|
186
|
+
import { FilterNode } from '../../nodes/filter.js';
|
|
187
|
+
import { JoinNode, extractEquiPairsFromCondition } from '../../nodes/join-node.js';
|
|
188
|
+
import { ColumnReferenceNode } from '../../nodes/reference.js';
|
|
189
|
+
import { UnaryOpNode, BinaryOpNode, LiteralNode } from '../../nodes/scalar.js';
|
|
190
|
+
import { normalizePredicate } from '../../analysis/predicate-normalizer.js';
|
|
191
|
+
import { splitConjuncts, combineConjuncts } from '../../analysis/predicate-conjuncts.js';
|
|
192
|
+
import { PlanNodeCharacteristics } from '../../framework/characteristics.js';
|
|
193
|
+
import { isUnique } from '../../util/fd-utils.js';
|
|
194
|
+
import { collectAttrIds, walkChain, rebuildChain, rebuildProject, } from './rule-join-elimination.js';
|
|
195
|
+
const log = createLogger('optimizer:rule:semijoin-existence-recovery');
|
|
196
|
+
export function ruleSemijoinExistenceRecovery(node, _context) {
|
|
197
|
+
if (!(node instanceof ProjectNode))
|
|
198
|
+
return null;
|
|
199
|
+
// `walkChain` mutates its `demanded` set; we ignore it (a throwaway here) and
|
|
200
|
+
// recompute demand conjunct-by-conjunct below so the probe can be excluded.
|
|
201
|
+
const walk = walkChain(node.source, new Set());
|
|
202
|
+
if (!walk)
|
|
203
|
+
return null;
|
|
204
|
+
const { join, chain } = walk;
|
|
205
|
+
// Only the reachable flag-bearing shape: a `left join … exists right as` with
|
|
206
|
+
// a SOLE existence spec (Q3 / Q4). A mixed join cannot be split into a semi.
|
|
207
|
+
if (join.joinType !== 'left')
|
|
208
|
+
return null;
|
|
209
|
+
if (!join.hasExistenceColumns)
|
|
210
|
+
return null;
|
|
211
|
+
const existence = join.existence;
|
|
212
|
+
if (existence.length !== 1)
|
|
213
|
+
return null;
|
|
214
|
+
const spec = existence[0];
|
|
215
|
+
if (spec.side !== 'right')
|
|
216
|
+
return null;
|
|
217
|
+
if (!join.condition)
|
|
218
|
+
return null;
|
|
219
|
+
const flagId = spec.attrId;
|
|
220
|
+
// Demand-SHAPE analysis: seed `demanded` from the Project's projections (the
|
|
221
|
+
// anchor's only scalar children that an ancestor can reference), then
|
|
222
|
+
// `analyzeChain` folds in the chain's non-probe conjuncts + sort keys and
|
|
223
|
+
// locates/classifies the sole probe conjunct (Q2). The returned `demanded` is
|
|
224
|
+
// the same set we passed in.
|
|
225
|
+
const demanded = new Set();
|
|
226
|
+
for (const proj of node.projections) {
|
|
227
|
+
collectAttrIds(proj.node, demanded);
|
|
228
|
+
}
|
|
229
|
+
const analysis = analyzeChain(demanded, chain, flagId);
|
|
230
|
+
if (!analysis)
|
|
231
|
+
return null;
|
|
232
|
+
const { probe } = analysis;
|
|
233
|
+
// The flag must not be demanded anywhere but the stripped probe (a flag that is
|
|
234
|
+
// selected or sorted on lands in `demanded` via projections / sort keys).
|
|
235
|
+
if (demanded.has(flagId))
|
|
236
|
+
return null;
|
|
237
|
+
// The semi/anti output is left columns only — abstain if any right column is
|
|
238
|
+
// demanded (that is the deferred outer→inner conversion, not a semi-join).
|
|
239
|
+
const rightAttrIds = join.right.getAttributes().map(a => a.id);
|
|
240
|
+
for (const id of rightAttrIds) {
|
|
241
|
+
if (demanded.has(id))
|
|
242
|
+
return null;
|
|
243
|
+
}
|
|
244
|
+
// SOUNDNESS — fan-out guard (SEMI only). A plain `left join … exists right as`
|
|
245
|
+
// does NOT collapse to one row per left row: the nested-loop emitter yields one
|
|
246
|
+
// output row per MATCHING right row, each carrying flag=true (see
|
|
247
|
+
// `emitLoopJoin`). So `where flag` keeps K rows for a left row with K matches,
|
|
248
|
+
// whereas a semi join keeps exactly one — the two diverge whenever a left row
|
|
249
|
+
// can match more than one right row. They agree iff every left row matches AT
|
|
250
|
+
// MOST ONE right row, i.e. the equi-join columns cover a unique key of the right
|
|
251
|
+
// side. The ANTI path is immune: an unmatched left row yields exactly one
|
|
252
|
+
// null-extension regardless of fan-out, and matched rows are filtered out, so
|
|
253
|
+
// `anti(L,R,cond)` equals `left join … where not flag` for arbitrary `cond`.
|
|
254
|
+
if (probe.polarity === 'semi' && !rightMatchesAtMostOne(join)) {
|
|
255
|
+
log('Semi recovery skipped: right side may match >1 row per left row (fan-out)');
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
// A semi join short-circuits the R scan at the first match — refuse to change
|
|
259
|
+
// R's execution count when R carries a write (Q7).
|
|
260
|
+
if (PlanNodeCharacteristics.subtreeHasSideEffects(join.right)) {
|
|
261
|
+
log('Recovery skipped: right side has side effects');
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
const newJoinType = probe.polarity;
|
|
265
|
+
const semiAnti = new JoinNode(join.scope, join.left, join.right, newJoinType, join.condition);
|
|
266
|
+
log('Recovered %s join from probe-only existence flag %s', newJoinType, spec.name);
|
|
267
|
+
const newSource = rebuildChainStrippingProbe(chain, probe, semiAnti);
|
|
268
|
+
return rebuildProject(node, newSource);
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Aggregate counterpart of `ruleSemijoinExistenceRecovery` (see the "Two
|
|
272
|
+
* entrypoints" note in the file header). When the flag-bearing `left join … exists
|
|
273
|
+
* right as` sits under a bare aggregate (`select count(*) from … where flag`,
|
|
274
|
+
* `select flag, count(*) … group by flag`) with **no enclosing Project**, the probe
|
|
275
|
+
* Filter and the join sit *under* the AggregateNode, so the Project entrypoint never
|
|
276
|
+
* fires. This anchor walks down from the Aggregate's source through the SAME
|
|
277
|
+
* whitelisted pass-through chain to the flag-bearing join, runs the SAME demand-SHAPE
|
|
278
|
+
* proof, fan-out guard (semi only), and impure-R guard, and rebuilds the SAME
|
|
279
|
+
* probe-stripped chain — differing from the Project entrypoint in only two places:
|
|
280
|
+
*
|
|
281
|
+
* - **Demand-seed prologue.** Seed `demanded` from the Aggregate's group-by
|
|
282
|
+
* expressions + every aggregate expression (its only scalar children) instead of
|
|
283
|
+
* a Project's projections. A flag *grouped on* (`group by flag`) lands in
|
|
284
|
+
* `demanded` and abstains; an aggregate over a right column (`count(p.pv)`) lands
|
|
285
|
+
* a right attr id in `demanded` and abstains.
|
|
286
|
+
* - **Rebuild epilogue.** Reconstruct the `AggregateNode` with `preserveAttributeIds`
|
|
287
|
+
* so its output ids stay stable (mirrors `ruleJoinExistencePruningUnderAggregate`
|
|
288
|
+
* / `ruleJoinEliminationUnderAggregate`).
|
|
289
|
+
*
|
|
290
|
+
* Unlike the Project anchor there is **no inner-join fallback**: a positive probe
|
|
291
|
+
* with a right column demanded, or over a fan-out (non-unique) R, simply stays a
|
|
292
|
+
* flag-bearing `left` join (sound, just unoptimized) — the `count(*) … where flag`
|
|
293
|
+
* shape is the target, and the inner-only cardinality cascade is out of scope here.
|
|
294
|
+
*
|
|
295
|
+
* HAVING does not block: `having count(*) > 0` is a `FilterNode` *above* the
|
|
296
|
+
* Aggregate that can only reference the Aggregate's outputs (group keys / aggregate
|
|
297
|
+
* results), never the raw flag — so it never appears in `walkChain` and needs no
|
|
298
|
+
* handling (mirrors the HAVING note in `ruleJoinExistencePruningUnderAggregate`).
|
|
299
|
+
*/
|
|
300
|
+
export function ruleSemijoinExistenceRecoveryUnderAggregate(node, _context) {
|
|
301
|
+
if (!(node instanceof AggregateNode))
|
|
302
|
+
return null;
|
|
303
|
+
// `walkChain` mutates its `demanded` set; we ignore it (a throwaway) and seed
|
|
304
|
+
// demand from the Aggregate's scalar children below, so the probe can be excluded.
|
|
305
|
+
const walk = walkChain(node.source, new Set());
|
|
306
|
+
if (!walk)
|
|
307
|
+
return null;
|
|
308
|
+
const { join, chain } = walk;
|
|
309
|
+
// Same reachable flag-bearing shape as the Project entrypoint: a `left join …
|
|
310
|
+
// exists right as` with a SOLE existence spec. A mixed join cannot be split;
|
|
311
|
+
// `join-existence-pruning-aggregate` strips an undemanded sibling first.
|
|
312
|
+
if (join.joinType !== 'left')
|
|
313
|
+
return null;
|
|
314
|
+
if (!join.hasExistenceColumns)
|
|
315
|
+
return null;
|
|
316
|
+
const existence = join.existence;
|
|
317
|
+
if (existence.length !== 1)
|
|
318
|
+
return null;
|
|
319
|
+
const spec = existence[0];
|
|
320
|
+
if (spec.side !== 'right')
|
|
321
|
+
return null;
|
|
322
|
+
if (!join.condition)
|
|
323
|
+
return null;
|
|
324
|
+
const flagId = spec.attrId;
|
|
325
|
+
// Demand-seed prologue — the ONLY divergence from the Project rule's demand
|
|
326
|
+
// half. The Aggregate's group-by + aggregate expressions are its only scalar
|
|
327
|
+
// children, so they bound everything any ancestor can reference.
|
|
328
|
+
const demanded = new Set();
|
|
329
|
+
for (const groupExpr of node.groupBy) {
|
|
330
|
+
collectAttrIds(groupExpr, demanded);
|
|
331
|
+
}
|
|
332
|
+
for (const agg of node.aggregates) {
|
|
333
|
+
collectAttrIds(agg.expression, demanded);
|
|
334
|
+
}
|
|
335
|
+
const analysis = analyzeChain(demanded, chain, flagId);
|
|
336
|
+
if (!analysis)
|
|
337
|
+
return null;
|
|
338
|
+
const { probe } = analysis;
|
|
339
|
+
// The flag must not be demanded anywhere but the stripped probe (a flag that is
|
|
340
|
+
// grouped on lands in `demanded` via groupBy and abstains).
|
|
341
|
+
if (demanded.has(flagId))
|
|
342
|
+
return null;
|
|
343
|
+
// The semi/anti output is left columns only — abstain if any right column is
|
|
344
|
+
// demanded (an aggregate over a right column, e.g. `count(p.pv)`, lands here).
|
|
345
|
+
// There is no aggregate inner fallback in scope, so the join stays `left`.
|
|
346
|
+
const rightAttrIds = join.right.getAttributes().map(a => a.id);
|
|
347
|
+
for (const id of rightAttrIds) {
|
|
348
|
+
if (demanded.has(id))
|
|
349
|
+
return null;
|
|
350
|
+
}
|
|
351
|
+
// Fan-out guard (SEMI only), identical to the Project rule (Q5): a plain
|
|
352
|
+
// `left join … exists right as` yields K rows per matched left row, whereas a
|
|
353
|
+
// semi join keeps one — sound only when every left row matches ≤1 right row.
|
|
354
|
+
// The ANTI path is immune (one null-extension per unmatched row, any fan-out).
|
|
355
|
+
if (probe.polarity === 'semi' && !rightMatchesAtMostOne(join)) {
|
|
356
|
+
log('Aggregate semi recovery skipped: right side may match >1 row per left row (fan-out)');
|
|
357
|
+
return null;
|
|
358
|
+
}
|
|
359
|
+
// A semi join short-circuits the R scan at the first match — refuse to change
|
|
360
|
+
// R's execution count when R carries a write (Q7).
|
|
361
|
+
if (PlanNodeCharacteristics.subtreeHasSideEffects(join.right)) {
|
|
362
|
+
log('Aggregate recovery skipped: right side has side effects');
|
|
363
|
+
return null;
|
|
364
|
+
}
|
|
365
|
+
const newJoinType = probe.polarity;
|
|
366
|
+
const semiAnti = new JoinNode(join.scope, join.left, join.right, newJoinType, join.condition);
|
|
367
|
+
log('Recovered %s join under Aggregate from probe-only existence flag %s', newJoinType, spec.name);
|
|
368
|
+
const newSource = rebuildChainStrippingProbe(chain, probe, semiAnti);
|
|
369
|
+
if (!isRelationalNode(newSource)) {
|
|
370
|
+
throw new Error('rule-semijoin-existence-recovery-aggregate: rebuilt source must be relational');
|
|
371
|
+
}
|
|
372
|
+
return new AggregateNode(node.scope, newSource, node.groupBy, node.aggregates, undefined, // estimatedCostOverride
|
|
373
|
+
node.getAttributes());
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Fold the chain's residual demand into the caller-supplied `demanded` set and
|
|
377
|
+
* locate the sole probe conjunct. `demanded` is **pre-seeded by the caller** from
|
|
378
|
+
* its anchor's scalar children (a Project's projections, or an Aggregate's
|
|
379
|
+
* group-by + aggregate expressions); this routine adds every chain Filter's
|
|
380
|
+
* NON-probe conjuncts and every chain Sort's keys (Limit/Distinct/Alias add
|
|
381
|
+
* nothing). The set is mutated in place and also returned for the caller's
|
|
382
|
+
* convenience. After the call, `demanded` is everything any ancestor of the
|
|
383
|
+
* anchor can reference EXCEPT the single stripped probe conjunct.
|
|
384
|
+
*
|
|
385
|
+
* Returns null when the demand SHAPE disqualifies the rewrite: no probe found,
|
|
386
|
+
* the flag referenced in more than one conjunct, or the flag inside a non-probe
|
|
387
|
+
* conjunct shape (`f or x`, `f(x)`, …).
|
|
388
|
+
*/
|
|
389
|
+
export function analyzeChain(demanded, chain, flagId) {
|
|
390
|
+
let probe = null;
|
|
391
|
+
for (let i = 0; i < chain.length; i++) {
|
|
392
|
+
const entry = chain[i];
|
|
393
|
+
switch (entry.kind) {
|
|
394
|
+
case 'filter': {
|
|
395
|
+
const conjuncts = splitConjuncts(entry.node.predicate);
|
|
396
|
+
const flagConjuncts = [];
|
|
397
|
+
const nonFlagConjuncts = [];
|
|
398
|
+
for (const conj of conjuncts) {
|
|
399
|
+
if (referencesAttr(conj, flagId)) {
|
|
400
|
+
flagConjuncts.push(conj);
|
|
401
|
+
}
|
|
402
|
+
else {
|
|
403
|
+
nonFlagConjuncts.push(conj);
|
|
404
|
+
collectAttrIds(conj, demanded);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
if (flagConjuncts.length > 0) {
|
|
408
|
+
// More than one flag reference (here or already seen) ⇒ not a sole probe.
|
|
409
|
+
if (flagConjuncts.length > 1 || probe !== null)
|
|
410
|
+
return null;
|
|
411
|
+
const polarity = classifyProbe(flagConjuncts[0], flagId);
|
|
412
|
+
if (!polarity)
|
|
413
|
+
return null; // flag in a non-probe conjunct shape
|
|
414
|
+
probe = {
|
|
415
|
+
chainIndex: i,
|
|
416
|
+
filter: entry.node,
|
|
417
|
+
residualConjuncts: nonFlagConjuncts,
|
|
418
|
+
polarity,
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
break;
|
|
422
|
+
}
|
|
423
|
+
case 'sort': {
|
|
424
|
+
for (const k of entry.node.sortKeys) {
|
|
425
|
+
collectAttrIds(k.expression, demanded);
|
|
426
|
+
}
|
|
427
|
+
break;
|
|
428
|
+
}
|
|
429
|
+
// LimitOffset / Distinct / Alias demand nothing.
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
if (!probe)
|
|
433
|
+
return null;
|
|
434
|
+
return { demanded, probe };
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* True iff every left row matches AT MOST ONE right row under `join.condition` —
|
|
438
|
+
* the precondition for a sound SEMI rewrite (see the fan-out guard at the call
|
|
439
|
+
* site). Holds when the equi-join columns cover a unique key of the right side
|
|
440
|
+
* (`isUnique`), which subsumes both the FK→PK case (right PK covered) and a
|
|
441
|
+
* ≤1-row right relation (the empty key, when there are no equi-pairs). Reads the
|
|
442
|
+
* right side's full uniqueness surface — declared keys plus FD-derived keys via
|
|
443
|
+
* `physical` — exactly as `JoinNode.computePhysical` does.
|
|
444
|
+
*
|
|
445
|
+
* Exported for `rule-inner-join-existence-recovery`, which consults the SAME
|
|
446
|
+
* predicate to decide its abstention boundary: it defers to this (semi) rule only
|
|
447
|
+
* where R is unique (≤1 match ⇒ the leaner semi join is sound and strictly
|
|
448
|
+
* better), and fires the fan-out-safe inner fallback where R is NOT unique (semi
|
|
449
|
+
* abstains here). Sharing one function makes the two rules agree on the
|
|
450
|
+
* unique/fan-out boundary by construction — no drift.
|
|
451
|
+
*/
|
|
452
|
+
export function rightMatchesAtMostOne(join) {
|
|
453
|
+
const leftAttrs = join.left.getAttributes();
|
|
454
|
+
const rightAttrs = join.right.getAttributes();
|
|
455
|
+
const pairs = extractEquiPairsFromCondition(join.condition, leftAttrs, rightAttrs);
|
|
456
|
+
const rightRel = { getType: () => join.right.getType(), physical: join.right.physical };
|
|
457
|
+
return isUnique(pairs.map(p => p.right), rightRel);
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Classify a flag-referencing conjunct as a probe normal form (Q2). The conjunct
|
|
461
|
+
* is normalized first so `not not f` collapses and NOT pushes down. Returns the
|
|
462
|
+
* resulting join polarity, or null when the shape is not a pure probe.
|
|
463
|
+
*/
|
|
464
|
+
export function classifyProbe(conj, flagId) {
|
|
465
|
+
const n = normalizePredicate(conj);
|
|
466
|
+
// `f` — bare boolean colref.
|
|
467
|
+
if (n instanceof ColumnReferenceNode) {
|
|
468
|
+
return n.attributeId === flagId ? 'semi' : null;
|
|
469
|
+
}
|
|
470
|
+
// `not f` — NOT over the flag colref.
|
|
471
|
+
if (n instanceof UnaryOpNode && n.expression.operator === 'NOT') {
|
|
472
|
+
if (n.operand instanceof ColumnReferenceNode && n.operand.attributeId === flagId) {
|
|
473
|
+
return 'anti';
|
|
474
|
+
}
|
|
475
|
+
return null;
|
|
476
|
+
}
|
|
477
|
+
// `f is true` / `f is not false` (semi) and `f is false` / `f is not true`
|
|
478
|
+
// (anti). The `is not …` collapses are EXACT only because the flag is provably
|
|
479
|
+
// non-null (`EXISTENCE_FLAG_TYPE.nullable === false`): `f is not false` ≡ `f =
|
|
480
|
+
// true` and `f is not true` ≡ `f = false` solely because no NULL row exists to
|
|
481
|
+
// land in the `is not` bucket. `is [not] null` is deliberately NOT listed — over
|
|
482
|
+
// the non-null flag it is a constant (`is not null` ≡ true, `is null` ≡ false),
|
|
483
|
+
// not a probe — so it falls through to `return null` and the rule abstains.
|
|
484
|
+
if (n instanceof UnaryOpNode && isFlagColRef(n.operand, flagId)) {
|
|
485
|
+
switch (n.expression.operator) {
|
|
486
|
+
case 'IS TRUE':
|
|
487
|
+
case 'IS NOT FALSE': return 'semi';
|
|
488
|
+
case 'IS FALSE':
|
|
489
|
+
case 'IS NOT TRUE': return 'anti';
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
// `f = true` / `true = f` (semi) and `f = false` / `false = f` (anti).
|
|
493
|
+
if (n instanceof BinaryOpNode && n.expression.operator === '=') {
|
|
494
|
+
const flagSide = isFlagColRef(n.left, flagId) ? n.left
|
|
495
|
+
: isFlagColRef(n.right, flagId) ? n.right
|
|
496
|
+
: null;
|
|
497
|
+
if (!flagSide)
|
|
498
|
+
return null;
|
|
499
|
+
const other = flagSide === n.left ? n.right : n.left;
|
|
500
|
+
const bool = booleanLiteralValue(other);
|
|
501
|
+
if (bool === true)
|
|
502
|
+
return 'semi';
|
|
503
|
+
if (bool === false)
|
|
504
|
+
return 'anti';
|
|
505
|
+
}
|
|
506
|
+
return null;
|
|
507
|
+
}
|
|
508
|
+
function isFlagColRef(node, flagId) {
|
|
509
|
+
return node instanceof ColumnReferenceNode && node.attributeId === flagId;
|
|
510
|
+
}
|
|
511
|
+
/** The boolean value of a boolean `LiteralNode`, or undefined for anything else. */
|
|
512
|
+
function booleanLiteralValue(node) {
|
|
513
|
+
if (node instanceof LiteralNode && typeof node.expression.value === 'boolean') {
|
|
514
|
+
return node.expression.value;
|
|
515
|
+
}
|
|
516
|
+
return undefined;
|
|
517
|
+
}
|
|
518
|
+
/** True iff `attrId` is referenced by any `ColumnReferenceNode` in the subtree. */
|
|
519
|
+
function referencesAttr(node, attrId) {
|
|
520
|
+
if (node instanceof ColumnReferenceNode) {
|
|
521
|
+
return node.attributeId === attrId;
|
|
522
|
+
}
|
|
523
|
+
for (const child of node.getChildren()) {
|
|
524
|
+
if (referencesAttr(child, attrId))
|
|
525
|
+
return true;
|
|
526
|
+
}
|
|
527
|
+
return false;
|
|
528
|
+
}
|
|
529
|
+
/**
|
|
530
|
+
* Rebuild the pass-through chain on top of the recovered join (`recovered` — a
|
|
531
|
+
* semi/anti join here, an inner join in the sibling rule), stripping the sole
|
|
532
|
+
* probe conjunct from its FilterNode (omitting the Filter entirely when no
|
|
533
|
+
* residual conjunct remains). Reuses `rebuildChain` for the entries below and
|
|
534
|
+
* above the probe filter; only the probe filter itself is special-cased.
|
|
535
|
+
*/
|
|
536
|
+
export function rebuildChainStrippingProbe(chain, probe, recovered) {
|
|
537
|
+
// Chain is collected top→bottom; entries AFTER the probe are closer to the join.
|
|
538
|
+
const below = chain.slice(probe.chainIndex + 1);
|
|
539
|
+
const above = chain.slice(0, probe.chainIndex);
|
|
540
|
+
let current = rebuildChain(below, recovered);
|
|
541
|
+
const residualPred = combineConjuncts(probe.residualConjuncts);
|
|
542
|
+
if (residualPred !== null) {
|
|
543
|
+
current = new FilterNode(probe.filter.scope, current, residualPred);
|
|
544
|
+
}
|
|
545
|
+
// else: the probe was the filter's only conjunct — omit the Filter.
|
|
546
|
+
return rebuildChain(above, current);
|
|
547
|
+
}
|
|
548
|
+
//# sourceMappingURL=rule-semijoin-existence-recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-semijoin-existence-recovery.js","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-semijoin-existence-recovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoLG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAiB,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AAClG,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAe,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EACN,cAAc,EACd,SAAS,EACT,YAAY,EACZ,cAAc,GAEd,MAAM,4BAA4B,CAAC;AAEpC,MAAM,GAAG,GAAG,YAAY,CAAC,4CAA4C,CAAC,CAAC;AAqBvE,MAAM,UAAU,6BAA6B,CAAC,IAAc,EAAE,QAAoB;IACjF,IAAI,CAAC,CAAC,IAAI,YAAY,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAEhD,8EAA8E;IAC9E,4EAA4E;IAC5E,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,EAAU,CAAC,CAAC;IACvD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAE7B,8EAA8E;IAC9E,6EAA6E;IAC7E,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,CAAC,IAAI,CAAC,mBAAmB;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAU,CAAC;IAClC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACvC,IAAI,CAAC,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAE3B,6EAA6E;IAC7E,sEAAsE;IACtE,0EAA0E;IAC1E,8EAA8E;IAC9E,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACvD,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;IAE3B,gFAAgF;IAChF,0EAA0E;IAC1E,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtC,6EAA6E;IAC7E,2EAA2E;IAC3E,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/D,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;QAC/B,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;IACnC,CAAC;IAED,+EAA+E;IAC/E,gFAAgF;IAChF,kEAAkE;IAClE,+EAA+E;IAC/E,8EAA8E;IAC9E,8EAA8E;IAC9E,iFAAiF;IACjF,0EAA0E;IAC1E,8EAA8E;IAC9E,6EAA6E;IAC7E,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/D,GAAG,CAAC,2EAA2E,CAAC,CAAC;QACjF,OAAO,IAAI,CAAC;IACb,CAAC;IAED,8EAA8E;IAC9E,mDAAmD;IACnD,IAAI,uBAAuB,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/D,GAAG,CAAC,+CAA+C,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,WAAW,GAAa,KAAK,CAAC,QAAQ,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAC5B,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,KAAK,EACV,WAAW,EACX,IAAI,CAAC,SAAS,CAEd,CAAC;IAEF,GAAG,CAAC,qDAAqD,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAEnF,MAAM,SAAS,GAAG,0BAA0B,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACrE,OAAO,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACxC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,UAAU,2CAA2C,CAAC,IAAc,EAAE,QAAoB;IAC/F,IAAI,CAAC,CAAC,IAAI,YAAY,aAAa,CAAC;QAAE,OAAO,IAAI,CAAC;IAElD,8EAA8E;IAC9E,mFAAmF;IACnF,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,EAAU,CAAC,CAAC;IACvD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAE7B,8EAA8E;IAC9E,6EAA6E;IAC7E,yEAAyE;IACzE,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,CAAC,IAAI,CAAC,mBAAmB;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAU,CAAC;IAClC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACvC,IAAI,CAAC,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAE3B,4EAA4E;IAC5E,6EAA6E;IAC7E,iEAAiE;IACjE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACtC,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACrC,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACnC,cAAc,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACvD,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;IAE3B,gFAAgF;IAChF,4DAA4D;IAC5D,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtC,6EAA6E;IAC7E,+EAA+E;IAC/E,2EAA2E;IAC3E,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/D,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;QAC/B,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;IACnC,CAAC;IAED,yEAAyE;IACzE,8EAA8E;IAC9E,6EAA6E;IAC7E,+EAA+E;IAC/E,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/D,GAAG,CAAC,qFAAqF,CAAC,CAAC;QAC3F,OAAO,IAAI,CAAC;IACb,CAAC;IAED,8EAA8E;IAC9E,mDAAmD;IACnD,IAAI,uBAAuB,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/D,GAAG,CAAC,yDAAyD,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,WAAW,GAAa,KAAK,CAAC,QAAQ,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAC5B,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,KAAK,EACV,WAAW,EACX,IAAI,CAAC,SAAS,CAEd,CAAC;IAEF,GAAG,CAAC,qEAAqE,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAEnG,MAAM,SAAS,GAAG,0BAA0B,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACrE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,+EAA+E,CAAC,CAAC;IAClG,CAAC;IACD,OAAO,IAAI,aAAa,CACvB,IAAI,CAAC,KAAK,EACV,SAAS,EACT,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,UAAU,EACf,SAAS,EAAc,wBAAwB;IAC/C,IAAI,CAAC,aAAa,EAAE,CACpB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,YAAY,CAC3B,QAAqB,EACrB,KAAgC,EAChC,MAAc;IAEd,IAAI,KAAK,GAAsB,IAAI,CAAC;IAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACf,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACvD,MAAM,aAAa,GAAqB,EAAE,CAAC;gBAC3C,MAAM,gBAAgB,GAAqB,EAAE,CAAC;gBAC9C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;oBAC9B,IAAI,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;wBAClC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC1B,CAAC;yBAAM,CAAC;wBACP,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC5B,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;oBAChC,CAAC;gBACF,CAAC;gBACD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC9B,0EAA0E;oBAC1E,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,KAAK,IAAI;wBAAE,OAAO,IAAI,CAAC;oBAC5D,MAAM,QAAQ,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;oBACzD,IAAI,CAAC,QAAQ;wBAAE,OAAO,IAAI,CAAC,CAAC,qCAAqC;oBACjE,KAAK,GAAG;wBACP,UAAU,EAAE,CAAC;wBACb,MAAM,EAAE,KAAK,CAAC,IAAI;wBAClB,iBAAiB,EAAE,gBAAgB;wBACnC,QAAQ;qBACR,CAAC;gBACH,CAAC;gBACD,MAAM;YACP,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACb,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACrC,cAAc,CAAC,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;gBACxC,CAAC;gBACD,MAAM;YACP,CAAC;YACD,iDAAiD;QAClD,CAAC;IACF,CAAC;IAED,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAc;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAG,6BAA6B,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACnF,MAAM,QAAQ,GAAW,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;IAChG,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAC;AACpD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAoB,EAAE,MAAc;IACjE,MAAM,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAEnC,6BAA6B;IAC7B,IAAI,CAAC,YAAY,mBAAmB,EAAE,CAAC;QACtC,OAAO,CAAC,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACjD,CAAC;IAED,sCAAsC;IACtC,IAAI,CAAC,YAAY,WAAW,IAAI,CAAC,CAAC,UAAU,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;QACjE,IAAI,CAAC,CAAC,OAAO,YAAY,mBAAmB,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,KAAK,MAAM,EAAE,CAAC;YAClF,OAAO,MAAM,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,2EAA2E;IAC3E,+EAA+E;IAC/E,+EAA+E;IAC/E,+EAA+E;IAC/E,iFAAiF;IACjF,gFAAgF;IAChF,4EAA4E;IAC5E,IAAI,CAAC,YAAY,WAAW,IAAI,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;QACjE,QAAQ,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;YAC/B,KAAK,SAAS,CAAC;YACf,KAAK,cAAc,CAAC,CAAC,OAAO,MAAM,CAAC;YACnC,KAAK,UAAU,CAAC;YAChB,KAAK,aAAa,CAAC,CAAC,OAAO,MAAM,CAAC;QACnC,CAAC;IACF,CAAC;IAED,uEAAuE;IACvE,IAAI,CAAC,YAAY,YAAY,IAAI,CAAC,CAAC,UAAU,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;QAChE,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;YACrD,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;gBACzC,CAAC,CAAC,IAAI,CAAC;QACR,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC3B,MAAM,KAAK,GAAG,QAAQ,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrD,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,MAAM,CAAC;QACjC,IAAI,IAAI,KAAK,KAAK;YAAE,OAAO,MAAM,CAAC;IACnC,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,IAAoB,EAAE,MAAc;IACzD,OAAO,IAAI,YAAY,mBAAmB,IAAI,IAAI,CAAC,WAAW,KAAK,MAAM,CAAC;AAC3E,CAAC;AAED,oFAAoF;AACpF,SAAS,mBAAmB,CAAC,IAAoB;IAChD,IAAI,IAAI,YAAY,WAAW,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/E,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;IAC9B,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,mFAAmF;AACnF,SAAS,cAAc,CAAC,IAAc,EAAE,MAAc;IACrD,IAAI,IAAI,YAAY,mBAAmB,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC,WAAW,KAAK,MAAM,CAAC;IACpC,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACxC,IAAI,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;IAChD,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B,CACzC,KAAgC,EAChC,KAAiB,EACjB,SAA6B;IAE7B,iFAAiF;IACjF,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAE/C,IAAI,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAE7C,MAAM,YAAY,GAAG,gBAAgB,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC/D,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC3B,OAAO,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IACrE,CAAC;IACD,oEAAoE;IAEpE,OAAO,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-async-gather-union-all.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/parallel/rule-async-gather-union-all.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAsB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"rule-async-gather-union-all.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/parallel/rule-async-gather-union-all.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAsB,MAAM,0BAA0B,CAAC;AAQ7E,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAsD5F"}
|
|
@@ -41,6 +41,7 @@ import { createLogger } from '../../../common/logger.js';
|
|
|
41
41
|
import { PlanNodeType } from '../../nodes/plan-node-type.js';
|
|
42
42
|
import { SetOperationNode } from '../../nodes/set-operation-node.js';
|
|
43
43
|
import { AsyncGatherNode } from '../../nodes/async-gather-node.js';
|
|
44
|
+
import { PlanNodeCharacteristics } from '../../framework/characteristics.js';
|
|
44
45
|
const log = createLogger('optimizer:rule:async-gather-union-all');
|
|
45
46
|
export function ruleAsyncGatherUnionAll(node, context) {
|
|
46
47
|
if (!(node instanceof SetOperationNode))
|
|
@@ -57,12 +58,19 @@ export function ruleAsyncGatherUnionAll(node, context) {
|
|
|
57
58
|
if (children.length < tuning.minBranches)
|
|
58
59
|
return null;
|
|
59
60
|
// Gate 1: every child must be concurrency-safe. A single unsafe branch
|
|
60
|
-
// poisons the rewrite.
|
|
61
|
+
// poisons the rewrite. Side-effect freedom (`isConcurrencySafe`) is the
|
|
62
|
+
// connection-lock gate that pairs with the module-level `concurrencySafe`
|
|
63
|
+
// physical flag: an impure subtree on a `'serial'` / `'reentrant-reads'`
|
|
64
|
+
// module would violate the connection lock under concurrent execution.
|
|
61
65
|
for (const child of children) {
|
|
62
66
|
if (child.physical.concurrencySafe !== true) {
|
|
63
67
|
log('Aborting rewrite: child %s is not concurrencySafe', child.id);
|
|
64
68
|
return null;
|
|
65
69
|
}
|
|
70
|
+
if (!PlanNodeCharacteristics.isConcurrencySafe(child)) {
|
|
71
|
+
log('Aborting rewrite: child %s has side effects', child.id);
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
66
74
|
}
|
|
67
75
|
// Gate 2: max-of-children latency must meet the threshold. Memory-vtab /
|
|
68
76
|
// in-process leaves declare expectedLatencyMs=0, so this skips the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-async-gather-union-all.js","sourceRoot":"","sources":["../../../../../src/planner/rules/parallel/rule-async-gather-union-all.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"rule-async-gather-union-all.js","sourceRoot":"","sources":["../../../../../src/planner/rules/parallel/rule-async-gather-union-all.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-async-gather-zip-by-key.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/parallel/rule-async-gather-zip-by-key.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiGG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAoB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"rule-async-gather-zip-by-key.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/parallel/rule-async-gather-zip-by-key.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiGG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAoB,MAAM,0BAA0B,CAAC;AAsBtE,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAyH5F"}
|
|
@@ -105,6 +105,7 @@ import { ColumnReferenceNode } from '../../nodes/reference.js';
|
|
|
105
105
|
import { ScalarFunctionCallNode } from '../../nodes/function.js';
|
|
106
106
|
import { AsyncGatherNode } from '../../nodes/async-gather-node.js';
|
|
107
107
|
import { isCorrelatedSubquery } from '../../cache/correlation-detector.js';
|
|
108
|
+
import { PlanNodeCharacteristics } from '../../framework/characteristics.js';
|
|
108
109
|
const log = createLogger('optimizer:rule:async-gather-zip-by-key');
|
|
109
110
|
export function ruleAsyncGatherZipByKey(node, context) {
|
|
110
111
|
if (!(node instanceof ProjectNode))
|
|
@@ -145,6 +146,8 @@ export function ruleAsyncGatherZipByKey(node, context) {
|
|
|
145
146
|
const branchKeyAttrs = branches.map((_branch, b) => groups.map(g => g.byBranch[b]));
|
|
146
147
|
// Gates (mirror rule-async-gather-union-all). These are projection-layout
|
|
147
148
|
// independent, so they run once before deciding canonical-vs-reordered.
|
|
149
|
+
// `isConcurrencySafe` is the connection-lock gate (side-effect freedom)
|
|
150
|
+
// pairing with the module-level `physical.concurrencySafe` flag.
|
|
148
151
|
for (const branch of branches) {
|
|
149
152
|
if (branch.physical.concurrencySafe !== true) {
|
|
150
153
|
log('Aborting: branch %s is not concurrencySafe', branch.id);
|
|
@@ -154,6 +157,10 @@ export function ruleAsyncGatherZipByKey(node, context) {
|
|
|
154
157
|
log('Aborting: branch %s is correlated (lateral dependency)', branch.id);
|
|
155
158
|
return null;
|
|
156
159
|
}
|
|
160
|
+
if (!PlanNodeCharacteristics.isConcurrencySafe(branch)) {
|
|
161
|
+
log('Aborting: branch %s has side effects', branch.id);
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
157
164
|
}
|
|
158
165
|
let maxLatency = 0;
|
|
159
166
|
for (const branch of branches) {
|