diff options
author | vitya-smirnov <[email protected]> | 2025-09-05 11:36:09 +0300 |
---|---|---|
committer | vitya-smirnov <[email protected]> | 2025-09-05 13:24:55 +0300 |
commit | 2db41830cd5fce47e0bac5493c1e1472908cc4c5 (patch) | |
tree | e69466e8db1cd55453de95f6ca7d108cae990466 /yql/essentials/sql/v1/aggregation.cpp | |
parent | c16c8277df06c43957bef277c57200b22772d046 (diff) |
YQL-20234: Remove predicate argument on middle aggregation phases
Also added tests for:
- max_by
- agg_list
- some
- avg_if
- sum_if
- count_if
commit_hash:0da4f3b9b1767850e65c914b727bc362cf4cc125
Diffstat (limited to 'yql/essentials/sql/v1/aggregation.cpp')
-rw-r--r-- | yql/essentials/sql/v1/aggregation.cpp | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/yql/essentials/sql/v1/aggregation.cpp b/yql/essentials/sql/v1/aggregation.cpp index d7324012c13..87a1859f208 100644 --- a/yql/essentials/sql/v1/aggregation.cpp +++ b/yql/essentials/sql/v1/aggregation.cpp @@ -370,7 +370,24 @@ public: private: bool InitAggr(TContext& ctx, bool isFactory, ISource* src, TAstListNode& node, const TVector<TNodePtr>& exprs) final { - ui32 adjustArgsCount = isFactory ? 0 : 2; + TStringBuf suffix; + if (src != nullptr) { + suffix = src->GetGroupBySuffix(); + } else { + suffix = ""; + } + + bool isStateRecieving = !(suffix == "" || suffix == "Combine" || suffix == "Finalize"); + + ui32 adjustArgsCount; + if (isFactory) { + adjustArgsCount = 0; + } else if (isStateRecieving) { + adjustArgsCount = 1; + } else { + adjustArgsCount = 2; + } + if (exprs.size() != adjustArgsCount) { ctx.Error(Pos_) << "Aggregation function " << (isFactory ? "factory " : "") << Name_ << " requires " << adjustArgsCount << " arguments, given: " << exprs.size(); @@ -383,7 +400,11 @@ private: if (!isFactory) { Payload_ = exprs.front(); - Predicate_ = exprs.back(); + if (!isStateRecieving) { + Predicate_ = exprs.back(); + } else { + Predicate_ = Y("InstanceOf", Y("DataType", Q("Bool"))); + } Name_ = src->MakeLocalName(Name_); } |