diff options
author | vvvv <vvvv@ydb.tech> | 2022-08-04 17:29:33 +0300 |
---|---|---|
committer | vvvv <vvvv@ydb.tech> | 2022-08-04 17:29:33 +0300 |
commit | 1a626986c00f70a23740c3ba5c95ef51cb3d7238 (patch) | |
tree | 92664c9716295ae4b8c4755b4dafef4f8fe475ab | |
parent | 7b45065f0189d96608d9f7e7f8495a17b43b81e3 (diff) | |
download | ydb-1a626986c00f70a23740c3ba5c95ef51cb3d7238.tar.gz |
distinct all in projection
-rw-r--r-- | ydb/library/yql/core/common_opt/yql_co_pgselect.cpp | 5 | ||||
-rw-r--r-- | ydb/library/yql/core/type_ann/type_ann_pg.cpp | 13 | ||||
-rw-r--r-- | ydb/library/yql/sql/pg/pg_sql.cpp | 18 |
3 files changed, 27 insertions, 9 deletions
diff --git a/ydb/library/yql/core/common_opt/yql_co_pgselect.cpp b/ydb/library/yql/core/common_opt/yql_co_pgselect.cpp index 1415f036b7e..8bc2b617fd8 100644 --- a/ydb/library/yql/core/common_opt/yql_co_pgselect.cpp +++ b/ydb/library/yql/core/common_opt/yql_co_pgselect.cpp @@ -2252,6 +2252,7 @@ TExprNode::TPtr ExpandPgSelectImpl(const TExprNode::TPtr& node, TExprContext& ct auto groupBy = GetSetting(setItem->Tail(), "group_by"); auto having = GetSetting(setItem->Tail(), "having"); auto window = GetSetting(setItem->Tail(), "window"); + auto distinctAll = GetSetting(setItem->Tail(), "distinct_all"); bool oneRow = !from; TExprNode::TPtr list; if (values) { @@ -2312,6 +2313,10 @@ TExprNode::TPtr ExpandPgSelectImpl(const TExprNode::TPtr& node, TExprContext& ct .Add(1, projectionLambda) .Seal() .Build(); + + if (distinctAll) { + list = ctx.NewCallable(node->Pos(), "SqlAggregateAll", { list }); + } } setItemNodes.push_back(list); diff --git a/ydb/library/yql/core/type_ann/type_ann_pg.cpp b/ydb/library/yql/core/type_ann/type_ann_pg.cpp index bf0f1171813..7ccbd71d270 100644 --- a/ydb/library/yql/core/type_ann/type_ann_pg.cpp +++ b/ydb/library/yql/core/type_ann/type_ann_pg.cpp @@ -2049,7 +2049,8 @@ IGraphTransformer::TStatus PgSetItemWrapper(const TExprNode::TPtr& input, TExprN // pass 3 - where, group_by // pass 4 - window // pass 5 - result - for (ui32 pass = 0; pass < 6; ++pass) { + // pass 6 - distinct_all + for (ui32 pass = 0; pass < 7; ++pass) { if (pass > 1 && !inputs.empty() && !hasJoinOps) { ctx.Expr.AddError(TIssue(ctx.Expr.GetPosition(input->Pos()), "Missing join_ops")); return IGraphTransformer::TStatus::Error; @@ -2783,7 +2784,15 @@ IGraphTransformer::TStatus PgSetItemWrapper(const TExprNode::TPtr& input, TExprN return IGraphTransformer::TStatus::Repeat; } } - else { + else if (optionName == "distinct_all") { + if (pass != 6) { + continue; + } + + if (!EnsureTupleSize(*option, 1, ctx.Expr)) { + return IGraphTransformer::TStatus::Error; + } + } else { ctx.Expr.AddError(TIssue(ctx.Expr.GetPosition(option->Head().Pos()), TStringBuilder() << "Unsupported option: " << optionName)); return IGraphTransformer::TStatus::Error; diff --git a/ydb/library/yql/sql/pg/pg_sql.cpp b/ydb/library/yql/sql/pg/pg_sql.cpp index 9fe3c2b7717..7f28a5f64ef 100644 --- a/ydb/library/yql/sql/pg/pg_sql.cpp +++ b/ydb/library/yql/sql/pg/pg_sql.cpp @@ -305,9 +305,14 @@ public: TVector<TAstNode*> setItemNodes; for (const auto& x : setItems) { + bool hasDistinctAll = false; if (x->distinctClause) { - AddError("SelectStmt: not supported distinctClause"); - return nullptr; + if (linitial(x->distinctClause) == NULL) { + hasDistinctAll = true; + } else { + AddError("SelectStmt: not supported DISTINCT ON"); + return nullptr; + } } if (x->intoClause) { @@ -640,15 +645,14 @@ public: setItemOptions.push_back(QL(QA("having"), L(A("PgWhere"), L(A("Void")), lambda))); } + if (hasDistinctAll) { + setItemOptions.push_back(QL(QA("distinct_all"))); + } + auto setItem = L(A("PgSetItem"), QVL(setItemOptions.data(), setItemOptions.size())); setItemNodes.push_back(setItem); } - if (value->distinctClause) { - AddError("SelectStmt: not supported distinctClause"); - return nullptr; - } - if (value->intoClause) { AddError("SelectStmt: not supported intoClause"); return nullptr; |