• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
16set testdir [file dirname $argv0]
17source $testdir/tester.tcl
18
19ifcapable !vtab||!auth {
20  finish_test
21  return
22}
23
24set ::auth_fail 0
25set ::auth_log [list]
26set ::auth_filter [list SQLITE_READ SQLITE_UPDATE SQLITE_SELECT SQLITE_PRAGMA]
27
28proc 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
40do_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
52do_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
64do_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
77do_test vtab3-1.4 {
78  set ::auth_fail 1
79  catchsql {
80    CREATE VIRTUAL TABLE pachyderm USING echo(elephant);
81  }
82} {1 {not authorized}}
83do_test vtab3-1.5 {
84  execsql {
85    SELECT name FROM sqlite_master WHERE type = 'table';
86  }
87} {elephant}
88
89do_test vtab3-1.5 {
90  set ::auth_fail 2
91  catchsql {
92    CREATE VIRTUAL TABLE pachyderm USING echo(elephant);
93  }
94} {1 {not authorized}}
95do_test vtab3-1.6 {
96  execsql {
97    SELECT name FROM sqlite_master WHERE type = 'table';
98  }
99} {elephant}
100
101do_test vtab3-1.5 {
102  set ::auth_fail 3
103  catchsql {
104    CREATE VIRTUAL TABLE pachyderm USING echo(elephant);
105  }
106} {0 {}}
107do_test vtab3-1.6 {
108  execsql {
109    SELECT name FROM sqlite_master WHERE type = 'table';
110  }
111} {elephant pachyderm}
112
113foreach 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}
128do_test vtab3-1.8.1 {
129  set ::auth_fail 0
130  catchsql {
131    DROP TABLE pachyderm;
132  }
133} {0 {}}
134do_test vtab3-1.8.2 {
135  execsql {
136    SELECT name FROM sqlite_master WHERE type = 'table';
137  }
138} {elephant}
139
140finish_test
141