Skip to content

Commit eab45d1

Browse files
authored
fix wrong isolation level (#6568)
1 parent 4381e8c commit eab45d1

File tree

3 files changed

+183
-14
lines changed

3 files changed

+183
-14
lines changed

ydb/core/kqp/session_actor/kqp_query_state.h

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -487,18 +487,6 @@ class TKqpQueryState : public TNonCopyable {
487487
PrepareCurrentStatement();
488488
}
489489

490-
void PrepareStatementTransaction(NKqpProto::TKqpPhyTx_EType txType) {
491-
if (!HasTxControl()) {
492-
switch (txType) {
493-
case NKqpProto::TKqpPhyTx::TYPE_SCHEME:
494-
TxCtx->EffectiveIsolationLevel = NKikimrKqp::ISOLATION_LEVEL_UNDEFINED;
495-
break;
496-
default:
497-
TxCtx->EffectiveIsolationLevel = NKikimrKqp::ISOLATION_LEVEL_SERIALIZABLE;
498-
}
499-
}
500-
}
501-
502490
// validate the compiled query response and ensure that all table versions are not
503491
// changed since the last compilation.
504492
bool EnsureTableVersions(const TEvTxProxySchemeCache::TEvNavigateKeySetResult& response);

ydb/core/kqp/session_actor/kqp_session_actor.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1097,11 +1097,10 @@ class TKqpSessionActor : public TActorBootstrapped<TKqpSessionActor> {
10971097

10981098
bool ExecutePhyTx(const TKqpPhyTxHolder::TConstPtr& tx, bool commit) {
10991099
if (tx) {
1100-
QueryState->PrepareStatementTransaction(tx->GetType());
11011100
switch (tx->GetType()) {
11021101
case NKqpProto::TKqpPhyTx::TYPE_SCHEME:
11031102
YQL_ENSURE(tx->StagesSize() == 0);
1104-
if (QueryState->HasTxControl() && QueryState->TxCtx->EffectiveIsolationLevel != NKikimrKqp::ISOLATION_LEVEL_UNDEFINED) {
1103+
if (QueryState->HasTxControl() && !QueryState->HasImplicitTx() && QueryState->TxCtx->EffectiveIsolationLevel != NKikimrKqp::ISOLATION_LEVEL_UNDEFINED) {
11051104
ReplyQueryError(Ydb::StatusIds::PRECONDITION_FAILED,
11061105
"Scheme operations cannot be executed inside transaction");
11071106
return true;

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

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2313,6 +2313,10 @@ Y_UNIT_TEST_SUITE(KqpQueryService) {
23132313
ALTER TABLE TestDdlDml2 DROP COLUMN Value2;
23142314
UPSERT INTO TestDdlDml2 (Key, Value1) VALUES (2, "2");
23152315
SELECT * FROM TestDdlDml2;
2316+
CREATE TABLE TestDdlDml33 (
2317+
Key Uint64,
2318+
PRIMARY KEY (Key)
2319+
);
23162320
)", TTxControl::NoTx()).ExtractValueSync();
23172321
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
23182322
UNIT_ASSERT_VALUES_EQUAL(result.GetResultSets().size(), 2);
@@ -2327,6 +2331,13 @@ Y_UNIT_TEST_SUITE(KqpQueryService) {
23272331
UNIT_ASSERT_VALUES_EQUAL(result.GetResultSets().size(), 1);
23282332
CompareYson(R"([[[1u];["1"]];[[2u];["2"]]])", FormatResultSetYson(result.GetResultSet(0)));
23292333

2334+
result = db.ExecuteQuery(R"(
2335+
SELECT * FROM TestDdlDml33;
2336+
)", TTxControl::BeginTx().CommitTx()).ExtractValueSync();
2337+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
2338+
UNIT_ASSERT_VALUES_EQUAL(result.GetResultSets().size(), 1);
2339+
CompareYson(R"([])", FormatResultSetYson(result.GetResultSet(0)));
2340+
23302341
result = db.ExecuteQuery(R"(
23312342
CREATE TABLE TestDdlDml4 (
23322343
Key Uint64,
@@ -2621,6 +2632,177 @@ Y_UNIT_TEST_SUITE(KqpQueryService) {
26212632
}
26222633
}
26232634

2635+
Y_UNIT_TEST(CheckIsolationLevelFroPerStatementMode) {
2636+
NKikimrConfig::TAppConfig appConfig;
2637+
appConfig.MutableTableServiceConfig()->SetEnablePreparedDdl(true);
2638+
appConfig.MutableTableServiceConfig()->SetEnableAstCache(true);
2639+
appConfig.MutableTableServiceConfig()->SetEnablePerStatementQueryExecution(true);
2640+
auto setting = NKikimrKqp::TKqpSetting();
2641+
auto serverSettings = TKikimrSettings()
2642+
.SetAppConfig(appConfig)
2643+
.SetKqpSettings({setting});
2644+
2645+
TKikimrRunner kikimr(serverSettings);
2646+
auto db = kikimr.GetQueryClient();
2647+
auto tableClient = kikimr.GetTableClient();
2648+
auto session = tableClient.CreateSession().GetValueSync().GetSession();
2649+
2650+
{
2651+
// 1 ddl statement
2652+
auto result = db.ExecuteQuery(R"(
2653+
CREATE TABLE Test1 (
2654+
Key Uint64,
2655+
Value1 String,
2656+
Value2 String,
2657+
PRIMARY KEY (Key)
2658+
);
2659+
)", TTxControl::NoTx()).ExtractValueSync();
2660+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
2661+
UNIT_ASSERT_VALUES_EQUAL(result.GetResultSets().size(), 0);
2662+
UNIT_ASSERT_EQUAL_C(result.GetIssues().Size(), 0, result.GetIssues().ToString());
2663+
2664+
NYdb::NTable::TDescribeTableResult describe = session.DescribeTable("/Root/Test1").GetValueSync();
2665+
UNIT_ASSERT_EQUAL(describe.GetStatus(), EStatus::SUCCESS);
2666+
}
2667+
2668+
{
2669+
// 2 ddl statements
2670+
auto result = db.ExecuteQuery(R"(
2671+
CREATE TABLE Test2 (
2672+
Key Uint64,
2673+
Value1 String,
2674+
Value2 String,
2675+
PRIMARY KEY (Key)
2676+
);
2677+
CREATE TABLE Test3 (
2678+
Key Uint64,
2679+
Value1 String,
2680+
Value2 String,
2681+
PRIMARY KEY (Key)
2682+
);
2683+
)", TTxControl::NoTx()).ExtractValueSync();
2684+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
2685+
UNIT_ASSERT_VALUES_EQUAL(result.GetResultSets().size(), 0);
2686+
UNIT_ASSERT_EQUAL_C(result.GetIssues().Size(), 0, result.GetIssues().ToString());
2687+
2688+
NYdb::NTable::TDescribeTableResult describe1 = session.DescribeTable("/Root/Test2").GetValueSync();
2689+
UNIT_ASSERT_EQUAL(describe1.GetStatus(), EStatus::SUCCESS);
2690+
NYdb::NTable::TDescribeTableResult describe2 = session.DescribeTable("/Root/Test3").GetValueSync();
2691+
UNIT_ASSERT_EQUAL(describe2.GetStatus(), EStatus::SUCCESS);
2692+
}
2693+
2694+
{
2695+
// 1 dml statement
2696+
auto result = db.ExecuteQuery(R"(
2697+
SELECT * FROM Test1;
2698+
)", TTxControl::NoTx()).ExtractValueSync();
2699+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
2700+
UNIT_ASSERT_VALUES_EQUAL(result.GetResultSets().size(), 1);
2701+
UNIT_ASSERT_EQUAL_C(result.GetIssues().Size(), 0, result.GetIssues().ToString());
2702+
}
2703+
2704+
{
2705+
// 2 dml statements
2706+
auto result = db.ExecuteQuery(R"(
2707+
SELECT * FROM Test2;
2708+
SELECT * FROM Test3;
2709+
)", TTxControl::NoTx()).ExtractValueSync();
2710+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
2711+
UNIT_ASSERT_VALUES_EQUAL(result.GetResultSets().size(), 2);
2712+
UNIT_ASSERT_EQUAL_C(result.GetIssues().Size(), 0, result.GetIssues().ToString());
2713+
}
2714+
2715+
{
2716+
// 1 ddl 1 dml statements
2717+
auto result = db.ExecuteQuery(R"(
2718+
CREATE TABLE Test4 (
2719+
Key Uint64,
2720+
Value1 String,
2721+
Value2 String,
2722+
PRIMARY KEY (Key)
2723+
);
2724+
SELECT * FROM Test4;
2725+
)", TTxControl::NoTx()).ExtractValueSync();
2726+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
2727+
UNIT_ASSERT_VALUES_EQUAL(result.GetResultSets().size(), 1);
2728+
UNIT_ASSERT_EQUAL_C(result.GetIssues().Size(), 0, result.GetIssues().ToString());
2729+
NYdb::NTable::TDescribeTableResult describe = session.DescribeTable("/Root/Test4").GetValueSync();
2730+
UNIT_ASSERT_EQUAL(describe.GetStatus(), EStatus::SUCCESS);
2731+
}
2732+
2733+
{
2734+
// 1 dml 1 ddl statements
2735+
auto result = db.ExecuteQuery(R"(
2736+
SELECT * FROM Test4;
2737+
CREATE TABLE Test5 (
2738+
Key Uint64,
2739+
Value1 String,
2740+
Value2 String,
2741+
PRIMARY KEY (Key)
2742+
);
2743+
)", TTxControl::NoTx()).ExtractValueSync();
2744+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
2745+
UNIT_ASSERT_VALUES_EQUAL(result.GetResultSets().size(), 1);
2746+
UNIT_ASSERT_EQUAL_C(result.GetIssues().Size(), 0, result.GetIssues().ToString());
2747+
NYdb::NTable::TDescribeTableResult describe = session.DescribeTable("/Root/Test5").GetValueSync();
2748+
UNIT_ASSERT_EQUAL(describe.GetStatus(), EStatus::SUCCESS);
2749+
}
2750+
2751+
{
2752+
// 1 ddl 1 dml 1 ddl 1 dml statements
2753+
auto result = db.ExecuteQuery(R"(
2754+
CREATE TABLE Test6 (
2755+
Key Uint64,
2756+
Value1 String,
2757+
Value2 String,
2758+
PRIMARY KEY (Key)
2759+
);
2760+
SELECT * FROM Test6;
2761+
CREATE TABLE Test7 (
2762+
Key Uint64,
2763+
Value1 String,
2764+
Value2 String,
2765+
PRIMARY KEY (Key)
2766+
);
2767+
SELECT * FROM Test7;
2768+
)", TTxControl::NoTx()).ExtractValueSync();
2769+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
2770+
UNIT_ASSERT_VALUES_EQUAL(result.GetResultSets().size(), 2);
2771+
UNIT_ASSERT_EQUAL_C(result.GetIssues().Size(), 0, result.GetIssues().ToString());
2772+
NYdb::NTable::TDescribeTableResult describe1 = session.DescribeTable("/Root/Test6").GetValueSync();
2773+
UNIT_ASSERT_EQUAL(describe1.GetStatus(), EStatus::SUCCESS);
2774+
NYdb::NTable::TDescribeTableResult describe2 = session.DescribeTable("/Root/Test7").GetValueSync();
2775+
UNIT_ASSERT_EQUAL(describe2.GetStatus(), EStatus::SUCCESS);
2776+
}
2777+
2778+
{
2779+
// 1 dml 1 ddl 1 dml 1 ddl statements
2780+
auto result = db.ExecuteQuery(R"(
2781+
SELECT * FROM Test7;
2782+
CREATE TABLE Test8 (
2783+
Key Uint64,
2784+
Value1 String,
2785+
Value2 String,
2786+
PRIMARY KEY (Key)
2787+
);
2788+
SELECT * FROM Test8;
2789+
CREATE TABLE Test9 (
2790+
Key Uint64,
2791+
Value1 String,
2792+
Value2 String,
2793+
PRIMARY KEY (Key)
2794+
);
2795+
)", TTxControl::NoTx()).ExtractValueSync();
2796+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
2797+
UNIT_ASSERT_VALUES_EQUAL(result.GetResultSets().size(), 2);
2798+
UNIT_ASSERT_EQUAL_C(result.GetIssues().Size(), 0, result.GetIssues().ToString());
2799+
NYdb::NTable::TDescribeTableResult describe1 = session.DescribeTable("/Root/Test8").GetValueSync();
2800+
UNIT_ASSERT_EQUAL(describe1.GetStatus(), EStatus::SUCCESS);
2801+
NYdb::NTable::TDescribeTableResult describe2 = session.DescribeTable("/Root/Test9").GetValueSync();
2802+
UNIT_ASSERT_EQUAL(describe2.GetStatus(), EStatus::SUCCESS);
2803+
}
2804+
}
2805+
26242806
Y_UNIT_TEST(TableSink_ReplaceFromSelectOlap) {
26252807
NKikimrConfig::TAppConfig appConfig;
26262808
appConfig.MutableTableServiceConfig()->SetEnableOlapSink(true);

0 commit comments

Comments
 (0)