diff options
-rw-r--r-- | mysql-test/r/func_time.result | 58 | ||||
-rw-r--r-- | mysql-test/t/func_time.test | 43 | ||||
-rw-r--r-- | sql/item_timefunc.cc | 7 | ||||
-rw-r--r-- | sql/item_timefunc.h | 5 |
4 files changed, 110 insertions, 3 deletions
diff --git a/mysql-test/r/func_time.result b/mysql-test/r/func_time.result index e03de2ca582..477a6a4041a 100644 --- a/mysql-test/r/func_time.result +++ b/mysql-test/r/func_time.result @@ -3402,3 +3402,61 @@ CAST(LAST_DAY(TIME'00:00:00') AS TIME) AS c3; c1 c2 c3 2018-02-28 00:00:00 00:00:00 SET TIMESTAMP=DEFAULT; +# +# MDEV-15702 Remove the use of STRING_ITEM from Item_func_date_format::fix_length_and_dec() +# +SELECT DATE_FORMAT('2001-01-01',POINT(1,1)); +ERROR HY000: Illegal parameter data type geometry for operation 'date_format' +SELECT DATE_FORMAT(POINT(1,1),'10'); +ERROR HY000: Illegal parameter data type geometry for operation 'date_format' +SELECT DATE_FORMAT('2001-01-01',ROW(1,1)); +ERROR HY000: Illegal parameter data type row for operation 'date_format' +SELECT DATE_FORMAT(ROW(1,1),'10'); +ERROR HY000: Illegal parameter data type row for operation 'date_format' +SELECT DATE_FORMAT('2001-01-01','%Y',POINT(1,1)); +ERROR HY000: Illegal parameter data type geometry for operation 'date_format' +SELECT DATE_FORMAT('2001-01-01','%Y',ROW(1,1)); +ERROR HY000: Illegal parameter data type row for operation 'date_format' +SELECT DATE_FORMAT('2001-01-01','%Y',@unknown_user_variable); +DATE_FORMAT('2001-01-01','%Y',@unknown_user_variable) +2001 +Warnings: +Warning 1649 Unknown locale: 'NULL' +CREATE TABLE t1 AS SELECT +DATE_FORMAT('2001-01-01',NULL) AS c0, +DATE_FORMAT('2001-01-01','10') AS c1, +DATE_FORMAT('2001-01-01',10) AS c2, +DATE_FORMAT('2001-01-01',10.0) AS c3, +DATE_FORMAT('2001-01-01',10e0) AS c4, +DATE_FORMAT('2001-01-01',TIME'10:20:30') AS c5; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c0` char(0) DEFAULT NULL, + `c1` varchar(2) DEFAULT NULL, + `c2` varchar(2) DEFAULT NULL, + `c3` varchar(4) DEFAULT NULL, + `c4` varchar(2) DEFAULT NULL, + `c5` varchar(8) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +DROP TABLE t1; +EXECUTE IMMEDIATE +"CREATE TABLE t1 AS SELECT + DATE_FORMAT('2001-01-01',?) AS c0, + DATE_FORMAT('2001-01-01',?) AS c1, + DATE_FORMAT('2001-01-01',?) AS c2, + DATE_FORMAT('2001-01-01',?) AS c3, + DATE_FORMAT('2001-01-01',?) AS c4, + DATE_FORMAT('2001-01-01',?) AS c5" +USING NULL, '10', 10, 10.0, 10e0, TIME'10:20:30'; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c0` char(0) DEFAULT NULL, + `c1` varchar(2) DEFAULT NULL, + `c2` varchar(2) DEFAULT NULL, + `c3` varchar(4) DEFAULT NULL, + `c4` varchar(2) DEFAULT NULL, + `c5` varchar(100) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +DROP TABLE t1; diff --git a/mysql-test/t/func_time.test b/mysql-test/t/func_time.test index a475c33b925..ad81a336544 100644 --- a/mysql-test/t/func_time.test +++ b/mysql-test/t/func_time.test @@ -1998,3 +1998,46 @@ SELECT CAST(CAST(LAST_DAY(TIME'00:00:00') AS DATE) AS TIME) AS c2, CAST(LAST_DAY(TIME'00:00:00') AS TIME) AS c3; SET TIMESTAMP=DEFAULT; + + +--echo # +--echo # MDEV-15702 Remove the use of STRING_ITEM from Item_func_date_format::fix_length_and_dec() +--echo # + +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT DATE_FORMAT('2001-01-01',POINT(1,1)); +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT DATE_FORMAT(POINT(1,1),'10'); +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT DATE_FORMAT('2001-01-01',ROW(1,1)); +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT DATE_FORMAT(ROW(1,1),'10'); + +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT DATE_FORMAT('2001-01-01','%Y',POINT(1,1)); +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +SELECT DATE_FORMAT('2001-01-01','%Y',ROW(1,1)); + +SELECT DATE_FORMAT('2001-01-01','%Y',@unknown_user_variable); + +CREATE TABLE t1 AS SELECT + DATE_FORMAT('2001-01-01',NULL) AS c0, + DATE_FORMAT('2001-01-01','10') AS c1, + DATE_FORMAT('2001-01-01',10) AS c2, + DATE_FORMAT('2001-01-01',10.0) AS c3, + DATE_FORMAT('2001-01-01',10e0) AS c4, + DATE_FORMAT('2001-01-01',TIME'10:20:30') AS c5; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +EXECUTE IMMEDIATE +"CREATE TABLE t1 AS SELECT + DATE_FORMAT('2001-01-01',?) AS c0, + DATE_FORMAT('2001-01-01',?) AS c1, + DATE_FORMAT('2001-01-01',?) AS c2, + DATE_FORMAT('2001-01-01',?) AS c3, + DATE_FORMAT('2001-01-01',?) AS c4, + DATE_FORMAT('2001-01-01',?) AS c5" +USING NULL, '10', 10, 10.0, 10e0, TIME'10:20:30'; +SHOW CREATE TABLE t1; +DROP TABLE t1; diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index 4ddeb83b163..f612b4d6aa2 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -1859,11 +1859,12 @@ void Item_func_date_format::fix_length_and_dec() if (!thd->variables.lc_time_names->is_ascii) repertoire|= MY_REPERTOIRE_EXTENDED; collation.set(cs, arg1->collation.derivation, repertoire); - if (arg1->type() == STRING_ITEM) + StringBuffer<STRING_BUFFER_USUAL_SIZE> buffer; + String *str; + if (args[1]->basic_const_item() && (str= args[1]->val_str(&buffer))) { // Optimize the normal case fixed_length=1; - max_length= format_length(arg1->val_str(NULL)) * - collation.collation->mbmaxlen; + max_length= format_length(str) * collation.collation->mbmaxlen; } else { diff --git a/sql/item_timefunc.h b/sql/item_timefunc.h index c3bda9d85ba..30d5018ff36 100644 --- a/sql/item_timefunc.h +++ b/sql/item_timefunc.h @@ -847,6 +847,11 @@ public: class Item_func_date_format :public Item_str_func { + bool check_arguments() const + { + return args[0]->check_type_can_return_date(func_name()) || + check_argument_types_can_return_text(1, arg_count); + } const MY_LOCALE *locale; int fixed_length; String value; |