mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-26 17:41:59 +00:00
fix
This commit is contained in:
parent
fc3e11a068
commit
c938f4f2fe
@ -972,9 +972,7 @@ bool InterpreterCreateQuery::doCreateTable(ASTCreateQuery & create,
|
|||||||
{
|
{
|
||||||
const auto & factory = TableFunctionFactory::instance();
|
const auto & factory = TableFunctionFactory::instance();
|
||||||
auto table_func = factory.get(create.as_table_function, context);
|
auto table_func = factory.get(create.as_table_function, context);
|
||||||
/// We should use global context here because there will be no query context on server startup
|
res = table_func->execute(create.as_table_function, context, create.table, properties.columns);
|
||||||
/// and because storage lifetime is bigger than query context lifetime.
|
|
||||||
res = table_func->execute(create.as_table_function, context.getGlobalContext(), create.table, properties.columns);
|
|
||||||
res->renameInMemory({create.database, create.table, create.uuid});
|
res->renameInMemory({create.database, create.table, create.uuid});
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -33,7 +33,7 @@ namespace ErrorCodes
|
|||||||
|
|
||||||
IStorageURLBase::IStorageURLBase(
|
IStorageURLBase::IStorageURLBase(
|
||||||
const Poco::URI & uri_,
|
const Poco::URI & uri_,
|
||||||
const Context & context_,
|
const Context & /*context_*/,
|
||||||
const StorageID & table_id_,
|
const StorageID & table_id_,
|
||||||
const String & format_name_,
|
const String & format_name_,
|
||||||
const std::optional<FormatSettings> & format_settings_,
|
const std::optional<FormatSettings> & format_settings_,
|
||||||
@ -46,8 +46,6 @@ IStorageURLBase::IStorageURLBase(
|
|||||||
, format_name(format_name_)
|
, format_name(format_name_)
|
||||||
, format_settings(format_settings_)
|
, format_settings(format_settings_)
|
||||||
{
|
{
|
||||||
context_.getRemoteHostFilter().checkURL(uri);
|
|
||||||
|
|
||||||
StorageInMemoryMetadata storage_metadata;
|
StorageInMemoryMetadata storage_metadata;
|
||||||
storage_metadata.setColumns(columns_);
|
storage_metadata.setColumns(columns_);
|
||||||
storage_metadata.setConstraints(constraints_);
|
storage_metadata.setConstraints(constraints_);
|
||||||
@ -244,6 +242,20 @@ BlockOutputStreamPtr IStorageURLBase::write(const ASTPtr & /*query*/, const Stor
|
|||||||
chooseCompressionMethod(uri.toString(), compression_method));
|
chooseCompressionMethod(uri.toString(), compression_method));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StorageURL::StorageURL(const Poco::URI & uri_,
|
||||||
|
const StorageID & table_id_,
|
||||||
|
const String & format_name_,
|
||||||
|
const std::optional<FormatSettings> & format_settings_,
|
||||||
|
const ColumnsDescription & columns_,
|
||||||
|
const ConstraintsDescription & constraints_,
|
||||||
|
Context & context_,
|
||||||
|
const String & compression_method_)
|
||||||
|
: IStorageURLBase(uri_, context_, table_id_, format_name_,
|
||||||
|
format_settings_, columns_, constraints_, compression_method_)
|
||||||
|
{
|
||||||
|
context_.getRemoteHostFilter().checkURL(uri);
|
||||||
|
}
|
||||||
|
|
||||||
void registerStorageURL(StorageFactory & factory)
|
void registerStorageURL(StorageFactory & factory)
|
||||||
{
|
{
|
||||||
factory.registerStorage("URL", [](const StorageFactory::Arguments & args)
|
factory.registerStorage("URL", [](const StorageFactory::Arguments & args)
|
||||||
|
@ -113,11 +113,7 @@ public:
|
|||||||
const ColumnsDescription & columns_,
|
const ColumnsDescription & columns_,
|
||||||
const ConstraintsDescription & constraints_,
|
const ConstraintsDescription & constraints_,
|
||||||
Context & context_,
|
Context & context_,
|
||||||
const String & compression_method_)
|
const String & compression_method_);
|
||||||
: IStorageURLBase(uri_, context_, table_id_, format_name_,
|
|
||||||
format_settings_, columns_, constraints_, compression_method_)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
|
@ -20,12 +20,20 @@ StoragePtr ITableFunction::execute(const ASTPtr & ast_function, const Context &
|
|||||||
ProfileEvents::increment(ProfileEvents::TableFunctionExecute);
|
ProfileEvents::increment(ProfileEvents::TableFunctionExecute);
|
||||||
context.checkAccess(AccessType::CREATE_TEMPORARY_TABLE | StorageFactory::instance().getSourceAccessType(getStorageTypeName()));
|
context.checkAccess(AccessType::CREATE_TEMPORARY_TABLE | StorageFactory::instance().getSourceAccessType(getStorageTypeName()));
|
||||||
|
|
||||||
if (cached_columns.empty() || (hasStaticStructure() && cached_columns == getActualTableStructure(context)))
|
if (cached_columns.empty())
|
||||||
return executeImpl(ast_function, context, table_name, std::move(cached_columns));
|
return executeImpl(ast_function, context, table_name, std::move(cached_columns));
|
||||||
|
|
||||||
auto get_storage = [=, tf = shared_from_this()]() -> StoragePtr
|
/// We have table structure, so it's CREATE AS table_function().
|
||||||
|
/// We should use global context here because there will be no query context on server startup
|
||||||
|
/// and because storage lifetime is bigger than query context lifetime.
|
||||||
|
const Context & global_context = context.getGlobalContext();
|
||||||
|
if (hasStaticStructure() && cached_columns == getActualTableStructure(context))
|
||||||
|
return executeImpl(ast_function, global_context, table_name, std::move(cached_columns));
|
||||||
|
|
||||||
|
auto this_table_function = shared_from_this();
|
||||||
|
auto get_storage = [=, &global_context]() -> StoragePtr
|
||||||
{
|
{
|
||||||
return tf->executeImpl(ast_function, context, table_name, cached_columns);
|
return this_table_function->executeImpl(ast_function, global_context, table_name, cached_columns);
|
||||||
};
|
};
|
||||||
|
|
||||||
/// It will request actual table structure and create underlying storage lazily
|
/// It will request actual table structure and create underlying storage lazily
|
||||||
|
Loading…
Reference in New Issue
Block a user