diff --git a/src/Interpreters/ActionsVisitor.cpp b/src/Interpreters/ActionsVisitor.cpp index 81f19d0b3dc..7bb2dda0ab4 100644 --- a/src/Interpreters/ActionsVisitor.cpp +++ b/src/Interpreters/ActionsVisitor.cpp @@ -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 && node.name == "joinGet" && arg == 0) + else if (identifier && functionIsJoinGetOrDictGet(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(), - data.getUniqueName("__joinGet")); + data.getUniqueName("__joinGetOrDictGet")); data.addAction(ExpressionAction::addColumn(column)); argument_types.push_back(column.type); argument_names.push_back(column.name); diff --git a/src/Interpreters/MarkTableIdentifiersVisitor.cpp b/src/Interpreters/MarkTableIdentifiersVisitor.cpp index c68a7373680..93477064862 100644 --- a/src/Interpreters/MarkTableIdentifiersVisitor.cpp +++ b/src/Interpreters/MarkTableIdentifiersVisitor.cpp @@ -44,7 +44,7 @@ void MarkTableIdentifiersMatcher::visit(const ASTFunction & func, ASTPtr &, Data } // first argument of joinGet can be a table identifier - if (func.name == "joinGet") + if (functionIsJoinGetOrDictGet(func.name)) { auto & ast = func.arguments->children.at(0); if (auto opt_name = tryGetIdentifierName(ast)) diff --git a/src/Interpreters/misc.h b/src/Interpreters/misc.h index 0fd0e12a4bb..97cfbf252f9 100644 --- a/src/Interpreters/misc.h +++ b/src/Interpreters/misc.h @@ -1,5 +1,7 @@ #pragma once +#include + namespace DB { @@ -18,4 +20,9 @@ inline bool functionIsLikeOperator(const std::string & name) return name == "like" || name == "notLike"; } +inline bool functionIsJoinGetOrDictGet(const std::string & name) +{ + return name == "joinGet" || startsWith(name, "dictGet"); +} + } diff --git a/tests/queries/0_stateless/01018_ddl_dictionaries_select.reference b/tests/queries/0_stateless/01018_ddl_dictionaries_select.reference index a7f56f9ee03..7c13bf305ee 100644 --- a/tests/queries/0_stateless/01018_ddl_dictionaries_select.reference +++ b/tests/queries/0_stateless/01018_ddl_dictionaries_select.reference @@ -17,3 +17,7 @@ database_for_dict dict1 ComplexKeyCache database_for_dict dict2 Hashed 6 6 +6 +6 +6 +6 diff --git a/tests/queries/0_stateless/01018_ddl_dictionaries_select.sql b/tests/queries/0_stateless/01018_ddl_dictionaries_select.sql index 9b8edab4d41..f3dd7682ffd 100644 --- a/tests/queries/0_stateless/01018_ddl_dictionaries_select.sql +++ b/tests/queries/0_stateless/01018_ddl_dictionaries_select.sql @@ -105,6 +105,16 @@ LAYOUT(HASHED()); SELECT dictGetString('database_for_dict.dict3', 'some_column', toUInt64(12)); +-- dictGet with table name +USE database_for_dict; +SELECT dictGetString(dict3, 'some_column', toUInt64(12)); +SELECT dictGetString(database_for_dict.dict3, 'some_column', toUInt64(12)); +SELECT dictGetString(default.dict3, 'some_column', toUInt64(12)); -- {serverError 36} +SELECT dictGet(dict3, 'some_column', toUInt64(12)); +SELECT dictGet(database_for_dict.dict3, 'some_column', toUInt64(12)); +SELECT dictGet(default.dict3, 'some_column', toUInt64(12)); -- {serverError 36} +USE default; + DROP TABLE database_for_dict.table_for_dict; SYSTEM RELOAD DICTIONARIES; -- {serverError 60}