Skip to content

Commit be6f744

Browse files
ssmikeVPolka
authored andcommitted
fix wrong isolation level (#6568) (#9673)
Co-authored-by: VPolka <[email protected]>
1 parent 01dd64e commit be6f744

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
@@ -494,18 +494,6 @@ class TKqpQueryState : public TNonCopyable {
494494
PrepareCurrentStatement();
495495
}
496496

497-
void PrepareStatementTransaction(NKqpProto::TKqpPhyTx_EType txType) {
498-
if (!HasTxControl()) {
499-
switch (txType) {
500-
case NKqpProto::TKqpPhyTx::TYPE_SCHEME:
501-
TxCtx->EffectiveIsolationLevel = NKikimrKqp::ISOLATION_LEVEL_UNDEFINED;
502-
break;
503-
default:
504-
TxCtx->EffectiveIsolationLevel = NKikimrKqp::ISOLATION_LEVEL_SERIALIZABLE;
505-
}
506-
}
507-
}
508-
509497
// validate the compiled query response and ensure that all table versions are not
510498
// changed since the last compilation.
511499
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
@@ -1113,11 +1113,10 @@ class TKqpSessionActor : public TActorBootstrapped<TKqpSessionActor> {
11131113

11141114
bool ExecutePhyTx(const TKqpPhyTxHolder::TConstPtr& tx, bool commit) {
11151115
if (tx) {
1116-
QueryState->PrepareStatementTransaction(tx->GetType());
11171116
switch (tx->GetType()) {
11181117
case NKqpProto::TKqpPhyTx::TYPE_SCHEME:
11191118
YQL_ENSURE(tx->StagesSize() == 0);
1120-
if (QueryState->HasTxControl() && QueryState->TxCtx->EffectiveIsolationLevel != NKikimrKqp::ISOLATION_LEVEL_UNDEFINED) {
1119+
if (QueryState->HasTxControl() && !QueryState->HasImplicitTx() && QueryState->TxCtx->EffectiveIsolationLevel != NKikimrKqp::ISOLATION_LEVEL_UNDEFINED) {
11211120
ReplyQueryError(Ydb::StatusIds::PRECONDITION_FAILED,
11221121
"Scheme operations cannot be executed inside transaction");
11231122
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
@@ -2356,6 +2356,10 @@ Y_UNIT_TEST_SUITE(KqpQueryService) {
23562356
ALTER TABLE TestDdlDml2 DROP COLUMN Value2;
23572357
UPSERT INTO TestDdlDml2 (Key, Value1) VALUES (2, "2");
23582358
SELECT * FROM TestDdlDml2;
2359+
CREATE TABLE TestDdlDml33 (
2360+
Key Uint64,
2361+
PRIMARY KEY (Key)
2362+
);
23592363
)", TTxControl::NoTx()).ExtractValueSync();
23602364
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
23612365
UNIT_ASSERT_VALUES_EQUAL(result.GetResultSets().size(), 2);
@@ -2370,6 +2374,13 @@ Y_UNIT_TEST_SUITE(KqpQueryService) {
23702374
UNIT_ASSERT_VALUES_EQUAL(result.GetResultSets().size(), 1);
23712375
CompareYson(R"([[[1u];["1"]];[[2u];["2"]]])", FormatResultSetYson(result.GetResultSet(0)));
23722376

2377+
result = db.ExecuteQuery(R"(
2378+
SELECT * FROM TestDdlDml33;
2379+
)", TTxControl::BeginTx().CommitTx()).ExtractValueSync();
2380+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
2381+
UNIT_ASSERT_VALUES_EQUAL(result.GetResultSets().size(), 1);
2382+
CompareYson(R"([])", FormatResultSetYson(result.GetResultSet(0)));
2383+
23732384
result = db.ExecuteQuery(R"(
23742385
CREATE TABLE TestDdlDml4 (
23752386
Key Uint64,
@@ -2745,6 +2756,177 @@ Y_UNIT_TEST_SUITE(KqpQueryService) {
27452756
}
27462757
}
27472758

2759+
Y_UNIT_TEST(CheckIsolationLevelFroPerStatementMode) {
2760+
NKikimrConfig::TAppConfig appConfig;
2761+
appConfig.MutableTableServiceConfig()->SetEnablePreparedDdl(true);
2762+
appConfig.MutableTableServiceConfig()->SetEnableAstCache(true);
2763+
appConfig.MutableTableServiceConfig()->SetEnablePerStatementQueryExecution(true);
2764+
auto setting = NKikimrKqp::TKqpSetting();
2765+
auto serverSettings = TKikimrSettings()
2766+
.SetAppConfig(appConfig)
2767+
.SetKqpSettings({setting});
2768+
2769+
TKikimrRunner kikimr(serverSettings);
2770+
auto db = kikimr.GetQueryClient();
2771+
auto tableClient = kikimr.GetTableClient();
2772+
auto session = tableClient.CreateSession().GetValueSync().GetSession();
2773+
2774+
{
2775+
// 1 ddl statement
2776+
auto result = db.ExecuteQuery(R"(
2777+
CREATE TABLE Test1 (
2778+
Key Uint64,
2779+
Value1 String,
2780+
Value2 String,
2781+
PRIMARY KEY (Key)
2782+
);
2783+
)", TTxControl::NoTx()).ExtractValueSync();
2784+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
2785+
UNIT_ASSERT_VALUES_EQUAL(result.GetResultSets().size(), 0);
2786+
UNIT_ASSERT_EQUAL_C(result.GetIssues().Size(), 0, result.GetIssues().ToString());
2787+
2788+
NYdb::NTable::TDescribeTableResult describe = session.DescribeTable("/Root/Test1").GetValueSync();
2789+
UNIT_ASSERT_EQUAL(describe.GetStatus(), EStatus::SUCCESS);
2790+
}
2791+
2792+
{
2793+
// 2 ddl statements
2794+
auto result = db.ExecuteQuery(R"(
2795+
CREATE TABLE Test2 (
2796+
Key Uint64,
2797+
Value1 String,
2798+
Value2 String,
2799+
PRIMARY KEY (Key)
2800+
);
2801+
CREATE TABLE Test3 (
2802+
Key Uint64,
2803+
Value1 String,
2804+
Value2 String,
2805+
PRIMARY KEY (Key)
2806+
);
2807+
)", TTxControl::NoTx()).ExtractValueSync();
2808+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
2809+
UNIT_ASSERT_VALUES_EQUAL(result.GetResultSets().size(), 0);
2810+
UNIT_ASSERT_EQUAL_C(result.GetIssues().Size(), 0, result.GetIssues().ToString());
2811+
2812+
NYdb::NTable::TDescribeTableResult describe1 = session.DescribeTable("/Root/Test2").GetValueSync();
2813+
UNIT_ASSERT_EQUAL(describe1.GetStatus(), EStatus::SUCCESS);
2814+
NYdb::NTable::TDescribeTableResult describe2 = session.DescribeTable("/Root/Test3").GetValueSync();
2815+
UNIT_ASSERT_EQUAL(describe2.GetStatus(), EStatus::SUCCESS);
2816+
}
2817+
2818+
{
2819+
// 1 dml statement
2820+
auto result = db.ExecuteQuery(R"(
2821+
SELECT * FROM Test1;
2822+
)", TTxControl::NoTx()).ExtractValueSync();
2823+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
2824+
UNIT_ASSERT_VALUES_EQUAL(result.GetResultSets().size(), 1);
2825+
UNIT_ASSERT_EQUAL_C(result.GetIssues().Size(), 0, result.GetIssues().ToString());
2826+
}
2827+
2828+
{
2829+
// 2 dml statements
2830+
auto result = db.ExecuteQuery(R"(
2831+
SELECT * FROM Test2;
2832+
SELECT * FROM Test3;
2833+
)", TTxControl::NoTx()).ExtractValueSync();
2834+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
2835+
UNIT_ASSERT_VALUES_EQUAL(result.GetResultSets().size(), 2);
2836+
UNIT_ASSERT_EQUAL_C(result.GetIssues().Size(), 0, result.GetIssues().ToString());
2837+
}
2838+
2839+
{
2840+
// 1 ddl 1 dml statements
2841+
auto result = db.ExecuteQuery(R"(
2842+
CREATE TABLE Test4 (
2843+
Key Uint64,
2844+
Value1 String,
2845+
Value2 String,
2846+
PRIMARY KEY (Key)
2847+
);
2848+
SELECT * FROM Test4;
2849+
)", TTxControl::NoTx()).ExtractValueSync();
2850+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
2851+
UNIT_ASSERT_VALUES_EQUAL(result.GetResultSets().size(), 1);
2852+
UNIT_ASSERT_EQUAL_C(result.GetIssues().Size(), 0, result.GetIssues().ToString());
2853+
NYdb::NTable::TDescribeTableResult describe = session.DescribeTable("/Root/Test4").GetValueSync();
2854+
UNIT_ASSERT_EQUAL(describe.GetStatus(), EStatus::SUCCESS);
2855+
}
2856+
2857+
{
2858+
// 1 dml 1 ddl statements
2859+
auto result = db.ExecuteQuery(R"(
2860+
SELECT * FROM Test4;
2861+
CREATE TABLE Test5 (
2862+
Key Uint64,
2863+
Value1 String,
2864+
Value2 String,
2865+
PRIMARY KEY (Key)
2866+
);
2867+
)", TTxControl::NoTx()).ExtractValueSync();
2868+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
2869+
UNIT_ASSERT_VALUES_EQUAL(result.GetResultSets().size(), 1);
2870+
UNIT_ASSERT_EQUAL_C(result.GetIssues().Size(), 0, result.GetIssues().ToString());
2871+
NYdb::NTable::TDescribeTableResult describe = session.DescribeTable("/Root/Test5").GetValueSync();
2872+
UNIT_ASSERT_EQUAL(describe.GetStatus(), EStatus::SUCCESS);
2873+
}
2874+
2875+
{
2876+
// 1 ddl 1 dml 1 ddl 1 dml statements
2877+
auto result = db.ExecuteQuery(R"(
2878+
CREATE TABLE Test6 (
2879+
Key Uint64,
2880+
Value1 String,
2881+
Value2 String,
2882+
PRIMARY KEY (Key)
2883+
);
2884+
SELECT * FROM Test6;
2885+
CREATE TABLE Test7 (
2886+
Key Uint64,
2887+
Value1 String,
2888+
Value2 String,
2889+
PRIMARY KEY (Key)
2890+
);
2891+
SELECT * FROM Test7;
2892+
)", TTxControl::NoTx()).ExtractValueSync();
2893+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
2894+
UNIT_ASSERT_VALUES_EQUAL(result.GetResultSets().size(), 2);
2895+
UNIT_ASSERT_EQUAL_C(result.GetIssues().Size(), 0, result.GetIssues().ToString());
2896+
NYdb::NTable::TDescribeTableResult describe1 = session.DescribeTable("/Root/Test6").GetValueSync();
2897+
UNIT_ASSERT_EQUAL(describe1.GetStatus(), EStatus::SUCCESS);
2898+
NYdb::NTable::TDescribeTableResult describe2 = session.DescribeTable("/Root/Test7").GetValueSync();
2899+
UNIT_ASSERT_EQUAL(describe2.GetStatus(), EStatus::SUCCESS);
2900+
}
2901+
2902+
{
2903+
// 1 dml 1 ddl 1 dml 1 ddl statements
2904+
auto result = db.ExecuteQuery(R"(
2905+
SELECT * FROM Test7;
2906+
CREATE TABLE Test8 (
2907+
Key Uint64,
2908+
Value1 String,
2909+
Value2 String,
2910+
PRIMARY KEY (Key)
2911+
);
2912+
SELECT * FROM Test8;
2913+
CREATE TABLE Test9 (
2914+
Key Uint64,
2915+
Value1 String,
2916+
Value2 String,
2917+
PRIMARY KEY (Key)
2918+
);
2919+
)", TTxControl::NoTx()).ExtractValueSync();
2920+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
2921+
UNIT_ASSERT_VALUES_EQUAL(result.GetResultSets().size(), 2);
2922+
UNIT_ASSERT_EQUAL_C(result.GetIssues().Size(), 0, result.GetIssues().ToString());
2923+
NYdb::NTable::TDescribeTableResult describe1 = session.DescribeTable("/Root/Test8").GetValueSync();
2924+
UNIT_ASSERT_EQUAL(describe1.GetStatus(), EStatus::SUCCESS);
2925+
NYdb::NTable::TDescribeTableResult describe2 = session.DescribeTable("/Root/Test9").GetValueSync();
2926+
UNIT_ASSERT_EQUAL(describe2.GetStatus(), EStatus::SUCCESS);
2927+
}
2928+
}
2929+
27482930
Y_UNIT_TEST(TableSink_ReplaceFromSelectOlap) {
27492931
NKikimrConfig::TAppConfig appConfig;
27502932
appConfig.MutableTableServiceConfig()->SetEnableOlapSink(true);

0 commit comments

Comments
 (0)