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.is_dictionary)
return executeToTable({drop.database, drop.table, drop.uuid}, drop);
return executeToTable(drop);
else
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(
const StorageID & table_id_,
const ASTDropQuery & query)
BlockIO InterpreterDropQuery::executeToTable(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))
return executeToTemporaryTable(table_id_.getTableName(), query.kind);
if (context.tryResolveStorageID(table_id, Context::ResolveExternal))
return executeToTemporaryTable(table_id.getTableName(), query.kind);
else
table_id.database_name = context.getCurrentDatabase();
}
if (query.temporary)
{
if (query.if_exists)
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);
}
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);
/// 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())
{
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 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);

View File

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

View File

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