diff options
author | spuchin <[email protected]> | 2023-09-19 12:44:14 +0300 |
---|---|---|
committer | spuchin <[email protected]> | 2023-09-19 13:22:59 +0300 |
commit | aedad0ab3592b1f3d3ff3e2c0ff598116e2fb7f2 (patch) | |
tree | 0b7d3019d9aa16a1bd839b5056ef918f3afddef4 | |
parent | 24b02b90c84c921721ecaaf05c514de964fdd6d7 (diff) |
Restrict DISCARD SELECT in generic query. (KIKIMR-7076)
-rw-r--r-- | ydb/core/kqp/provider/yql_kikimr_exec.cpp | 11 | ||||
-rw-r--r-- | ydb/core/kqp/ut/yql/kqp_yql_ut.cpp | 11 |
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 |