Commit 25ad623d authored by Alexander Barkov's avatar Alexander Barkov

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.
parent 760127ac
...@@ -3085,3 +3085,15 @@ select max(id), rank() over (order by max(id)) from t1 where id < 3; ...@@ -3085,3 +3085,15 @@ select max(id), rank() over (order by max(id)) from t1 where id < 3;
max(id) rank() over (order by max(id)) max(id) rank() over (order by max(id))
2 1 2 1
drop table t1; drop table t1;
#
# Start of 10.3 tests
#
#
# 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;
CREATE TABLE t1 (c1 INT, c2 VARCHAR(30)); CREATE TABLE t1 (c1 INT, c2 VARCHAR(30));
PREPARE populate_table FROM "INSERT into t1 values (1, 'manual_insert_1'), PREPARE populate_table FROM "INSERT into t1 values (1, 'manual_insert_1'),
(4, 'manual_insert_2')"; (4, 'manual_insert_2')";
INSERT INTO t1 SELECT row_number() over(), "should_have_0" FROM t1; INSERT INTO t1 SELECT row_number() over(), "should_have_NULL" FROM t1;
INSERT INTO t1 SELECT 1 + row_number() over(), "should_have_2" FROM t1; INSERT INTO t1 SELECT 1 + row_number() over(), "should_have_2" FROM t1;
EXECUTE populate_table; 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 4 times [11-14]" FROM t1;
...@@ -13,8 +13,8 @@ c1 c2 ...@@ -13,8 +13,8 @@ c1 c2
12 should repeat 4 times [11-14] 12 should repeat 4 times [11-14]
13 should repeat 4 times [11-14] 13 should repeat 4 times [11-14]
14 should repeat 4 times [11-14] 14 should repeat 4 times [11-14]
0 should_have_0
2 should_have_2 2 should_have_2
NULL should_have_NULL
DELETE FROM t1; DELETE FROM t1;
EXECUTE populate_table; EXECUTE populate_table;
INSERT INTO t1 INSERT INTO t1
......
...@@ -1877,3 +1877,16 @@ select count(max(id)) over (order by max(id)) from t1 where id < 3; ...@@ -1877,3 +1877,16 @@ select count(max(id)) over (order by max(id)) from t1 where id < 3;
select max(id), rank() over (order by max(id)) from t1 where id < 3; select max(id), rank() over (order by max(id)) from t1 where id < 3;
drop table t1; drop table t1;
--echo #
--echo # Start of 10.3 tests
--echo #
--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;
...@@ -3,7 +3,7 @@ CREATE TABLE t1 (c1 INT, c2 VARCHAR(30)); ...@@ -3,7 +3,7 @@ CREATE TABLE t1 (c1 INT, c2 VARCHAR(30));
PREPARE populate_table FROM "INSERT into t1 values (1, 'manual_insert_1'), PREPARE populate_table FROM "INSERT into t1 values (1, 'manual_insert_1'),
(4, 'manual_insert_2')"; (4, 'manual_insert_2')";
INSERT INTO t1 SELECT row_number() over(), "should_have_0" FROM t1; INSERT INTO t1 SELECT row_number() over(), "should_have_NULL" FROM t1;
INSERT INTO t1 SELECT 1 + row_number() over(), "should_have_2" FROM t1; INSERT INTO t1 SELECT 1 + row_number() over(), "should_have_2" FROM t1;
EXECUTE populate_table; EXECUTE populate_table;
......
...@@ -839,13 +839,24 @@ class Item_window_func : public Item_func_or_sum ...@@ -839,13 +839,24 @@ class Item_window_func : public Item_func_or_sum
read_value_from_result_field= true; read_value_from_result_field= true;
} }
bool is_null()
{
if (force_return_blank)
return true;
if (read_value_from_result_field)
return result_field->is_null();
return window_func()->is_null();
}
double val_real() double val_real()
{ {
double res; double res;
if (force_return_blank) if (force_return_blank)
{ {
res= 0.0; res= 0.0;
null_value= false; null_value= true;
} }
else if (read_value_from_result_field) else if (read_value_from_result_field)
{ {
...@@ -866,7 +877,7 @@ class Item_window_func : public Item_func_or_sum ...@@ -866,7 +877,7 @@ class Item_window_func : public Item_func_or_sum
if (force_return_blank) if (force_return_blank)
{ {
res= 0; res= 0;
null_value= false; null_value= true;
} }
else if (read_value_from_result_field) else if (read_value_from_result_field)
{ {
...@@ -886,9 +897,8 @@ class Item_window_func : public Item_func_or_sum ...@@ -886,9 +897,8 @@ class Item_window_func : public Item_func_or_sum
String *res; String *res;
if (force_return_blank) if (force_return_blank)
{ {
null_value= false; null_value= true;
str->length(0); res= NULL;
res= str;
} }
else if (read_value_from_result_field) else if (read_value_from_result_field)
{ {
...@@ -910,9 +920,8 @@ class Item_window_func : public Item_func_or_sum ...@@ -910,9 +920,8 @@ class Item_window_func : public Item_func_or_sum
my_decimal *res; my_decimal *res;
if (force_return_blank) if (force_return_blank)
{ {
my_decimal_set_zero(dec); null_value= true;
null_value= false; res= NULL;
res= dec;
} }
else if (read_value_from_result_field) else if (read_value_from_result_field)
{ {
......
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