| Index: third_party/sqlite/src/test/hook.test
|
| diff --git a/third_party/sqlite/src/test/hook.test b/third_party/sqlite/src/test/hook.test
|
| index 6496d41e137bbaf909967c7d5fc2876657411bb2..de6fbdd254299abd8f6343f0bc52a57ff5e10686 100644
|
| --- a/third_party/sqlite/src/test/hook.test
|
| +++ b/third_party/sqlite/src/test/hook.test
|
| @@ -74,6 +74,7 @@ do_test hook-3.6 {
|
| INSERT INTO t2 VALUES(6,7);
|
| }
|
| } {1 {constraint failed}}
|
| +verify_ex_errcode hook-3.6b SQLITE_CONSTRAINT_COMMITHOOK
|
| do_test hook-3.7 {
|
| set ::commit_cnt
|
| } {1 2 2 3 3 4 4 5 5 6 6 7}
|
| @@ -95,7 +96,7 @@ do_test hook-3.9 {
|
| # Ticket #3564.
|
| #
|
| do_test hook-3.10 {
|
| - file delete -force test2.db test2.db-journal
|
| + forcedelete test2.db test2.db-journal
|
| sqlite3 db2 test2.db
|
| proc commit_hook {} {
|
| set y [db2 one {SELECT y FROM t3 WHERE y>10}]
|
| @@ -126,21 +127,52 @@ db2 close
|
| # depopulation of indices, to make sure the update-hook is not
|
| # invoked incorrectly.
|
| #
|
| +# EVIDENCE-OF: R-21999-45122 The sqlite3_update_hook() interface
|
| +# registers a callback function with the database connection identified
|
| +# by the first argument to be invoked whenever a row is updated,
|
| +# inserted or deleted in a rowid table.
|
|
|
| # Simple tests
|
| -do_test hook-4.1.1 {
|
| +do_test hook-4.1.1a {
|
| catchsql {
|
| DROP TABLE t1;
|
| }
|
| + unset -nocomplain ::update_hook
|
| + set ::update_hook {}
|
| + db update_hook [list lappend ::update_hook]
|
| + #
|
| + # EVIDENCE-OF: R-52223-27275 The update hook is not invoked when
|
| + # internal system tables are modified (i.e. sqlite_master and
|
| + # sqlite_sequence).
|
| + #
|
| execsql {
|
| CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
|
| + CREATE TABLE t1w(a INT PRIMARY KEY, b) WITHOUT ROWID;
|
| + }
|
| + set ::update_hook
|
| +} {}
|
| +do_test hook-4.1.1b {
|
| + execsql {
|
| INSERT INTO t1 VALUES(1, 'one');
|
| INSERT INTO t1 VALUES(2, 'two');
|
| INSERT INTO t1 VALUES(3, 'three');
|
| + INSERT INTO t1w SELECT * FROM t1;
|
| }
|
| - db update_hook [list lappend ::update_hook]
|
| } {}
|
| +
|
| +# EVIDENCE-OF: R-15506-57666 The second callback argument is one of
|
| +# SQLITE_INSERT, SQLITE_DELETE, or SQLITE_UPDATE, depending on the
|
| +# operation that caused the callback to be invoked.
|
| +#
|
| +# EVIDENCE-OF: R-29213-61195 The third and fourth arguments to the
|
| +# callback contain pointers to the database and table name containing
|
| +# the affected row.
|
| +#
|
| +# EVIDENCE-OF: R-30809-57812 The final callback parameter is the rowid
|
| +# of the row.
|
| +#
|
| do_test hook-4.1.2 {
|
| + set ::update_hook {}
|
| execsql {
|
| INSERT INTO t1 VALUES(4, 'four');
|
| DELETE FROM t1 WHERE b = 'two';
|
| @@ -158,6 +190,23 @@ do_test hook-4.1.2 {
|
| DELETE main t1 4 \
|
| ]
|
|
|
| +# EVIDENCE-OF: R-61808-14344 The sqlite3_update_hook() interface does
|
| +# not fire callbacks for changes to a WITHOUT ROWID table.
|
| +#
|
| +# EVIDENCE-OF: R-33257-44249 The update hook is not invoked when WITHOUT
|
| +# ROWID tables are modified.
|
| +#
|
| +do_test hook-4.1.2w {
|
| + set ::update_hook {}
|
| + execsql {
|
| + INSERT INTO t1w VALUES(4, 'four');
|
| + DELETE FROM t1w WHERE b = 'two';
|
| + UPDATE t1w SET b = '' WHERE a = 1 OR a = 3;
|
| + DELETE FROM t1w WHERE 1; -- Avoid the truncate optimization (for now)
|
| + }
|
| + set ::update_hook
|
| +} {}
|
| +
|
| ifcapable trigger {
|
| # Update hook is not invoked for changes to sqlite_master
|
| #
|
| @@ -217,7 +266,7 @@ ifcapable trigger {
|
| set ::update_hook {}
|
| ifcapable attach {
|
| do_test hook-4.2.3 {
|
| - file delete -force test2.db
|
| + forcedelete test2.db
|
| execsql {
|
| ATTACH 'test2.db' AS aux;
|
| CREATE TABLE aux.t3(a INTEGER PRIMARY KEY, b);
|
| @@ -274,6 +323,34 @@ ifcapable compound&&attach {
|
| set ::update_hook
|
| } [list]
|
| }
|
| +
|
| +do_test hook-4.4 {
|
| + execsql {
|
| + CREATE TABLE t4(a UNIQUE, b);
|
| + INSERT INTO t4 VALUES(1, 'a');
|
| + INSERT INTO t4 VALUES(2, 'b');
|
| + }
|
| + set ::update_hook [list]
|
| + execsql {
|
| + REPLACE INTO t4 VALUES(1, 'c');
|
| + }
|
| + set ::update_hook
|
| +} [list INSERT main t4 3 ]
|
| +do_execsql_test hook-4.4.1 {
|
| + SELECT * FROM t4 ORDER BY a;
|
| +} {1 c 2 b}
|
| +do_test hook-4.4.2 {
|
| + set ::update_hook [list]
|
| + execsql {
|
| + PRAGMA recursive_triggers = on;
|
| + REPLACE INTO t4 VALUES(1, 'd');
|
| + }
|
| + set ::update_hook
|
| +} [list INSERT main t4 4 ]
|
| +do_execsql_test hook-4.4.3 {
|
| + SELECT * FROM t4 ORDER BY a;
|
| +} {1 d 2 b}
|
| +
|
| db update_hook {}
|
| #
|
| #----------------------------------------------------------------------------
|
|
|