summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorkostja@bodhi.local <>2006-08-30 00:38:58 +0400
committerkostja@bodhi.local <>2006-08-30 00:38:58 +0400
commit3bf609b7f2b73555b1e241dc7c354818b0bbbc5a (patch)
treecdfe8a72e8e640072c7742e9aa8836f40a34ab72 /sql
parentcb4ea78cbdd1d64447b2879a8c8d968f3eb0aaa9 (diff)
downloadmariadb-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.cc27
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;
}
/****************************************************************************