From 3ef86918a20cb682bbc48b8f6e0848772d88f94c Mon Sep 17 00:00:00 2001 From: Sergey Glukhov Date: Thu, 5 Mar 2009 15:34:02 +0400 Subject: [PATCH] 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. --- mysql-test/r/variables.result | 5 +++++ mysql-test/t/variables.test | 7 +++++++ sql/item_func.cc | 11 ++++++++++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/variables.result b/mysql-test/r/variables.result index 0b56e3c1d52..b7ca918c38c 100644 --- a/mysql-test/r/variables.result +++ b/mysql-test/r/variables.result @@ -1389,3 +1389,8 @@ SET @@session.thread_stack= 7; ERROR HY000: Variable 'thread_stack' is a read only variable SET @@global.thread_stack= 7; 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 diff --git a/mysql-test/t/variables.test b/mysql-test/t/variables.test index 6cd5abc3ea2..2797bb3c801 100644 --- a/mysql-test/t/variables.test +++ b/mysql-test/t/variables.test @@ -1121,3 +1121,10 @@ SET @@session.thread_stack= 7; --error ER_INCORRECT_GLOBAL_LOCAL_VAR SET @@global.thread_stack= 7; # + +# +# Bug#41030 Wrong meta data (incorrect fieldlen) +# +--enable_metadata +select @@storage_engine; +--disable_metadata diff --git a/sql/item_func.cc b/sql/item_func.cc index ec95254baaa..67bf9b3319f 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -4837,7 +4837,10 @@ bool Item_func_get_system_var::is_written_to_binlog() void Item_func_get_system_var::fix_length_and_dec() { + char *cptr; + int well_formed_error; maybe_null=0; + max_length= 0; if (var->check_type(var_type)) { @@ -4867,8 +4870,14 @@ void Item_func_get_system_var::fix_length_and_dec() break; case SHOW_CHAR: 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); - max_length= MAX_BLOB_WIDTH; decimals=NOT_FIXED_DEC; break; case SHOW_BOOL: