Skip to content

Commit e5bd37c

Browse files
authored
fix multiple table updates in same tx (#2919)
1 parent fddafab commit e5bd37c

File tree

2 files changed

+53
-18
lines changed

2 files changed

+53
-18
lines changed

ydb/core/kqp/executer_actor/kqp_executer_impl.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,9 @@ IActor* CreateKqpExecuter(IKqpGateway::TExecPhysicalRequest&& request, const TSt
9696
for (auto& tx : request.Transactions) {
9797
if (txsType) {
9898
YQL_ENSURE(*txsType == tx.Body->GetType(), "Mixed physical tx types in executer.");
99-
YQL_ENSURE(*txsType == NKqpProto::TKqpPhyTx::TYPE_DATA, "Cannot execute multiple non-data physical txs.");
99+
YQL_ENSURE((*txsType == NKqpProto::TKqpPhyTx::TYPE_DATA)
100+
|| (*txsType == NKqpProto::TKqpPhyTx::TYPE_GENERIC),
101+
"Cannot execute multiple non-data physical txs.");
100102
} else {
101103
txsType = tx.Body->GetType();
102104
}

ydb/core/kqp/ut/service/kqp_qs_queries_ut.cpp

+50-17
Original file line numberDiff line numberDiff line change
@@ -242,27 +242,60 @@ Y_UNIT_TEST_SUITE(KqpQueryService) {
242242
UNIT_ASSERT_VALUES_EQUAL_C(sessionResult.GetStatus(), EStatus::SUCCESS, sessionResult.GetIssues().ToString());
243243
auto session = sessionResult.GetSession();
244244

245-
const TString query = "UPDATE TwoShard SET Value2 = 0";
246-
auto result = session.ExecuteQuery(query, TTxControl::BeginTx()).ExtractValueSync();
247-
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
248-
auto transaction = result.GetTransaction();
249-
UNIT_ASSERT(transaction->IsActive());
245+
{
246+
const TString query = "UPDATE TwoShard SET Value2 = 0";
247+
auto result = session.ExecuteQuery(query, TTxControl::BeginTx()).ExtractValueSync();
248+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
249+
auto transaction = result.GetTransaction();
250+
UNIT_ASSERT(transaction->IsActive());
250251

251-
auto checkResult = [&](TString expected) {
252-
auto selectRes = db.ExecuteQuery(
253-
"SELECT * FROM TwoShard ORDER BY Key",
254-
TTxControl::BeginTx().CommitTx()
255-
).ExtractValueSync();
252+
auto checkResult = [&](TString expected) {
253+
auto selectRes = db.ExecuteQuery(
254+
"SELECT * FROM TwoShard ORDER BY Key",
255+
TTxControl::BeginTx().CommitTx()
256+
).ExtractValueSync();
256257

257-
UNIT_ASSERT_C(selectRes.IsSuccess(), selectRes.GetIssues().ToString());
258-
CompareYson(expected, FormatResultSetYson(selectRes.GetResultSet(0)));
259-
};
260-
checkResult(R"([[[1u];["One"];[-1]];[[2u];["Two"];[0]];[[3u];["Three"];[1]];[[4000000001u];["BigOne"];[-1]];[[4000000002u];["BigTwo"];[0]];[[4000000003u];["BigThree"];[1]]])");
258+
UNIT_ASSERT_C(selectRes.IsSuccess(), selectRes.GetIssues().ToString());
259+
CompareYson(expected, FormatResultSetYson(selectRes.GetResultSet(0)));
260+
};
261+
checkResult(R"([[[1u];["One"];[-1]];[[2u];["Two"];[0]];[[3u];["Three"];[1]];[[4000000001u];["BigOne"];[-1]];[[4000000002u];["BigTwo"];[0]];[[4000000003u];["BigThree"];[1]]])");
261262

262-
auto txRes = transaction->Commit().GetValueSync();
263-
UNIT_ASSERT_VALUES_EQUAL_C(txRes.GetStatus(), EStatus::SUCCESS, txRes.GetIssues().ToString());
263+
auto txRes = transaction->Commit().GetValueSync();
264+
UNIT_ASSERT_VALUES_EQUAL_C(txRes.GetStatus(), EStatus::SUCCESS, txRes.GetIssues().ToString());
264265

265-
checkResult(R"([[[1u];["One"];[0]];[[2u];["Two"];[0]];[[3u];["Three"];[0]];[[4000000001u];["BigOne"];[0]];[[4000000002u];["BigTwo"];[0]];[[4000000003u];["BigThree"];[0]]])");
266+
checkResult(R"([[[1u];["One"];[0]];[[2u];["Two"];[0]];[[3u];["Three"];[0]];[[4000000001u];["BigOne"];[0]];[[4000000002u];["BigTwo"];[0]];[[4000000003u];["BigThree"];[0]]])");
267+
}
268+
269+
{
270+
const TString query = "UPDATE TwoShard SET Value2 = 1";
271+
auto result = session.ExecuteQuery(query, TTxControl::BeginTx()).ExtractValueSync();
272+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
273+
auto transaction = result.GetTransaction();
274+
UNIT_ASSERT(transaction->IsActive());
275+
276+
const TString query2 = "UPDATE KeyValue SET Value = 'Vic'";
277+
auto result2 = session.ExecuteQuery(query2, TTxControl::Tx(transaction->GetId())).ExtractValueSync();
278+
UNIT_ASSERT_VALUES_EQUAL_C(result2.GetStatus(), EStatus::SUCCESS, result2.GetIssues().ToString());
279+
auto transaction2 = result2.GetTransaction();
280+
UNIT_ASSERT(transaction2->IsActive());
281+
282+
auto checkResult = [&](TString table, TString expected) {
283+
auto selectRes = db.ExecuteQuery(
284+
Sprintf("SELECT * FROM %s ORDER BY Key", table.data()),
285+
TTxControl::BeginTx().CommitTx()
286+
).ExtractValueSync();
287+
288+
UNIT_ASSERT_C(selectRes.IsSuccess(), selectRes.GetIssues().ToString());
289+
CompareYson(expected, FormatResultSetYson(selectRes.GetResultSet(0)));
290+
};
291+
checkResult("TwoShard", R"([[[1u];["One"];[0]];[[2u];["Two"];[0]];[[3u];["Three"];[0]];[[4000000001u];["BigOne"];[0]];[[4000000002u];["BigTwo"];[0]];[[4000000003u];["BigThree"];[0]]])");
292+
checkResult("KeyValue", R"([[[1u];["One"]];[[2u];["Two"]]])");
293+
auto txRes = transaction->Commit().GetValueSync();
294+
UNIT_ASSERT_VALUES_EQUAL_C(txRes.GetStatus(), EStatus::SUCCESS, txRes.GetIssues().ToString());
295+
296+
checkResult("KeyValue", R"([[[1u];["Vic"]];[[2u];["Vic"]]])");
297+
checkResult("TwoShard", R"([[[1u];["One"];[1]];[[2u];["Two"];[1]];[[3u];["Three"];[1]];[[4000000001u];["BigOne"];[1]];[[4000000002u];["BigTwo"];[1]];[[4000000003u];["BigThree"];[1]]])");
298+
}
266299
}
267300

268301
Y_UNIT_TEST(ExecuteQueryInteractiveTxCommitWithQuery) {

0 commit comments

Comments
 (0)