Commit fb71449b authored by Sergey Petrunya's avatar Sergey Petrunya

MDEV-5719: Wrong result with GROUP BY and LEFT OUTER JOIN

Merged revision 5224 from mysql-5.6 and added a test case.
..
revno: 5224
committer: Sergey Glukhov <sergey.glukhov@oracle.com>
branch nick: mysql-5.6
timestamp: Wed 2013-06-19 14:24:08 +0400
message:
    Bug#16620047 INCORRECT QUERY RESULT (AFTER SERVER UPGRADE)
parent d1c4ff2b
...@@ -57,3 +57,26 @@ i GROUP_CONCAT( d1, d2 ORDER BY d1, d2 ) ...@@ -57,3 +57,26 @@ i GROUP_CONCAT( d1, d2 ORDER BY d1, d2 )
NULL 11.1,22.2 NULL 11.1,22.2
DROP TABLE t1; DROP TABLE t1;
End of 5.5 tests End of 5.5 tests
#
# MDEV-5719: Wrong result with GROUP BY and LEFT OUTER JOIN
#
CREATE TABLE t1 (oidGroup INT, oid INT PRIMARY KEY)ENGINE=INNODB;
INSERT INTO t1 VALUES (1,1),(1,2),(1,3),(1,4);
CREATE TABLE t2 (oid INT PRIMARY KEY)ENGINE=INNODB;
INSERT INTO t2 VALUES (3);
SELECT a.oidGroup, a.oid, b.oid FROM t1 a LEFT JOIN t2 b ON
a.oid=b.oid WHERE a.oidGroup=1;
oidGroup oid oid
1 1 NULL
1 2 NULL
1 3 3
1 4 NULL
SELECT a.oidGroup, a.oid, b.oid FROM t1 a LEFT JOIN t2 b ON
a.oid=b.oid WHERE a.oidGroup=1 GROUP BY a.oid;
oidGroup oid oid
1 1 NULL
1 2 NULL
1 3 3
1 4 NULL
DROP TABLE t1, t2;
# End of tests
...@@ -67,3 +67,22 @@ DROP TABLE t1; ...@@ -67,3 +67,22 @@ DROP TABLE t1;
--echo End of 5.5 tests --echo End of 5.5 tests
--echo #
--echo # MDEV-5719: Wrong result with GROUP BY and LEFT OUTER JOIN
--echo #
CREATE TABLE t1 (oidGroup INT, oid INT PRIMARY KEY)ENGINE=INNODB;
INSERT INTO t1 VALUES (1,1),(1,2),(1,3),(1,4);
CREATE TABLE t2 (oid INT PRIMARY KEY)ENGINE=INNODB;
INSERT INTO t2 VALUES (3);
# Returns a value
SELECT a.oidGroup, a.oid, b.oid FROM t1 a LEFT JOIN t2 b ON
a.oid=b.oid WHERE a.oidGroup=1;
SELECT a.oidGroup, a.oid, b.oid FROM t1 a LEFT JOIN t2 b ON
a.oid=b.oid WHERE a.oidGroup=1 GROUP BY a.oid;
DROP TABLE t1, t2;
--echo # End of tests
...@@ -656,21 +656,28 @@ class Field ...@@ -656,21 +656,28 @@ class Field
inline bool is_null(my_ptrdiff_t row_offset= 0) const inline bool is_null(my_ptrdiff_t row_offset= 0) const
{ {
/* /*
If the field is NULLable, it returns NULLity based
on null_ptr[row_offset] value. Otherwise it returns
NULL flag depending on TABLE::null_row value.
The table may have been marked as containing only NULL values The table may have been marked as containing only NULL values
for all fields if it is a NULL-complemented row of an OUTER JOIN for all fields if it is a NULL-complemented row of an OUTER JOIN
or if the query is an implicitly grouped query (has aggregate or if the query is an implicitly grouped query (has aggregate
functions but no GROUP BY clause) with no qualifying rows. If functions but no GROUP BY clause) with no qualifying rows. If
this is the case (in which TABLE::null_row is true), the field this is the case (in which TABLE::null_row is true) and the
is considered to be NULL. field is not nullable, the field is considered to be NULL.
Do not change the order of testing. Fields may be associated
with a TABLE object without being part of the current row.
For NULL value check to work for these fields, they must
have a valid null_ptr, and this pointer must be checked before
TABLE::null_row.
Note that if a table->null_row is set then also all null_bits are Note that if a table->null_row is set then also all null_bits are
set for the row. set for the row.
Otherwise, if the field is NULLable, it has a valid null_ptr
pointer, and its NULLity is recorded in the "null_bit" bit of
null_ptr[row_offset].
*/ */
return (table->null_row ? TRUE : return real_maybe_null() ?
null_ptr ? MY_TEST(null_ptr[row_offset] & null_bit) : 0); MY_TEST(null_ptr[row_offset] & null_bit) : table->null_row;
} }
inline bool is_real_null(my_ptrdiff_t row_offset= 0) const inline bool is_real_null(my_ptrdiff_t row_offset= 0) const
{ return null_ptr ? (null_ptr[row_offset] & null_bit ? 1 : 0) : 0; } { return null_ptr ? (null_ptr[row_offset] & null_bit ? 1 : 0) : 0; }
......
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