Thanks a lot for the fast answer & fix.

-jens


Am 20.03.2014 um 14:41 schrieb Richard Hipp <d...@sqlite.org>:

> The ticket is now closed.  Thanks for the bug report.
> 
> To confirm:  The simplest fix is merely to compile without -DSQLITE_DEBUG
> which will disable assert() statements, as the problem is an incorrect
> assert().  There is nothing actually wrong with the logic, that we can
> see.  An alternative work-around is to delete or comment-out the offending
> assert() statement.
> 
> The fix on trunk retains the assert().  The assert() is correct as long as
> the right-hand side of IN operators always have two or more values.  In
> other words, the assert() is correct as long as you never have "x IN (?)"
> with exactly one element in the right-hand side.  On trunk, the parser has
> been modified to automatically convert IN and NOT IN operators with exactly
> one element on their right-hand side into == and <> operators.  That change
> makes the assert() correct again, and it results in faster evaluation SQL
> statements that have an IN or NOT IN operator with just a single RHS
> element.
> 
> 
> 
> On Thu, Mar 20, 2014 at 8:27 AM, Richard Hipp <d...@sqlite.org> wrote:
> 
>> http://www.sqlite.org/src/info/e39d032577
>> 
>> It appears that the fix will be to simply remove the assert() statement,
>> which is incorrect.  But it will take some time to verify that this is the
>> correct fix and add new test cases, etc.
>> 
>> Your work-around is to simply compile without -DSQLITE_DEBUG (thus
>> disabling all assert() statements) or delete the assert() that is failing.
>> 
>> 
>> On Thu, Mar 20, 2014 at 7:26 AM, Jens Miltner <j...@mac.com> wrote:
>> 
>>> Hi,
>>> 
>>> I ran into the following problem after updating the SQLite 3.8.4.1:
>>> 
>>> When executing the following (rather basic) SELECT query in a debug build
>>> of sqlite3, this will cause an assertion to fire in
>>> whereLoopAddBtreeIndex() (sqlite3.c, line 13411):
>>> 
>>> SELECT * FROM t1 WHERE(foo_id=5 AND name IN ('foo'));
>>> 
>>> The database schema to reproduce is:
>>> 
>>> CREATE TABLE t1 (id INTEGER PRIMARY KEY, foo_id INTEGER, name
>>> VARCHAR(36), phone VARCHAR(36));
>>> CREATE UNIQUE INDEX t1_udx ON t1(name, foo_id);
>>> CREATE INDEX t1_idx ON t1 (phone, foo_id);
>>> 
>>> 
>>> The assertion that fires is the following:
>>> 
>>>        assert( (pNew->wsFlags & WHERE_COLUMN_IN)==0 || iCol<0 );
>>> 
>>> 
>>> This is quite annoying, since it will terminate the app when we build our
>>> app with DEBUG enabled and a similar query is executed.
>>> 
>>> Can you SQLite folks please have a look into this?
>>> 
>>> Thanks,
>>> -jens
>>> 

_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to