aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPisarenko Grigoriy <grigoriypisar@ydb.tech>2025-02-10 18:23:32 +0500
committerGitHub <noreply@github.com>2025-02-10 16:23:32 +0300
commit057719228a2aaa8efd08037b18d81d480e288950 (patch)
tree019b69a49f0093190e6224f3fb53783887156ef8
parentf61d2852329a30b6ad2c4b3ddfa89a7a6522dc88 (diff)
downloadydb-057719228a2aaa8efd08037b18d81d480e288950.tar.gz
YQ-4060 fix multi statement select (#13946)
-rw-r--r--ydb/core/kqp/provider/yql_kikimr_opt_build.cpp131
-rw-r--r--ydb/core/kqp/ut/federated_query/s3/kqp_federated_query_ut.cpp138
-rw-r--r--ydb/tests/fq/yt/cfg/test_whitelist.txt13
3 files changed, 195 insertions, 87 deletions
diff --git a/ydb/core/kqp/provider/yql_kikimr_opt_build.cpp b/ydb/core/kqp/provider/yql_kikimr_opt_build.cpp
index acfd2f1d3b7..62a71395b78 100644
--- a/ydb/core/kqp/provider/yql_kikimr_opt_build.cpp
+++ b/ydb/core/kqp/provider/yql_kikimr_opt_build.cpp
@@ -309,6 +309,11 @@ bool IsDqRead(const TExprBase& node, TExprContext& ctx, TTypeAnnotationContext&
TExprBase providerArg(node.Ref().Child(1));
if (auto maybeDataSource = providerArg.Maybe<TCoDataSource>()) {
TStringBuf dataSourceCategory = maybeDataSource.Cast().Category();
+ if (dataSourceCategory == NYql::PgProviderName) {
+ // All pg reads should be replaced on TPgTableContent
+ return false;
+ }
+
auto dataSourceProviderIt = types.DataSourceMap.find(dataSourceCategory);
if (dataSourceProviderIt != types.DataSourceMap.end()) {
if (auto* dqIntegration = dataSourceProviderIt->second->GetDqIntegration()) {
@@ -362,7 +367,7 @@ bool IsDqWrite(const TExprBase& node, TExprContext& ctx, TTypeAnnotationContext&
return false;
}
-bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, TKiExploreTxResults& txRes,
+bool ExploreNode(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, TKiExploreTxResults& txRes,
TIntrusivePtr<TKikimrTablesData> tablesData, TTypeAnnotationContext& types) {
if (txRes.Ops.cend() != txRes.Ops.find(node.Raw())) {
@@ -374,9 +379,9 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T
return true;
}
- if (auto maybeLeft = node.Maybe<TCoLeft>()) {
+ if (node.Maybe<TCoLeft>()) {
txRes.Ops.insert(node.Raw());
- return ExploreTx(maybeLeft.Cast().Input(), ctx, dataSink, txRes, tablesData, types);
+ return true;
}
auto checkDataSource = [dataSink] (const TKiDataSource& ds) {
@@ -400,7 +405,6 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T
YQL_ENSURE(key.GetKeyType() == TKikimrKey::Type::Table);
auto table = key.GetTablePath();
txRes.Ops.insert(node.Raw());
- auto result = ExploreTx(maybeRead.Cast().World(), ctx, dataSink, txRes, tablesData, types);
YQL_ENSURE(tablesData);
const auto& tableData = tablesData->ExistingTable(cluster, table);
@@ -408,19 +412,17 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T
auto readColumns = read.GetSelectColumns(ctx, tableData);
txRes.AddReadOpToQueryBlock(key, readColumns, tableData.Metadata);
txRes.AddTableOperation(BuildTableOpNode(cluster, table, TYdbOperation::Select, read.Pos(), ctx));
- return result;
+ return true;
}
if (IsDqRead(node, ctx, types, true, &txRes.HasErrors)) {
txRes.Ops.insert(node.Raw());
- TExprNode::TPtr worldChild = node.Raw()->ChildPtr(0);
- return ExploreTx(TExprBase(worldChild), ctx, dataSink, txRes, tablesData, types);
+ return true;
}
if (IsPgRead(node, types)) {
txRes.Ops.insert(node.Raw());
- TExprNode::TPtr worldChild = node.Raw()->ChildPtr(0);
- return ExploreTx(TExprBase(worldChild), ctx, dataSink, txRes, tablesData, types);
+ return true;
}
if (auto maybeWrite = node.Maybe<TKiWriteTable>()) {
@@ -431,7 +433,6 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T
auto table = write.Table().Value();
txRes.Ops.insert(node.Raw());
- auto result = ExploreTx(write.World(), ctx, dataSink, txRes, tablesData, types);
auto tableOp = GetTableOp(write);
YQL_ENSURE(tablesData);
@@ -472,14 +473,13 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T
}
txRes.AddTableOperation(BuildTableOpNode(cluster, table, tableOp, write.Pos(), ctx));
- return result;
+ return true;
}
if (IsDqWrite(node, ctx, types)) {
txRes.Ops.insert(node.Raw());
txRes.AddEffect(node, THashMap<TString, TPrimitiveYdbOperations>{});
- TExprNode::TPtr worldChild = node.Raw()->ChildPtr(0);
- return ExploreTx(TExprBase(worldChild), ctx, dataSink, txRes, tablesData, types);
+ return true;
}
if (auto maybeUpdate = node.Maybe<TKiUpdateTable>()) {
@@ -490,7 +490,6 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T
auto table = update.Table().Value();
txRes.Ops.insert(node.Raw());
- auto result = ExploreTx(update.World(), ctx, dataSink, txRes, tablesData, types);
const auto tableOp = TYdbOperation::Update;
YQL_ENSURE(tablesData);
@@ -525,7 +524,7 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T
}
txRes.AddTableOperation(BuildTableOpNode(cluster, table, tableOp, update.Pos(), ctx));
- return result;
+ return true;
}
if (auto maybeDelete = node.Maybe<TKiDeleteTable>()) {
@@ -536,7 +535,6 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T
auto table = del.Table().Value();
txRes.Ops.insert(node.Raw());
- auto result = ExploreTx(del.World(), ctx, dataSink, txRes, tablesData, types);
const auto tableOp = TYdbOperation::Delete;
YQL_ENSURE(tablesData);
@@ -564,7 +562,7 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T
}
txRes.AddTableOperation(BuildTableOpNode(cluster, table, tableOp, del.Pos(), ctx));
- return result;
+ return true;
}
if (auto maybeCreate = node.Maybe<TKiCreateTable>()) {
@@ -575,9 +573,8 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T
auto table = create.Table().Value();
txRes.Ops.insert(node.Raw());
- auto result = ExploreTx(create.World(), ctx, dataSink, txRes, tablesData, types);
txRes.AddTableOperation(BuildTableOpNode(cluster, table, TYdbOperation::CreateTable, create.Pos(), ctx));
- return result;
+ return true;
}
if (auto maybeDrop = node.Maybe<TKiDropTable>()) {
@@ -588,9 +585,8 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T
auto table = drop.Table().Value();
txRes.Ops.insert(node.Raw());
- auto result = ExploreTx(drop.World(), ctx, dataSink, txRes, tablesData, types);
txRes.AddTableOperation(BuildTableOpNode(cluster, table, TYdbOperation::DropTable, drop.Pos(), ctx));
- return result;
+ return true;
}
if (auto maybeAlter = node.Maybe<TKiAlterTable>()) {
@@ -601,9 +597,8 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T
auto table = alter.Table().Value();
txRes.Ops.insert(node.Raw());
- auto result = ExploreTx(alter.World(), ctx, dataSink, txRes, tablesData, types);
txRes.AddTableOperation(BuildTableOpNode(cluster, table, TYdbOperation::AlterTable, alter.Pos(), ctx));
- return result;
+ return true;
}
if (auto maybeCreateUser = node.Maybe<TKiCreateUser>()) {
@@ -613,9 +608,8 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T
}
txRes.Ops.insert(node.Raw());
- auto result = ExploreTx(createUser.World(), ctx, dataSink, txRes, tablesData, types);
txRes.AddTableOperation(BuildYdbOpNode(cluster, TYdbOperation::CreateUser, createUser.Pos(), ctx));
- return result;
+ return true;
}
if (auto maybeAlterUser = node.Maybe<TKiAlterUser>()) {
@@ -625,9 +619,8 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T
}
txRes.Ops.insert(node.Raw());
- auto result = ExploreTx(alterUser.World(), ctx, dataSink, txRes, tablesData, types);
txRes.AddTableOperation(BuildYdbOpNode(cluster, TYdbOperation::AlterUser, alterUser.Pos(), ctx));
- return result;
+ return true;
}
if (auto maybeDropUser = node.Maybe<TKiDropUser>()) {
@@ -637,9 +630,8 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T
}
txRes.Ops.insert(node.Raw());
- auto result = ExploreTx(dropUser.World(), ctx, dataSink, txRes, tablesData, types);
txRes.AddTableOperation(BuildYdbOpNode(cluster, TYdbOperation::DropUser, dropUser.Pos(), ctx));
- return result;
+ return true;
}
if (auto maybeCreateGroup = node.Maybe<TKiCreateGroup>()) {
@@ -649,9 +641,8 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T
}
txRes.Ops.insert(node.Raw());
- auto result = ExploreTx(createGroup.World(), ctx, dataSink, txRes, tablesData, types);
txRes.AddTableOperation(BuildYdbOpNode(cluster, TYdbOperation::CreateGroup, createGroup.Pos(), ctx));
- return result;
+ return true;
}
if (auto maybeAlterGroup = node.Maybe<TKiAlterGroup>()) {
@@ -661,9 +652,8 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T
}
txRes.Ops.insert(node.Raw());
- auto result = ExploreTx(alterGroup.World(), ctx, dataSink, txRes, tablesData, types);
txRes.AddTableOperation(BuildYdbOpNode(cluster, TYdbOperation::AlterGroup, alterGroup.Pos(), ctx));
- return result;
+ return true;
}
if (auto maybeRenameGroup = node.Maybe<TKiRenameGroup>()) {
@@ -673,9 +663,8 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T
}
txRes.Ops.insert(node.Raw());
- auto result = ExploreTx(renameGroup.World(), ctx, dataSink, txRes, tablesData, types);
txRes.AddTableOperation(BuildYdbOpNode(cluster, TYdbOperation::RenameGroup, renameGroup.Pos(), ctx));
- return result;
+ return true;
}
if (auto maybeDropGroup = node.Maybe<TKiDropGroup>()) {
@@ -685,9 +674,8 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T
}
txRes.Ops.insert(node.Raw());
- auto result = ExploreTx(dropGroup.World(), ctx, dataSink, txRes, tablesData, types);
txRes.AddTableOperation(BuildYdbOpNode(cluster, TYdbOperation::DropGroup, dropGroup.Pos(), ctx));
- return result;
+ return true;
}
if (auto maybeExecQuery = node.Maybe<TKiExecDataQuery>()) {
@@ -700,24 +688,12 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T
return true;
}
- if (auto maybeCommit = node.Maybe<TCoCommit>()) {
- auto commit = maybeCommit.Cast();
-
- if (commit.DataSink().Maybe<TKiDataSink>() && checkDataSink(commit.DataSink().Cast<TKiDataSink>())) {
- txRes.Sync.push_back(commit);
- return true;
- }
-
- return ExploreTx(commit.World(), ctx, dataSink, txRes, tablesData, types);
+ if (node.Maybe<TCoCommit>()) {
+ return true;
}
- if (auto maybeSync = node.Maybe<TCoSync>()) {
+ if (node.Maybe<TCoSync>()) {
txRes.Ops.insert(node.Raw());
- for (auto child : maybeSync.Cast()) {
- if (!ExploreTx(child, ctx, dataSink, txRes, tablesData, types)) {
- return false;
- }
- }
return true;
}
@@ -725,14 +701,16 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T
node.Maybe<TResPull>())
{
txRes.Ops.insert(node.Raw());
- bool result = ExploreTx(TExprBase(node.Ref().ChildPtr(0)), ctx, dataSink, txRes, tablesData, types);
-// Cerr << KqpExprToPrettyString(*node.Raw(), ctx) << Endl;
txRes.AddResult(node);
- return result;
+ return true;
}
if (node.Ref().IsCallable(ConfigureName)) {
- txRes.Sync.push_back(node);
+ return true;
+ }
+
+ if (node.Maybe<TCoCons>()) {
+ txRes.Ops.insert(node.Raw());
return true;
}
@@ -757,32 +735,42 @@ bool IsKikimrPureNode(const TExprNode::TPtr& node) {
return true;
}
-bool CheckTx(TExprBase txStart, const TKiDataSink& dataSink, const THashSet<const TExprNode*>& txOps,
- const THashSet<const TExprNode*>& txSync)
+bool ExploreTx(TExprBase root, TExprContext& ctx, const TKiDataSink& dataSink, TKiExploreTxResults& txRes,
+ TIntrusivePtr<TKikimrTablesData> tablesData, TTypeAnnotationContext& types)
{
- bool hasErrors = false;
- VisitExpr(txStart.Ptr(), [&txOps, &txSync, &hasErrors, dataSink] (const TExprNode::TPtr& node) {
- if (hasErrors) {
- return false;
+ const auto preFunc = [&dataSink, &txRes](const TExprNode::TPtr& node) {
+ if (const auto maybeCommit = TExprBase(node).Maybe<TCoCommit>()) {
+ const auto commit = maybeCommit.Cast();
+ if (commit.DataSink().Maybe<TKiDataSink>() && commit.DataSink().Cast<TKiDataSink>().Raw() == dataSink.Raw()) {
+ txRes.Sync.push_back(commit);
+ return false;
+ }
+ return true;
}
- if (txSync.find(node.Get()) != txSync.cend()) {
+ if (node->IsCallable(ConfigureName)) {
+ txRes.Sync.push_back(TExprBase(node));
return false;
}
- if (auto maybeCommit = TMaybeNode<TCoCommit>(node)) {
- if (maybeCommit.Cast().DataSink().Raw() != dataSink.Raw()) {
- return true;
- }
+ return true;
+ };
+
+ bool hasErrors = false;
+ const auto postFunc = [&hasErrors, &ctx, &dataSink, &txRes, tablesData, &types](const TExprNode::TPtr& node) {
+ if (hasErrors) {
+ return false;
}
- if (!IsKikimrPureNode(node) && txOps.find(node.Get()) == txOps.cend()) {
+ if (!ExploreNode(TExprBase(node), ctx, dataSink, txRes, tablesData, types) && !IsKikimrPureNode(node)) {
hasErrors = true;
return false;
}
return true;
- });
+ };
+
+ VisitExpr(root.Ptr(), preFunc, postFunc);
return !hasErrors;
}
@@ -964,11 +952,6 @@ TExprNode::TPtr KiBuildQuery(TExprBase node, TExprContext& ctx, TStringBuf datab
return node.Ptr();
}
- auto txSyncSet = txExplore.GetSyncSet();
- if (!CheckTx(commit.World(), kiDataSink, txExplore.Ops, txSyncSet)) {
- return node.Ptr();
- }
-
bool hasScheme;
bool hasData;
txExplore.GetTableOperations(hasScheme, hasData);
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 bda7bc0bebd..48df8a76cd4 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
@@ -628,6 +628,81 @@ Y_UNIT_TEST_SUITE(KqpFederatedQuery) {
}
}
+ Y_UNIT_TEST(MultiStatementSelect) {
+ const TString readDataSourceName = "/Root/read_data_source";
+ const TString readBucket = "test_read_muti_statement";
+
+ {
+ Aws::S3::S3Client s3Client = MakeS3Client();
+ CreateBucket(readBucket, s3Client);
+ }
+
+ auto kikimr = NTestUtils::MakeKikimrRunner();
+
+ auto tc = kikimr->GetTableClient();
+ auto session = tc.CreateSession().GetValueSync().GetSession();
+ const TString query = fmt::format(R"(
+ CREATE EXTERNAL DATA SOURCE `{read_source}` WITH (
+ SOURCE_TYPE="ObjectStorage",
+ LOCATION="{read_location}",
+ AUTH_METHOD="NONE"
+ );
+ )",
+ "read_source"_a = readDataSourceName,
+ "read_location"_a = GetBucketLocation(readBucket)
+ );
+
+ auto result = session.ExecuteSchemeQuery(query).GetValueSync();
+ UNIT_ASSERT_C(result.GetStatus() == NYdb::EStatus::SUCCESS, result.GetIssues().ToString());
+
+ const TString sql = fmt::format(R"(
+ SELECT 42;
+
+ SELECT * FROM `{read_source}`.`some/path/` WITH (
+ FORMAT = "csv_with_names",
+ SCHEMA = (
+ id Int32,
+ payload String
+ )
+ );
+
+ SELECT 84;
+ )",
+ "read_source"_a = readDataSourceName
+ );
+
+ auto db = kikimr->GetQueryClient();
+ auto scriptExecutionOperation = db.ExecuteScript(sql).ExtractValueSync();
+ UNIT_ASSERT_VALUES_EQUAL_C(scriptExecutionOperation.Status().GetStatus(), EStatus::SUCCESS, scriptExecutionOperation.Status().GetIssues().ToString());
+
+ NYdb::NQuery::TScriptExecutionOperation readyOp = WaitScriptExecutionOperation(scriptExecutionOperation.Id(), kikimr->GetDriver());
+ UNIT_ASSERT_VALUES_EQUAL_C(readyOp.Metadata().ExecStatus, EExecStatus::Completed, readyOp.Status().GetIssues().ToString());
+ const int64_t numberResultSets = 3;
+ UNIT_ASSERT_VALUES_EQUAL(readyOp.Metadata().ResultSetsMeta.size(), numberResultSets);
+
+
+ for (int64_t resultSetId = 0; resultSetId < numberResultSets; ++resultSetId) {
+ TFetchScriptResultsResult results = db.FetchScriptResults(scriptExecutionOperation.Id(), resultSetId).ExtractValueSync();
+ UNIT_ASSERT_VALUES_EQUAL_C(results.GetStatus(), EStatus::SUCCESS, "Result set id: " << resultSetId << ", reason: " << results.GetIssues().ToString());
+ TResultSetParser resultSet(results.ExtractResultSet());
+
+ if (resultSetId == 1) {
+ UNIT_ASSERT_VALUES_EQUAL_C(resultSet.ColumnsCount(), 2, resultSetId);
+ UNIT_ASSERT_VALUES_EQUAL_C(resultSet.RowsCount(), 0, resultSetId);
+ } else {
+ UNIT_ASSERT_VALUES_EQUAL_C(resultSet.ColumnsCount(), 1, resultSetId);
+ UNIT_ASSERT_VALUES_EQUAL_C(resultSet.RowsCount(), 1, resultSetId);
+
+ UNIT_ASSERT_C(resultSet.TryNextRow(), resultSetId);
+ if (resultSetId == 0) {
+ UNIT_ASSERT_VALUES_EQUAL_C(resultSet.ColumnParser(0).GetInt32(), 42, resultSetId);
+ } else {
+ UNIT_ASSERT_VALUES_EQUAL_C(resultSet.ColumnParser(0).GetInt32(), 84, resultSetId);
+ }
+ }
+ }
+ }
+
Y_UNIT_TEST(InsertIntoBucket) {
const TString readDataSourceName = "/Root/read_data_source";
const TString readTableName = "/Root/read_binding";
@@ -707,6 +782,69 @@ Y_UNIT_TEST_SUITE(KqpFederatedQuery) {
UNIT_ASSERT_STRING_CONTAINS(content, "2\thello world\n");
}
+ Y_UNIT_TEST(InsertIntoBucketWithSelect) {
+ const TString writeDataSourceName = "/Root/write_data_source";
+ const TString writeBucket = "test_bucket_write_with_select";
+ const TString writeObject = "test_object_write/";
+
+ {
+ Aws::S3::S3Client s3Client = MakeS3Client();
+ CreateBucket(writeBucket, s3Client);
+ }
+
+ auto kikimr = NTestUtils::MakeKikimrRunner();
+
+ auto tc = kikimr->GetTableClient();
+ auto session = tc.CreateSession().GetValueSync().GetSession();
+ const TString query = fmt::format(R"(
+ CREATE EXTERNAL DATA SOURCE `{write_source}` WITH (
+ SOURCE_TYPE="ObjectStorage",
+ LOCATION="{write_location}",
+ AUTH_METHOD="NONE"
+ );
+ )",
+ "write_source"_a = writeDataSourceName,
+ "write_location"_a = GetBucketLocation(writeBucket)
+ );
+
+ auto result = session.ExecuteSchemeQuery(query).GetValueSync();
+ UNIT_ASSERT_C(result.GetStatus() == NYdb::EStatus::SUCCESS, result.GetIssues().ToString());
+
+ const TString sql = fmt::format(R"(
+ INSERT INTO `{write_source}`.`{write_object}` WITH (FORMAT = "csv_with_names")
+ SELECT * FROM AS_TABLE([<|id: 0, payload: "#######"|>]);
+
+ SELECT * FROM `{write_source}`.`some/path/` WITH (
+ FORMAT = "csv_with_names",
+ SCHEMA = (
+ id Int32,
+ payload String
+ )
+ )
+ )",
+ "write_source"_a = writeDataSourceName,
+ "write_object"_a = writeObject
+ );
+
+ auto db = kikimr->GetQueryClient();
+ auto scriptExecutionOperation = db.ExecuteScript(sql).ExtractValueSync();
+ UNIT_ASSERT_VALUES_EQUAL_C(scriptExecutionOperation.Status().GetStatus(), EStatus::SUCCESS, scriptExecutionOperation.Status().GetIssues().ToString());
+
+ NYdb::NQuery::TScriptExecutionOperation readyOp = WaitScriptExecutionOperation(scriptExecutionOperation.Id(), kikimr->GetDriver());
+ UNIT_ASSERT_VALUES_EQUAL_C(readyOp.Metadata().ExecStatus, EExecStatus::Completed, readyOp.Status().GetIssues().ToString());
+ UNIT_ASSERT_VALUES_EQUAL(readyOp.Metadata().ResultSetsMeta.size(), 1);
+
+ TFetchScriptResultsResult results = db.FetchScriptResults(scriptExecutionOperation.Id(), 0).ExtractValueSync();
+ UNIT_ASSERT_VALUES_EQUAL_C(results.GetStatus(), EStatus::SUCCESS, results.GetIssues().ToString());
+ TResultSetParser resultSet(results.ExtractResultSet());
+ UNIT_ASSERT_VALUES_EQUAL(resultSet.ColumnsCount(), 2);
+ UNIT_ASSERT_VALUES_EQUAL(resultSet.RowsCount(), 0);
+
+ TString content = GetAllObjects(writeBucket);
+ UNIT_ASSERT_STRING_CONTAINS(content, "\"id\",\"payload\"\n");
+ UNIT_ASSERT_STRING_CONTAINS(content, "0,\"#######\"\n");
+ }
+
void ExecuteInsertQuery(TQueryClient& client, const TString& writeTableName, const TString& readTableName, bool expectCached) {
const TString sql = fmt::format(R"(
INSERT INTO `{write_table}`
diff --git a/ydb/tests/fq/yt/cfg/test_whitelist.txt b/ydb/tests/fq/yt/cfg/test_whitelist.txt
index c9910480d40..63a3e347c5c 100644
--- a/ydb/tests/fq/yt/cfg/test_whitelist.txt
+++ b/ydb/tests/fq/yt/cfg/test_whitelist.txt
@@ -41,7 +41,6 @@ aggr_factory/avg
aggr_factory/flatten
action/eval_folder_via_file
action/eval_regexp
-action/eval_table_with_view
agg_apply/sum_decimal
agg_phases/avg
action/eval_for_over_subquery
@@ -568,7 +567,6 @@ join/inner_all_right
join/inner_on_key_only
optimizers/sort_constraint_in_left
in/in_types_cast_all
-optimizers/yql-2582_limit_for_join_input_other
join/left_trivial
json/json_query/example
join/left_cast_to_string
@@ -1629,7 +1627,6 @@ pg/select_win_expr_partition
compute_range/yql-13489
count/count_all_grouped
order_by/order_by_expr_simple
-limit/dynamic_limit
distinct/distinct_window
pg-tpcds/q17
pg-tpcds/q40
@@ -1833,14 +1830,12 @@ sampling/system_sampling
schema/copy
schema/copy
schema/insert_sorted
-schema/limit_simple
join/inner_with_select
join/lookupjoin_inner
join/lookupjoin_semi_1o2o
join/mapjoin_left_null_column
pg/select_subquery2_qstar
pg/select_win_column_partition_by
-limit/limit
join/flatten_columns1
join/full_join
join/inner_with_select
@@ -1943,7 +1938,6 @@ sampling/join_right_sample
sampling/orderedjoin_left_sample
schema/select_all
window/generic/aggregations_before_current
-union_all/inner_union_all_with_limits
join/lookupjoin_with_cache
join/mapjoin_early_rewrite_sequence
join/pushdown_filter_over_left
@@ -2338,7 +2332,6 @@ window/full/noncompact_with_tablerow
sampling/bind_join_right
sampling/subquery_default
sampling/subquery_filter
-sampling/zero_percentage
datetime/date_types
window/full/session_aliases_compact
blocks/minmax_tuple
@@ -2364,7 +2357,6 @@ select/if
expr/as_dict_list_key
action/eval_column
pg/select_win_nth_value
-aggregate/group_by_gs_subselect_asterisk
union_all/union_all_with_top_level_limits_ansi
view/file_inner_udf
weak_field/weak_field_join
@@ -2764,7 +2756,6 @@ udf/regexp_udf
udf/udf_result_member
pg/join_using_tables4
pg/numbers_to_pg
-limit/limit
pg/order_by_distinct_same_expr_agg
limit/limit_over_sort_desc_in_subquery
lineage/join_as_struct
@@ -2783,7 +2774,6 @@ pg/range_function_multi_record
pg/record_from_table_row
union_all/union_all_multiin
order_by/ordered_fill
-order_by/warn_offset_wo_sort
optimizers/multi_to_empty_constraint
pg/select_agg_gs_cube
union_all/union_all_null
@@ -2857,7 +2847,6 @@ pg-tpcds/q85
pg-tpch/q18
pg-tpch/q21
pg_catalog/pg_stat_activity
-ypath/limit_with_key
pg/simple_ops
produce/process_multi_out_bad_count_fail
produce/reduce_with_python_row
@@ -2866,7 +2855,6 @@ sampling/orderedjoin_right_sample
schema/limit_directread
schema/remap_desc
schema/select_all_inferschema_op
-ypath/limit_with_range
pg_catalog/pg_stat_database
pg_catalog/pg_tables
pg/sublink_columns_in_test_expr_columns_corr
@@ -2876,7 +2864,6 @@ produce/reduce_all_list
produce/reduce_by_struct
sampling/mapjoin_right_sample
sampling/topsort
-schema/select_all_inferschema_limit
select/digits
pg/sublink_projection_expr_corr
select/host_count