ClickHouse/src/Interpreters/InterpreterExistsQuery.cpp

78 lines
2.3 KiB
C++
Raw Normal View History

#include <Storages/IStorage.h>
#include <Parsers/TablePropertiesQueriesASTs.h>
#include <DataStreams/OneBlockInputStream.h>
#include <DataStreams/BlockIO.h>
#include <DataStreams/copyData.h>
#include <DataTypes/DataTypesNumber.h>
#include <Columns/ColumnsNumber.h>
2017-05-23 18:01:50 +00:00
#include <Interpreters/Context.h>
#include <Interpreters/InterpreterExistsQuery.h>
#include <Access/AccessFlags.h>
2017-07-13 20:58:19 +00:00
#include <Common/typeid_cast.h>
2016-12-12 07:24:56 +00:00
namespace DB
{
namespace ErrorCodes
{
extern const int SYNTAX_ERROR;
}
2016-12-12 07:24:56 +00:00
BlockIO InterpreterExistsQuery::execute()
{
BlockIO res;
res.in = executeImpl();
return res;
2016-12-12 07:24:56 +00:00
}
Block InterpreterExistsQuery::getSampleBlock()
{
return Block{{
ColumnUInt8::create(),
std::make_shared<DataTypeUInt8>(),
"result" }};
2016-12-12 07:24:56 +00:00
}
BlockInputStreamPtr InterpreterExistsQuery::executeImpl()
{
ASTQueryWithTableAndOutput * exists_query;
bool result = false;
2019-12-15 06:34:43 +00:00
if ((exists_query = query_ptr->as<ASTExistsTableQuery>()))
{
if (exists_query->temporary)
2020-01-24 16:20:36 +00:00
{
2020-03-13 15:41:36 +00:00
result = context.tryResolveStorageID({"", exists_query->table}, Context::ResolveExternal);
2020-01-24 16:20:36 +00:00
}
else
2020-01-24 16:20:36 +00:00
{
2020-02-17 13:52:59 +00:00
String database = context.resolveDatabase(exists_query->database);
context.checkAccess(AccessType::SHOW_TABLES, database, exists_query->table);
2020-05-28 23:01:18 +00:00
result = DatabaseCatalog::instance().isTableExist({database, exists_query->table}, context);
2020-01-24 16:20:36 +00:00
}
}
2020-12-24 09:16:47 +00:00
else if ((exists_query = query_ptr->as<ASTExistsDatabaseQuery>()))
{
String database = context.resolveDatabase(exists_query->database);
context.checkAccess(AccessType::SHOW_DATABASES, database);
result = DatabaseCatalog::instance().isDatabaseExist(database);
}
2019-12-15 06:34:43 +00:00
else if ((exists_query = query_ptr->as<ASTExistsDictionaryQuery>()))
{
if (exists_query->temporary)
throw Exception("Temporary dictionaries are not possible.", ErrorCodes::SYNTAX_ERROR);
2020-02-17 13:52:59 +00:00
String database = context.resolveDatabase(exists_query->database);
context.checkAccess(AccessType::SHOW_DICTIONARIES, database, exists_query->table);
2020-03-13 15:41:36 +00:00
result = DatabaseCatalog::instance().isDictionaryExist({database, exists_query->table});
}
2016-12-12 07:24:56 +00:00
return std::make_shared<OneBlockInputStream>(Block{{
ColumnUInt8::create(1, result),
std::make_shared<DataTypeUInt8>(),
"result" }});
2016-12-12 07:24:56 +00:00
}
}