summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorgluh@gluh.mysql.r18.ru <>2005-01-26 20:58:47 +0300
committergluh@gluh.mysql.r18.ru <>2005-01-26 20:58:47 +0300
commita6315a8ad92912c6451340a5021c246d536f73e1 (patch)
treece72c4b6f3b4e4b848201c0c231079ecf906a3a1 /sql
parent849ef34156d6b08f4cc20eb3d2daf79babbfb79c (diff)
parenteb7b83807c1a162dfdec3d485576733e4e562161 (diff)
downloadmariadb-git-a6315a8ad92912c6451340a5021c246d536f73e1.tar.gz
Merge sgluhov@bk-internal.mysql.com:/home/bk/mysql-5.0
into gluh.mysql.r18.ru:/home/gluh/MySQL/mysql-5.0
Diffstat (limited to 'sql')
-rw-r--r--sql/field.h2
-rw-r--r--sql/filesort.cc4
-rw-r--r--sql/ha_ndbcluster.cc58
-rw-r--r--sql/ha_ndbcluster.h1
-rw-r--r--sql/item_create.cc5
-rw-r--r--sql/item_sum.cc6
-rw-r--r--sql/key.cc4
-rw-r--r--sql/mysql_priv.h1
-rw-r--r--sql/mysqld.cc10
-rw-r--r--sql/opt_range.cc2
-rw-r--r--sql/sql_acl.cc4
-rw-r--r--sql/sql_help.cc7
-rw-r--r--sql/sql_parse.cc2
-rw-r--r--sql/sql_select.cc9
-rw-r--r--sql/sql_table.cc3
-rw-r--r--sql/table.cc6
16 files changed, 81 insertions, 43 deletions
diff --git a/sql/field.h b/sql/field.h
index fd1ef09d14f..84d71afcd6f 100644
--- a/sql/field.h
+++ b/sql/field.h
@@ -1228,7 +1228,7 @@ public:
int cmp(const char *a, const char *b)
{ return cmp_binary(a, b); }
int key_cmp(const byte *a, const byte *b)
- { return cmp_binary(a, b); }
+ { return cmp_binary((char *) a, (char *) b); }
int key_cmp(const byte *str, uint length);
int cmp_offset(uint row_offset);
void get_key_image(char *buff, uint length, imagetype type);
diff --git a/sql/filesort.cc b/sql/filesort.cc
index 0e9fa8c79ed..1665358dbf0 100644
--- a/sql/filesort.cc
+++ b/sql/filesort.cc
@@ -1187,7 +1187,7 @@ sortlength(SORT_FIELD *sortorder, uint s_length, bool *multi_byte_charset)
{
sortorder->need_strxnfrm= 1;
*multi_byte_charset= 1;
- sortorder->length= sortorder->length*cs->strxfrm_multiply;
+ sortorder->length= cs->coll->strnxfrmlen(cs, sortorder->length);
}
}
if (sortorder->field->maybe_null())
@@ -1200,7 +1200,7 @@ sortlength(SORT_FIELD *sortorder, uint s_length, bool *multi_byte_charset)
sortorder->length=sortorder->item->max_length;
if (use_strnxfrm((cs=sortorder->item->collation.collation)))
{
- sortorder->length= sortorder->length*cs->strxfrm_multiply;
+ sortorder->length= cs->coll->strnxfrmlen(cs, sortorder->length);
sortorder->need_strxnfrm= 1;
*multi_byte_charset= 1;
}
diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc
index 5cca81b1200..cfd1698ae2d 100644
--- a/sql/ha_ndbcluster.cc
+++ b/sql/ha_ndbcluster.cc
@@ -852,6 +852,42 @@ int ha_ndbcluster::get_metadata(const char *path)
DBUG_RETURN(build_index_list(table, ILBP_OPEN));
}
+static int fix_unique_index_attr_order(NDB_INDEX_DATA &data,
+ const NDBINDEX *index,
+ KEY *key_info)
+{
+ DBUG_ENTER("fix_unique_index_attr_order");
+ unsigned sz= index->getNoOfIndexColumns();
+
+ if (data.unique_index_attrid_map)
+ my_free((char*)data.unique_index_attrid_map, MYF(0));
+ data.unique_index_attrid_map= (unsigned char*)my_malloc(sz,MYF(MY_WME));
+
+ KEY_PART_INFO* key_part= key_info->key_part;
+ KEY_PART_INFO* end= key_part+key_info->key_parts;
+ DBUG_ASSERT(key_info->key_parts == sz);
+ for (unsigned i= 0; key_part != end; key_part++, i++)
+ {
+ const char *field_name= key_part->field->field_name;
+ unsigned name_sz= strlen(field_name);
+ if (name_sz >= NDB_MAX_ATTR_NAME_SIZE)
+ name_sz= NDB_MAX_ATTR_NAME_SIZE-1;
+#ifndef DBUG_OFF
+ data.unique_index_attrid_map[i]= 255;
+#endif
+ for (unsigned j= 0; j < sz; j++)
+ {
+ const NdbDictionary::Column *c= index->getColumn(j);
+ if (strncmp(field_name, c->getName(), name_sz) == 0)
+ {
+ data.unique_index_attrid_map[i]= j;
+ break;
+ }
+ }
+ DBUG_ASSERT(data.unique_index_attrid_map[i] != 255);
+ }
+ DBUG_RETURN(0);
+}
int ha_ndbcluster::build_index_list(TABLE *tab, enum ILBP phase)
{
@@ -926,7 +962,8 @@ int ha_ndbcluster::build_index_list(TABLE *tab, enum ILBP phase)
const NDBINDEX *index= dict->getIndex(unique_index_name, m_tabname);
if (!index) DBUG_RETURN(1);
m_index[i].unique_index= (void *) index;
- }
+ error= fix_unique_index_attr_order(m_index[i], index, key_info);
+ }
}
DBUG_RETURN(error);
@@ -984,6 +1021,11 @@ void ha_ndbcluster::release_metadata()
{
m_index[i].unique_index= NULL;
m_index[i].index= NULL;
+ if (m_index[i].unique_index_attrid_map)
+ {
+ my_free((char *)m_index[i].unique_index_attrid_map, MYF(0));
+ m_index[i].unique_index_attrid_map= NULL;
+ }
}
DBUG_VOID_RETURN;
@@ -1152,7 +1194,7 @@ ha_ndbcluster::set_index_key(NdbOperation *op,
const byte* ptr= key_part->null_bit ? key_ptr + 1 : key_ptr;
char buf[256];
shrink_varchar(field, ptr, buf);
- if (set_ndb_key(op, field, i, ptr))
+ if (set_ndb_key(op, field, m_index[active_index].unique_index_attrid_map[i], ptr))
ERR_RETURN(m_active_trans->getNdbError());
key_ptr+= key_part->store_length;
}
@@ -1655,13 +1697,10 @@ int ha_ndbcluster::set_bounds(NdbIndexScanOperation *op,
// Set bound if not cancelled via type -1
if (p.bound_type != -1)
{
- char truncated_field_name[NDB_MAX_ATTR_NAME_SIZE];
- strnmov(truncated_field_name,field->field_name,sizeof(truncated_field_name));
- truncated_field_name[sizeof(truncated_field_name)-1]= '\0';
const char* ptr= p.bound_ptr;
char buf[256];
shrink_varchar(field, ptr, buf);
- if (op->setBound(truncated_field_name, p.bound_type, ptr))
+ if (op->setBound(i, p.bound_type, ptr))
ERR_RETURN(op->getNdbError());
}
}
@@ -3990,9 +4029,10 @@ ha_ndbcluster::ha_ndbcluster(TABLE *table_arg):
for (i= 0; i < MAX_KEY; i++)
{
- m_index[i].type= UNDEFINED_INDEX;
- m_index[i].unique_index= NULL;
- m_index[i].index= NULL;
+ m_index[i].type= UNDEFINED_INDEX;
+ m_index[i].unique_index= NULL;
+ m_index[i].index= NULL;
+ m_index[i].unique_index_attrid_map= NULL;
}
DBUG_VOID_RETURN;
diff --git a/sql/ha_ndbcluster.h b/sql/ha_ndbcluster.h
index 05bb5233664..942a4988252 100644
--- a/sql/ha_ndbcluster.h
+++ b/sql/ha_ndbcluster.h
@@ -51,6 +51,7 @@ typedef struct ndb_index_data {
NDB_INDEX_TYPE type;
void *index;
void *unique_index;
+ unsigned char *unique_index_attrid_map;
} NDB_INDEX_DATA;
typedef struct st_ndbcluster_share {
diff --git a/sql/item_create.cc b/sql/item_create.cc
index 8a5aeb6c9b7..9fb44658dd5 100644
--- a/sql/item_create.cc
+++ b/sql/item_create.cc
@@ -370,13 +370,14 @@ Item *create_func_space(Item *a)
{
uint dummy_errors;
sp= new Item_string("",0,cs);
- sp->str_value.copy(" ", 1, &my_charset_latin1, cs, &dummy_errors);
+ if (sp)
+ sp->str_value.copy(" ", 1, &my_charset_latin1, cs, &dummy_errors);
}
else
{
sp= new Item_string(" ",1,cs);
}
- return new Item_func_repeat(sp, a);
+ return sp ? new Item_func_repeat(sp, a) : 0;
}
Item *create_func_soundex(Item* a)
diff --git a/sql/item_sum.cc b/sql/item_sum.cc
index be89aa3f86d..29837c3afbd 100644
--- a/sql/item_sum.cc
+++ b/sql/item_sum.cc
@@ -1234,7 +1234,7 @@ int composite_key_cmp(void* arg, byte* key1, byte* key2)
{
Field* f = *field;
int len = *lengths++;
- int res = f->cmp(key1, key2);
+ int res = f->cmp((char *) key1, (char *) key2);
if (res)
return res;
key1 += len;
@@ -1688,7 +1688,7 @@ int group_concat_key_cmp_with_distinct(void* arg, byte* key1,
{
int res;
uint offset= (uint) (field->ptr - record);
- if ((res= field->cmp(key1 + offset, key2 + offset)))
+ if ((res= field->cmp((char *) key1 + offset, (char *) key2 + offset)))
return res;
}
}
@@ -1722,7 +1722,7 @@ int group_concat_key_cmp_with_order(void* arg, byte* key1, byte* key2)
{
int res;
uint offset= (uint) (field->ptr - record);
- if ((res= field->cmp(key1 + offset, key2 + offset)))
+ if ((res= field->cmp((char *) key1 + offset, (char *) key2 + offset)))
return (*order_item)->asc ? res : -res;
}
}
diff --git a/sql/key.cc b/sql/key.cc
index aec294e370a..c5ed60b129c 100644
--- a/sql/key.cc
+++ b/sql/key.cc
@@ -135,7 +135,7 @@ void key_copy(byte *to_key, byte *from_record, KEY *key_info, uint key_length)
{
key_length-= HA_KEY_BLOB_LENGTH;
length= min(key_length, key_part->length);
- key_part->field->get_key_image(to_key, length, Field::itRAW);
+ key_part->field->get_key_image((char *) to_key, length, Field::itRAW);
to_key+= HA_KEY_BLOB_LENGTH;
}
else
@@ -217,7 +217,7 @@ void key_restore(byte *to_record, byte *from_key, KEY *key_info,
{
key_length-= HA_KEY_BLOB_LENGTH;
length= min(key_length, key_part->length);
- key_part->field->set_key_image(from_key, length);
+ key_part->field->set_key_image((char *) from_key, length);
from_key+= HA_KEY_BLOB_LENGTH;
}
else
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index 5a222a1ce10..0349d9a635f 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -1002,7 +1002,6 @@ extern ulong table_cache_size;
extern ulong max_connections,max_connect_errors, connect_timeout;
extern ulong slave_net_timeout;
extern ulong max_user_connections;
-extern my_bool timed_mutexes;
extern ulong what_to_log,flush_time;
extern ulong query_buff_size, thread_stack,thread_stack_min;
extern ulong binlog_cache_size, max_binlog_cache_size, open_files_limit;
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 3195b442de3..e99acd7ed82 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -335,7 +335,6 @@ ulong binlog_cache_use= 0, binlog_cache_disk_use= 0;
ulong max_connections,max_used_connections,
max_connect_errors, max_user_connections = 0;
ulong thread_id=1L,current_pid;
-my_bool timed_mutexes= 0;
ulong slow_launch_threads = 0, sync_binlog_period;
ulong expire_logs_days = 0;
ulong rpl_recovery_rank=0;
@@ -3036,12 +3035,11 @@ You should consider changing lower_case_table_names to 1 or 2",
(test_if_case_insensitive(mysql_real_data_home) == 1)))
{
if (global_system_variables.log_warnings)
- sql_print_warning("\
-You have forced lower_case_table_names to 2 through a command-line \
-option, even though your file system '%s' is case sensitive. This means \
-that you can create a table that you can then no longer access. \
-You should consider changing lower_case_table_names to 0.",
+ sql_print_warning("lower_case_table_names was set to 2, even though your "
+ "the file system '%s' is case sensitive. Now setting "
+ "lower_case_table_names to 0 to avoid future problems.",
mysql_real_data_home);
+ lower_case_table_names= 0;
}
select_thread=pthread_self();
diff --git a/sql/opt_range.cc b/sql/opt_range.cc
index c3b84564504..e5799bfd509 100644
--- a/sql/opt_range.cc
+++ b/sql/opt_range.cc
@@ -1891,7 +1891,7 @@ double get_sweep_read_cost(const PARAM *param, ha_rows records)
else
{
double n_blocks=
- ceil((double)param->table->file->data_file_length / IO_SIZE);
+ ceil(ulonglong2double(param->table->file->data_file_length) / IO_SIZE);
double busy_blocks=
n_blocks * (1.0 - pow(1.0 - 1.0/n_blocks, rows2double(records)));
if (busy_blocks < 1.0)
diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc
index f9d95b2cde5..71d042eda02 100644
--- a/sql/sql_acl.cc
+++ b/sql/sql_acl.cc
@@ -1494,12 +1494,12 @@ static bool update_user_table(THD *thd, const char *host, const char *user,
DBUG_RETURN(1); /* purecov: deadcode */
table->field[0]->store(host,(uint) strlen(host), system_charset_info);
table->field[1]->store(user,(uint) strlen(user), system_charset_info);
- key_copy(user_key, table->record[0], table->key_info,
+ key_copy((byte *) user_key, table->record[0], table->key_info,
table->key_info->key_length);
table->file->extra(HA_EXTRA_RETRIEVE_ALL_COLS);
if (table->file->index_read_idx(table->record[0], 0,
- user_key, table->key_info->key_length,
+ (byte *) user_key, table->key_info->key_length,
HA_READ_KEY_EXACT))
{
my_message(ER_PASSWORD_NO_MATCH, ER(ER_PASSWORD_NO_MATCH),
diff --git a/sql/sql_help.cc b/sql/sql_help.cc
index 7bf28a439b6..759b535da53 100644
--- a/sql/sql_help.cc
+++ b/sql/sql_help.cc
@@ -558,8 +558,13 @@ SQL_SELECT *prepare_simple_select(THD *thd, Item *cond, TABLE_LIST *tables,
{
if (!cond->fixed)
cond->fix_fields(thd, tables, &cond); // can never fail
+
+ /* Assume that no indexes cover all required fields */
+ table->used_keys.clear_all();
+
SQL_SELECT *res= make_select(table,0,0,cond,error);
- if (*error || (res && res->check_quick(thd, 0, HA_POS_ERROR)))
+ if (*error || (res && res->check_quick(thd, 0, HA_POS_ERROR)) ||
+ (res->quick && res->quick->reset()))
{
delete res;
res=0;
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index ef976310ccb..9135635ddee 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -5378,7 +5378,7 @@ TABLE_LIST *st_select_lex::add_table_to_list(THD *thd,
Initialize a new table list for a nested join
SYNOPSIS
- init_table_list()
+ init_nested_join()
thd current thread
DESCRIPTION
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index d6e725341fe..8e6929fdddf 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -4473,16 +4473,9 @@ find_best(JOIN *join,table_map rest_tables,uint idx,double record_count,
x = used key parts (1 <= x <= c)
*/
double rec_per_key;
-#if 0
- if (!(rec_per_key=(double)
- keyinfo->rec_per_key[keyinfo->key_parts-1]))
- rec_per_key=(double) s->records/rec+1;
-#else
rec_per_key= keyinfo->rec_per_key[keyinfo->key_parts-1] ?
(double) keyinfo->rec_per_key[keyinfo->key_parts-1] :
(double) s->records/rec+1;
-#endif
-
if (!s->records)
tmp=0;
else if (rec_per_key/(double) s->records >= 0.01)
@@ -12962,7 +12955,7 @@ static void print_join(THD *thd, String *str, List<TABLE_LIST> *tables)
{
TABLE_LIST *curr= *tbl;
if (curr->outer_join)
- str->append(" left join ", 11); // MySQL converg right to left joins
+ str->append(" left join ", 11); // MySQL converts right to left joins
else if (curr->straight)
str->append(" straight_join ", 15);
else
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 9b2fb4a9c6a..88e840d1c4e 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -3375,7 +3375,8 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
}
/* Remove link to old table and rename the new one */
close_temporary_table(thd, table->s->db, table_name);
- if (rename_temporary_table(thd, new_table, new_db, new_alias))
+ /* Should pass the 'new_name' as we store table name in the cache */
+ if (rename_temporary_table(thd, new_table, new_db, new_name))
{ // Fatal error
close_temporary_table(thd,new_db,tmp_name);
my_free((gptr) new_table,MYF(0));
diff --git a/sql/table.cc b/sql/table.cc
index 82ad32341c0..69a132329c0 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -305,7 +305,7 @@ int openfrm(THD *thd, const char *name, const char *alias, uint db_stat,
if (!(record= (char *) alloc_root(&outparam->mem_root,
rec_buff_length * records)))
goto err; /* purecov: inspected */
- share->default_values= record;
+ share->default_values= (byte *) record;
if (my_pread(file,(byte*) record, (uint) share->reclength,
(ulong) (uint2korr(head+6)+
((uint2korr(head+14) == 0xffff ?
@@ -320,9 +320,9 @@ int openfrm(THD *thd, const char *name, const char *alias, uint db_stat,
}
else
{
- outparam->record[0]= record+ rec_buff_length;
+ outparam->record[0]= (byte *) record+ rec_buff_length;
if (records > 2)
- outparam->record[1]= record+ rec_buff_length*2;
+ outparam->record[1]= (byte *) record+ rec_buff_length*2;
else
outparam->record[1]= outparam->record[0]; // Safety
}