summaryrefslogtreecommitdiff
path: root/sql/item_timefunc.cc
diff options
context:
space:
mode:
authorunknown <monty@mashka.mysql.fi>2002-12-14 17:43:01 +0200
committerunknown <monty@mashka.mysql.fi>2002-12-14 17:43:01 +0200
commit16451f030945d88344d30c6147af8b0663b3a5a0 (patch)
treeec4419624a982054d0682faee38e3ea102cd16d9 /sql/item_timefunc.cc
parent659d21e929772cd6e7a3b85bc3ab667bd2cf58c6 (diff)
downloadmariadb-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.cc58
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)
{