diff options
author | unknown <monty@mashka.mysql.fi> | 2002-12-14 17:43:01 +0200 |
---|---|---|
committer | unknown <monty@mashka.mysql.fi> | 2002-12-14 17:43:01 +0200 |
commit | 16451f030945d88344d30c6147af8b0663b3a5a0 (patch) | |
tree | ec4419624a982054d0682faee38e3ea102cd16d9 /sql/item_timefunc.cc | |
parent | 659d21e929772cd6e7a3b85bc3ab667bd2cf58c6 (diff) | |
download | mariadb-git-16451f030945d88344d30c6147af8b0663b3a5a0.tar.gz |
Fixes for binary protocol (complement to last push)
Changed timestamp to return string in YYYY-MM-DD HH:MM:SS format.
DATE_ADD() and related functions now returns correct DATE/DATETIME type depending on argument types.
Now all tests passes, still some work left to remove warnings in log files from mysql-test-run
mysql-test/r/cast.result:
New result for time
mysql-test/r/delayed.result:
Timestamp update
mysql-test/r/derived.result:
Fix after bulk insert change
mysql-test/r/explain.result:
Fix after bulk insert change
mysql-test/r/func_date_add.result:
Timestamp change
mysql-test/r/func_str.result:
Timestamp change
mysql-test/r/func_time.result:
Timestamp change
mysql-test/r/innodb.result:
Timestamp change
mysql-test/r/join_outer.result:
Fix after bulk insert change
mysql-test/r/key_primary.result:
Fix after bulk insert change
mysql-test/r/keywords.result:
Timestamp change
mysql-test/r/merge.result:
Removed warning
mysql-test/r/odbc.result:
Fix after bulk insert change
mysql-test/r/range.result:
Fix after bulk insert change
mysql-test/r/select.result:
Fix after bulk insert change
mysql-test/r/subselect.result:
Fixed EXPLAIN output
mysql-test/r/type_datetime.result:
Timestamp update
mysql-test/r/type_ranges.result:
Timestamp update
mysql-test/r/type_timestamp.result:
Timestamp update
mysql-test/r/union.result:
EXPLAIN UPDATE
mysql-test/t/func_str.test:
Timestamp update
mysql-test/t/func_time.test:
New test for interval type result
mysql-test/t/merge.test:
Remove warnings of wrong drop table
mysql-test/t/type_datetime.test:
Timestamp change
mysql-test/t/type_timestamp.test:
Timestamp change
sql/field.cc:
Changed timestamp to return string in YYYY-MM-DD HH:MM:SS format
sql/field.h:
Changed timestamp to return string in YYYY-MM-DD HH:MM:SS format
sql/item.cc:
Binary protocol update
sql/item.h:
Binary protocol update
sql/item_func.cc:
Added comment
sql/item_func.h:
@variables are always returned to the client as strings
sql/item_timefunc.cc:
Changed INTERVAL to return correct type
sql/item_timefunc.h:
Changed INTERVAL to return correct type
sql/mysqld.cc:
Changed default pthread_attr_setstacksize to 129K
sql/protocol.cc:
More type checking
sql/set_var.cc:
Fixed that @convert works ok with new protocol
sql/sql_analyse.cc:
Fixed bug in analyze
sql/sql_class.cc:
Fixed bug from last push in LIMIT
sql/sql_error.cc:
More optimal types
sql/sql_repl.cc:
Binary protocol changes
sql/sql_select.cc:
Fixed bug in multi-table-update
Changed EXPLAIN to return NULL instead of empty strings
sql/sql_show.cc:
Binary protocol
Diffstat (limited to 'sql/item_timefunc.cc')
-rw-r--r-- | sql/item_timefunc.cc | 58 |
1 files changed, 48 insertions, 10 deletions
diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index 7e2e8f7cfbd..7b58fbe8404 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -295,8 +295,8 @@ longlong Item_func_time_to_sec::val_int() /* -** Convert a string to a interval value -** To make code easy, allow interval objects without separators. + Convert a string to a interval value + To make code easy, allow interval objects without separators. */ static bool get_interval_value(Item *args,interval_type int_type, @@ -516,12 +516,14 @@ void Item_func_curtime::fix_length_and_dec() (int) start->tm_sec); } + String *Item_func_now::val_str(String *str) { str_value.set(buff,buff_length,thd_charset()); return &str_value; } + void Item_func_now::fix_length_and_dec() { struct tm tm_tmp,*start; @@ -540,13 +542,14 @@ void Item_func_now::fix_length_and_dec() (ulong) (((uint) start->tm_min)*100L+ (uint) start->tm_sec))); - buff_length= (uint) cs->snprintf(cs,buff, sizeof(buff),"%04d-%02d-%02d %02d:%02d:%02d", - ((int) (start->tm_year+1900)) % 10000, - (int) start->tm_mon+1, - (int) start->tm_mday, - (int) start->tm_hour, - (int) start->tm_min, - (int) start->tm_sec); + buff_length= (uint) cs->snprintf(cs,buff, sizeof(buff), + "%04d-%02d-%02d %02d:%02d:%02d", + ((int) (start->tm_year+1900)) % 10000, + (int) start->tm_mon+1, + (int) start->tm_mday, + (int) start->tm_hour, + (int) start->tm_min, + (int) start->tm_sec); /* For getdate */ ltime.year= start->tm_year+1900; ltime.month= start->tm_mon+1; @@ -995,7 +998,42 @@ bool Item_func_from_unixtime::get_date(TIME *ltime, return 0; } - /* Here arg[1] is a Item_interval object */ + +void Item_date_add_interval::fix_length_and_dec() +{ + enum_field_types arg0_field_type; + set_charset(thd_charset()); + maybe_null=1; + max_length=19*thd_charset()->mbmaxlen; + value.alloc(32); + + /* + The field type for the result of an Item_date function is defined as + follows: + + - If first arg is a MYSQL_TYPE_DATETIME result is MYSQL_TYPE_DATETIME + - If first arg is a MYSQL_TYPE_DATE and the interval type uses hours, + minutes or seconds then type is MYSQL_TYPE_DATETIME. + - Otherwise the result is MYSQL_TYPE_STRING + (This is because you can't know if the string contains a DATE, TIME or + DATETIME argument) + */ + cached_field_type= MYSQL_TYPE_STRING; + arg0_field_type= args[0]->field_type(); + if (arg0_field_type == MYSQL_TYPE_DATETIME || + arg0_field_type == MYSQL_TYPE_TIMESTAMP) + cached_field_type= MYSQL_TYPE_DATETIME; + else if (arg0_field_type == MYSQL_TYPE_DATE) + { + if (int_type <= INTERVAL_MONTH || int_type == INTERVAL_YEAR_MONTH) + cached_field_type= arg0_field_type; + else + cached_field_type= MYSQL_TYPE_DATETIME; + } +} + + +/* Here arg[1] is a Item_interval object */ bool Item_date_add_interval::get_date(TIME *ltime, bool fuzzy_date) { |