#include #include #include #include #include #include #include #include #include #include #include namespace DB { namespace ErrorCodes { extern const int SYNTAX_ERROR; } BlockIO InterpreterExistsQuery::execute() { BlockIO res; res.in = executeImpl(); return res; } Block InterpreterExistsQuery::getSampleBlock() { return Block{{ ColumnUInt8::create(), std::make_shared(), "result" }}; } BlockInputStreamPtr InterpreterExistsQuery::executeImpl() { ASTQueryWithTableAndOutput * exists_query; bool result = false; if ((exists_query = query_ptr->as())) { if (exists_query->temporary) { context.checkAccess(AccessType::EXISTS, "", exists_query->table); result = context.isExternalTableExist(exists_query->table); } else { String database = context.resolveDatabase(exists_query->database); context.checkAccess(AccessType::EXISTS, database, exists_query->table); result = DatabaseCatalog::instance().isTableExist({database, exists_query->table}, context); } } else if ((exists_query = query_ptr->as())) { if (exists_query->temporary) throw Exception("Temporary dictionaries are not possible.", ErrorCodes::SYNTAX_ERROR); String database = context.resolveDatabase(exists_query->database); context.checkAccess(AccessType::EXISTS, database, exists_query->table); result = DatabaseCatalog::instance().isDictionaryExist({database, exists_query->table}, context); } return std::make_shared(Block{{ ColumnUInt8::create(1, result), std::make_shared(), "result" }}); } }