xref: /sqlite-3.40.0/test/vtab3.test (revision 32c6a48b)
1f1a381e7Sdanielk1977# 2006 June 10
2f1a381e7Sdanielk1977#
3f1a381e7Sdanielk1977# The author disclaims copyright to this source code.  In place of
4f1a381e7Sdanielk1977# a legal notice, here is a blessing:
5f1a381e7Sdanielk1977#
6f1a381e7Sdanielk1977#    May you do good and not evil.
7f1a381e7Sdanielk1977#    May you find forgiveness for yourself and forgive others.
8f1a381e7Sdanielk1977#    May you share freely, never taking more than you give.
9f1a381e7Sdanielk1977#
10f1a381e7Sdanielk1977#***********************************************************************
11f1a381e7Sdanielk1977# This file implements regression tests for SQLite library.  The
12f1a381e7Sdanielk1977# focus of this file is the authorisation callback and virtual tables.
13f1a381e7Sdanielk1977#
14e8f52c50Sdrh# $Id: vtab3.test,v 1.3 2008/07/12 14:52:21 drh Exp $
15f1a381e7Sdanielk1977
16f1a381e7Sdanielk1977set testdir [file dirname $argv0]
17f1a381e7Sdanielk1977source $testdir/tester.tcl
18f1a381e7Sdanielk1977
194b2688abSdanielk1977ifcapable !vtab||!auth {
20f1a381e7Sdanielk1977  finish_test
21f1a381e7Sdanielk1977  return
22f1a381e7Sdanielk1977}
23f1a381e7Sdanielk1977
24f1a381e7Sdanielk1977set ::auth_fail 0
25f1a381e7Sdanielk1977set ::auth_log [list]
26f1a381e7Sdanielk1977set ::auth_filter [list SQLITE_READ SQLITE_UPDATE SQLITE_SELECT SQLITE_PRAGMA]
27f1a381e7Sdanielk1977
28*32c6a48bSdrhproc auth {code arg1 arg2 arg3 arg4 args} {
29f1a381e7Sdanielk1977  if {[lsearch $::auth_filter $code]>-1} {
30f1a381e7Sdanielk1977    return SQLITE_OK
31f1a381e7Sdanielk1977  }
32f1a381e7Sdanielk1977  lappend ::auth_log $code $arg1 $arg2 $arg3 $arg4
33f1a381e7Sdanielk1977  incr ::auth_fail -1
34f1a381e7Sdanielk1977  if {$::auth_fail == 0} {
35f1a381e7Sdanielk1977    return SQLITE_DENY
36f1a381e7Sdanielk1977  }
37f1a381e7Sdanielk1977  return SQLITE_OK
38f1a381e7Sdanielk1977}
39f1a381e7Sdanielk1977
40f1a381e7Sdanielk1977do_test vtab3-1.1 {
41f1a381e7Sdanielk1977  execsql {
42f1a381e7Sdanielk1977    CREATE TABLE elephant(
43f1a381e7Sdanielk1977      name VARCHAR(32),
44f1a381e7Sdanielk1977      color VARCHAR(16),
45f1a381e7Sdanielk1977      age INTEGER,
46f1a381e7Sdanielk1977      UNIQUE(name, color)
47f1a381e7Sdanielk1977    );
48f1a381e7Sdanielk1977  }
49f1a381e7Sdanielk1977} {}
50f1a381e7Sdanielk1977
51f1a381e7Sdanielk1977
52f1a381e7Sdanielk1977do_test vtab3-1.2 {
53f1a381e7Sdanielk1977  register_echo_module [sqlite3_connection_pointer db]
54f1a381e7Sdanielk1977  db authorizer ::auth
55f1a381e7Sdanielk1977  execsql {
56f1a381e7Sdanielk1977    CREATE VIRTUAL TABLE pachyderm USING echo(elephant);
57f1a381e7Sdanielk1977  }
58f1a381e7Sdanielk1977  set ::auth_log
59f1a381e7Sdanielk1977} [list \
60f1a381e7Sdanielk1977  SQLITE_INSERT        sqlite_master {}   main {} \
61f1a381e7Sdanielk1977  SQLITE_CREATE_VTABLE pachyderm     echo main {} \
62f1a381e7Sdanielk1977]
63f1a381e7Sdanielk1977
64f1a381e7Sdanielk1977do_test vtab3-1.3 {
65f1a381e7Sdanielk1977  set ::auth_log [list]
66f1a381e7Sdanielk1977  execsql {
67f1a381e7Sdanielk1977    DROP TABLE pachyderm;
68f1a381e7Sdanielk1977  }
69f1a381e7Sdanielk1977  set ::auth_log
70f1a381e7Sdanielk1977} [list \
71f1a381e7Sdanielk1977  SQLITE_DELETE        sqlite_master {}   main {} \
72f1a381e7Sdanielk1977  SQLITE_DROP_VTABLE   pachyderm     echo main {} \
73f1a381e7Sdanielk1977  SQLITE_DELETE        pachyderm     {}   main {} \
74f1a381e7Sdanielk1977  SQLITE_DELETE        sqlite_master {}   main {} \
75f1a381e7Sdanielk1977]
76f1a381e7Sdanielk1977
77f1a381e7Sdanielk1977do_test vtab3-1.4 {
78f1a381e7Sdanielk1977  set ::auth_fail 1
79f1a381e7Sdanielk1977  catchsql {
80f1a381e7Sdanielk1977    CREATE VIRTUAL TABLE pachyderm USING echo(elephant);
81f1a381e7Sdanielk1977  }
82f1a381e7Sdanielk1977} {1 {not authorized}}
83f1a381e7Sdanielk1977do_test vtab3-1.5 {
84f1a381e7Sdanielk1977  execsql {
85f1a381e7Sdanielk1977    SELECT name FROM sqlite_master WHERE type = 'table';
86f1a381e7Sdanielk1977  }
87f1a381e7Sdanielk1977} {elephant}
88f1a381e7Sdanielk1977
89f1a381e7Sdanielk1977do_test vtab3-1.5 {
90f1a381e7Sdanielk1977  set ::auth_fail 2
91f1a381e7Sdanielk1977  catchsql {
92f1a381e7Sdanielk1977    CREATE VIRTUAL TABLE pachyderm USING echo(elephant);
93f1a381e7Sdanielk1977  }
94f1a381e7Sdanielk1977} {1 {not authorized}}
95f1a381e7Sdanielk1977do_test vtab3-1.6 {
96f1a381e7Sdanielk1977  execsql {
97f1a381e7Sdanielk1977    SELECT name FROM sqlite_master WHERE type = 'table';
98f1a381e7Sdanielk1977  }
99f1a381e7Sdanielk1977} {elephant}
100f1a381e7Sdanielk1977
101f1a381e7Sdanielk1977do_test vtab3-1.5 {
102f1a381e7Sdanielk1977  set ::auth_fail 3
103f1a381e7Sdanielk1977  catchsql {
104f1a381e7Sdanielk1977    CREATE VIRTUAL TABLE pachyderm USING echo(elephant);
105f1a381e7Sdanielk1977  }
106f1a381e7Sdanielk1977} {0 {}}
107f1a381e7Sdanielk1977do_test vtab3-1.6 {
108f1a381e7Sdanielk1977  execsql {
109f1a381e7Sdanielk1977    SELECT name FROM sqlite_master WHERE type = 'table';
110f1a381e7Sdanielk1977  }
111f1a381e7Sdanielk1977} {elephant pachyderm}
112f1a381e7Sdanielk1977
113f1a381e7Sdanielk1977foreach i [list 1 2 3 4] {
114f1a381e7Sdanielk1977  set ::auth_fail $i
115f1a381e7Sdanielk1977  do_test vtab3-1.7.$i.1 {
116f1a381e7Sdanielk1977    set rc [catch {
117f1a381e7Sdanielk1977      execsql {DROP TABLE pachyderm;}
118f1a381e7Sdanielk1977    } msg]
119f1a381e7Sdanielk1977    if {$msg eq "authorization denied"} {set msg "not authorized"}
120f1a381e7Sdanielk1977    list $rc $msg
121f1a381e7Sdanielk1977  } {1 {not authorized}}
122f1a381e7Sdanielk1977  do_test vtab3-1.7.$i.2 {
123f1a381e7Sdanielk1977    execsql {
124f1a381e7Sdanielk1977      SELECT name FROM sqlite_master WHERE type = 'table';
125f1a381e7Sdanielk1977    }
126f1a381e7Sdanielk1977  } {elephant pachyderm}
127f1a381e7Sdanielk1977}
128f1a381e7Sdanielk1977do_test vtab3-1.8.1 {
129f1a381e7Sdanielk1977  set ::auth_fail 0
130f1a381e7Sdanielk1977  catchsql {
131f1a381e7Sdanielk1977    DROP TABLE pachyderm;
132f1a381e7Sdanielk1977  }
133f1a381e7Sdanielk1977} {0 {}}
134f1a381e7Sdanielk1977do_test vtab3-1.8.2 {
135f1a381e7Sdanielk1977  execsql {
136f1a381e7Sdanielk1977    SELECT name FROM sqlite_master WHERE type = 'table';
137f1a381e7Sdanielk1977  }
138f1a381e7Sdanielk1977} {elephant}
139f1a381e7Sdanielk1977
140f1a381e7Sdanielk1977finish_test
141