◐ Shell
clean mode source ↗

Issue 36073: sqlite crashes with converters mutating cursor

It's somewhat similar to bpo-10811, but for converter function:

In [197]: import sqlite3 as sqlite
     ...: con = sqlite.connect(':memory:', detect_types=sqlite.PARSE_COLNAMES)
     ...: cur = con.cursor()
     ...: sqlite.converters['CURSOR_INIT'] = lambda x: cur.__init__(con)
     ...: 
     ...: cur.execute('create table test(x foo)')
     ...: cur.execute('insert into test(x) values (?)', ('foo',))
     ...: cur.execute('select x as "x [CURSOR_INIT]", x from test')
     ...: 
[1]    25718 segmentation fault  python manage.py shell

Similar to bpo-10811, proposed patch raises ProgrammingError instead of crashing.
Er, a little bit too fast there. There is still a crash, but it is of course postponed bco. bpo-44976. New reproducer:

import sqlite3 as sqlite
con = sqlite.connect(':memory:', detect_types=sqlite.PARSE_COLNAMES)
cur = con.cursor()
sqlite.converters['CURSOR_INIT'] = lambda x: cur.__init__(con)

cur.execute('create table test(x foo)')
cur.execute('insert into test(x) values (?)', ('foo',))
for row in cur.execute('select x as "x [CURSOR_INIT]", x from test'):
    print(row)