But in my example there are multiple rows which satisfy the condition.

My example:

sql="create table em(name int primary key,age int);"\
    "create table idv(id int primary key,name text);"\
    "create table mny(id int primary key,sal int);"\
    "create table lo(name int primary key,addr text);";

sql="insert into em values(44,21);"\
    "insert into em values(11,20);"\
"insert into em values(5,20);"\
    "insert into idv values(11,44);"\
    "insert into idv values(5,11);"\
"insert into idv values(44,180);"\
    "insert into mny values(5,10000);"\
    "insert into mny values(11,5000);"\
"insert into mny values(44,5000);"\
    "insert into lo values(5,'NY');"\
    "insert into lo values(44,'che');"\
"insert into lo values(11,'NY');";

sql="select * from em,lo,mny,idv where lo.name=em.name and idv.id=mny.id ";

VDBE:

   0 Init             0   41    0               00
   1 OpenRead         0    2    0 2             00
   2 OpenRead         1    9    0 2             00
   3 OpenRead         4   10    0 k(2,nil,nil)  00
   4 OpenRead         2    7    0 2             00
   5 OpenRead         3    5    0 2             00
   6 OpenRead         5    6    0 k(2,nil,nil)  00
   7 Rewind           0   34    0               00
   8 Column           0    0    1               00
   9 IsNull           1   33    0               00
  10 Affinity         1    1    0 D             00
  11 SeekGE           4   33    1 1             00
  12 IdxGT            4   33    1 1             00
  13 IdxRowid         4    2    0               00
  14 Seek             1    2    0               00
  15 Rewind           2   33    0               00
  16 Column           2    0    3               00
  17 IsNull           3   32    0               00
  18 Affinity         3    1    0 D             00
  19 SeekGE           5   32    3 1             00
  20 IdxGT            5   32    3 1             00
  21 IdxRowid         5    4    0               00
  22 Seek             3    4    0               00
  23 Column           0    0    5               00
  24 Column           0    1    6               00
  25 Column           4    0    7               00
  26 Column           1    1    8               00
  27 Column           2    0    9               00
  28 Column           2    1   10               00
  29 Column           5    0   11               00
  30 Column           3    1   12               00
  31 ResultRow        5    8    0               00
  32 Next             2   16    0               01
  33 Next             0    8    0               01
  34 Close            0    0    0               00
  35 Close            1    0    0               00
  36 Close            4    0    0               00
  37 Close            2    0    0               00
  38 Close            3    0    0               00
  39 Close            5    0    0               00
  40 Halt             0    0    0               00
  41 Transaction      0    0 44729 0             01
  42 TableLock        0    2    0 em            00
  43 TableLock        0    9    0 lo            00
  44 TableLock        0    7    0 mny           00
  45 TableLock        0    5    0 idv           00
  46 Goto             0    1    0               00


How sqlite works in this case ?
because there are 4 tables and for only 2 tables(or indices) it opened
loops ?
The next opcodes belongs to which tables in this case?


On Tue, Mar 17, 2015 at 5:47 PM, Hick Gunter <hick at scigames.at> wrote:

> If there can be not more than one row that satisfies the constraints (i.e.
> the constraints specifiy a unique key) and there is an index (express or
> implied or autocreated) available, then a simple index lookup will suffice.
>
> How many rows do you expect to have a rowid of 1?
> How many rows do you expect to read from table a for each row of table b
> if a_rowid is a foreign key?
>
> create temp table a (f1 integer);
> create temp table b (a_rowid integer, f2 integer);
>
> .explain
> explain select * from a where rowid = 1;
> addr  opcode         p1    p2    p3    p4             p5  comment
> ----  -------------  ----  ----  ----  -------------  --  -------------
> 0     Trace          0     0     0                    00  NULL
> 1     Integer        1     1     0                    00  NULL
> 2     Goto           0     10    0                    00  NULL
> 3     OpenRead       0     2     1     1              00  a
> 4     MustBeInt      1     8     0                    00  NULL
> 5     NotExists      0     8     1                    00  pk
> 6     Column         0     0     3                    00  a.f1
> 7     ResultRow      3     1     0                    00  NULL
> 8     Close          0     0     0                    00  NULL
> 9     Halt           0     0     0                    00  NULL
> 10    Transaction    1     0     0                    00  NULL
> 11    VerifyCookie   1     1     0                    00  NULL
> 12    TableLock      1     2     0     a              00  NULL
> 13    Goto           0     3     0                    00  NULL
>
> explain select * from a join b on a.rowid=b.a_rowid where b.f2 = 1;
> addr  opcode         p1    p2    p3    p4             p5  comment
> ----  -------------  ----  ----  ----  -------------  --  -------------
> 0     Trace          0     0     0                    00  NULL
> 1     Integer        1     1     0                    00  NULL
> 2     Goto           0     19    0                    00  NULL
> 3     OpenRead       1     3     1     2              00  b
> 4     OpenRead       0     2     1     1              00  a
> 5     Rewind         1     16    0                    00  NULL
> 6     Column         1     1     2                    00  b.f2
> 7     Ne             1     15    2     collseq(BINARY)  6c  NULL
> 8     Column         1     0     3                    00  b.a_rowid
> 9     MustBeInt      3     15    0                    00  NULL
> 10    NotExists      0     15    3                    00  pk
> 11    Column         0     0     4                    00  a.f1
> 12    Column         1     0     5                    00  b.a_rowid
> 13    Column         1     1     6                    00  b.f2
> 14    ResultRow      4     3     0                    00  NULL
> 15    Next           1     6     0                    01  NULL
> 16    Close          1     0     0                    00  NULL
> 17    Close          0     0     0                    00  NULL
> 18    Halt           0     0     0                    00  NULL
> 19    Transaction    1     0     0                    00  NULL
> 20    VerifyCookie   1     2     0                    00  NULL
> 21    TableLock      1     3     0     b              00  NULL
> 22    TableLock      1     2     0     a              00  NULL
> 23    Goto           0     3     0                    00  NULL
>
> -----Urspr?ngliche Nachricht-----
> Von: Sairam Gaddam [mailto:gaddamsairam at gmail.com]
> Gesendet: Dienstag, 17. M?rz 2015 12:26
> An: General Discussion of SQLite Database
> Betreff: [sqlite] regarding loops in vdbe code
>
> When joining a table in sqlite with some condition using where clause,
> sqlite sometimes generate less number of loops(Next opcodes) than the
> number of tables.
> Can anyone explain how sqlite iterates through all the tables when it has
> less number of loops.
> _______________________________________________
> sqlite-users mailing list
> sqlite-users at mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>
>
> ___________________________________________
>  Gunter Hick
> Software Engineer
> Scientific Games International GmbH
> FN 157284 a, HG Wien
> Klitschgasse 2-4, A-1130 Vienna, Austria
> Tel: +43 1 80100 0
> E-Mail: hick at scigames.at
>
> This communication (including any attachments) is intended for the use of
> the intended recipient(s) only and may contain information that is
> confidential, privileged or legally protected. Any unauthorized use or
> dissemination of this communication is strictly prohibited. If you have
> received this communication in error, please immediately notify the sender
> by return e-mail message and delete all copies of the original
> communication. Thank you for your cooperation.
>
>
> _______________________________________________
> sqlite-users mailing list
> sqlite-users at mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>

Reply via email to