Skip to content

Commit eedc02f

Browse files
authored
returning issues unit tests (#15333)
1 parent 4e131ff commit eedc02f

File tree

2 files changed

+82
-0
lines changed

2 files changed

+82
-0
lines changed

ydb/core/kqp/opt/physical/effects/kqp_opt_phy_returning.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,22 @@ TExprBase KqpBuildReturning(TExprBase node, TExprContext& ctx, const TKqpOptimiz
151151
.Index().Build("0")
152152
.Build()
153153
.Done();
154+
} else if (NDq::IsDqPureExpr(input.Cast())) {
155+
input = Build<TDqCnUnionAll>(ctx, pos)
156+
.Output()
157+
.Stage<TDqStage>()
158+
.Inputs().Build()
159+
.Program()
160+
.Args({})
161+
.Body<TCoToFlow>()
162+
.Input(input.Cast())
163+
.Build()
164+
.Build()
165+
.Settings().Build()
166+
.Build()
167+
.Index().Build("0")
168+
.Build()
169+
.Done();
154170
}
155171

156172
auto inputExpr = Build<TCoExtractMembers>(ctx, pos)
@@ -173,6 +189,10 @@ TExprBase KqpBuildReturning(TExprBase node, TExprContext& ctx, const TKqpOptimiz
173189
return buildReturningRows(del.Input().Cast(), MakeColumnsList(tableDesc.Metadata->KeyColumnNames, ctx, node.Pos()), returning.Columns());
174190
}
175191
}
192+
193+
if (item.Maybe<TKqlTableEffect>()) {
194+
return node;
195+
}
176196
}
177197
}
178198

@@ -183,6 +203,10 @@ TExprBase KqpBuildReturning(TExprBase node, TExprContext& ctx, const TKqpOptimiz
183203
return buildReturningRows(del.Input().Cast(), MakeColumnsList(tableDesc.Metadata->KeyColumnNames, ctx, node.Pos()), returning.Columns());
184204
}
185205

206+
if (returning.Update().Maybe<TKqlTableEffect>()) {
207+
return node;
208+
}
209+
186210
TExprNode::TPtr result = returning.Update().Ptr();
187211
auto status = TryConvertTo(result, *result->GetTypeAnn(), *returning.Raw()->GetTypeAnn(), ctx);
188212
YQL_ENSURE(status.Level != IGraphTransformer::TStatus::Error, "wrong returning expr type");

ydb/core/kqp/ut/opt/kqp_returning_ut.cpp

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,64 @@ Y_UNIT_TEST(ReturningSerial) {
314314
}
315315
}
316316

317+
318+
Y_UNIT_TEST(ReturningWorksQS) {
319+
auto kikimr = DefaultKikimrRunner();
320+
auto db = kikimr.GetTableClient();
321+
auto session = db.CreateSession().GetValueSync().GetSession();
322+
CreateSampleTablesWithIndex(session, true);
323+
324+
auto qdb = kikimr.GetQueryClient();
325+
auto qSession = qdb.GetSession().GetValueSync().GetSession();
326+
auto result = qSession.ExecuteQuery(R"(
327+
UPSERT INTO `/Root/SecondaryKeys` (Key, Fk, Value) VALUES (1, 1, "Payload1") RETURNING *;
328+
)", NYdb::NQuery::TTxControl::BeginTx().CommitTx()).ExtractValueSync();
329+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
330+
CompareYson(R"([
331+
[[1];[1];["Payload1"]];
332+
])", FormatResultSetYson(result.GetResultSet(0)));
333+
}
334+
335+
Y_UNIT_TEST(ReturningWorksIndexedUpsertV2) {
336+
auto kikimr = DefaultKikimrRunner();
337+
auto db = kikimr.GetTableClient();
338+
auto session = db.CreateSession().GetValueSync().GetSession();
339+
CreateSampleTablesWithIndex(session, true);
340+
341+
auto qdb = kikimr.GetQueryClient();
342+
auto qSession = qdb.GetSession().GetValueSync().GetSession();
343+
auto result = qSession.ExecuteQuery(R"(
344+
$v1 = (SELECT Key + 100 as Key, Fk + 100 as Fk, Value FROM `/Root/SecondaryKeys` WHERE Key IS NOT NULL AND Fk IS NOT NULL);
345+
$v2 = (SELECT Key + 105 as Key, Fk + 105 as Fk, Value FROM `/Root/SecondaryKeys` WHERE Key IS NOT NULL AND Fk IS NOT NULL);
346+
UPSERT INTO `/Root/SecondaryKeys`
347+
SELECT * FROM (SELECT * FROM $v1 UNION ALL SELECT * FROM $v2) WHERE Key > 107 RETURNING *;
348+
)", NYdb::NQuery::TTxControl::BeginTx().CommitTx()).ExtractValueSync();
349+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
350+
CompareYson(R"([
351+
[[110];[110];["Payload5"]];
352+
])", FormatResultSetYson(result.GetResultSet(0)));
353+
}
354+
355+
Y_UNIT_TEST(ReturningWorksIndexedInsertV3) {
356+
auto kikimr = DefaultKikimrRunner();
357+
auto db = kikimr.GetTableClient();
358+
auto session = db.CreateSession().GetValueSync().GetSession();
359+
CreateSampleTablesWithIndex(session, true);
360+
361+
auto qdb = kikimr.GetQueryClient();
362+
auto qSession = qdb.GetSession().GetValueSync().GetSession();
363+
auto result = qSession.ExecuteQuery(R"(
364+
$v1 = (SELECT Key + 100 as Key, Fk + 100 as Fk, Value FROM `/Root/SecondaryKeys` WHERE Key IS NOT NULL AND Fk IS NOT NULL);
365+
$v2 = (SELECT Key + 205 as Key, Fk + 205 as Fk, Value FROM `/Root/SecondaryKeys` WHERE Key IS NOT NULL AND Fk IS NOT NULL);
366+
INSERT INTO `/Root/SecondaryKeys`
367+
SELECT * FROM (SELECT * FROM $v1 UNION ALL SELECT * FROM $v2 ) WHERE Key < 102 RETURNING *;
368+
)", NYdb::NQuery::TTxControl::BeginTx().CommitTx()).ExtractValueSync();
369+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
370+
CompareYson(R"([
371+
[[101];[101];["Payload1"]];
372+
])", FormatResultSetYson(result.GetResultSet(0)));
373+
}
374+
317375
Y_UNIT_TEST(ReturningColumnsOrder) {
318376
auto kikimr = DefaultKikimrRunner();
319377

0 commit comments

Comments
 (0)