Skip to content

Commit f16850f

Browse files
authored
Merge 9a2b355 into be211bb
2 parents be211bb + 9a2b355 commit f16850f

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

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

11051105
bool ExecutePhyTx(const TKqpPhyTxHolder::TConstPtr& tx, bool commit) {
11061106
if (tx) {
1107-
QueryState->PrepareStatementTransaction(tx->GetType());
11081107
switch (tx->GetType()) {
11091108
case NKqpProto::TKqpPhyTx::TYPE_SCHEME:
11101109
YQL_ENSURE(tx->StagesSize() == 0);
1111-
if (QueryState->HasTxControl() && QueryState->TxCtx->EffectiveIsolationLevel != NKikimrKqp::ISOLATION_LEVEL_UNDEFINED) {
1110+
if (QueryState->HasTxControl() && !QueryState->HasImplicitTx() && QueryState->TxCtx->EffectiveIsolationLevel != NKikimrKqp::ISOLATION_LEVEL_UNDEFINED) {
11121111
ReplyQueryError(Ydb::StatusIds::PRECONDITION_FAILED,
11131112
"Scheme operations cannot be executed inside transaction");
11141113
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
@@ -2315,6 +2315,10 @@ Y_UNIT_TEST_SUITE(KqpQueryService) {
23152315
ALTER TABLE TestDdlDml2 DROP COLUMN Value2;
23162316
UPSERT INTO TestDdlDml2 (Key, Value1) VALUES (2, "2");
23172317
SELECT * FROM TestDdlDml2;
2318+
CREATE TABLE TestDdlDml33 (
2319+
Key Uint64,
2320+
PRIMARY KEY (Key)
2321+
);
23182322
)", TTxControl::NoTx()).ExtractValueSync();
23192323
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
23202324
UNIT_ASSERT_VALUES_EQUAL(result.GetResultSets().size(), 2);
@@ -2329,6 +2333,13 @@ Y_UNIT_TEST_SUITE(KqpQueryService) {
23292333
UNIT_ASSERT_VALUES_EQUAL(result.GetResultSets().size(), 1);
23302334
CompareYson(R"([[[1u];["1"]];[[2u];["2"]]])", FormatResultSetYson(result.GetResultSet(0)));
23312335

2336+
result = db.ExecuteQuery(R"(
2337+
SELECT * FROM TestDdlDml33;
2338+
)", TTxControl::BeginTx().CommitTx()).ExtractValueSync();
2339+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
2340+
UNIT_ASSERT_VALUES_EQUAL(result.GetResultSets().size(), 1);
2341+
CompareYson(R"([])", FormatResultSetYson(result.GetResultSet(0)));
2342+
23322343
result = db.ExecuteQuery(R"(
23332344
CREATE TABLE TestDdlDml4 (
23342345
Key Uint64,
@@ -2623,6 +2634,177 @@ Y_UNIT_TEST_SUITE(KqpQueryService) {
26232634
}
26242635
}
26252636

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

0 commit comments

Comments
 (0)