Show
added a comment - Thank you for your comment,
I tested the below cases and it seems their are condition when this bug occurs.
RESULT:
t1 t2 NULL_ERROR
p p YES
i p YES
p i NO
i i NO
none none NO
none p NO
p none NO
p p (GROUP BY id DESC) NO
p p (INSERT INTO t2 VALUES ('786220',1); instead) NO
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
CREATE TABLE t1(id CHAR(16), PRIMARY KEY(id));
INSERT INTO t1 VALUES ('78622');
INSERT INTO t1 VALUES ('786220');
CREATE TABLE t2(id CHAR(16), VAR INT DEFAULT NULL, PRIMARY KEY(id));
INSERT INTO t2 VALUES ('78622',1);
SELECT id, VAR FROM t1 LEFT JOIN t2 USING(id) GROUP BY id;
+--------+------+
| id | VAR |
+--------+------+
| 78622 | NULL |
| 786220 | NULL |
+--------+------+
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
CREATE TABLE t1(id CHAR(16), INDEX(id));
INSERT INTO t1 VALUES ('78622');
INSERT INTO t1 VALUES ('786220');
CREATE TABLE t2(id CHAR(16), VAR INT DEFAULT NULL, PRIMARY KEY(id));
INSERT INTO t2 VALUES ('78622',1);
SELECT id, VAR FROM t1 LEFT JOIN t2 USING(id) GROUP BY id;
+--------+------+
| id | VAR |
+--------+------+
| 78622 | NULL |
| 786220 | NULL |
+--------+------+
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
CREATE TABLE t1(id CHAR(16), PRIMARY KEY(id));
INSERT INTO t1 VALUES ('78622');
INSERT INTO t1 VALUES ('786220');
CREATE TABLE t2(id CHAR(16), VAR INT DEFAULT NULL, INDEX(id));
INSERT INTO t2 VALUES ('78622',1);
SELECT id, VAR FROM t1 LEFT JOIN t2 USING(id) GROUP BY id;
+--------+------+
| id | VAR |
+--------+------+
| 78622 | 1 |
| 786220 | NULL |
+--------+------+
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
CREATE TABLE t1(id CHAR(16), INDEX(id));
INSERT INTO t1 VALUES ('78622');
INSERT INTO t1 VALUES ('786220');
CREATE TABLE t2(id CHAR(16), VAR INT DEFAULT NULL, INDEX(id));
INSERT INTO t2 VALUES ('78622',1);
SELECT id, VAR FROM t1 LEFT JOIN t2 USING(id) GROUP BY id;
+--------+------+
| id | VAR |
+--------+------+
| 78622 | 1 |
| 786220 | NULL |
+--------+------+
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
CREATE TABLE t1(id CHAR(16));
INSERT INTO t1 VALUES ('78622');
INSERT INTO t1 VALUES ('786220');
CREATE TABLE t2(id CHAR(16), VAR INT DEFAULT NULL);
INSERT INTO t2 VALUES ('78622',1);
SELECT id, VAR FROM t1 LEFT JOIN t2 USING(id) GROUP BY id;
+--------+------+
| id | VAR |
+--------+------+
| 78622 | 1 |
| 786220 | NULL |
+--------+------+
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
CREATE TABLE t1(id CHAR(16));
INSERT INTO t1 VALUES ('78622');
INSERT INTO t1 VALUES ('786220');
CREATE TABLE t2(id CHAR(16), VAR INT DEFAULT NULL, PRIMARY KEY(id));
INSERT INTO t2 VALUES ('78622',1);
SELECT id, VAR FROM t1 LEFT JOIN t2 USING(id) GROUP BY id;
+--------+------+
| id | VAR |
+--------+------+
| 78622 | 1 |
| 786220 | NULL |
+--------+------+
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
CREATE TABLE t1(id CHAR(16), PRIMARY KEY(id));
INSERT INTO t1 VALUES ('78622');
INSERT INTO t1 VALUES ('786220');
CREATE TABLE t2(id CHAR(16), VAR INT DEFAULT NULL);
INSERT INTO t2 VALUES ('78622',1);
SELECT id, VAR FROM t1 LEFT JOIN t2 USING(id) GROUP BY id;
+--------+------+
| id | VAR |
+--------+------+
| 78622 | 1 |
| 786220 | NULL |
+--------+------+
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
CREATE TABLE t1(id CHAR(16), PRIMARY KEY(id));
INSERT INTO t1 VALUES ('78622');
INSERT INTO t1 VALUES ('786220');
CREATE TABLE t2(id CHAR(16), VAR INT DEFAULT NULL, PRIMARY KEY(id));
INSERT INTO t2 VALUES ('78622',1);
SELECT id, VAR FROM t1 LEFT JOIN t2 USING(id) GROUP BY id DESC;
+--------+------+
| id | VAR |
+--------+------+
| 786220 | NULL |
| 78622 | 1 |
+--------+------+
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
CREATE TABLE t1(id CHAR(16), PRIMARY KEY(id));
INSERT INTO t1 VALUES ('78622');
INSERT INTO t1 VALUES ('786220');
CREATE TABLE t2(id CHAR(16), VAR INT DEFAULT NULL, PRIMARY KEY(id));
INSERT INTO t2 VALUES ('786220',1);
SELECT id, VAR FROM t1 LEFT JOIN t2 USING(id) GROUP BY id;
+--------+------+
| id | VAR |
+--------+------+
| 78622 | NULL |
| 786220 | 1 |
+--------+------+
Hi,
Thanks for the report. It's likely to be a duplicate of
MDEV-5719, But I'll assign it to Sergei Petrunia so he could check your test case as well after the bugfix (never hurts to double-check).Regarding your question how to fix the problem, it somewhat depends on what your real data and structures are (I presume you submtted a simplified test case, and it's great, thanks for that!)
In general, a query which uses partial GROUP BY is nonndeterministic. If there were more than one matching row in t2, the returned value of VAR would have been unpredictable, and then the advice would have depended on what your expectations are. But if it's a PK on t2 like in your test case, you'll always get no more than one matching row; so it should be safe just to add VAR to GROUP BY, thus making it more reliable and getting rid of the wrong result, all at once:
Although, since it's a PK on t1 too, I'm not sure if you need a GROUP BY at all.