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
[email protected]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users