Use query context instead of the global context in DDLDependencyVisitor.

This commit is contained in:
Vitaly Baranov 2022-12-04 12:33:06 +01:00
parent 76ba8ab3d4
commit 0207637f6b
3 changed files with 15 additions and 16 deletions

View File

@ -346,7 +346,7 @@ void RestorerFromBackup::findTableInBackup(const QualifiedTableName & table_name
res_table_info.has_data = backup->hasFiles(data_path_in_backup);
res_table_info.data_path_in_backup = data_path_in_backup;
tables_dependencies.addDependencies(table_name, getDependenciesFromCreateQuery(context->getGlobalContext(), table_name, create_table_query));
tables_dependencies.addDependencies(table_name, getDependenciesFromCreateQuery(context, table_name, create_table_query));
if (partitions)
{

View File

@ -23,7 +23,7 @@ namespace
{
/// TO target_table (for materialized views)
if (to_table.database.empty())
to_table.database = data.default_database;
to_table.database = data.current_database;
data.dependencies.emplace(to_table);
}
@ -32,7 +32,7 @@ namespace
{
/// AS table_name
if (as_table.database.empty())
as_table.database = data.default_database;
as_table.database = data.current_database;
data.dependencies.emplace(as_table);
}
}
@ -60,7 +60,7 @@ namespace
if (qualified_name.database.empty())
{
/// It can be table/dictionary from default database or XML dictionary, but we cannot distinguish it here.
qualified_name.database = data.default_database;
qualified_name.database = data.current_database;
}
data.dependencies.emplace(qualified_name);
@ -112,7 +112,7 @@ namespace
if (qualified_name.database.empty())
{
/// It can be table/dictionary from default database or XML dictionary, but we cannot distinguish it here.
qualified_name.database = data.default_database;
qualified_name.database = data.current_database;
}
data.dependencies.emplace(std::move(qualified_name));
}
@ -141,7 +141,7 @@ namespace
return;
if (qualified_name.database.empty())
qualified_name.database = data.default_database;
qualified_name.database = data.current_database;
data.dependencies.emplace(qualified_name);
}
@ -181,27 +181,26 @@ namespace
if (!dictionary.source || dictionary.source->name != "clickhouse" || !dictionary.source->elements)
return;
auto config = getDictionaryConfigurationFromAST(data.create_query->as<ASTCreateQuery &>(), data.global_context);
auto info = getInfoIfClickHouseDictionarySource(config, data.global_context);
auto config = getDictionaryConfigurationFromAST(data.create_query->as<ASTCreateQuery &>(), data.context);
auto info = getInfoIfClickHouseDictionarySource(config, data.context);
if (!info || !info->is_local)
return;
if (info->table_name.database.empty())
info->table_name.database = data.default_database;
info->table_name.database = data.current_database;
data.dependencies.emplace(std::move(info->table_name));
}
}
TableNamesSet getDependenciesFromCreateQuery(const ContextPtr & global_context, const QualifiedTableName & table_name, const ASTPtr & ast)
TableNamesSet getDependenciesFromCreateQuery(const ContextPtr & context, const QualifiedTableName & table_name, const ASTPtr & ast)
{
assert(global_context == global_context->getGlobalContext());
DDLDependencyVisitor::Data data;
data.table_name = table_name;
data.default_database = global_context->getCurrentDatabase();
data.current_database = context->getCurrentDatabase();
data.create_query = ast;
data.global_context = global_context;
data.context = context;
DDLDependencyVisitor::Visitor visitor{data};
visitor.visit(ast);
data.dependencies.erase(data.table_name);

View File

@ -12,7 +12,7 @@ using TableNamesSet = std::unordered_set<QualifiedTableName>;
/// Returns a list of all tables explicitly referenced in the create query of a specified table.
/// For example, a column default expression can use dictGet() and thus reference a dictionary.
/// Does not validate AST, works a best-effort way.
TableNamesSet getDependenciesFromCreateQuery(const ContextPtr & global_context, const QualifiedTableName & table_name, const ASTPtr & ast);
TableNamesSet getDependenciesFromCreateQuery(const ContextPtr & context, const QualifiedTableName & table_name, const ASTPtr & ast);
/// Visits ASTCreateQuery and extracts the names of all tables explicitly referenced in the create query.
class DDLDependencyVisitor
@ -22,8 +22,8 @@ public:
{
ASTPtr create_query;
QualifiedTableName table_name;
String default_database;
ContextPtr global_context;
String current_database;
ContextPtr context;
TableNamesSet dependencies;
};