diff --git a/ydb/core/kqp/provider/yql_kikimr_opt_build.cpp b/ydb/core/kqp/provider/yql_kikimr_opt_build.cpp index 18b130de58d5..e3a814289926 100644 --- a/ydb/core/kqp/provider/yql_kikimr_opt_build.cpp +++ b/ydb/core/kqp/provider/yql_kikimr_opt_build.cpp @@ -445,7 +445,9 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T .Update(node) .Columns(write.ReturningColumns()) .Build() - .Settings().Build() + .Settings() + .Add().Name().Value("columns").Build().Value(write.ReturningColumns()).Build() + .Build() .Done()); } @@ -491,7 +493,9 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T .Update(node) .Columns(update.ReturningColumns()) .Build() - .Settings().Build() + .Settings() + .Add().Name().Value("columns").Build().Value(update.ReturningColumns()).Build() + .Build() .Done()); } @@ -524,7 +528,9 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T .Update(node) .Columns(del.ReturningColumns()) .Build() - .Settings().Build() + .Settings() + .Add().Name().Value("columns").Build().Value(del.ReturningColumns()).Build() + .Build() .Done()); } diff --git a/ydb/core/kqp/ut/opt/kqp_returning_ut.cpp b/ydb/core/kqp/ut/opt/kqp_returning_ut.cpp index 7035b4d6927b..837d81d654de 100644 --- a/ydb/core/kqp/ut/opt/kqp_returning_ut.cpp +++ b/ydb/core/kqp/ut/opt/kqp_returning_ut.cpp @@ -134,6 +134,46 @@ Y_UNIT_TEST(ReturningSerial) { } } +Y_UNIT_TEST(ReturningColumnsOrder) { + auto kikimr = DefaultKikimrRunner(); + + auto client = kikimr.GetTableClient(); + auto session = client.CreateSession().GetValueSync().GetSession(); + auto db = kikimr.GetQueryClient(); + + const auto queryCreate = Q_(R"( + CREATE TABLE test1 (id Int32, v Text, PRIMARY KEY(id)); + )"); + + auto resultCreate = session.ExecuteSchemeQuery(queryCreate).GetValueSync(); + UNIT_ASSERT_C(resultCreate.IsSuccess(), resultCreate.GetIssues().ToString()); + + { + const auto query = Q_(R"( + UPSERT INTO test1 (id, v) VALUES (1, '321') RETURNING id, v; + REPLACE INTO test1 (id, v) VALUES (1, '111') RETURNING v, id; + )"); + + auto result = session.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).GetValueSync(); + UNIT_ASSERT(result.IsSuccess()); + CompareYson(R"([[[1];["321"]]])", FormatResultSetYson(result.GetResultSet(0))); + CompareYson(R"([[["111"];[1]]])", FormatResultSetYson(result.GetResultSet(1))); + } + + auto settings = NYdb::NQuery::TExecuteQuerySettings() + .Syntax(NYdb::NQuery::ESyntax::YqlV1); + { + auto result = db.ExecuteQuery(R"( + UPSERT INTO test1 (id, v) VALUES (1, '321') RETURNING id, v; + REPLACE INTO test1 (id, v) VALUES (1, '111') RETURNING v, id; + )", NYdb::NQuery::TTxControl::BeginTx().CommitTx(), settings).ExtractValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); + CompareYson(R"([[[1];["321"]]])", FormatResultSetYson(result.GetResultSet(0))); + CompareYson(R"([[["111"];[1]]])", FormatResultSetYson(result.GetResultSet(1))); + } + +} + Y_UNIT_TEST(ReturningTypes) { auto kikimr = DefaultKikimrRunner();