summaryrefslogtreecommitdiff
path: root/sql/item_timefunc.h
diff options
context:
space:
mode:
Diffstat (limited to 'sql/item_timefunc.h')
-rw-r--r--sql/item_timefunc.h124
1 files changed, 52 insertions, 72 deletions
diff --git a/sql/item_timefunc.h b/sql/item_timefunc.h
index 2c99d6044af..9e3c2e8c89f 100644
--- a/sql/item_timefunc.h
+++ b/sql/item_timefunc.h
@@ -25,6 +25,9 @@ enum date_time_format_types
TIME_ONLY= 0, TIME_MICROSECOND, DATE_ONLY, DATE_TIME, DATE_TIME_MICROSECOND
};
+bool get_interval_value(Item *args,interval_type int_type,
+ String *str_value, INTERVAL *interval);
+
class Item_func_period_add :public Item_int_func
{
public:
@@ -64,6 +67,9 @@ public:
max_length=6*MY_CHARSET_BIN_MB_MAXLEN;
maybe_null=1;
}
+ enum_monotonicity_info get_monotonicity_info() const;
+ longlong val_int_endpoint(bool left_endp, bool *incl_endp);
+ bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
};
@@ -79,6 +85,7 @@ public:
max_length=2*MY_CHARSET_BIN_MB_MAXLEN;
maybe_null=1;
}
+ bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
};
@@ -103,6 +110,7 @@ public:
max_length=2*MY_CHARSET_BIN_MB_MAXLEN;
maybe_null=1;
}
+ bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
};
@@ -115,6 +123,7 @@ public:
String *val_str(String *str);
enum Item_result result_type () const { return STRING_RESULT; }
void fix_length_and_dec();
+ bool check_partition_func_processor(uchar *int_arg) {return TRUE;}
};
@@ -130,6 +139,7 @@ public:
max_length=3*MY_CHARSET_BIN_MB_MAXLEN;
maybe_null=1;
}
+ bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
};
@@ -145,6 +155,7 @@ public:
max_length=2*MY_CHARSET_BIN_MB_MAXLEN;
maybe_null=1;
}
+ bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
};
@@ -160,6 +171,7 @@ public:
max_length=2*MY_CHARSET_BIN_MB_MAXLEN;
maybe_null=1;
}
+ bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
};
@@ -175,6 +187,7 @@ public:
max_length=1*MY_CHARSET_BIN_MB_MAXLEN;
maybe_null=1;
}
+ bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
};
@@ -190,6 +203,7 @@ public:
max_length=2*MY_CHARSET_BIN_MB_MAXLEN;
maybe_null=1;
}
+ bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
};
@@ -219,6 +233,7 @@ public:
max_length=6*MY_CHARSET_BIN_MB_MAXLEN;
maybe_null=1;
}
+ bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
};
@@ -228,12 +243,15 @@ public:
Item_func_year(Item *a) :Item_int_func(a) {}
longlong val_int();
const char *func_name() const { return "year"; }
+ enum_monotonicity_info get_monotonicity_info() const;
+ longlong val_int_endpoint(bool left_endp, bool *incl_endp);
void fix_length_and_dec()
{
decimals=0;
max_length=4*MY_CHARSET_BIN_MB_MAXLEN;
maybe_null=1;
}
+ bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
};
@@ -263,6 +281,7 @@ public:
max_length=1*MY_CHARSET_BIN_MB_MAXLEN;
maybe_null=1;
}
+ bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
};
class Item_func_dayname :public Item_func_weekday
@@ -274,6 +293,7 @@ class Item_func_dayname :public Item_func_weekday
String *val_str(String *str);
enum Item_result result_type () const { return STRING_RESULT; }
void fix_length_and_dec();
+ bool check_partition_func_processor(uchar *int_arg) {return TRUE;}
};
@@ -304,6 +324,7 @@ public:
decimals=0;
max_length=10*MY_CHARSET_BIN_MB_MAXLEN;
}
+ bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
};
@@ -328,10 +349,10 @@ public:
decimals=0;
max_length=MAX_DATE_WIDTH*MY_CHARSET_BIN_MB_MAXLEN;
}
- Field *tmp_table_field(TABLE *t_arg)
+ Field *tmp_table_field(TABLE *table)
{
- return (new Field_newdate(maybe_null, name, t_arg, &my_charset_bin));
- }
+ return tmp_table_field_from_field_type(table, 0);
+ }
bool result_as_longlong() { return TRUE; }
my_decimal *val_decimal(my_decimal *decimal_value)
{
@@ -353,9 +374,9 @@ public:
Item_date_func(Item *a,Item *b) :Item_str_func(a,b) {}
Item_date_func(Item *a,Item *b, Item *c) :Item_str_func(a,b,c) {}
enum_field_types field_type() const { return MYSQL_TYPE_DATETIME; }
- Field *tmp_table_field(TABLE *t_arg)
+ Field *tmp_table_field(TABLE *table)
{
- return (new Field_datetime(maybe_null, name, t_arg, &my_charset_bin));
+ return tmp_table_field_from_field_type(table, 0);
}
bool result_as_longlong() { return TRUE; }
double val_real() { return (double) val_int(); }
@@ -384,9 +405,9 @@ public:
decimals= DATETIME_DEC;
max_length=MAX_TIME_WIDTH*MY_CHARSET_BIN_MB_MAXLEN;
}
- Field *tmp_table_field(TABLE *t_arg)
+ Field *tmp_table_field(TABLE *table)
{
- return (new Field_time(maybe_null, name, t_arg, &my_charset_bin));
+ return tmp_table_field_from_field_type(table, 0);
}
double val_real() { return val_real_from_decimal(); }
my_decimal *val_decimal(my_decimal *decimal_value)
@@ -417,10 +438,6 @@ public:
longlong val_int() { DBUG_ASSERT(fixed == 1); return value; }
String *val_str(String *str);
void fix_length_and_dec();
- Field *tmp_table_field(TABLE *t_arg)
- {
- return (new Field_time(maybe_null, name, t_arg, &my_charset_bin));
- }
/*
Abstract method that defines which time zone is used for conversion.
Converts time current time in my_time_t representation to broken-down
@@ -560,6 +577,7 @@ public:
Item_func_from_days(Item *a) :Item_date(a) {}
const char *func_name() const { return "from_days"; }
bool get_date(MYSQL_TIME *res, uint fuzzy_date);
+ bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
};
@@ -609,8 +627,6 @@ class Time_zone;
*/
class Item_func_convert_tz :public Item_date_func
{
- /* Cached pointer to list of pre-opened time zone tables. */
- TABLE_LIST *tz_tables;
/*
If time zone parameters are constants we are caching objects that
represent them (we use separate from_tz_cached/to_tz_cached members
@@ -625,7 +641,6 @@ class Item_func_convert_tz :public Item_date_func
longlong val_int();
String *val_str(String *str);
const char *func_name() const { return "convert_tz"; }
- bool fix_fields(THD *, Item **);
void fix_length_and_dec();
bool get_date(MYSQL_TIME *res, uint fuzzy_date);
void cleanup();
@@ -653,23 +668,6 @@ public:
bool result_as_longlong() { return TRUE; }
};
-/*
- 'interval_type' must be sorted so that simple intervals comes first,
- ie year, quarter, month, week, day, hour, etc. The order based on
- interval size is also important and the intervals should be kept in a
- large to smaller order. (get_interval_value() depends on this)
-*/
-
-enum interval_type
-{
- INTERVAL_YEAR, INTERVAL_QUARTER, INTERVAL_MONTH, INTERVAL_WEEK,
- INTERVAL_DAY, INTERVAL_HOUR, INTERVAL_MINUTE, INTERVAL_SECOND,
- INTERVAL_MICROSECOND, INTERVAL_YEAR_MONTH, INTERVAL_DAY_HOUR,
- INTERVAL_DAY_MINUTE, INTERVAL_DAY_SECOND, INTERVAL_HOUR_MINUTE,
- INTERVAL_HOUR_SECOND, INTERVAL_MINUTE_SECOND, INTERVAL_DAY_MICROSECOND,
- INTERVAL_HOUR_MICROSECOND, INTERVAL_MINUTE_MICROSECOND,
- INTERVAL_SECOND_MICROSECOND
-};
class Item_date_add_interval :public Item_date_func
{
@@ -688,7 +686,7 @@ public:
longlong val_int();
bool get_date(MYSQL_TIME *res, uint fuzzy_date);
bool eq(const Item *item, bool binary_cmp) const;
- void print(String *str);
+ virtual void print(String *str, enum_query_type query_type);
};
@@ -705,7 +703,8 @@ class Item_extract :public Item_int_func
const char *func_name() const { return "extract"; }
void fix_length_and_dec();
bool eq(const Item *item, bool binary_cmp) const;
- void print(String *str);
+ virtual void print(String *str, enum_query_type query_type);
+ bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
};
@@ -728,7 +727,7 @@ public:
max_length=args[0]->max_length;
}
virtual const char* cast_type() const= 0;
- void print(String *str);
+ virtual void print(String *str, enum_query_type query_type);
};
@@ -760,7 +759,7 @@ public:
const char* cast_type() const { return "char"; };
String *val_str(String *a);
void fix_length_and_dec();
- void print(String *str);
+ virtual void print(String *str, enum_query_type query_type);
};
@@ -774,9 +773,9 @@ public:
bool get_time(MYSQL_TIME *ltime);
const char *cast_type() const { return "date"; }
enum_field_types field_type() const { return MYSQL_TYPE_DATE; }
- Field *tmp_table_field(TABLE *t_arg)
+ Field *tmp_table_field(TABLE *table)
{
- return (new Field_newdate(maybe_null, name, t_arg, &my_charset_bin));
+ return tmp_table_field_from_field_type(table, 0);
}
void fix_length_and_dec()
{
@@ -808,9 +807,9 @@ public:
bool get_time(MYSQL_TIME *ltime);
const char *cast_type() const { return "time"; }
enum_field_types field_type() const { return MYSQL_TYPE_TIME; }
- Field *tmp_table_field(TABLE *t_arg)
+ Field *tmp_table_field(TABLE *table)
{
- return (new Field_time(maybe_null, name, t_arg, &my_charset_bin));
+ return tmp_table_field_from_field_type(table, 0);
}
bool result_as_longlong() { return TRUE; }
longlong val_int();
@@ -835,6 +834,10 @@ public:
String *val_str(String *str);
const char *cast_type() const { return "datetime"; }
enum_field_types field_type() const { return MYSQL_TYPE_DATETIME; }
+ Field *tmp_table_field(TABLE *table)
+ {
+ return tmp_table_field_from_field_type(table, 0);
+ }
void fix_length_and_dec()
{
collation.set(&my_charset_bin);
@@ -842,11 +845,6 @@ public:
max_length= MAX_DATETIME_FULL_WIDTH * MY_CHARSET_BIN_MB_MAXLEN;
decimals= DATETIME_DEC;
}
-
- Field *tmp_table_field(TABLE *t_arg)
- {
- return (new Field_datetime(maybe_null, name, t_arg, &my_charset_bin));
- }
bool result_as_longlong() { return TRUE; }
longlong val_int();
double val_real() { return val_real_from_decimal(); }
@@ -874,20 +872,7 @@ public:
decimals=0;
max_length=MAX_DATE_WIDTH*MY_CHARSET_BIN_MB_MAXLEN;
}
- Field *tmp_table_field(TABLE *t_arg)
- {
- return (new Field_newdate(maybe_null, name, t_arg, &my_charset_bin));
- }
longlong val_int();
- my_decimal *val_decimal(my_decimal *decimal_value)
- {
- DBUG_ASSERT(fixed == 1);
- return val_decimal_from_date(decimal_value);
- }
- int save_in_field(Field *field, bool no_conversions)
- {
- return save_date_in_field(field);
- }
};
@@ -904,20 +889,11 @@ public:
enum_field_types field_type() const { return cached_field_type; }
void fix_length_and_dec();
-/*
- TODO:
- Change this when we support
- microseconds in TIME/DATETIME
-*/
- Field *tmp_table_field(TABLE *t_arg)
+ Field *tmp_table_field(TABLE *table)
{
- if (cached_field_type == MYSQL_TYPE_TIME)
- return (new Field_time(maybe_null, name, t_arg, &my_charset_bin));
- else if (cached_field_type == MYSQL_TYPE_DATETIME)
- return (new Field_datetime(maybe_null, name, t_arg, &my_charset_bin));
- return (new Field_string(max_length, maybe_null, name, t_arg, &my_charset_bin));
+ return tmp_table_field_from_field_type(table, 0);
}
- void print(String *str);
+ virtual void print(String *str, enum_query_type query_type);
const char *func_name() const { return "add_time"; }
double val_real() { return val_real_from_decimal(); }
my_decimal *val_decimal(my_decimal *decimal_value)
@@ -976,6 +952,7 @@ public:
decimals=0;
maybe_null=1;
}
+ bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
};
@@ -992,7 +969,7 @@ public:
decimals=0;
maybe_null=1;
}
- void print(String *str);
+ virtual void print(String *str, enum_query_type query_type);
};
@@ -1016,7 +993,7 @@ public:
decimals=0;
max_length=17*MY_CHARSET_BIN_MB_MAXLEN;
}
- void print(String *str);
+ virtual void print(String *str, enum_query_type query_type);
};
@@ -1035,7 +1012,10 @@ public:
const char *func_name() const { return "str_to_date"; }
enum_field_types field_type() const { return cached_field_type; }
void fix_length_and_dec();
- Field *tmp_table_field(TABLE *t_arg);
+ Field *tmp_table_field(TABLE *table)
+ {
+ return tmp_table_field_from_field_type(table, 1);
+ }
};