SQLite

View Ticket
Login
Ticket Hash: e39d032577df6942f4a91ad7159076fad7710e2a
Title: Assertion fault on a query containing "x IN (?)"
Status: Fixed Type: Code_Defect
Severity: Important Priority: Immediate
Subsystem: Unknown Resolution: Fixed
Last Modified: 2014-03-20 13:31:59
Version Found In: 3.8.4.1
User Comments:
drh added on 2014-03-20 11:52:02: (text/x-fossil-wiki)
The following SQL generates an assertion fault:

<blockquote><verbatim>
CREATE TABLE t1(a,b);
CREATE INDEX t1ab ON t1(b,a);
SELECT * FROM t1 WHERE a=? AND b IN (?);
</verbatim></blockquote>

The problem appears to have been introduced by the NGQP cut-over on
2013-06-26 (check-in [0fe31f60ca] for version 3.8.0).

drh added on 2014-03-20 13:31:59: (text/x-fossil-wiki)
The failing assert() statement is incorrect.  So compiling without -DSQLITE_DEBUG
and thus omitting all assert() statements is an easy work-around.

This problem only arises in cases where there is a multi-column index and
the earlier column is constrained by "x IN (?1)" and the later column is
constrained by "y=?2".  The fix on trunk is to change the parser so that
when the right-hand side of IN is a single expression, the IN operator is
converted into ==.  This accomplishes the same thing, and it results in 
tighter VDBE code in the corner-case of a single value on the RHS of IN.

Since after the change above, all IN operators have two or more elements on
their RHS, the assert() statement is now correct and is retained.