aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvvvv <vvvv@ydb.tech>2022-08-04 17:29:33 +0300
committervvvv <vvvv@ydb.tech>2022-08-04 17:29:33 +0300
commit1a626986c00f70a23740c3ba5c95ef51cb3d7238 (patch)
tree92664c9716295ae4b8c4755b4dafef4f8fe475ab
parent7b45065f0189d96608d9f7e7f8495a17b43b81e3 (diff)
downloadydb-1a626986c00f70a23740c3ba5c95ef51cb3d7238.tar.gz
distinct all in projection
-rw-r--r--ydb/library/yql/core/common_opt/yql_co_pgselect.cpp5
-rw-r--r--ydb/library/yql/core/type_ann/type_ann_pg.cpp13
-rw-r--r--ydb/library/yql/sql/pg/pg_sql.cpp18
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;