diff options
author | kostja@bodhi.local <> | 2006-08-30 00:38:58 +0400 |
---|---|---|
committer | kostja@bodhi.local <> | 2006-08-30 00:38:58 +0400 |
commit | 3bf609b7f2b73555b1e241dc7c354818b0bbbc5a (patch) | |
tree | cdfe8a72e8e640072c7742e9aa8836f40a34ab72 /sql | |
parent | cb4ea78cbdd1d64447b2879a8c8d968f3eb0aaa9 (diff) | |
download | mariadb-git-3bf609b7f2b73555b1e241dc7c354818b0bbbc5a.tar.gz |
A fix for Bug#14897 "ResultSet.getString("table.column") sometimes
doesn't find the column"
When a user was using 4.1 tables with VARCHAR column and 5.0 server
and a query that used a temporary table to resolve itself, the
table metadata for the varchar column sent to client was incorrect:
MYSQL_FIELD::table member was empty.
The bug was caused by implicit "upgrade" from old VARCHAR to new
VARCHAR hard-coded in Field::new_field, which did not preserve
the information about the original table. Thus, the field metadata
of the "upgraded" field pointed to an auxiliary temporary table
created for query execution.
The fix is to copy the pointer to the original table to the new field.
Diffstat (limited to 'sql')
-rw-r--r-- | sql/field.cc | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/sql/field.cc b/sql/field.cc index 921148e8f0f..05eb7d2d744 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -6154,15 +6154,26 @@ Field *Field_string::new_field(MEM_ROOT *root, struct st_table *new_table, Field *new_field; if (type() != MYSQL_TYPE_VAR_STRING || keep_type) - return Field::new_field(root, new_table, keep_type); + new_field= Field::new_field(root, new_table, keep_type); + else + { - /* - Old VARCHAR field which should be modified to a VARCHAR on copy - This is done to ensure that ALTER TABLE will convert old VARCHAR fields - to now VARCHAR fields. - */ - return new Field_varstring(field_length, maybe_null(), - field_name, new_table, charset()); + /* + Old VARCHAR field which should be modified to a VARCHAR on copy + This is done to ensure that ALTER TABLE will convert old VARCHAR fields + to now VARCHAR fields. + */ + new_field= new Field_varstring(field_length, maybe_null(), + field_name, new_table, charset()); + /* + Normally orig_table is different from table only if field was created + via ::new_field. Here we alter the type of field, so ::new_field is + not applicable. But we still need to preserve the original field + metadata for the client-server protocol. + */ + new_field->orig_table= orig_table; + } + return new_field; } /**************************************************************************** |