1 # 2006 June 10 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 file is the authorisation callback and virtual tables. 13 # 14 # $Id: vtab3.test,v 1.3 2008/07/12 14:52:21 drh Exp $ 15 16 set testdir [file dirname $argv0] 17 source $testdir/tester.tcl 18 19 ifcapable !vtab||!auth { 20 finish_test 21 return 22 } 23 24 set ::auth_fail 0 25 set ::auth_log [list] 26 set ::auth_filter [list SQLITE_READ SQLITE_UPDATE SQLITE_SELECT SQLITE_PRAGMA] 27 28 proc auth {code arg1 arg2 arg3 arg4} { 29 if {[lsearch $::auth_filter $code]>-1} { 30 return SQLITE_OK 31 } 32 lappend ::auth_log $code $arg1 $arg2 $arg3 $arg4 33 incr ::auth_fail -1 34 if {$::auth_fail == 0} { 35 return SQLITE_DENY 36 } 37 return SQLITE_OK 38 } 39 40 do_test vtab3-1.1 { 41 execsql { 42 CREATE TABLE elephant( 43 name VARCHAR(32), 44 color VARCHAR(16), 45 age INTEGER, 46 UNIQUE(name, color) 47 ); 48 } 49 } {} 50 51 52 do_test vtab3-1.2 { 53 register_echo_module [sqlite3_connection_pointer db] 54 db authorizer ::auth 55 execsql { 56 CREATE VIRTUAL TABLE pachyderm USING echo(elephant); 57 } 58 set ::auth_log 59 } [list \ 60 SQLITE_INSERT sqlite_master {} main {} \ 61 SQLITE_CREATE_VTABLE pachyderm echo main {} \ 62 ] 63 64 do_test vtab3-1.3 { 65 set ::auth_log [list] 66 execsql { 67 DROP TABLE pachyderm; 68 } 69 set ::auth_log 70 } [list \ 71 SQLITE_DELETE sqlite_master {} main {} \ 72 SQLITE_DROP_VTABLE pachyderm echo main {} \ 73 SQLITE_DELETE pachyderm {} main {} \ 74 SQLITE_DELETE sqlite_master {} main {} \ 75 ] 76 77 do_test vtab3-1.4 { 78 set ::auth_fail 1 79 catchsql { 80 CREATE VIRTUAL TABLE pachyderm USING echo(elephant); 81 } 82 } {1 {not authorized}} 83 do_test vtab3-1.5 { 84 execsql { 85 SELECT name FROM sqlite_master WHERE type = 'table'; 86 } 87 } {elephant} 88 89 do_test vtab3-1.5 { 90 set ::auth_fail 2 91 catchsql { 92 CREATE VIRTUAL TABLE pachyderm USING echo(elephant); 93 } 94 } {1 {not authorized}} 95 do_test vtab3-1.6 { 96 execsql { 97 SELECT name FROM sqlite_master WHERE type = 'table'; 98 } 99 } {elephant} 100 101 do_test vtab3-1.5 { 102 set ::auth_fail 3 103 catchsql { 104 CREATE VIRTUAL TABLE pachyderm USING echo(elephant); 105 } 106 } {0 {}} 107 do_test vtab3-1.6 { 108 execsql { 109 SELECT name FROM sqlite_master WHERE type = 'table'; 110 } 111 } {elephant pachyderm} 112 113 foreach i [list 1 2 3 4] { 114 set ::auth_fail $i 115 do_test vtab3-1.7.$i.1 { 116 set rc [catch { 117 execsql {DROP TABLE pachyderm;} 118 } msg] 119 if {$msg eq "authorization denied"} {set msg "not authorized"} 120 list $rc $msg 121 } {1 {not authorized}} 122 do_test vtab3-1.7.$i.2 { 123 execsql { 124 SELECT name FROM sqlite_master WHERE type = 'table'; 125 } 126 } {elephant pachyderm} 127 } 128 do_test vtab3-1.8.1 { 129 set ::auth_fail 0 130 catchsql { 131 DROP TABLE pachyderm; 132 } 133 } {0 {}} 134 do_test vtab3-1.8.2 { 135 execsql { 136 SELECT name FROM sqlite_master WHERE type = 'table'; 137 } 138 } {elephant} 139 140 finish_test 141