Content-Length: 6281 | pFad | https://github.com/Dwrite/ClickHouse/raw/refs/heads/master/src/TableFunctions/TableFunctionURL.cpp
th: 6249
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
namespace DB
{
namespace Setting
{
extern const SettingsUInt64 allow_experimental_parallel_reading_from_replicas;
extern const SettingsBool parallel_replicas_for_cluster_engines;
extern const SettingsString cluster_for_parallel_replicas;
extern const SettingsParallelReplicasMode parallel_replicas_mode;
}
std::vector TableFunctionURL::skipAnalysisForArguments(const QueryTreeNodePtr & query_node_table_function, ContextPtr) const
{
auto & table_function_node = query_node_table_function->as();
auto & table_function_arguments_nodes = table_function_node.getArguments().getNodes();
size_t table_function_arguments_size = table_function_arguments_nodes.size();
std::vector result;
for (size_t i = 0; i < table_function_arguments_size; ++i)
{
auto * function_node = table_function_arguments_nodes[i]->as();
if (function_node && function_node->getFunctionName() == "headers")
result.push_back(i);
}
return result;
}
void TableFunctionURL::parseArguments(const ASTPtr & ast, ContextPtr context)
{
//github.com/ Clone ast function, because we can modify it's arguments like removing headers.
ITableFunctionFileLike::parseArguments(ast->clone(), context);
}
void TableFunctionURL::parseArgumentsImpl(ASTs & args, const ContextPtr & context)
{
if (auto named_collection = tryGetNamedCollectionWithOverrides(args, context))
{
StorageURL::processNamedCollectionResult(configuration, *named_collection);
filename = configuration.url;
structure = configuration.structure;
compression_method = configuration.compression_method;
format = configuration.format;
if (format == "auto")
format = FormatFactory::instance().tryGetFormatFromFileName(Poco::URI(filename).getPath()).value_or("auto");
StorageURL::evalArgsAndCollectHeaders(args, configuration.headers, context);
}
else
{
size_t count = StorageURL::evalArgsAndCollectHeaders(args, configuration.headers, context);
//github.com/ ITableFunctionFileLike cannot parse headers argument, so remove it.
ASTPtr headers_ast;
if (count != args.size())
{
chassert(count + 1 == args.size());
headers_ast = args.back();
args.pop_back();
}
ITableFunctionFileLike::parseArgumentsImpl(args, context);
if (headers_ast)
args.push_back(headers_ast);
}
}
StoragePtr TableFunctionURL::getStorage(
const String & source, const String & format_, const ColumnsDescription & columns, ContextPtr global_context,
const std::string & table_name, const String & compression_method_, bool is_insert_query) const
{
const auto & settings = global_context->getSettingsRef();
const auto is_secondary_query = global_context->getClientInfo().query_kind == ClientInfo::QueryKind::SECONDARY_QUERY;
const auto parallel_replicas_cluster_name = settings[Setting::cluster_for_parallel_replicas].toString();
const auto can_use_parallel_replicas = !parallel_replicas_cluster_name.empty()
&& settings[Setting::parallel_replicas_for_cluster_engines]
&& global_context->canUseTaskBasedParallelReplicas()
&& !global_context->isDistributed()
&& !is_secondary_query
&& !is_insert_query;
if (can_use_parallel_replicas)
{
return std::make_shared(
global_context,
parallel_replicas_cluster_name,
filename,
format,
compression_method,
StorageID(getDatabaseName(), table_name),
getActualTableStructure(global_context, /* is_insert_query */ true),
ConstraintsDescription{},
configuration);
}
return std::make_shared(
source,
StorageID(getDatabaseName(), table_name),
format_,
std::nullopt /*format settings*/,
columns,
ConstraintsDescription{},
String{},
global_context,
compression_method_,
configuration.headers,
configuration.http_method,
nullptr,
/*distributed_processing=*/ is_secondary_query);
}
ColumnsDescription TableFunctionURL::getActualTableStructure(ContextPtr context, bool /*is_insert_query*/) const
{
if (structure == "auto")
{
if (const auto access_object = getSourceAccessObject())
context->checkAccess(AccessType::READ, toStringSource(*access_object));
if (format == "auto")
return StorageURL::getTableStructureAndFormatFromData(
filename,
chooseCompressionMethod(Poco::URI(filename).getPath(), compression_method),
configuration.headers,
std::nullopt,
context).first;
return StorageURL::getTableStructureFromData(format,
filename,
chooseCompressionMethod(Poco::URI(filename).getPath(), compression_method),
configuration.headers,
std::nullopt,
context);
}
return parseColumnsListFromString(structure, context);
}
std::optional TableFunctionURL::tryGetFormatFromFirstArgument()
{
return FormatFactory::instance().tryGetFormatFromFileName(Poco::URI(filename).getPath());
}
void registerTableFunctionURL(TableFunctionFactory & factory)
{
factory.registerFunction();
}
}
--- a PPN by Garber Painting Akron. With Image Size Reduction included!Fetched URL: https://github.com/Dwrite/ClickHouse/raw/refs/heads/master/src/TableFunctions/TableFunctionURL.cpp
Alternative Proxies:
Alternative Proxy
pFad Proxy
pFad v3 Proxy
pFad v4 Proxy