Skip to content

Commit eb0f600

Browse files
committed
Explicitely restict TCL statements in QueryService. (KIKIMR-16294)
1 parent 5d59f2c commit eb0f600

File tree

3 files changed

+50
-3
lines changed

3 files changed

+50
-3
lines changed

ydb/core/kqp/provider/yql_kikimr_type_ann.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1655,6 +1655,7 @@ virtual TStatus HandleCreateTable(TKiCreateTable create, TExprContext& ctx) over
16551655
auto settings = NCommon::ParseCommitSettings(node, ctx);
16561656

16571657
bool isFlushCommit = false;
1658+
bool isRollback = false;
16581659
if (settings.Mode) {
16591660
auto mode = settings.Mode.Cast().Value();
16601661

@@ -1665,6 +1666,7 @@ virtual TStatus HandleCreateTable(TKiCreateTable create, TExprContext& ctx) over
16651666
}
16661667

16671668
isFlushCommit = (mode == KikimrCommitModeFlush());
1669+
isRollback = (mode == KikimrCommitModeRollback());
16681670
}
16691671

16701672
if (!settings.EnsureEpochEmpty(ctx)) {
@@ -1682,8 +1684,9 @@ virtual TStatus HandleCreateTable(TKiCreateTable create, TExprContext& ctx) over
16821684

16831685
default:
16841686
if (!isFlushCommit) {
1687+
auto opName = isRollback ? "ROLLBACK" : "COMMIT";
16851688
ctx.AddError(YqlIssue(ctx.GetPosition(node.Pos()), TIssuesIds::KIKIMR_BAD_OPERATION, TStringBuilder()
1686-
<< "COMMIT not supported inside Kikimr query"));
1689+
<< opName << " not supported inside YDB query"));
16871690

16881691
return TStatus::Error;
16891692
}

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1356,6 +1356,25 @@ Y_UNIT_TEST_SUITE(KqpQueryService) {
13561356
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::PRECONDITION_FAILED, result.GetIssues().ToString());
13571357
}
13581358

1359+
Y_UNIT_TEST(Tcl) {
1360+
auto kikimr = DefaultKikimrRunner();
1361+
auto db = kikimr.GetQueryClient();
1362+
1363+
auto result = db.ExecuteQuery(R"(
1364+
SELECT 1;
1365+
COMMIT;
1366+
)", TTxControl::NoTx()).ExtractValueSync();
1367+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::GENERIC_ERROR, result.GetIssues().ToString());
1368+
UNIT_ASSERT(HasIssue(result.GetIssues(), NYql::TIssuesIds::KIKIMR_BAD_OPERATION));
1369+
1370+
result = db.ExecuteQuery(R"(
1371+
SELECT 1;
1372+
ROLLBACK;
1373+
)", TTxControl::NoTx()).ExtractValueSync();
1374+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::GENERIC_ERROR, result.GetIssues().ToString());
1375+
UNIT_ASSERT(HasIssue(result.GetIssues(), NYql::TIssuesIds::KIKIMR_BAD_OPERATION));
1376+
}
1377+
13591378
Y_UNIT_TEST(MaterializeTxResults) {
13601379
auto kikimr = DefaultKikimrRunner();
13611380
auto db = kikimr.GetQueryClient();

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

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -690,14 +690,14 @@ Y_UNIT_TEST_SUITE(KqpQueryServiceScripts) {
690690

691691
TFetchScriptResultsResult results = db.FetchScriptResults(scriptExecutionOperation.Id(), 0).ExtractValueSync();
692692
UNIT_ASSERT_C(results.IsSuccess(), results.GetIssues().ToString());
693-
693+
694694
UNIT_ASSERT(results.GetResultSet().Truncated());
695695
}
696696

697697
Y_UNIT_TEST(TestFetchMoreThanLimit) {
698698
constexpr size_t NUMER_BATCHES = 5;
699699
constexpr size_t ROWS_LIMIT = 20;
700-
700+
701701
NKikimrConfig::TAppConfig appCfg;
702702
appCfg.MutableTableServiceConfig()->MutableQueryLimits()->set_resultrowslimit(ROWS_LIMIT);
703703

@@ -718,6 +718,31 @@ Y_UNIT_TEST_SUITE(KqpQueryServiceScripts) {
718718
UNIT_ASSERT_VALUES_EQUAL(resultSet.ColumnParser(0).GetInt32(), i);
719719
}
720720
}
721+
722+
Y_UNIT_TEST(Tcl) {
723+
auto kikimr = DefaultKikimrRunner();
724+
auto db = kikimr.GetQueryClient();
725+
726+
auto op = db.ExecuteScript(R"(
727+
SELECT 1;
728+
COMMIT;
729+
)").ExtractValueSync();
730+
UNIT_ASSERT_VALUES_EQUAL_C(op.Status().GetStatus(), EStatus::SUCCESS, op.Status().GetIssues().ToString());
731+
732+
auto readyOp = WaitScriptExecutionOperation(op.Id(), kikimr.GetDriver());
733+
UNIT_ASSERT_VALUES_EQUAL_C(readyOp.Status().GetStatus(), EStatus::GENERIC_ERROR, readyOp.Status().GetIssues().ToString());
734+
UNIT_ASSERT(HasIssue(readyOp.Status().GetIssues(), NYql::TIssuesIds::KIKIMR_BAD_OPERATION));
735+
736+
op = db.ExecuteScript(R"(
737+
SELECT 1;
738+
ROLLBACK;
739+
)").ExtractValueSync();
740+
UNIT_ASSERT_VALUES_EQUAL_C(op.Status().GetStatus(), EStatus::SUCCESS, op.Status().GetIssues().ToString());
741+
742+
readyOp = WaitScriptExecutionOperation(op.Id(), kikimr.GetDriver());
743+
UNIT_ASSERT_VALUES_EQUAL_C(readyOp.Status().GetStatus(), EStatus::GENERIC_ERROR, readyOp.Status().GetIssues().ToString());
744+
UNIT_ASSERT(HasIssue(readyOp.Status().GetIssues(), NYql::TIssuesIds::KIKIMR_BAD_OPERATION));
745+
}
721746
}
722747

723748
} // namespace NKqp

0 commit comments

Comments
 (0)