diff --git a/ydb/core/kqp/provider/yql_kikimr_datasink.cpp b/ydb/core/kqp/provider/yql_kikimr_datasink.cpp index 474090677716..d46fce15a9e4 100644 --- a/ydb/core/kqp/provider/yql_kikimr_datasink.cpp +++ b/ydb/core/kqp/provider/yql_kikimr_datasink.cpp @@ -1311,11 +1311,11 @@ class TKikimrDataSink : public TDataProviderBase if (settings.IsBatch) { TKiDataSink dataSink(node->Child(1)); - auto tableDesc = SessionCtx->Tables().EnsureTableExists( - TString(dataSink.Cluster()), - key.GetTablePath(), node->Pos(), ctx); - - settings.Filter = RewriteBatchFilter(std::move(settings.Filter.Cast()), *tableDesc, ctx); + if (auto* tableDesc = SessionCtx->Tables().EnsureTableExists(TString(dataSink.Cluster()), + key.GetTablePath(), node->Pos(), ctx)) + { + settings.Filter = RewriteBatchFilter(std::move(settings.Filter.Cast()), *tableDesc, ctx); + } } return Build(ctx, node->Pos()) @@ -1352,11 +1352,11 @@ class TKikimrDataSink : public TDataProviderBase if (settings.Filter) { if (settings.IsBatch) { TKiDataSink dataSink(node->Child(1)); - auto tableDesc = SessionCtx->Tables().EnsureTableExists( - TString(dataSink.Cluster()), - key.GetTablePath(), node->Pos(), ctx); - - settings.Filter = RewriteBatchFilter(std::move(settings.Filter.Cast()), *tableDesc, ctx); + if (auto* tableDesc = SessionCtx->Tables().EnsureTableExists(TString(dataSink.Cluster()), + key.GetTablePath(), node->Pos(), ctx)) + { + settings.Filter = RewriteBatchFilter(std::move(settings.Filter.Cast()), *tableDesc, ctx); + } } return Build(ctx, node->Pos()) diff --git a/ydb/core/kqp/ut/batch_operations/kqp_batch_delete_ut.cpp b/ydb/core/kqp/ut/batch_operations/kqp_batch_delete_ut.cpp index f79778ee0fec..51e07445aa86 100644 --- a/ydb/core/kqp/ut/batch_operations/kqp_batch_delete_ut.cpp +++ b/ydb/core/kqp/ut/batch_operations/kqp_batch_delete_ut.cpp @@ -499,6 +499,47 @@ Y_UNIT_TEST_SUITE(KqpBatchDelete) { } } + Y_UNIT_TEST(TableNotExists) { + TKikimrRunner kikimr(GetAppConfig()); + auto db = kikimr.GetQueryClient(); + auto session = db.GetSession().GetValueSync().GetSession(); + + { + auto query = Q_(R"( + BATCH DELETE FROM TestBatchNotExists; + )"); + + auto result = session.ExecuteQuery(query, TTxControl::NoTx()).ExtractValueSync(); + UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::SCHEME_ERROR); + UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "Cannot find table 'db.[/Root/TestBatchNotExists]'", result.GetIssues().ToString()); + } + { + auto query = Q_(R"( + BATCH DELETE FROM TestBatchNotExists + WHERE Key IN [1, 3, 5]; + )"); + + auto result = session.ExecuteQuery(query, TTxControl::NoTx()).ExtractValueSync(); + UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::SCHEME_ERROR); + UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "Cannot find table 'db.[/Root/TestBatchNotExists]'", result.GetIssues().ToString()); + } + } + + Y_UNIT_TEST(UnknownColumn) { + TKikimrRunner kikimr(GetAppConfig()); + auto db = kikimr.GetQueryClient(); + auto session = db.GetSession().GetValueSync().GetSession(); + + auto query = Q_(R"( + BATCH DELETE FROM Test + WHERE UnknownColumn = 123; + )"); + + auto result = session.ExecuteQuery(query, TTxControl::NoTx()).ExtractValueSync(); + UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::GENERIC_ERROR); + UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "Member not found: UnknownColumn", result.GetIssues().ToString()); + } + Y_UNIT_TEST(HasTxControl) { TKikimrRunner kikimr(GetAppConfig()); auto db = kikimr.GetQueryClient(); diff --git a/ydb/core/kqp/ut/batch_operations/kqp_batch_update_ut.cpp b/ydb/core/kqp/ut/batch_operations/kqp_batch_update_ut.cpp index 396f33c5da09..26a28608b09e 100644 --- a/ydb/core/kqp/ut/batch_operations/kqp_batch_update_ut.cpp +++ b/ydb/core/kqp/ut/batch_operations/kqp_batch_update_ut.cpp @@ -606,6 +606,63 @@ Y_UNIT_TEST_SUITE(KqpBatchUpdate) { } } + Y_UNIT_TEST(TableNotExists) { + TKikimrRunner kikimr(GetAppConfig()); + auto db = kikimr.GetQueryClient(); + auto session = db.GetSession().GetValueSync().GetSession(); + + { + auto query = Q_(R"( + BATCH UPDATE TestBatchNotExists + SET Amount = 1000; + )"); + + auto result = session.ExecuteQuery(query, TTxControl::NoTx()).ExtractValueSync(); + UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::SCHEME_ERROR); + UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "Cannot find table 'db.[/Root/TestBatchNotExists]'", result.GetIssues().ToString()); + } + { + auto query = Q_(R"( + BATCH UPDATE TestBatchNotExists + SET Amount = 1000 + WHERE Key IN [1, 3, 5]; + )"); + + auto result = session.ExecuteQuery(query, TTxControl::NoTx()).ExtractValueSync(); + UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::SCHEME_ERROR); + UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "Cannot find table 'db.[/Root/TestBatchNotExists]'", result.GetIssues().ToString()); + } + } + + Y_UNIT_TEST(UnknownColumn) { + TKikimrRunner kikimr(GetAppConfig()); + auto db = kikimr.GetQueryClient(); + auto session = db.GetSession().GetValueSync().GetSession(); + + { + auto query = Q_(R"( + BATCH UPDATE Test + SET Amount = 1000 + WHERE UnknownColumn = 123; + )"); + + auto result = session.ExecuteQuery(query, TTxControl::NoTx()).ExtractValueSync(); + UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::GENERIC_ERROR); + UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "Member not found: UnknownColumn", result.GetIssues().ToString()); + } + { + auto query = Q_(R"( + BATCH UPDATE Test + SET UnknownColumn = 1000 + WHERE Group IN [1, 3, 5]; + )"); + + auto result = session.ExecuteQuery(query, TTxControl::NoTx()).ExtractValueSync(); + UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::BAD_REQUEST); + UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "Column 'UnknownColumn' does not exist", result.GetIssues().ToString()); + } + } + Y_UNIT_TEST(HasTxControl) { TKikimrRunner kikimr(GetAppConfig()); auto db = kikimr.GetQueryClient();