3 # The author disclaims copyright to this source code. In place of
4 # a legal notice, here is a blessing:
6 # May you do good and not evil.
7 # May you find forgiveness for yourself and forgive others.
8 # May you share freely, never taking more than you give.
10 #***********************************************************************
12 # Test that the truncate optimization is disabled if the SQLITE_DELETE
13 # authorization callback returns SQLITE_IGNORE.
15 # Test that authorizer is disabled during schema parsing.
17 set testdir [file dirname $argv0]
18 source $testdir/tester.tcl
20 # disable this test if the SQLITE_OMIT_AUTHORIZATION macro is
21 # defined during compilation.
22 if {[catch {db auth {}} msg]} {
27 # Disable the statement cache for these tests.
32 proc auth {code arg1 arg2 arg3 arg4 args} {
33 if {$code=="SQLITE_DELETE"} {
39 #--------------------------------------------------------------------------
40 # The following tests - auth3-1.* - test that return values of SQLITE_DENY,
41 # SQLITE_IGNORE, SQLITE_OK and <invalid> are correctly handled when returned
42 # by an SQLITE_DELETE authorization callback triggered by a
43 # "DELETE FROM <table-name>" statement.
47 CREATE TABLE t1(a,b,c);
48 INSERT INTO t1 VALUES(1, 2, 3);
49 INSERT INTO t1 VALUES(4, 5, 6);
53 set ::authcode SQLITE_DENY
54 catchsql { DELETE FROM t1 }
55 } {1 {not authorized}}
56 # EVIDENCE-OF: R-64962-58611 If the authorizer callback returns any
57 # value other than SQLITE_IGNORE, SQLITE_OK, or SQLITE_DENY then the
58 # sqlite3_prepare_v2() or equivalent call that triggered the authorizer
59 # will fail with an error message.
61 set ::authcode SQLITE_INVALID
62 catchsql { DELETE FROM t1 }
63 } {1 {authorizer malfunction}}
65 execsql { SELECT * FROM t1 }
68 set ::authcode SQLITE_IGNORE
75 set ::authcode SQLITE_OK
77 INSERT INTO t1 VALUES(1, 2, 3);
78 INSERT INTO t1 VALUES(4, 5, 6);
84 #--------------------------------------------------------------------------
85 # These tests - auth3-2.* - test that returning SQLITE_IGNORE really does
86 # disable the truncate optimization.
89 set ::authcode SQLITE_OK
91 INSERT INTO t1 VALUES(1, 2, 3);
92 INSERT INTO t1 VALUES(4, 5, 6);
94 set sqlite_search_count 0
98 set sqlite_search_count
102 set ::authcode SQLITE_IGNORE
104 INSERT INTO t1 VALUES(1, 2, 3);
105 INSERT INTO t1 VALUES(4, 5, 6);
107 set sqlite_search_count 0
111 set sqlite_search_count
114 # 2016-07-28. A problem report from a private client complaining about
115 # an authorizer failure during an ALTER TABLE. The solution (I think) is
116 # to disable the authorizer during schema parsing.
118 ifcapable altertable {
119 proc auth {code args} {
120 if {$code=="SQLITE_READ" && [regexp {DoNotRead} $args]} {
125 do_execsql_test auth3-3.0 {
126 CREATE TEMPORARY TABLE TempTable (
127 key TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT REPLACE,
128 value TEXT NOT NULL ON CONFLICT FAIL);
129 ALTER TABLE TempTable RENAME TO DoNotRead;
130 SELECT name FROM temp.sqlite_master;
131 } {DoNotRead sqlite_autoindex_DoNotRead_1}