fix IF [NOT] EXISTS failure

This commit is contained in:
Alexander Tokmakov 2020-10-13 16:31:02 +03:00
parent dbaada5597
commit b3fc6d9b33
4 changed files with 17 additions and 24 deletions

View File

@ -47,7 +47,7 @@ BlockIO InterpreterDropQuery::execute()
if (!drop.table.empty()) if (!drop.table.empty())
{ {
if (!drop.is_dictionary) if (!drop.is_dictionary)
return executeToTable({drop.database, drop.table, drop.uuid}, drop); return executeToTable(drop);
else else
return executeToDictionary(drop.database, drop.table, drop.kind, drop.if_exists, drop.temporary, drop.no_ddl_lock); return executeToDictionary(drop.database, drop.table, drop.kind, drop.if_exists, drop.temporary, drop.no_ddl_lock);
} }
@ -58,29 +58,25 @@ BlockIO InterpreterDropQuery::execute()
} }
BlockIO InterpreterDropQuery::executeToTable( BlockIO InterpreterDropQuery::executeToTable(const ASTDropQuery & query)
const StorageID & table_id_,
const ASTDropQuery & query)
{ {
if (query.temporary || table_id_.database_name.empty()) auto table_id = StorageID(query);
if (query.temporary || table_id.database_name.empty())
{ {
if (context.tryResolveStorageID(table_id_, Context::ResolveExternal)) if (context.tryResolveStorageID(table_id, Context::ResolveExternal))
return executeToTemporaryTable(table_id_.getTableName(), query.kind); return executeToTemporaryTable(table_id.getTableName(), query.kind);
else
table_id.database_name = context.getCurrentDatabase();
} }
if (query.temporary) if (query.temporary)
{ {
if (query.if_exists) if (query.if_exists)
return {}; return {};
throw Exception("Temporary table " + backQuoteIfNeed(table_id_.table_name) + " doesn't exist", throw Exception("Temporary table " + backQuoteIfNeed(table_id.table_name) + " doesn't exist",
ErrorCodes::UNKNOWN_TABLE); ErrorCodes::UNKNOWN_TABLE);
} }
auto table_id = query.if_exists ? context.tryResolveStorageID(table_id_, Context::ResolveOrdinary)
: context.resolveStorageID(table_id_, Context::ResolveOrdinary);
if (!table_id)
return {};
auto ddl_guard = (!query.no_ddl_lock ? DatabaseCatalog::instance().getDDLGuard(table_id.database_name, table_id.table_name) : nullptr); auto ddl_guard = (!query.no_ddl_lock ? DatabaseCatalog::instance().getDDLGuard(table_id.database_name, table_id.table_name) : nullptr);
/// If table was already dropped by anyone, an exception will be thrown /// If table was already dropped by anyone, an exception will be thrown
@ -255,7 +251,7 @@ BlockIO InterpreterDropQuery::executeToDatabase(const String & database_name, AS
for (auto iterator = database->getTablesIterator(context); iterator->isValid(); iterator->next()) for (auto iterator = database->getTablesIterator(context); iterator->isValid(); iterator->next())
{ {
query.table = iterator->name(); query.table = iterator->name();
executeToTable({query.database, query.table}, query); executeToTable(query);
} }
} }

View File

@ -31,7 +31,7 @@ private:
BlockIO executeToDatabase(const String & database_name, ASTDropQuery::Kind kind, bool if_exists); BlockIO executeToDatabase(const String & database_name, ASTDropQuery::Kind kind, bool if_exists);
BlockIO executeToTable(const StorageID & table_id, const ASTDropQuery & query); BlockIO executeToTable(const ASTDropQuery & query);
BlockIO executeToDictionary(const String & database_name, const String & dictionary_name, ASTDropQuery::Kind kind, bool if_exists, bool is_temporary, bool no_ddl_lock); BlockIO executeToDictionary(const String & database_name, const String & dictionary_name, ASTDropQuery::Kind kind, bool if_exists, bool is_temporary, bool no_ddl_lock);

View File

@ -1,6 +1,2 @@
Testing TinyLog Testing Memory
Done TinyLog Done Memory
Testing StripeLog
Done StripeLog
Testing Log
Done Log

View File

@ -80,6 +80,7 @@ function test_with_engine {
echo "Done $1" echo "Done $1"
} }
test_with_engine TinyLog #test_with_engine TinyLog
test_with_engine StripeLog #test_with_engine StripeLog
test_with_engine Log #test_with_engine Log
test_with_engine Memory