persistentstorage/sqlite3api/TEST/TclScript/vtab3.test
changeset 0 08ec8eefde2f
equal deleted inserted replaced
-1:000000000000 0:08ec8eefde2f
       
     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