1
1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2009 Sun Microsystems, Inc.
4
* Copyright (C) 2009 Sun Microsystems
6
6
* This program is free software; you can redistribute it and/or modify
7
7
* it under the terms of the GNU General Public License as published by
23
23
#include <drizzled/session.h>
24
24
#include <drizzled/lock.h>
25
25
#include <drizzled/statement/drop_table.h>
26
#include <drizzled/plugin/info_schema_table.h>
26
27
#include "drizzled/sql_table.h"
56
static bool rm_table(Session *session, TableList *tables, bool if_exists, bool drop_temporary)
57
static bool mysql_rm_table(Session *session, TableList *tables, bool if_exists, bool drop_temporary)
58
59
bool error, need_start_waiting= false;
62
* @todo this is a result of retaining the behavior that was here before. This should be removed
63
* and the correct error handling should be done in doDropTable for the I_S engine. There is an
64
* issue here with dropping tables with the same name as an I_S table. How do we know if we are
65
* attemping to drop an I_S table or a regular table with the same name as an I_S table? For now,
66
* we simply check if the current database is information_schema
68
plugin::InfoSchemaTable *sch_table= plugin::InfoSchemaTable::getTable(tables->table_name);
70
session->db.compare(INFORMATION_SCHEMA_NAME) == 0)
72
my_error(ER_DBACCESS_DENIED_ERROR, MYF(0), "", "", INFORMATION_SCHEMA_NAME.c_str());
60
76
/* mark for close and remove all cached entries */
62
if (not drop_temporary)
64
if (not (need_start_waiting= not session->wait_if_global_read_lock(false, true)))
80
if (!(need_start_waiting= !wait_if_global_read_lock(session, false, true)))
69
Acquire table::Cache::singleton().mutex() after wait_if_global_read_lock(). If we would hold
70
table::Cache::singleton().mutex() during wait_if_global_read_lock(), other threads could not
85
Acquire LOCK_open after wait_if_global_read_lock(). If we would hold
86
LOCK_open during wait_if_global_read_lock(), other threads could not
71
87
close their tables. This would make a pretty deadlock.
73
error= rm_table_part2(session, tables, if_exists, drop_temporary);
89
error= mysql_rm_table_part2(session, tables, if_exists, drop_temporary);
75
91
if (need_start_waiting)
77
session->startWaitingGlobalReadLock();
92
start_waiting_global_read_lock(session);
88
102
bool statement::DropTable::execute()
90
TableList *first_table= (TableList *) getSession()->lex->select_lex.table_list.first;
91
TableList *all_tables= getSession()->lex->query_tables;
104
TableList *first_table= (TableList *) session->lex->select_lex.table_list.first;
105
TableList *all_tables= session->lex->query_tables;
92
106
assert(first_table == all_tables && first_table != 0);
94
if (not drop_temporary)
107
if (! drop_temporary)
96
if (getSession()->inTransaction())
109
if (! session->endActiveTransaction())
98
my_error(ER_TRANSACTIONAL_DDL_NOT_SUPPORTED, MYF(0));
103
/* DDL and binlog write order protected by table::Cache::singleton().mutex() */
105
return rm_table(getSession(), first_table, drop_if_exists, drop_temporary);
114
/* DDL and binlog write order protected by LOCK_open */
115
bool res= mysql_rm_table(session,
108
122
} /* namespace drizzled */