1# 2006 Aug 24 2# 3# The author disclaims copyright to this source code. In place of 4# a legal notice, here is a blessing: 5# 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. 9# 10#*********************************************************************** 11# This file implements regression tests for SQLite library. The 12# focus of this script is testing the sqlite3_set_authorizer() API 13# and related functionality. 14# 15# $Id: auth2.test,v 1.3 2008/07/02 13:13:53 danielk1977 Exp $ 16# 17 18set testdir [file dirname $argv0] 19source $testdir/tester.tcl 20 21# disable this test if the SQLITE_OMIT_AUTHORIZATION macro is 22# defined during compilation. 23if {[catch {db auth {}} msg]} { 24 finish_test 25 return 26} 27 28do_test auth2-1.1 { 29 execsql { 30 CREATE TABLE t1(a,b,c); 31 INSERT INTO t1 VALUES(1,2,3); 32 } 33 set ::flist {} 34 proc auth {code arg1 arg2 arg3 arg4} { 35 if {$code=="SQLITE_FUNCTION"} { 36 lappend ::flist $arg2 37 if {$arg2=="max"} { 38 return SQLITE_DENY 39 } elseif {$arg2=="min"} { 40 return SQLITE_IGNORE 41 } else { 42 return SQLITE_OK 43 } 44 } 45 return SQLITE_OK 46 } 47 db authorizer ::auth 48 catchsql {SELECT max(a,b,c) FROM t1} 49} {1 {not authorized to use function: max}} 50do_test auth2-1.2 { 51 set ::flist 52} max 53do_test auth2-1.3 { 54 set ::flist {} 55 catchsql {SELECT min(a,b,c) FROM t1} 56} {0 {{}}} 57do_test auth2-1.4 { 58 set ::flist 59} min 60do_test auth2-1.5 { 61 set ::flist {} 62 catchsql {SELECT coalesce(min(a,b,c),999) FROM t1} 63} {0 999} 64do_test auth2-1.6 { 65 set ::flist 66} {coalesce min} 67do_test auth2-1.7 { 68 set ::flist {} 69 catchsql {SELECT coalesce(a,b,c) FROM t1} 70} {0 1} 71do_test auth2-1.8 { 72 set ::flist 73} coalesce 74 75# Make sure the authorizer is not called when parsing the schema 76# and when computing the result set of a view. 77# 78db close 79sqlite3 db test.db 80sqlite3 db2 test.db 81proc auth {args} { 82 global authargs 83 append authargs $args\n 84 return SQLITE_OK 85} 86db auth auth 87do_test auth2-2.1 { 88 set ::authargs {} 89 db eval { 90 CREATE TABLE t2(x,y,z); 91 } 92 set ::authargs 93} {SQLITE_INSERT sqlite_master {} main {} 94SQLITE_CREATE_TABLE t2 {} main {} 95SQLITE_UPDATE sqlite_master type main {} 96SQLITE_UPDATE sqlite_master name main {} 97SQLITE_UPDATE sqlite_master tbl_name main {} 98SQLITE_UPDATE sqlite_master rootpage main {} 99SQLITE_UPDATE sqlite_master sql main {} 100SQLITE_READ sqlite_master ROWID main {} 101SQLITE_READ sqlite_master name main {} 102SQLITE_READ sqlite_master rootpage main {} 103SQLITE_READ sqlite_master sql main {} 104SQLITE_READ sqlite_master tbl_name main {} 105SQLITE_READ sqlite_master ROWID main {} 106} 107do_test auth2-2.2 { 108 set ::authargs {} 109 db eval { 110 CREATE VIEW v2 AS SELECT x+y AS a, y+z AS b from t2; 111 } 112 set ::authargs 113} {SQLITE_INSERT sqlite_master {} main {} 114SQLITE_CREATE_VIEW v2 {} main {} 115SQLITE_UPDATE sqlite_master type main {} 116SQLITE_UPDATE sqlite_master name main {} 117SQLITE_UPDATE sqlite_master tbl_name main {} 118SQLITE_UPDATE sqlite_master rootpage main {} 119SQLITE_UPDATE sqlite_master sql main {} 120SQLITE_READ sqlite_master ROWID main {} 121SQLITE_READ sqlite_master name main {} 122SQLITE_READ sqlite_master rootpage main {} 123SQLITE_READ sqlite_master sql main {} 124SQLITE_READ sqlite_master tbl_name main {} 125SQLITE_READ sqlite_master ROWID main {} 126} 127do_test auth2-2.3 { 128 set ::authargs {} 129 db eval { 130 SELECT a, b FROM v2; 131 } 132 set ::authargs 133} {SQLITE_SELECT {} {} {} {} 134SQLITE_READ v2 a main {} 135SQLITE_READ v2 b main {} 136SQLITE_READ t2 x main v2 137SQLITE_READ t2 y main v2 138SQLITE_READ t2 y main v2 139SQLITE_READ t2 z main v2 140SQLITE_SELECT {} {} {} v2 141} 142do_test auth2-2.4 { 143 db2 eval { 144 CREATE TABLE t3(p,q,r); 145 } 146 set ::authargs {} 147 db eval { 148 SELECT b, a FROM v2; 149 } 150 set ::authargs 151} {SQLITE_SELECT {} {} {} {} 152SQLITE_READ v2 b main {} 153SQLITE_READ v2 a main {} 154SQLITE_READ t2 x main v2 155SQLITE_READ t2 y main v2 156SQLITE_READ t2 y main v2 157SQLITE_READ t2 z main v2 158SQLITE_SELECT {} {} {} v2 159SQLITE_SELECT {} {} {} {} 160SQLITE_READ v2 b main {} 161SQLITE_READ v2 a main {} 162SQLITE_READ t2 x main v2 163SQLITE_READ t2 y main v2 164SQLITE_READ t2 y main v2 165SQLITE_READ t2 z main v2 166SQLITE_SELECT {} {} {} v2 167} 168db2 close 169 170finish_test 171