mirror of
https://github.com/MariaDB/server.git
synced 2026-04-23 00:35:32 +02:00
Merge tsmith@bk-internal.mysql.com:/home/bk/mysql-5.1
into ramayana.hindu.god:/home/tsmith/m/bk/maint/51 sql/sql_acl.cc: Auto merged sql/sql_parse.cc: Auto merged sql/sql_table.cc: Auto merged mysql-test/r/grant.result: Manual merge mysql-test/t/grant.test: Manual merge
This commit is contained in:
commit
284cb0e560
73 changed files with 1222 additions and 259 deletions
|
|
@ -1798,7 +1798,8 @@ bool quick_rm_table(handlerton *base,const char *db,
|
|||
/*
|
||||
Sort keys in the following order:
|
||||
- PRIMARY KEY
|
||||
- UNIQUE keyws where all column are NOT NULL
|
||||
- UNIQUE keys where all column are NOT NULL
|
||||
- UNIQUE keys that don't contain partial segments
|
||||
- Other UNIQUE keys
|
||||
- Normal keys
|
||||
- Fulltext keys
|
||||
|
|
@ -1809,26 +1810,31 @@ bool quick_rm_table(handlerton *base,const char *db,
|
|||
|
||||
static int sort_keys(KEY *a, KEY *b)
|
||||
{
|
||||
if (a->flags & HA_NOSAME)
|
||||
ulong a_flags= a->flags, b_flags= b->flags;
|
||||
|
||||
if (a_flags & HA_NOSAME)
|
||||
{
|
||||
if (!(b->flags & HA_NOSAME))
|
||||
if (!(b_flags & HA_NOSAME))
|
||||
return -1;
|
||||
if ((a->flags ^ b->flags) & (HA_NULL_PART_KEY | HA_END_SPACE_KEY))
|
||||
if ((a_flags ^ b_flags) & (HA_NULL_PART_KEY | HA_END_SPACE_KEY))
|
||||
{
|
||||
/* Sort NOT NULL keys before other keys */
|
||||
return (a->flags & (HA_NULL_PART_KEY | HA_END_SPACE_KEY)) ? 1 : -1;
|
||||
return (a_flags & (HA_NULL_PART_KEY | HA_END_SPACE_KEY)) ? 1 : -1;
|
||||
}
|
||||
if (a->name == primary_key_name)
|
||||
return -1;
|
||||
if (b->name == primary_key_name)
|
||||
return 1;
|
||||
/* Sort keys don't containing partial segments before others */
|
||||
if ((a_flags ^ b_flags) & HA_KEY_HAS_PART_KEY_SEG)
|
||||
return (a_flags & HA_KEY_HAS_PART_KEY_SEG) ? 1 : -1;
|
||||
}
|
||||
else if (b->flags & HA_NOSAME)
|
||||
else if (b_flags & HA_NOSAME)
|
||||
return 1; // Prefer b
|
||||
|
||||
if ((a->flags ^ b->flags) & HA_FULLTEXT)
|
||||
if ((a_flags ^ b_flags) & HA_FULLTEXT)
|
||||
{
|
||||
return (a->flags & HA_FULLTEXT) ? 1 : -1;
|
||||
return (a_flags & HA_FULLTEXT) ? 1 : -1;
|
||||
}
|
||||
/*
|
||||
Prefer original key order. usable_key_parts contains here
|
||||
|
|
@ -2892,6 +2898,10 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
|
|||
else
|
||||
key_info->flags|= HA_PACK_KEY;
|
||||
}
|
||||
/* Check if the key segment is partial, set the key flag accordingly */
|
||||
if (length != sql_field->key_length)
|
||||
key_info->flags|= HA_KEY_HAS_PART_KEY_SEG;
|
||||
|
||||
key_length+=length;
|
||||
key_part_info++;
|
||||
|
||||
|
|
@ -2947,8 +2957,8 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
|
|||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
/* Sort keys in optimized order */
|
||||
qsort((uchar*) *key_info_buffer, *key_count, sizeof(KEY),
|
||||
(qsort_cmp) sort_keys);
|
||||
my_qsort((uchar*) *key_info_buffer, *key_count, sizeof(KEY),
|
||||
(qsort_cmp) sort_keys);
|
||||
create_info->null_bits= null_fields;
|
||||
|
||||
DBUG_RETURN(FALSE);
|
||||
|
|
@ -6879,23 +6889,35 @@ copy_data_between_tables(TABLE *from,TABLE *to,
|
|||
|
||||
if (order)
|
||||
{
|
||||
from->sort.io_cache=(IO_CACHE*) my_malloc(sizeof(IO_CACHE),
|
||||
MYF(MY_FAE | MY_ZEROFILL));
|
||||
bzero((char*) &tables,sizeof(tables));
|
||||
tables.table= from;
|
||||
tables.alias= tables.table_name= from->s->table_name.str;
|
||||
tables.db= from->s->db.str;
|
||||
error=1;
|
||||
if (to->s->primary_key != MAX_KEY && to->file->primary_key_is_clustered())
|
||||
{
|
||||
char warn_buff[MYSQL_ERRMSG_SIZE];
|
||||
my_snprintf(warn_buff, sizeof(warn_buff),
|
||||
"ORDER BY ignored as there is a user-defined clustered index"
|
||||
" in the table '%-.192s'", from->s->table_name.str);
|
||||
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR,
|
||||
warn_buff);
|
||||
}
|
||||
else
|
||||
{
|
||||
from->sort.io_cache=(IO_CACHE*) my_malloc(sizeof(IO_CACHE),
|
||||
MYF(MY_FAE | MY_ZEROFILL));
|
||||
bzero((char *) &tables, sizeof(tables));
|
||||
tables.table= from;
|
||||
tables.alias= tables.table_name= from->s->table_name.str;
|
||||
tables.db= from->s->db.str;
|
||||
error= 1;
|
||||
|
||||
if (thd->lex->select_lex.setup_ref_array(thd, order_num) ||
|
||||
setup_order(thd, thd->lex->select_lex.ref_pointer_array,
|
||||
&tables, fields, all_fields, order) ||
|
||||
!(sortorder=make_unireg_sortorder(order, &length, NULL)) ||
|
||||
(from->sort.found_records = filesort(thd, from, sortorder, length,
|
||||
(SQL_SELECT *) 0, HA_POS_ERROR, 1,
|
||||
&examined_rows)) ==
|
||||
HA_POS_ERROR)
|
||||
goto err;
|
||||
if (thd->lex->select_lex.setup_ref_array(thd, order_num) ||
|
||||
setup_order(thd, thd->lex->select_lex.ref_pointer_array,
|
||||
&tables, fields, all_fields, order) ||
|
||||
!(sortorder= make_unireg_sortorder(order, &length, NULL)) ||
|
||||
(from->sort.found_records= filesort(thd, from, sortorder, length,
|
||||
(SQL_SELECT *) 0, HA_POS_ERROR,
|
||||
1, &examined_rows)) ==
|
||||
HA_POS_ERROR)
|
||||
goto err;
|
||||
}
|
||||
};
|
||||
|
||||
/* Tell handler that we have values for all columns in the to table */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue