diff --git a/ydb/core/kqp/ut/federated_query/s3/kqp_federated_query_ut.cpp b/ydb/core/kqp/ut/federated_query/s3/kqp_federated_query_ut.cpp index 9b8d89dc676f..c82487f47410 100644 --- a/ydb/core/kqp/ut/federated_query/s3/kqp_federated_query_ut.cpp +++ b/ydb/core/kqp/ut/federated_query/s3/kqp_federated_query_ut.cpp @@ -2620,6 +2620,73 @@ Y_UNIT_TEST_SUITE(KqpFederatedQuery) { auto kikimr = NTestUtils::MakeKikimrRunner(config); ReadLargeParquetFiles(kikimr, "test_local_read_large_file_bucket"); } + + Y_UNIT_TEST(TestBlockInsertNullColumn) { + NKikimrConfig::TAppConfig config; + config.MutableTableServiceConfig()->SetBlockChannelsMode(NKikimrConfig::TTableServiceConfig::BLOCK_CHANNELS_FORCE); + auto kikimr = NTestUtils::MakeKikimrRunner(config); + + const TString bucket = "test_block_insert_null_column_bucket"; + CreateBucket(bucket); + + auto tc = kikimr->GetTableClient(); + auto session = tc.CreateSession().GetValueSync().GetSession(); + { + const TString query = fmt::format(R"( + CREATE EXTERNAL DATA SOURCE `test_bucket` WITH ( + SOURCE_TYPE="ObjectStorage", + LOCATION="{location}", + AUTH_METHOD="NONE" + );)", + "location"_a = GetBucketLocation(bucket) + ); + const auto result = session.ExecuteSchemeQuery(query).GetValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), NYdb::EStatus::SUCCESS, result.GetIssues().ToString()); + } + + auto db = kikimr->GetQueryClient(); + { + const TString query = R"( + CREATE TABLE `test_table` ( + PRIMARY KEY (key) + ) + WITH (STORE = COLUMN) + AS SELECT * FROM + AS_TABLE([<|key: 1, value: Nothing(Optional)|>]); + )"; + const auto result = db.ExecuteQuery(query, NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); + } + + { + const TString query = R"( + PRAGMA s3.UseBlocksSink = "true"; + + INSERT INTO test_bucket.`/result/` WITH (FORMAT = "parquet") + SELECT value FROM test_table + )"; + const auto result = db.ExecuteQuery(query, TTxControl::NoTx()).GetValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), NYdb::EStatus::SUCCESS, result.GetIssues().ToString()); + } + + const TString query = R"( + SELECT * FROM test_bucket.`/result/` WITH ( + FORMAT = "parquet", + SCHEMA ( + value String + ) + ) + )"; + const auto result = db.ExecuteQuery(query, TTxControl::NoTx()).GetValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), NYdb::EStatus::SUCCESS, result.GetIssues().ToString()); + UNIT_ASSERT_VALUES_EQUAL(result.GetResultSets().size(), 1); + + TResultSetParser parser(result.GetResultSet(0)); + UNIT_ASSERT_VALUES_EQUAL(parser.ColumnsCount(), 1); + UNIT_ASSERT_VALUES_EQUAL(parser.RowsCount(), 1); + UNIT_ASSERT(parser.TryNextRow()); + UNIT_ASSERT(!parser.ColumnParser(0).GetOptionalString()); + } } } // namespace NKikimr::NKqp