@quereus/quereus 4.5.0 → 4.7.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 +5 -4
- package/dist/src/common/errors.d.ts +17 -0
- package/dist/src/common/errors.d.ts.map +1 -1
- package/dist/src/common/errors.js +21 -0
- package/dist/src/common/errors.js.map +1 -1
- package/dist/src/core/database-assertions.d.ts +4 -3
- package/dist/src/core/database-assertions.d.ts.map +1 -1
- package/dist/src/core/database-assertions.js +44 -14
- package/dist/src/core/database-assertions.js.map +1 -1
- package/dist/src/core/database-events.d.ts +161 -1
- package/dist/src/core/database-events.d.ts.map +1 -1
- package/dist/src/core/database-events.js +307 -5
- package/dist/src/core/database-events.js.map +1 -1
- package/dist/src/core/database-internal.d.ts +5 -2
- package/dist/src/core/database-internal.d.ts.map +1 -1
- package/dist/src/core/database-materialized-views-plan-builders.d.ts.map +1 -1
- package/dist/src/core/database-materialized-views-plan-builders.js +33 -4
- package/dist/src/core/database-materialized-views-plan-builders.js.map +1 -1
- package/dist/src/core/database-materialized-views-plans.d.ts +12 -2
- package/dist/src/core/database-materialized-views-plans.d.ts.map +1 -1
- package/dist/src/core/database-materialized-views.d.ts +46 -0
- package/dist/src/core/database-materialized-views.d.ts.map +1 -1
- package/dist/src/core/database-materialized-views.js +75 -4
- package/dist/src/core/database-materialized-views.js.map +1 -1
- package/dist/src/core/database-transaction.d.ts +9 -0
- package/dist/src/core/database-transaction.d.ts.map +1 -1
- package/dist/src/core/database-transaction.js +9 -0
- package/dist/src/core/database-transaction.js.map +1 -1
- package/dist/src/core/database.d.ts +16 -2
- package/dist/src/core/database.d.ts.map +1 -1
- package/dist/src/core/database.js +56 -15
- package/dist/src/core/database.js.map +1 -1
- package/dist/src/core/derived-row-validator.d.ts.map +1 -1
- package/dist/src/core/derived-row-validator.js +7 -1
- package/dist/src/core/derived-row-validator.js.map +1 -1
- package/dist/src/core/statement.d.ts.map +1 -1
- package/dist/src/core/statement.js +15 -5
- package/dist/src/core/statement.js.map +1 -1
- package/dist/src/emit/ast-stringify.d.ts +18 -2
- package/dist/src/emit/ast-stringify.d.ts.map +1 -1
- package/dist/src/emit/ast-stringify.js +22 -4
- package/dist/src/emit/ast-stringify.js.map +1 -1
- package/dist/src/func/builtins/aggregate.js +11 -11
- 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 +15 -85
- package/dist/src/func/builtins/builtin-window-functions.js.map +1 -1
- package/dist/src/func/builtins/conversion.d.ts.map +1 -1
- package/dist/src/func/builtins/conversion.js +10 -9
- package/dist/src/func/builtins/conversion.js.map +1 -1
- package/dist/src/func/builtins/datetime.d.ts.map +1 -1
- package/dist/src/func/builtins/datetime.js +28 -10
- package/dist/src/func/builtins/datetime.js.map +1 -1
- package/dist/src/func/builtins/explain.d.ts.map +1 -1
- package/dist/src/func/builtins/explain.js +19 -5
- package/dist/src/func/builtins/explain.js.map +1 -1
- package/dist/src/func/builtins/json.d.ts.map +1 -1
- package/dist/src/func/builtins/json.js +23 -17
- package/dist/src/func/builtins/json.js.map +1 -1
- package/dist/src/func/builtins/mutation.js +2 -2
- package/dist/src/func/builtins/mutation.js.map +1 -1
- package/dist/src/func/builtins/return-types.d.ts +327 -0
- package/dist/src/func/builtins/return-types.d.ts.map +1 -0
- package/dist/src/func/builtins/return-types.js +43 -0
- package/dist/src/func/builtins/return-types.js.map +1 -0
- package/dist/src/func/builtins/scalar.d.ts.map +1 -1
- package/dist/src/func/builtins/scalar.js +150 -79
- package/dist/src/func/builtins/scalar.js.map +1 -1
- package/dist/src/func/builtins/schema.d.ts.map +1 -1
- package/dist/src/func/builtins/schema.js +43 -8
- package/dist/src/func/builtins/schema.js.map +1 -1
- package/dist/src/func/builtins/string.d.ts.map +1 -1
- package/dist/src/func/builtins/string.js +4 -2
- package/dist/src/func/builtins/string.js.map +1 -1
- package/dist/src/func/builtins/timespan.d.ts +3 -0
- package/dist/src/func/builtins/timespan.d.ts.map +1 -1
- package/dist/src/func/builtins/timespan.js +15 -11
- package/dist/src/func/builtins/timespan.js.map +1 -1
- package/dist/src/func/registration.d.ts +35 -1
- package/dist/src/func/registration.d.ts.map +1 -1
- package/dist/src/func/registration.js +235 -41
- package/dist/src/func/registration.js.map +1 -1
- package/dist/src/index.d.ts +14 -7
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +15 -6
- package/dist/src/index.js.map +1 -1
- package/dist/src/parser/ast.d.ts +58 -1
- package/dist/src/parser/ast.d.ts.map +1 -1
- package/dist/src/parser/parser.d.ts +46 -0
- package/dist/src/parser/parser.d.ts.map +1 -1
- package/dist/src/parser/parser.js +161 -45
- package/dist/src/parser/parser.js.map +1 -1
- package/dist/src/parser/utils.d.ts +13 -1
- package/dist/src/parser/utils.d.ts.map +1 -1
- package/dist/src/parser/utils.js +14 -0
- package/dist/src/parser/utils.js.map +1 -1
- package/dist/src/planner/analysis/assertion-classifier.d.ts.map +1 -1
- package/dist/src/planner/analysis/assertion-classifier.js +7 -2
- 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 +5 -0
- package/dist/src/planner/analysis/assertion-hoist-cache.js.map +1 -1
- package/dist/src/planner/analysis/change-scope.d.ts +11 -3
- package/dist/src/planner/analysis/change-scope.d.ts.map +1 -1
- package/dist/src/planner/analysis/change-scope.js +5 -4
- package/dist/src/planner/analysis/change-scope.js.map +1 -1
- package/dist/src/planner/analysis/check-extraction.d.ts.map +1 -1
- package/dist/src/planner/analysis/check-extraction.js +37 -4
- package/dist/src/planner/analysis/check-extraction.js.map +1 -1
- package/dist/src/planner/analysis/comparison-collation.d.ts +20 -22
- package/dist/src/planner/analysis/comparison-collation.d.ts.map +1 -1
- package/dist/src/planner/analysis/comparison-collation.js +29 -26
- package/dist/src/planner/analysis/comparison-collation.js.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.d.ts +0 -7
- package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.js +59 -59
- package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
- package/dist/src/planner/analysis/coverage-prover.d.ts.map +1 -1
- package/dist/src/planner/analysis/coverage-prover.js +13 -5
- package/dist/src/planner/analysis/coverage-prover.js.map +1 -1
- package/dist/src/planner/analysis/equi-correlation.d.ts +6 -1
- package/dist/src/planner/analysis/equi-correlation.d.ts.map +1 -1
- package/dist/src/planner/analysis/equi-correlation.js +8 -1
- package/dist/src/planner/analysis/equi-correlation.js.map +1 -1
- package/dist/src/planner/analysis/predicate-dependencies.d.ts +34 -0
- package/dist/src/planner/analysis/predicate-dependencies.d.ts.map +1 -0
- package/dist/src/planner/analysis/predicate-dependencies.js +60 -0
- package/dist/src/planner/analysis/predicate-dependencies.js.map +1 -0
- package/dist/src/planner/analysis/query-rewrite-matcher.d.ts +1 -1
- package/dist/src/planner/analysis/query-rewrite-matcher.d.ts.map +1 -1
- package/dist/src/planner/analysis/query-rewrite-matcher.js +0 -26
- package/dist/src/planner/analysis/query-rewrite-matcher.js.map +1 -1
- package/dist/src/planner/building/alter-table.d.ts.map +1 -1
- package/dist/src/planner/building/alter-table.js +117 -43
- package/dist/src/planner/building/alter-table.js.map +1 -1
- package/dist/src/planner/building/coercion.d.ts +21 -45
- package/dist/src/planner/building/coercion.d.ts.map +1 -1
- package/dist/src/planner/building/coercion.js +42 -91
- package/dist/src/planner/building/coercion.js.map +1 -1
- package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
- package/dist/src/planner/building/constraint-builder.js +9 -5
- package/dist/src/planner/building/constraint-builder.js.map +1 -1
- package/dist/src/planner/building/create-assertion.d.ts.map +1 -1
- package/dist/src/planner/building/create-assertion.js +72 -1
- package/dist/src/planner/building/create-assertion.js.map +1 -1
- package/dist/src/planner/building/create-view.d.ts +6 -1
- package/dist/src/planner/building/create-view.d.ts.map +1 -1
- package/dist/src/planner/building/create-view.js +12 -3
- 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 +6 -2
- package/dist/src/planner/building/ddl.js.map +1 -1
- package/dist/src/planner/building/delete.d.ts.map +1 -1
- package/dist/src/planner/building/delete.js +23 -10
- package/dist/src/planner/building/delete.js.map +1 -1
- package/dist/src/planner/building/dml-target.d.ts.map +1 -1
- package/dist/src/planner/building/dml-target.js +4 -0
- package/dist/src/planner/building/dml-target.js.map +1 -1
- package/dist/src/planner/building/drop-assertion.d.ts.map +1 -1
- package/dist/src/planner/building/drop-assertion.js +3 -1
- package/dist/src/planner/building/drop-assertion.js.map +1 -1
- package/dist/src/planner/building/expression.d.ts +17 -0
- package/dist/src/planner/building/expression.d.ts.map +1 -1
- package/dist/src/planner/building/expression.js +28 -17
- package/dist/src/planner/building/expression.js.map +1 -1
- package/dist/src/planner/building/foreign-key-builder.d.ts.map +1 -1
- package/dist/src/planner/building/foreign-key-builder.js +7 -5
- package/dist/src/planner/building/foreign-key-builder.js.map +1 -1
- package/dist/src/planner/building/function-call.d.ts +35 -0
- package/dist/src/planner/building/function-call.d.ts.map +1 -1
- package/dist/src/planner/building/function-call.js +60 -42
- package/dist/src/planner/building/function-call.js.map +1 -1
- package/dist/src/planner/building/insert.d.ts.map +1 -1
- package/dist/src/planner/building/insert.js +185 -48
- package/dist/src/planner/building/insert.js.map +1 -1
- package/dist/src/planner/building/materialized-view.d.ts.map +1 -1
- package/dist/src/planner/building/materialized-view.js +3 -1
- package/dist/src/planner/building/materialized-view.js.map +1 -1
- package/dist/src/planner/building/schema-authored-context.d.ts +69 -0
- package/dist/src/planner/building/schema-authored-context.d.ts.map +1 -0
- package/dist/src/planner/building/schema-authored-context.js +75 -0
- package/dist/src/planner/building/schema-authored-context.js.map +1 -0
- package/dist/src/planner/building/schema-resolution.d.ts.map +1 -1
- package/dist/src/planner/building/schema-resolution.js +7 -4
- package/dist/src/planner/building/schema-resolution.js.map +1 -1
- package/dist/src/planner/building/select-aggregates.d.ts +188 -3
- package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
- package/dist/src/planner/building/select-aggregates.js +449 -65
- package/dist/src/planner/building/select-aggregates.js.map +1 -1
- package/dist/src/planner/building/select-compound.js +2 -2
- package/dist/src/planner/building/select-compound.js.map +1 -1
- package/dist/src/planner/building/select-context.d.ts +98 -0
- package/dist/src/planner/building/select-context.d.ts.map +1 -1
- package/dist/src/planner/building/select-context.js +120 -37
- package/dist/src/planner/building/select-context.js.map +1 -1
- package/dist/src/planner/building/select-modifiers.d.ts +10 -3
- package/dist/src/planner/building/select-modifiers.d.ts.map +1 -1
- package/dist/src/planner/building/select-modifiers.js +29 -8
- package/dist/src/planner/building/select-modifiers.js.map +1 -1
- package/dist/src/planner/building/select-ordinal.d.ts +64 -19
- package/dist/src/planner/building/select-ordinal.d.ts.map +1 -1
- package/dist/src/planner/building/select-ordinal.js +79 -30
- package/dist/src/planner/building/select-ordinal.js.map +1 -1
- package/dist/src/planner/building/select-projections.d.ts +1 -1
- package/dist/src/planner/building/select-projections.d.ts.map +1 -1
- package/dist/src/planner/building/select-projections.js +18 -11
- package/dist/src/planner/building/select-projections.js.map +1 -1
- package/dist/src/planner/building/select-window.d.ts +13 -3
- package/dist/src/planner/building/select-window.d.ts.map +1 -1
- package/dist/src/planner/building/select-window.js +142 -37
- package/dist/src/planner/building/select-window.js.map +1 -1
- package/dist/src/planner/building/select.d.ts +37 -1
- package/dist/src/planner/building/select.d.ts.map +1 -1
- package/dist/src/planner/building/select.js +240 -109
- package/dist/src/planner/building/select.js.map +1 -1
- package/dist/src/planner/building/update.d.ts.map +1 -1
- package/dist/src/planner/building/update.js +27 -13
- package/dist/src/planner/building/update.js.map +1 -1
- package/dist/src/planner/building/view-mutation-builder.d.ts +1 -1
- package/dist/src/planner/building/view-mutation-builder.d.ts.map +1 -1
- package/dist/src/planner/building/view-mutation-builder.js +102 -8
- package/dist/src/planner/building/view-mutation-builder.js.map +1 -1
- package/dist/src/planner/building/with.d.ts.map +1 -1
- package/dist/src/planner/building/with.js +34 -4
- package/dist/src/planner/building/with.js.map +1 -1
- package/dist/src/planner/cache/correlation-detector.d.ts +15 -0
- package/dist/src/planner/cache/correlation-detector.d.ts.map +1 -1
- package/dist/src/planner/cache/correlation-detector.js +26 -0
- package/dist/src/planner/cache/correlation-detector.js.map +1 -1
- package/dist/src/planner/cache/materialization-advisory.d.ts +7 -0
- package/dist/src/planner/cache/materialization-advisory.d.ts.map +1 -1
- package/dist/src/planner/cache/materialization-advisory.js +12 -3
- package/dist/src/planner/cache/materialization-advisory.js.map +1 -1
- package/dist/src/planner/cost/conjunct-cost.d.ts +40 -0
- package/dist/src/planner/cost/conjunct-cost.d.ts.map +1 -1
- package/dist/src/planner/cost/conjunct-cost.js +45 -0
- package/dist/src/planner/cost/conjunct-cost.js.map +1 -1
- package/dist/src/planner/cost/index.d.ts +10 -0
- package/dist/src/planner/cost/index.d.ts.map +1 -1
- package/dist/src/planner/cost/index.js +15 -0
- package/dist/src/planner/cost/index.js.map +1 -1
- package/dist/src/planner/framework/characteristics.d.ts +9 -0
- package/dist/src/planner/framework/characteristics.d.ts.map +1 -1
- package/dist/src/planner/framework/characteristics.js.map +1 -1
- package/dist/src/planner/framework/pass.d.ts +2 -0
- package/dist/src/planner/framework/pass.d.ts.map +1 -1
- package/dist/src/planner/framework/pass.js +15 -0
- package/dist/src/planner/framework/pass.js.map +1 -1
- package/dist/src/planner/mutation/backward-body.d.ts.map +1 -1
- package/dist/src/planner/mutation/backward-body.js +4 -1
- package/dist/src/planner/mutation/backward-body.js.map +1 -1
- package/dist/src/planner/mutation/body-context.d.ts +23 -0
- package/dist/src/planner/mutation/body-context.d.ts.map +1 -0
- package/dist/src/planner/mutation/body-context.js +26 -0
- package/dist/src/planner/mutation/body-context.js.map +1 -0
- package/dist/src/planner/mutation/cte-flatten.js +15 -2
- package/dist/src/planner/mutation/cte-flatten.js.map +1 -1
- package/dist/src/planner/mutation/decomposition.d.ts +8 -0
- package/dist/src/planner/mutation/decomposition.d.ts.map +1 -1
- package/dist/src/planner/mutation/decomposition.js +8 -3
- package/dist/src/planner/mutation/decomposition.js.map +1 -1
- package/dist/src/planner/mutation/lens-enforcement.js +1 -1
- package/dist/src/planner/mutation/multi-source.d.ts +7 -0
- package/dist/src/planner/mutation/multi-source.d.ts.map +1 -1
- package/dist/src/planner/mutation/multi-source.js +5 -0
- package/dist/src/planner/mutation/multi-source.js.map +1 -1
- package/dist/src/planner/mutation/mutation-diagnostic.d.ts +1 -1
- package/dist/src/planner/mutation/mutation-diagnostic.d.ts.map +1 -1
- package/dist/src/planner/mutation/mutation-diagnostic.js.map +1 -1
- package/dist/src/planner/mutation/scope-transform.d.ts +32 -0
- package/dist/src/planner/mutation/scope-transform.d.ts.map +1 -1
- package/dist/src/planner/mutation/scope-transform.js +181 -33
- package/dist/src/planner/mutation/scope-transform.js.map +1 -1
- package/dist/src/planner/mutation/set-op.d.ts.map +1 -1
- package/dist/src/planner/mutation/set-op.js +66 -16
- package/dist/src/planner/mutation/set-op.js.map +1 -1
- package/dist/src/planner/mutation/single-source.d.ts.map +1 -1
- package/dist/src/planner/mutation/single-source.js +100 -24
- package/dist/src/planner/mutation/single-source.js.map +1 -1
- package/dist/src/planner/nodes/add-constraint-node.d.ts +15 -1
- package/dist/src/planner/nodes/add-constraint-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/add-constraint-node.js +10 -1
- package/dist/src/planner/nodes/add-constraint-node.js.map +1 -1
- package/dist/src/planner/nodes/aggregate-node.d.ts +15 -0
- package/dist/src/planner/nodes/aggregate-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/aggregate-node.js +32 -17
- 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 +2 -1
- package/dist/src/planner/nodes/alias-node.js.map +1 -1
- package/dist/src/planner/nodes/alter-table-node.d.ts +51 -10
- package/dist/src/planner/nodes/alter-table-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/alter-table-node.js +49 -2
- package/dist/src/planner/nodes/alter-table-node.js.map +1 -1
- package/dist/src/planner/nodes/asof-scan-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/asof-scan-node.js +4 -1
- package/dist/src/planner/nodes/asof-scan-node.js.map +1 -1
- package/dist/src/planner/nodes/asserted-keys-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/asserted-keys-node.js +2 -1
- package/dist/src/planner/nodes/asserted-keys-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 +8 -3
- package/dist/src/planner/nodes/bloom-join-node.js.map +1 -1
- package/dist/src/planner/nodes/cache-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/cache-node.js +2 -1
- package/dist/src/planner/nodes/cache-node.js.map +1 -1
- package/dist/src/planner/nodes/constraint-check-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/constraint-check-node.js +17 -19
- package/dist/src/planner/nodes/constraint-check-node.js.map +1 -1
- package/dist/src/planner/nodes/create-assertion-node.d.ts +2 -1
- package/dist/src/planner/nodes/create-assertion-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/create-assertion-node.js +5 -2
- package/dist/src/planner/nodes/create-assertion-node.js.map +1 -1
- package/dist/src/planner/nodes/cte-node.d.ts +19 -9
- package/dist/src/planner/nodes/cte-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/cte-node.js +25 -9
- package/dist/src/planner/nodes/cte-node.js.map +1 -1
- package/dist/src/planner/nodes/delete-node.d.ts +20 -2
- package/dist/src/planner/nodes/delete-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/delete-node.js +11 -2
- package/dist/src/planner/nodes/delete-node.js.map +1 -1
- package/dist/src/planner/nodes/distinct-node.d.ts +6 -0
- package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/distinct-node.js +10 -2
- package/dist/src/planner/nodes/distinct-node.js.map +1 -1
- package/dist/src/planner/nodes/dml-executor-node.d.ts +58 -1
- package/dist/src/planner/nodes/dml-executor-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/dml-executor-node.js +107 -15
- package/dist/src/planner/nodes/dml-executor-node.js.map +1 -1
- package/dist/src/planner/nodes/drop-assertion-node.d.ts +2 -1
- package/dist/src/planner/nodes/drop-assertion-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/drop-assertion-node.js +5 -2
- package/dist/src/planner/nodes/drop-assertion-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 -1
- package/dist/src/planner/nodes/eager-prefetch-node.js.map +1 -1
- package/dist/src/planner/nodes/fanout-lookup-join-node.d.ts +5 -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 +13 -6
- 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 +18 -5
- package/dist/src/planner/nodes/filter.js.map +1 -1
- package/dist/src/planner/nodes/hash-aggregate.d.ts +1 -0
- package/dist/src/planner/nodes/hash-aggregate.d.ts.map +1 -1
- package/dist/src/planner/nodes/hash-aggregate.js +21 -16
- package/dist/src/planner/nodes/hash-aggregate.js.map +1 -1
- package/dist/src/planner/nodes/insert-node.d.ts +19 -2
- package/dist/src/planner/nodes/insert-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/insert-node.js +10 -2
- package/dist/src/planner/nodes/insert-node.js.map +1 -1
- package/dist/src/planner/nodes/join-node.d.ts +20 -1
- package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-node.js +30 -9
- package/dist/src/planner/nodes/join-node.js.map +1 -1
- package/dist/src/planner/nodes/join-utils.d.ts +21 -0
- package/dist/src/planner/nodes/join-utils.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-utils.js +26 -0
- package/dist/src/planner/nodes/join-utils.js.map +1 -1
- package/dist/src/planner/nodes/key-set-semi-join-node.d.ts +42 -10
- package/dist/src/planner/nodes/key-set-semi-join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/key-set-semi-join-node.js +90 -17
- package/dist/src/planner/nodes/key-set-semi-join-node.js.map +1 -1
- package/dist/src/planner/nodes/lens-auxiliary-access-node.d.ts +5 -0
- package/dist/src/planner/nodes/lens-auxiliary-access-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/lens-auxiliary-access-node.js +2 -1
- package/dist/src/planner/nodes/lens-auxiliary-access-node.js.map +1 -1
- package/dist/src/planner/nodes/limit-offset.d.ts +6 -0
- package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
- package/dist/src/planner/nodes/limit-offset.js +10 -2
- package/dist/src/planner/nodes/limit-offset.js.map +1 -1
- package/dist/src/planner/nodes/merge-join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/merge-join-node.js +8 -3
- package/dist/src/planner/nodes/merge-join-node.js.map +1 -1
- package/dist/src/planner/nodes/ordinal-slice-node.d.ts +5 -0
- package/dist/src/planner/nodes/ordinal-slice-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/ordinal-slice-node.js +9 -2
- package/dist/src/planner/nodes/ordinal-slice-node.js.map +1 -1
- package/dist/src/planner/nodes/plan-node.d.ts +29 -0
- package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node.js +12 -0
- package/dist/src/planner/nodes/plan-node.js.map +1 -1
- package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/project-node.js +18 -36
- 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 +3 -2
- package/dist/src/planner/nodes/reference.js.map +1 -1
- package/dist/src/planner/nodes/retrieve-node.d.ts +16 -2
- package/dist/src/planner/nodes/retrieve-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/retrieve-node.js +10 -2
- 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 +13 -32
- package/dist/src/planner/nodes/returning-node.js.map +1 -1
- package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
- package/dist/src/planner/nodes/scalar.js +5 -18
- package/dist/src/planner/nodes/scalar.js.map +1 -1
- package/dist/src/planner/nodes/sort.d.ts.map +1 -1
- package/dist/src/planner/nodes/sort.js +3 -1
- package/dist/src/planner/nodes/sort.js.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.d.ts +1 -0
- package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.js +22 -20
- package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.d.ts +89 -1
- package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.js +69 -2
- package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
- package/dist/src/planner/nodes/update-node.d.ts +19 -2
- package/dist/src/planner/nodes/update-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/update-node.js +10 -2
- package/dist/src/planner/nodes/update-node.js.map +1 -1
- package/dist/src/planner/nodes/window-function.d.ts.map +1 -1
- package/dist/src/planner/nodes/window-function.js +8 -0
- package/dist/src/planner/nodes/window-function.js.map +1 -1
- package/dist/src/planner/nodes/window-node.d.ts +1 -1
- package/dist/src/planner/nodes/window-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/window-node.js +3 -1
- package/dist/src/planner/nodes/window-node.js.map +1 -1
- package/dist/src/planner/optimizer.d.ts +27 -1
- package/dist/src/planner/optimizer.d.ts.map +1 -1
- package/dist/src/planner/optimizer.js +130 -10
- package/dist/src/planner/optimizer.js.map +1 -1
- package/dist/src/planner/planning-context.d.ts +24 -0
- package/dist/src/planner/planning-context.d.ts.map +1 -1
- package/dist/src/planner/planning-context.js.map +1 -1
- package/dist/src/planner/rules/access/rule-key-set-seek.d.ts +78 -20
- package/dist/src/planner/rules/access/rule-key-set-seek.d.ts.map +1 -1
- package/dist/src/planner/rules/access/rule-key-set-seek.js +296 -135
- package/dist/src/planner/rules/access/rule-key-set-seek.js.map +1 -1
- package/dist/src/planner/rules/access/rule-monotonic-range-access.d.ts.map +1 -1
- package/dist/src/planner/rules/access/rule-monotonic-range-access.js +2 -2
- package/dist/src/planner/rules/access/rule-monotonic-range-access.js.map +1 -1
- package/dist/src/planner/rules/access/rule-select-access-path.d.ts +30 -1
- 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 +70 -5
- 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 +7 -4
- 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 +39 -5
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js.map +1 -1
- package/dist/src/planner/rules/cache/rule-cte-optimization.d.ts.map +1 -1
- package/dist/src/planner/rules/cache/rule-cte-optimization.js +15 -2
- package/dist/src/planner/rules/cache/rule-cte-optimization.js.map +1 -1
- package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.js +10 -3
- package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.js.map +1 -1
- package/dist/src/planner/rules/cache/rule-nested-loop-right-cache.d.ts.map +1 -1
- package/dist/src/planner/rules/cache/rule-nested-loop-right-cache.js +6 -4
- package/dist/src/planner/rules/cache/rule-nested-loop-right-cache.js.map +1 -1
- package/dist/src/planner/rules/join/equi-pair-extractor.d.ts +5 -31
- package/dist/src/planner/rules/join/equi-pair-extractor.d.ts.map +1 -1
- package/dist/src/planner/rules/join/equi-pair-extractor.js +4 -44
- package/dist/src/planner/rules/join/equi-pair-extractor.js.map +1 -1
- package/dist/src/planner/rules/join/index-nested-loop.d.ts +49 -0
- package/dist/src/planner/rules/join/index-nested-loop.d.ts.map +1 -0
- package/dist/src/planner/rules/join/index-nested-loop.js +291 -0
- package/dist/src/planner/rules/join/index-nested-loop.js.map +1 -0
- package/dist/src/planner/rules/join/rule-fanout-batched-outer.js +8 -8
- package/dist/src/planner/rules/join/rule-fanout-lookup-join.d.ts +4 -0
- 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 +50 -15
- package/dist/src/planner/rules/join/rule-fanout-lookup-join.js.map +1 -1
- package/dist/src/planner/rules/join/rule-join-elimination.d.ts +6 -0
- package/dist/src/planner/rules/join/rule-join-elimination.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-join-elimination.js +25 -9
- package/dist/src/planner/rules/join/rule-join-elimination.js.map +1 -1
- package/dist/src/planner/rules/join/rule-join-key-inference.d.ts +7 -0
- package/dist/src/planner/rules/join/rule-join-key-inference.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-join-key-inference.js +23 -11
- package/dist/src/planner/rules/join/rule-join-key-inference.js.map +1 -1
- package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts +10 -4
- 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 +115 -29
- package/dist/src/planner/rules/join/rule-join-physical-selection.js.map +1 -1
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.d.ts +2 -0
- 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 +18 -4
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.d.ts +2 -2
- 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 +19 -22
- package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-filter-conjunct-ordering.d.ts +21 -8
- package/dist/src/planner/rules/predicate/rule-filter-conjunct-ordering.d.ts.map +1 -1
- package/dist/src/planner/rules/predicate/rule-filter-conjunct-ordering.js +70 -14
- package/dist/src/planner/rules/predicate/rule-filter-conjunct-ordering.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-filter-selectivity.d.ts +56 -17
- package/dist/src/planner/rules/predicate/rule-filter-selectivity.d.ts.map +1 -1
- package/dist/src/planner/rules/predicate/rule-filter-selectivity.js +103 -154
- package/dist/src/planner/rules/predicate/rule-filter-selectivity.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-join-predicate-pushdown.d.ts +76 -0
- package/dist/src/planner/rules/predicate/rule-join-predicate-pushdown.d.ts.map +1 -0
- package/dist/src/planner/rules/predicate/rule-join-predicate-pushdown.js +208 -0
- package/dist/src/planner/rules/predicate/rule-join-predicate-pushdown.js.map +1 -0
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.d.ts +14 -11
- 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 +21 -85
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.d.ts +7 -1
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.d.ts.map +1 -1
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js +18 -22
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js.map +1 -1
- package/dist/src/planner/rules/shared/access-leaf.d.ts +52 -0
- package/dist/src/planner/rules/shared/access-leaf.d.ts.map +1 -0
- package/dist/src/planner/rules/shared/access-leaf.js +95 -0
- package/dist/src/planner/rules/shared/access-leaf.js.map +1 -0
- 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 +17 -7
- 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 +3 -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 +26 -9
- 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 +69 -11
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js.map +1 -1
- package/dist/src/planner/rules/window/rule-monotonic-window.d.ts +17 -7
- package/dist/src/planner/rules/window/rule-monotonic-window.d.ts.map +1 -1
- package/dist/src/planner/rules/window/rule-monotonic-window.js +124 -87
- package/dist/src/planner/rules/window/rule-monotonic-window.js.map +1 -1
- package/dist/src/planner/scopes/aliased.d.ts.map +1 -1
- package/dist/src/planner/scopes/aliased.js +6 -0
- package/dist/src/planner/scopes/aliased.js.map +1 -1
- package/dist/src/planner/stats/catalog-stats.d.ts +44 -13
- package/dist/src/planner/stats/catalog-stats.d.ts.map +1 -1
- package/dist/src/planner/stats/catalog-stats.js +137 -61
- package/dist/src/planner/stats/catalog-stats.js.map +1 -1
- package/dist/src/planner/stats/conjunct-selectivity.d.ts +48 -0
- package/dist/src/planner/stats/conjunct-selectivity.d.ts.map +1 -0
- package/dist/src/planner/stats/conjunct-selectivity.js +168 -0
- package/dist/src/planner/stats/conjunct-selectivity.js.map +1 -0
- package/dist/src/planner/stats/index.d.ts +22 -3
- package/dist/src/planner/stats/index.d.ts.map +1 -1
- package/dist/src/planner/stats/index.js.map +1 -1
- package/dist/src/planner/stats/table-cardinality.d.ts +28 -0
- package/dist/src/planner/stats/table-cardinality.d.ts.map +1 -0
- package/dist/src/planner/stats/table-cardinality.js +29 -0
- package/dist/src/planner/stats/table-cardinality.js.map +1 -0
- package/dist/src/planner/stored-body-context.d.ts +57 -0
- package/dist/src/planner/stored-body-context.d.ts.map +1 -0
- package/dist/src/planner/stored-body-context.js +64 -0
- package/dist/src/planner/stored-body-context.js.map +1 -0
- package/dist/src/planner/util/column-origins.d.ts +29 -8
- package/dist/src/planner/util/column-origins.d.ts.map +1 -1
- package/dist/src/planner/util/column-origins.js +74 -14
- package/dist/src/planner/util/column-origins.js.map +1 -1
- package/dist/src/planner/util/fd-utils.d.ts +32 -8
- package/dist/src/planner/util/fd-utils.d.ts.map +1 -1
- package/dist/src/planner/util/fd-utils.js +46 -9
- package/dist/src/planner/util/fd-utils.js.map +1 -1
- package/dist/src/planner/util/ind-utils.d.ts +66 -19
- package/dist/src/planner/util/ind-utils.d.ts.map +1 -1
- package/dist/src/planner/util/ind-utils.js +91 -21
- package/dist/src/planner/util/ind-utils.js.map +1 -1
- package/dist/src/planner/util/key-utils.d.ts +36 -3
- package/dist/src/planner/util/key-utils.d.ts.map +1 -1
- package/dist/src/planner/util/key-utils.js +57 -7
- package/dist/src/planner/util/key-utils.js.map +1 -1
- package/dist/src/planner/util/output-names.d.ts +12 -0
- package/dist/src/planner/util/output-names.d.ts.map +1 -0
- package/dist/src/planner/util/output-names.js +20 -0
- package/dist/src/planner/util/output-names.js.map +1 -0
- package/dist/src/planner/util/row-estimates.d.ts +39 -0
- package/dist/src/planner/util/row-estimates.d.ts.map +1 -0
- package/dist/src/planner/util/row-estimates.js +68 -0
- package/dist/src/planner/util/row-estimates.js.map +1 -0
- package/dist/src/planner/util/row-population.d.ts +42 -0
- package/dist/src/planner/util/row-population.d.ts.map +1 -0
- package/dist/src/planner/util/row-population.js +71 -0
- package/dist/src/planner/util/row-population.js.map +1 -0
- package/dist/src/runtime/deferred-constraint-queue.d.ts.map +1 -1
- package/dist/src/runtime/deferred-constraint-queue.js +3 -2
- package/dist/src/runtime/deferred-constraint-queue.js.map +1 -1
- package/dist/src/runtime/emit/add-constraint.d.ts.map +1 -1
- package/dist/src/runtime/emit/add-constraint.js +60 -6
- 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 +4 -4
- package/dist/src/runtime/emit/aggregate.js.map +1 -1
- package/dist/src/runtime/emit/alter-schema-event.d.ts +97 -0
- package/dist/src/runtime/emit/alter-schema-event.d.ts.map +1 -0
- package/dist/src/runtime/emit/alter-schema-event.js +87 -0
- package/dist/src/runtime/emit/alter-schema-event.js.map +1 -0
- package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
- package/dist/src/runtime/emit/alter-table.js +582 -236
- 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 +50 -7
- package/dist/src/runtime/emit/analyze.js.map +1 -1
- package/dist/src/runtime/emit/assertion-drop-guard.d.ts +37 -0
- package/dist/src/runtime/emit/assertion-drop-guard.d.ts.map +1 -0
- package/dist/src/runtime/emit/assertion-drop-guard.js +59 -0
- package/dist/src/runtime/emit/assertion-drop-guard.js.map +1 -0
- package/dist/src/runtime/emit/assertion-rename-helpers.d.ts +33 -0
- package/dist/src/runtime/emit/assertion-rename-helpers.d.ts.map +1 -0
- package/dist/src/runtime/emit/assertion-rename-helpers.js +124 -0
- package/dist/src/runtime/emit/assertion-rename-helpers.js.map +1 -0
- package/dist/src/runtime/emit/cast.d.ts.map +1 -1
- package/dist/src/runtime/emit/cast.js +4 -19
- package/dist/src/runtime/emit/cast.js.map +1 -1
- package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
- package/dist/src/runtime/emit/constraint-check.js +10 -227
- package/dist/src/runtime/emit/constraint-check.js.map +1 -1
- package/dist/src/runtime/emit/create-assertion.d.ts.map +1 -1
- package/dist/src/runtime/emit/create-assertion.js +31 -14
- package/dist/src/runtime/emit/create-assertion.js.map +1 -1
- package/dist/src/runtime/emit/cte.d.ts.map +1 -1
- package/dist/src/runtime/emit/cte.js +11 -6
- package/dist/src/runtime/emit/cte.js.map +1 -1
- package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
- package/dist/src/runtime/emit/dml-executor.js +233 -28
- package/dist/src/runtime/emit/dml-executor.js.map +1 -1
- package/dist/src/runtime/emit/drop-assertion.js +8 -8
- package/dist/src/runtime/emit/drop-assertion.js.map +1 -1
- package/dist/src/runtime/emit/drop-column-guards.d.ts +151 -0
- package/dist/src/runtime/emit/drop-column-guards.d.ts.map +1 -0
- package/dist/src/runtime/emit/drop-column-guards.js +230 -0
- package/dist/src/runtime/emit/drop-column-guards.js.map +1 -0
- package/dist/src/runtime/emit/drop-index.d.ts.map +1 -1
- package/dist/src/runtime/emit/drop-index.js +4 -3
- package/dist/src/runtime/emit/drop-index.js.map +1 -1
- package/dist/src/runtime/emit/drop-table.d.ts.map +1 -1
- package/dist/src/runtime/emit/drop-table.js +6 -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 +4 -0
- package/dist/src/runtime/emit/drop-view.js.map +1 -1
- package/dist/src/runtime/emit/hash-aggregate.d.ts.map +1 -1
- package/dist/src/runtime/emit/hash-aggregate.js +2 -2
- package/dist/src/runtime/emit/hash-aggregate.js.map +1 -1
- package/dist/src/runtime/emit/join.d.ts.map +1 -1
- package/dist/src/runtime/emit/join.js +8 -67
- package/dist/src/runtime/emit/join.js.map +1 -1
- package/dist/src/runtime/emit/key-set-semi-join.d.ts.map +1 -1
- package/dist/src/runtime/emit/key-set-semi-join.js +11 -3
- package/dist/src/runtime/emit/key-set-semi-join.js.map +1 -1
- package/dist/src/runtime/emit/materialized-view-helpers.d.ts +4 -4
- package/dist/src/runtime/emit/materialized-view-helpers.d.ts.map +1 -1
- package/dist/src/runtime/emit/materialized-view-helpers.js +34 -22
- package/dist/src/runtime/emit/materialized-view-helpers.js.map +1 -1
- package/dist/src/runtime/emit/materialized-view.d.ts.map +1 -1
- package/dist/src/runtime/emit/materialized-view.js +7 -2
- package/dist/src/runtime/emit/materialized-view.js.map +1 -1
- package/dist/src/runtime/emit/operand-comparator.d.ts +30 -0
- package/dist/src/runtime/emit/operand-comparator.d.ts.map +1 -1
- package/dist/src/runtime/emit/operand-comparator.js +34 -0
- package/dist/src/runtime/emit/operand-comparator.js.map +1 -1
- package/dist/src/runtime/emit/recursive-cte.d.ts.map +1 -1
- package/dist/src/runtime/emit/recursive-cte.js +4 -5
- package/dist/src/runtime/emit/recursive-cte.js.map +1 -1
- package/dist/src/runtime/emit/schema-declarative.d.ts.map +1 -1
- package/dist/src/runtime/emit/schema-declarative.js +30 -0
- package/dist/src/runtime/emit/schema-declarative.js.map +1 -1
- package/dist/src/runtime/emit/subquery.d.ts.map +1 -1
- package/dist/src/runtime/emit/subquery.js +153 -52
- package/dist/src/runtime/emit/subquery.js.map +1 -1
- package/dist/src/runtime/emit/update.d.ts.map +1 -1
- package/dist/src/runtime/emit/update.js +18 -6
- package/dist/src/runtime/emit/update.js.map +1 -1
- package/dist/src/runtime/emit/window.js +36 -23
- package/dist/src/runtime/emit/window.js.map +1 -1
- package/dist/src/runtime/row-constraints.d.ts +85 -0
- package/dist/src/runtime/row-constraints.d.ts.map +1 -0
- package/dist/src/runtime/row-constraints.js +239 -0
- package/dist/src/runtime/row-constraints.js.map +1 -0
- package/dist/src/runtime/types.d.ts +8 -11
- package/dist/src/runtime/types.d.ts.map +1 -1
- package/dist/src/runtime/types.js.map +1 -1
- package/dist/src/schema/assertion.d.ts +14 -1
- package/dist/src/schema/assertion.d.ts.map +1 -1
- package/dist/src/schema/assertion.js +14 -1
- package/dist/src/schema/assertion.js.map +1 -1
- package/dist/src/schema/catalog-persistability.d.ts +19 -16
- package/dist/src/schema/catalog-persistability.d.ts.map +1 -1
- package/dist/src/schema/catalog-persistability.js +92 -20
- package/dist/src/schema/catalog-persistability.js.map +1 -1
- package/dist/src/schema/catalog.d.ts +73 -2
- package/dist/src/schema/catalog.d.ts.map +1 -1
- package/dist/src/schema/catalog.js +220 -39
- package/dist/src/schema/catalog.js.map +1 -1
- package/dist/src/schema/column-source-resolver.d.ts +18 -0
- package/dist/src/schema/column-source-resolver.d.ts.map +1 -0
- package/dist/src/schema/column-source-resolver.js +22 -0
- package/dist/src/schema/column-source-resolver.js.map +1 -0
- package/dist/src/schema/column.d.ts +26 -3
- 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.map +1 -1
- package/dist/src/schema/constraint-builder.js +7 -1
- package/dist/src/schema/constraint-builder.js.map +1 -1
- package/dist/src/schema/ddl-generator.d.ts.map +1 -1
- package/dist/src/schema/ddl-generator.js +27 -6
- package/dist/src/schema/ddl-generator.js.map +1 -1
- package/dist/src/schema/function.d.ts +32 -1
- package/dist/src/schema/function.d.ts.map +1 -1
- package/dist/src/schema/function.js +10 -2
- package/dist/src/schema/function.js.map +1 -1
- package/dist/src/schema/lens-compiler.d.ts.map +1 -1
- package/dist/src/schema/lens-compiler.js +203 -51
- package/dist/src/schema/lens-compiler.js.map +1 -1
- package/dist/src/schema/lens-prover.d.ts +2 -3
- package/dist/src/schema/lens-prover.d.ts.map +1 -1
- package/dist/src/schema/lens-prover.js +19 -11
- package/dist/src/schema/lens-prover.js.map +1 -1
- package/dist/src/schema/manager.d.ts +115 -20
- package/dist/src/schema/manager.d.ts.map +1 -1
- package/dist/src/schema/manager.js +202 -70
- package/dist/src/schema/manager.js.map +1 -1
- package/dist/src/schema/rename-rewriter.d.ts +142 -0
- package/dist/src/schema/rename-rewriter.d.ts.map +1 -1
- package/dist/src/schema/rename-rewriter.js +254 -9
- package/dist/src/schema/rename-rewriter.js.map +1 -1
- package/dist/src/schema/reserved-tags.d.ts +1 -1
- package/dist/src/schema/reserved-tags.d.ts.map +1 -1
- package/dist/src/schema/reserved-tags.js +4 -3
- package/dist/src/schema/reserved-tags.js.map +1 -1
- package/dist/src/schema/schema-differ.d.ts +16 -0
- package/dist/src/schema/schema-differ.d.ts.map +1 -1
- package/dist/src/schema/schema-differ.js +225 -38
- package/dist/src/schema/schema-differ.js.map +1 -1
- package/dist/src/schema/table.d.ts +149 -1
- package/dist/src/schema/table.d.ts.map +1 -1
- package/dist/src/schema/table.js +248 -1
- package/dist/src/schema/table.js.map +1 -1
- package/dist/src/schema/unique-enforcement.d.ts +5 -3
- package/dist/src/schema/unique-enforcement.d.ts.map +1 -1
- package/dist/src/schema/unique-enforcement.js +5 -3
- package/dist/src/schema/unique-enforcement.js.map +1 -1
- package/dist/src/schema/view.d.ts +11 -0
- package/dist/src/schema/view.d.ts.map +1 -1
- package/dist/src/schema/view.js +12 -0
- package/dist/src/schema/view.js.map +1 -1
- package/dist/src/types/builtin-types.d.ts +54 -0
- package/dist/src/types/builtin-types.d.ts.map +1 -1
- package/dist/src/types/builtin-types.js +123 -34
- package/dist/src/types/builtin-types.js.map +1 -1
- package/dist/src/types/cast-semantics.d.ts +42 -0
- package/dist/src/types/cast-semantics.d.ts.map +1 -1
- package/dist/src/types/cast-semantics.js +64 -0
- package/dist/src/types/cast-semantics.js.map +1 -1
- package/dist/src/types/comparison-coercion.d.ts +101 -0
- package/dist/src/types/comparison-coercion.d.ts.map +1 -0
- package/dist/src/types/comparison-coercion.js +162 -0
- package/dist/src/types/comparison-coercion.js.map +1 -0
- package/dist/src/types/index.d.ts +2 -2
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/types/index.js +2 -2
- package/dist/src/types/index.js.map +1 -1
- package/dist/src/types/logical-type.d.ts +7 -0
- package/dist/src/types/logical-type.d.ts.map +1 -1
- package/dist/src/types/logical-type.js.map +1 -1
- package/dist/src/types/validation.d.ts +56 -0
- package/dist/src/types/validation.d.ts.map +1 -1
- package/dist/src/types/validation.js +68 -0
- package/dist/src/types/validation.js.map +1 -1
- package/dist/src/util/{working-table-iterable.d.ts → array-row-iterable.d.ts} +6 -6
- package/dist/src/util/array-row-iterable.d.ts.map +1 -0
- package/dist/src/util/{working-table-iterable.js → array-row-iterable.js} +6 -6
- package/dist/src/util/array-row-iterable.js.map +1 -0
- package/dist/src/util/coercion.d.ts +8 -0
- package/dist/src/util/coercion.d.ts.map +1 -1
- package/dist/src/util/coercion.js +8 -0
- package/dist/src/util/coercion.js.map +1 -1
- package/dist/src/util/comparison.d.ts +16 -3
- package/dist/src/util/comparison.d.ts.map +1 -1
- package/dist/src/util/comparison.js +21 -5
- package/dist/src/util/comparison.js.map +1 -1
- package/dist/src/util/key-serializer.d.ts +46 -0
- package/dist/src/util/key-serializer.d.ts.map +1 -1
- package/dist/src/util/key-serializer.js +47 -0
- package/dist/src/util/key-serializer.js.map +1 -1
- package/dist/src/util/value-set.d.ts +21 -0
- package/dist/src/util/value-set.d.ts.map +1 -0
- package/dist/src/util/value-set.js +22 -0
- package/dist/src/util/value-set.js.map +1 -0
- package/dist/src/vtab/capabilities.d.ts +1 -1
- package/dist/src/vtab/events.d.ts +8 -1
- package/dist/src/vtab/events.d.ts.map +1 -1
- package/dist/src/vtab/events.js.map +1 -1
- package/dist/src/vtab/manifest.d.ts +15 -0
- package/dist/src/vtab/manifest.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/alter-column.d.ts +147 -0
- package/dist/src/vtab/memory/layer/alter-column.d.ts.map +1 -0
- package/dist/src/vtab/memory/layer/alter-column.js +214 -0
- package/dist/src/vtab/memory/layer/alter-column.js.map +1 -0
- package/dist/src/vtab/memory/layer/base.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/base.js +4 -3
- package/dist/src/vtab/memory/layer/base.js.map +1 -1
- package/dist/src/vtab/memory/layer/interface.d.ts +2 -2
- package/dist/src/vtab/memory/layer/interface.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts +176 -25
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +569 -558
- package/dist/src/vtab/memory/layer/manager.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 +32 -5
- package/dist/src/vtab/memory/layer/scan-layer.js.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.d.ts +101 -15
- package/dist/src/vtab/memory/layer/transaction.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.js +133 -45
- package/dist/src/vtab/memory/layer/transaction.js.map +1 -1
- package/dist/src/vtab/memory/module.d.ts +16 -1
- package/dist/src/vtab/memory/module.d.ts.map +1 -1
- package/dist/src/vtab/memory/module.js +64 -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 +11 -6
- package/dist/src/vtab/memory/table.js.map +1 -1
- package/dist/src/vtab/module.d.ts +77 -23
- package/dist/src/vtab/module.d.ts.map +1 -1
- package/dist/src/vtab/table.d.ts +9 -2
- package/dist/src/vtab/table.d.ts.map +1 -1
- package/dist/src/vtab/table.js +1 -1
- package/dist/src/vtab/table.js.map +1 -1
- package/package.json +3 -3
- package/dist/src/util/working-table-iterable.d.ts.map +0 -1
- package/dist/src/util/working-table-iterable.js.map +0 -1
|
@@ -11,12 +11,14 @@ import { StatusCode } from '../../common/types.js';
|
|
|
11
11
|
import { CapabilityDetectors } from '../framework/characteristics.js';
|
|
12
12
|
import { resolveFunctionSchema } from './schema-resolution.js';
|
|
13
13
|
import { isAggregateFunctionSchema } from '../../schema/function.js';
|
|
14
|
-
import { expressionToString } from '../../emit/ast-stringify.js';
|
|
15
|
-
import { resolveOrdinalReference } from './select-ordinal.js';
|
|
14
|
+
import { expressionToString, expressionToIdentityString } from '../../emit/ast-stringify.js';
|
|
15
|
+
import { buildOrdinalAwareExpression, resolveOrdinalReference } from './select-ordinal.js';
|
|
16
|
+
import { collectDefinedAttrIds } from '../analysis/equi-correlation.js';
|
|
17
|
+
import { PlanNodeType } from '../nodes/plan-node-type.js';
|
|
16
18
|
/**
|
|
17
19
|
* Processes GROUP BY, aggregates, and HAVING clauses
|
|
18
20
|
*/
|
|
19
|
-
export function buildAggregatePhase(input, stmt, selectContext, aggregates, hasAggregates, projections, hasWrappedAggregates = false,
|
|
21
|
+
export function buildAggregatePhase(input, stmt, selectContext, aggregates, hasAggregates, projections, hasWrappedAggregates = false, selectList = [], starProjectionsByColumn = new Map()) {
|
|
20
22
|
const hasGroupBy = stmt.groupBy && stmt.groupBy.length > 0;
|
|
21
23
|
// Pre-collect aggregate functions from the HAVING clause that are not already
|
|
22
24
|
// present in the SELECT list. These need to be added to the AggregateNode so
|
|
@@ -35,7 +37,7 @@ export function buildAggregatePhase(input, stmt, selectContext, aggregates, hasA
|
|
|
35
37
|
// or has a GROUP BY). When legal, any ORDER BY aggregate not already present
|
|
36
38
|
// in the SELECT or HAVING aggregate list must be added to the AggregateNode
|
|
37
39
|
// so it is computed and available to the post-aggregate sort.
|
|
38
|
-
const orderByHasAggregates = orderByContainsAggregates(stmt.orderBy, selectContext);
|
|
40
|
+
const orderByHasAggregates = orderByContainsAggregates(stmt.orderBy, selectContext, selectList);
|
|
39
41
|
let hasOrderByOnlyAggregates = false;
|
|
40
42
|
if (orderByHasAggregates && (hasAggregates || hasGroupBy)) {
|
|
41
43
|
const orderByAggs = collectOrderByAggregates(stmt.orderBy, selectContext, aggregates);
|
|
@@ -73,13 +75,10 @@ export function buildAggregatePhase(input, stmt, selectContext, aggregates, hasA
|
|
|
73
75
|
// ORDER BY contains aggregates — those need to run against the post-aggregate
|
|
74
76
|
// row(s), not the per-input rows.
|
|
75
77
|
const preAggregateSort = Boolean(hasAggregates && !hasGroupBy && stmt.orderBy && stmt.orderBy.length > 0 && !orderByHasAggregates);
|
|
76
|
-
currentInput = handlePreAggregateSort(currentInput, stmt, selectContext, hasAggregates, !!hasGroupBy, orderByHasAggregates,
|
|
78
|
+
currentInput = handlePreAggregateSort(currentInput, stmt, selectContext, hasAggregates, !!hasGroupBy, orderByHasAggregates, selectList);
|
|
77
79
|
// Build GROUP BY expressions, resolving 1-based positional references against the SELECT list.
|
|
78
80
|
const groupByExpressions = stmt.groupBy ?
|
|
79
|
-
stmt.groupBy.map(expr =>
|
|
80
|
-
const resolved = resolveOrdinalReference(expr, selectListAsts, 'GROUP BY');
|
|
81
|
-
return buildExpression(selectContext, resolved ?? expr, false);
|
|
82
|
-
}) : [];
|
|
81
|
+
stmt.groupBy.map(expr => buildOrdinalAwareExpression(selectContext, expr, selectList, 'GROUP BY', false)) : [];
|
|
83
82
|
// Validate aggregate/non-aggregate mixing (must run after groupByExpressions are built
|
|
84
83
|
// so we can check column-coverage of SELECT projections against GROUP BY)
|
|
85
84
|
validateAggregateProjections(projections, hasAggregates, !!hasGroupBy, groupByExpressions);
|
|
@@ -110,7 +109,22 @@ export function buildAggregatePhase(input, stmt, selectContext, aggregates, hasA
|
|
|
110
109
|
// Determine if final projection is needed.
|
|
111
110
|
// Force a final projection when HAVING-only or ORDER-BY-only aggregates were
|
|
112
111
|
// added, to strip them from the output (they exist only for those clauses).
|
|
113
|
-
const needsFinalProjection = hasHavingOnlyAggregates || hasOrderByOnlyAggregates || hasWrappedAggregates || checkNeedsFinalProjection(projections)
|
|
112
|
+
const needsFinalProjection = hasHavingOnlyAggregates || hasOrderByOnlyAggregates || hasWrappedAggregates || checkNeedsFinalProjection(projections)
|
|
113
|
+
// A GROUP BY with no aggregate functions has no other projection step: the
|
|
114
|
+
// select list must be projected over the AggregateNode output here, or the
|
|
115
|
+
// output would be the raw group keys in GROUP BY order.
|
|
116
|
+
// NOTE: the `!hasAggregates` guard is load-bearing. Forcing the projection for
|
|
117
|
+
// every grouped query changes the plan shape of a grouped materialized-view body
|
|
118
|
+
// (`select k, count(*), sum(a) … group by k`) and re-routes its incremental
|
|
119
|
+
// maintenance from residual-recompute to full-rebuild — see
|
|
120
|
+
// test/incremental/delta-aggregate.spec.ts. So the aggregate case is decided by
|
|
121
|
+
// exact shape agreement instead (`aggregateOutputIsSelectList` below), which
|
|
122
|
+
// leaves that body's bare-aggregate plan intact.
|
|
123
|
+
|| Boolean(hasGroupBy && !hasAggregates && projections.length > 0)
|
|
124
|
+
// With aggregates present the AggregateNode may still be the root of the query.
|
|
125
|
+
// That is only sound when its own output already IS the select list; otherwise
|
|
126
|
+
// the grouping keys it advertises leak into (or reorder) the result.
|
|
127
|
+
|| !aggregateOutputIsSelectList(stmt, projections, aggregates, groupByExpressions, starProjectionsByColumn, selectContext);
|
|
114
128
|
return {
|
|
115
129
|
output: currentInput,
|
|
116
130
|
aggregateScope: aggregateOutputScope,
|
|
@@ -127,15 +141,16 @@ export function buildAggregatePhase(input, stmt, selectContext, aggregates, hasA
|
|
|
127
141
|
/**
|
|
128
142
|
* Handles pre-aggregate sorting for special cases
|
|
129
143
|
*/
|
|
130
|
-
function handlePreAggregateSort(input, stmt, selectContext, hasAggregates, hasGroupBy, orderByHasAggregates,
|
|
144
|
+
function handlePreAggregateSort(input, stmt, selectContext, hasAggregates, hasGroupBy, orderByHasAggregates, selectList) {
|
|
131
145
|
// Special handling for ORDER BY with aggregates but no GROUP BY.
|
|
132
146
|
// Skip when ORDER BY itself references aggregates — those must run
|
|
133
147
|
// post-aggregation, not on the per-row input.
|
|
134
148
|
if (hasAggregates && !hasGroupBy && stmt.orderBy && stmt.orderBy.length > 0 && !orderByHasAggregates) {
|
|
135
|
-
// Apply ORDER BY before aggregation
|
|
149
|
+
// Apply ORDER BY before aggregation. This sort sits BELOW the AggregateNode,
|
|
150
|
+
// so a positional reference resolves through the select list (no output
|
|
151
|
+
// attributes exist yet to bind to).
|
|
136
152
|
const sortKeys = stmt.orderBy.map(orderByClause => {
|
|
137
|
-
const
|
|
138
|
-
const expression = buildExpression(selectContext, resolved ?? orderByClause.expr);
|
|
153
|
+
const expression = buildOrdinalAwareExpression(selectContext, orderByClause.expr, selectList, 'ORDER BY');
|
|
139
154
|
return {
|
|
140
155
|
expression,
|
|
141
156
|
direction: orderByClause.direction,
|
|
@@ -146,6 +161,254 @@ function handlePreAggregateSort(input, stmt, selectContext, hasAggregates, hasGr
|
|
|
146
161
|
}
|
|
147
162
|
return input;
|
|
148
163
|
}
|
|
164
|
+
/**
|
|
165
|
+
* Builds the coverage test for a grouped query. `groupedOutputAttributes` is the
|
|
166
|
+
* AggregateNode's output attributes (group keys followed by aggregate results),
|
|
167
|
+
* needed only when the expressions to be checked were built against the aggregate
|
|
168
|
+
* output scope.
|
|
169
|
+
*/
|
|
170
|
+
export function buildGroupByCoverage(groupByExpressions, groupedOutputAttributes = []) {
|
|
171
|
+
const attrIds = new Set();
|
|
172
|
+
const fingerprints = new Set();
|
|
173
|
+
for (const expr of groupByExpressions) {
|
|
174
|
+
if (CapabilityDetectors.isColumnReference(expr)) {
|
|
175
|
+
attrIds.add(expr.attributeId);
|
|
176
|
+
}
|
|
177
|
+
fingerprints.add(expressionToIdentityString(expr.expression));
|
|
178
|
+
}
|
|
179
|
+
for (const attr of groupedOutputAttributes) {
|
|
180
|
+
attrIds.add(attr.id);
|
|
181
|
+
}
|
|
182
|
+
return { attrIds, fingerprints };
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Raises the standard GROUP BY coverage error when `node` reads a column the
|
|
186
|
+
* grouped rows do not carry. Used by the SELECT-list check below; the window
|
|
187
|
+
* phase raises the same message from {@link assertGroupedWindowCoverage}.
|
|
188
|
+
*/
|
|
189
|
+
export function assertGroupByCoverage(node, coverage) {
|
|
190
|
+
const ungrouped = findUngroupedColumnRef(node, coverage);
|
|
191
|
+
if (!ungrouped)
|
|
192
|
+
return;
|
|
193
|
+
throw new QuereusError(`Column '${expressionToString(ungrouped.expression)}' must appear in the GROUP BY clause or be used in an aggregate function`, StatusCode.ERROR, undefined, ungrouped.expression.loc?.start.line, ungrouped.expression.loc?.start.column);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Builds the {@link GroupKeyIndex} for a grouped query's GROUP BY list. The output
|
|
197
|
+
* column index is the key's position in that list, which is its position on the
|
|
198
|
+
* AggregateNode's output row.
|
|
199
|
+
*/
|
|
200
|
+
export function indexGroupKeys(groupByExpressions) {
|
|
201
|
+
const byFingerprint = new Map();
|
|
202
|
+
const byBaseAttrId = new Map();
|
|
203
|
+
groupByExpressions.forEach((expr, index) => {
|
|
204
|
+
const fp = expressionToIdentityString(expr.expression);
|
|
205
|
+
if (!byFingerprint.has(fp))
|
|
206
|
+
byFingerprint.set(fp, index);
|
|
207
|
+
if (CapabilityDetectors.isColumnReference(expr)) {
|
|
208
|
+
const attrId = expr.attributeId;
|
|
209
|
+
if (!byBaseAttrId.has(attrId))
|
|
210
|
+
byBaseAttrId.set(attrId, index);
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
return { byFingerprint, byBaseAttrId };
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Builds the {@link GroupedWindowContext} for a grouped, windowed query.
|
|
217
|
+
* `outputAttributes` is the AggregateNode's attribute list (group keys in GROUP BY
|
|
218
|
+
* order, then the aggregate results); `aggregateInput` is the AggregateNode's
|
|
219
|
+
* source relation, whose whole subtree defines
|
|
220
|
+
* {@link GroupedWindowContext.aggregateInputAttrIds}.
|
|
221
|
+
*/
|
|
222
|
+
export function buildGroupedWindowContext(groupByExpressions, outputAttributes, aggregateInput) {
|
|
223
|
+
return {
|
|
224
|
+
groupKeys: indexGroupKeys(groupByExpressions),
|
|
225
|
+
outputAttributes,
|
|
226
|
+
aggregateInputAttrIds: collectDefinedAttrIds(aggregateInput, child => !isCteDefinition(child)),
|
|
227
|
+
outputAttrIds: new Set(outputAttributes.map(attr => attr.id)),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* True for a CTE *definition* — the node a `with` clause builds once and every
|
|
232
|
+
* reference to that CTE then points at, as opposed to the per-reference
|
|
233
|
+
* CTEReferenceNode that mints its own attribute ids.
|
|
234
|
+
*
|
|
235
|
+
* Two consequences for the window phase, and one shape that needs both. A CTE body
|
|
236
|
+
* is a closed scope: it cannot name a column of the query that references it, so
|
|
237
|
+
* nothing inside it is ever a reference to this query's grouping key. And the SAME
|
|
238
|
+
* body node is reachable from this query's FROM clause and from a subquery inside a
|
|
239
|
+
* window specification that references the same CTE, so counting its internal
|
|
240
|
+
* attribute ids as this query's pre-grouping columns makes the body's own columns
|
|
241
|
+
* look ungrouped:
|
|
242
|
+
*
|
|
243
|
+
* with c as (select a, b from wg where b <> '')
|
|
244
|
+
* select a, row_number() over (order by (select count(*) from c z)) from c group by a
|
|
245
|
+
*
|
|
246
|
+
* — which rejected at plan time with "Column 'b' must appear in the GROUP BY clause",
|
|
247
|
+
* naming a column the user never wrote in the window specification.
|
|
248
|
+
*/
|
|
249
|
+
function isCteDefinition(node) {
|
|
250
|
+
return node.nodeType === PlanNodeType.CTE || node.nodeType === PlanNodeType.RecursiveCTE;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Rewrites every subtree of a window specification / window-function argument that
|
|
254
|
+
* IS a grouping key into a reference to the AggregateNode's output column for that
|
|
255
|
+
* key, so the expression reads the grouped row instead of a base-table column that
|
|
256
|
+
* row does not carry.
|
|
257
|
+
*
|
|
258
|
+
* Two match rules, in order at each node:
|
|
259
|
+
*
|
|
260
|
+
* 1. The whole subtree's identity fingerprint equals a GROUP BY expression's — covers
|
|
261
|
+
* `group by a || '!'` + `over (order by a || '!')`, and nested occurrences such
|
|
262
|
+
* as `over (order by upper(a || '!'))` because the walk recurses. Identifier case
|
|
263
|
+
* is folded, so `group by A || '!'` matches too; quoted literals are byte-exact,
|
|
264
|
+
* so `a || 'X'` and `a || 'x'` remain different keys.
|
|
265
|
+
*
|
|
266
|
+
* Unconditional above any subquery, where the expression is written in this query's
|
|
267
|
+
* own scope. INSIDE a subquery it is guarded by {@link readsOnlyAggregateInput} —
|
|
268
|
+
* every column reference in the subtree must be a pre-grouping column of THIS query
|
|
269
|
+
* — because there the same text can name something else entirely: under `group by
|
|
270
|
+
* a`, a bare `a` written inside `over (order by (select … where t.a = a))` names the
|
|
271
|
+
* subquery's own `t.a` and yet fingerprints as `a`, so an unguarded rule 1 would
|
|
272
|
+
* silently rewrite it into the outer group column and change what the query means.
|
|
273
|
+
* The guard cannot replace the top-level case: `group by (select max(t.b) from wg t
|
|
274
|
+
* where t.a = wg.a)` repeated verbatim in the specification is a legal grouping key
|
|
275
|
+
* whose subtree also reads the subquery's own columns.
|
|
276
|
+
* 2. The node is a column reference whose attribute id is the *base* attribute id of
|
|
277
|
+
* a bare-column grouping key — covers `group by a` + `over (order by wg.a)` and
|
|
278
|
+
* `over (order by w.a)`. Both spellings fall through to the same base attribute
|
|
279
|
+
* the group key was built from, so the match is qualifier-independent. It needs no
|
|
280
|
+
* guard at any depth: attribute ids are minted per relation instance, so only a
|
|
281
|
+
* reference that genuinely resolves to this query's grouping column can match.
|
|
282
|
+
*
|
|
283
|
+
* Otherwise recurse into every child, relational ones included, rebuilding through
|
|
284
|
+
* `withChildren` — a correlated reference to a grouping key can live arbitrarily deep
|
|
285
|
+
* inside a subquery in the window specification, and it must be redirected there too
|
|
286
|
+
* or it reaches the runtime as a base-table attribute the grouped row never carried.
|
|
287
|
+
*
|
|
288
|
+
* NOTE: rule 1 matches by AST text, so a subtree that *reads* like a grouping key but
|
|
289
|
+
* resolves to something else could be redirected wrongly. Within one query the guard
|
|
290
|
+
* above closes that off; the residue is a subtree of ENCLOSING-query references that
|
|
291
|
+
* happens to spell a grouping key (`group by a` in an inner query whose window spec
|
|
292
|
+
* says `outer_alias.a`… only when that fingerprints identically). This is the same
|
|
293
|
+
* limitation the select list already carries through the shared {@link GroupKeyIndex};
|
|
294
|
+
* fixing it means comparing resolved attribute identity rather than text, for both
|
|
295
|
+
* callers at once.
|
|
296
|
+
*/
|
|
297
|
+
export function redirectToGroupKeys(node, context, scope) {
|
|
298
|
+
return redirectNode(node, context, scope);
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* {@link redirectToGroupKeys} over any plan node — the walk crosses relational
|
|
302
|
+
* boundaries, so it cannot be typed scalar-to-scalar throughout.
|
|
303
|
+
*
|
|
304
|
+
* `insideSubquery` records whether the walk has crossed a relational child; it gates
|
|
305
|
+
* rule 1 (see {@link redirectToGroupKeys}).
|
|
306
|
+
*
|
|
307
|
+
* NOTE: this renders an identity fingerprint at every scalar node it visits, and a
|
|
308
|
+
* fingerprint hit inside a subquery then walks that node's subtree again for the guard
|
|
309
|
+
* — so a window specification containing a large subquery costs more to build than
|
|
310
|
+
* before, once per prepare of the query. Not measured; if preparing such queries ever
|
|
311
|
+
* shows up as slow, memoize the fingerprint per node or bail out of the walk for
|
|
312
|
+
* subtrees that contain no `aggregateInputAttrIds` reference at all.
|
|
313
|
+
*/
|
|
314
|
+
function redirectNode(node, context, scope, insideSubquery = false) {
|
|
315
|
+
if ('expression' in node) {
|
|
316
|
+
const expression = node.expression;
|
|
317
|
+
const fingerprintIndex = context.groupKeys.byFingerprint.get(expressionToIdentityString(expression));
|
|
318
|
+
if (fingerprintIndex !== undefined && (!insideSubquery || readsOnlyAggregateInput(node, context))) {
|
|
319
|
+
return buildGroupKeyColumnRef(scope, context.outputAttributes[fingerprintIndex], expression, fingerprintIndex);
|
|
320
|
+
}
|
|
321
|
+
if (CapabilityDetectors.isColumnReference(node)) {
|
|
322
|
+
const baseIndex = context.groupKeys.byBaseAttrId.get(node.attributeId);
|
|
323
|
+
if (baseIndex !== undefined) {
|
|
324
|
+
return buildGroupKeyColumnRef(scope, context.outputAttributes[baseIndex], expression, baseIndex);
|
|
325
|
+
}
|
|
326
|
+
return node;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
const newChildren = [];
|
|
330
|
+
let changed = false;
|
|
331
|
+
for (const child of node.getChildren()) {
|
|
332
|
+
// A CTE definition holds nothing this walk could legally rewrite, and is shared
|
|
333
|
+
// with the rest of the plan — descending would fingerprint its whole body for
|
|
334
|
+
// nothing. See {@link isCteDefinition}.
|
|
335
|
+
const rewritten = isCteDefinition(child)
|
|
336
|
+
? child
|
|
337
|
+
: redirectNode(child, context, scope, insideSubquery || isRelationalNode(child));
|
|
338
|
+
if (rewritten !== child)
|
|
339
|
+
changed = true;
|
|
340
|
+
newChildren.push(rewritten);
|
|
341
|
+
}
|
|
342
|
+
return changed ? node.withChildren(newChildren) : node;
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* True when every column reference in `node`'s subtree names a column the grouped
|
|
346
|
+
* query could have read before it grouped — i.e. the whole subtree belongs to THIS
|
|
347
|
+
* query rather than to a subquery inside it or to an enclosing query. A subtree with
|
|
348
|
+
* no column references at all (a constant) trivially qualifies.
|
|
349
|
+
*/
|
|
350
|
+
function readsOnlyAggregateInput(node, context) {
|
|
351
|
+
if (CapabilityDetectors.isColumnReference(node)) {
|
|
352
|
+
return context.aggregateInputAttrIds.has(node.attributeId);
|
|
353
|
+
}
|
|
354
|
+
for (const child of node.getChildren()) {
|
|
355
|
+
if (!readsOnlyAggregateInput(child, context))
|
|
356
|
+
return false;
|
|
357
|
+
}
|
|
358
|
+
return true;
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Raises the GROUP BY coverage error for a window specification / window-function
|
|
362
|
+
* argument of a GROUPED query that still reads a pre-grouping column after
|
|
363
|
+
* {@link redirectToGroupKeys} has run.
|
|
364
|
+
*
|
|
365
|
+
* Distinct from {@link assertGroupByCoverage} in exactly two ways, both required by
|
|
366
|
+
* the fact that a window expression may contain a subquery:
|
|
367
|
+
*
|
|
368
|
+
* - it descends into relational children, so a correlated reference buried in a
|
|
369
|
+
* subquery is checked rather than skipped;
|
|
370
|
+
* - it flags a column reference only when the attribute id is one of THIS query's
|
|
371
|
+
* pre-grouping columns. A reference to anything else — the subquery's own columns,
|
|
372
|
+
* or a correlated reference to an enclosing query — is legal here and is left alone.
|
|
373
|
+
*
|
|
374
|
+
* The aggregate exemption is likewise narrowed to this query's OWN aggregates; see
|
|
375
|
+
* {@link findUngroupedWindowColumnRef}.
|
|
376
|
+
*/
|
|
377
|
+
export function assertGroupedWindowCoverage(node, context) {
|
|
378
|
+
const ungrouped = findUngroupedWindowColumnRef(node, context);
|
|
379
|
+
if (!ungrouped)
|
|
380
|
+
return;
|
|
381
|
+
throw new QuereusError(`Column '${expressionToString(ungrouped.expression)}' must appear in the GROUP BY clause or be used in an aggregate function`, StatusCode.ERROR, undefined, ungrouped.expression.loc?.start.line, ungrouped.expression.loc?.start.column);
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* The first pre-grouping column reference in `node` that the grouped row cannot carry.
|
|
385
|
+
*
|
|
386
|
+
* `insideSubquery` tracks whether the walk has crossed into a relational child, and
|
|
387
|
+
* gates the aggregate exemption. THIS query's own aggregates read pre-grouping columns
|
|
388
|
+
* by definition (`over (order by count(b) desc)` against a select list that computes
|
|
389
|
+
* `count(b)`), and those sit at the top level. An aggregate reached through a subquery
|
|
390
|
+
* belongs to the subquery, and its arguments may correlate back out — `over (order by
|
|
391
|
+
* (select max(wg.b) from wg t))` reads an ungrouped column of this query and must say
|
|
392
|
+
* so at plan time, not die at runtime with "No row context found for column b".
|
|
393
|
+
*/
|
|
394
|
+
function findUngroupedWindowColumnRef(node, context, insideSubquery = false) {
|
|
395
|
+
if (!insideSubquery && CapabilityDetectors.isAggregateFunction(node)) {
|
|
396
|
+
return null;
|
|
397
|
+
}
|
|
398
|
+
if (CapabilityDetectors.isColumnReference(node)) {
|
|
399
|
+
const attrId = node.attributeId;
|
|
400
|
+
const ungrouped = context.aggregateInputAttrIds.has(attrId) && !context.outputAttrIds.has(attrId);
|
|
401
|
+
return ungrouped ? node : null;
|
|
402
|
+
}
|
|
403
|
+
for (const child of node.getChildren()) {
|
|
404
|
+
if (isCteDefinition(child))
|
|
405
|
+
continue;
|
|
406
|
+
const found = findUngroupedWindowColumnRef(child, context, insideSubquery || isRelationalNode(child));
|
|
407
|
+
if (found)
|
|
408
|
+
return found;
|
|
409
|
+
}
|
|
410
|
+
return null;
|
|
411
|
+
}
|
|
149
412
|
/**
|
|
150
413
|
* Validates that aggregate and non-aggregate projections don't mix inappropriately.
|
|
151
414
|
* With GROUP BY, every non-aggregate column reference in the SELECT list must
|
|
@@ -162,19 +425,11 @@ function validateAggregateProjections(projections, hasAggregates, hasGroupBy, gr
|
|
|
162
425
|
}
|
|
163
426
|
if (!hasGroupBy)
|
|
164
427
|
return;
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
if (CapabilityDetectors.isColumnReference(expr)) {
|
|
169
|
-
groupByAttrIds.add(expr.attributeId);
|
|
170
|
-
}
|
|
171
|
-
groupByExprFingerprints.add(expressionToString(expr.expression));
|
|
172
|
-
}
|
|
428
|
+
// The SELECT list is built against the pre-aggregate scope, so no aggregate
|
|
429
|
+
// output attributes participate.
|
|
430
|
+
const coverage = buildGroupByCoverage(groupByExpressions);
|
|
173
431
|
for (const proj of projections) {
|
|
174
|
-
|
|
175
|
-
if (ungrouped) {
|
|
176
|
-
throw new QuereusError('Cannot mix aggregate and non-aggregate columns in SELECT list without GROUP BY', StatusCode.ERROR);
|
|
177
|
-
}
|
|
432
|
+
assertGroupByCoverage(proj.node, coverage);
|
|
178
433
|
}
|
|
179
434
|
}
|
|
180
435
|
/**
|
|
@@ -184,18 +439,18 @@ function validateAggregateProjections(projections, hasAggregates, hasGroupBy, gr
|
|
|
184
439
|
* resolve their own scope), or any subtree whose AST fingerprint matches a GROUP BY
|
|
185
440
|
* expression (the whole subtree is grouped, e.g. SELECT id+1 ... GROUP BY id+1).
|
|
186
441
|
*/
|
|
187
|
-
function findUngroupedColumnRef(node,
|
|
442
|
+
function findUngroupedColumnRef(node, coverage) {
|
|
188
443
|
if (CapabilityDetectors.isAggregateFunction(node)) {
|
|
189
444
|
return null;
|
|
190
445
|
}
|
|
191
446
|
if ('expression' in node) {
|
|
192
|
-
const fp =
|
|
193
|
-
if (
|
|
447
|
+
const fp = expressionToIdentityString(node.expression);
|
|
448
|
+
if (coverage.fingerprints.has(fp)) {
|
|
194
449
|
return null;
|
|
195
450
|
}
|
|
196
451
|
}
|
|
197
452
|
if (CapabilityDetectors.isColumnReference(node)) {
|
|
198
|
-
if (!
|
|
453
|
+
if (!coverage.attrIds.has(node.attributeId)) {
|
|
199
454
|
return node;
|
|
200
455
|
}
|
|
201
456
|
return null;
|
|
@@ -203,7 +458,7 @@ function findUngroupedColumnRef(node, groupByAttrIds, groupByExprFingerprints) {
|
|
|
203
458
|
for (const child of node.getChildren()) {
|
|
204
459
|
if (isRelationalNode(child))
|
|
205
460
|
continue;
|
|
206
|
-
const found = findUngroupedColumnRef(child,
|
|
461
|
+
const found = findUngroupedColumnRef(child, coverage);
|
|
207
462
|
if (found)
|
|
208
463
|
return found;
|
|
209
464
|
}
|
|
@@ -276,6 +531,16 @@ function createAggregateOutputScope(parentScope, aggregateNode, groupByExpressio
|
|
|
276
531
|
});
|
|
277
532
|
// Register aggregate columns by their aliases. An alias colliding with a
|
|
278
533
|
// group-key base name (or another alias) is ambiguous as a bare reference.
|
|
534
|
+
//
|
|
535
|
+
// NOTE: an un-aliased aggregate's `alias` is its whole rendered expression, and
|
|
536
|
+
// this key is lowercased — so two aggregates differing only in a quoted literal's
|
|
537
|
+
// case (`count(nullif(b,'A'))` / `count(nullif(b,'a'))`) register one ambiguous
|
|
538
|
+
// key here even though they are correctly distinct aggregates. Harmless today:
|
|
539
|
+
// nothing resolves an aggregate through this scope by its rendered text (HAVING /
|
|
540
|
+
// ORDER BY / window specs go through `findMatchingAggregate`, which compares
|
|
541
|
+
// literal-exact identity strings), and only a quoted identifier spelled exactly
|
|
542
|
+
// like the rendering could reach it. If such a lookup path is ever added, key
|
|
543
|
+
// these registrations off `expressionToIdentityString` instead of `toLowerCase`.
|
|
279
544
|
aggregates.forEach((agg, index) => {
|
|
280
545
|
const columnIndex = groupByExpressions.length + index;
|
|
281
546
|
const attr = aggregateAttributes[columnIndex];
|
|
@@ -350,24 +615,101 @@ function buildHavingFilter(input, havingClause, selectContext, aggregateOutputSc
|
|
|
350
615
|
// source columns (registered as a fallback) land on source attribute IDs.
|
|
351
616
|
// We accept both flavors of "grouped" attribute, plus any subtree whose AST
|
|
352
617
|
// fingerprint matches a GROUP BY expression.
|
|
353
|
-
const
|
|
354
|
-
const
|
|
355
|
-
for (const expr of groupByExpressions) {
|
|
356
|
-
if (CapabilityDetectors.isColumnReference(expr)) {
|
|
357
|
-
allowedAttrIds.add(expr.attributeId);
|
|
358
|
-
}
|
|
359
|
-
groupByExprFingerprints.add(expressionToString(expr.expression));
|
|
360
|
-
}
|
|
361
|
-
for (let i = 0; i < groupByExpressions.length + aggregates.length; i++) {
|
|
362
|
-
allowedAttrIds.add(aggregateAttributes[i].id);
|
|
363
|
-
}
|
|
364
|
-
const ungrouped = findUngroupedColumnRef(havingExpression, allowedAttrIds, groupByExprFingerprints);
|
|
618
|
+
const coverage = buildGroupByCoverage(groupByExpressions, aggregateAttributes.slice(0, groupByExpressions.length + aggregates.length));
|
|
619
|
+
const ungrouped = findUngroupedColumnRef(havingExpression, coverage);
|
|
365
620
|
if (ungrouped) {
|
|
366
621
|
throw new QuereusError(`HAVING references non-grouped column '${ungrouped.expression.name}'; ` +
|
|
367
622
|
`HAVING may only reference GROUP BY columns or aggregate expressions`, StatusCode.ERROR, undefined, ungrouped.expression.loc?.start.line, ungrouped.expression.loc?.start.column);
|
|
368
623
|
}
|
|
369
624
|
return new FilterNode(hybridScope, input, havingExpression);
|
|
370
625
|
}
|
|
626
|
+
/**
|
|
627
|
+
* True when the AggregateNode's own output already IS the SELECT list, column for
|
|
628
|
+
* column — its GROUP BY keys in GROUP BY order, then its aggregate results in
|
|
629
|
+
* SELECT order, and nothing left over.
|
|
630
|
+
*
|
|
631
|
+
* An AggregateNode advertises *every* grouping key it computes, so with no
|
|
632
|
+
* projection above it the query's declared result shape is the aggregate's shape,
|
|
633
|
+
* not the select list's. `select count(*) from t group by g` therefore hands back
|
|
634
|
+
* `g` as well as the count, and `select count(*) c, g from t group by g` hands the
|
|
635
|
+
* two back in aggregate order rather than select-list order. Only an exact
|
|
636
|
+
* positional match makes skipping the final projection sound.
|
|
637
|
+
*
|
|
638
|
+
* Callers reach this only after the other `needsFinalProjection` terms answered
|
|
639
|
+
* "no", which means every entry in `projections` is a bare, non-renaming
|
|
640
|
+
* {@link ColumnReferenceNode}; a group key is matched by attribute id so a
|
|
641
|
+
* qualified `select t.k … group by k` still counts as agreement.
|
|
642
|
+
*
|
|
643
|
+
* The agreement this establishes is a *build-time* one, so an optimizer rule that
|
|
644
|
+
* reshapes the aggregate must keep it. `rule-groupby-fd-simplification` drops a
|
|
645
|
+
* functionally-determined group key and re-emits it as a picker `min`, which lands
|
|
646
|
+
* at a different output position; it caps that rewrite with an order-restoring
|
|
647
|
+
* `Project` precisely so this build-time agreement still holds at runtime.
|
|
648
|
+
*/
|
|
649
|
+
function aggregateOutputIsSelectList(stmt, projections, aggregates, groupByExpressions, starProjectionsByColumn, selectContext) {
|
|
650
|
+
// `projections` holds the expanded star columns *and* the non-aggregate SELECT-list
|
|
651
|
+
// columns. Stars are walked from `starProjectionsByColumn` below, so drop them from
|
|
652
|
+
// the cursor's list by object identity — that keeps the remaining entries in
|
|
653
|
+
// SELECT-list order no matter how buildSelectStmt interleaves the two groups
|
|
654
|
+
// (it assembles them in written select-list order).
|
|
655
|
+
const starProjections = new Set();
|
|
656
|
+
for (const expanded of starProjectionsByColumn.values()) {
|
|
657
|
+
for (const starProjection of expanded)
|
|
658
|
+
starProjections.add(starProjection);
|
|
659
|
+
}
|
|
660
|
+
const nonStarProjections = projections.filter(projection => !starProjections.has(projection));
|
|
661
|
+
let columnCursor = 0;
|
|
662
|
+
let aggregateCount = 0;
|
|
663
|
+
let nextGroupKey = 0;
|
|
664
|
+
let sawAggregate = false;
|
|
665
|
+
/** Does this select-list node reference exactly the group key we expect next? */
|
|
666
|
+
const claimsNextGroupKey = (node) => {
|
|
667
|
+
const key = groupByExpressions[nextGroupKey];
|
|
668
|
+
if (!key || sawAggregate)
|
|
669
|
+
return false;
|
|
670
|
+
if (!CapabilityDetectors.isColumnReference(node) || !CapabilityDetectors.isColumnReference(key))
|
|
671
|
+
return false;
|
|
672
|
+
return node.attributeId === key.attributeId;
|
|
673
|
+
};
|
|
674
|
+
for (const column of stmt.columns) {
|
|
675
|
+
if (column.type === 'all') {
|
|
676
|
+
for (const starProjection of starProjectionsByColumn.get(column) ?? []) {
|
|
677
|
+
if (!claimsNextGroupKey(starProjection.node))
|
|
678
|
+
return false;
|
|
679
|
+
nextGroupKey++;
|
|
680
|
+
}
|
|
681
|
+
continue;
|
|
682
|
+
}
|
|
683
|
+
if (column.type !== 'column')
|
|
684
|
+
continue;
|
|
685
|
+
if (containsAggregateFunction(column.expr, selectContext)) {
|
|
686
|
+
// An aggregate result column claims the next aggregate output slot. Those
|
|
687
|
+
// slots all follow the group keys, so nothing may claim a key after one.
|
|
688
|
+
sawAggregate = true;
|
|
689
|
+
aggregateCount++;
|
|
690
|
+
continue;
|
|
691
|
+
}
|
|
692
|
+
const projection = nonStarProjections[columnCursor++];
|
|
693
|
+
if (!projection || !claimsNextGroupKey(projection.node))
|
|
694
|
+
return false;
|
|
695
|
+
nextGroupKey++;
|
|
696
|
+
}
|
|
697
|
+
return nextGroupKey === groupByExpressions.length && aggregateCount === aggregates.length;
|
|
698
|
+
}
|
|
699
|
+
/**
|
|
700
|
+
* True when a SELECT-list expression contains an aggregate function call.
|
|
701
|
+
*
|
|
702
|
+
* NOTE: resolves a function schema per function node while walking, once per prepare
|
|
703
|
+
* of a grouped query, on top of the walk analyzeSelectColumns already does. Not
|
|
704
|
+
* measured; if preparing wide grouped select lists ever shows up as slow, have
|
|
705
|
+
* analyzeSelectColumns publish its per-column aggregate/non-aggregate verdict
|
|
706
|
+
* instead of re-deriving it here.
|
|
707
|
+
*/
|
|
708
|
+
function containsAggregateFunction(expr, selectContext) {
|
|
709
|
+
const found = [];
|
|
710
|
+
findAggregateFunctionExprs(expr, selectContext, found);
|
|
711
|
+
return found.length > 0;
|
|
712
|
+
}
|
|
371
713
|
/**
|
|
372
714
|
* Checks if a final projection is needed for complex expressions or for
|
|
373
715
|
* aliasing simple column refs whose alias differs from the underlying column.
|
|
@@ -451,6 +793,17 @@ function findAggregateFunctionExprs(expr, ctx, results) {
|
|
|
451
793
|
break;
|
|
452
794
|
}
|
|
453
795
|
}
|
|
796
|
+
/**
|
|
797
|
+
* Every aggregate function call inside an AST expression, in source order.
|
|
798
|
+
* Does not descend into an aggregate's own arguments (nested aggregates are
|
|
799
|
+
* invalid SQL). Exported for callers that need to *inspect* the aggregates in a
|
|
800
|
+
* clause rather than collect them into the AggregateNode.
|
|
801
|
+
*/
|
|
802
|
+
export function collectAggregateFunctionExprs(expr, ctx) {
|
|
803
|
+
const found = [];
|
|
804
|
+
findAggregateFunctionExprs(expr, ctx, found);
|
|
805
|
+
return found;
|
|
806
|
+
}
|
|
454
807
|
/**
|
|
455
808
|
* Collects aggregate functions from a HAVING clause AST that are not already
|
|
456
809
|
* present in the existing aggregates list. Returns new aggregates to add.
|
|
@@ -473,17 +826,21 @@ function collectOrderByAggregates(orderBy, selectContext, existingAggregates) {
|
|
|
473
826
|
}
|
|
474
827
|
/**
|
|
475
828
|
* Returns true if any ORDER BY clause expression contains an aggregate function call.
|
|
829
|
+
*
|
|
830
|
+
* A positional reference is resolved against the SELECT list FIRST: the literal `1`
|
|
831
|
+
* in `select count(*) as c from t order by 1` contains no aggregate itself, but it
|
|
832
|
+
* stands for one. Without this the query would take the pre-aggregate sort path and
|
|
833
|
+
* fail with "Aggregate function count not allowed in this context"; with it, it
|
|
834
|
+
* routes to the post-aggregate ORDER BY exactly like the spelled-out
|
|
835
|
+
* `order by count(*)`.
|
|
476
836
|
*/
|
|
477
|
-
function orderByContainsAggregates(orderBy, selectContext) {
|
|
837
|
+
function orderByContainsAggregates(orderBy, selectContext, selectList) {
|
|
478
838
|
if (!orderBy || orderBy.length === 0)
|
|
479
839
|
return false;
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
return true;
|
|
485
|
-
}
|
|
486
|
-
return false;
|
|
840
|
+
return orderBy.some(clause => {
|
|
841
|
+
const entry = resolveOrdinalReference(clause.expr, selectList, 'ORDER BY');
|
|
842
|
+
return containsAggregateFunction(entry?.expr ?? clause.expr, selectContext);
|
|
843
|
+
});
|
|
487
844
|
}
|
|
488
845
|
/**
|
|
489
846
|
* Given a list of aggregate function call AST nodes, builds aggregate plan nodes
|
|
@@ -496,26 +853,27 @@ function dedupeNewAggregates(funcExprs, selectContext, existingAggregates) {
|
|
|
496
853
|
const existingKeys = new Set();
|
|
497
854
|
for (const agg of existingAggregates) {
|
|
498
855
|
if (CapabilityDetectors.isAggregateFunction(agg.expression)) {
|
|
499
|
-
|
|
500
|
-
existingKeys.add(expressionToString(aggNode.expression).toLowerCase());
|
|
856
|
+
existingKeys.add(expressionToIdentityString(agg.expression.expression));
|
|
501
857
|
}
|
|
502
858
|
}
|
|
503
859
|
const newAggregates = [];
|
|
860
|
+
const newKeys = new Set();
|
|
504
861
|
for (const funcExpr of funcExprs) {
|
|
505
|
-
const key =
|
|
862
|
+
const key = expressionToIdentityString(funcExpr);
|
|
506
863
|
if (existingKeys.has(key))
|
|
507
864
|
continue;
|
|
508
|
-
if (
|
|
865
|
+
if (newKeys.has(key))
|
|
509
866
|
continue;
|
|
510
867
|
const aggNode = buildFunctionCall(selectContext, funcExpr, true);
|
|
511
868
|
newAggregates.push({ expression: aggNode, alias: expressionToString(funcExpr) });
|
|
869
|
+
newKeys.add(key);
|
|
512
870
|
}
|
|
513
871
|
return newAggregates;
|
|
514
872
|
}
|
|
515
873
|
/**
|
|
516
874
|
* Builds final projections for the complete SELECT list in aggregate context
|
|
517
875
|
*/
|
|
518
|
-
export function buildFinalAggregateProjections(stmt, selectContext, aggregateOutputScope, aggregateNode, aggregates, groupByExpressions) {
|
|
876
|
+
export function buildFinalAggregateProjections(stmt, selectContext, aggregateOutputScope, aggregateNode, aggregates, groupByExpressions, starProjectionsByColumn = new Map()) {
|
|
519
877
|
const finalProjections = [];
|
|
520
878
|
const aggregateAttributes = aggregateNode.getAttributes();
|
|
521
879
|
// Build context with aggregates so buildFunctionCall can resolve aggregate references
|
|
@@ -540,19 +898,36 @@ export function buildFinalAggregateProjections(stmt, selectContext, aggregateOut
|
|
|
540
898
|
// it and the unique group-key FD is silently dropped at the projection
|
|
541
899
|
// (`keysOf(root) = []`). Referencing the aggregate group column keeps the key
|
|
542
900
|
// and republishes it under exactly its grouping collation (trivially sound).
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
});
|
|
901
|
+
//
|
|
902
|
+
// The same index also maps bare source columns that are themselves group keys
|
|
903
|
+
// straight to the aggregate's group output column, which is what expands
|
|
904
|
+
// `SELECT *` in a grouped query in source-column order rather than GROUP BY order.
|
|
905
|
+
const groupKeys = indexGroupKeys(groupByExpressions);
|
|
549
906
|
for (const column of stmt.columns) {
|
|
907
|
+
if (column.type === 'all') {
|
|
908
|
+
for (const starProj of starProjectionsByColumn.get(column) ?? []) {
|
|
909
|
+
const gbIdx = starGroupKeyIndex(starProj, groupKeys.byBaseAttrId);
|
|
910
|
+
if (gbIdx === undefined) {
|
|
911
|
+
// validateAggregateProjections already rejected every star column that
|
|
912
|
+
// is not a grouping key, so reaching here means the two disagree.
|
|
913
|
+
throw new QuereusError(`Internal: SELECT * column '${starProj.alias ?? '?'}' is not a GROUP BY key`, StatusCode.INTERNAL);
|
|
914
|
+
}
|
|
915
|
+
const starRef = starProj.node;
|
|
916
|
+
const colRef = buildGroupKeyColumnRef(aggregateOutputScope, aggregateAttributes[gbIdx], starRef.expression, gbIdx);
|
|
917
|
+
finalProjections.push({
|
|
918
|
+
node: colRef,
|
|
919
|
+
alias: starProj.alias,
|
|
920
|
+
attributeId: colRef.attributeId
|
|
921
|
+
});
|
|
922
|
+
}
|
|
923
|
+
continue;
|
|
924
|
+
}
|
|
550
925
|
if (column.type === 'column') {
|
|
551
926
|
// Bare columns (`type === 'column'`) already resolve against the aggregate
|
|
552
927
|
// group symbol (registered under the column name) in recompute, so their
|
|
553
928
|
// key survives; only non-bare group expressions need the direct reference.
|
|
554
929
|
const gbIdx = column.expr.type !== 'column'
|
|
555
|
-
?
|
|
930
|
+
? groupKeys.byFingerprint.get(expressionToIdentityString(column.expr))
|
|
556
931
|
: undefined;
|
|
557
932
|
if (gbIdx !== undefined) {
|
|
558
933
|
const colRef = buildGroupKeyColumnRef(aggregateOutputScope, aggregateAttributes[gbIdx], column.expr, gbIdx);
|
|
@@ -583,6 +958,15 @@ export function buildFinalAggregateProjections(stmt, selectContext, aggregateOut
|
|
|
583
958
|
}
|
|
584
959
|
return finalProjections;
|
|
585
960
|
}
|
|
961
|
+
/**
|
|
962
|
+
* Resolves one expanded `SELECT *` column to the GROUP BY index it was grouped on,
|
|
963
|
+
* or `undefined` if it is not a bare reference to a grouping key.
|
|
964
|
+
*/
|
|
965
|
+
function starGroupKeyIndex(starProj, groupKeyByAttrId) {
|
|
966
|
+
if (!CapabilityDetectors.isColumnReference(starProj.node))
|
|
967
|
+
return undefined;
|
|
968
|
+
return groupKeyByAttrId.get(starProj.node.attributeId);
|
|
969
|
+
}
|
|
586
970
|
/**
|
|
587
971
|
* Synthesizes a bare {@link ColumnReferenceNode} to an AggregateNode group output
|
|
588
972
|
* column for a SELECT-list item that fingerprint-matches a GROUP BY expression.
|
|
@@ -594,8 +978,8 @@ export function buildFinalAggregateProjections(stmt, selectContext, aggregateOut
|
|
|
594
978
|
* keeps the same name `ProjectNode.buildOutputType` would have produced for the
|
|
595
979
|
* recomputed expression.
|
|
596
980
|
*/
|
|
597
|
-
function buildGroupKeyColumnRef(
|
|
981
|
+
function buildGroupKeyColumnRef(scope, groupAttr, selectExpr, columnIndex) {
|
|
598
982
|
const colExpr = { type: 'column', name: expressionToString(selectExpr) };
|
|
599
|
-
return new ColumnReferenceNode(
|
|
983
|
+
return new ColumnReferenceNode(scope, colExpr, groupAttr.type, groupAttr.id, columnIndex);
|
|
600
984
|
}
|
|
601
985
|
//# sourceMappingURL=select-aggregates.js.map
|