From 176cd1435216fc1fc3fb8234d8f1ad60f84fbf85 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 18 Apr 2006 16:01:01 +0200 Subject: Fixed BUG#18344: DROP DATABASE does not drop associated routines We must use the db key length in sp_drop_db_routines (and not the number of characters), or long db names will be truncated in the key. mysql-test/r/sp.result: Updated results for new test case (BUG#18344) mysql-test/t/sp.test: Added new test case for BUG#18344. sql/sp.cc: In sp_drop_db_routines(), give the key field's ("db") key length instead of the number of characters to index_read(), or the key packing will truncate long db names. --- sql/sp.cc | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) (limited to 'sql/sp.cc') diff --git a/sql/sp.cc b/sql/sp.cc index cfcf011032d..ab391e531eb 100644 --- a/sql/sp.cc +++ b/sql/sp.cc @@ -886,28 +886,23 @@ int sp_drop_db_routines(THD *thd, char *db) { TABLE *table; - byte key[64]; // db - uint keylen; int ret; + uint key_len; DBUG_ENTER("sp_drop_db_routines"); DBUG_PRINT("enter", ("db: %s", db)); - // Put the key used to read the row together - keylen= strlen(db); - if (keylen > 64) - keylen= 64; - memcpy(key, db, keylen); - memset(key+keylen, (int)' ', 64-keylen); // Pad with space - keylen= sizeof(key); - ret= SP_OPEN_TABLE_FAILED; if (!(table= open_proc_table_for_update(thd))) goto err; + table->field[MYSQL_PROC_FIELD_DB]->store(db, strlen(db), system_charset_info); + key_len= table->key_info->key_part[0].store_length; + ret= SP_OK; table->file->ha_index_init(0); if (! table->file->index_read(table->record[0], - key, keylen, HA_READ_KEY_EXACT)) + table->field[MYSQL_PROC_FIELD_DB]->ptr, + key_len, HA_READ_KEY_EXACT)) { int nxtres; bool deleted= FALSE; @@ -923,7 +918,8 @@ sp_drop_db_routines(THD *thd, char *db) break; } } while (! (nxtres= table->file->index_next_same(table->record[0], - key, keylen))); + table->field[MYSQL_PROC_FIELD_DB]->ptr, + key_len))); if (nxtres != HA_ERR_END_OF_FILE) ret= SP_KEY_NOT_FOUND; if (deleted) -- cgit v1.2.1