We have a virtual table serving as a table-valued function, which has worked 
fine up through SQLite 3.19, but now in 3.20.1 is crashing whenever it’s used. 
I know there were changes in 3.20 relating to native functions taking pointers, 
but this doesn’t seem to be related to that. Were there any other 
possibly-breaking changes to the way virtual tables work? I didn’t see any in 
the release notes.

As virtual tables go it’s pretty simple. It was shamelessly copied from the 
json_each implementation in json1.c, then adapted from there, and it’s still 
quite similar (it’s just that the data collection it’s iterating over is not in 
JSON format.)

What I’m seeing is that our fl_each's  xConnect and xBestIndex are called at 
compile/prepare time, then xOpen is called during the first call to 
sqlite3_step, and immediately after that comes a crash in 
sqlite3VdbeCursorMoveto() because the passed-in VdbeCursor is NULL. (Actually 
pp is a valid pointer, but *pp is NULL.) This is right at the start of handling 
the next opcode, Column.

Top of the backtrace is:
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS 
(code=1, address=0x0)
    frame #0: sqlite3VdbeCursorMoveto(pp=0x00007ffeefbfb028, 
piCol=0x00007ffeefbfb034) at sqlite3.c:75132
  * frame #1: sqlite3VdbeExec(p=0x0000000101171680) at sqlite3.c:81369
    frame #2: sqlite3Step(p=0x0000000101171680) at sqlite3.c:77352
    frame #3: sqlite3_step(pStmt=0x0000000101171680) at sqlite3.c:77416

The SQL query looks like:
        SELECT sequence, key, version, flags 
        FROM kv_default 
        WHERE (EXISTS (SELECT 1 FROM fl_each(body, 'likes') AS _like WHERE 
_like.value = 'climbing’))

EXPLAIN returns:
        0       Init    0       24      0               00      Start at 24
        1       Integer 0       2       0               00      r[2]=0; Init 
EXISTS result
        2       Integer 1       3       0               00      r[3]=1; LIMIT 
counter
        3       VOpen   1       0       0       vtab:10116FC00  00      
        4       Column  0       4       6               00      
r[6]=kv_default.body    <==CRASH AT THIS OPCODE
        5       String8 0       7       0       likes   00      r[7]='likes'
        6       Integer 2       4       0               00      r[4]=2
        7       Integer 2       5       0               00      r[5]=2
        8       VFilter 1       14      4               00      iplan=r[4] 
zplan=''
        9       VColumn 1       1       8               00      
r[8]=vcolumn(1); fl_each.value
        10      Ne      9       13      8       (BINARY)        51      if 
r[8]!=r[9] goto 13
        11      Integer 1       2       0               00      r[2]=1
        12      DecrJumpZero    3       14      0               00      if 
(--r[3])==0 goto 14
        13      VNext   1       9       0               00      
        14      IfNot   2       23      1               00      
        15      OpenRead        0       4       0       5       00      root=4 
iDb=0; kv_default
        16      Rewind  0       23      0               00      
        17      Column  0       1       11              00      
r[11]=kv_default.sequence
        18      Column  0       0       12              00      
r[12]=kv_default.key
        19      Column  0       3       13              00      
r[13]=kv_default.version
        20      Column  0       2       14      0       00      
r[14]=kv_default.flags
        21      ResultRow       11      4       0               00      
output=r[11..14]
        22      Next    0       17      0               01      
        23      Halt    0       0       0               00      
        24      Transaction     0       0       4       0       01      
usesStmtJournal=0
        25      String8 0       9       0       climbing        00      
r[9]='climbing'
        26      Goto    0       1       0               00      

(This is on Mac OS; I’m on the current beta of 10.13, though that shouldn’t 
make a difference.)

—Jens
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to