On 4/19/16, Nikos Tsikoudis <tsikudis at brandeis.edu> wrote:
> On 4/19/2016 8:25 PM, Richard Hipp wrote:
>> https://www.sqlite.org/c3ref/interrupt.html
>>
>> Or have your function throw an error using sqlite3_result_error() -
>> https://www.sqlite.org/c3ref/result_blob.html
>>
> That works but in the function I update another table in the same
> database and after the interrupt or the error throw the updates have not
> taken place....

Works when I try it.  The TCL script I used to test is as follows:

sqlite3 db :memory:
db eval {
  CREATE TABLE t1(x);
  INSERT INTO t1(x) VALUES(1),(2),(3),(4);
  CREATE TABLE t2(y);
}
proc user_func {x} {
  db eval {INSERT INTO t2(y) VALUES($x)}
  if {$x==3} {
    sqlite3_interrupt db
    # Comment out the previous and replace with
    #    error "all done here"
    # to terminate using an error rather than an interrupt
  } else {
    return $x
  }
}
db function user_func user_func
catch {
  db eval {
    SELECT user_func(x) FROM t1;
  }
} res
puts res=$res
puts [db eval {SELECT * FROM t2}]

This prints the values "1 2 3" on the last line in both cases - when
the loop is terminated using sqlite3_interrupt or when the loop is
terminated by throwing an error.
-- 
D. Richard Hipp
drh at sqlite.org

Reply via email to