mirror of
https://github.com/MariaDB/server.git
synced 2026-05-06 15:15:34 +02:00
Merge mysql-5.5 -> mysql-5.5-innodb
This commit is contained in:
commit
e84efcaf3f
227 changed files with 4363 additions and 1784 deletions
|
|
@ -949,7 +949,7 @@ dict_table_rename_in_cache(
|
|||
dict_foreign_t* foreign;
|
||||
dict_index_t* index;
|
||||
ulint fold;
|
||||
char old_name[MAX_TABLE_NAME_LEN + 1];
|
||||
char old_name[MAX_FULL_NAME_LEN + 1];
|
||||
|
||||
ut_ad(table);
|
||||
ut_ad(mutex_own(&(dict_sys->mutex)));
|
||||
|
|
@ -961,7 +961,7 @@ dict_table_rename_in_cache(
|
|||
ut_print_timestamp(stderr);
|
||||
fprintf(stderr, "InnoDB: too long table name: '%s', "
|
||||
"max length is %d\n", table->name,
|
||||
MAX_TABLE_NAME_LEN);
|
||||
MAX_FULL_NAME_LEN);
|
||||
ut_error;
|
||||
}
|
||||
|
||||
|
|
@ -1011,11 +1011,11 @@ dict_table_rename_in_cache(
|
|||
ut_fold_string(old_name), table);
|
||||
|
||||
if (strlen(new_name) > strlen(table->name)) {
|
||||
/* We allocate MAX_TABLE_NAME_LEN+1 bytes here to avoid
|
||||
/* We allocate MAX_FULL_NAME_LEN + 1 bytes here to avoid
|
||||
memory fragmentation, we assume a repeated calls of
|
||||
ut_realloc() with the same size do not cause fragmentation */
|
||||
ut_a(strlen(new_name) <= MAX_TABLE_NAME_LEN);
|
||||
table->name = ut_realloc(table->name, MAX_TABLE_NAME_LEN + 1);
|
||||
ut_a(strlen(new_name) <= MAX_FULL_NAME_LEN);
|
||||
table->name = ut_realloc(table->name, MAX_FULL_NAME_LEN + 1);
|
||||
}
|
||||
memcpy(table->name, new_name, strlen(new_name) + 1);
|
||||
|
||||
|
|
|
|||
|
|
@ -6251,6 +6251,17 @@ create_table_def(
|
|||
DBUG_RETURN(HA_ERR_GENERIC);
|
||||
}
|
||||
|
||||
/* MySQL does the name length check. But we do additional check
|
||||
on the name length here */
|
||||
if (strlen(table_name) > MAX_FULL_NAME_LEN) {
|
||||
push_warning_printf(
|
||||
(THD*) trx->mysql_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_TABLE_NAME,
|
||||
"InnoDB: Table Name or Database Name is too long");
|
||||
|
||||
DBUG_RETURN(ER_TABLE_NAME);
|
||||
}
|
||||
|
||||
n_cols = form->s->fields;
|
||||
|
||||
/* We pass 0 as the space id, and determine at a lower level the space
|
||||
|
|
|
|||
|
|
@ -765,16 +765,7 @@ fill_innodb_locks_from_cache(
|
|||
for (i = 0; i < rows_num; i++) {
|
||||
|
||||
i_s_locks_row_t* row;
|
||||
|
||||
/* note that the decoded database or table name is
|
||||
never expected to be longer than NAME_LEN;
|
||||
NAME_LEN for database name
|
||||
2 for surrounding quotes around database name
|
||||
NAME_LEN for table name
|
||||
2 for surrounding quotes around table name
|
||||
1 for the separating dot (.)
|
||||
9 for the #mysql50# prefix */
|
||||
char buf[2 * NAME_LEN + 14];
|
||||
char buf[MAX_FULL_NAME_LEN + 1];
|
||||
const char* bufend;
|
||||
|
||||
char lock_trx_id[TRX_ID_MAX_LEN + 1];
|
||||
|
|
|
|||
|
|
@ -311,6 +311,18 @@ number does not include a terminating '\0'. InnoDB probably can handle
|
|||
longer names internally */
|
||||
#define MAX_TABLE_NAME_LEN 192
|
||||
|
||||
/* The maximum length of a database name. Like MAX_TABLE_NAME_LEN this is
|
||||
the MySQL's NAME_LEN, see check_and_convert_db_name(). */
|
||||
#define MAX_DATABASE_NAME_LEN MAX_TABLE_NAME_LEN
|
||||
|
||||
/* MAX_FULL_NAME_LEN defines the full name path including the
|
||||
database name and table name. In addition, 14 bytes is added for:
|
||||
2 for surrounding quotes around table name
|
||||
1 for the separating dot (.)
|
||||
9 for the #mysql50# prefix */
|
||||
#define MAX_FULL_NAME_LEN \
|
||||
(MAX_TABLE_NAME_LEN + MAX_DATABASE_NAME_LEN + 14)
|
||||
|
||||
/*
|
||||
UNIVERSAL TYPE DEFINITIONS
|
||||
==========================
|
||||
|
|
|
|||
|
|
@ -93,6 +93,25 @@ ib_vector_get(
|
|||
ib_vector_t* vec, /*!< in: vector */
|
||||
ulint n); /*!< in: element index to get */
|
||||
|
||||
/****************************************************************//**
|
||||
Get last element. The vector must not be empty.
|
||||
@return last element */
|
||||
UNIV_INLINE
|
||||
void*
|
||||
ib_vector_get_last(
|
||||
/*===============*/
|
||||
ib_vector_t* vec); /*!< in: vector */
|
||||
|
||||
/****************************************************************//**
|
||||
Set the n'th element. */
|
||||
UNIV_INLINE
|
||||
void
|
||||
ib_vector_set(
|
||||
/*==========*/
|
||||
ib_vector_t* vec, /*!< in/out: vector */
|
||||
ulint n, /*!< in: element index to set */
|
||||
void* elem); /*!< in: data element */
|
||||
|
||||
/****************************************************************//**
|
||||
Remove the last element from the vector. */
|
||||
UNIV_INLINE
|
||||
|
|
|
|||
|
|
@ -50,6 +50,35 @@ ib_vector_get(
|
|||
return(vec->data[n]);
|
||||
}
|
||||
|
||||
/****************************************************************//**
|
||||
Get last element. The vector must not be empty.
|
||||
@return last element */
|
||||
UNIV_INLINE
|
||||
void*
|
||||
ib_vector_get_last(
|
||||
/*===============*/
|
||||
ib_vector_t* vec) /*!< in: vector */
|
||||
{
|
||||
ut_a(vec->used > 0);
|
||||
|
||||
return(vec->data[vec->used - 1]);
|
||||
}
|
||||
|
||||
/****************************************************************//**
|
||||
Set the n'th element. */
|
||||
UNIV_INLINE
|
||||
void
|
||||
ib_vector_set(
|
||||
/*==========*/
|
||||
ib_vector_t* vec, /*!< in/out: vector */
|
||||
ulint n, /*!< in: element index to set */
|
||||
void* elem) /*!< in: data element */
|
||||
{
|
||||
ut_a(n < vec->used);
|
||||
|
||||
vec->data[n] = elem;
|
||||
}
|
||||
|
||||
/****************************************************************//**
|
||||
Remove the last element from the vector.
|
||||
@return last vector element */
|
||||
|
|
|
|||
|
|
@ -3621,6 +3621,80 @@ lock_table_create(
|
|||
return(lock);
|
||||
}
|
||||
|
||||
/*************************************************************//**
|
||||
Pops autoinc lock requests from the transaction's autoinc_locks. We
|
||||
handle the case where there are gaps in the array and they need to
|
||||
be popped off the stack. */
|
||||
UNIV_INLINE
|
||||
void
|
||||
lock_table_pop_autoinc_locks(
|
||||
/*=========================*/
|
||||
trx_t* trx) /*!< in/out: transaction that owns the AUTOINC locks */
|
||||
{
|
||||
ut_ad(mutex_own(&kernel_mutex));
|
||||
ut_ad(!ib_vector_is_empty(trx->autoinc_locks));
|
||||
|
||||
/* Skip any gaps, gaps are NULL lock entries in the
|
||||
trx->autoinc_locks vector. */
|
||||
|
||||
do {
|
||||
ib_vector_pop(trx->autoinc_locks);
|
||||
|
||||
if (ib_vector_is_empty(trx->autoinc_locks)) {
|
||||
return;
|
||||
}
|
||||
|
||||
} while (ib_vector_get_last(trx->autoinc_locks) == NULL);
|
||||
}
|
||||
|
||||
/*************************************************************//**
|
||||
Removes an autoinc lock request from the transaction's autoinc_locks. */
|
||||
UNIV_INLINE
|
||||
void
|
||||
lock_table_remove_autoinc_lock(
|
||||
/*===========================*/
|
||||
lock_t* lock, /*!< in: table lock */
|
||||
trx_t* trx) /*!< in/out: transaction that owns the lock */
|
||||
{
|
||||
lock_t* autoinc_lock;
|
||||
lint i = ib_vector_size(trx->autoinc_locks) - 1;
|
||||
|
||||
ut_ad(mutex_own(&kernel_mutex));
|
||||
ut_ad(lock_get_mode(lock) == LOCK_AUTO_INC);
|
||||
ut_ad(lock_get_type_low(lock) & LOCK_TABLE);
|
||||
ut_ad(!ib_vector_is_empty(trx->autoinc_locks));
|
||||
|
||||
/* With stored functions and procedures the user may drop
|
||||
a table within the same "statement". This special case has
|
||||
to be handled by deleting only those AUTOINC locks that were
|
||||
held by the table being dropped. */
|
||||
|
||||
autoinc_lock = ib_vector_get(trx->autoinc_locks, i);
|
||||
|
||||
/* This is the default fast case. */
|
||||
|
||||
if (autoinc_lock == lock) {
|
||||
lock_table_pop_autoinc_locks(trx);
|
||||
} else {
|
||||
/* The last element should never be NULL */
|
||||
ut_a(autoinc_lock != NULL);
|
||||
|
||||
/* Handle freeing the locks from within the stack. */
|
||||
|
||||
while (--i >= 0) {
|
||||
autoinc_lock = ib_vector_get(trx->autoinc_locks, i);
|
||||
|
||||
if (UNIV_LIKELY(autoinc_lock == lock)) {
|
||||
ib_vector_set(trx->autoinc_locks, i, NULL);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Must find the autoinc lock. */
|
||||
ut_error;
|
||||
}
|
||||
}
|
||||
|
||||
/*************************************************************//**
|
||||
Removes a table lock request from the queue and the trx list of locks;
|
||||
this is a low-level function which does NOT check if waiting requests
|
||||
|
|
@ -3660,10 +3734,8 @@ lock_table_remove_low(
|
|||
|
||||
if (!lock_get_wait(lock)
|
||||
&& !ib_vector_is_empty(trx->autoinc_locks)) {
|
||||
lock_t* autoinc_lock;
|
||||
|
||||
autoinc_lock = ib_vector_pop(trx->autoinc_locks);
|
||||
ut_a(autoinc_lock == lock);
|
||||
lock_table_remove_autoinc_lock(lock, trx);
|
||||
}
|
||||
|
||||
ut_a(table->n_waiting_or_granted_auto_inc_locks > 0);
|
||||
|
|
|
|||
|
|
@ -2388,7 +2388,7 @@ row_merge_rename_tables(
|
|||
{
|
||||
ulint err = DB_ERROR;
|
||||
pars_info_t* info;
|
||||
char old_name[MAX_TABLE_NAME_LEN + 1];
|
||||
char old_name[MAX_FULL_NAME_LEN + 1];
|
||||
|
||||
ut_ad(trx->mysql_thread_id == os_thread_get_curr_id());
|
||||
ut_ad(old_table != new_table);
|
||||
|
|
@ -2403,7 +2403,7 @@ row_merge_rename_tables(
|
|||
ut_print_timestamp(stderr);
|
||||
fprintf(stderr, "InnoDB: too long table name: '%s', "
|
||||
"max length is %d\n", old_table->name,
|
||||
MAX_TABLE_NAME_LEN);
|
||||
MAX_FULL_NAME_LEN);
|
||||
ut_error;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -269,7 +269,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
|||
keyseg->type != HA_KEYTYPE_VARBINARY2)
|
||||
{
|
||||
my_errno=HA_WRONG_CREATE_OPTION;
|
||||
goto err;
|
||||
goto err_no_lock;
|
||||
}
|
||||
}
|
||||
keydef->keysegs+=sp_segs;
|
||||
|
|
@ -278,7 +278,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
|||
min_key_length_skip+=SPLEN*2*SPDIMS;
|
||||
#else
|
||||
my_errno= HA_ERR_UNSUPPORTED;
|
||||
goto err;
|
||||
goto err_no_lock;
|
||||
#endif /*HAVE_SPATIAL*/
|
||||
}
|
||||
else if (keydef->flag & HA_FULLTEXT)
|
||||
|
|
@ -294,7 +294,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
|||
keyseg->type != HA_KEYTYPE_VARTEXT2)
|
||||
{
|
||||
my_errno=HA_WRONG_CREATE_OPTION;
|
||||
goto err;
|
||||
goto err_no_lock;
|
||||
}
|
||||
if (!(keyseg->flag & HA_BLOB_PART) &&
|
||||
(keyseg->type == HA_KEYTYPE_VARTEXT1 ||
|
||||
|
|
@ -419,7 +419,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
|||
if (keydef->keysegs > MI_MAX_KEY_SEG)
|
||||
{
|
||||
my_errno=HA_WRONG_CREATE_OPTION;
|
||||
goto err;
|
||||
goto err_no_lock;
|
||||
}
|
||||
/*
|
||||
key_segs may be 0 in the case when we only want to be able to
|
||||
|
|
@ -444,7 +444,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
|||
length >= MI_MAX_KEY_BUFF)
|
||||
{
|
||||
my_errno=HA_WRONG_CREATE_OPTION;
|
||||
goto err;
|
||||
goto err_no_lock;
|
||||
}
|
||||
set_if_bigger(max_key_block_length,keydef->block_length);
|
||||
keydef->keylength= (uint16) key_length;
|
||||
|
|
@ -491,7 +491,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
|||
"indexes and/or unique constraints.",
|
||||
MYF(0), name + dirname_length(name));
|
||||
my_errno= HA_WRONG_CREATE_OPTION;
|
||||
goto err;
|
||||
goto err_no_lock;
|
||||
}
|
||||
|
||||
bmove(share.state.header.file_version,(uchar*) myisam_file_magic,4);
|
||||
|
|
@ -810,12 +810,14 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
|||
errpos=0;
|
||||
mysql_mutex_unlock(&THR_LOCK_myisam);
|
||||
if (mysql_file_close(file, MYF(0)))
|
||||
goto err;
|
||||
goto err_no_lock;
|
||||
my_free(rec_per_key_part);
|
||||
DBUG_RETURN(0);
|
||||
|
||||
err:
|
||||
mysql_mutex_unlock(&THR_LOCK_myisam);
|
||||
|
||||
err_no_lock:
|
||||
save_errno=my_errno;
|
||||
switch (errpos) {
|
||||
case 3:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue