summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <reggie@linux.site>2005-07-12 08:35:30 -0600
committerunknown <reggie@linux.site>2005-07-12 08:35:30 -0600
commit831e2c7f61f664b606d7702740665402a5a25ac3 (patch)
tree99f19fef27eb12da0b3709aab09ab4573a0b265a
parent8e9492f01ab2a00849fea3aa73648215069fb195 (diff)
downloadmariadb-git-831e2c7f61f664b606d7702740665402a5a25ac3.tar.gz
Bug #7142 Show Fields from fails using Borland's dbExpress interface
The problem here is that columns that have an especially long type such as an enum type with many options would be longer than 40 chars but the type column returned from show columns always was defined as varchar(40). This is fixed in 5.0 using info schema. mysql-test/r/ps_1general.result: update columns which will now be reported as blobs mysql-test/r/ps_2myisam.result: update columns which will now be reported as blobs mysql-test/r/ps_3innodb.result: update columns which will now be reported as blobs mysql-test/r/ps_4heap.result: update columns which will now be reported as blobs mysql-test/r/ps_5merge.result: update columns which will now be reported as blobs sql/item.cc: report a column as a particular blob type if it's size warrants sql/sql_show.cc: Add function to iterate over all the fields of a table and determine the longest type name. We call this function at the top of our show fields code. We pass in either 40 or max_len whichever is longer to the ctor of Item_empty_string. tests/mysql_client_test.c: update columns which will now be reported as blobs
-rw-r--r--mysql-test/r/ps_1general.result12
-rw-r--r--mysql-test/r/ps_2myisam.result6
-rw-r--r--mysql-test/r/ps_3innodb.result6
-rw-r--r--mysql-test/r/ps_4heap.result6
-rw-r--r--mysql-test/r/ps_5merge.result12
-rw-r--r--sql/item.cc9
-rw-r--r--sql/sql_show.cc31
-rw-r--r--tests/mysql_client_test.c6
8 files changed, 62 insertions, 26 deletions
diff --git a/mysql-test/r/ps_1general.result b/mysql-test/r/ps_1general.result
index db8dc2e60af..97af043d4f2 100644
--- a/mysql-test/r/ps_1general.result
+++ b/mysql-test/r/ps_1general.result
@@ -470,12 +470,12 @@ def id 8 3 1 N 32929 0 63
def select_type 253 19 6 N 1 31 8
def table 253 64 2 Y 0 31 8
def type 253 10 3 Y 0 31 8
-def possible_keys 253 4096 0 Y 0 31 8
+def possible_keys 252 4096 0 Y 0 31 8
def key 253 64 0 Y 0 31 8
def key_len 8 3 0 Y 32928 0 63
-def ref 253 1024 0 Y 0 31 8
+def ref 252 1024 0 Y 0 31 8
def rows 8 10 1 Y 32928 0 63
-def Extra 253 255 14 N 1 31 8
+def Extra 252 255 14 N 1 31 8
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using filesort
SET @arg00=1 ;
@@ -486,12 +486,12 @@ def id 8 3 1 N 32929 0 63
def select_type 253 19 6 N 1 31 8
def table 253 64 2 Y 0 31 8
def type 253 10 5 Y 0 31 8
-def possible_keys 253 4096 7 Y 0 31 8
+def possible_keys 252 4096 7 Y 0 31 8
def key 253 64 7 Y 0 31 8
def key_len 8 3 1 Y 32928 0 63
-def ref 253 1024 0 Y 0 31 8
+def ref 252 1024 0 Y 0 31 8
def rows 8 10 1 Y 32928 0 63
-def Extra 253 255 27 N 1 31 8
+def Extra 252 255 27 N 1 31 8
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 range PRIMARY PRIMARY 4 NULL 3 Using where; Using filesort
drop table if exists t2;
diff --git a/mysql-test/r/ps_2myisam.result b/mysql-test/r/ps_2myisam.result
index c569c9842f7..bae8143b8b5 100644
--- a/mysql-test/r/ps_2myisam.result
+++ b/mysql-test/r/ps_2myisam.result
@@ -1153,12 +1153,12 @@ def id 8 3 1 N 32929 0 63
def select_type 253 19 6 N 1 31 8
def table 253 64 2 Y 0 31 8
def type 253 10 3 Y 0 31 8
-def possible_keys 253 4096 0 Y 0 31 8
+def possible_keys 252 4096 0 Y 0 31 8
def key 253 64 0 Y 0 31 8
def key_len 8 3 0 Y 32928 0 63
-def ref 253 1024 0 Y 0 31 8
+def ref 252 1024 0 Y 0 31 8
def rows 8 10 1 Y 32928 0 63
-def Extra 253 255 0 N 1 31 8
+def Extra 252 255 0 N 1 31 8
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t9 ALL NULL NULL NULL NULL 2
drop table if exists t2 ;
diff --git a/mysql-test/r/ps_3innodb.result b/mysql-test/r/ps_3innodb.result
index 930aea2e381..8acbf070336 100644
--- a/mysql-test/r/ps_3innodb.result
+++ b/mysql-test/r/ps_3innodb.result
@@ -1153,12 +1153,12 @@ def id 8 3 1 N 32929 0 63
def select_type 253 19 6 N 1 31 8
def table 253 64 2 Y 0 31 8
def type 253 10 3 Y 0 31 8
-def possible_keys 253 4096 0 Y 0 31 8
+def possible_keys 252 4096 0 Y 0 31 8
def key 253 64 0 Y 0 31 8
def key_len 8 3 0 Y 32928 0 63
-def ref 253 1024 0 Y 0 31 8
+def ref 252 1024 0 Y 0 31 8
def rows 8 10 1 Y 32928 0 63
-def Extra 253 255 0 N 1 31 8
+def Extra 252 255 0 N 1 31 8
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t9 ALL NULL NULL NULL NULL 2
test_sequence
diff --git a/mysql-test/r/ps_4heap.result b/mysql-test/r/ps_4heap.result
index 083a4b221fe..314e644a675 100644
--- a/mysql-test/r/ps_4heap.result
+++ b/mysql-test/r/ps_4heap.result
@@ -1154,12 +1154,12 @@ def id 8 3 1 N 32929 0 63
def select_type 253 19 6 N 1 31 8
def table 253 64 2 Y 0 31 8
def type 253 10 3 Y 0 31 8
-def possible_keys 253 4096 0 Y 0 31 8
+def possible_keys 252 4096 0 Y 0 31 8
def key 253 64 0 Y 0 31 8
def key_len 8 3 0 Y 32928 0 63
-def ref 253 1024 0 Y 0 31 8
+def ref 252 1024 0 Y 0 31 8
def rows 8 10 1 Y 32928 0 63
-def Extra 253 255 0 N 1 31 8
+def Extra 252 255 0 N 1 31 8
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t9 ALL NULL NULL NULL NULL 2
test_sequence
diff --git a/mysql-test/r/ps_5merge.result b/mysql-test/r/ps_5merge.result
index 1edd617ffc6..9d620290f00 100644
--- a/mysql-test/r/ps_5merge.result
+++ b/mysql-test/r/ps_5merge.result
@@ -1196,12 +1196,12 @@ def id 8 3 1 N 32929 0 63
def select_type 253 19 6 N 1 31 8
def table 253 64 2 Y 0 31 8
def type 253 10 3 Y 0 31 8
-def possible_keys 253 4096 0 Y 0 31 8
+def possible_keys 252 4096 0 Y 0 31 8
def key 253 64 0 Y 0 31 8
def key_len 8 3 0 Y 32928 0 63
-def ref 253 1024 0 Y 0 31 8
+def ref 252 1024 0 Y 0 31 8
def rows 8 10 1 Y 32928 0 63
-def Extra 253 255 0 N 1 31 8
+def Extra 252 255 0 N 1 31 8
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t9 ALL NULL NULL NULL NULL 2
test_sequence
@@ -4210,12 +4210,12 @@ def id 8 3 1 N 32929 0 63
def select_type 253 19 6 N 1 31 8
def table 253 64 2 Y 0 31 8
def type 253 10 3 Y 0 31 8
-def possible_keys 253 4096 0 Y 0 31 8
+def possible_keys 252 4096 0 Y 0 31 8
def key 253 64 0 Y 0 31 8
def key_len 8 3 0 Y 32928 0 63
-def ref 253 1024 0 Y 0 31 8
+def ref 252 1024 0 Y 0 31 8
def rows 8 10 1 Y 32928 0 63
-def Extra 253 255 0 N 1 31 8
+def Extra 252 255 0 N 1 31 8
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t9 ALL NULL NULL NULL NULL 2
test_sequence
diff --git a/sql/item.cc b/sql/item.cc
index c96794ff482..d13127e4952 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -1768,7 +1768,14 @@ void Item::make_field(Send_field *tmp_field)
void Item_empty_string::make_field(Send_field *tmp_field)
{
- init_make_field(tmp_field,FIELD_TYPE_VAR_STRING);
+ enum_field_types type = FIELD_TYPE_VAR_STRING;
+ if (max_length >= 16777216)
+ type = FIELD_TYPE_LONG_BLOB;
+ else if (max_length >= 65536)
+ type = FIELD_TYPE_MEDIUM_BLOB;
+ else if (max_length >= 256)
+ type = FIELD_TYPE_BLOB;
+ init_make_field(tmp_field, type);
}
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index 7e0ee0dab68..03b12468b92 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -638,6 +638,30 @@ int mysqld_extend_show_tables(THD *thd,const char *db,const char *wild)
DBUG_RETURN(0);
}
+/*
+returns the length of the longest type on the given table.
+This is used so that show fields will return the data using the proper
+lengths instead of forcing columns such as type to always return with a
+given length.
+*/
+uint get_longest_type_in_table(TABLE *table, const char *wild)
+{
+ Field **ptr,*field;
+ char tmp[MAX_FIELD_WIDTH];
+ uint max_len = 0;
+
+ for (ptr=table->field; (field= *ptr); ptr++)
+ {
+ if (!wild || !wild[0] ||
+ !wild_case_compare(system_charset_info, field->field_name,wild))
+ {
+ String type(tmp,sizeof(tmp), system_charset_info);
+ field->sql_type(type);
+ max_len = max(max_len, type.length());
+ }
+ }
+ return max_len;
+}
/***************************************************************************
** List all columns in a table_list->real_name
@@ -667,9 +691,14 @@ mysqld_show_fields(THD *thd, TABLE_LIST *table_list,const char *wild,
#ifndef NO_EMBEDDED_ACCESS_CHECKS
(void) get_table_grant(thd, table_list);
#endif
+
+ /* we scan for the longest since long enum types can exceed 40 */
+ uint max_len = get_longest_type_in_table(table, wild);
+
List<Item> field_list;
field_list.push_back(new Item_empty_string("Field",NAME_LEN));
- field_list.push_back(new Item_empty_string("Type",40));
+ field_list.push_back(new Item_empty_string("Type",
+ max_len > 40 ? max_len : 40));
if (verbose)
field_list.push_back(new Item_empty_string("Collation",40));
field_list.push_back(new Item_empty_string("Null",1));
diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c
index dbee6e77e4f..b7232565e0b 100644
--- a/tests/mysql_client_test.c
+++ b/tests/mysql_client_test.c
@@ -7173,7 +7173,7 @@ static void test_explain_bug()
verify_prepare_field(result, 3, "type", "", MYSQL_TYPE_VAR_STRING,
"", "", "", 10, 0);
- verify_prepare_field(result, 4, "possible_keys", "", MYSQL_TYPE_VAR_STRING,
+ verify_prepare_field(result, 4, "possible_keys", "", MYSQL_TYPE_BLOB,
"", "", "", NAME_LEN*64, 0);
verify_prepare_field(result, 5, "key", "", MYSQL_TYPE_VAR_STRING,
@@ -7186,13 +7186,13 @@ static void test_explain_bug()
(mysql_get_server_version(mysql) <= 50000 ? 3 : 4096),
0);
- verify_prepare_field(result, 7, "ref", "", MYSQL_TYPE_VAR_STRING,
+ verify_prepare_field(result, 7, "ref", "", MYSQL_TYPE_BLOB,
"", "", "", NAME_LEN*16, 0);
verify_prepare_field(result, 8, "rows", "", MYSQL_TYPE_LONGLONG,
"", "", "", 10, 0);
- verify_prepare_field(result, 9, "Extra", "", MYSQL_TYPE_VAR_STRING,
+ verify_prepare_field(result, 9, "Extra", "", MYSQL_TYPE_BLOB,
"", "", "", 255, 0);
mysql_free_result(result);