Additional background:

The optimization that caused this bug was an attempt to fix a
performance regression reported here
(https://www.mail-archive.com/sqlite-users@mailinglists.sqlite.org/msg113314.html)
which was in turned caused by a fix to a prior bug here
(https://sqlite.org/src/info/787fa716be3a7f650cac).

On 2/19/19, Richard Hipp <d...@sqlite.org> wrote:
> 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
>


-- 
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