[MDEV-21781] Wrong result (extra or missing rows, wrong values) with mrr=on,not_null_range_scan=on and LEFT JOINs Created: 2020-02-19  Updated: 2023-12-19  Resolved: 2023-12-19

Status: Closed
Project: MariaDB Server
Component/s: Optimizer
Affects Version/s: 10.3.20, 10.4.10, 10.5.1
Fix Version/s: N/A

Type: Bug Priority: Major
Reporter: Elena Stepanova Assignee: Alice Sherepa
Resolution: Cannot Reproduce Votes: 0
Labels: None


 Description   

CREATE TABLE t1 (a INT) ENGINE=MyISAM;
INSERT INTO t1 VALUES (1),(2);
 
CREATE TABLE t2 (b INT, c INT, KEY(c)) ENGINE=MyISAM;
INSERT INTO t2 VALUES (1,NULL),(2,10);
 
CREATE TABLE t3 (d INT) ENGINE=MyISAM;
INSERT INTO t3 VALUES (11),(12);
 
CREATE TABLE t4 (e INT, f INT, KEY(f)) ENGINE=MyISAM;
 
SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t3 JOIN t4 ON t3.d = t4.f ON t2.b = t4.e ON t1.a = t2.c;
SET optimizer_switch='mrr=on,not_null_range_scan=on';
SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t3 JOIN t4 ON t3.d = t4.f ON t2.b = t4.e ON t1.a = t2.c;

10.5 9fd30949

SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t3 JOIN t4 ON t3.d = t4.f ON t2.b = t4.e ON t1.a = t2.c;
a	b	c	d	e	f
1	NULL	NULL	NULL	NULL	NULL
2	NULL	NULL	NULL	NULL	NULL
SET optimizer_switch='mrr=on,not_null_range_scan=on';
SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t3 JOIN t4 ON t3.d = t4.f ON t2.b = t4.e ON t1.a = t2.c;
a	b	c	d	e	f
1	1	NULL	NULL	NULL	NULL
2	1	NULL	NULL	NULL	NULL
1	2	10	NULL	NULL	NULL
2	2	10	NULL	NULL	NULL

PostgreSQL, MySQL 5.7 and previous versions of MariaDB return the same result as the first query (two rows, all NULLs except for column a).

Execution plans:

EXPLAIN EXTENDED SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t3 JOIN t4 ON t3.d = t4.f ON t2.b = t4.e ON t1.a = t2.c;
id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	2	100.00	
1	SIMPLE	t2	ALL	c	NULL	NULL	NULL	2	100.00	Using where; Using join buffer (flat, BNL join)
1	SIMPLE	t4	ALL	f	NULL	NULL	NULL	0	0.00	Using where; Using join buffer (incremental, BNL join)
1	SIMPLE	t3	ALL	NULL	NULL	NULL	NULL	2	100.00	Using where; Using join buffer (incremental, BNL join)
Warnings:
Note	1003	select `test`.`t1`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t3`.`d` AS `d`,`test`.`t4`.`e` AS `e`,`test`.`t4`.`f` AS `f` from `test`.`t1` left join (`test`.`t2` left join (`test`.`t3` join `test`.`t4`) on(`test`.`t4`.`e` = `test`.`t2`.`b` and `test`.`t3`.`d` = `test`.`t4`.`f`)) on(`test`.`t2`.`c` = `test`.`t1`.`a`) where 1
SET optimizer_switch='mrr=on,not_null_range_scan=on';
EXPLAIN EXTENDED SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t3 JOIN t4 ON t3.d = t4.f ON t2.b = t4.e ON t1.a = t2.c;
id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
1	SIMPLE	t4	const	f	NULL	NULL	NULL	1	100.00	Impossible ON condition
1	SIMPLE	t3	const	NULL	NULL	NULL	NULL	1	100.00	Impossible ON condition
1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	2	100.00	
1	SIMPLE	t2	ALL	c	NULL	NULL	NULL	2	100.00	Using join buffer (flat, BNL join)
Warnings:
Note	1003	select `test`.`t1`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,NULL AS `d`,NULL AS `e`,NULL AS `f` from `test`.`t1` left join (`test`.`t2` left join (`test`.`t3` join `test`.`t4`) on(multiple equal(`test`.`t2`.`b`, NULL) and multiple equal(NULL, NULL))) on(`test`.`t2`.`c` = `test`.`t1`.`a`) where 1

If table t2 is changed from MyISAM to Aria, the result is incorrect in a different way – the second query returns an empty result set:

CREATE TABLE t1 (a INT) ENGINE=MyISAM;
INSERT INTO t1 VALUES (1),(2);
 
CREATE TABLE t2 (b INT, c INT, KEY(c)) ENGINE=Aria;
INSERT INTO t2 VALUES (1,NULL),(2,10);
 
CREATE TABLE t3 (d INT) ENGINE=MyISAM;
INSERT INTO t3 VALUES (11),(12);
 
CREATE TABLE t4 (e INT, f INT, KEY(f)) ENGINE=MyISAM;
 
SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t3 JOIN t4 ON t3.d = t4.f ON t2.b = t4.e ON t1.a = t2.c;
SET optimizer_switch='mrr=on,not_null_range_scan=on';
SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t3 JOIN t4 ON t3.d = t4.f ON t2.b = t4.e ON t1.a = t2.c;

CREATE TABLE t1 (a INT) ENGINE=MyISAM;
INSERT INTO t1 VALUES (1),(2);
CREATE TABLE t2 (b INT, c INT, KEY(c)) ENGINE=Aria;
INSERT INTO t2 VALUES (1,NULL),(2,10);
CREATE TABLE t3 (d INT) ENGINE=MyISAM;
INSERT INTO t3 VALUES (11),(12);
CREATE TABLE t4 (e INT, f INT, KEY(f)) ENGINE=MyISAM;
SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t3 JOIN t4 ON t3.d = t4.f ON t2.b = t4.e ON t1.a = t2.c;
a	b	c	d	e	f
1	NULL	NULL	NULL	NULL	NULL
2	NULL	NULL	NULL	NULL	NULL
SET optimizer_switch='mrr=on,not_null_range_scan=on';
SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t3 JOIN t4 ON t3.d = t4.f ON t2.b = t4.e ON t1.a = t2.c;
a	b	c	d	e	f

Execution plans for test case with Aria for t2:

EXPLAIN EXTENDED SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t3 JOIN t4 ON t3.d = t4.f ON t2.b = t4.e ON t1.a = t2.c;
id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	2	100.00	
1	SIMPLE	t2	ref	c	c	5	test.t1.a	2	100.00	Using where
1	SIMPLE	t4	ALL	f	NULL	NULL	NULL	0	0.00	Using where
1	SIMPLE	t3	ALL	NULL	NULL	NULL	NULL	2	100.00	Using where
Warnings:
Note	1003	select `test`.`t1`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t3`.`d` AS `d`,`test`.`t4`.`e` AS `e`,`test`.`t4`.`f` AS `f` from `test`.`t1` left join (`test`.`t2` left join (`test`.`t3` join `test`.`t4`) on(`test`.`t4`.`e` = `test`.`t2`.`b` and `test`.`t3`.`d` = `test`.`t4`.`f`)) on(`test`.`t2`.`c` = `test`.`t1`.`a` and `test`.`t1`.`a` is not null) where 1
SET optimizer_switch='mrr=on,not_null_range_scan=on';
EXPLAIN EXTENDED SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t3 JOIN t4 ON t3.d = t4.f ON t2.b = t4.e ON t1.a = t2.c;
id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
1	SIMPLE	t4	const	f	NULL	NULL	NULL	1	100.00	Impossible ON condition
1	SIMPLE	t3	const	NULL	NULL	NULL	NULL	1	100.00	Impossible ON condition
1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	2	100.00	
1	SIMPLE	t2	ref	c	c	5	test.t1.a	2	100.00	
Warnings:
Note	1003	select `test`.`t1`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,NULL AS `d`,NULL AS `e`,NULL AS `f` from `test`.`t1` left join (`test`.`t2` left join (`test`.`t3` join `test`.`t4`) on(multiple equal(`test`.`t2`.`b`, NULL) and multiple equal(NULL, NULL))) on(`test`.`t2`.`c` = `test`.`t1`.`a` and `test`.`t1`.`a` is not null) where 1



 Comments   
Comment by Igor Babaev [ 2020-02-21 ]

Let's turn not_null_range_scan off:

SET optimizer_switch='not_null_range_scan=off';

and execute the query:

SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t3 JOIN t4 ON t3.d = t4.f AND t4.f IS NOT NULL ON t2.b = t4.e ON t1.a = t2.c;

We get the same wrong result set:

MariaDB [test]> SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t3 JOIN t4 ON t3.d = t4.f AND t4.f IS NOT NULL ON t2.b = t4.e ON t1.a = t2.c;                 
+------+------+------+------+------+------+
| a    | b    | c    | d    | e    | f    |
+------+------+------+------+------+------+
+------+------+------+------+------+------+

As to the execution plan it the query it looks quite odd:

 MariaDB [test]> EXPLAIN EXTENDED SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t3 JOIN t4 ON t3.d = t4.f AND t4.f IS NOT NULL ON t2.b = t4.e ON t1.a = t2.c;
+------+-------------+-------+-------+---------------+------+---------+------+------+----------+------------------------------------+
| id   | select_type | table | type  | possible_keys | key  | key_len | ref  | rows | filtered | Extra                              |
+------+-------------+-------+-------+---------------+------+---------+------+------+----------+------------------------------------+
|    1 | SIMPLE      | t4    | const | f             | NULL | NULL    | NULL | 1    |   100.00 | Impossible ON condition            |
|    1 | SIMPLE      | t3    | const | NULL          | NULL | NULL    | NULL | 1    |   100.00 | Impossible ON condition            |
|    1 | SIMPLE      | t1    | ALL   | NULL          | NULL | NULL    | NULL | 2    |   100.00 |                                    |
|    1 | SIMPLE      | t2    | ALL   | c             | NULL | NULL    | NULL | 2    |   100.00 | Using join buffer (flat, BNL join) |
+------+-------------+-------+-------+---------------+------+---------+------+------+----------+------------------------------------+

With join_cache_level=0 the execution is still odd and the result set is still wrong

MariaDB [test]> set join_cache_level=0;
 
MariaDB [test]> explain extended SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t3 JOIN t4 ON t3.d = t4.f AND t4.f IS NOT NULL ON t2.b = t4.e ON t1.a = t2.c;
+------+-------------+-------+-------+---------------+------+---------+------+------+----------+-------------------------+
| id   | select_type | table | type  | possible_keys | key  | key_len | ref  | rows | filtered | Extra                   |
+------+-------------+-------+-------+---------------+------+---------+------+------+----------+-------------------------+
|    1 | SIMPLE      | t4    | const | f             | NULL | NULL    | NULL | 1    |   100.00 | Impossible ON condition |
|    1 | SIMPLE      | t3    | const | NULL          | NULL | NULL    | NULL | 1    |   100.00 | Impossible ON condition |
|    1 | SIMPLE      | t1    | ALL   | NULL          | NULL | NULL    | NULL | 2    |   100.00 |                         |
|    1 | SIMPLE      | t2    | ALL   | c             | NULL | NULL    | NULL | 2    |   100.00 |                         |
+------+-------------+-------+-------+---------------+------+---------+------+------+----------+-------------------------+
 
MariaDB [test]> SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t3 JOIN t4 ON t3.d = t4.f AND t4.f IS NOT NULL ON t2.b = t4.e ON t1.a = t2.c;
+------+------+------+------+------+------+
| a    | b    | c    | d    | e    | f    |
+------+------+------+------+------+------+
|    1 |    1 | NULL | NULL | NULL | NULL |
|    1 |    2 |   10 | NULL | NULL | NULL |
|    2 |    1 | NULL | NULL | NULL | NULL |
|    2 |    2 |   10 | NULL | NULL | NULL |
+------+------+------+------+------+------+

Comment by Igor Babaev [ 2020-02-21 ]

Let's slightly change the tables executing:

DROP INDEX c ON t2;
INSERT INTO t2 VALUES (2,2);

and run the following query over tables t1,t2,t4.

SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t4 ON t2.b=t4.f AND t2.b IS NOT NULL ON t1.a = t2.c;

We have a wrong result set and an odd execution plan for this query as well

MariaDB [test]> SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t4 ON t2.b=t4.f AND t2.b IS NOT NULL ON t1.a = t2.c;
+------+------+------+------+------+
| a    | b    | c    | e    | f    |
+------+------+------+------+------+
|    1 | NULL | NULL | NULL | NULL |
|    2 | NULL | NULL | NULL | NULL |
+------+------+------+------+------+
 
MariaDB [test]> explain extended SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t4 ON t2.b=t4.f AND t2.b IS NOT NULL ON t1.a = t2.c;
+------+-------------+-------+-------+---------------+------+---------+------+------+----------+-------------------------+
| id   | select_type | table | type  | possible_keys | key  | key_len | ref  | rows | filtered | Extra                   |
+------+-------------+-------+-------+---------------+------+---------+------+------+----------+-------------------------+
|    1 | SIMPLE      | t4    | const | f             | NULL | NULL    | NULL | 1    |   100.00 | Impossible ON condition |
|    1 | SIMPLE      | t2    | const | NULL          | NULL | NULL    | NULL | 1    |   100.00 | Impossible ON condition |
|    1 | SIMPLE      | t1    | ALL   | NULL          | NULL | NULL    | NULL | 2    |   100.00 |                         |
+------+-------------+-------+-------+---------------+------+---------+------+------+----------+-------------------------+

If we turn 'mrr' off the query return the wright result set and a different execution plan:

MariaDB [test]> set optimizer_switch='mrr=off';
 
MariaDB [test]> SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t4 ON t2.b=t4.f AND t2.b IS NOT NULL ON t1.a = t2.c;
+------+------+------+------+------+
| a    | b    | c    | e    | f    |
+------+------+------+------+------+
|    2 |    2 |    2 | NULL | NULL |
|    1 | NULL | NULL | NULL | NULL |
+------+------+------+------+------+
 
MariaDB [test]> explain extended SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t4 ON t2.b=t4.f AND t2.b IS NOT NULL ON t1.a = t2.c;
+------+-------------+-------+------+---------------+------+---------+------+------+----------+--------------------------------------------------------+
| id   | select_type | table | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                                                  |
+------+-------------+-------+------+---------------+------+---------+------+------+----------+--------------------------------------------------------+
|    1 | SIMPLE      | t1    | ALL  | NULL          | NULL | NULL    | NULL | 2    |   100.00 |                                                        |
|    1 | SIMPLE      | t2    | ALL  | NULL          | NULL | NULL    | NULL | 3    |   100.00 | Using where; Using join buffer (flat, BNL join)        |
|    1 | SIMPLE      | t4    | ALL  | f             | NULL | NULL    | NULL | 0    |     0.00 | Using where; Using join buffer (incremental, BNL join) |
+------+-------------+-------+------+---------------+------+---------+------+------+----------+--------------------------------------------------------+

Comment by Igor Babaev [ 2020-02-21 ]

Now let's try to reproduce the problem with 'mrr' turned off:

MariaDB [test]> set optimizer_switch='mrr=off';
MariaDB [test]> SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t4 FORCE INDEX(f) ON t2.b=t4.f AND t2.b IS NOT NULL ON t1.a = t2.c;
+------+------+------+------+------+
| a    | b    | c    | e    | f    |
+------+------+------+------+------+
|    1 | NULL | NULL | NULL | NULL |
|    2 | NULL | NULL | NULL | NULL |
+------+------+------+------+------+
 
MariaDB [test]> explain extended SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t4 FORCE INDEX(f) ON t2.b=t4.f AND t2.b IS NOT NULL ON t1.a = t2.c;
+------+-------------+-------+-------+---------------+------+---------+------+------+----------+-------------------------+
| id   | select_type | table | type  | possible_keys | key  | key_len | ref  | rows | filtered | Extra                   |
+------+-------------+-------+-------+---------------+------+---------+------+------+----------+-------------------------+
|    1 | SIMPLE      | t4    | const | f             | NULL | NULL    | NULL | 1    |   100.00 | Impossible ON condition |
|    1 | SIMPLE      | t2    | const | NULL          | NULL | NULL    | NULL | 1    |   100.00 | Impossible ON condition |
|    1 | SIMPLE      | t1    | ALL   | NULL          | NULL | NULL    | NULL | 2    |   100.00 |                         |
+------+-------------+-------+-------+---------------+------+---------+------+------+----------+-------------------------+

Conclusion: the problem can be reproduced settings.

Comment by Igor Babaev [ 2020-02-21 ]

The problem (see the previous comment) is reproducible with the current 10.4 tree.

Comment by Igor Babaev [ 2020-02-22 ]

In 10.3 the problem cannot be reproduced with the test case from my last comment, but it can be reproduced with the query

SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t4 FORCE INDEX(f) ON t2.b=t4.f AND t4.f < 1 AND t4.f > 3 ON t1.a = t2.c;

For this query the problem can be reproduced with non-empty t4 as well:

ariaDB [test]> INSERT INTO t4 VALUES (1,2), (2,2);
Query OK, 2 rows affected (0.000 sec)
Records: 2  Duplicates: 0  Warnings: 0
 
MariaDB [test]> SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t4 FORCE INDEX(f) ON t2.b=t4.f AND t4.f < 1 AND t4.f > 3 ON t1.a = t2.c;
+------+------+------+------+------+
| a    | b    | c    | e    | f    |
+------+------+------+------+------+
|    1 | NULL | NULL | NULL | NULL |
|    2 | NULL | NULL | NULL | NULL |
+------+------+------+------+------+
2 rows in set (0.002 sec)
 
MariaDB [test]> explain extended SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t4 FORCE INDEX(f) ON t2.b=t4.f AND t4.f < 1 AND t4.f > 3 ON t1.a = t2.c;
+------+-------------+-------+-------+---------------+------+---------+------+------+----------+-------------------------+
| id   | select_type | table | type  | possible_keys | key  | key_len | ref  | rows | filtered | Extra                   |
+------+-------------+-------+-------+---------------+------+---------+------+------+----------+-------------------------+
|    1 | SIMPLE      | t4    | const | f             | NULL | NULL    | NULL |    1 |   100.00 | Impossible ON condition |
|    1 | SIMPLE      | t2    | const | NULL          | NULL | NULL    | NULL |    1 |   100.00 | Impossible ON condition |
|    1 | SIMPLE      | t1    | ALL   | NULL          | NULL | NULL    | NULL |    2 |   100.00 |                         |
+------+-------------+-------+-------+---------------+------+---------+------+------+----------+-------------------------+
3 rows in set, 1 warning (0.002 sec)

Comment by Igor Babaev [ 2020-02-22 ]

However in 10.2 the bug cannot be reproduced even with the last query.

MariaDB [test]> SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t4 FORCE INDEX(f) ON t2.b=t4.f AND t4.f < 1 AND t4.f > 3 ON t1.a = t2.c;
+------+------+------+------+------+
| a    | b    | c    | e    | f    |
+------+------+------+------+------+
|    1 | NULL | NULL | NULL | NULL |
|    2 |    2 |    2 | NULL | NULL |
+------+------+------+------+------+
2 rows in set (0.002 sec)
 
MariaDB [test]> explain extended SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t4 FORCE INDEX(f) ON t2.b=t4.f AND t4.f < 1 AND t4.f > 3 ON t1.a = t2.c;
+------+-------------+-------+------+---------------+------+---------+-----------+------+----------+-------------+
| id   | select_type | table | type | possible_keys | key  | key_len | ref       | rows | filtered | Extra       |
+------+-------------+-------+------+---------------+------+---------+-----------+------+----------+-------------+
|    1 | SIMPLE      | t1    | ALL  | NULL          | NULL | NULL    | NULL      |    2 |   100.00 |             |
|    1 | SIMPLE      | t2    | ALL  | NULL          | NULL | NULL    | NULL      |    3 |   100.00 | Using where |
|    1 | SIMPLE      | t4    | ref  | f             | f    | 5       | test.t2.b |    2 |   100.00 | Using where |
+------+-------------+-------+------+---------------+------+---------+-----------+------+----------+-------------+
3 rows in set, 1 warning (0.002 sec)

Comment by Igor Babaev [ 2020-02-22 ]

Debugging shows that we have difference in the plan due to the following change in the code

@@ -4871,39 +4905,80 @@ make_join_statistics(JOIN *join, List<TABLE_LIST> &tables_list,
     
     /*
       Perform range analysis if there are keys it could use (1). 
-      Don't do range analysis if we're on the inner side of an outer join (2).
-      Do range analysis if we're on the inner side of a semi-join (3).
-      Don't do range analysis for materialized subqueries (4).
-      Don't do range analysis for materialized derived tables (5)
+      Don't do range analysis for materialized subqueries (2).
+      Don't do range analysis for materialized derived tables (3)
     */
     if ((!s->const_keys.is_clear_all() ||
         !bitmap_is_clear_all(&s->table->cond_set)) &&              // (1)
-        (!s->table->pos_in_table_list->embedding ||                 // (2)
-         (s->table->pos_in_table_list->embedding &&                 // (3)
-          s->table->pos_in_table_list->embedding->sj_on_expr)) &&   // (3)
-        !s->table->is_filled_at_execution() &&                      // (4)
-        !(s->table->pos_in_table_list->derived &&                   // (5)
-          s->table->pos_in_table_list->is_materialized_derived()))  // (5)
+        !s->table->is_filled_at_execution() &&                      // (2)
+        !(s->table->pos_in_table_list->derived &&                   // (3)
+          s->table->pos_in_table_list->is_materialized_derived()))  // (3)
     {
       bool impossible_range= FALSE;
       ha_rows records= HA_POS_ERROR;

introduced in the commit 03680a9b4fda9fa15675e137d46521628553c0eb

MDEV-17518: Range optimization doesn't use ON expressions from nested outer joins

Comment by Alice Sherepa [ 2022-11-30 ]

the results are correct on the current 10.3 (4e9206736c403206915c09d)-10.10

Comment by Julien Fritsch [ 2023-12-05 ]

Automated message:
----------------------------
Since this issue has not been updated since 6 weeks, it's time to move it back to Stalled.

Comment by JiraAutomate [ 2023-12-05 ]

Automated message:
----------------------------
Since this issue has not been updated since 6 weeks, it's time to move it back to Stalled.

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