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