summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVicențiu Ciorbaru <vicentiu@mariadb.org>2017-09-11 12:03:16 +0300
committerVicențiu Ciorbaru <vicentiu@mariadb.org>2017-09-19 15:14:10 +0300
commit02eda36e4e75170b2cf228f65faf3c32ede83626 (patch)
treebc61c87ecc6220aea125cbb482ac40fd7dd51cac
parent5b9c32ede096e19d751537c6421563a7fb71c0db (diff)
downloadmariadb-git-02eda36e4e75170b2cf228f65faf3c32ede83626.tar.gz
MDEV-13358: FIRST_V throw SQL Fehler (1292): Incorrect datetime value
This is backport of 25ad623d64e for 10.2. The issue is similar to the one from MDEV-13240. Item::save_in_field() returns an error during tmp table population in a create table from select query as we try to save an empty string as a date value when force_return_blank is set to true for window functions. MDEV-13240 Wrong warning with MAX(datetime_field) OVER (...) The problem resided in Item_window_func implementation, and it was revealed by bb-10.2-ext specific changes: Item_window_func::save_in_field() works differently in bb-10.2-ext vs 10.2: - 10.2 goes through val_str() - bb-10.2-ext goes through get_date(), due to Type_handler related changes. get_date() tries to convert empty string to DATETIME, hence the warning. During a discussion with Vicentiu, it was decided to fix Item_window_func::val_xxx() to return NULL (instead of an "empty" value, such as 0 for numbers and '' for strings) when force_return_blank is set.
-rw-r--r--mysql-test/r/win.result29
-rw-r--r--mysql-test/r/win_insert_select.result10
-rw-r--r--mysql-test/t/win.test28
-rw-r--r--mysql-test/t/win_insert_select.test6
-rw-r--r--sql/item_windowfunc.h16
5 files changed, 72 insertions, 17 deletions
diff --git a/mysql-test/r/win.result b/mysql-test/r/win.result
index 14628cd0d44..4e42658ccd1 100644
--- a/mysql-test/r/win.result
+++ b/mysql-test/r/win.result
@@ -3185,3 +3185,32 @@ fld
1
2
DROP TABLE t1;
+#
+# MDEV-13240 Wrong warning with MAX(datetime_field) OVER (...)
+#
+CREATE TABLE t1 (dt DATETIME);
+INSERT INTO t1 VALUES ('2017-05-17');
+SELECT MAX(dt) OVER (ORDER BY dt ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) FROM t1;
+MAX(dt) OVER (ORDER BY dt ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING)
+NULL
+DROP TABLE t1;
+#
+# MDEV-13358 FIRST_VALUE throws SQL Error (1292): Incorrect datetime value
+#
+CREATE TABLE IF NOT EXISTS `fv_test` (
+`SOME_DATE` datetime NOT NULL
+);
+INSERT INTO `fv_test` (`SOME_DATE`) VALUES ('2017-07-20 12:47:56');
+CREATE TABLE fv_result
+SELECT
+FIRST_VALUE(SOME_DATE) OVER(ORDER BY SOME_DATE DESC) AS somedate
+FROM fv_test;
+SHOW CREATE TABLE fv_result;
+Table Create Table
+fv_result CREATE TABLE `fv_result` (
+ `somedate` datetime DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+SELECT * FROM fv_result;
+somedate
+2017-07-20 12:47:56
+DROP TABLE fv_test, fv_result;
diff --git a/mysql-test/r/win_insert_select.result b/mysql-test/r/win_insert_select.result
index 93545e6de30..bb25d052840 100644
--- a/mysql-test/r/win_insert_select.result
+++ b/mysql-test/r/win_insert_select.result
@@ -1,16 +1,16 @@
CREATE TABLE t1 (c1 INT, c2 VARCHAR(30));
PREPARE populate_table FROM "INSERT into t1 values (1, 'manual_insert_1'),
(4, 'manual_insert_2')";
-INSERT INTO t1 SELECT row_number() over(), "should_have_0" FROM t1;
-INSERT INTO t1 SELECT 1 + row_number() over(), "should_have_2" FROM t1;
+INSERT INTO t1 SELECT row_number() over(), "should_not_add_any_rows" FROM t1;
+INSERT INTO t1 SELECT 1 + row_number() over(), "should_not_add_any_rows" FROM t1;
EXECUTE populate_table;
-INSERT INTO t1 SELECT 10 + row_number() over(), "should repeat 4 times [11-14]" FROM t1;
+INSERT INTO t1 SELECT 10 + row_number() over(), "should repeat 2 times [11-12]" FROM t1;
SELECT c1, c2 FROM t1 ORDER BY c2, c1;
c1 c2
1 manual_insert_1
4 manual_insert_2
-11 should repeat 4 times [11-14]
-12 should repeat 4 times [11-14]
+11 should repeat 2 times [11-12]
+12 should repeat 2 times [11-12]
DELETE FROM t1;
EXECUTE populate_table;
INSERT INTO t1
diff --git a/mysql-test/t/win.test b/mysql-test/t/win.test
index 3dedc1227fd..83427e4edf8 100644
--- a/mysql-test/t/win.test
+++ b/mysql-test/t/win.test
@@ -1965,3 +1965,31 @@ INSERT INTO t1 VALUES (1),(2);
SELECT i AS fld FROM t1 UNION SELECT COUNT(*) AS fld FROM t1;
DROP TABLE t1;
+--echo #
+--echo # MDEV-13240 Wrong warning with MAX(datetime_field) OVER (...)
+--echo #
+
+CREATE TABLE t1 (dt DATETIME);
+INSERT INTO t1 VALUES ('2017-05-17');
+SELECT MAX(dt) OVER (ORDER BY dt ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) FROM t1;
+DROP TABLE t1;
+
+--echo #
+--echo # MDEV-13358 FIRST_VALUE throws SQL Error (1292): Incorrect datetime value
+--echo #
+CREATE TABLE IF NOT EXISTS `fv_test` (
+ `SOME_DATE` datetime NOT NULL
+ );
+
+INSERT INTO `fv_test` (`SOME_DATE`) VALUES ('2017-07-20 12:47:56');
+
+CREATE TABLE fv_result
+SELECT
+FIRST_VALUE(SOME_DATE) OVER(ORDER BY SOME_DATE DESC) AS somedate
+FROM fv_test;
+
+SHOW CREATE TABLE fv_result;
+
+SELECT * FROM fv_result;
+
+DROP TABLE fv_test, fv_result;
diff --git a/mysql-test/t/win_insert_select.test b/mysql-test/t/win_insert_select.test
index 66df7324c4f..6b2e0da4175 100644
--- a/mysql-test/t/win_insert_select.test
+++ b/mysql-test/t/win_insert_select.test
@@ -3,12 +3,12 @@ CREATE TABLE t1 (c1 INT, c2 VARCHAR(30));
PREPARE populate_table FROM "INSERT into t1 values (1, 'manual_insert_1'),
(4, 'manual_insert_2')";
-INSERT INTO t1 SELECT row_number() over(), "should_have_0" FROM t1;
-INSERT INTO t1 SELECT 1 + row_number() over(), "should_have_2" FROM t1;
+INSERT INTO t1 SELECT row_number() over(), "should_not_add_any_rows" FROM t1;
+INSERT INTO t1 SELECT 1 + row_number() over(), "should_not_add_any_rows" FROM t1;
EXECUTE populate_table;
-INSERT INTO t1 SELECT 10 + row_number() over(), "should repeat 4 times [11-14]" FROM t1;
+INSERT INTO t1 SELECT 10 + row_number() over(), "should repeat 2 times [11-12]" FROM t1;
SELECT c1, c2 FROM t1 ORDER BY c2, c1;
diff --git a/sql/item_windowfunc.h b/sql/item_windowfunc.h
index 0dee60915f8..a1ef6854288 100644
--- a/sql/item_windowfunc.h
+++ b/sql/item_windowfunc.h
@@ -851,7 +851,7 @@ public:
bool is_null()
{
if (force_return_blank)
- return false;
+ return true;
if (read_value_from_result_field)
return result_field->is_null();
@@ -865,7 +865,7 @@ public:
if (force_return_blank)
{
res= 0.0;
- null_value= false;
+ null_value= true;
}
else if (read_value_from_result_field)
{
@@ -886,7 +886,7 @@ public:
if (force_return_blank)
{
res= 0;
- null_value= false;
+ null_value= true;
}
else if (read_value_from_result_field)
{
@@ -906,9 +906,8 @@ public:
String *res;
if (force_return_blank)
{
- null_value= false;
- str->length(0);
- res= str;
+ null_value= true;
+ res= NULL;
}
else if (read_value_from_result_field)
{
@@ -930,9 +929,8 @@ public:
my_decimal *res;
if (force_return_blank)
{
- my_decimal_set_zero(dec);
- null_value= false;
- res= dec;
+ null_value= true;
+ res= NULL;
}
else if (read_value_from_result_field)
{