3553 Alexander Barkov 2011-11-07
WL#946 clean-ups
modified:
include/mysql_time.h
sql/field.cc
sql/field.h
sql/item.h
sql/item_timefunc.h
3552 Alexander Barkov 2011-11-07
WL#946: more clean-ups in MYSQL_TIME_cache:
now set_XXX() functions automatically reset string representation.
This is needed because in case of prepared statements
fix_length_and_dec() is called twice: at prepare time and at execute time.
We need to clean string representation when set_XXX() is called from the
execute time fix_length_and_dec().
modified:
sql/item_timefunc.cc
sql/item_timefunc.h
unittest/gunit/item-t.cc
=== modified file 'include/mysql_time.h'
--- a/include/mysql_time.h 2006-12-31 00:02:27 +0000
+++ b/include/mysql_time.h 2011-11-07 14:35:16 +0000
@@ -47,7 +47,7 @@ enum enum_mysql_timestamp_type
typedef struct st_mysql_time
{
unsigned int year, month, day, hour, minute, second;
- unsigned long second_part;
+ unsigned long second_part; /**< microseconds */
my_bool neg;
enum enum_mysql_timestamp_type time_type;
} MYSQL_TIME;
=== modified file 'sql/field.cc'
--- a/sql/field.cc 2011-11-03 09:33:45 +0000
+++ b/sql/field.cc 2011-11-07 14:35:16 +0000
@@ -4863,7 +4863,7 @@ Field_temporal::convert_number_to_dateti
Note, number_to_datetime can return a result different from nr:
e.g. 111111 -> 20111111000000
*/
- longlong tmp= number_to_datetime(nr, ltime, check_flags(), warnings);
+ longlong tmp= number_to_datetime(nr, ltime, date_flags(), warnings);
if (tmp == LL(-1))
reset();
return tmp;
@@ -5054,7 +5054,7 @@ Field_temporal_with_date::store_time(MYS
{
case MYSQL_TIMESTAMP_DATETIME:
case MYSQL_TIMESTAMP_DATE:
- if (check_date(ltime, non_zero_date(ltime), check_flags(), &warnings))
+ if (check_date(ltime, non_zero_date(ltime), date_flags(), &warnings))
{
reset();
error= 1;
@@ -5091,7 +5091,7 @@ Field_temporal_with_date::convert_str_to
MYSQL_TIME *ltime,
MYSQL_TIME_STATUS *status)
{
- return str_to_datetime(cs, str, len, ltime, check_flags(), status);
+ return str_to_datetime(cs, str, len, ltime, date_flags(), status);
}
@@ -5296,8 +5296,7 @@ Field_timestamp::Field_timestamp(uchar *
const char *field_name_arg,
TABLE_SHARE *share)
:Field_temporal_with_date_and_time(ptr_arg, null_ptr_arg, null_bit_arg,
- unireg_check_arg, field_name_arg,
- MAX_DATETIME_WIDTH, 0)
+ unireg_check_arg, field_name_arg, 0)
{
init_timestamp_flags_and_share(share);
}
@@ -5307,8 +5306,7 @@ Field_timestamp::Field_timestamp(bool ma
const char *field_name_arg)
:Field_temporal_with_date_and_time((uchar *) 0,
maybe_null_arg ? (uchar *) "" : 0, 0,
- NONE, field_name_arg,
- MAX_DATETIME_WIDTH, 0)
+ NONE, field_name_arg, 0)
{
/* For 4.0 MYD and 4.0 InnoDB compatibility */
flags|= ZEROFILL_FLAG | UNSIGNED_FLAG | BINARY_FLAG;
@@ -5317,7 +5315,7 @@ Field_timestamp::Field_timestamp(bool ma
}
-ulonglong Field_timestamp::check_flags(const THD *thd)
+ulonglong Field_timestamp::date_flags(const THD *thd)
{
/* We don't want to store invalid or fuzzy datetime values in TIMESTAMP */
return (thd->variables.sql_mode & MODE_NO_ZERO_DATE) | MODE_NO_ZERO_IN_DATE;
@@ -5478,7 +5476,7 @@ Field_timestampf::Field_timestampf(uchar
uint8 dec_arg)
:Field_temporal_with_date_and_timef(ptr_arg, null_ptr_arg, null_bit_arg,
unireg_check_arg, field_name_arg,
- MAX_DATETIME_WIDTH, dec_arg)
+ dec_arg)
{
init_timestamp_flags_and_share(share);
}
@@ -5489,8 +5487,7 @@ Field_timestampf::Field_timestampf(bool
uint8 dec_arg)
:Field_temporal_with_date_and_timef((uchar*) 0,
maybe_null_arg ? (uchar*) "": 0, 0,
- NONE, field_name_arg,
- MAX_DATETIME_WIDTH, dec_arg)
+ NONE, field_name_arg, dec_arg)
{
/* For 4.0 MYD and 4.0 InnoDB compatibility */
flags|= ZEROFILL_FLAG | UNSIGNED_FLAG | BINARY_FLAG;
@@ -5499,7 +5496,7 @@ Field_timestampf::Field_timestampf(bool
}
-ulonglong Field_timestampf::check_flags(const THD *thd)
+ulonglong Field_timestampf::date_flags(const THD *thd)
{
/* We don't want to store invalid or fuzzy datetime values in TIMESTAMP */
return (thd->variables.sql_mode & MODE_NO_ZERO_DATE) | MODE_NO_ZERO_IN_DATE;
@@ -6049,7 +6046,7 @@ void Field_year::sql_type(String &res) c
** In number context: YYYYMMDD
****************************************************************************/
-ulonglong Field_newdate::check_flags(const THD *thd)
+ulonglong Field_newdate::date_flags(const THD *thd)
{
return TIME_FUZZY_DATE | thd->datetime_flags();
}
@@ -6189,7 +6186,7 @@ void Field_newdate::sql_type(String &res
****************************************************************************/
-ulonglong Field_datetime::check_flags(const THD *thd)
+ulonglong Field_datetime::date_flags(const THD *thd)
{
return TIME_FUZZY_DATE | thd->datetime_flags();
}
@@ -6381,7 +6378,7 @@ void Field_datetime::sql_type(String &re
****************************************************************************/
-ulonglong Field_datetimef::check_flags(const THD *thd)
+ulonglong Field_datetimef::date_flags(const THD *thd)
{
return TIME_FUZZY_DATE | thd->datetime_flags();
}
=== modified file 'sql/field.h'
--- a/sql/field.h 2011-11-01 11:52:24 +0000
+++ b/sql/field.h 2011-11-07 14:35:16 +0000
@@ -1863,7 +1863,7 @@ protected:
@param thd THD
@retval sql_mode flags mixed with the field type flags.
*/
- virtual ulonglong check_flags(const THD *thd)
+ virtual ulonglong date_flags(const THD *thd)
{
return 0;
}
@@ -1872,9 +1872,9 @@ protected:
check_date(), number_to_datetime(), str_to_datetime().
Similar to the above when we don't have a THD value.
*/
- inline ulonglong check_flags()
+ inline ulonglong date_flags()
{
- return check_flags(table ? table->in_use : current_thd);
+ return date_flags(table ? table->in_use : current_thd);
}
/**
@@ -1890,6 +1890,16 @@ protected:
ErrConvString str,
timestamp_type ts_type, int cuted_increment);
public:
+ /**
+ Constructor for Field_temporal
+ @param ptr_arg See Field definition
+ @param null_ptr_arg See Field definition
+ @param null_bit_arg See Field definition
+ @param unireg_check_arg See Field definition
+ @param field_name_arg See Field definition
+ @param len_arg Number of characters in the integer part.
+ @param dec_arg Number of second fraction digits, 0..6.
+ */
Field_temporal(uchar *ptr_arg,
uchar *null_ptr_arg, uchar null_bit_arg,
enum utype unireg_check_arg, const char *field_name_arg,
@@ -1899,6 +1909,13 @@ public:
null_ptr_arg, null_bit_arg,
unireg_check_arg, field_name_arg)
{ flags|= BINARY_FLAG; }
+ /**
+ Constructor for Field_temporal
+ @param maybe_null_arg See Field definition
+ @param field_name_arg See Field definition
+ @param len_arg Number of characters in the integer part.
+ @param dec_arg Number of second fraction digits, 0..6
+ */
Field_temporal(bool maybe_null_arg, const char *field_name_arg,
uint32 len_arg, uint8 dec_arg)
:Field((uchar *) 0,
@@ -1958,6 +1975,16 @@ protected:
MYSQL_TIME *ltime, MYSQL_TIME_STATUS *status);
int store_internal_with_round(MYSQL_TIME *ltime, int *warnings);
public:
+ /**
+ Constructor for Field_temporal
+ @param ptr_arg See Field definition
+ @param null_ptr_arg See Field definition
+ @param null_bit_arg See Field definition
+ @param unireg_check_arg See Field definition
+ @param field_name_arg See Field definition
+ @param len_arg Number of characters in the integer part.
+ @param dec_arg Number of second fraction digits, 0..6.
+ */
Field_temporal_with_date(uchar *ptr_arg, uchar *null_ptr_arg,
uchar null_bit_arg,
enum utype unireg_check_arg,
@@ -1967,6 +1994,13 @@ public:
unireg_check_arg, field_name_arg,
int_length_arg, dec_arg)
{ }
+ /**
+ Constructor for Field_temporal
+ @param maybe_null_arg See Field definition
+ @param field_name_arg See Field definition
+ @param len_arg Number of characters in the integer part.
+ @param dec_arg Number of second fraction digits, 0..6.
+ */
Field_temporal_with_date(bool maybe_null_arg, const char *field_name_arg,
uint int_length_arg, uint8 dec_arg)
:Field_temporal((uchar*) 0, maybe_null_arg ? (uchar*) "": 0, 0,
@@ -2001,20 +2035,37 @@ private:
return 0;
}
protected:
+ /**
+ Initialize flags and share for timestamp column.
+ */
void init_timestamp_flags_and_share(TABLE_SHARE *share);
+ /**
+ Store "struct timeval" value into field.
+ The value must be properly rounded or truncated according
+ to the number of fractional second digits.
+ */
virtual void store_timestamp_internal(const struct timeval *tm)= 0;
bool convert_TIME_to_timestamp(THD *thd, const MYSQL_TIME *ltime,
struct timeval *tm, int *error);
public:
+ /**
+ Constructor for Field_temporal_with_date_and_time
+ @param ptr_arg See Field definition
+ @param null_ptr_arg See Field definition
+ @param null_bit_arg See Field definition
+ @param unireg_check_arg See Field definition
+ @param field_name_arg See Field definition
+ @param dec_arg Number of second fraction digits, 0..6.
+ */
Field_temporal_with_date_and_time(uchar *ptr_arg, uchar *null_ptr_arg,
uchar null_bit_arg,
enum utype unireg_check_arg,
const char *field_name_arg,
- uint8 int_length_arg, uint8 dec_arg)
+ uint8 dec_arg)
:Field_temporal_with_date(ptr_arg, null_ptr_arg, null_bit_arg,
unireg_check_arg, field_name_arg,
- int_length_arg, dec_arg)
+ MAX_DATETIME_WIDTH, dec_arg)
{ }
void set_time();
void store_timestamp(const struct timeval *tm);
@@ -2034,22 +2085,36 @@ private:
return 1;
}
public:
+ /**
+ Constructor for Field_temporal_with_date_and_timef
+ @param ptr_arg See Field definition
+ @param null_ptr_arg See Field definition
+ @param null_bit_arg See Field definition
+ @param unireg_check_arg See Field definition
+ @param field_name_arg See Field definition
+ @param dec_arg Number of second fraction digits, 0..6.
+ */
Field_temporal_with_date_and_timef(uchar *ptr_arg, uchar *null_ptr_arg,
uchar null_bit_arg,
enum utype unireg_check_arg,
const char *field_name_arg,
- uint8 int_length_arg, uint8 dec_arg)
+ uint8 dec_arg)
:Field_temporal_with_date_and_time(ptr_arg, null_ptr_arg, null_bit_arg,
unireg_check_arg, field_name_arg,
- int_length_arg, dec_arg)
+ dec_arg)
{ }
+ /**
+ Constructor for Field_temporal_with_date_and_timef
+ @param maybe_null_arg See Field definition
+ @param field_name_arg See Field definition
+ @param dec_arg Number of second fraction digits, 0..6.
+ */
Field_temporal_with_date_and_timef(bool maybe_null_arg,
const char *field_name_arg,
- uint int_length_arg, uint8 dec_arg)
+ uint8 dec_arg)
:Field_temporal_with_date_and_time((uchar *) 0,
maybe_null_arg ? (uchar*) "" : 0, 0,
- NONE, field_name_arg, int_length_arg,
- dec_arg)
+ NONE, field_name_arg, dec_arg)
{ }
uint decimals() const { return dec; }
@@ -2070,9 +2135,13 @@ public:
};
+/*
+ Field implementing TIMESTAMP data type without fractional seconds.
+ We will be removed eventually.
+*/
class Field_timestamp :public Field_temporal_with_date_and_time {
protected:
- ulonglong check_flags(const THD *thd);
+ ulonglong date_flags(const THD *thd);
int store_internal(const MYSQL_TIME *ltime, int *error);
bool get_date_internal(MYSQL_TIME *ltime);
void store_timestamp_internal(const struct timeval *tm);
@@ -2125,16 +2194,35 @@ public:
};
+/*
+ Field implementing TIMESTAMP(N) data type, where N=0..6.
+*/
class Field_timestampf :public Field_temporal_with_date_and_timef {
protected:
bool get_date_internal(MYSQL_TIME *ltime);
int store_internal(const MYSQL_TIME *ltime, int *error);
- ulonglong check_flags(const THD *thd);
+ ulonglong date_flags(const THD *thd);
void store_timestamp_internal(const struct timeval *tm);
public:
+ /**
+ Field_timestampf constructor
+ @param ptr_arg See Field definition
+ @param null_ptr_arg See Field definition
+ @param null_bit_arg See Field definition
+ @param unireg_check_arg See Field definition
+ @param field_name_arg See Field definition
+ @param share Table share.
+ @param dec_arg Number of fractional second digits, 0..6.
+ */
Field_timestampf(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg,
enum utype unireg_check_arg, const char *field_name_arg,
TABLE_SHARE *share, uint8 dec_arg);
+ /**
+ Field_timestampf constructor
+ @param maybe_null_arg See Field definition
+ @param field_name_arg See Field definition
+ @param dec_arg Number of fractional second digits, 0..6.
+ */
Field_timestampf(bool maybe_null_arg, const char *field_name_arg,
uint8 dec_arg);
Field_timestampf *clone(MEM_ROOT *mem_root) const
@@ -2181,16 +2269,6 @@ public:
};
-inline Field *new_Field_timestamp(bool maybe_null_arg,
- const char *name_arg,
- uint8 dec_arg)
-{
- return dec_arg > 0 ?
- (Field *) new Field_timestampf(maybe_null_arg, name_arg, dec_arg) :
- (Field *) new Field_timestamp(maybe_null_arg, name_arg);
-}
-
-
class Field_year :public Field_tiny {
public:
Field_year(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
@@ -2223,7 +2301,7 @@ public:
class Field_newdate :public Field_temporal_with_date {
protected:
- ulonglong check_flags(const THD *thd);
+ ulonglong date_flags(const THD *thd);
bool get_date_internal(MYSQL_TIME *ltime);
int store_internal(const MYSQL_TIME *ltime, int *error);
@@ -2278,21 +2356,48 @@ protected:
MYSQL_TIME *ltime, MYSQL_TIME_STATUS *status);
int convert_number_to_TIME(longlong nr, bool unsigned_val, int nanoseconds,
MYSQL_TIME *ltime, int *warning);
+ /**
+ Low-level function to store MYSQL_TIME value.
+ The value must be rounded or truncated according to decimals().
+ */
virtual int store_internal(const MYSQL_TIME *ltime, int *error)= 0;
+ /**
+ Low-level function to store time value in lldiv_t format.
+ The value must be rounded or truncated according to decimals().
+ */
virtual int store_internal(const lldiv_t *lld)= 0;
+ /**
+ Function to store time value.
+ The value is rounded according to decimals().
+ */
virtual int store_internal_with_round(MYSQL_TIME *ltime, int *warnings);
public:
+ /**
+ Constructor for Field_time_common
+ @param ptr_arg See Field definition
+ @param null_ptr_arg See Field definition
+ @param null_bit_arg See Field definition
+ @param unireg_check_arg See Field definition
+ @param field_name_arg See Field definition
+ @param dec_arg Number of second fraction digits, 0..6.
+ */
Field_time_common(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg,
- enum utype unireg_check_arg, const char *field_name_arg,
- uint32 int_len_arg, uint8 dec_arg)
+ enum utype unireg_check_arg, const char *field_name_arg,
+ uint8 dec_arg)
:Field_temporal(ptr_arg, null_ptr_arg, null_bit_arg,
unireg_check_arg, field_name_arg,
- int_len_arg, dec_arg)
+ MAX_TIME_WIDTH, dec_arg)
{ }
+ /**
+ Constructor for Field_time_common
+ @param maybe_null_arg See Field definition
+ @param field_name_arg See Field definition
+ @param dec_arg Number of second fraction digits, 0..6.
+ */
Field_time_common(bool maybe_null_arg, const char *field_name_arg,
- uint32 int_len_arg, uint8 dec_arg)
+ uint8 dec_arg)
:Field_temporal((uchar *) 0, maybe_null_arg ? (uchar *) "" : 0, 0,
- NONE, field_name_arg, int_len_arg, dec_arg)
+ NONE, field_name_arg, MAX_TIME_WIDTH, dec_arg)
{ }
int store_time(MYSQL_TIME *ltime, uint8 dec);
String *val_str(String*, String *);
@@ -2302,6 +2407,10 @@ public:
};
+/*
+ Field implementing TIME data type without fractional seconds.
+ We will be removed eventually.
+*/
class Field_time :public Field_time_common {
protected:
int store_internal(const MYSQL_TIME *ltime, int *error);
@@ -2310,11 +2419,11 @@ public:
Field_time(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg,
enum utype unireg_check_arg, const char *field_name_arg)
:Field_time_common(ptr_arg, null_ptr_arg, null_bit_arg,
- unireg_check_arg, field_name_arg, MAX_TIME_WIDTH, 0)
+ unireg_check_arg, field_name_arg, 0)
{ }
Field_time(bool maybe_null_arg, const char *field_name_arg)
:Field_time_common((uchar *) 0, maybe_null_arg ? (uchar *) "" : 0, 0,
- NONE, field_name_arg, MAX_TIME_WIDTH, 0)
+ NONE, field_name_arg, 0)
{ }
enum_field_types type() const { return MYSQL_TYPE_TIME;}
enum ha_base_keytype key_type() const { return HA_KEYTYPE_INT24; }
@@ -2339,6 +2448,9 @@ public:
};
+/*
+ Field implementing TIME(N) data type, where N=0..6.
+*/
class Field_timef :public Field_time_common {
private:
int do_save_field_metadata(uchar *metadata_ptr)
@@ -2350,17 +2462,30 @@ protected:
int store_internal(const MYSQL_TIME *ltime, int *error);
int store_internal(const lldiv_t *lld);
public:
+ /**
+ Constructor for Field_timef
+ @param ptr_arg See Field definition
+ @param null_ptr_arg See Field definition
+ @param null_bit_arg See Field definition
+ @param unireg_check_arg See Field definition
+ @param field_name_arg See Field definition
+ @param dec_arg Number of second fraction digits, 0..6.
+ */
Field_timef(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg,
enum utype unireg_check_arg, const char *field_name_arg,
uint8 dec_arg)
:Field_time_common(ptr_arg, null_ptr_arg, null_bit_arg,
- unireg_check_arg, field_name_arg,
- MAX_TIME_WIDTH, dec_arg)
+ unireg_check_arg, field_name_arg, dec_arg)
{ }
+ /**
+ Constructor for Field_timef
+ @param maybe_null_arg See Field definition
+ @param field_name_arg See Field definition
+ @param dec_arg Number of second fraction digits, 0..6.
+ */
Field_timef(bool maybe_null_arg, const char *field_name_arg, uint8 dec_arg)
:Field_time_common((uchar *) 0, maybe_null_arg ? (uchar *) "" : 0, 0,
- NONE, field_name_arg,
- MAX_TIME_WIDTH, dec_arg)
+ NONE, field_name_arg, dec_arg)
{ }
Field_timef *clone(MEM_ROOT *mem_root) const
{
@@ -2409,22 +2534,15 @@ public:
};
-inline Field *new_Field_time(bool maybe_null_arg,
- const char *name_arg,
- uint8 dec_arg)
-{
- DBUG_ASSERT(dec_arg <= DATETIME_MAX_DECIMALS);
- return dec_arg ?
- (Field *) new Field_timef(maybe_null_arg, name_arg, dec_arg) :
- (Field *) new Field_time(maybe_null_arg, name_arg);
-}
-
-
+/*
+ Field implementing DATETIME data type without fractional seconds.
+ We will be removed eventually.
+*/
class Field_datetime :public Field_temporal_with_date_and_time {
protected:
int store_internal(const MYSQL_TIME *ltime, int *error);
bool get_date_internal(MYSQL_TIME *ltime);
- ulonglong check_flags(const THD *thd);
+ ulonglong date_flags(const THD *thd);
void store_timestamp_internal(const struct timeval *tm)
{
DBUG_ASSERT(0);
@@ -2433,14 +2551,12 @@ public:
Field_datetime(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg,
enum utype unireg_check_arg, const char *field_name_arg)
:Field_temporal_with_date_and_time(ptr_arg, null_ptr_arg, null_bit_arg,
- unireg_check_arg, field_name_arg,
- MAX_DATETIME_WIDTH, 0)
+ unireg_check_arg, field_name_arg, 0)
{ }
Field_datetime(bool maybe_null_arg, const char *field_name_arg)
:Field_temporal_with_date_and_time((uchar *) 0,
maybe_null_arg ? (uchar *) "" : 0,
- 0, NONE, field_name_arg,
- MAX_DATETIME_WIDTH, 0)
+ 0, NONE, field_name_arg, 0)
{ }
enum_field_types type() const { return MYSQL_TYPE_DATETIME;}
#ifdef HAVE_LONG_LONG
@@ -2486,29 +2602,47 @@ public:
};
+/*
+ Field implementing DATETIME(N) data type, where N=0..6.
+*/
class Field_datetimef :public Field_temporal_with_date_and_timef {
protected:
bool get_date_internal(MYSQL_TIME *ltime);
int store_internal(const MYSQL_TIME *ltime, int *error);
- ulonglong check_flags(const THD *thd);
+ ulonglong date_flags(const THD *thd);
void store_timestamp_internal(const struct timeval *tm)
{
DBUG_ASSERT(0);
}
public:
+ /**
+ Constructor for Field_datetimef
+ @param ptr_arg See Field definition
+ @param null_ptr_arg See Field definition
+ @param null_bit_arg See Field definition
+ @param unireg_check_arg See Field definition
+ @param field_name_arg See Field definition
+ @param dec_arg Number of second fraction digits, 0..6.
+ */
Field_datetimef(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg,
enum utype unireg_check_arg, const char *field_name_arg,
uint8 dec_arg)
:Field_temporal_with_date_and_timef(ptr_arg, null_ptr_arg, null_bit_arg,
unireg_check_arg, field_name_arg,
- MAX_DATETIME_WIDTH, dec_arg)
+ dec_arg)
{ }
+ /**
+ Constructor for Field_datetimef
+ @param maybe_null_arg See Field definition
+ @param field_name_arg See Field definition
+ @param len_arg See Field definition
+ @param dec_arg Number of second fraction digits, 0..6.
+ */
Field_datetimef(bool maybe_null_arg, const char *field_name_arg,
uint8 dec_arg)
:Field_temporal_with_date_and_timef((uchar *) 0,
maybe_null_arg ? (uchar *) "" : 0, 0,
- NONE, field_name_arg,
- MAX_DATETIME_WIDTH, dec_arg)
+ NONE, field_name_arg, dec_arg)
{ }
Field_datetimef *clone(MEM_ROOT *mem_root) const
{
@@ -2544,16 +2678,6 @@ public:
};
-inline Field *new_Field_datetime(bool maybe_null_arg,
- const char *name_arg,
- uint8 dec_arg)
-{
- return dec_arg > 0 ?
- (Field *) new Field_datetimef(maybe_null_arg, name_arg, dec_arg) :
- (Field *) new Field_datetime(maybe_null_arg, name_arg);
-}
-
-
class Field_string :public Field_longstr {
public:
bool can_alter_field_type;
=== modified file 'sql/item.h'
--- a/sql/item.h 2011-11-01 11:52:24 +0000
+++ b/sql/item.h 2011-11-07 14:35:16 +0000
@@ -639,7 +639,7 @@ public:
virtual bool eq(const Item *, bool binary_cmp) const;
virtual Item_result result_type() const { return REAL_RESULT; }
/**
- Result type when an item aprear in a numeric context.
+ Result type when an item appear in a numeric context.
See Field::numeric_context_result_type() for more comments.
*/
virtual enum Item_result numeric_context_result_type() const
@@ -739,8 +739,9 @@ public:
return val_date_temporal();
}
/**
- Get date or time value in packed longlong format,
- rounded to "dec" fractional digits.
+ Get date or time value in packed longlong format.
+ Before conversion from MYSQL_TIME to packed format,
+ the MYSQL_TIME value is rounded to "dec" fractional digits.
*/
longlong val_temporal_with_round(enum_field_types type, uint8 dec);
@@ -3062,11 +3063,24 @@ public:
};
+/*
+ Item_datetime_with_ref is used to optimize queries like:
+ SELECT ... FROM t1 WHERE date_or_datetime_column = 20110101101010;
+ The numeric constant is replaced to Item_datetime_with_ref
+ by convert_constant_item().
+*/
class Item_datetime_with_ref :public Item_temporal_with_ref
{
private:
enum_field_types cached_field_type;
public:
+ /**
+ Constructor for Item_datetime_with_ref.
+ @param field_type_arg Data type: MYSQL_TYPE_DATE or MYSQL_TYPE_DATETIME
+ @param decimals_arg Number of fractional digits.
+ @param i Temporal value in packed format.
+ @param ref_arg Pointer to the original numeric Item.
+ */
Item_datetime_with_ref(enum_field_types field_type_arg,
uint8 decimals_arg, longlong i, Item *ref_arg):
Item_temporal_with_ref(field_type_arg, decimals_arg, i, ref_arg, true),
@@ -3083,9 +3097,21 @@ public:
};
+/*
+ Item_time_with_ref is used to optimize queries like:
+ SELECT ... FROM t1 WHERE time_column = 20110101101010;
+ The numeric constant is replaced to Item_time_with_ref
+ by convert_constant_item().
+*/
class Item_time_with_ref :public Item_temporal_with_ref
{
public:
+ /**
+ Constructor for Item_time_with_ref.
+ @param decimals_arg Number of fractional digits.
+ @param i Temporal value in packed format.
+ @param ref_arg Pointer to the original numeric Item.
+ */
Item_time_with_ref(uint8 decimals_arg, longlong i, Item *ref_arg):
Item_temporal_with_ref(MYSQL_TYPE_TIME, decimals_arg, i, ref_arg, 0)
{
=== modified file 'sql/item_timefunc.h'
--- a/sql/item_timefunc.h 2011-11-07 12:02:15 +0000
+++ b/sql/item_timefunc.h 2011-11-07 14:35:16 +0000
@@ -787,6 +787,10 @@ class Item_date_literal :public Item_dat
{
MYSQL_TIME_cache cached_time;
public:
+ /**
+ Constructor for Item_date_literal.
+ @param ltime DATE value.
+ */
Item_date_literal(MYSQL_TIME *ltime) :Item_date_func()
{
cached_time.set_date(ltime);
@@ -839,6 +843,11 @@ class Item_time_literal :public Item_tim
{
MYSQL_TIME_cache cached_time;
public:
+ /**
+ Constructor for Item_time_literal.
+ @param ltime TIME value.
+ @param dec_arg number of fractional digits in ltime.
+ */
Item_time_literal(MYSQL_TIME *ltime, uint dec_arg) :Item_time_func()
{
decimals= min(dec_arg, DATETIME_MAX_DECIMALS);
@@ -892,6 +901,11 @@ class Item_datetime_literal :public Item
{
MYSQL_TIME_cache cached_time;
public:
+ /**
+ Constructor for Item_datetime_literal.
+ @param ltime DATETIME value.
+ @param dec_arg number of fractional digits in ltime.
+ */
Item_datetime_literal(MYSQL_TIME *ltime, uint dec_arg) :Item_datetime_func()
{
decimals= min(dec_arg, DATETIME_MAX_DECIMALS);
@@ -947,6 +961,10 @@ protected:
// Abstract method that defines which time zone is used for conversion.
virtual Time_zone *time_zone()= 0;
public:
+ /**
+ Constructor for Item_func_curtime.
+ @param dec_arg Number of fractional digits.
+ */
Item_func_curtime(uint8 dec_arg) :Item_time_func() { decimals= dec_arg; }
void fix_length_and_dec();
longlong val_time_temporal()
@@ -1045,6 +1063,10 @@ class Item_func_now :public Item_datetim
protected:
virtual Time_zone *time_zone()= 0;
public:
+ /**
+ Constructor for Item_func_now.
+ @param dec_arg Number of fractional digits.
+ */
Item_func_now(uint8 dec_arg) :Item_datetime_func() { decimals= dec_arg; }
void fix_length_and_dec();
int save_in_field(Field *to, bool no_conversions);
No bundle (reason: useless for push emails).
| Thread |
|---|
| • bzr push into mysql-trunk branch (alexander.barkov:3552 to 3553) WL#946 | Alexander Barkov | 11 Nov |