From 22f6c58bb148fad71595d122635071ebbfb9f32c Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 28 Mar 2005 23:36:25 +0400 Subject: [PATCH] Fix for bug #8894 "TIMESTAMP values scrambled/misaligned when using --new". Fixed Field_timestamp::val_int() so now it works correctly in --new mode (or for TIMESTAMP(19) columns). Also removed unused Field_timestamp::fill_and_store() method. mysql-test/r/type_timestamp.result: Added test for bug #8894 "TIMESTAMP values scrambled/misaligned when using --new". mysql-test/t/type_timestamp.test: Added test for bug #8894 "TIMESTAMP values scrambled/misaligned when using --new". sql/field.cc: Field_timestamp::fill_and_store() Removed unused method. Field_timestamp::val_int() Even in --new mode integer representation of TIMESTAMP value should not exceed 14 digits. sql/field.h: Removed unused Field_timestamp::fill_and_store() method. --- mysql-test/r/type_timestamp.result | 9 ++++++++ mysql-test/t/type_timestamp.test | 13 +++++++++++ sql/field.cc | 35 ++++-------------------------- sql/field.h | 1 - 4 files changed, 26 insertions(+), 32 deletions(-) diff --git a/mysql-test/r/type_timestamp.result b/mysql-test/r/type_timestamp.result index 6253fa96ba8..d22fe9a94ae 100644 --- a/mysql-test/r/type_timestamp.result +++ b/mysql-test/r/type_timestamp.result @@ -221,3 +221,12 @@ ts1 20040101000000 20040101010000 drop table t1; +create table t1 (ts timestamp); +set TIMESTAMP=1000000000; +insert into t1 values (); +set new=1; +select ts+0 from t1; +ts+0 +20010909044640 +set new=0; +drop table t1; diff --git a/mysql-test/t/type_timestamp.test b/mysql-test/t/type_timestamp.test index 464ee63c137..9d61e0eaef1 100644 --- a/mysql-test/t/type_timestamp.test +++ b/mysql-test/t/type_timestamp.test @@ -148,3 +148,16 @@ select * from t1; set new=0; select * from t1; drop table t1; + +# +# Test for bug #8894 "TIMESTAMP values scrambled/misaligned when using +# --new". TIMESTAMP columns should have correct values when they are used in +# integer context in --new mode. +# +create table t1 (ts timestamp); +set TIMESTAMP=1000000000; +insert into t1 values (); +set new=1; +select ts+0 from t1; +set new=0; +drop table t1; diff --git a/sql/field.cc b/sql/field.cc index 69ee6606be4..59a71a93d68 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -2505,34 +2505,6 @@ void Field_timestamp::store(const char *from,uint len) longstore(ptr,tmp); } -void Field_timestamp::fill_and_store(char *from,uint len) -{ - uint res_length; - if (len <= field_length) - res_length=field_length; - else if (len <= 12) - res_length=12; /* purecov: inspected */ - else if (len <= 14) - res_length=14; /* purecov: inspected */ - else - res_length=(len+1)/2*2; // must be even - if (res_length != len) - { - bmove_upp(from+res_length,from+len,len); - bfill(from,res_length-len,'0'); - len=res_length; - } - long tmp=(long) str_to_timestamp(from,len); -#ifdef WORDS_BIGENDIAN - if (table->db_low_byte_first) - { - int4store(ptr,tmp); - } - else -#endif - longstore(ptr,tmp); -} - void Field_timestamp::store(double nr) { @@ -2644,7 +2616,7 @@ double Field_timestamp::val_real(void) longlong Field_timestamp::val_int(void) { - uint len,pos; + uint len, pos, max_int_rep_len; int part_time; uint32 temp; time_t time_arg; @@ -2665,7 +2637,8 @@ longlong Field_timestamp::val_int(void) localtime_r(&time_arg,&tm_tmp); l_time=&tm_tmp; res=(longlong) 0; - for (pos=len=0; len+1 < (uint) field_length ; len+=2,pos++) + max_int_rep_len= min(field_length, 14); + for (pos= len= 0; len+1 < max_int_rep_len ; len+= 2,pos++) { bool year_flag=0; switch (dayord.pos[pos]) { @@ -2677,7 +2650,7 @@ longlong Field_timestamp::val_int(void) case 5: part_time=l_time->tm_sec; break; default: part_time=0; break; /* purecov: deadcode */ } - if (year_flag && (field_length == 8 || field_length == 14)) + if (year_flag && (max_int_rep_len == 8 || max_int_rep_len == 14)) { res=res*(longlong) 10000+(part_time+ ((part_time < YY_PART_YEAR) ? 2000 : 1900)); diff --git a/sql/field.h b/sql/field.h index 87a9732b41e..3e258f81dcc 100644 --- a/sql/field.h +++ b/sql/field.h @@ -591,7 +591,6 @@ public: longget(tmp,ptr); return tmp; } - void fill_and_store(char *from,uint len); bool get_date(TIME *ltime,bool fuzzydate); bool get_time(TIME *ltime);