Commit 1ec91803 authored by Alexander Barkov's avatar Alexander Barkov

MDEV-10317 EXCTACT(MINUTE_MICROSECOND) truncates data

parent 3ccf8218
......@@ -2806,3 +2806,332 @@ Warning 1292 Truncated incorrect time value: '-1441:00:00'
#
# End of 10.0 tests
#
#
# Start of 10.1 tests
#
#
# MDEV-10317 EXCTACT(MINUTE_MICROSECOND) truncates data
#
CREATE TABLE t1 (a DATETIME(6));
INSERT INTO t1 VALUES ('1999-12-31 23:59:59.999999');
SELECT
a,
EXTRACT(YEAR FROM a),
EXTRACT(YEAR_MONTH FROM a),
EXTRACT(QUARTER FROM a),
EXTRACT(MONTH FROM a),
EXTRACT(WEEK FROM a),
EXTRACT(DAY FROM a),
EXTRACT(DAY_HOUR FROM a),
EXTRACT(DAY_MINUTE FROM a),
EXTRACT(DAY_SECOND FROM a),
EXTRACT(HOUR FROM a),
EXTRACT(HOUR_MINUTE FROM a),
EXTRACT(HOUR_SECOND FROM a),
EXTRACT(MINUTE FROM a),
EXTRACT(MINUTE_SECOND FROM a),
EXTRACT(SECOND FROM a),
EXTRACT(MICROSECOND FROM a),
EXTRACT(DAY_MICROSECOND FROM a),
EXTRACT(HOUR_MICROSECOND FROM a),
EXTRACT(MINUTE_MICROSECOND FROM a),
EXTRACT(SECOND_MICROSECOND FROM a)
FROM t1;
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
def test t1 t1 a a 12 26 26 Y 128 6 63
def EXTRACT(YEAR FROM a) 3 4 4 Y 32896 0 63
def EXTRACT(YEAR_MONTH FROM a) 3 6 6 Y 32896 0 63
def EXTRACT(QUARTER FROM a) 3 2 1 Y 32896 0 63
def EXTRACT(MONTH FROM a) 3 2 2 Y 32896 0 63
def EXTRACT(WEEK FROM a) 3 2 2 Y 32896 0 63
def EXTRACT(DAY FROM a) 3 2 2 Y 32896 0 63
def EXTRACT(DAY_HOUR FROM a) 3 5 4 Y 32896 0 63
def EXTRACT(DAY_MINUTE FROM a) 3 7 6 Y 32896 0 63
def EXTRACT(DAY_SECOND FROM a) 3 9 8 Y 32896 0 63
def EXTRACT(HOUR FROM a) 3 3 2 Y 32896 0 63
def EXTRACT(HOUR_MINUTE FROM a) 3 5 4 Y 32896 0 63
def EXTRACT(HOUR_SECOND FROM a) 3 7 6 Y 32896 0 63
def EXTRACT(MINUTE FROM a) 3 3 2 Y 32896 0 63
def EXTRACT(MINUTE_SECOND FROM a) 3 5 4 Y 32896 0 63
def EXTRACT(SECOND FROM a) 3 3 2 Y 32896 0 63
def EXTRACT(MICROSECOND FROM a) 3 7 6 Y 32896 0 63
def EXTRACT(DAY_MICROSECOND FROM a) 8 15 14 Y 32896 0 63
def EXTRACT(HOUR_MICROSECOND FROM a) 8 13 12 Y 32896 0 63
def EXTRACT(MINUTE_MICROSECOND FROM a) 8 11 10 Y 32896 0 63
def EXTRACT(SECOND_MICROSECOND FROM a) 3 9 8 Y 32896 0 63
a 1999-12-31 23:59:59.999999
EXTRACT(YEAR FROM a) 1999
EXTRACT(YEAR_MONTH FROM a) 199912
EXTRACT(QUARTER FROM a) 4
EXTRACT(MONTH FROM a) 12
EXTRACT(WEEK FROM a) 52
EXTRACT(DAY FROM a) 31
EXTRACT(DAY_HOUR FROM a) 3123
EXTRACT(DAY_MINUTE FROM a) 312359
EXTRACT(DAY_SECOND FROM a) 31235959
EXTRACT(HOUR FROM a) 23
EXTRACT(HOUR_MINUTE FROM a) 2359
EXTRACT(HOUR_SECOND FROM a) 235959
EXTRACT(MINUTE FROM a) 59
EXTRACT(MINUTE_SECOND FROM a) 5959
EXTRACT(SECOND FROM a) 59
EXTRACT(MICROSECOND FROM a) 999999
EXTRACT(DAY_MICROSECOND FROM a) 31235959999999
EXTRACT(HOUR_MICROSECOND FROM a) 235959999999
EXTRACT(MINUTE_MICROSECOND FROM a) 5959999999
EXTRACT(SECOND_MICROSECOND FROM a) 59999999
CREATE TABLE t2 AS SELECT
a,
EXTRACT(YEAR FROM a),
EXTRACT(YEAR_MONTH FROM a),
EXTRACT(QUARTER FROM a),
EXTRACT(MONTH FROM a),
EXTRACT(WEEK FROM a),
EXTRACT(DAY FROM a),
EXTRACT(DAY_HOUR FROM a),
EXTRACT(DAY_MINUTE FROM a),
EXTRACT(DAY_SECOND FROM a),
EXTRACT(HOUR FROM a),
EXTRACT(HOUR_MINUTE FROM a),
EXTRACT(HOUR_SECOND FROM a),
EXTRACT(MINUTE FROM a),
EXTRACT(MINUTE_SECOND FROM a),
EXTRACT(SECOND FROM a),
EXTRACT(MICROSECOND FROM a),
EXTRACT(DAY_MICROSECOND FROM a),
EXTRACT(HOUR_MICROSECOND FROM a),
EXTRACT(MINUTE_MICROSECOND FROM a),
EXTRACT(SECOND_MICROSECOND FROM a)
FROM t1;
SELECT * FROM t2;
a 1999-12-31 23:59:59.999999
EXTRACT(YEAR FROM a) 1999
EXTRACT(YEAR_MONTH FROM a) 199912
EXTRACT(QUARTER FROM a) 4
EXTRACT(MONTH FROM a) 12
EXTRACT(WEEK FROM a) 52
EXTRACT(DAY FROM a) 31
EXTRACT(DAY_HOUR FROM a) 3123
EXTRACT(DAY_MINUTE FROM a) 312359
EXTRACT(DAY_SECOND FROM a) 31235959
EXTRACT(HOUR FROM a) 23
EXTRACT(HOUR_MINUTE FROM a) 2359
EXTRACT(HOUR_SECOND FROM a) 235959
EXTRACT(MINUTE FROM a) 59
EXTRACT(MINUTE_SECOND FROM a) 5959
EXTRACT(SECOND FROM a) 59
EXTRACT(MICROSECOND FROM a) 999999
EXTRACT(DAY_MICROSECOND FROM a) 31235959999999
EXTRACT(HOUR_MICROSECOND FROM a) 235959999999
EXTRACT(MINUTE_MICROSECOND FROM a) 5959999999
EXTRACT(SECOND_MICROSECOND FROM a) 59999999
SHOW CREATE TABLE t2;
Table Create Table
t2 CREATE TABLE `t2` (
`a` datetime(6) DEFAULT NULL,
`EXTRACT(YEAR FROM a)` int(4) DEFAULT NULL,
`EXTRACT(YEAR_MONTH FROM a)` int(6) DEFAULT NULL,
`EXTRACT(QUARTER FROM a)` int(2) DEFAULT NULL,
`EXTRACT(MONTH FROM a)` int(2) DEFAULT NULL,
`EXTRACT(WEEK FROM a)` int(2) DEFAULT NULL,
`EXTRACT(DAY FROM a)` int(2) DEFAULT NULL,
`EXTRACT(DAY_HOUR FROM a)` int(5) DEFAULT NULL,
`EXTRACT(DAY_MINUTE FROM a)` int(7) DEFAULT NULL,
`EXTRACT(DAY_SECOND FROM a)` int(9) DEFAULT NULL,
`EXTRACT(HOUR FROM a)` int(3) DEFAULT NULL,
`EXTRACT(HOUR_MINUTE FROM a)` int(5) DEFAULT NULL,
`EXTRACT(HOUR_SECOND FROM a)` int(7) DEFAULT NULL,
`EXTRACT(MINUTE FROM a)` int(3) DEFAULT NULL,
`EXTRACT(MINUTE_SECOND FROM a)` int(5) DEFAULT NULL,
`EXTRACT(SECOND FROM a)` int(3) DEFAULT NULL,
`EXTRACT(MICROSECOND FROM a)` int(7) DEFAULT NULL,
`EXTRACT(DAY_MICROSECOND FROM a)` bigint(15) DEFAULT NULL,
`EXTRACT(HOUR_MICROSECOND FROM a)` bigint(13) DEFAULT NULL,
`EXTRACT(MINUTE_MICROSECOND FROM a)` bigint(11) DEFAULT NULL,
`EXTRACT(SECOND_MICROSECOND FROM a)` int(9) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE t1,t2;
CREATE TABLE t1 (a TIME(6));
INSERT INTO t1 VALUES ('-838:59:59.999999'),('838:59:59.999999');
SELECT
a,
EXTRACT(YEAR FROM a),
EXTRACT(YEAR_MONTH FROM a),
EXTRACT(QUARTER FROM a),
EXTRACT(MONTH FROM a),
EXTRACT(WEEK FROM a),
EXTRACT(DAY FROM a),
EXTRACT(DAY_HOUR FROM a),
EXTRACT(DAY_MINUTE FROM a),
EXTRACT(DAY_SECOND FROM a),
EXTRACT(HOUR FROM a),
EXTRACT(HOUR_MINUTE FROM a),
EXTRACT(HOUR_SECOND FROM a),
EXTRACT(MINUTE FROM a),
EXTRACT(MINUTE_SECOND FROM a),
EXTRACT(SECOND FROM a),
EXTRACT(MICROSECOND FROM a),
EXTRACT(DAY_MICROSECOND FROM a),
EXTRACT(HOUR_MICROSECOND FROM a),
EXTRACT(MINUTE_MICROSECOND FROM a),
EXTRACT(SECOND_MICROSECOND FROM a)
FROM t1;
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
def test t1 t1 a a 11 17 17 Y 128 6 63
def EXTRACT(YEAR FROM a) 3 4 1 Y 32896 0 63
def EXTRACT(YEAR_MONTH FROM a) 3 6 1 Y 32896 0 63
def EXTRACT(QUARTER FROM a) 3 2 1 Y 32896 0 63
def EXTRACT(MONTH FROM a) 3 2 1 Y 32896 0 63
def EXTRACT(WEEK FROM a) 3 2 9 Y 32896 0 63
def EXTRACT(DAY FROM a) 3 2 2 Y 32896 0 63
def EXTRACT(DAY_HOUR FROM a) 3 5 5 Y 32896 0 63
def EXTRACT(DAY_MINUTE FROM a) 3 7 7 Y 32896 0 63
def EXTRACT(DAY_SECOND FROM a) 3 9 9 Y 32896 0 63
def EXTRACT(HOUR FROM a) 3 3 3 Y 32896 0 63
def EXTRACT(HOUR_MINUTE FROM a) 3 5 5 Y 32896 0 63
def EXTRACT(HOUR_SECOND FROM a) 3 7 7 Y 32896 0 63
def EXTRACT(MINUTE FROM a) 3 3 3 Y 32896 0 63
def EXTRACT(MINUTE_SECOND FROM a) 3 5 5 Y 32896 0 63
def EXTRACT(SECOND FROM a) 3 3 3 Y 32896 0 63
def EXTRACT(MICROSECOND FROM a) 3 7 7 Y 32896 0 63
def EXTRACT(DAY_MICROSECOND FROM a) 8 15 15 Y 32896 0 63
def EXTRACT(HOUR_MICROSECOND FROM a) 8 13 13 Y 32896 0 63
def EXTRACT(MINUTE_MICROSECOND FROM a) 8 11 11 Y 32896 0 63
def EXTRACT(SECOND_MICROSECOND FROM a) 3 9 9 Y 32896 0 63
a -838:59:59.999999
EXTRACT(YEAR FROM a) 0
EXTRACT(YEAR_MONTH FROM a) 0
EXTRACT(QUARTER FROM a) 0
EXTRACT(MONTH FROM a) 0
EXTRACT(WEEK FROM a) 613566757
EXTRACT(DAY FROM a) 34
EXTRACT(DAY_HOUR FROM a) -3422
EXTRACT(DAY_MINUTE FROM a) -342259
EXTRACT(DAY_SECOND FROM a) -34225959
EXTRACT(HOUR FROM a) -22
EXTRACT(HOUR_MINUTE FROM a) -2259
EXTRACT(HOUR_SECOND FROM a) -225959
EXTRACT(MINUTE FROM a) -59
EXTRACT(MINUTE_SECOND FROM a) -5959
EXTRACT(SECOND FROM a) -59
EXTRACT(MICROSECOND FROM a) -999999
EXTRACT(DAY_MICROSECOND FROM a) -34225959999999
EXTRACT(HOUR_MICROSECOND FROM a) -225959999999
EXTRACT(MINUTE_MICROSECOND FROM a) -5959999999
EXTRACT(SECOND_MICROSECOND FROM a) -59999999
a 838:59:59.999999
EXTRACT(YEAR FROM a) 0
EXTRACT(YEAR_MONTH FROM a) 0
EXTRACT(QUARTER FROM a) 0
EXTRACT(MONTH FROM a) 0
EXTRACT(WEEK FROM a) 613566757
EXTRACT(DAY FROM a) 34
EXTRACT(DAY_HOUR FROM a) 3422
EXTRACT(DAY_MINUTE FROM a) 342259
EXTRACT(DAY_SECOND FROM a) 34225959
EXTRACT(HOUR FROM a) 22
EXTRACT(HOUR_MINUTE FROM a) 2259
EXTRACT(HOUR_SECOND FROM a) 225959
EXTRACT(MINUTE FROM a) 59
EXTRACT(MINUTE_SECOND FROM a) 5959
EXTRACT(SECOND FROM a) 59
EXTRACT(MICROSECOND FROM a) 999999
EXTRACT(DAY_MICROSECOND FROM a) 34225959999999
EXTRACT(HOUR_MICROSECOND FROM a) 225959999999
EXTRACT(MINUTE_MICROSECOND FROM a) 5959999999
EXTRACT(SECOND_MICROSECOND FROM a) 59999999
CREATE TABLE t2 AS SELECT
a,
EXTRACT(YEAR FROM a),
EXTRACT(YEAR_MONTH FROM a),
EXTRACT(QUARTER FROM a),
EXTRACT(MONTH FROM a),
EXTRACT(WEEK FROM a),
EXTRACT(DAY FROM a),
EXTRACT(DAY_HOUR FROM a),
EXTRACT(DAY_MINUTE FROM a),
EXTRACT(DAY_SECOND FROM a),
EXTRACT(HOUR FROM a),
EXTRACT(HOUR_MINUTE FROM a),
EXTRACT(HOUR_SECOND FROM a),
EXTRACT(MINUTE FROM a),
EXTRACT(MINUTE_SECOND FROM a),
EXTRACT(SECOND FROM a),
EXTRACT(MICROSECOND FROM a),
EXTRACT(DAY_MICROSECOND FROM a),
EXTRACT(HOUR_MICROSECOND FROM a),
EXTRACT(MINUTE_MICROSECOND FROM a),
EXTRACT(SECOND_MICROSECOND FROM a)
FROM t1;
SELECT * FROM t2;
a -838:59:59.999999
EXTRACT(YEAR FROM a) 0
EXTRACT(YEAR_MONTH FROM a) 0
EXTRACT(QUARTER FROM a) 0
EXTRACT(MONTH FROM a) 0
EXTRACT(WEEK FROM a) 613566757
EXTRACT(DAY FROM a) 34
EXTRACT(DAY_HOUR FROM a) -3422
EXTRACT(DAY_MINUTE FROM a) -342259
EXTRACT(DAY_SECOND FROM a) -34225959
EXTRACT(HOUR FROM a) -22
EXTRACT(HOUR_MINUTE FROM a) -2259
EXTRACT(HOUR_SECOND FROM a) -225959
EXTRACT(MINUTE FROM a) -59
EXTRACT(MINUTE_SECOND FROM a) -5959
EXTRACT(SECOND FROM a) -59
EXTRACT(MICROSECOND FROM a) -999999
EXTRACT(DAY_MICROSECOND FROM a) -34225959999999
EXTRACT(HOUR_MICROSECOND FROM a) -225959999999
EXTRACT(MINUTE_MICROSECOND FROM a) -5959999999
EXTRACT(SECOND_MICROSECOND FROM a) -59999999
a 838:59:59.999999
EXTRACT(YEAR FROM a) 0
EXTRACT(YEAR_MONTH FROM a) 0
EXTRACT(QUARTER FROM a) 0
EXTRACT(MONTH FROM a) 0
EXTRACT(WEEK FROM a) 613566757
EXTRACT(DAY FROM a) 34
EXTRACT(DAY_HOUR FROM a) 3422
EXTRACT(DAY_MINUTE FROM a) 342259
EXTRACT(DAY_SECOND FROM a) 34225959
EXTRACT(HOUR FROM a) 22
EXTRACT(HOUR_MINUTE FROM a) 2259
EXTRACT(HOUR_SECOND FROM a) 225959
EXTRACT(MINUTE FROM a) 59
EXTRACT(MINUTE_SECOND FROM a) 5959
EXTRACT(SECOND FROM a) 59
EXTRACT(MICROSECOND FROM a) 999999
EXTRACT(DAY_MICROSECOND FROM a) 34225959999999
EXTRACT(HOUR_MICROSECOND FROM a) 225959999999
EXTRACT(MINUTE_MICROSECOND FROM a) 5959999999
EXTRACT(SECOND_MICROSECOND FROM a) 59999999
SHOW CREATE TABLE t2;
Table Create Table
t2 CREATE TABLE `t2` (
`a` time(6) DEFAULT NULL,
`EXTRACT(YEAR FROM a)` int(4) DEFAULT NULL,
`EXTRACT(YEAR_MONTH FROM a)` int(6) DEFAULT NULL,
`EXTRACT(QUARTER FROM a)` int(2) DEFAULT NULL,
`EXTRACT(MONTH FROM a)` int(2) DEFAULT NULL,
`EXTRACT(WEEK FROM a)` int(2) DEFAULT NULL,
`EXTRACT(DAY FROM a)` int(2) DEFAULT NULL,
`EXTRACT(DAY_HOUR FROM a)` int(5) DEFAULT NULL,
`EXTRACT(DAY_MINUTE FROM a)` int(7) DEFAULT NULL,
`EXTRACT(DAY_SECOND FROM a)` int(9) DEFAULT NULL,
`EXTRACT(HOUR FROM a)` int(3) DEFAULT NULL,
`EXTRACT(HOUR_MINUTE FROM a)` int(5) DEFAULT NULL,
`EXTRACT(HOUR_SECOND FROM a)` int(7) DEFAULT NULL,
`EXTRACT(MINUTE FROM a)` int(3) DEFAULT NULL,
`EXTRACT(MINUTE_SECOND FROM a)` int(5) DEFAULT NULL,
`EXTRACT(SECOND FROM a)` int(3) DEFAULT NULL,
`EXTRACT(MICROSECOND FROM a)` int(7) DEFAULT NULL,
`EXTRACT(DAY_MICROSECOND FROM a)` bigint(15) DEFAULT NULL,
`EXTRACT(HOUR_MICROSECOND FROM a)` bigint(13) DEFAULT NULL,
`EXTRACT(MINUTE_MICROSECOND FROM a)` bigint(11) DEFAULT NULL,
`EXTRACT(SECOND_MICROSECOND FROM a)` int(9) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE t1,t2;
#
# End of 10.1 tests
#
......@@ -1712,3 +1712,77 @@ SELECT
--echo #
--echo # End of 10.0 tests
--echo #
--echo #
--echo # Start of 10.1 tests
--echo #
--echo #
--echo # MDEV-10317 EXCTACT(MINUTE_MICROSECOND) truncates data
--echo #
let $query=
SELECT
a,
EXTRACT(YEAR FROM a),
EXTRACT(YEAR_MONTH FROM a),
EXTRACT(QUARTER FROM a),
EXTRACT(MONTH FROM a),
EXTRACT(WEEK FROM a),
EXTRACT(DAY FROM a),
EXTRACT(DAY_HOUR FROM a),
EXTRACT(DAY_MINUTE FROM a),
EXTRACT(DAY_SECOND FROM a),
EXTRACT(HOUR FROM a),
EXTRACT(HOUR_MINUTE FROM a),
EXTRACT(HOUR_SECOND FROM a),
EXTRACT(MINUTE FROM a),
EXTRACT(MINUTE_SECOND FROM a),
EXTRACT(SECOND FROM a),
EXTRACT(MICROSECOND FROM a),
EXTRACT(DAY_MICROSECOND FROM a),
EXTRACT(HOUR_MICROSECOND FROM a),
EXTRACT(MINUTE_MICROSECOND FROM a),
EXTRACT(SECOND_MICROSECOND FROM a)
FROM t1;
CREATE TABLE t1 (a DATETIME(6));
INSERT INTO t1 VALUES ('1999-12-31 23:59:59.999999');
--vertical_results
--enable_metadata
--disable_ps_protocol
--eval $query
--enable_ps_protocol
--disable_metadata
--horizontal_results
--eval CREATE TABLE t2 AS $query
--vertical_results
SELECT * FROM t2;
--horizontal_results
SHOW CREATE TABLE t2;
DROP TABLE t1,t2;
CREATE TABLE t1 (a TIME(6));
INSERT INTO t1 VALUES ('-838:59:59.999999'),('838:59:59.999999');
--vertical_results
--enable_metadata
--disable_ps_protocol
--eval $query
--enable_ps_protocol
--disable_metadata
--horizontal_results
--eval CREATE TABLE t2 AS $query
--vertical_results
SELECT * FROM t2;
--horizontal_results
SHOW CREATE TABLE t2;
DROP TABLE t1,t2;
--echo #
--echo # End of 10.1 tests
--echo #
......@@ -2192,26 +2192,26 @@ void Item_extract::fix_length_and_dec()
{
maybe_null=1; // If wrong date
switch (int_type) {
case INTERVAL_YEAR: max_length=4; date_value=1; break;
case INTERVAL_YEAR_MONTH: max_length=6; date_value=1; break;
case INTERVAL_QUARTER: max_length=2; date_value=1; break;
case INTERVAL_MONTH: max_length=2; date_value=1; break;
case INTERVAL_WEEK: max_length=2; date_value=1; break;
case INTERVAL_DAY: max_length=2; date_value=1; break;
case INTERVAL_DAY_HOUR: max_length=9; date_value=0; break;
case INTERVAL_DAY_MINUTE: max_length=11; date_value=0; break;
case INTERVAL_DAY_SECOND: max_length=13; date_value=0; break;
case INTERVAL_HOUR: max_length=2; date_value=0; break;
case INTERVAL_HOUR_MINUTE: max_length=4; date_value=0; break;
case INTERVAL_HOUR_SECOND: max_length=6; date_value=0; break;
case INTERVAL_MINUTE: max_length=2; date_value=0; break;
case INTERVAL_MINUTE_SECOND: max_length=4; date_value=0; break;
case INTERVAL_SECOND: max_length=2; date_value=0; break;
case INTERVAL_MICROSECOND: max_length=2; date_value=0; break;
case INTERVAL_DAY_MICROSECOND: max_length=20; date_value=0; break;
case INTERVAL_HOUR_MICROSECOND: max_length=13; date_value=0; break;
case INTERVAL_MINUTE_MICROSECOND: max_length=11; date_value=0; break;
case INTERVAL_SECOND_MICROSECOND: max_length=9; date_value=0; break;
case INTERVAL_YEAR: set_date_length(4); break; // YYYY
case INTERVAL_YEAR_MONTH: set_date_length(6); break; // YYYYMM
case INTERVAL_QUARTER: set_date_length(2); break; // 1..4
case INTERVAL_MONTH: set_date_length(2); break; // MM
case INTERVAL_WEEK: set_date_length(2); break; // 0..52
case INTERVAL_DAY: set_date_length(2); break; // DD
case INTERVAL_DAY_HOUR: set_time_length(4); break; // DDhh
case INTERVAL_DAY_MINUTE: set_time_length(6); break; // DDhhmm
case INTERVAL_DAY_SECOND: set_time_length(8); break; // DDhhmmss
case INTERVAL_HOUR: set_time_length(2); break; // hh
case INTERVAL_HOUR_MINUTE: set_time_length(4); break; // hhmm
case INTERVAL_HOUR_SECOND: set_time_length(6); break; // hhmmss
case INTERVAL_MINUTE: set_time_length(2); break; // mm
case INTERVAL_MINUTE_SECOND: set_time_length(4); break; // mmss
case INTERVAL_SECOND: set_time_length(2); break; // ss
case INTERVAL_MICROSECOND: set_time_length(6); break; // ffffff
case INTERVAL_DAY_MICROSECOND: set_time_length(14); break; // DDhhmmssffffff
case INTERVAL_HOUR_MICROSECOND: set_time_length(12); break; // hhmmssffffff
case INTERVAL_MINUTE_MICROSECOND: set_time_length(10); break; // mmssffffff
case INTERVAL_SECOND_MICROSECOND: set_time_length(8); break; // ssffffff
case INTERVAL_LAST: DBUG_ASSERT(0); break; /* purecov: deadcode */
}
}
......
......@@ -835,10 +835,57 @@ class Item_date_add_interval :public Item_temporal_hybrid_func
class Item_extract :public Item_int_func
{
bool date_value;
void set_date_length(uint32 length)
{
/*
Although DATE components (e.g. YEAR, YEAR_MONTH, QUARTER, MONTH, WEEK)
cannot have a sign, we should probably still add +1,
because all around the code we assume that max_length is sign inclusive.
Another options is to set unsigned_flag to "true".
*/
max_length= length; //QQ: see above
date_value= true;
}
void set_time_length(uint32 length)
{
max_length= length + 1/*sign*/;
date_value= false;
}
public:
const interval_type int_type; // keep it public
Item_extract(THD *thd, interval_type type_arg, Item *a):
Item_int_func(thd, a), int_type(type_arg) {}
enum_field_types field_type() const
{
switch (int_type) {
case INTERVAL_YEAR:
case INTERVAL_YEAR_MONTH:
case INTERVAL_QUARTER:
case INTERVAL_MONTH:
case INTERVAL_WEEK:
case INTERVAL_DAY:
case INTERVAL_DAY_HOUR:
case INTERVAL_DAY_MINUTE:
case INTERVAL_DAY_SECOND:
case INTERVAL_HOUR:
case INTERVAL_HOUR_MINUTE:
case INTERVAL_HOUR_SECOND:
case INTERVAL_MINUTE:
case INTERVAL_MINUTE_SECOND:
case INTERVAL_SECOND:
case INTERVAL_MICROSECOND:
case INTERVAL_SECOND_MICROSECOND:
return MYSQL_TYPE_LONG;
case INTERVAL_DAY_MICROSECOND:
case INTERVAL_HOUR_MICROSECOND:
case INTERVAL_MINUTE_MICROSECOND:
return MYSQL_TYPE_LONGLONG;
case INTERVAL_LAST:
break;
}
DBUG_ASSERT(0);
return MYSQL_TYPE_LONGLONG;
}
longlong val_int();
enum Functype functype() const { return EXTRACT_FUNC; }
const char *func_name() const { return "extract"; }
......@@ -883,6 +930,8 @@ class Item_extract :public Item_int_func
}
return true;
}
Field *create_field_for_create_select(TABLE *table)
{ return tmp_table_field_from_field_type(table, false, false); }
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment