Skip to content

Commit c68e211

Browse files
authored
Merge returning fixes 24-3 (#9351)
1 parent 4255d09 commit c68e211

File tree

2 files changed

+76
-4
lines changed

2 files changed

+76
-4
lines changed

ydb/core/kqp/provider/yql_kikimr_opt_build.cpp

+27-4
Original file line numberDiff line numberDiff line change
@@ -247,14 +247,18 @@ struct TKiExploreTxResults {
247247
}
248248
}
249249

250-
void AddResult(const TExprBase& result) {
250+
void PrepareForResult() {
251251
if (QueryBlocks.empty()) {
252252
AddQueryBlock();
253253
}
254254

255255
if (!ConcurrentResults && QueryBlocks.back().Results.size() > 0) {
256256
AddQueryBlock();
257257
}
258+
}
259+
260+
void AddResult(const TExprBase& result) {
261+
PrepareForResult();
258262

259263
auto& curBlock = QueryBlocks.back();
260264
curBlock.Results.push_back(result);
@@ -422,6 +426,10 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T
422426
const auto& tableData = tablesData->ExistingTable(cluster, table);
423427
YQL_ENSURE(tableData.Metadata);
424428

429+
if (!write.ReturningColumns().Empty()) {
430+
txRes.PrepareForResult();
431+
}
432+
425433
if (tableOp == TYdbOperation::UpdateOn) {
426434
auto inputColumnsSetting = GetSetting(write.Settings().Ref(), "input_columns");
427435
YQL_ENSURE(inputColumnsSetting);
@@ -445,7 +453,9 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T
445453
.Update(node)
446454
.Columns(write.ReturningColumns())
447455
.Build()
448-
.Settings().Build()
456+
.Settings()
457+
.Add().Name().Value("columns").Build().Value(write.ReturningColumns()).Build()
458+
.Build()
449459
.Done());
450460
}
451461

@@ -480,6 +490,11 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T
480490
for (const auto& item : updateStructType->GetItems()) {
481491
updateColumns.emplace(item->GetName());
482492
}
493+
494+
if (!update.ReturningColumns().Empty()) {
495+
txRes.PrepareForResult();
496+
}
497+
483498
txRes.AddUpdateOpToQueryBlock(node, tableData.Metadata, updateColumns);
484499
if (!update.ReturningColumns().Empty()) {
485500
txRes.AddResult(
@@ -491,7 +506,9 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T
491506
.Update(node)
492507
.Columns(update.ReturningColumns())
493508
.Build()
494-
.Settings().Build()
509+
.Settings()
510+
.Add().Name().Value("columns").Build().Value(update.ReturningColumns()).Build()
511+
.Build()
495512
.Done());
496513
}
497514

@@ -513,6 +530,10 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T
513530
YQL_ENSURE(tablesData);
514531
const auto& tableData = tablesData->ExistingTable(cluster, table);
515532
YQL_ENSURE(tableData.Metadata);
533+
if (!del.ReturningColumns().Empty()) {
534+
txRes.PrepareForResult();
535+
}
536+
516537
txRes.AddWriteOpToQueryBlock(node, tableData.Metadata, tableOp & KikimrReadOps());
517538
if (!del.ReturningColumns().Empty()) {
518539
txRes.AddResult(
@@ -524,7 +545,9 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T
524545
.Update(node)
525546
.Columns(del.ReturningColumns())
526547
.Build()
527-
.Settings().Build()
548+
.Settings()
549+
.Add().Name().Value("columns").Build().Value(del.ReturningColumns()).Build()
550+
.Build()
528551
.Done());
529552
}
530553

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

+49
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,55 @@ Y_UNIT_TEST(ReturningSerial) {
134134
}
135135
}
136136

137+
Y_UNIT_TEST(ReturningColumnsOrder) {
138+
auto kikimr = DefaultKikimrRunner();
139+
140+
auto client = kikimr.GetTableClient();
141+
auto session = client.CreateSession().GetValueSync().GetSession();
142+
auto db = kikimr.GetQueryClient();
143+
144+
const auto queryCreate = Q_(R"(
145+
CREATE TABLE test1 (id Int32, v Text, PRIMARY KEY(id));
146+
)");
147+
148+
auto resultCreate = session.ExecuteSchemeQuery(queryCreate).GetValueSync();
149+
UNIT_ASSERT_C(resultCreate.IsSuccess(), resultCreate.GetIssues().ToString());
150+
151+
{
152+
const auto query = Q_(R"(
153+
UPSERT INTO test1 (id, v) VALUES (1, '321') RETURNING id, v;
154+
REPLACE INTO test1 (id, v) VALUES (1, '111') RETURNING v, id;
155+
)");
156+
157+
auto result = session.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).GetValueSync();
158+
UNIT_ASSERT(result.IsSuccess());
159+
CompareYson(R"([[[1];["321"]]])", FormatResultSetYson(result.GetResultSet(0)));
160+
CompareYson(R"([[["111"];[1]]])", FormatResultSetYson(result.GetResultSet(1)));
161+
}
162+
163+
auto settings = NYdb::NQuery::TExecuteQuerySettings()
164+
.Syntax(NYdb::NQuery::ESyntax::YqlV1)
165+
.ConcurrentResultSets(false);
166+
{
167+
auto result = db.ExecuteQuery(R"(
168+
UPSERT INTO test1 (id, v) VALUES (1, '321') RETURNING id, v;
169+
REPLACE INTO test1 (id, v) VALUES (1, '111') RETURNING v, id;
170+
)", NYdb::NQuery::TTxControl::BeginTx().CommitTx(), settings).ExtractValueSync();
171+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
172+
CompareYson(R"([[[1];["321"]]])", FormatResultSetYson(result.GetResultSet(0)));
173+
CompareYson(R"([[["111"];[1]]])", FormatResultSetYson(result.GetResultSet(1)));
174+
}
175+
{
176+
auto it = db.StreamExecuteQuery(R"(
177+
UPSERT INTO test1 (id, v) VALUES (2, '321') RETURNING id, v;
178+
REPLACE INTO test1 (id, v) VALUES (2, '111') RETURNING v, id;
179+
)", NYdb::NQuery::TTxControl::BeginTx().CommitTx(), settings).ExtractValueSync();
180+
UNIT_ASSERT_VALUES_EQUAL_C(it.GetStatus(), EStatus::SUCCESS, it.GetIssues().ToString());
181+
Cerr << StreamResultToYson(it);
182+
}
183+
184+
}
185+
137186
Y_UNIT_TEST(ReturningTypes) {
138187
auto kikimr = DefaultKikimrRunner();
139188

0 commit comments

Comments
 (0)