Sairam Gaddam wrote: > On Thu, Apr 9, 2015 at 1:04 PM, Clemens Ladisch <clemens at ladisch.de> wrote: >> Sairam Gaddam wrote: >>> sql="create table em(name text primary key,age text,pts text);"\ >>> "create table l(name text primary key,fame text);"; >>> >>> sql = "select * from em,l where l.fame=em.age"; >>> >>> 4 Once 0 13 0 00 >>> 5 OpenAutoindex 2 3 0 k(3,nil,nil,nil) 00 >>> 6 Rewind 1 13 0 00 >>> 7 Column 1 1 2 00 >>> 8 Column 1 0 3 00 >>> 9 Rowid 1 4 0 00 >>> 10 MakeRecord 2 3 1 00 >>> 11 IdxInsert 2 1 0 10 >>> 12 Next 1 7 0 03 >>> 13 Column 0 1 5 00 >>> 14 IsNull 5 24 0 00 >>> 15 SeekGE 2 24 5 1 00 >>> 16 IdxGT 2 24 5 1 00 >>> 17 Column 0 0 6 00 >>> 18 Copy 5 7 0 00 >>> 19 Column 0 2 8 00 >>> 20 Column 2 1 9 00 >>> 21 Column 2 0 10 00 >>> 22 ResultRow 6 5 0 00 >>> 23 Next 2 16 0 00 >>> 24 Next 0 4 0 01 >>> ... >>> >>> whenever the condition in the where clause is false, the program jumps to >>> the instruction pointed by p2 of SeekGe >> >> Yes. >> >>> but if the condition proves to be false for the row 1 of both the >>> tables, then the program jumps to line 24(in this case) which >>> corresponds to outer table and takes the second row of outer table >>> for next iteration, then when will the program fetch 1st row >>> of table-1 and remaining rows of table-2 ??? >> >> In the join loop, this VDBE program does not fetch any rows from the >> second table: >> >> explain query plan select * from em,l where l.fame=em.age; >> 0|0|0|SCAN TABLE em >> 0|1|1|SEARCH TABLE l USING AUTOMATIC COVERING INDEX (fame=?) >> >> All accesses to "l" are actually handled by the temporary index (which >> is created by instructions 5..12). One index search is enough to >> determine whether a fame value exists. > > Then why there is a loop (Next opcode at 23rd instruction) over second > table when it created an index ?
Because there might be multiple index entries with the same fame value. Regards, Clemens