mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-03 13:02:00 +00:00
Fix passing dictionary's name to dictGet() with alias.
This commit is contained in:
parent
ce3c53a00a
commit
57bd7afc03
@ -471,7 +471,7 @@ void ActionsMatcher::visit(const ASTFunction & node, const ASTPtr & ast, Data &
|
||||
argument_types.push_back(column.type);
|
||||
argument_names.push_back(column.name);
|
||||
}
|
||||
else if (identifier && functionIsJoinGetOrDictGet(node.name) && arg == 0)
|
||||
else if (identifier && (functionIsJoinGet(node.name) || functionIsDictGet(node.name)) && arg == 0)
|
||||
{
|
||||
auto table_id = IdentifierSemantic::extractDatabaseAndTable(*identifier);
|
||||
table_id = data.context.resolveStorageID(table_id, Context::ResolveOrdinary);
|
||||
@ -480,7 +480,7 @@ void ActionsMatcher::visit(const ASTFunction & node, const ASTPtr & ast, Data &
|
||||
ColumnWithTypeAndName column(
|
||||
ColumnConst::create(std::move(column_string), 1),
|
||||
std::make_shared<DataTypeString>(),
|
||||
data.getUniqueName("__joinGetOrDictGet"));
|
||||
data.getUniqueName("__" + node.name));
|
||||
data.addAction(ExpressionAction::addColumn(column));
|
||||
argument_types.push_back(column.type);
|
||||
argument_names.push_back(column.name);
|
||||
|
@ -38,16 +38,18 @@ void MarkTableIdentifiersMatcher::visit(const ASTFunction & func, ASTPtr &, Data
|
||||
if (functionIsInOrGlobalInOperator(func.name))
|
||||
{
|
||||
auto & ast = func.arguments->children.at(1);
|
||||
if (auto opt_name = tryGetIdentifierName(ast))
|
||||
if (!data.aliases.count(*opt_name))
|
||||
setIdentifierSpecial(ast);
|
||||
auto opt_name = tryGetIdentifierName(ast);
|
||||
if (opt_name && !data.aliases.count(*opt_name))
|
||||
setIdentifierSpecial(ast);
|
||||
}
|
||||
|
||||
// first argument of joinGet can be a table identifier
|
||||
if (functionIsJoinGetOrDictGet(func.name))
|
||||
// First argument of joinGet can be a table name, perhaps with a database.
|
||||
// First argument of dictGet can be a dictionary name, perhaps with a database.
|
||||
if (functionIsJoinGet(func.name) || functionIsDictGet(func.name))
|
||||
{
|
||||
auto & ast = func.arguments->children.at(0);
|
||||
if (auto opt_name = tryGetIdentifierName(ast))
|
||||
auto opt_name = tryGetIdentifierName(ast);
|
||||
if (opt_name && !data.aliases.count(*opt_name))
|
||||
setIdentifierSpecial(ast);
|
||||
}
|
||||
}
|
||||
|
@ -20,9 +20,14 @@ inline bool functionIsLikeOperator(const std::string & name)
|
||||
return name == "like" || name == "notLike";
|
||||
}
|
||||
|
||||
inline bool functionIsJoinGetOrDictGet(const std::string & name)
|
||||
inline bool functionIsJoinGet(const std::string & name)
|
||||
{
|
||||
return name == "joinGet" || startsWith(name, "dictGet");
|
||||
}
|
||||
|
||||
inline bool functionIsDictGet(const std::string & name)
|
||||
{
|
||||
return startsWith(name, "dictGet") || (name == "dictHas") || (name == "dictIsIn");
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -20,4 +20,5 @@ database_for_dict dict2 Hashed
|
||||
6
|
||||
6
|
||||
6
|
||||
database_for_dict.dict3 6
|
||||
6
|
||||
|
@ -115,6 +115,9 @@ SELECT dictGet(database_for_dict.dict3, 'some_column', toUInt64(12));
|
||||
SELECT dictGet(default.dict3, 'some_column', toUInt64(12)); -- {serverError 36}
|
||||
USE default;
|
||||
|
||||
-- alias should be handled correctly
|
||||
SELECT 'database_for_dict.dict3' as n, dictGet(n, 'some_column', toUInt64(12));
|
||||
|
||||
DROP TABLE database_for_dict.table_for_dict;
|
||||
|
||||
SYSTEM RELOAD DICTIONARIES; -- {serverError 60}
|
||||
|
Loading…
Reference in New Issue
Block a user