summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorspuchin <[email protected]>2023-09-19 12:44:14 +0300
committerspuchin <[email protected]>2023-09-19 13:22:59 +0300
commitaedad0ab3592b1f3d3ff3e2c0ff598116e2fb7f2 (patch)
tree0b7d3019d9aa16a1bd839b5056ef918f3afddef4
parent24b02b90c84c921721ecaaf05c514de964fdd6d7 (diff)
Restrict DISCARD SELECT in generic query. (KIKIMR-7076)
-rw-r--r--ydb/core/kqp/provider/yql_kikimr_exec.cpp11
-rw-r--r--ydb/core/kqp/ut/yql/kqp_yql_ut.cpp11
2 files changed, 21 insertions, 1 deletions
diff --git a/ydb/core/kqp/provider/yql_kikimr_exec.cpp b/ydb/core/kqp/provider/yql_kikimr_exec.cpp
index a1c5c46d3b9..0abe22188ad 100644
--- a/ydb/core/kqp/provider/yql_kikimr_exec.cpp
+++ b/ydb/core/kqp/provider/yql_kikimr_exec.cpp
@@ -737,12 +737,21 @@ private:
}
if (NCommon::HasResOrPullOption(res.Ref(), "ref")) {
- ctx.AddError(TIssue(ctx.GetPosition(res.Pos()), TStringBuilder() << "refselect isn't supported for Kikimr provider."));
+ ctx.AddError(TIssue(ctx.GetPosition(res.Pos()), TStringBuilder()
+ << "refselect isn't supported for Kikimr provider."));
return SyncError();
}
IDataProvider::TFillSettings fillSettings = NCommon::GetFillSettings(res.Ref());
+ if (IsIn({EKikimrQueryType::Query, EKikimrQueryType::Script}, SessionCtx->Query().Type)) {
+ if (fillSettings.Discard) {
+ ctx.AddError(YqlIssue(ctx.GetPosition(res.Pos()), TIssuesIds::KIKIMR_BAD_OPERATION, TStringBuilder()
+ << "DISCARD not supported in YDB queries"));
+ return SyncError();
+ }
+ }
+
auto* runResult = SessionCtx->Query().Results.FindPtr(exec.Ref().UniqueId());
if (!runResult) {
ctx.AddError(TIssue(ctx.GetPosition(exec.Pos()), TStringBuilder() << "KiExecute run result not found."));
diff --git a/ydb/core/kqp/ut/yql/kqp_yql_ut.cpp b/ydb/core/kqp/ut/yql/kqp_yql_ut.cpp
index 0531f598ddb..d8ac2baf90e 100644
--- a/ydb/core/kqp/ut/yql/kqp_yql_ut.cpp
+++ b/ydb/core/kqp/ut/yql/kqp_yql_ut.cpp
@@ -461,6 +461,17 @@ Y_UNIT_TEST_SUITE(KqpYql) {
29]
])", FormatResultSetYson(result.GetResultSet(0)));
}
+
+ Y_UNIT_TEST(Discard) {
+ auto kikimr = DefaultKikimrRunner();
+ auto db = kikimr.GetQueryClient();
+
+ auto result = db.ExecuteQuery(R"(
+ DISCARD SELECT 1;
+ )", NYdb::NQuery::TTxControl::BeginTx().CommitTx()).ExtractValueSync();
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::GENERIC_ERROR, result.GetIssues().ToString());
+ UNIT_ASSERT(HasIssue(result.GetIssues(), NYql::TIssuesIds::KIKIMR_BAD_OPERATION));
+ }
}
} // namespace NKqp