summaryrefslogtreecommitdiff
path: root/sql/field.h
diff options
context:
space:
mode:
authorunknown <dlenev@mysql.com>2004-09-27 00:50:00 +0400
committerunknown <dlenev@mysql.com>2004-09-27 00:50:00 +0400
commite6f924efe586cef418b6d77b950bdcd1ad97871b (patch)
treedf321ca2f8a091c79e9794c03059ee89e1ca3115 /sql/field.h
parent88fe390a721e4bc92918f8571cdf8961dc340796 (diff)
downloadmariadb-git-e6f924efe586cef418b6d77b950bdcd1ad97871b.tar.gz
Fix for bug #4131 "TIMESTAMP columns missing minutes and seconds when
using GROUP BY" Now we are setting Field_timestamp::field_length to 19 in open_table() if we are in new mode (and we are restoring it back when we are coming back to normal mode). This also should solve potential problems with some of LOAD DATA INFILE and SELECT * INTO in this mode. mysql-test/r/type_timestamp.result: Added test for bug #4131 'TIMESTAMP columns missing minutes and seconds when using GROUP BY' and other --new mode related behavior. mysql-test/t/type_timestamp.test: Added test for bug #4131 'TIMESTAMP columns missing minutes and seconds when using GROUP BY' and other --new mode related behavior. sql/field.cc: Added Field_timestamp::orig_field_length member for saving original field_length value, because this member can be modified if new_mode is in effect. Lot of Field_timestamp code simplified and Field_timestamp::make_field() is no longer needed because we are setting field_length to 19 if we are in --new mode now. sql/field.h: Added Field_timestamp::orig_field_length member for saving original field_length value, because this member can be modified if new_mode is in effect. Field_timestamp::make_field() is no longer needed because we are setting field_length to 19 if we are in --new mode now. sql/sql_base.cc: If --new mode is in effect all TIMESTAMP fields should pretend that they have length of 19. We are achieving this by setting Field_timestamp::field_length to 19 (or original value) in open_table(). We are using TABLE::timestamp_mode variable for avoiding of unnecessary looping over all fields of the table and setting field_length if table was used with same new_mode value before. Note: We do not introduce general framework for setting up Field objects for usage with current THD here because this fix is only needed in 4.0 and Monty said that we will also remove looping over all fields when updating table_name member at some point. This more general framework will also complicate nice optimization with avoiding of unneeded looping. sql/sql_parse.cc: Now when we are creating TIMESTAMP(19) fields by default in --new mode, otherwise we will have unaligned behavior between ALTER and CREATE. sql/table.h: Added TABLE::timestamp_mode field for saving information whenever we set field_length members of table's TIMESTAMP fields to 19 (to honor new_mode) or they have original values.
Diffstat (limited to 'sql/field.h')
-rw-r--r--sql/field.h13
1 files changed, 12 insertions, 1 deletions
diff --git a/sql/field.h b/sql/field.h
index d25ce8d4774..c42f5f63f0c 100644
--- a/sql/field.h
+++ b/sql/field.h
@@ -546,6 +546,13 @@ public:
class Field_timestamp :public Field_num {
+#if MYSQL_VERSION_ID < 40100
+ /*
+ We save the original field length here because field_length is
+ changed to a mock value in case when the 'new_mode' is in effect.
+ */
+ uint32 orig_field_length;
+#endif
public:
Field_timestamp(char *ptr_arg, uint32 len_arg,
enum utype unireg_check_arg, const char *field_name_arg,
@@ -587,7 +594,11 @@ public:
void fill_and_store(char *from,uint len);
bool get_date(TIME *ltime,bool fuzzydate);
bool get_time(TIME *ltime);
- void make_field(Send_field *field);
+
+#if MYSQL_VERSION_ID < 40100
+ friend TABLE *open_table(THD *thd,const char *db,const char *table_name,
+ const char *alias,bool *refresh);
+#endif
};