diff --git a/ydb/core/kqp/executer_actor/kqp_data_executer.cpp b/ydb/core/kqp/executer_actor/kqp_data_executer.cpp index ab15d1f9237f..d7cb2bb1416f 100644 --- a/ydb/core/kqp/executer_actor/kqp_data_executer.cpp +++ b/ydb/core/kqp/executer_actor/kqp_data_executer.cpp @@ -278,8 +278,16 @@ class TKqpDataExecuter : public TKqpExecuterBaseGetByteSize(); if (resultSize > (int)ReplySizeLimit) { - TString message = TStringBuilder() << "Query result size limit exceeded. (" - << resultSize << " > " << ReplySizeLimit << ")"; + TString message; + if (ResponseEv->TxResults.size() == 1 && !ResponseEv->TxResults[0].QueryResultIndex.Defined()) { + message = TStringBuilder() << "Intermediate data materialization exceeded size limit" + << " (" << resultSize << " > " << ReplySizeLimit << ")." + << " This usually happens when trying to write large amounts of data or to perform lookup" + << " by big collection of keys in single query. Consider using smaller batches of data."; + } else { + message = TStringBuilder() << "Query result size limit exceeded. (" + << resultSize << " > " << ReplySizeLimit << ")"; + } auto issue = YqlIssue({}, TIssuesIds::KIKIMR_RESULT_UNAVAILABLE, message); ReplyErrorAndDie(Ydb::StatusIds::PRECONDITION_FAILED, issue); diff --git a/ydb/core/kqp/ut/query/kqp_limits_ut.cpp b/ydb/core/kqp/ut/query/kqp_limits_ut.cpp index 6a57ee65bb62..3b9b8ea351a8 100644 --- a/ydb/core/kqp/ut/query/kqp_limits_ut.cpp +++ b/ydb/core/kqp/ut/query/kqp_limits_ut.cpp @@ -1034,6 +1034,24 @@ Y_UNIT_TEST_SUITE(KqpLimits) { last = current; } } + + Y_UNIT_TEST(QSReplySize) { + TKikimrRunner kikimr; + CreateLargeTable(kikimr, 100'000, 100, 1'000, 1'000, 1); + + auto db = kikimr.GetQueryClient(); + + auto result = db.ExecuteQuery(R"( + UPSERT INTO KeyValue2 + SELECT + KeyText AS Key, + DataText AS Value + FROM `/Root/LargeTable`; + )", NQuery::TTxControl::BeginTx().CommitTx()).ExtractValueSync(); + result.GetIssues().PrintTo(Cerr); + UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::PRECONDITION_FAILED); + UNIT_ASSERT(!to_lower(result.GetIssues().ToString()).Contains("query result")); + } } } // namespace NKqp