Skip to content

Commit 480ca5a

Browse files
committed
Convert function with setting to cluster function
1 parent 582b042 commit 480ca5a

File tree

3 files changed

+54
-9
lines changed

3 files changed

+54
-9
lines changed

src/Storages/ObjectStorage/StorageObjectStorageCluster.cpp

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -269,18 +269,53 @@ void StorageObjectStorageCluster::updateQueryToSendIfNeeded(
269269
{
270270
configuration->addStructureAndFormatToArgsIfNeeded(args, structure, configuration->format, context, /*with_structure=*/true);
271271

272+
/// Convert to old-stype *Cluster table function.
273+
/// This allows to use old clickhouse versions in cluster.
274+
static std::unordered_map<std::string, std::string> function_to_cluster_function = {
275+
{"s3", "s3Cluster"},
276+
{"azureBlobStorage", "azureBlobStorageCluster"},
277+
{"hdfs", "hdfsCluster"},
278+
{"iceberg", "icebergS3Cluster"},
279+
{"icebergS3", "icebergS3Cluster"},
280+
{"icebergAzure", "icebergAzureCluster"},
281+
{"icebergHDFS", "icebergHDFSCluster"},
282+
{"deltaLake", "deltaLakeCluster"},
283+
{"hudi", "hudiCluster"},
284+
};
285+
286+
ASTFunction * table_function = extractTableFunctionFromSelectQuery(query);
287+
288+
auto p = function_to_cluster_function.find(table_function->name);
289+
if (p == function_to_cluster_function.end())
290+
{
291+
throw Exception(
292+
ErrorCodes::LOGICAL_ERROR,
293+
"Can't find cluster name for table function {}",
294+
table_function->name);
295+
}
296+
297+
table_function->name = p->second;
298+
299+
auto cluster_name = getClusterName(context);
300+
auto cluster_name_arg = std::make_shared<ASTLiteral>(cluster_name);
301+
args.insert(args.begin(), cluster_name_arg);
302+
272303
auto * select_query = query->as<ASTSelectQuery>();
273-
if (select_query)
304+
if (!select_query)
305+
throw Exception(
306+
ErrorCodes::LOGICAL_ERROR,
307+
"Expected SELECT query from table function {}",
308+
configuration->getEngineName());
309+
310+
auto settings = select_query->settings();
311+
if (settings)
274312
{
275-
auto settings = select_query->settings();
276-
if (settings)
313+
auto & settings_ast = settings->as<ASTSetQuery &>();
314+
if (settings_ast.changes.removeSetting("object_storage_cluster") && settings_ast.changes.empty())
277315
{
278-
auto & settings_ast = settings->as<ASTSetQuery &>();
279-
if (settings_ast.changes.removeSetting("object_storage_cluster") && settings_ast.changes.empty())
280-
{
281-
select_query->setExpression(ASTSelectQuery::Expression::SETTINGS, {});
282-
}
316+
select_query->setExpression(ASTSelectQuery::Expression::SETTINGS, {});
283317
}
318+
/// No throw if not found - `object_storage_cluster` can be global setting.
284319
}
285320
}
286321
else

src/Storages/extractTableFunctionArgumentsFromSelectQuery.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
namespace DB
1212
{
1313

14-
ASTExpressionList * extractTableFunctionArgumentsFromSelectQuery(ASTPtr & query)
14+
ASTFunction * extractTableFunctionFromSelectQuery(ASTPtr & query)
1515
{
1616
auto * select_query = query->as<ASTSelectQuery>();
1717
if (!select_query || !select_query->tables())
@@ -23,6 +23,14 @@ ASTExpressionList * extractTableFunctionArgumentsFromSelectQuery(ASTPtr & query)
2323
return nullptr;
2424

2525
auto * table_function = table_expression->table_function->as<ASTFunction>();
26+
return table_function;
27+
}
28+
29+
ASTExpressionList * extractTableFunctionArgumentsFromSelectQuery(ASTPtr & query)
30+
{
31+
auto * table_function = extractTableFunctionFromSelectQuery(query);
32+
if (!table_function)
33+
return nullptr;
2634
return table_function->arguments->as<ASTExpressionList>();
2735
}
2836

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
#pragma once
22

33
#include <Parsers/IAST_fwd.h>
4+
#include <Parsers/ASTFunction.h>
45
#include <Parsers/ASTExpressionList.h>
56

67
namespace DB
78
{
89

10+
ASTFunction * extractTableFunctionFromSelectQuery(ASTPtr & query);
911
ASTExpressionList * extractTableFunctionArgumentsFromSelectQuery(ASTPtr & query);
1012

1113
}

0 commit comments

Comments
 (0)