summaryrefslogtreecommitdiff
path: root/sql/item_timefunc.cc
diff options
context:
space:
mode:
authorunknown <serg@sergbook.mysql.com>2004-12-31 15:26:24 +0100
committerunknown <serg@sergbook.mysql.com>2004-12-31 15:26:24 +0100
commitb99bea6704299399c84bd8374ef7f248ff9570c5 (patch)
tree928b06c231edee4cb95ace87ed30e879e3dcb0fb /sql/item_timefunc.cc
parentbd23099be0b22845e8c97e2fb36ee3c6eb0e2491 (diff)
parent5eaf65ab4be77911eb03cceefac9ecea48c25f71 (diff)
downloadmariadb-git-b99bea6704299399c84bd8374ef7f248ff9570c5.tar.gz
manually merged
configure.in: Auto merged client/mysqldump.c: Auto merged innobase/buf/buf0rea.c: Auto merged innobase/dict/dict0load.c: Auto merged innobase/fil/fil0fil.c: Auto merged innobase/include/fil0fil.h: Auto merged innobase/include/row0mysql.h: Auto merged innobase/include/trx0trx.h: Auto merged innobase/os/os0file.c: Auto merged innobase/row/row0ins.c: Auto merged innobase/row/row0mysql.c: Auto merged innobase/row/row0sel.c: Auto merged innobase/srv/srv0start.c: Auto merged innobase/trx/trx0trx.c: Auto merged libmysqld/lib_sql.cc: Auto merged mysql-test/mysql-test-run.sh: Auto merged mysql-test/r/alter_table.result: Auto merged mysql-test/r/ctype_ucs.result: Auto merged mysql-test/r/func_str.result: Auto merged mysql-test/r/grant.result: Auto merged mysql-test/r/grant_cache.result: Auto merged mysql-test/r/merge.result: Auto merged mysql-test/r/ndb_blob.result: Auto merged mysql-test/r/ps_1general.result: Auto merged mysql-test/r/subselect.result: Auto merged mysql-test/r/timezone2.result: Auto merged mysql-test/t/ctype_ucs.test: Auto merged mysql-test/t/grant.test: Auto merged mysql-test/t/merge.test: Auto merged mysql-test/t/multi_update.test: Auto merged mysql-test/t/mysqldump.test: Auto merged mysql-test/t/subselect.test: Auto merged ndb/src/ndbapi/NdbBlob.cpp: Auto merged ndb/src/ndbapi/NdbConnection.cpp: Auto merged ndb/src/ndbapi/NdbDictionaryImpl.cpp: Auto merged ndb/src/ndbapi/NdbOperationDefine.cpp: Auto merged sql/ha_innodb.cc: Auto merged sql/ha_myisammrg.cc: Auto merged sql/ha_myisammrg.h: Auto merged sql/item_cmpfunc.cc: Auto merged sql/item_func.cc: Auto merged sql/item_strfunc.cc: Auto merged sql/log.cc: Auto merged sql/mysql_priv.h: Auto merged sql/mysqld.cc: Auto merged sql/set_var.cc: Auto merged sql-common/client.c: Auto merged sql/sql_table.cc: Auto merged sql/strfunc.cc: Auto merged sql/unireg.cc: Auto merged vio/vio.c: Auto merged vio/viosocket.c: Auto merged
Diffstat (limited to 'sql/item_timefunc.cc')
-rw-r--r--sql/item_timefunc.cc60
1 files changed, 39 insertions, 21 deletions
diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc
index 215218a8277..27c000138d8 100644
--- a/sql/item_timefunc.cc
+++ b/sql/item_timefunc.cc
@@ -149,6 +149,9 @@ static DATE_TIME_FORMAT time_24hrs_format= {{0}, '\0', 0,
conversion specifiers that can be used in such sub-patterns is limited.
Also most of checks are skipped in this case.
+ If one adds new format specifiers to this function he should also
+ consider adding them to get_date_time_result_type() function.
+
RETURN
0 ok
1 error
@@ -2821,25 +2824,31 @@ void Item_func_get_format::print(String *str)
/*
- check_result_type(s, l) returns DATE/TIME type
- according to format string
-
- s: DATE/TIME format string
- l: length of s
- Result: date_time_format_types value:
- DATE_TIME_MICROSECOND, DATE_TIME,
- TIME_MICROSECOND, TIME_ONLY
-
- We don't process day format's characters('D', 'd', 'e')
- because day may be a member of all date/time types.
- If only day format's character and no time part present
- the result type is MYSQL_TYPE_DATE
+ Get type of datetime value (DATE/TIME/...) which will be produced
+ according to format string.
+
+ SYNOPSIS
+ get_date_time_result_type()
+ format - format string
+ length - length of format string
+
+ NOTE
+ We don't process day format's characters('D', 'd', 'e') because day
+ may be a member of all date/time types.
+
+ Format specifiers supported by this function should be in sync with
+ specifiers supported by extract_date_time() function.
+
+ RETURN VALUE
+ One of date_time_format_types values:
+ DATE_TIME_MICROSECOND, DATE_TIME, DATE_ONLY, TIME_MICROSECOND, TIME_ONLY
*/
-date_time_format_types check_result_type(const char *format, uint length)
+static date_time_format_types
+get_date_time_result_type(const char *format, uint length)
{
const char *time_part_frms= "HISThiklrs";
- const char *date_part_frms= "MUYWabcjmuyw";
+ const char *date_part_frms= "MVUXYWabcjmvuxyw";
bool date_part_used= 0, time_part_used= 0, frac_second_used= 0;
const char *val= format;
@@ -2850,22 +2859,30 @@ date_time_format_types check_result_type(const char *format, uint length)
if (*val == '%' && val+1 != end)
{
val++;
- if ((frac_second_used= (*val == 'f')) ||
- (!time_part_used && strchr(time_part_frms, *val)))
+ if (*val == 'f')
+ frac_second_used= time_part_used= 1;
+ else if (!time_part_used && strchr(time_part_frms, *val))
time_part_used= 1;
else if (!date_part_used && strchr(date_part_frms, *val))
date_part_used= 1;
- if (time_part_used && date_part_used && frac_second_used)
+ if (date_part_used && frac_second_used)
+ {
+ /*
+ frac_second_used implies time_part_used, and thus we already
+ have all types of date-time components and can end our search.
+ */
return DATE_TIME_MICROSECOND;
}
}
+ }
+ /* We don't have all three types of date-time components */
+ if (frac_second_used)
+ return TIME_MICROSECOND;
if (time_part_used)
{
if (date_part_used)
return DATE_TIME;
- if (frac_second_used)
- return TIME_MICROSECOND;
return TIME_ONLY;
}
return DATE_ONLY;
@@ -2896,7 +2913,8 @@ void Item_func_str_to_date::fix_length_and_dec()
if ((const_item= args[1]->const_item()))
{
format= args[1]->val_str(&format_str);
- cached_format_type= check_result_type(format->ptr(), format->length());
+ cached_format_type= get_date_time_result_type(format->ptr(),
+ format->length());
switch (cached_format_type) {
case DATE_ONLY:
cached_timestamp_type= MYSQL_TIMESTAMP_DATE;