SQLite

View Ticket
Login
2010-12-07
15:10 Fixed ticket [80ba2010]: Bug involving subqueries and the OR optimization plus 2 other changes (artifact: e6007e38 user: drh)
2010-12-06
18:59
Back out part of the previous change that was not really necessary in order to fix [80ba201079ea60], and which in fact serves no useful purpose. (check-in: fa9eef86 user: drh tags: trunk)
18:50
Initialize all constants at the very beginning of a prepared statement. Do not allow constant initialization to occur once control flow has a chance to diverge, to avoid the possibility of having uninitialized registers. Ticket [80ba201079ea60807]. (check-in: c5c53152 user: drh tags: trunk)
16:01 New ticket [80ba2010] Bug involving subqueries and the OR optimization. (artifact: 4cebcddb user: dan)

Ticket Hash: 80ba201079ea608071d22a57856b940ea3ac53ce
Title: Bug involving subqueries and the OR optimization
Status: Fixed Type: Code_Defect
Severity: Important Priority: Immediate
Subsystem: Code_Generator Resolution: Fixed
Last Modified: 2010-12-07 15:10:31
Version Found In: 3.7.3
Description:
SELECT statements can return incorrect results in certain cases where the following are true:
  • The query is a join,
  • The query takes advantage of the OR optimization,
  • At least one branch of the optimized OR expression in the WHERE clause involves a subquery.
  • At least one branch of the optimized OR expression in the WHERE clause refers to a column of a table other than the table to which the OR optimization applies.

For example:

  CREATE TABLE t1(a);
  INSERT INTO t1 VALUES('A');
  CREATE INDEX i1 ON t1(a);

  CREATE TABLE t2(b);
  INSERT INTO t2 VALUES('B');

  CREATE TABLE t3(c);
  INSERT INTO t3 VALUES('C');

  SELECT * FROM t1, t2 WHERE
     (a='A' AND b='X')
  OR (a='A' AND EXISTS (SELECT * FROM t3 WHERE c='C'))

The bug causes the query above returns zero rows instead of the expected result - one row.

This bug was discovered in a real application and reported on the mailing list. Bisection reveals that it was introduced on 2009-08-13 by commit [86a06dd049]. It first appeared in release 3.6.18.