Further debugging hints (for those who are interested):

If you compile with --enable-debug and run the script below, it will
give you more information about what is going on in the bytecode:

CREATE TABLE IF NOT EXISTS t1(id INTEGER PRIMARY KEY);
INSERT INTO t1 VALUES(1);
.eqp trace
SELECT a.id FROM t1 AS a JOIN t1 AS b ON a.id=b.id WHERE a.id IN (1,2,3);

On 2/19/19, Richard Hipp <d...@sqlite.org> wrote:
> If you compile with assert() statements enabled (using the
> --enable-debug option with ./configure or otherwise adding the
> -DSQLITE_DEBUG flag) then you will hit an assertion fault earlier.
> The problem is that the same ephemeral table - the in-memory table
> that is constructed to hold the RHS of the IN operator "(1,2,3)" - is
> being used for two incompatible purposes.  The check-in that caused
> the problem (https://www.sqlite.org/src/info/e130319317e76119) tries
> to reuse the RHS of IN operators so that they do not have to be
> computed multiple times.  Check-in e130319317 is an optimization.  But
> apparently the optimization is a little too aggressive.  I did not
> foresee that the RHS of the IN operator might be used in incompatible
> ways.
>
> The first use of the (1,2,3) table is to drive a loop.  The loop runs
> over every entry in the (1,2,3) table, then seeks in the "A" table to
> see if a row exists with the same value "A.ID" value.
>
> The second use of the (1,2,3) table is to verify that the "B.ID" value
> exists in the table.
>
> The first use wants the (1,2,3) table to be a rowid-table with no
> content.  It just stores rowids.  The second use wants the table to be
> an index, for fast lookups.
>
> The fault occurs when the bytecode tries to use the (1,2,3) table,
> which is a rowid table, as an index.
>
> On 2/19/19, dave <d...@ziggurat29.com> wrote:
>>
>>> Wow; can confirm. I crashed it in my debugger in the
>>> amalgamation of 3.27.1
>>> in the function SQLITE_PRIVATE RecordCompare
>>> sqlite3VdbeFindCompare(UnpackedRecord *p)
>>>
>>> At line 80720,   if( p->pKeyInfo->nAllField<=13 )
>>>
>>> in that case:
>>> pKeyInfo is NULL
>>
>> Lastly, if it helps, converting the query to:
>>
>> SELECT a.id FROM t AS a INNER JOIN t as b ON a.id = b.id WHERE
>> a.id = 1 or a.id = 2 or a.id = 3;
>>
>> Does /not/ crash.
>>
>> (and nice work on the bisect! Lol)
>>
>> -dave
>>
>>
>> _______________________________________________
>> sqlite-users mailing list
>> sqlite-users@mailinglists.sqlite.org
>> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>>
>
>
> --
> D. Richard Hipp
> d...@sqlite.org
>


-- 
D. Richard Hipp
d...@sqlite.org
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to