Home | History | Annotate | Download | only in test
      1 # 2008 October 27
      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 #
     12 # Test that the truncate optimization is disabled if the SQLITE_DELETE
     13 # authorization callback returns SQLITE_IGNORE.
     14 #
     15 # $Id: auth3.test,v 1.2 2009/05/04 01:58:31 drh Exp $
     16 #
     17 
     18 set testdir [file dirname $argv0]
     19 source $testdir/tester.tcl
     20 
     21 # disable this test if the SQLITE_OMIT_AUTHORIZATION macro is
     22 # defined during compilation.
     23 if {[catch {db auth {}} msg]} {
     24   finish_test
     25   return
     26 }
     27 
     28 # Disable the statement cache for these tests.
     29 # 
     30 db cache size 0
     31 
     32 db authorizer ::auth
     33 proc auth {code arg1 arg2 arg3 arg4} {
     34   if {$code=="SQLITE_DELETE"} {
     35     return $::authcode
     36   }
     37   return SQLITE_OK
     38 }
     39 
     40 #--------------------------------------------------------------------------
     41 # The following tests - auth3-1.* - test that return values of SQLITE_DENY,
     42 # SQLITE_IGNORE, SQLITE_OK and <invalid> are correctly handled when returned
     43 # by an SQLITE_DELETE authorization callback triggered by a 
     44 # "DELETE FROM <table-name>" statement.
     45 #
     46 do_test auth3-1.1 {
     47   execsql {
     48     CREATE TABLE t1(a,b,c);
     49     INSERT INTO t1 VALUES(1, 2, 3);
     50     INSERT INTO t1 VALUES(4, 5, 6);
     51   }
     52 } {}
     53 do_test auth3.1.2 {
     54   set ::authcode SQLITE_DENY
     55   catchsql { DELETE FROM t1 }
     56 } {1 {not authorized}}
     57 do_test auth3.1.3 {
     58   set ::authcode SQLITE_INVALID
     59   catchsql { DELETE FROM t1 }
     60 } {1 {authorizer malfunction}}
     61 do_test auth3.1.4 {
     62   execsql { SELECT * FROM t1 }
     63 } {1 2 3 4 5 6}
     64 do_test auth3-1.5 {
     65   set ::authcode SQLITE_IGNORE
     66   execsql { 
     67     DELETE FROM t1;
     68     SELECT * FROM t1;
     69   }
     70 } {}
     71 do_test auth3-1.6 {
     72   set ::authcode SQLITE_OK
     73   execsql {
     74     INSERT INTO t1 VALUES(1, 2, 3);
     75     INSERT INTO t1 VALUES(4, 5, 6);
     76     DELETE FROM t1;
     77     SELECT * FROM t1;
     78   }
     79 } {}
     80 
     81 #--------------------------------------------------------------------------
     82 # These tests - auth3-2.* - test that returning SQLITE_IGNORE really does
     83 # disable the truncate optimization.
     84 #
     85 do_test auth3-2.1 {
     86   set ::authcode SQLITE_OK
     87   execsql {
     88     INSERT INTO t1 VALUES(1, 2, 3);
     89     INSERT INTO t1 VALUES(4, 5, 6);
     90   }
     91   set sqlite_search_count 0
     92   execsql {
     93     DELETE FROM t1;
     94   }
     95   set sqlite_search_count
     96 } {0}
     97 
     98 do_test auth3-2.2 {
     99   set ::authcode SQLITE_IGNORE
    100   execsql {
    101     INSERT INTO t1 VALUES(1, 2, 3);
    102     INSERT INTO t1 VALUES(4, 5, 6);
    103   }
    104   set sqlite_search_count 0
    105   execsql {
    106     DELETE FROM t1;
    107   }
    108   set sqlite_search_count
    109 } {1}
    110 
    111 finish_test
    112