SQLite

View Ticket
Login
Ticket Hash: 80177f0c226ff54f6ddd410fc5db9b04f0d8573d
Title: Incorrect result when join condition uses a table-valued function
Status: Fixed Type: Code_Defect
Severity: Severe Priority: Immediate
Subsystem: Unknown Resolution: Fixed
Last Modified: 2018-01-26 23:48:05
Version Found In: 3.22.0
User Comments:
drh added on 2018-01-26 22:26:59:

The SELECT statement at the end of the SQL shown below should return a two-row result, but instead returns an empty set.

CREATE TABLE t1(id, json);
INSERT INTO t1(id,json) VALUES(1,'{"items":[3,5]}');
CREATE TABLE t2(id, json);
INSERT INTO t2(id,json) VALUES(2,'{"value":2}');
INSERT INTO t2(id,json) VALUES(3,'{"value":3}');
INSERT INTO t2(id,json) VALUES(4,'{"value":4}');
INSERT INTO t2(id,json) VALUES(5,'{"value":5}');
INSERT INTO t2(id,json) VALUES(6,'{"value":6}');
SELECT * FROM t2 CROSS JOIN t1
 WHERE EXISTS(SELECT 1 FROM json_each(t1.json,'$.items') AS Z
               WHERE Z.value==t2.id);

The problem is that the query planner fails to recognize that the EXISTS expression in the WHERE clause has a dependency on table t1, and so it generates code for the EXISTS expression after the outer loop over t2 and before the inner loop over t1 has been run. This means that the t1.json value for the EXISTS expression is incorrect, and an incorrect answer results.

This problem appears to have been in the code ever since table-valued functions were introduced with version 3.9.0 (2015-10-14).

This problem was reported on the sqlite-users mailing list by Jens Alfke.