Merge branch 'prerelease' of ssh://git.zetetic.net/sqlcipher into prerelease
[sqlcipher.git] / test / vtab3.test
blobe8c6982a57c41c3b4f6fe17c9180931437d1502c
1 # 2006 June 10
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 #***********************************************************************
11 # This file implements regression tests for SQLite library.  The
12 # focus of this file is the authorisation callback and virtual tables.
14 # $Id: vtab3.test,v 1.3 2008/07/12 14:52:21 drh Exp $
16 set testdir [file dirname $argv0]
17 source $testdir/tester.tcl
19 ifcapable !vtab||!auth {
20   finish_test
21   return
24 set ::auth_fail 0
25 set ::auth_log [list]
26 set ::auth_filter [list SQLITE_READ SQLITE_UPDATE SQLITE_SELECT SQLITE_PRAGMA]
28 proc auth {code arg1 arg2 arg3 arg4 args} {
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
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 } {}
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 {} \
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 {} \
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}
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}
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}
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}
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}
140 finish_test