Skip to content

Commit f04482b

Browse files
author
Pavel Velikhov
committed
Intermediate commit
1 parent aa9cd7f commit f04482b

14 files changed

+954
-887
lines changed

ydb/core/kqp/expr_nodes/kqp_expr_nodes.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -900,7 +900,8 @@
900900
"Match" : {"Type": "Callable", "Name": "KqpOpRoot"},
901901
"Children": [
902902
{"Index": 0, "Name": "Input", "Type": "TExprBase"},
903-
{"Index": 1, "Name": "ColumnOrder", "Type": "TCoAtomList"}
903+
{"Index": 1, "Name": "ColumnOrder", "Type": "TCoAtomList"},
904+
{"Index": 2, "Name": "PgSyntax", "Type": "TCoAtom"}
904905
]
905906
},
906907
{
@@ -930,9 +931,9 @@
930931
]
931932
},
932933
{
933-
"Name": "TKqpPgExprSublink",
934+
"Name": "TKqpExprSublink",
934935
"Base": "TExprBase",
935-
"Match" : {"Type": "Callable", "Name": "KqpPgExprSublink"},
936+
"Match" : {"Type": "Callable", "Name": "KqpExprSublink"},
936937
"Children": [
937938
{"Index": 0, "Name": "Expr", "Type": "TExprBase"}
938939
]

ydb/core/kqp/host/kqp_host.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1989,6 +1989,7 @@ class TKqpHost : public IKqpHost {
19891989
const TGatewaysConfig* gatewaysConfig = nullptr; // TODO: can we get real gatewaysConfig here?
19901990
auto allowSettings = [](TStringBuf settingName) {
19911991
return settingName == "OrderedColumns"
1992+
|| settingName == "DeriveColumnOrder"
19921993
|| settingName == "DisableOrderedColumns"
19931994
|| settingName == "Warning"
19941995
|| settingName == "UseBlocks"

ydb/core/kqp/host/kqp_runner.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ class TKqpRunner : public IKqpRunner {
372372
.AddPostTypeAnnotation(/* forSubgraph */ true)
373373
//.AddCommonOptimization()
374374

375-
.Add(CreateKqpPgRewriteTransformer(OptimizeCtx, *typesCtx), "RewritePgSelect")
375+
.Add(CreateKqpRewriteSelectTransformer(OptimizeCtx, *typesCtx), "RewriteSelect")
376376
.Add(CreateKqpNewRBOTransformer(OptimizeCtx, *typesCtx, rboKqpTypeAnnTransformer, kqpTypeAnnTransformer, newRBOPhysicalPeepholeTransformer, funcRegistry), "NewRBOTransformer")
377377
.Add(CreateKqpRBOCleanupTransformer(*typesCtx), "RBOCleanupTransformer")
378378

ydb/core/kqp/opt/kqp_type_ann.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2228,8 +2228,8 @@ TStatus AnnotateTableSinkSettings(const TExprNode::TPtr& input, TExprContext& ct
22282228
return TStatus::Ok;
22292229
}
22302230

2231-
TStatus AnnotatePgExprSublink(const TExprNode::TPtr& node, TExprContext& ctx) {
2232-
auto expr = node->Child(TKqpPgExprSublink::idx_Expr);
2231+
TStatus AnnotateExprSublink(const TExprNode::TPtr& node, TExprContext& ctx) {
2232+
auto expr = node->Child(TKqpExprSublink::idx_Expr);
22332233
auto itemType = expr->GetTypeAnn()->Cast<TListExprType>()->GetItemType()->Cast<TStructExprType>();
22342234
auto valueType = itemType->GetItems()[0]->GetItemType();
22352235
if (!valueType->IsOptionalOrNull()) {
@@ -2267,7 +2267,10 @@ TStatus AnnotateOpRead(const TExprNode::TPtr& node, TExprContext& ctx, const TSt
22672267
TVector<const TItemExprType*> structItemTypes = rowType->Cast<TStructExprType>()->GetItems();
22682268
TVector<const TItemExprType*> newItemTypes;
22692269
for (auto t : structItemTypes ) {
2270-
newItemTypes.push_back(ctx.MakeType<TItemExprType>("_alias_" + TString(alias->Content()) + "." + t->GetName(), t->GetItemType()));
2270+
TString aliasName = TString(alias->Content());
2271+
TString columnName = TString(t->GetName());
2272+
TString fullName = aliasName != "" ? ( "_alias_" + aliasName + "." + columnName ) : columnName;
2273+
newItemTypes.push_back(ctx.MakeType<TItemExprType>(fullName, t->GetItemType()));
22712274
}
22722275

22732276
YQL_CLOG(TRACE, CoreDq) << "Row type:" << *rowType;
@@ -2687,8 +2690,8 @@ TAutoPtr<IGraphTransformer> CreateKqpTypeAnnotationTransformer(const TString& cl
26872690
return AnnotateTableSinkSettings(input, ctx);
26882691
}
26892692

2690-
if (TKqpPgExprSublink::Match(input.Get())) {
2691-
return AnnotatePgExprSublink(input, ctx);
2693+
if (TKqpExprSublink::Match(input.Get())) {
2694+
return AnnotateExprSublink(input, ctx);
26922695
}
26932696

26942697
if (TKqpOpRead::Match(input.Get())) {

ydb/core/kqp/opt/rbo/kqp_operator.cpp

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ TExprNode::TPtr AddRenames(TExprNode::TPtr input, TExprContext &ctx, TVector<TIn
2626
for (auto iu : renames) {
2727
// clang-format off
2828
auto tuple = Build<TCoNameValueTuple>(ctx, input->Pos())
29-
.Name().Build("_alias_" + iu.Alias + "." + iu.ColumnName)
29+
.Name().Build(iu.GetFullName())
3030
.Value<TCoMember>()
3131
.Struct(arg)
3232
.Name().Build(iu.ColumnName)
@@ -668,6 +668,19 @@ TVector<TInfoUnit> TOpFilter::GetScalarSubplanIUs(TPlanProps& props) {
668668
return res;
669669
}
670670

671+
bool TestAndExtractEqualityPredicate(TExprNode::TPtr pred, TExprNode::TPtr& leftArg, TExprNode::TPtr& rightArg) {
672+
if (pred->IsCallable("PgResolvedOp") && pred->Child(0)->Content() == "=") {
673+
leftArg = pred->Child(2);
674+
rightArg = pred->Child(3);
675+
return true;
676+
} else if (pred->IsCallable("==")) {
677+
leftArg = pred->Child(0);
678+
rightArg = pred->Child(1);
679+
return true;
680+
}
681+
return false;
682+
}
683+
671684
TConjunctInfo TOpFilter::GetConjunctInfo(TPlanProps& props) const {
672685
TConjunctInfo res;
673686

@@ -686,9 +699,9 @@ TConjunctInfo TOpFilter::GetConjunctInfo(TPlanProps& props) const {
686699
fromPg = true;
687700
}
688701

689-
if (conjObj->IsCallable("PgResolvedOp") && conjObj->Child(0)->Content() == "=") {
690-
auto leftArg = conjObj->Child(2);
691-
auto rightArg = conjObj->Child(3);
702+
TExprNode::TPtr leftArg;
703+
TExprNode::TPtr rightArg;
704+
if (TestAndExtractEqualityPredicate(conjObj, leftArg, rightArg)) {
692705
TVector<TInfoUnit> conjIUs;
693706
GetAllMembers(conj, conjIUs, props);
694707

ydb/core/kqp/opt/rbo/kqp_operator.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ struct TPlanProps {
234234
TStageGraph StageGraph;
235235
int InternalVarIdx = 1;
236236
TScalarSubplans ScalarSubplans;
237+
bool PgSyntax = false;
237238
};
238239

239240

@@ -411,6 +412,8 @@ class TOpFilter : public IUnaryOperator {
411412
TExprNode::TPtr FilterLambda;
412413
};
413414

415+
bool TestAndExtractEqualityPredicate(TExprNode::TPtr pred, TExprNode::TPtr& leftArg, TExprNode::TPtr& rightArg);
416+
414417
class TOpJoin : public IBinaryOperator {
415418
public:
416419
TOpJoin(std::shared_ptr<IOperator> leftArg, std::shared_ptr<IOperator> rightArg, TPositionHandle pos, TString joinKind,

ydb/core/kqp/opt/rbo/kqp_plan_conversion_utils.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ TExprNode::TPtr PlanConverter::RemoveScalarSubplans(TExprNode::TPtr node) {
1212
auto lambda = TCoLambda(node);
1313
auto lambdaBody = lambda.Body().Ptr();
1414

15-
auto exprSublinks = FindNodes(lambdaBody, [](const TExprNode::TPtr& n){return n->IsCallable("KqpPgExprSublink");});
15+
auto exprSublinks = FindNodes(lambdaBody, [](const TExprNode::TPtr& n){return n->IsCallable("KqpExprSublink");});
1616
if (exprSublinks.empty()) {
1717
return node;
1818
}
@@ -26,7 +26,7 @@ TExprNode::TPtr PlanConverter::RemoveScalarSubplans(TExprNode::TPtr node) {
2626
.Name<TCoAtom>().Value(sublinkVar.GetFullName()).Build()
2727
.Done().Ptr();
2828
replaceMap[link.Get()] = member;
29-
auto subplan = ExprNodeToOperator(TKqpPgExprSublink(link).Expr().Ptr());
29+
auto subplan = ExprNodeToOperator(TKqpExprSublink(link).Expr().Ptr());
3030
PlanProps.ScalarSubplans.Add(sublinkVar, subplan);
3131
}
3232

@@ -53,6 +53,7 @@ TOpRoot PlanConverter::ConvertRoot(TExprNode::TPtr node) {
5353
auto res = TOpRoot(rootInput, node->Pos(), columnOrder);
5454
res.Node = node;
5555
res.PlanProps = PlanProps;
56+
res.PlanProps.PgSyntax = std::stoi(opRoot.PgSyntax().StringValue());
5657
return res;
5758
}
5859

ydb/core/kqp/opt/rbo/kqp_rbo_rules.cpp

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,14 @@ TExprNode::TPtr FindMemberArg(TExprNode::TPtr input) {
6767
return TExprNode::TPtr();
6868
}
6969

70-
TExprNode::TPtr BuildFilterLambdaFromConjuncts(TPositionHandle pos, TVector<TFilterInfo> conjuncts, TExprContext &ctx) {
70+
TExprNode::TPtr BuildFilterLambdaFromConjuncts(TPositionHandle pos, TVector<TFilterInfo> conjuncts, TExprContext &ctx, bool pgSyntax) {
7171
auto arg = Build<TCoArgument>(ctx, pos).Name("lambda_arg").Done();
7272
TExprNode::TPtr lambda;
7373

7474
if (conjuncts.size() == 1) {
7575
auto filterInfo = conjuncts[0];
7676
auto body = ReplaceArg(filterInfo.FilterBody, arg.Ptr(), ctx);
77-
if (!filterInfo.FromPg) {
77+
if (pgSyntax && !filterInfo.FromPg) {
7878
body = ctx.Builder(body->Pos()).Callable("FromPg").Add(0, body).Seal().Build();
7979
}
8080

@@ -89,7 +89,7 @@ TExprNode::TPtr BuildFilterLambdaFromConjuncts(TPositionHandle pos, TVector<TFil
8989

9090
for (auto c : conjuncts) {
9191
auto body = ReplaceArg(c.FilterBody, arg.Ptr(), ctx);
92-
if (!c.FromPg) {
92+
if (pgSyntax && !c.FromPg) {
9393
body = ctx.Builder(body->Pos()).Callable("FromPg").Add(0, body).Seal().Build();
9494
}
9595
newConjuncts.push_back(ReplaceArg(body, arg.Ptr(), ctx));
@@ -176,9 +176,10 @@ bool TExtractJoinExpressionsRule::TestAndApply(std::shared_ptr<IOperator> &input
176176
predicate = predicate->Child(0);
177177
}
178178

179-
if (predicate->IsCallable("PgResolvedOp") && predicate->Child(0)->Content() == "=") {
180-
auto leftSide = predicate->Child(2);
181-
auto rightSide = predicate->Child(3);
179+
TExprNode::TPtr leftSide;
180+
TExprNode::TPtr rightSide;
181+
182+
if (TestAndExtractEqualityPredicate(predicate, leftSide, rightSide)) {
182183

183184
if (leftSide->IsCallable("Member") && rightSide->IsCallable("Member")) {
184185
continue;
@@ -489,7 +490,7 @@ std::shared_ptr<IOperator> TPushFilterRule::SimpleTestAndApply(const std::shared
489490
auto rightInput = join->GetRightInput();
490491

491492
if (pushLeft.size()) {
492-
auto leftLambda = BuildFilterLambdaFromConjuncts(leftInput->Pos, pushLeft, ctx.ExprCtx);
493+
auto leftLambda = BuildFilterLambdaFromConjuncts(leftInput->Pos, pushLeft, ctx.ExprCtx, props.PgSyntax);
493494
leftInput = std::make_shared<TOpFilter>(leftInput, input->Pos, leftLambda);
494495
}
495496

@@ -504,14 +505,14 @@ std::shared_ptr<IOperator> TPushFilterRule::SimpleTestAndApply(const std::shared
504505
}
505506
}
506507
if (predicatesForRightSide.size()) {
507-
auto rightLambda = BuildFilterLambdaFromConjuncts(rightInput->Pos, pushRight, ctx.ExprCtx);
508+
auto rightLambda = BuildFilterLambdaFromConjuncts(rightInput->Pos, pushRight, ctx.ExprCtx, props.PgSyntax);
508509
rightInput = std::make_shared<TOpFilter>(rightInput, input->Pos, rightLambda);
509510
join->JoinKind = "Inner";
510511
} else {
511512
return input;
512513
}
513514
} else {
514-
auto rightLambda = BuildFilterLambdaFromConjuncts(rightInput->Pos, pushRight, ctx.ExprCtx);
515+
auto rightLambda = BuildFilterLambdaFromConjuncts(rightInput->Pos, pushRight, ctx.ExprCtx, props.PgSyntax);
515516
rightInput = std::make_shared<TOpFilter>(rightInput, input->Pos, rightLambda);
516517
}
517518
}
@@ -524,7 +525,7 @@ std::shared_ptr<IOperator> TPushFilterRule::SimpleTestAndApply(const std::shared
524525
join->Children[1] = rightInput;
525526

526527
if (topLevelPreds.size()) {
527-
auto topFilterLambda = BuildFilterLambdaFromConjuncts(join->Pos, topLevelPreds, ctx.ExprCtx);
528+
auto topFilterLambda = BuildFilterLambdaFromConjuncts(join->Pos, topLevelPreds, ctx.ExprCtx, props.PgSyntax);
528529
output = std::make_shared<TOpFilter>(join, input->Pos, topFilterLambda);
529530
} else {
530531
output = join;

0 commit comments

Comments
 (0)