summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <stewart@willster.(none)>2006-10-23 23:43:48 +1000
committerunknown <stewart@willster.(none)>2006-10-23 23:43:48 +1000
commit50fe8e0c2b4655c1ae255a98176a14b8d4d903f5 (patch)
treebf1cf62e7c09d604fda3777f320649482de276e8 /sql
parent44a882f92540a51949485a08a0ced93d114fdfa9 (diff)
parent9076d70e5b6a73b9280b198382764849904c7f6f (diff)
downloadmariadb-git-50fe8e0c2b4655c1ae255a98176a14b8d4d903f5.tar.gz
Merge willster.(none):/home/stewart/Documents/MySQL/4.1/bug19914-mk2
into willster.(none):/home/stewart/Documents/MySQL/4.1/bug19914-mk2-merge2 sql/sql_select.cc: Auto merged
Diffstat (limited to 'sql')
-rw-r--r--sql/field.h2
-rw-r--r--sql/item.cc1
-rw-r--r--sql/share/english/errmsg.txt2
-rw-r--r--sql/sql_acl.cc6
-rw-r--r--sql/sql_parse.cc4
-rw-r--r--sql/sql_select.cc5
-rw-r--r--sql/table.cc15
-rw-r--r--sql/unireg.cc39
8 files changed, 52 insertions, 22 deletions
diff --git a/sql/field.h b/sql/field.h
index a33cb0a93aa..79fb7ff76d1 100644
--- a/sql/field.h
+++ b/sql/field.h
@@ -1192,6 +1192,8 @@ public:
uint decimals,flags,pack_length;
Field::utype unireg_check;
TYPELIB *interval; // Which interval to use
+ TYPELIB *save_interval; // Temporary copy for the above
+ // Used only for UCS2 intervals
List<String> interval_list;
CHARSET_INFO *charset;
Field::geometry_type geom_type;
diff --git a/sql/item.cc b/sql/item.cc
index 7c9f6ec77fb..94f0a24fcc3 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -387,6 +387,7 @@ void Item::split_sum_func2(THD *thd, Item **ref_pointer_array,
}
else if ((type() == SUM_FUNC_ITEM ||
(used_tables() & ~PARAM_TABLE_BIT)) &&
+ type() != SUBSELECT_ITEM &&
type() != REF_ITEM)
{
/*
diff --git a/sql/share/english/errmsg.txt b/sql/share/english/errmsg.txt
index 300f3c6edfd..a8b06a07218 100644
--- a/sql/share/english/errmsg.txt
+++ b/sql/share/english/errmsg.txt
@@ -184,7 +184,7 @@ character-set=latin1
"INSERT DELAYED can't be used with table '%-.64s' because it is locked with LOCK TABLES",
"Incorrect column name '%-.100s'",
"The used storage engine can't index column '%-.64s'",
-"All tables in the MERGE table are not identically defined",
+"Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exists",
"Can't write, because of unique constraint, to table '%-.64s'",
"BLOB/TEXT column '%-.64s' used in key specification without a key length",
"All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead",
diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc
index 6ede19d0e96..0ad5432f3eb 100644
--- a/sql/sql_acl.cc
+++ b/sql/sql_acl.cc
@@ -2640,11 +2640,7 @@ int mysql_grant(THD *thd, const char *db, List <LEX_USER> &list,
while ((Str = str_list++))
{
if (Str->host.length > HOSTNAME_LENGTH ||
- system_charset_info->cset->charpos(system_charset_info,
- Str->user.str,
- Str->user.str +
- Str->user.length,
- USERNAME_LENGTH) < Str->user.length)
+ Str->user.length > USERNAME_LENGTH)
{
my_error(ER_GRANT_WRONG_HOST_OR_USER,MYF(0));
result= -1;
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 59c4026ba7f..98199ed22f1 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -902,8 +902,8 @@ static int check_connection(THD *thd)
char *user= end;
char *passwd= strend(user)+1;
char *db= passwd;
- char db_buff[NAME_BYTE_LEN + 1]; // buffer to store db in utf8
- char user_buff[USERNAME_BYTE_LENGTH + 1]; // buffer to store user in utf8
+ char db_buff[NAME_LEN + 1]; // buffer to store db in utf8
+ char user_buff[USERNAME_LENGTH + 1]; // buffer to store user in utf8
uint dummy_errors;
/*
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index d36a6252adc..7b1ba984e9e 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -290,8 +290,6 @@ JOIN::prepare(Item ***rref_pointer_array,
select_lex->having_fix_field= 0;
if (having_fix_rc || thd->net.report_error)
DBUG_RETURN(-1); /* purecov: inspected */
- if (having->with_sum_func)
- having->split_sum_func2(thd, ref_pointer_array, all_fields, &having);
}
// Is it subselect
@@ -306,6 +304,9 @@ JOIN::prepare(Item ***rref_pointer_array,
}
}
+ if (having && having->with_sum_func)
+ having->split_sum_func2(thd, ref_pointer_array, all_fields, &having);
+
if (setup_ftfuncs(select_lex)) /* should be after having->fix_fields */
DBUG_RETURN(-1);
diff --git a/sql/table.cc b/sql/table.cc
index 7587531b2f9..0efed04c06e 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -77,6 +77,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
my_string record;
const char **int_array;
bool use_hash, null_field_first;
+ bool error_reported= FALSE;
File file;
Field **field_ptr,*reg_field;
KEY *keyinfo;
@@ -791,6 +792,11 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
error= 1;
my_errno= ENOENT;
}
+ else
+ {
+ outparam->file->print_error(err, MYF(0));
+ error_reported= TRUE;
+ }
goto err_not_open; /* purecov: inspected */
}
}
@@ -812,7 +818,8 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
err_end: /* Here when no file */
delete crypted;
*root_ptr= old_root;
- frm_error(error, outparam, name, ME_ERROR + ME_WAITTANG, errarg);
+ if (!error_reported)
+ frm_error(error, outparam, name, ME_ERROR + ME_WAITTANG, errarg);
delete outparam->file;
outparam->file=0; // For easyer errorchecking
outparam->db_stat=0;
@@ -1413,7 +1420,7 @@ char *get_field(MEM_ROOT *mem, Field *field)
bool check_db_name(char *name)
{
- uint name_length= 0; // name length in symbols
+ char *start= name;
/* Used to catch empty names and names with end space */
bool last_char_is_space= TRUE;
@@ -1430,7 +1437,6 @@ bool check_db_name(char *name)
name+system_charset_info->mbmaxlen);
if (len)
{
- name_length++;
name += len;
continue;
}
@@ -1438,13 +1444,12 @@ bool check_db_name(char *name)
#else
last_char_is_space= *name==' ';
#endif
- name_length++;
if (*name == '/' || *name == '\\' || *name == FN_LIBCHAR ||
*name == FN_EXTCHAR)
return 1;
name++;
}
- return (last_char_is_space || name_length > NAME_LEN);
+ return last_char_is_space || (uint) (name - start) > NAME_LEN;
}
diff --git a/sql/unireg.cc b/sql/unireg.cc
index e3bf763f700..e4fdc77912c 100644
--- a/sql/unireg.cc
+++ b/sql/unireg.cc
@@ -190,13 +190,19 @@ bool mysql_create_frm(THD *thd, my_string file_name,
goto err3;
{
- /* Unescape all UCS2 intervals: were escaped in pack_headers */
+ /*
+ Restore all UCS2 intervals.
+ HEX representation of them is not needed anymore.
+ */
List_iterator<create_field> it(create_fields);
create_field *field;
while ((field=it++))
{
- if (field->interval && field->charset->mbminlen > 1)
- unhex_type2(field->interval);
+ if (field->save_interval)
+ {
+ field->interval= field->save_interval;
+ field->save_interval= 0;
+ }
}
}
DBUG_RETURN(0);
@@ -452,18 +458,36 @@ static bool pack_header(uchar *forminfo, enum db_type table_type,
reclength=(uint) (field->offset+ data_offset + length);
n_length+= (ulong) strlen(field->field_name)+1;
field->interval_id=0;
+ field->save_interval= 0;
if (field->interval)
{
uint old_int_count=int_count;
if (field->charset->mbminlen > 1)
{
- /* Escape UCS2 intervals using HEX notation */
+ /*
+ Escape UCS2 intervals using HEX notation to avoid
+ problems with delimiters between enum elements.
+ As the original representation is still needed in
+ the function make_empty_rec to create a record of
+ filled with default values it is saved in save_interval
+ The HEX representation is created from this copy.
+ */
+ field->save_interval= field->interval;
+ field->interval= (TYPELIB*) sql_alloc(sizeof(TYPELIB));
+ *field->interval= *field->save_interval;
+ field->interval->type_names=
+ (const char **) sql_alloc(sizeof(char*) *
+ (field->interval->count+1));
+ field->interval->type_names[field->interval->count]= 0;
+ field->interval->type_lengths=
+ (uint *) sql_alloc(sizeof(uint) * field->interval->count);
+
for (uint pos= 0; pos < field->interval->count; pos++)
{
char *dst;
- uint length= field->interval->type_lengths[pos], hex_length;
- const char *src= field->interval->type_names[pos];
+ uint length= field->save_interval->type_lengths[pos], hex_length;
+ const char *src= field->save_interval->type_names[pos];
const char *srcend= src + length;
hex_length= length * 2;
field->interval->type_lengths[pos]= hex_length;
@@ -715,7 +739,8 @@ static bool make_empty_rec(File file,enum db_type table_type,
field->charset,
field->geom_type,
field->unireg_check,
- field->interval,
+ field->save_interval ? field->save_interval :
+ field->interval,
field->field_name,
&table);