Commit 90edf372 authored by konstantin@mysql.com's avatar konstantin@mysql.com

Merge bk-internal.mysql.com:/home/bk/mysql-5.0

into  mysql.com:/opt/local/work/mysql-5.0-runtime
parents b11c033f af62c4a9
...@@ -900,6 +900,27 @@ execute stmt using @like; ...@@ -900,6 +900,27 @@ execute stmt using @like;
deallocate prepare stmt; deallocate prepare stmt;
drop table t1; drop table t1;
#
# Bug#13134 "Length of VARCHAR() utf8 column is increasing when table is
# recreated with PS/SP"
#
prepare stmt from 'create table t1 (a varchar(10) character set utf8)';
execute stmt;
--disable_warnings
insert into t1 (a) values (repeat('a', 20));
--enable_warnings
select length(a) from t1;
drop table t1;
execute stmt;
--disable_warnings
insert into t1 (a) values (repeat('a', 20));
--enable_warnings
# Check that the data is truncated to the same length
select length(a) from t1;
drop table t1;
deallocate prepare stmt;
# End of 4.1 tests # End of 4.1 tests
# #
......
...@@ -8213,13 +8213,11 @@ void Field_bit_as_char::sql_type(String &res) const ...@@ -8213,13 +8213,11 @@ void Field_bit_as_char::sql_type(String &res) const
create_field::create_length_to_internal_length() create_field::create_length_to_internal_length()
DESCRIPTION DESCRIPTION
Convert create_field::length from number of characters to number of bytes, Convert create_field::length from number of characters to number of bytes.
save original value in chars_length.
*/ */
void create_field::create_length_to_internal_length(void) void create_field::create_length_to_internal_length(void)
{ {
chars_length= length;
switch (sql_type) { switch (sql_type) {
case MYSQL_TYPE_TINY_BLOB: case MYSQL_TYPE_TINY_BLOB:
case MYSQL_TYPE_MEDIUM_BLOB: case MYSQL_TYPE_MEDIUM_BLOB:
...@@ -8937,6 +8935,7 @@ create_field::create_field(Field *old_field,Field *orig_field) ...@@ -8937,6 +8935,7 @@ create_field::create_field(Field *old_field,Field *orig_field)
else else
interval=0; interval=0;
def=0; def=0;
char_length= length;
if (!(flags & (NO_DEFAULT_VALUE_FLAG | BLOB_FLAG)) && if (!(flags & (NO_DEFAULT_VALUE_FLAG | BLOB_FLAG)) &&
old_field->ptr && orig_field && old_field->ptr && orig_field &&
......
...@@ -1386,9 +1386,10 @@ class create_field :public Sql_alloc ...@@ -1386,9 +1386,10 @@ class create_field :public Sql_alloc
*/ */
ulong length; ulong length;
/* /*
The value of 'length' before a call to create_length_to_internal_length The value of `length' as set by parser: is the number of characters
for most of the types, or of bytes for BLOBs or numeric types.
*/ */
uint32 chars_length; uint32 char_length;
uint decimals, flags, pack_length, key_length; uint decimals, flags, pack_length, key_length;
Field::utype unireg_check; Field::utype unireg_check;
TYPELIB *interval; // Which interval to use TYPELIB *interval; // Which interval to use
......
...@@ -3594,7 +3594,6 @@ mark_common_columns(THD *thd, TABLE_LIST *table_ref_1, TABLE_LIST *table_ref_2, ...@@ -3594,7 +3594,6 @@ mark_common_columns(THD *thd, TABLE_LIST *table_ref_1, TABLE_LIST *table_ref_2,
{ {
Field_iterator_table_ref it_1, it_2; Field_iterator_table_ref it_1, it_2;
Natural_join_column *nj_col_1, *nj_col_2; Natural_join_column *nj_col_1, *nj_col_2;
const char *field_name_1;
Query_arena *arena, backup; Query_arena *arena, backup;
bool add_columns= TRUE; bool add_columns= TRUE;
bool result= TRUE; bool result= TRUE;
...@@ -3627,6 +3626,7 @@ mark_common_columns(THD *thd, TABLE_LIST *table_ref_1, TABLE_LIST *table_ref_2, ...@@ -3627,6 +3626,7 @@ mark_common_columns(THD *thd, TABLE_LIST *table_ref_1, TABLE_LIST *table_ref_2,
{ {
bool is_created_1; bool is_created_1;
bool found= FALSE; bool found= FALSE;
const char *field_name_1;
if (!(nj_col_1= it_1.get_or_create_column_ref(&is_created_1))) if (!(nj_col_1= it_1.get_or_create_column_ref(&is_created_1)))
goto err; goto err;
field_name_1= nj_col_1->name(); field_name_1= nj_col_1->name();
...@@ -3823,7 +3823,6 @@ store_natural_using_join_columns(THD *thd, TABLE_LIST *natural_using_join, ...@@ -3823,7 +3823,6 @@ store_natural_using_join_columns(THD *thd, TABLE_LIST *natural_using_join,
{ {
Field_iterator_table_ref it_1, it_2; Field_iterator_table_ref it_1, it_2;
Natural_join_column *nj_col_1, *nj_col_2; Natural_join_column *nj_col_1, *nj_col_2;
bool is_created;
Query_arena *arena, backup; Query_arena *arena, backup;
bool result= TRUE; bool result= TRUE;
List<Natural_join_column> *non_join_columns; List<Natural_join_column> *non_join_columns;
......
...@@ -5791,6 +5791,7 @@ bool add_field_to_list(THD *thd, char *field_name, enum_field_types type, ...@@ -5791,6 +5791,7 @@ bool add_field_to_list(THD *thd, char *field_name, enum_field_types type,
interval_list, cs, uint_geom_type)) interval_list, cs, uint_geom_type))
DBUG_RETURN(1); DBUG_RETURN(1);
new_field->char_length= new_field->length;
lex->create_list.push_back(new_field); lex->create_list.push_back(new_field);
lex->last_field=new_field; lex->last_field=new_field;
DBUG_RETURN(0); DBUG_RETURN(0);
......
...@@ -174,7 +174,9 @@ typedef struct st_rollup ...@@ -174,7 +174,9 @@ typedef struct st_rollup
class JOIN :public Sql_alloc class JOIN :public Sql_alloc
{ {
public: JOIN(const JOIN &rhs); /* not implemented */
JOIN& operator=(const JOIN &rhs); /* not implemented */
public:
JOIN_TAB *join_tab,**best_ref; JOIN_TAB *join_tab,**best_ref;
JOIN_TAB **map2table; // mapping between table indexes and JOIN_TABs JOIN_TAB **map2table; // mapping between table indexes and JOIN_TABs
JOIN_TAB *join_tab_save; // saved join_tab for subquery reexecution JOIN_TAB *join_tab_save; // saved join_tab for subquery reexecution
...@@ -286,12 +288,6 @@ class JOIN :public Sql_alloc ...@@ -286,12 +288,6 @@ class JOIN :public Sql_alloc
init(thd_arg, fields_arg, select_options_arg, result_arg); init(thd_arg, fields_arg, select_options_arg, result_arg);
} }
JOIN(JOIN &join)
:fields_list(join.fields_list)
{
init(join.thd, join.fields_list, join.select_options,
join.result);
}
void init(THD *thd_arg, List<Item> &fields_arg, ulonglong select_options_arg, void init(THD *thd_arg, List<Item> &fields_arg, ulonglong select_options_arg,
select_result *result_arg) select_result *result_arg)
......
...@@ -688,6 +688,12 @@ static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info, ...@@ -688,6 +688,12 @@ static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
{ {
CHARSET_INFO *save_cs; CHARSET_INFO *save_cs;
/*
Initialize length from its original value (number of characters),
which was set in the parser. This is necessary if we're
executing a prepared statement for the second time.
*/
sql_field->length= sql_field->char_length;
if (!sql_field->charset) if (!sql_field->charset)
sql_field->charset= create_info->default_table_charset; sql_field->charset= create_info->default_table_charset;
/* /*
...@@ -872,7 +878,7 @@ static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info, ...@@ -872,7 +878,7 @@ static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
sql_field->charset= (dup_field->charset ? sql_field->charset= (dup_field->charset ?
dup_field->charset : dup_field->charset :
create_info->default_table_charset); create_info->default_table_charset);
sql_field->length= dup_field->chars_length; sql_field->length= dup_field->char_length;
sql_field->pack_length= dup_field->pack_length; sql_field->pack_length= dup_field->pack_length;
sql_field->key_length= dup_field->key_length; sql_field->key_length= dup_field->key_length;
sql_field->create_length_to_internal_length(); sql_field->create_length_to_internal_length();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment