summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <monty@mysql.com>2004-12-02 14:47:14 +0200
committerunknown <monty@mysql.com>2004-12-02 14:47:14 +0200
commit35f9ecc1ceaf1ecdc989ec31f057603f5d51ed84 (patch)
treebdf1d0bf0dbc1d45ea86f192333d02aaa83df074 /sql
parent646deed9f7b46e1ff27b4b37b85675c88deb3596 (diff)
parent93cf297fcb932aaaf1c006d7066ec453c9a907cb (diff)
downloadmariadb-git-35f9ecc1ceaf1ecdc989ec31f057603f5d51ed84.tar.gz
merged on pull
mysql-test/r/rpl_start_stop_slave.result: Auto merged sql/field.cc: Auto merged sql/item_cmpfunc.cc: Auto merged sql/mysql_priv.h: Auto merged sql/sql_table.cc: Auto merged mysql-test/r/type_enum.result: merged test cases mysql-test/t/type_enum.test: merged test cases
Diffstat (limited to 'sql')
-rw-r--r--sql/field.cc60
-rw-r--r--sql/item_cmpfunc.cc12
-rw-r--r--sql/mysql_priv.h2
-rw-r--r--sql/set_var.cc9
-rw-r--r--sql/sql_table.cc14
5 files changed, 58 insertions, 39 deletions
diff --git a/sql/field.cc b/sql/field.cc
index db4b8f352c7..b9c9b269070 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -5842,25 +5842,47 @@ bool Field_num::eq_def(Field *field)
void create_field::create_length_to_internal_length(void)
{
- switch (sql_type)
+ switch (sql_type) {
+ case MYSQL_TYPE_TINY_BLOB:
+ case MYSQL_TYPE_MEDIUM_BLOB:
+ case MYSQL_TYPE_LONG_BLOB:
+ case MYSQL_TYPE_BLOB:
+ case MYSQL_TYPE_VAR_STRING:
+ case MYSQL_TYPE_STRING:
+ length*= charset->mbmaxlen;
+ pack_length= calc_pack_length(sql_type == FIELD_TYPE_VAR_STRING ?
+ FIELD_TYPE_STRING : sql_type, length);
+ break;
+#ifdef CORRECT_CODE_BUT_CANT_YET_BE_USED
+ case MYSQL_TYPE_ENUM:
+ case MYSQL_TYPE_SET:
+ length*= charset->mbmaxlen;
+ break;
+#else
+ /*
+ Because of a bug in MySQL 4.1 where length was extended for ENUM and SET
+ fields for every ALTER TABLE, we have to recalculate lengths here
+ */
+ case MYSQL_TYPE_ENUM:
{
- case MYSQL_TYPE_TINY_BLOB:
- case MYSQL_TYPE_MEDIUM_BLOB:
- case MYSQL_TYPE_LONG_BLOB:
- case MYSQL_TYPE_BLOB:
- case MYSQL_TYPE_VAR_STRING:
- case MYSQL_TYPE_STRING:
- length*= charset->mbmaxlen;
- pack_length= calc_pack_length(sql_type == FIELD_TYPE_VAR_STRING ?
- FIELD_TYPE_STRING : sql_type, length);
- break;
- case MYSQL_TYPE_ENUM:
- case MYSQL_TYPE_SET:
- length*= charset->mbmaxlen;
- break;
- default:
- /* do nothing */
- break;
+ uint32 tot_length, max_length;
+ calculate_interval_lengths(current_thd, interval,
+ &max_length, &tot_length);
+ length= max_length * charset->mbmaxlen;
+ break;
+ }
+ case MYSQL_TYPE_SET:
+ {
+ uint32 tot_length, max_length;
+ calculate_interval_lengths(current_thd, interval,
+ &max_length, &tot_length);
+ length= (tot_length + (interval->count - 1)) * charset->mbmaxlen;
+ break;
+ }
+#endif
+ default:
+ /* do nothing */
+ break;
}
}
@@ -6085,6 +6107,8 @@ create_field::create_field(Field *old_field,Field *orig_field)
}
length=(length+charset->mbmaxlen-1)/charset->mbmaxlen; // QQ: Probably not needed
break;
+ case MYSQL_TYPE_ENUM:
+ case MYSQL_TYPE_SET:
case FIELD_TYPE_STRING:
case FIELD_TYPE_VAR_STRING:
length=(length+charset->mbmaxlen-1)/charset->mbmaxlen;
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc
index ac43b36600d..705258847c8 100644
--- a/sql/item_cmpfunc.cc
+++ b/sql/item_cmpfunc.cc
@@ -2365,10 +2365,10 @@ Item_func_regex::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
}
int error;
if ((error= regcomp(&preg,res->c_ptr(),
- ((cmp_collation.collation->state & MY_CS_BINSORT) ||
- (cmp_collation.collation->state & MY_CS_CSSORT)) ?
+ ((cmp_collation.collation->state &
+ (MY_CS_BINSORT | MY_CS_CSSORT)) ?
REG_EXTENDED | REG_NOSUB :
- REG_EXTENDED | REG_NOSUB | REG_ICASE,
+ REG_EXTENDED | REG_NOSUB | REG_ICASE),
cmp_collation.collation)))
{
(void) regerror(error,&preg,buff,sizeof(buff));
@@ -2417,10 +2417,10 @@ longlong Item_func_regex::val_int()
regex_compiled=0;
}
if (regcomp(&preg,res2->c_ptr(),
- ((cmp_collation.collation->state & MY_CS_BINSORT) ||
- (cmp_collation.collation->state & MY_CS_CSSORT)) ?
+ ((cmp_collation.collation->state &
+ (MY_CS_BINSORT | MY_CS_CSSORT)) ?
REG_EXTENDED | REG_NOSUB :
- REG_EXTENDED | REG_NOSUB | REG_ICASE,
+ REG_EXTENDED | REG_NOSUB | REG_ICASE),
cmp_collation.collation))
{
null_value=1;
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index 3a19a903e00..b4f19a54de2 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -370,6 +370,8 @@ int insert_precheck(THD *thd, TABLE_LIST *tables);
int create_table_precheck(THD *thd, TABLE_LIST *tables,
TABLE_LIST *create_table);
Item *negate_expression(THD *thd, Item *expr);
+void calculate_interval_lengths(THD *thd, TYPELIB *interval,
+ uint *max_length, uint *tot_length);
#include "sql_class.h"
#include "opt_range.h"
diff --git a/sql/set_var.cc b/sql/set_var.cc
index 2031ac15412..79be4dc1c46 100644
--- a/sql/set_var.cc
+++ b/sql/set_var.cc
@@ -2725,24 +2725,23 @@ sys_var *find_sys_var(const char *str, uint length)
int sql_set_variables(THD *thd, List<set_var_base> *var_list)
{
- int error= 0;
+ int error;
List_iterator_fast<set_var_base> it(*var_list);
DBUG_ENTER("sql_set_variables");
set_var_base *var;
while ((var=it++))
{
- if ((error=var->check(thd)))
+ if ((error= var->check(thd)))
goto err;
}
- if (!thd->net.report_error)
+ if (!(error= test(thd->net.report_error)))
{
it.rewind();
while ((var= it++))
error|= var->update(thd); // Returns 0, -1 or 1
}
- else
- error= 1;
+
err:
free_underlaid_joins(thd, &thd->lex->select_lex);
DBUG_RETURN(error);
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index a304e821ecd..71ce9102fbb 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -934,8 +934,7 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
DBUG_RETURN(-1);
}
}
- else
- if (key_info->algorithm == HA_KEY_ALG_RTREE)
+ else if (key_info->algorithm == HA_KEY_ALG_RTREE)
{
#ifdef HAVE_RTREE_KEYS
if ((key_info->key_parts & 1) == 1)
@@ -959,6 +958,8 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
CHARSET_INFO *ft_key_charset=0; // for FULLTEXT
for (uint column_nr=0 ; (column=cols++) ; column_nr++)
{
+ key_part_spec *dup_column;
+
it.rewind();
field=0;
while ((sql_field=it++) &&
@@ -973,9 +974,8 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
column->field_name);
DBUG_RETURN(-1);
}
- for (uint dup_nr= 0; dup_nr < column_nr; dup_nr++)
+ while ((dup_column= cols2++) != column)
{
- key_part_spec *dup_column= cols2++;
if (!my_strcasecmp(system_charset_info,
column->field_name, dup_column->field_name))
{
@@ -986,12 +986,6 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
}
}
cols2.rewind();
- /* for fulltext keys keyseg length is 1 for blobs (it's ignored in
- ft code anyway, and 0 (set to column width later) for char's.
- it has to be correct col width for char's, as char data are not
- prefixed with length (unlike blobs, where ft code takes data length
- from a data prefix, ignoring column->length).
- */
if (key->type == Key::FULLTEXT)
{
if ((sql_field->sql_type != FIELD_TYPE_STRING &&