Skip to content

Commit 76f0d01

Browse files
authored
[25.1.2] Fix nullptr errors with BATCH operations and not created tables (#19876)
2 parents 9a56e86 + b687b2f commit 76f0d01

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
@@ -1311,11 +1311,11 @@ class TKikimrDataSink : public TDataProviderBase
13111311

13121312
if (settings.IsBatch) {
13131313
TKiDataSink dataSink(node->Child(1));
1314-
auto tableDesc = SessionCtx->Tables().EnsureTableExists(
1315-
TString(dataSink.Cluster()),
1316-
key.GetTablePath(), node->Pos(), ctx);
1317-
1318-
settings.Filter = RewriteBatchFilter(std::move(settings.Filter.Cast()), *tableDesc, ctx);
1314+
if (auto* tableDesc = SessionCtx->Tables().EnsureTableExists(TString(dataSink.Cluster()),
1315+
key.GetTablePath(), node->Pos(), ctx))
1316+
{
1317+
settings.Filter = RewriteBatchFilter(std::move(settings.Filter.Cast()), *tableDesc, ctx);
1318+
}
13191319
}
13201320

13211321
return Build<TKiUpdateTable>(ctx, node->Pos())
@@ -1352,11 +1352,11 @@ class TKikimrDataSink : public TDataProviderBase
13521352
if (settings.Filter) {
13531353
if (settings.IsBatch) {
13541354
TKiDataSink dataSink(node->Child(1));
1355-
auto tableDesc = SessionCtx->Tables().EnsureTableExists(
1356-
TString(dataSink.Cluster()),
1357-
key.GetTablePath(), node->Pos(), ctx);
1358-
1359-
settings.Filter = RewriteBatchFilter(std::move(settings.Filter.Cast()), *tableDesc, ctx);
1355+
if (auto* tableDesc = SessionCtx->Tables().EnsureTableExists(TString(dataSink.Cluster()),
1356+
key.GetTablePath(), node->Pos(), ctx))
1357+
{
1358+
settings.Filter = RewriteBatchFilter(std::move(settings.Filter.Cast()), *tableDesc, ctx);
1359+
}
13601360
}
13611361

13621362
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
@@ -606,6 +606,63 @@ Y_UNIT_TEST_SUITE(KqpBatchUpdate) {
606606
}
607607
}
608608

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

0 commit comments

Comments
 (0)