Skip to content

Commit 0d383f7

Browse files
authored
[KQP] Fix nullptr errors with BATCH operations and not created tables (#19766)
1 parent 668235e commit 0d383f7

File tree

3 files changed

+108
-10
lines changed

3 files changed

+108
-10
lines changed

ydb/core/kqp/provider/yql_kikimr_datasink.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1339,11 +1339,11 @@ class TKikimrDataSink : public TDataProviderBase
13391339

13401340
if (settings.IsBatch) {
13411341
TKiDataSink dataSink(node->Child(1));
1342-
auto tableDesc = SessionCtx->Tables().EnsureTableExists(
1343-
TString(dataSink.Cluster()),
1344-
key.GetTablePath(), node->Pos(), ctx);
1345-
1346-
settings.Filter = RewriteBatchFilter(std::move(settings.Filter.Cast()), *tableDesc, ctx);
1342+
if (auto* tableDesc = SessionCtx->Tables().EnsureTableExists(TString(dataSink.Cluster()),
1343+
key.GetTablePath(), node->Pos(), ctx))
1344+
{
1345+
settings.Filter = RewriteBatchFilter(std::move(settings.Filter.Cast()), *tableDesc, ctx);
1346+
}
13471347
}
13481348

13491349
return Build<TKiUpdateTable>(ctx, node->Pos())
@@ -1380,11 +1380,11 @@ class TKikimrDataSink : public TDataProviderBase
13801380
if (settings.Filter) {
13811381
if (settings.IsBatch) {
13821382
TKiDataSink dataSink(node->Child(1));
1383-
auto tableDesc = SessionCtx->Tables().EnsureTableExists(
1384-
TString(dataSink.Cluster()),
1385-
key.GetTablePath(), node->Pos(), ctx);
1386-
1387-
settings.Filter = RewriteBatchFilter(std::move(settings.Filter.Cast()), *tableDesc, ctx);
1383+
if (auto* tableDesc = SessionCtx->Tables().EnsureTableExists(TString(dataSink.Cluster()),
1384+
key.GetTablePath(), node->Pos(), ctx))
1385+
{
1386+
settings.Filter = RewriteBatchFilter(std::move(settings.Filter.Cast()), *tableDesc, ctx);
1387+
}
13881388
}
13891389

13901390
return Build<TKiDeleteTable>(ctx, node->Pos())

ydb/core/kqp/ut/batch_operations/kqp_batch_delete_ut.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,47 @@ Y_UNIT_TEST_SUITE(KqpBatchDelete) {
499499
}
500500
}
501501

502+
Y_UNIT_TEST(TableNotExists) {
503+
TKikimrRunner kikimr(GetAppConfig());
504+
auto db = kikimr.GetQueryClient();
505+
auto session = db.GetSession().GetValueSync().GetSession();
506+
507+
{
508+
auto query = Q_(R"(
509+
BATCH DELETE FROM TestBatchNotExists;
510+
)");
511+
512+
auto result = session.ExecuteQuery(query, TTxControl::NoTx()).ExtractValueSync();
513+
UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::SCHEME_ERROR);
514+
UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "Cannot find table 'db.[/Root/TestBatchNotExists]'", result.GetIssues().ToString());
515+
}
516+
{
517+
auto query = Q_(R"(
518+
BATCH DELETE FROM TestBatchNotExists
519+
WHERE Key IN [1, 3, 5];
520+
)");
521+
522+
auto result = session.ExecuteQuery(query, TTxControl::NoTx()).ExtractValueSync();
523+
UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::SCHEME_ERROR);
524+
UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "Cannot find table 'db.[/Root/TestBatchNotExists]'", result.GetIssues().ToString());
525+
}
526+
}
527+
528+
Y_UNIT_TEST(UnknownColumn) {
529+
TKikimrRunner kikimr(GetAppConfig());
530+
auto db = kikimr.GetQueryClient();
531+
auto session = db.GetSession().GetValueSync().GetSession();
532+
533+
auto query = Q_(R"(
534+
BATCH DELETE FROM Test
535+
WHERE UnknownColumn = 123;
536+
)");
537+
538+
auto result = session.ExecuteQuery(query, TTxControl::NoTx()).ExtractValueSync();
539+
UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::GENERIC_ERROR);
540+
UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "Member not found: UnknownColumn", result.GetIssues().ToString());
541+
}
542+
502543
Y_UNIT_TEST(HasTxControl) {
503544
TKikimrRunner kikimr(GetAppConfig());
504545
auto db = kikimr.GetQueryClient();

ydb/core/kqp/ut/batch_operations/kqp_batch_update_ut.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -607,6 +607,63 @@ Y_UNIT_TEST_SUITE(KqpBatchUpdate) {
607607
}
608608
}
609609

610+
Y_UNIT_TEST(TableNotExists) {
611+
TKikimrRunner kikimr(GetAppConfig());
612+
auto db = kikimr.GetQueryClient();
613+
auto session = db.GetSession().GetValueSync().GetSession();
614+
615+
{
616+
auto query = Q_(R"(
617+
BATCH UPDATE TestBatchNotExists
618+
SET Amount = 1000;
619+
)");
620+
621+
auto result = session.ExecuteQuery(query, TTxControl::NoTx()).ExtractValueSync();
622+
UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::SCHEME_ERROR);
623+
UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "Cannot find table 'db.[/Root/TestBatchNotExists]'", result.GetIssues().ToString());
624+
}
625+
{
626+
auto query = Q_(R"(
627+
BATCH UPDATE TestBatchNotExists
628+
SET Amount = 1000
629+
WHERE Key IN [1, 3, 5];
630+
)");
631+
632+
auto result = session.ExecuteQuery(query, TTxControl::NoTx()).ExtractValueSync();
633+
UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::SCHEME_ERROR);
634+
UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "Cannot find table 'db.[/Root/TestBatchNotExists]'", result.GetIssues().ToString());
635+
}
636+
}
637+
638+
Y_UNIT_TEST(UnknownColumn) {
639+
TKikimrRunner kikimr(GetAppConfig());
640+
auto db = kikimr.GetQueryClient();
641+
auto session = db.GetSession().GetValueSync().GetSession();
642+
643+
{
644+
auto query = Q_(R"(
645+
BATCH UPDATE Test
646+
SET Amount = 1000
647+
WHERE UnknownColumn = 123;
648+
)");
649+
650+
auto result = session.ExecuteQuery(query, TTxControl::NoTx()).ExtractValueSync();
651+
UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::GENERIC_ERROR);
652+
UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "Member not found: UnknownColumn", result.GetIssues().ToString());
653+
}
654+
{
655+
auto query = Q_(R"(
656+
BATCH UPDATE Test
657+
SET UnknownColumn = 1000
658+
WHERE Group IN [1, 3, 5];
659+
)");
660+
661+
auto result = session.ExecuteQuery(query, TTxControl::NoTx()).ExtractValueSync();
662+
UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::BAD_REQUEST);
663+
UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "Column 'UnknownColumn' does not exist", result.GetIssues().ToString());
664+
}
665+
}
666+
610667
Y_UNIT_TEST(HasTxControl) {
611668
TKikimrRunner kikimr(GetAppConfig());
612669
auto db = kikimr.GetQueryClient();

0 commit comments

Comments
 (0)