Thanks a lot Richard for your help. I apologize for not including the
script. I will make it a point to add the scripts from hereon.

On Fri, Sep 19, 2014 at 10:30 AM, Richard Hipp <d...@sqlite.org> wrote:

> You start by presenting us with a stand-alone script that we can run to see
> your question.  See you are getting free help, you really should be
> striving to make it easy for people to help you.  We don't have a script
> from you, so I made one up.  I'm using:
>
> CREATE TABLE employee(eid INTEGER PRIMARY KEY, name TEXT);
> CREATE TABLE location(lid INTEGER PRIMARY KEY, name TEXT);
> CREATE TABLE company(cid INTEGER PRIMARY KEY, name TEXT);
> .explain
> EXPLAIN
> SELECT *
>   FROM employee, company, location
>  WHERE location.name=company.name
>    AND location.name=employee.name;
>
> Be sure to indent your code clearly so that people and understand it more
> easily.
>
> For the trunk of SQLite, the first few instructions are:
>
> addr  opcode         p1    p2    p3    p4             p5  comment
> ----  -------------  ----  ----  ----  -------------  --  -------------
> 0     Init           0     44    0                    00  Start at 44
> 1     OpenRead       0     2     0     2              00  root=2 iDb=0;
> employee
> 2     OpenRead       2     3     0     2              00  root=3 iDb=0;
> location
> 3     OpenRead       1     4     0     2              00  root=4 iDb=0;
> company
> 4     Explain        0     0     0     SCAN TABLE employee
> 00
> 5     Rewind         0     42    0                    00
> 6       Once           0     14    0                    00
> 7       OpenAutoindex  3     2     0     k(2,nil,nil)   00  nColumn=2; for
> location
> 8       Rewind         2     14    0                    00
> 9         Column         2     1     2                    00  r[2]=
> location.name
> 10        Rowid          2     3     0                    00  r[3]=rowid
> 11        MakeRecord     2     2     1                    00
> r[1]=mkrec(r[2..3])
> 12        IdxInsert      3     1     0                    10  key=r[1]
> 13      Next           2     9     0                    03
>
> I think you are interested in knowing where the P3 operand (the output
> register number) for instruction 9 comes from.  (Note that the program
> shown above might be slightly different in whatever version of SQLite you
> are running.)
>
> The way you find this out is to first compile sqlite3 using
> -DSQLITE_DEBUG.  Then add the statement:
>
>      PRAGMA vdbe_addoptrace=ON;
>
> Right before the "EXPLAIN" in the script.  That pragma (only available when
> SQLite is compiled with -DSQLITE_DEBUG) causes SQLite to print a message on
> the screen every time it generates a new opcode.  Next, run sqlite3 in a
> debugger and set a breakpoint on the "test_addop_breakpoint" procedure.
> (This is a dummy procedure created specifically to give you a place to set
> a breakpoint.)  Then run your script.  Continue past the first few
> breakpoints until the "Column" instruction is emitted.  Now you can examine
> the call stack to figure out exactly how that opcode was generated.
>
> It appears that the output register 2 comes from here:
>
>     http://www.sqlite.org/src/artifact/fae81cc2eb14b?ln=812-813
>
> Specifically the last parameter.  regBase+j.  You can continue to follow
> the stack to figure out where regBase was computed.  There are comments on
> each function that try to explain what that particular function is doing.
>
>
>
>
>
>
> --
> D. Richard Hipp
> d...@sqlite.org
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to