[MDEV-18307] Incorrect query result after upgrade from 10.2.17 to 10.2.21 Created: 2019-01-18  Updated: 2019-04-06  Resolved: 2019-04-06

Status: Closed
Project: MariaDB Server
Component/s: Optimizer, Parser
Affects Version/s: 10.2.19, 10.2.20, 10.2.21, 10.2, 10.3, 10.4
Fix Version/s: 10.2.23

Type: Bug Priority: Major
Reporter: Bryce Lowe Assignee: Igor Babaev
Resolution: Fixed Votes: 0
Labels: regression
Environment:

AWS EC2 Instance (for testing)


Attachments: File bug_schema.sql    

 Description   

When I upgraded from MariaDB 10.2.17 to 10.2.21 we have observed a change in results of SAME SQL statement.

In my data set, the following SQL statement returns 45 rows in MariaDB 10.2.15, 10.2.16, 10.2.17:

SELECT (event.Name LIKE '%test%'
                       OR IFNULL(eventtype_def.Name,'') LIKE '%test%'
                       ) Test1,
event.Event_No,event.Name,DATE(event_sched.StartDateTime) StartDate
FROM calendar.event_sched
JOIN calendar.event ON event.Event_No = event_sched.Event_No
JOIN calendar.eventtype_def ON eventtype_def.EventTypeDef_No = event.EventTypeDef_No
JOIN (SELECT Event_No, MIN(StartDateTime) MinStartDateTime,
                    MAX(StartDateTime) MaxStartDateTime
                    FROM calendar.event_sched
                    WHERE Active = 1
                    GROUP BY Event_No) esFirstLast ON esFirstLast.Event_No = event.Event_No
LEFT   JOIN (SELECT event_subtype.Event_No, GROUP_CONCAT(eventtype_def.Name) SubTypes,
                        GROUP_CONCAT(eventtype_def.PublicColor) SubTypePublicColors,
                        GROUP_CONCAT(eventtype_def.PrivateColor) SubTypePrivateColors
                    FROM calendar.event_subtype
                    JOIN calendar.eventtype_def ON eventtype_def.EventTypeDef_No = event_subtype.EventTypeDef_No
                    WHERE event_subtype.Active = 1
                    GROUP BY event_subtype.Event_No) esubtypes ON esubtypes.Event_No = event.Event_No
WHERE     IF(1, 
                     (event.Name LIKE '%test%'
                     OR IFNULL(eventtype_def.Name,'') LIKE '%test%'
                       )
                       ,0)
GROUP BY event.Event_No
ORDER BY StartDate ASC;

However in MariaDB 10.2.18 all the way up to 10.2.21, the same statement returns 0 rows.

While researching the issue I do see that between MariaDB 10.2.17 and 10.2.18 the EXPLAIN EXTENDED shows that the optimizer changed how the SQL statement was interpreted between the versions. Here are the results of my tests:

MariaDB 10.2.16
Result: Correct 45 rows
Optimized SQL (From EXPLAIN EXTENDED):

SELECT 
    `test`.`event`.`Name` LIKE '%test%'
        OR IFNULL(`test`.`eventtype_def`.`Name`, '') LIKE '%test%' AS `Test1`,
    `test`.`event`.`Event_No` AS `Event_No`,
    `test`.`event`.`Name` AS `Name`,
    CAST(`test`.`event_sched`.`StartDateTime` AS DATE) AS `StartDate`
FROM
    `test`.`event_sched`
        JOIN
    `test`.`event`
        JOIN
    `test`.`eventtype_def`
        JOIN
    (SELECT 
        `test`.`event_sched`.`Event_No` AS `Event_No`,
            MIN(`test`.`event_sched`.`StartDateTime`) AS `MinStartDateTime`,
            MAX(`test`.`event_sched`.`StartDateTime`) AS `MaxStartDateTime`
    FROM
        `test`.`event_sched`
    WHERE
        `test`.`event_sched`.`Active` = 1
            AND IF(1, `test`.`event`.`Name` LIKE '%test%'
            OR IFNULL(`test`.`eventtype_def`.`Name`, '') LIKE '%test%', 0)
    GROUP BY `test`.`event_sched`.`Event_No`) `esFirstLast`
        LEFT JOIN
    (SELECT 
        `test`.`event_subtype`.`Event_No` AS `Event_No`,
            GROUP_CONCAT(`test`.`eventtype_def`.`Name`
                SEPARATOR ',') AS `SubTypes`,
            GROUP_CONCAT(`test`.`eventtype_def`.`PublicColor`
                SEPARATOR ',') AS `SubTypePublicColors`,
            GROUP_CONCAT(`test`.`eventtype_def`.`PrivateColor`
                SEPARATOR ',') AS `SubTypePrivateColors`
    FROM
        `test`.`event_subtype`
    JOIN `test`.`eventtype_def`
    WHERE
        `test`.`event_subtype`.`Active` = 1
            AND `test`.`event_subtype`.`EventTypeDef_No` = `test`.`eventtype_def`.`EventTypeDef_No`
    GROUP BY `test`.`event_subtype`.`Event_No`) `esubtypes` ON (`esubtypes`.`Event_No` = `esFirstLast`.`Event_No`)
WHERE
    `test`.`event`.`Event_No` = `esFirstLast`.`Event_No`
        AND `test`.`event_sched`.`Event_No` = `esFirstLast`.`Event_No`
        AND `test`.`eventtype_def`.`EventTypeDef_No` = `test`.`event`.`EventTypeDef_No`
        AND IF(1,
        `test`.`event`.`Name` LIKE '%test%'
            OR IFNULL(`test`.`eventtype_def`.`Name`, '') LIKE '%test%',
        0)
GROUP BY `test`.`event`.`Event_No`
ORDER BY CAST(`test`.`event_sched`.`StartDateTime` AS DATE)

MariaDB 10.2.17
Result: Correct 45 rows
Optimized SQL (From EXPLAIN EXTENDED):

SELECT 
    `test`.`event`.`Name` LIKE '%test%'
        OR IFNULL(`test`.`eventtype_def`.`Name`, '') LIKE '%test%' AS `Test1`,
    `test`.`event`.`Event_No` AS `Event_No`,
    `test`.`event`.`Name` AS `Name`,
    CAST(`test`.`event_sched`.`StartDateTime` AS DATE) AS `StartDate`
FROM
    `test`.`event_sched`
        JOIN
    `test`.`event`
        JOIN
    `test`.`eventtype_def`
        JOIN
    (SELECT 
        `test`.`event_sched`.`Event_No` AS `Event_No`,
            MIN(`test`.`event_sched`.`StartDateTime`) AS `MinStartDateTime`,
            MAX(`test`.`event_sched`.`StartDateTime`) AS `MaxStartDateTime`
    FROM
        `test`.`event_sched`
    WHERE
        `test`.`event_sched`.`Active` = 1
            AND IF(1, `test`.`event`.`Name` LIKE '%test%'
            OR IFNULL(`test`.`eventtype_def`.`Name`, '') LIKE '%test%', 0)
    GROUP BY `test`.`event_sched`.`Event_No`) `esFirstLast`
        LEFT JOIN
    (SELECT 
        `test`.`event_subtype`.`Event_No` AS `Event_No`,
            GROUP_CONCAT(`test`.`eventtype_def`.`Name`
                SEPARATOR ',') AS `SubTypes`,
            GROUP_CONCAT(`test`.`eventtype_def`.`PublicColor`
                SEPARATOR ',') AS `SubTypePublicColors`,
            GROUP_CONCAT(`test`.`eventtype_def`.`PrivateColor`
                SEPARATOR ',') AS `SubTypePrivateColors`
    FROM
        `test`.`event_subtype`
    JOIN `test`.`eventtype_def`
    WHERE
        `test`.`event_subtype`.`Active` = 1
            AND `test`.`eventtype_def`.`EventTypeDef_No` = `test`.`event_subtype`.`EventTypeDef_No`
    GROUP BY `test`.`event_subtype`.`Event_No`) `esubtypes` ON (`esubtypes`.`Event_No` = `esFirstLast`.`Event_No`)
WHERE
    `test`.`event`.`Event_No` = `esFirstLast`.`Event_No`
        AND `test`.`event_sched`.`Event_No` = `esFirstLast`.`Event_No`
        AND `test`.`eventtype_def`.`EventTypeDef_No` = `test`.`event`.`EventTypeDef_No`
        AND IF(1,
        `test`.`event`.`Name` LIKE '%test%'
            OR IFNULL(`test`.`eventtype_def`.`Name`, '') LIKE '%test%',
        0)
GROUP BY `test`.`event`.`Event_No`
ORDER BY CAST(`test`.`event_sched`.`StartDateTime` AS DATE);

MariaDB 10.2.18
Result: INCORRECT 0 rows
Optimized SQL (From EXPLAIN EXTENDED):

SELECT 
    `test`.`event`.`Name` LIKE '%test%'
        OR IFNULL(`test`.`eventtype_def`.`Name`, '') LIKE '%test%' AS `Test1`,
    `test`.`event`.`Event_No` AS `Event_No`,
    `test`.`event`.`Name` AS `Name`,
    CAST(`test`.`event_sched`.`StartDateTime` AS DATE) AS `StartDate`
FROM
    `test`.`event_sched`
        JOIN
    `test`.`event`
        JOIN
    `test`.`eventtype_def`
        JOIN
    (SELECT 
        `test`.`event_sched`.`Event_No` AS `Event_No`,
            MIN(`test`.`event_sched`.`StartDateTime`) AS `MinStartDateTime`,
            MAX(`test`.`event_sched`.`StartDateTime`) AS `MaxStartDateTime`
    FROM
        `test`.`event_sched`
    WHERE
        `test`.`event_sched`.`Active` = 1
    GROUP BY `test`.`event_sched`.`Event_No`
    HAVING IF(1, `test`.`event`.`Name` LIKE '%test%'
        OR IFNULL(`test`.`eventtype_def`.`Name`, '') LIKE '%test%', 0)) `esFirstLast`
        LEFT JOIN
    (SELECT 
        `test`.`event_subtype`.`Event_No` AS `Event_No`,
            GROUP_CONCAT(`test`.`eventtype_def`.`Name`
                SEPARATOR ',') AS `SubTypes`,
            GROUP_CONCAT(`test`.`eventtype_def`.`PublicColor`
                SEPARATOR ',') AS `SubTypePublicColors`,
            GROUP_CONCAT(`test`.`eventtype_def`.`PrivateColor`
                SEPARATOR ',') AS `SubTypePrivateColors`
    FROM
        `test`.`event_subtype`
    JOIN `test`.`eventtype_def`
    WHERE
        `test`.`event_subtype`.`Active` = 1
            AND `test`.`eventtype_def`.`EventTypeDef_No` = `test`.`event_subtype`.`EventTypeDef_No`
    GROUP BY `test`.`event_subtype`.`Event_No`) `esubtypes` ON (`esubtypes`.`Event_No` = `esFirstLast`.`Event_No`)
WHERE
    `test`.`event`.`Event_No` = `esFirstLast`.`Event_No`
        AND `test`.`event_sched`.`Event_No` = `esFirstLast`.`Event_No`
        AND `test`.`eventtype_def`.`EventTypeDef_No` = `test`.`event`.`EventTypeDef_No`
        AND IF(1,
        `test`.`event`.`Name` LIKE '%test%'
            OR IFNULL(`test`.`eventtype_def`.`Name`, '') LIKE '%test%',
        0)
GROUP BY `test`.`event`.`Event_No`
ORDER BY CAST(`test`.`event_sched`.`StartDateTime` AS DATE)

MariaDB 10.2.19
Result: INCORRECT 0 rows
Optimized SQL (From EXPLAIN EXTENDED):

SELECT 
    `test`.`event`.`Name` LIKE '%test%'
        OR IFNULL(`test`.`eventtype_def`.`Name`, '') LIKE '%test%' AS `Test1`,
    `test`.`event`.`Event_No` AS `Event_No`,
    `test`.`event`.`Name` AS `Name`,
    CAST(`test`.`event_sched`.`StartDateTime` AS DATE) AS `StartDate`
FROM
    `test`.`event_sched`
        JOIN
    `test`.`event`
        JOIN
    `test`.`eventtype_def`
        JOIN
    (SELECT 
        `test`.`event_sched`.`Event_No` AS `Event_No`,
            MIN(`test`.`event_sched`.`StartDateTime`) AS `MinStartDateTime`,
            MAX(`test`.`event_sched`.`StartDateTime`) AS `MaxStartDateTime`
    FROM
        `test`.`event_sched`
    WHERE
        `test`.`event_sched`.`Active` = 1
    GROUP BY `test`.`event_sched`.`Event_No`
    HAVING IF(1, `test`.`event`.`Name` LIKE '%test%'
        OR IFNULL(`test`.`eventtype_def`.`Name`, '') LIKE '%test%', 0)) `esFirstLast`
        LEFT JOIN
    (SELECT 
        `test`.`event_subtype`.`Event_No` AS `Event_No`,
            GROUP_CONCAT(`test`.`eventtype_def`.`Name`
                SEPARATOR ',') AS `SubTypes`,
            GROUP_CONCAT(`test`.`eventtype_def`.`PublicColor`
                SEPARATOR ',') AS `SubTypePublicColors`,
            GROUP_CONCAT(`test`.`eventtype_def`.`PrivateColor`
                SEPARATOR ',') AS `SubTypePrivateColors`
    FROM
        `test`.`event_subtype`
    JOIN `test`.`eventtype_def`
    WHERE
        `test`.`event_subtype`.`Active` = 1
            AND `test`.`eventtype_def`.`EventTypeDef_No` = `test`.`event_subtype`.`EventTypeDef_No`
    GROUP BY `test`.`event_subtype`.`Event_No`) `esubtypes` ON (`esubtypes`.`Event_No` = `esFirstLast`.`Event_No`)
WHERE
    `test`.`event`.`Event_No` = `esFirstLast`.`Event_No`
        AND `test`.`event_sched`.`Event_No` = `esFirstLast`.`Event_No`
        AND `test`.`eventtype_def`.`EventTypeDef_No` = `test`.`event`.`EventTypeDef_No`
        AND IF(1,
        `test`.`event`.`Name` LIKE '%test%'
            OR IFNULL(`test`.`eventtype_def`.`Name`, '') LIKE '%test%',
        0)
GROUP BY `test`.`event`.`Event_No`
ORDER BY CAST(`test`.`event_sched`.`StartDateTime` AS DATE);

MariaDB 10.2.20
Result: INCORRECT 0 rows
Optimized SQL (From EXPLAIN EXTENDED):

SELECT 
    `test`.`event`.`Name` LIKE '%test%'
        OR IFNULL(`test`.`eventtype_def`.`Name`, '') LIKE '%test%' AS `Test1`,
    `test`.`event`.`Event_No` AS `Event_No`,
    `test`.`event`.`Name` AS `Name`,
    CAST(`test`.`event_sched`.`StartDateTime` AS DATE) AS `StartDate`
FROM
    `test`.`event_sched`
        JOIN
    `test`.`event`
        JOIN
    `test`.`eventtype_def`
        JOIN
    (SELECT 
        `test`.`event_sched`.`Event_No` AS `Event_No`,
            MIN(`test`.`event_sched`.`StartDateTime`) AS `MinStartDateTime`,
            MAX(`test`.`event_sched`.`StartDateTime`) AS `MaxStartDateTime`
    FROM
        `test`.`event_sched`
    WHERE
        `test`.`event_sched`.`Active` = 1
    GROUP BY `test`.`event_sched`.`Event_No`
    HAVING IF(1, `test`.`event`.`Name` LIKE '%test%'
        OR IFNULL(`test`.`eventtype_def`.`Name`, '') LIKE '%test%', 0)) `esFirstLast`
        LEFT JOIN
    (SELECT 
        `test`.`event_subtype`.`Event_No` AS `Event_No`,
            GROUP_CONCAT(`test`.`eventtype_def`.`Name`
                SEPARATOR ',') AS `SubTypes`,
            GROUP_CONCAT(`test`.`eventtype_def`.`PublicColor`
                SEPARATOR ',') AS `SubTypePublicColors`,
            GROUP_CONCAT(`test`.`eventtype_def`.`PrivateColor`
                SEPARATOR ',') AS `SubTypePrivateColors`
    FROM
        `test`.`event_subtype`
    JOIN `test`.`eventtype_def`
    WHERE
        `test`.`event_subtype`.`Active` = 1
            AND `test`.`eventtype_def`.`EventTypeDef_No` = `test`.`event_subtype`.`EventTypeDef_No`
    GROUP BY `test`.`event_subtype`.`Event_No`) `esubtypes` ON (`esubtypes`.`Event_No` = `esFirstLast`.`Event_No`)
WHERE
    `test`.`event`.`Event_No` = `esFirstLast`.`Event_No`
        AND `test`.`event_sched`.`Event_No` = `esFirstLast`.`Event_No`
        AND `test`.`eventtype_def`.`EventTypeDef_No` = `test`.`event`.`EventTypeDef_No`
        AND IF(1,
        `test`.`event`.`Name` LIKE '%test%'
            OR IFNULL(`test`.`eventtype_def`.`Name`, '') LIKE '%test%',
        0)
GROUP BY `test`.`event`.`Event_No`
ORDER BY CAST(`test`.`event_sched`.`StartDateTime` AS DATE);

MariaDB 10.2.21
Result: INCORRECT 0 rows
Optimized SQL (From EXPLAIN EXTENDED):

SELECT 
    `test`.`event`.`Name` LIKE '%test%'
        OR IFNULL(`test`.`eventtype_def`.`Name`, '') LIKE '%test%' AS `Test1`,
    `test`.`event`.`Event_No` AS `Event_No`,
    `test`.`event`.`Name` AS `Name`,
    CAST(`test`.`event_sched`.`StartDateTime` AS DATE) AS `StartDate`
FROM
    `test`.`event_sched`
        JOIN
    `test`.`event`
        JOIN
    `test`.`eventtype_def`
        JOIN
    (SELECT 
        `test`.`event_sched`.`Event_No` AS `Event_No`,
            MIN(`test`.`event_sched`.`StartDateTime`) AS `MinStartDateTime`,
            MAX(`test`.`event_sched`.`StartDateTime`) AS `MaxStartDateTime`
    FROM
        `test`.`event_sched`
    WHERE
        `test`.`event_sched`.`Active` = 1
    GROUP BY `test`.`event_sched`.`Event_No`
    HAVING IF(1, `test`.`event`.`Name` LIKE '%test%'
        OR IFNULL(`test`.`eventtype_def`.`Name`, '') LIKE '%test%', 0)) `esFirstLast`
        LEFT JOIN
    (SELECT 
        `test`.`event_subtype`.`Event_No` AS `Event_No`,
            GROUP_CONCAT(`test`.`eventtype_def`.`Name`
                SEPARATOR ',') AS `SubTypes`,
            GROUP_CONCAT(`test`.`eventtype_def`.`PublicColor`
                SEPARATOR ',') AS `SubTypePublicColors`,
            GROUP_CONCAT(`test`.`eventtype_def`.`PrivateColor`
                SEPARATOR ',') AS `SubTypePrivateColors`
    FROM
        `test`.`event_subtype`
    JOIN `test`.`eventtype_def`
    WHERE
        `test`.`event_subtype`.`Active` = 1
            AND `test`.`eventtype_def`.`EventTypeDef_No` = `test`.`event_subtype`.`EventTypeDef_No`
    GROUP BY `test`.`event_subtype`.`Event_No`) `esubtypes` ON (`esubtypes`.`Event_No` = `esFirstLast`.`Event_No`)
WHERE
    `test`.`event`.`Event_No` = `esFirstLast`.`Event_No`
        AND `test`.`event_sched`.`Event_No` = `esFirstLast`.`Event_No`
        AND `test`.`eventtype_def`.`EventTypeDef_No` = `test`.`event`.`EventTypeDef_No`
        AND IF(1,
        `test`.`event`.`Name` LIKE '%test%'
            OR IFNULL(`test`.`eventtype_def`.`Name`, '') LIKE '%test%',
        0)
GROUP BY `test`.`event`.`Event_No`
ORDER BY CAST(`test`.`event_sched`.`StartDateTime` AS DATE)

Please let me know if I can provide any additional data to help. I have attached the schema definitions of the tables that are involved in the queries to this ticket.

It may be worth knowing that the following query returns 45 rows consistently between 10.2.17 and 10.2.18 (the join on the first derived table is changed from an INNER to an LEFT):

SELECT (event.Name LIKE '%test%'
                       OR IFNULL(eventtype_def.Name,'') LIKE '%test%'
                       ) Test1,
event.Event_No,event.Name,DATE(event_sched.StartDateTime) StartDate
FROM test.event_sched
JOIN test.event ON event.Event_No = event_sched.Event_No
JOIN test.eventtype_def ON eventtype_def.EventTypeDef_No = event.EventTypeDef_No
LEFT JOIN (SELECT Event_No, MIN(StartDateTime) MinStartDateTime,
                    MAX(StartDateTime) MaxStartDateTime
                    FROM test.event_sched
                    WHERE Active = 1
                    GROUP BY Event_No) esFirstLast ON esFirstLast.Event_No = event.Event_No
LEFT   JOIN (SELECT event_subtype.Event_No, GROUP_CONCAT(eventtype_def.Name) SubTypes,
                        GROUP_CONCAT(eventtype_def.PublicColor) SubTypePublicColors,
                        GROUP_CONCAT(eventtype_def.PrivateColor) SubTypePrivateColors
                    FROM test.event_subtype
                    JOIN test.eventtype_def ON eventtype_def.EventTypeDef_No = event_subtype.EventTypeDef_No
                    WHERE event_subtype.Active = 1
                    GROUP BY event_subtype.Event_No) esubtypes ON esubtypes.Event_No = event.Event_No
WHERE     IF(1, 
                     (event.Name LIKE '%test%'
                     OR IFNULL(eventtype_def.Name,'') LIKE '%test%'
                       )
                       ,0)
GROUP BY event.Event_No;



 Comments   
Comment by Alice Sherepa [ 2019-01-19 ]

Thanks a lot for the bug report!
I reproduced the issue on MariaDB 10.2-10.4, starting from 10.2.18 with the test case:

create table t1 (k1 int not null, nm varchar(50) not null, key nm (nm));
insert into t1 values (1,'var'),(2,'var'),(3,'var'),(4,'var'),(5,'var'),(6,'var'),(7,'var');
 
create table t2 (i1 int not null, k1 int, nm varchar(50), primary key (i1));
insert into t2 values (1,1,'test1'),(2,2,'test2'),(3,3,'test1'),(4,4,'test4'),(5,5,'test5');
 
select 1
from t2 join t1 on t1.k1 = t2.k1
join (select i1 from t2 group by i1) tbl1 on tbl1.i1 = t2.i1
where if(1, (t2.nm like '%test%' or t1.nm like '%test%' ),0)
group by t2.i1;
 
drop table t1,t2;

MariaDB [test]> select 1
    -> from t2 join t1 on t1.k1 = t2.k1
    -> join (select i1 from t2 group by i1) tbl1 on tbl1.i1 = t2.i1
    -> where if(1, (t2.nm like '%test%' or t1.nm like '%test%' ),0)
    -> group by t2.i1;
+---+
| 1 |
+---+
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
+---+
5 rows in set (0.00 sec)
 
MariaDB [test]> select version();
+-----------------+
| version()       |
+-----------------+
| 10.2.17-MariaDB |
+-----------------+
1 row in set (0.00 sec)

MariaDB [test]> select 1
    -> from t2 join t1 on t1.k1 = t2.k1
    -> join (select i1 from t2 group by i1) tbl1 on tbl1.i1 = t2.i1
    -> where if(1, (t2.nm like '%test%' or t1.nm like '%test%' ),0)
    -> group by t2.i1;
Empty set (0.00 sec)
 
MariaDB [test]> select version();
+-----------------+
| version()       |
+-----------------+
| 10.2.18-MariaDB |
+-----------------+
1 row in set (0.00 sec)

Comment by Igor Babaev [ 2019-04-04 ]

Alice,
I can't reproduce the bug on the current 10.2 tree.

Comment by Alice Sherepa [ 2019-04-05 ]

Not reproducible on version >=10.2.23

Comment by Igor Babaev [ 2019-04-06 ]

Closed as not reproducible starting from 10.2.23.

Generated at Thu Feb 08 08:43:06 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.