"DECLARE CURSOR fk IS\n" "SELECT ID FROM SYS_FOREIGN\n" "WHERE FOR_NAME=:name\n" "AND TO_BINARY(FOR_NAME)=TO_BINARY(:name)\n" "FOR UPDATE;\n"
"BEGIN\n" "OPEN fk;\n" "WHILE 1=1 LOOP\n" " FETCH fk INTO fid;\n" " IF (SQL % NOTFOUND)THEN RETURN;END IF;\n" " DELETE FROM SYS_FOREIGN_COLS" " WHERE ID=fid;\n" " DELETE FROM SYS_FOREIGN WHERE ID=fid;\n" "END LOOP;\n" "CLOSE fk;\n" "END;\n", this);
}
/** Try to drop the statistics for a persistent table. @paramnamenameofpersistenttable
@return error code */
dberr_t trx_t::drop_table_statistics(const table_name_t &name)
{
ut_ad(dict_sys.locked());
ut_ad(dict_operation_lock_mode);
"DECLARE CURSOR idx IS\n" "SELECT ID FROM SYS_INDEXES\n" "WHERE TABLE_ID=:id FOR UPDATE;\n"
"BEGIN\n"
"DELETE FROM SYS_TABLES WHERE ID=:id;\n" "DELETE FROM SYS_COLUMNS WHERE TABLE_ID=:id;\n"
"OPEN idx;\n" "WHILE 1 = 1 LOOP\n" " FETCH idx INTO iid;\n" " IF (SQL % NOTFOUND) THEN EXIT; END IF;\n" " DELETE FROM SYS_INDEXES WHERE CURRENT OF idx;\n" " DELETE FROM SYS_FIELDS WHERE INDEX_ID=iid;\n" "END LOOP;\n" "CLOSE idx;\n"
"END;\n", trx);
}
/** Try to drop a persistent table. @paramtablepersistenttable @paramfkwhethertodropFOREIGNKEYmetadata
@return error code */
dberr_t trx_t::drop_table(const dict_table_t &table)
{
ut_ad(dict_sys.locked());
ut_ad(state == TRX_STATE_ACTIVE);
ut_ad(dict_operation);
ut_ad(dict_operation_lock_mode);
ut_ad(!table.is_temporary()); /* The table must be exclusively locked by this transaction. */
ut_ad(table.get_ref_count() <= 1);
ut_ad(table.n_lock_x_or_s == 1);
ut_ad(UT_LIST_GET_LEN(table.locks) >= 1); #ifdef UNIV_DEBUG bool found_x= false; for (lock_t *lock= UT_LIST_GET_FIRST(table.locks); lock;
lock= UT_LIST_GET_NEXT(un_member.tab_lock.locks, lock))
{
ut_ad(lock->trx == this); switch (lock->type_mode) { case LOCK_TABLE | LOCK_X:
found_x= true; break; case LOCK_TABLE | LOCK_IX: case LOCK_TABLE | LOCK_AUTO_INC: break; default:
ut_ad("unexpected lock type" == 0);
}
}
ut_ad(found_x); #endif
if (dict_sys.sys_virtual && !dict_sys.sys_virtual->corrupted)
{
pars_info_t *info= pars_info_create();
pars_info_add_ull_literal(info, "id", table.id); if (dberr_t err= que_eval_sql(info, "PROCEDURE DROP_VIRTUAL() IS\n" "BEGIN\n" "DELETE FROM SYS_VIRTUAL" " WHERE TABLE_ID=:id;\n" "END;\n", this)) return err;
}
/* Once DELETE FROM SYS_INDEXES is committed, purge may invoke
dict_drop_index_tree(). */
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.