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.
This commit is contained in:
unknown 2006-04-18 16:01:01 +02:00
commit 176cd14352
3 changed files with 69 additions and 12 deletions

View file

@ -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)