Commit 3ef86918 authored by Sergey Glukhov's avatar Sergey Glukhov

Bug#41030 Wrong meta data (incorrect fieldlen)

set user variable max length on
fix_length_and_dec() stage
using real value length.


mysql-test/r/variables.result:
  test result
mysql-test/t/variables.test:
  test case
sql/item_func.cc:
  set user variable max length on
  fix_length_and_dec() stage
  using real value length.
parent 326de495
...@@ -1389,3 +1389,8 @@ SET @@session.thread_stack= 7; ...@@ -1389,3 +1389,8 @@ SET @@session.thread_stack= 7;
ERROR HY000: Variable 'thread_stack' is a read only variable ERROR HY000: Variable 'thread_stack' is a read only variable
SET @@global.thread_stack= 7; SET @@global.thread_stack= 7;
ERROR HY000: Variable 'thread_stack' is a read only variable ERROR HY000: Variable 'thread_stack' is a read only variable
select @@storage_engine;
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
def @@storage_engine 253 6 6 N 1 31 8
@@storage_engine
MyISAM
...@@ -1121,3 +1121,10 @@ SET @@session.thread_stack= 7; ...@@ -1121,3 +1121,10 @@ SET @@session.thread_stack= 7;
--error ER_INCORRECT_GLOBAL_LOCAL_VAR --error ER_INCORRECT_GLOBAL_LOCAL_VAR
SET @@global.thread_stack= 7; SET @@global.thread_stack= 7;
# #
#
# Bug#41030 Wrong meta data (incorrect fieldlen)
#
--enable_metadata
select @@storage_engine;
--disable_metadata
...@@ -4837,7 +4837,10 @@ bool Item_func_get_system_var::is_written_to_binlog() ...@@ -4837,7 +4837,10 @@ bool Item_func_get_system_var::is_written_to_binlog()
void Item_func_get_system_var::fix_length_and_dec() void Item_func_get_system_var::fix_length_and_dec()
{ {
char *cptr;
int well_formed_error;
maybe_null=0; maybe_null=0;
max_length= 0;
if (var->check_type(var_type)) if (var->check_type(var_type))
{ {
...@@ -4867,8 +4870,14 @@ void Item_func_get_system_var::fix_length_and_dec() ...@@ -4867,8 +4870,14 @@ void Item_func_get_system_var::fix_length_and_dec()
break; break;
case SHOW_CHAR: case SHOW_CHAR:
case SHOW_CHAR_PTR: case SHOW_CHAR_PTR:
pthread_mutex_lock(&LOCK_global_system_variables);
cptr= var->show_type() == SHOW_CHAR_PTR ?
*(char**) var->value_ptr(current_thd, var_type, &component) :
(char*) var->value_ptr(current_thd, var_type, &component);
if (cptr)
max_length= strlen(cptr) * system_charset_info->mbmaxlen;
pthread_mutex_unlock(&LOCK_global_system_variables);
collation.set(system_charset_info, DERIVATION_SYSCONST); collation.set(system_charset_info, DERIVATION_SYSCONST);
max_length= MAX_BLOB_WIDTH;
decimals=NOT_FIXED_DEC; decimals=NOT_FIXED_DEC;
break; break;
case SHOW_BOOL: case SHOW_BOOL:
......
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