Annotation of embedaddon/sqlite3/test/auth.test, revision 1.1

1.1     ! misho       1: # 2003 April 4
        !             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 script is testing the sqlite3_set_authorizer() API
        !            13: # and related functionality.
        !            14: #
        !            15: # $Id: auth.test,v 1.46 2009/07/02 18:40:35 danielk1977 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: rename proc proc_real
        !            29: proc_real proc {name arguments script} {
        !            30:   proc_real $name $arguments $script
        !            31:   if {$name=="auth"} {
        !            32:     db authorizer ::auth
        !            33:   }
        !            34: }
        !            35: 
        !            36: do_test auth-1.1.1 {
        !            37:   db close
        !            38:   set ::DB [sqlite3 db test.db]
        !            39:   proc auth {code arg1 arg2 arg3 arg4} {
        !            40:     if {$code=="SQLITE_INSERT" && $arg1=="sqlite_master"} {
        !            41:       return SQLITE_DENY
        !            42:     }
        !            43:     return SQLITE_OK
        !            44:   }
        !            45:   db authorizer ::auth
        !            46:   catchsql {CREATE TABLE t1(a,b,c)}
        !            47: } {1 {not authorized}}
        !            48: do_test auth-1.1.2 {
        !            49:   db errorcode
        !            50: } {23}
        !            51: do_test auth-1.1.3 {
        !            52:   db authorizer
        !            53: } {::auth}
        !            54: do_test auth-1.1.4 {
        !            55:   # Ticket #896.
        !            56:   catchsql {
        !            57:     SELECT x;
        !            58:   }
        !            59: } {1 {no such column: x}}
        !            60: do_test auth-1.2 {
        !            61:   execsql {SELECT name FROM sqlite_master}
        !            62: } {}
        !            63: do_test auth-1.3.1 {
        !            64:   proc auth {code arg1 arg2 arg3 arg4} {
        !            65:     if {$code=="SQLITE_CREATE_TABLE"} {
        !            66:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !            67:       return SQLITE_DENY
        !            68:     }
        !            69:     return SQLITE_OK
        !            70:   }
        !            71:   catchsql {CREATE TABLE t1(a,b,c)}
        !            72: } {1 {not authorized}}
        !            73: do_test auth-1.3.2 {
        !            74:   db errorcode
        !            75: } {23}
        !            76: do_test auth-1.3.3 {
        !            77:   set ::authargs
        !            78: } {t1 {} main {}}
        !            79: do_test auth-1.4 {
        !            80:   execsql {SELECT name FROM sqlite_master}
        !            81: } {}
        !            82: 
        !            83: ifcapable tempdb {
        !            84:   do_test auth-1.5 {
        !            85:     proc auth {code arg1 arg2 arg3 arg4} {
        !            86:       if {$code=="SQLITE_INSERT" && $arg1=="sqlite_temp_master"} {
        !            87:         return SQLITE_DENY
        !            88:       }
        !            89:       return SQLITE_OK
        !            90:     }
        !            91:     catchsql {CREATE TEMP TABLE t1(a,b,c)}
        !            92:   } {1 {not authorized}}
        !            93:   do_test auth-1.6 {
        !            94:     execsql {SELECT name FROM sqlite_temp_master}
        !            95:   } {}
        !            96:   do_test auth-1.7.1 {
        !            97:     proc auth {code arg1 arg2 arg3 arg4} {
        !            98:       if {$code=="SQLITE_CREATE_TEMP_TABLE"} {
        !            99:         set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !           100:         return SQLITE_DENY
        !           101:       }
        !           102:       return SQLITE_OK
        !           103:     }
        !           104:     catchsql {CREATE TEMP TABLE t1(a,b,c)}
        !           105:   } {1 {not authorized}}
        !           106:   do_test auth-1.7.2 {
        !           107:      set ::authargs
        !           108:   } {t1 {} temp {}}
        !           109:   do_test auth-1.8 {
        !           110:     execsql {SELECT name FROM sqlite_temp_master}
        !           111:   } {}
        !           112: }
        !           113: 
        !           114: do_test auth-1.9 {
        !           115:   proc auth {code arg1 arg2 arg3 arg4} {
        !           116:     if {$code=="SQLITE_INSERT" && $arg1=="sqlite_master"} {
        !           117:       return SQLITE_IGNORE
        !           118:     }
        !           119:     return SQLITE_OK
        !           120:   }
        !           121:   catchsql {CREATE TABLE t1(a,b,c)}
        !           122: } {0 {}}
        !           123: do_test auth-1.10 {
        !           124:   execsql {SELECT name FROM sqlite_master}
        !           125: } {}
        !           126: do_test auth-1.11 {
        !           127:   proc auth {code arg1 arg2 arg3 arg4} {
        !           128:     if {$code=="SQLITE_CREATE_TABLE"} {
        !           129:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !           130:       return SQLITE_IGNORE
        !           131:     }
        !           132:     return SQLITE_OK
        !           133:   }
        !           134:   catchsql {CREATE TABLE t1(a,b,c)}
        !           135: } {0 {}}
        !           136: do_test auth-1.12 {
        !           137:   execsql {SELECT name FROM sqlite_master}
        !           138: } {}
        !           139: 
        !           140: ifcapable tempdb {
        !           141:   do_test auth-1.13 {
        !           142:     proc auth {code arg1 arg2 arg3 arg4} {
        !           143:       if {$code=="SQLITE_INSERT" && $arg1=="sqlite_temp_master"} {
        !           144:         return SQLITE_IGNORE
        !           145:       }
        !           146:       return SQLITE_OK
        !           147:     }
        !           148:     catchsql {CREATE TEMP TABLE t1(a,b,c)}
        !           149:   } {0 {}}
        !           150:   do_test auth-1.14 {
        !           151:     execsql {SELECT name FROM sqlite_temp_master}
        !           152:   } {}
        !           153:   do_test auth-1.15 {
        !           154:     proc auth {code arg1 arg2 arg3 arg4} {
        !           155:       if {$code=="SQLITE_CREATE_TEMP_TABLE"} {
        !           156:         set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !           157:         return SQLITE_IGNORE
        !           158:       }
        !           159:       return SQLITE_OK
        !           160:     }
        !           161:     catchsql {CREATE TEMP TABLE t1(a,b,c)}
        !           162:   } {0 {}}
        !           163:   do_test auth-1.16 {
        !           164:     execsql {SELECT name FROM sqlite_temp_master}
        !           165:   } {}
        !           166:   
        !           167:   do_test auth-1.17 {
        !           168:     proc auth {code arg1 arg2 arg3 arg4} {
        !           169:       if {$code=="SQLITE_CREATE_TABLE"} {
        !           170:         set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !           171:         return SQLITE_DENY
        !           172:       }
        !           173:       return SQLITE_OK
        !           174:     }
        !           175:     catchsql {CREATE TEMP TABLE t1(a,b,c)}
        !           176:   } {0 {}}
        !           177:   do_test auth-1.18 {
        !           178:     execsql {SELECT name FROM sqlite_temp_master}
        !           179:   } {t1}
        !           180: }
        !           181: 
        !           182: do_test auth-1.19.1 {
        !           183:   set ::authargs {}
        !           184:   proc auth {code arg1 arg2 arg3 arg4} {
        !           185:     if {$code=="SQLITE_CREATE_TEMP_TABLE"} {
        !           186:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !           187:       return SQLITE_DENY
        !           188:     }
        !           189:     return SQLITE_OK
        !           190:   }
        !           191:   catchsql {CREATE TABLE t2(a,b,c)}
        !           192: } {0 {}}
        !           193: do_test auth-1.19.2 {
        !           194:   set ::authargs
        !           195: } {}
        !           196: do_test auth-1.20 {
        !           197:   execsql {SELECT name FROM sqlite_master}
        !           198: } {t2}
        !           199: 
        !           200: do_test auth-1.21.1 {
        !           201:   proc auth {code arg1 arg2 arg3 arg4} {
        !           202:     if {$code=="SQLITE_DROP_TABLE"} {
        !           203:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !           204:       return SQLITE_DENY
        !           205:     }
        !           206:     return SQLITE_OK
        !           207:   }
        !           208:   catchsql {DROP TABLE t2}
        !           209: } {1 {not authorized}}
        !           210: do_test auth-1.21.2 {
        !           211:   set ::authargs
        !           212: } {t2 {} main {}}
        !           213: do_test auth-1.22 {
        !           214:   execsql {SELECT name FROM sqlite_master}
        !           215: } {t2}
        !           216: do_test auth-1.23.1 {
        !           217:   proc auth {code arg1 arg2 arg3 arg4} {
        !           218:     if {$code=="SQLITE_DROP_TABLE"} {
        !           219:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !           220:       return SQLITE_IGNORE
        !           221:     }
        !           222:     return SQLITE_OK
        !           223:   }
        !           224:   catchsql {DROP TABLE t2}
        !           225: } {0 {}}
        !           226: do_test auth-1.23.2 {
        !           227:   set ::authargs
        !           228: } {t2 {} main {}}
        !           229: do_test auth-1.24 {
        !           230:   execsql {SELECT name FROM sqlite_master}
        !           231: } {t2}
        !           232: 
        !           233: ifcapable tempdb {
        !           234:   do_test auth-1.25 {
        !           235:     proc auth {code arg1 arg2 arg3 arg4} {
        !           236:       if {$code=="SQLITE_DROP_TEMP_TABLE"} {
        !           237:         set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !           238:         return SQLITE_DENY
        !           239:       }
        !           240:       return SQLITE_OK
        !           241:     }
        !           242:     catchsql {DROP TABLE t1}
        !           243:   } {1 {not authorized}}
        !           244:   do_test auth-1.26 {
        !           245:     execsql {SELECT name FROM sqlite_temp_master}
        !           246:   } {t1}
        !           247:   do_test auth-1.27 {
        !           248:     proc auth {code arg1 arg2 arg3 arg4} {
        !           249:       if {$code=="SQLITE_DROP_TEMP_TABLE"} {
        !           250:         set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !           251:         return SQLITE_IGNORE
        !           252:       }
        !           253:       return SQLITE_OK
        !           254:     }
        !           255:     catchsql {DROP TABLE t1}
        !           256:   } {0 {}}
        !           257:   do_test auth-1.28 {
        !           258:     execsql {SELECT name FROM sqlite_temp_master}
        !           259:   } {t1}
        !           260: }
        !           261: 
        !           262: do_test auth-1.29 {
        !           263:   proc auth {code arg1 arg2 arg3 arg4} {
        !           264:     if {$code=="SQLITE_INSERT" && $arg1=="t2"} {
        !           265:       return SQLITE_DENY
        !           266:     }
        !           267:     return SQLITE_OK
        !           268:   }
        !           269:   catchsql {INSERT INTO t2 VALUES(1,2,3)}
        !           270: } {1 {not authorized}}
        !           271: do_test auth-1.30 {
        !           272:   execsql {SELECT * FROM t2}
        !           273: } {}
        !           274: do_test auth-1.31 {
        !           275:   proc auth {code arg1 arg2 arg3 arg4} {
        !           276:     if {$code=="SQLITE_INSERT" && $arg1=="t2"} {
        !           277:       return SQLITE_IGNORE
        !           278:     }
        !           279:     return SQLITE_OK
        !           280:   }
        !           281:   catchsql {INSERT INTO t2 VALUES(1,2,3)}
        !           282: } {0 {}}
        !           283: do_test auth-1.32 {
        !           284:   execsql {SELECT * FROM t2}
        !           285: } {}
        !           286: do_test auth-1.33 {
        !           287:   proc auth {code arg1 arg2 arg3 arg4} {
        !           288:     if {$code=="SQLITE_INSERT" && $arg1=="t1"} {
        !           289:       return SQLITE_IGNORE
        !           290:     }
        !           291:     return SQLITE_OK
        !           292:   }
        !           293:   catchsql {INSERT INTO t2 VALUES(1,2,3)}
        !           294: } {0 {}}
        !           295: do_test auth-1.34 {
        !           296:   execsql {SELECT * FROM t2}
        !           297: } {1 2 3}
        !           298: 
        !           299: do_test auth-1.35.1 {
        !           300:   proc auth {code arg1 arg2 arg3 arg4} {
        !           301:     if {$code=="SQLITE_READ" && $arg1=="t2" && $arg2=="b"} {
        !           302:       return SQLITE_DENY
        !           303:     }
        !           304:     return SQLITE_OK
        !           305:   }
        !           306:   catchsql {SELECT * FROM t2}
        !           307: } {1 {access to t2.b is prohibited}}
        !           308: ifcapable attach {
        !           309:   do_test auth-1.35.2 {
        !           310:     execsql {ATTACH DATABASE 'test.db' AS two}
        !           311:     catchsql {SELECT * FROM two.t2}
        !           312:   } {1 {access to two.t2.b is prohibited}}
        !           313:   execsql {DETACH DATABASE two}
        !           314: }
        !           315: do_test auth-1.36 {
        !           316:   proc auth {code arg1 arg2 arg3 arg4} {
        !           317:     if {$code=="SQLITE_READ" && $arg1=="t2" && $arg2=="b"} {
        !           318:       return SQLITE_IGNORE
        !           319:     }
        !           320:     return SQLITE_OK
        !           321:   }
        !           322:   catchsql {SELECT * FROM t2}
        !           323: } {0 {1 {} 3}}
        !           324: do_test auth-1.37 {
        !           325:   proc auth {code arg1 arg2 arg3 arg4} {
        !           326:     if {$code=="SQLITE_READ" && $arg1=="t2" && $arg2=="b"} {
        !           327:       return SQLITE_IGNORE
        !           328:     }
        !           329:     return SQLITE_OK
        !           330:   }
        !           331:   catchsql {SELECT * FROM t2 WHERE b=2}
        !           332: } {0 {}}
        !           333: do_test auth-1.38 {
        !           334:   proc auth {code arg1 arg2 arg3 arg4} {
        !           335:     if {$code=="SQLITE_READ" && $arg1=="t2" && $arg2=="a"} {
        !           336:       return SQLITE_IGNORE
        !           337:     }
        !           338:     return SQLITE_OK
        !           339:   }
        !           340:   catchsql {SELECT * FROM t2 WHERE b=2}
        !           341: } {0 {{} 2 3}}
        !           342: do_test auth-1.39 {
        !           343:   proc auth {code arg1 arg2 arg3 arg4} {
        !           344:     if {$code=="SQLITE_READ" && $arg1=="t2" && $arg2=="b"} {
        !           345:       return SQLITE_IGNORE
        !           346:     }
        !           347:     return SQLITE_OK
        !           348:   }
        !           349:   catchsql {SELECT * FROM t2 WHERE b IS NULL}
        !           350: } {0 {1 {} 3}}
        !           351: do_test auth-1.40 {
        !           352:   proc auth {code arg1 arg2 arg3 arg4} {
        !           353:     if {$code=="SQLITE_READ" && $arg1=="t2" && $arg2=="b"} {
        !           354:       return SQLITE_DENY
        !           355:     }
        !           356:     return SQLITE_OK
        !           357:   }
        !           358:   catchsql {SELECT a,c FROM t2 WHERE b IS NULL}
        !           359: } {1 {access to t2.b is prohibited}}
        !           360:   
        !           361: do_test auth-1.41 {
        !           362:   proc auth {code arg1 arg2 arg3 arg4} {
        !           363:     if {$code=="SQLITE_UPDATE" && $arg1=="t2" && $arg2=="b"} {
        !           364:       return SQLITE_DENY
        !           365:     }
        !           366:     return SQLITE_OK
        !           367:   }
        !           368:   catchsql {UPDATE t2 SET a=11}
        !           369: } {0 {}}
        !           370: do_test auth-1.42 {
        !           371:   execsql {SELECT * FROM t2}
        !           372: } {11 2 3}
        !           373: do_test auth-1.43 {
        !           374:   proc auth {code arg1 arg2 arg3 arg4} {
        !           375:     if {$code=="SQLITE_UPDATE" && $arg1=="t2" && $arg2=="b"} {
        !           376:       return SQLITE_DENY
        !           377:     }
        !           378:     return SQLITE_OK
        !           379:   }
        !           380:   catchsql {UPDATE t2 SET b=22, c=33}
        !           381: } {1 {not authorized}}
        !           382: do_test auth-1.44 {
        !           383:   execsql {SELECT * FROM t2}
        !           384: } {11 2 3}
        !           385: do_test auth-1.45 {
        !           386:   proc auth {code arg1 arg2 arg3 arg4} {
        !           387:     if {$code=="SQLITE_UPDATE" && $arg1=="t2" && $arg2=="b"} {
        !           388:       return SQLITE_IGNORE
        !           389:     }
        !           390:     return SQLITE_OK
        !           391:   }
        !           392:   catchsql {UPDATE t2 SET b=22, c=33}
        !           393: } {0 {}}
        !           394: do_test auth-1.46 {
        !           395:   execsql {SELECT * FROM t2}
        !           396: } {11 2 33}
        !           397: 
        !           398: do_test auth-1.47 {
        !           399:   proc auth {code arg1 arg2 arg3 arg4} {
        !           400:     if {$code=="SQLITE_DELETE" && $arg1=="t2"} {
        !           401:       return SQLITE_DENY
        !           402:     }
        !           403:     return SQLITE_OK
        !           404:   }
        !           405:   catchsql {DELETE FROM t2 WHERE a=11}
        !           406: } {1 {not authorized}}
        !           407: do_test auth-1.48 {
        !           408:   execsql {SELECT * FROM t2}
        !           409: } {11 2 33}
        !           410: do_test auth-1.49 {
        !           411:   proc auth {code arg1 arg2 arg3 arg4} {
        !           412:     if {$code=="SQLITE_DELETE" && $arg1=="t2"} {
        !           413:       return SQLITE_IGNORE
        !           414:     }
        !           415:     return SQLITE_OK
        !           416:   }
        !           417:   catchsql {DELETE FROM t2 WHERE a=11}
        !           418: } {0 {}}
        !           419: do_test auth-1.50 {
        !           420:   execsql {SELECT * FROM t2}
        !           421: } {}
        !           422: do_test auth-1.50.2 {
        !           423:   execsql {INSERT INTO t2 VALUES(11, 2, 33)}
        !           424: } {}
        !           425: 
        !           426: do_test auth-1.51 {
        !           427:   proc auth {code arg1 arg2 arg3 arg4} {
        !           428:     if {$code=="SQLITE_SELECT"} {
        !           429:       return SQLITE_DENY
        !           430:     }
        !           431:     return SQLITE_OK
        !           432:   }
        !           433:   catchsql {SELECT * FROM t2}
        !           434: } {1 {not authorized}}
        !           435: do_test auth-1.52 {
        !           436:   proc auth {code arg1 arg2 arg3 arg4} {
        !           437:     if {$code=="SQLITE_SELECT"} {
        !           438:       return SQLITE_IGNORE
        !           439:     }
        !           440:     return SQLITE_OK
        !           441:   }
        !           442:   catchsql {SELECT * FROM t2}
        !           443: } {0 {}}
        !           444: do_test auth-1.53 {
        !           445:   proc auth {code arg1 arg2 arg3 arg4} {
        !           446:     if {$code=="SQLITE_SELECT"} {
        !           447:       return SQLITE_OK
        !           448:     }
        !           449:     return SQLITE_OK
        !           450:   }
        !           451:   catchsql {SELECT * FROM t2}
        !           452: } {0 {11 2 33}}
        !           453: 
        !           454: # Update for version 3: There used to be a handful of test here that
        !           455: # tested the authorisation callback with the COPY command. The following
        !           456: # test makes the same database modifications as they used to.
        !           457: do_test auth-1.54 {
        !           458:   execsql {INSERT INTO t2 VALUES(7, 8, 9);}
        !           459: } {}
        !           460: do_test auth-1.55 {
        !           461:   execsql {SELECT * FROM t2}
        !           462: } {11 2 33 7 8 9}
        !           463: 
        !           464: do_test auth-1.63 {
        !           465:   proc auth {code arg1 arg2 arg3 arg4} {
        !           466:     if {$code=="SQLITE_DELETE" && $arg1=="sqlite_master"} {
        !           467:        return SQLITE_DENY
        !           468:     }
        !           469:     return SQLITE_OK
        !           470:   }
        !           471:   catchsql {DROP TABLE t2}
        !           472: } {1 {not authorized}}
        !           473: do_test auth-1.64 {
        !           474:   execsql {SELECT name FROM sqlite_master}
        !           475: } {t2}
        !           476: do_test auth-1.65 {
        !           477:   proc auth {code arg1 arg2 arg3 arg4} {
        !           478:     if {$code=="SQLITE_DELETE" && $arg1=="t2"} {
        !           479:        return SQLITE_DENY
        !           480:     }
        !           481:     return SQLITE_OK
        !           482:   }
        !           483:   catchsql {DROP TABLE t2}
        !           484: } {1 {not authorized}}
        !           485: do_test auth-1.66 {
        !           486:   execsql {SELECT name FROM sqlite_master}
        !           487: } {t2}
        !           488: 
        !           489: ifcapable tempdb {
        !           490:   do_test auth-1.67 {
        !           491:     proc auth {code arg1 arg2 arg3 arg4} {
        !           492:       if {$code=="SQLITE_DELETE" && $arg1=="sqlite_temp_master"} {
        !           493:          return SQLITE_DENY
        !           494:       }
        !           495:       return SQLITE_OK
        !           496:     }
        !           497:     catchsql {DROP TABLE t1}
        !           498:   } {1 {not authorized}}
        !           499:   do_test auth-1.68 {
        !           500:     execsql {SELECT name FROM sqlite_temp_master}
        !           501:   } {t1}
        !           502:   do_test auth-1.69 {
        !           503:     proc auth {code arg1 arg2 arg3 arg4} {
        !           504:       if {$code=="SQLITE_DELETE" && $arg1=="t1"} {
        !           505:          return SQLITE_DENY
        !           506:       }
        !           507:       return SQLITE_OK
        !           508:     }
        !           509:     catchsql {DROP TABLE t1}
        !           510:   } {1 {not authorized}}
        !           511:   do_test auth-1.70 {
        !           512:     execsql {SELECT name FROM sqlite_temp_master}
        !           513:   } {t1}
        !           514: }
        !           515: 
        !           516: do_test auth-1.71 {
        !           517:   proc auth {code arg1 arg2 arg3 arg4} {
        !           518:     if {$code=="SQLITE_DELETE" && $arg1=="sqlite_master"} {
        !           519:        return SQLITE_IGNORE
        !           520:     }
        !           521:     return SQLITE_OK
        !           522:   }
        !           523:   catchsql {DROP TABLE t2}
        !           524: } {0 {}}
        !           525: do_test auth-1.72 {
        !           526:   execsql {SELECT name FROM sqlite_master}
        !           527: } {t2}
        !           528: do_test auth-1.73 {
        !           529:   proc auth {code arg1 arg2 arg3 arg4} {
        !           530:     if {$code=="SQLITE_DELETE" && $arg1=="t2"} {
        !           531:        return SQLITE_IGNORE
        !           532:     }
        !           533:     return SQLITE_OK
        !           534:   }
        !           535:   catchsql {DROP TABLE t2}
        !           536: } {0 {}}
        !           537: do_test auth-1.74 {
        !           538:   execsql {SELECT name FROM sqlite_master}
        !           539: } {t2}
        !           540: 
        !           541: ifcapable tempdb {
        !           542:   do_test auth-1.75 {
        !           543:     proc auth {code arg1 arg2 arg3 arg4} {
        !           544:       if {$code=="SQLITE_DELETE" && $arg1=="sqlite_temp_master"} {
        !           545:          return SQLITE_IGNORE
        !           546:       }
        !           547:       return SQLITE_OK
        !           548:     }
        !           549:     catchsql {DROP TABLE t1}
        !           550:   } {0 {}}
        !           551:   do_test auth-1.76 {
        !           552:     execsql {SELECT name FROM sqlite_temp_master}
        !           553:   } {t1}
        !           554:   do_test auth-1.77 {
        !           555:     proc auth {code arg1 arg2 arg3 arg4} {
        !           556:       if {$code=="SQLITE_DELETE" && $arg1=="t1"} {
        !           557:          return SQLITE_IGNORE
        !           558:       }
        !           559:       return SQLITE_OK
        !           560:     }
        !           561:     catchsql {DROP TABLE t1}
        !           562:   } {0 {}}
        !           563:   do_test auth-1.78 {
        !           564:     execsql {SELECT name FROM sqlite_temp_master}
        !           565:   } {t1}
        !           566: }
        !           567: 
        !           568: # Test cases auth-1.79 to auth-1.124 test creating and dropping views.
        !           569: # Omit these if the library was compiled with views omitted.
        !           570: ifcapable view {
        !           571: do_test auth-1.79 {
        !           572:   proc auth {code arg1 arg2 arg3 arg4} {
        !           573:     if {$code=="SQLITE_CREATE_VIEW"} {
        !           574:       set ::authargs [list $arg1 $arg2 $arg3 $arg4] 
        !           575:       return SQLITE_DENY
        !           576:     }
        !           577:     return SQLITE_OK
        !           578:   }
        !           579:   catchsql {CREATE VIEW v1 AS SELECT a+1,b+1 FROM t2}
        !           580: } {1 {not authorized}}
        !           581: do_test auth-1.80 {
        !           582:   set ::authargs
        !           583: } {v1 {} main {}}
        !           584: do_test auth-1.81 {
        !           585:   execsql {SELECT name FROM sqlite_master}
        !           586: } {t2}
        !           587: do_test auth-1.82 {
        !           588:   proc auth {code arg1 arg2 arg3 arg4} {
        !           589:     if {$code=="SQLITE_CREATE_VIEW"} {
        !           590:       set ::authargs [list $arg1 $arg2 $arg3 $arg4] 
        !           591:       return SQLITE_IGNORE
        !           592:     }
        !           593:     return SQLITE_OK
        !           594:   }
        !           595:   catchsql {CREATE VIEW v1 AS SELECT a+1,b+1 FROM t2}
        !           596: } {0 {}}
        !           597: do_test auth-1.83 {
        !           598:   set ::authargs
        !           599: } {v1 {} main {}}
        !           600: do_test auth-1.84 {
        !           601:   execsql {SELECT name FROM sqlite_master}
        !           602: } {t2}
        !           603: 
        !           604: ifcapable tempdb {
        !           605:   do_test auth-1.85 {
        !           606:     proc auth {code arg1 arg2 arg3 arg4} {
        !           607:       if {$code=="SQLITE_CREATE_TEMP_VIEW"} {
        !           608:         set ::authargs [list $arg1 $arg2 $arg3 $arg4] 
        !           609:         return SQLITE_DENY
        !           610:       }
        !           611:       return SQLITE_OK
        !           612:     }
        !           613:     catchsql {CREATE TEMPORARY VIEW v1 AS SELECT a+1,b+1 FROM t2}
        !           614:   } {1 {not authorized}}
        !           615:   do_test auth-1.86 {
        !           616:     set ::authargs
        !           617:   } {v1 {} temp {}}
        !           618:   do_test auth-1.87 {
        !           619:     execsql {SELECT name FROM sqlite_temp_master}
        !           620:   } {t1}
        !           621:   do_test auth-1.88 {
        !           622:     proc auth {code arg1 arg2 arg3 arg4} {
        !           623:       if {$code=="SQLITE_CREATE_TEMP_VIEW"} {
        !           624:         set ::authargs [list $arg1 $arg2 $arg3 $arg4] 
        !           625:         return SQLITE_IGNORE
        !           626:       }
        !           627:       return SQLITE_OK
        !           628:     }
        !           629:     catchsql {CREATE TEMPORARY VIEW v1 AS SELECT a+1,b+1 FROM t2}
        !           630:   } {0 {}}
        !           631:   do_test auth-1.89 {
        !           632:     set ::authargs
        !           633:   } {v1 {} temp {}}
        !           634:   do_test auth-1.90 {
        !           635:     execsql {SELECT name FROM sqlite_temp_master}
        !           636:   } {t1}
        !           637: }
        !           638: 
        !           639: do_test auth-1.91 {
        !           640:   proc auth {code arg1 arg2 arg3 arg4} {
        !           641:     if {$code=="SQLITE_INSERT" && $arg1=="sqlite_master"} {
        !           642:       return SQLITE_DENY
        !           643:     }
        !           644:     return SQLITE_OK
        !           645:   }
        !           646:   catchsql {CREATE VIEW v1 AS SELECT a+1,b+1 FROM t2}
        !           647: } {1 {not authorized}}
        !           648: do_test auth-1.92 {
        !           649:   execsql {SELECT name FROM sqlite_master}
        !           650: } {t2}
        !           651: do_test auth-1.93 {
        !           652:   proc auth {code arg1 arg2 arg3 arg4} {
        !           653:     if {$code=="SQLITE_INSERT" && $arg1=="sqlite_master"} {
        !           654:       return SQLITE_IGNORE
        !           655:     }
        !           656:     return SQLITE_OK
        !           657:   }
        !           658:   catchsql {CREATE VIEW v1 AS SELECT a+1,b+1 FROM t2}
        !           659: } {0 {}}
        !           660: do_test auth-1.94 {
        !           661:   execsql {SELECT name FROM sqlite_master}
        !           662: } {t2}
        !           663: 
        !           664: ifcapable tempdb {
        !           665:   do_test auth-1.95 {
        !           666:     proc auth {code arg1 arg2 arg3 arg4} {
        !           667:       if {$code=="SQLITE_INSERT" && $arg1=="sqlite_temp_master"} {
        !           668:         return SQLITE_DENY
        !           669:       }
        !           670:       return SQLITE_OK
        !           671:     }
        !           672:     catchsql {CREATE TEMPORARY VIEW v1 AS SELECT a+1,b+1 FROM t2}
        !           673:   } {1 {not authorized}}
        !           674:   do_test auth-1.96 {
        !           675:     execsql {SELECT name FROM sqlite_temp_master}
        !           676:   } {t1}
        !           677:   do_test auth-1.97 {
        !           678:     proc auth {code arg1 arg2 arg3 arg4} {
        !           679:       if {$code=="SQLITE_INSERT" && $arg1=="sqlite_temp_master"} {
        !           680:         return SQLITE_IGNORE
        !           681:       }
        !           682:       return SQLITE_OK
        !           683:     }
        !           684:     catchsql {CREATE TEMPORARY VIEW v1 AS SELECT a+1,b+1 FROM t2}
        !           685:   } {0 {}}
        !           686:   do_test auth-1.98 {
        !           687:     execsql {SELECT name FROM sqlite_temp_master}
        !           688:   } {t1}
        !           689: }
        !           690: 
        !           691: do_test auth-1.99 {
        !           692:   proc auth {code arg1 arg2 arg3 arg4} {
        !           693:     if {$code=="SQLITE_DELETE" && $arg1=="sqlite_master"} {
        !           694:       return SQLITE_DENY
        !           695:     }
        !           696:     return SQLITE_OK
        !           697:   }
        !           698:   catchsql {
        !           699:     CREATE VIEW v2 AS SELECT a+1,b+1 FROM t2;
        !           700:     DROP VIEW v2
        !           701:   }
        !           702: } {1 {not authorized}}
        !           703: do_test auth-1.100 {
        !           704:   execsql {SELECT name FROM sqlite_master}
        !           705: } {t2 v2}
        !           706: do_test auth-1.101 {
        !           707:   proc auth {code arg1 arg2 arg3 arg4} {
        !           708:     if {$code=="SQLITE_DROP_VIEW"} {
        !           709:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !           710:       return SQLITE_DENY
        !           711:     }
        !           712:     return SQLITE_OK
        !           713:   }
        !           714:   catchsql {DROP VIEW v2}
        !           715: } {1 {not authorized}}
        !           716: do_test auth-1.102 {
        !           717:   set ::authargs
        !           718: } {v2 {} main {}}
        !           719: do_test auth-1.103 {
        !           720:   execsql {SELECT name FROM sqlite_master}
        !           721: } {t2 v2}
        !           722: do_test auth-1.104 {
        !           723:   proc auth {code arg1 arg2 arg3 arg4} {
        !           724:     if {$code=="SQLITE_DELETE" && $arg1=="sqlite_master"} {
        !           725:       return SQLITE_IGNORE
        !           726:     }
        !           727:     return SQLITE_OK
        !           728:   }
        !           729:   catchsql {DROP VIEW v2}
        !           730: } {0 {}}
        !           731: do_test auth-1.105 {
        !           732:   execsql {SELECT name FROM sqlite_master}
        !           733: } {t2 v2}
        !           734: do_test auth-1.106 {
        !           735:   proc auth {code arg1 arg2 arg3 arg4} {
        !           736:     if {$code=="SQLITE_DROP_VIEW"} {
        !           737:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !           738:       return SQLITE_IGNORE
        !           739:     }
        !           740:     return SQLITE_OK
        !           741:   }
        !           742:   catchsql {DROP VIEW v2}
        !           743: } {0 {}}
        !           744: do_test auth-1.107 {
        !           745:   set ::authargs
        !           746: } {v2 {} main {}}
        !           747: do_test auth-1.108 {
        !           748:   execsql {SELECT name FROM sqlite_master}
        !           749: } {t2 v2}
        !           750: do_test auth-1.109 {
        !           751:   proc auth {code arg1 arg2 arg3 arg4} {
        !           752:     if {$code=="SQLITE_DROP_VIEW"} {
        !           753:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !           754:       return SQLITE_OK
        !           755:     }
        !           756:     return SQLITE_OK
        !           757:   }
        !           758:   catchsql {DROP VIEW v2}
        !           759: } {0 {}}
        !           760: do_test auth-1.110 {
        !           761:   set ::authargs
        !           762: } {v2 {} main {}}
        !           763: do_test auth-1.111 {
        !           764:   execsql {SELECT name FROM sqlite_master}
        !           765: } {t2}
        !           766: 
        !           767: 
        !           768: ifcapable tempdb {
        !           769:   do_test auth-1.112 {
        !           770:     proc auth {code arg1 arg2 arg3 arg4} {
        !           771:       if {$code=="SQLITE_DELETE" && $arg1=="sqlite_temp_master"} {
        !           772:         return SQLITE_DENY
        !           773:       }
        !           774:       return SQLITE_OK
        !           775:     }
        !           776:     catchsql {
        !           777:       CREATE TEMP VIEW v1 AS SELECT a+1,b+1 FROM t1;
        !           778:       DROP VIEW v1
        !           779:     }
        !           780:   } {1 {not authorized}}
        !           781:   do_test auth-1.113 {
        !           782:     execsql {SELECT name FROM sqlite_temp_master}
        !           783:   } {t1 v1}
        !           784:   do_test auth-1.114 {
        !           785:     proc auth {code arg1 arg2 arg3 arg4} {
        !           786:       if {$code=="SQLITE_DROP_TEMP_VIEW"} {
        !           787:         set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !           788:         return SQLITE_DENY
        !           789:       }
        !           790:       return SQLITE_OK
        !           791:     }
        !           792:     catchsql {DROP VIEW v1}
        !           793:   } {1 {not authorized}}
        !           794:   do_test auth-1.115 {
        !           795:     set ::authargs
        !           796:   } {v1 {} temp {}}
        !           797:   do_test auth-1.116 {
        !           798:     execsql {SELECT name FROM sqlite_temp_master}
        !           799:   } {t1 v1}
        !           800:   do_test auth-1.117 {
        !           801:     proc auth {code arg1 arg2 arg3 arg4} {
        !           802:       if {$code=="SQLITE_DELETE" && $arg1=="sqlite_temp_master"} {
        !           803:         return SQLITE_IGNORE
        !           804:       }
        !           805:       return SQLITE_OK
        !           806:     }
        !           807:     catchsql {DROP VIEW v1}
        !           808:   } {0 {}}
        !           809:   do_test auth-1.118 {
        !           810:     execsql {SELECT name FROM sqlite_temp_master}
        !           811:   } {t1 v1}
        !           812:   do_test auth-1.119 {
        !           813:     proc auth {code arg1 arg2 arg3 arg4} {
        !           814:       if {$code=="SQLITE_DROP_TEMP_VIEW"} {
        !           815:         set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !           816:         return SQLITE_IGNORE
        !           817:       }
        !           818:       return SQLITE_OK
        !           819:     }
        !           820:     catchsql {DROP VIEW v1}
        !           821:   } {0 {}}
        !           822:   do_test auth-1.120 {
        !           823:     set ::authargs
        !           824:   } {v1 {} temp {}}
        !           825:   do_test auth-1.121 {
        !           826:     execsql {SELECT name FROM sqlite_temp_master}
        !           827:   } {t1 v1}
        !           828:   do_test auth-1.122 {
        !           829:     proc auth {code arg1 arg2 arg3 arg4} {
        !           830:       if {$code=="SQLITE_DROP_TEMP_VIEW"} {
        !           831:         set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !           832:         return SQLITE_OK
        !           833:       }
        !           834:       return SQLITE_OK
        !           835:     }
        !           836:     catchsql {DROP VIEW v1}
        !           837:   } {0 {}}
        !           838:   do_test auth-1.123 {
        !           839:     set ::authargs
        !           840:   } {v1 {} temp {}}
        !           841:   do_test auth-1.124 {
        !           842:     execsql {SELECT name FROM sqlite_temp_master}
        !           843:   } {t1}
        !           844: }
        !           845: } ;# ifcapable view
        !           846: 
        !           847: # Test cases auth-1.125 to auth-1.176 test creating and dropping triggers.
        !           848: # Omit these if the library was compiled with triggers omitted.
        !           849: #
        !           850: ifcapable trigger&&tempdb {
        !           851: do_test auth-1.125 {
        !           852:   proc auth {code arg1 arg2 arg3 arg4} {
        !           853:     if {$code=="SQLITE_CREATE_TRIGGER"} {
        !           854:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !           855:       return SQLITE_DENY
        !           856:     }
        !           857:     return SQLITE_OK
        !           858:   }
        !           859:   catchsql {
        !           860:     CREATE TRIGGER r2 DELETE on t2 BEGIN
        !           861:         SELECT NULL;
        !           862:     END;
        !           863:   }
        !           864: } {1 {not authorized}}
        !           865: do_test auth-1.126 {
        !           866:   set ::authargs
        !           867: } {r2 t2 main {}}
        !           868: do_test auth-1.127 {
        !           869:   execsql {SELECT name FROM sqlite_master}
        !           870: } {t2}
        !           871: do_test auth-1.128 {
        !           872:   proc auth {code arg1 arg2 arg3 arg4} {
        !           873:     if {$code=="SQLITE_INSERT" && $arg1=="sqlite_master"} {
        !           874:       return SQLITE_DENY
        !           875:     }
        !           876:     return SQLITE_OK
        !           877:   }
        !           878:   catchsql {
        !           879:     CREATE TRIGGER r2 DELETE on t2 BEGIN
        !           880:         SELECT NULL;
        !           881:     END;
        !           882:   }
        !           883: } {1 {not authorized}}
        !           884: do_test auth-1.129 {
        !           885:   execsql {SELECT name FROM sqlite_master}
        !           886: } {t2}
        !           887: do_test auth-1.130 {
        !           888:   proc auth {code arg1 arg2 arg3 arg4} {
        !           889:     if {$code=="SQLITE_CREATE_TRIGGER"} {
        !           890:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !           891:       return SQLITE_IGNORE
        !           892:     }
        !           893:     return SQLITE_OK
        !           894:   }
        !           895:   catchsql {
        !           896:     CREATE TRIGGER r2 DELETE on t2 BEGIN
        !           897:         SELECT NULL;
        !           898:     END;
        !           899:   }
        !           900: } {0 {}}
        !           901: do_test auth-1.131 {
        !           902:   set ::authargs
        !           903: } {r2 t2 main {}}
        !           904: do_test auth-1.132 {
        !           905:   execsql {SELECT name FROM sqlite_master}
        !           906: } {t2}
        !           907: do_test auth-1.133 {
        !           908:   proc auth {code arg1 arg2 arg3 arg4} {
        !           909:     if {$code=="SQLITE_INSERT" && $arg1=="sqlite_master"} {
        !           910:       return SQLITE_IGNORE
        !           911:     }
        !           912:     return SQLITE_OK
        !           913:   }
        !           914:   catchsql {
        !           915:     CREATE TRIGGER r2 DELETE on t2 BEGIN
        !           916:         SELECT NULL;
        !           917:     END;
        !           918:   }
        !           919: } {0 {}}
        !           920: do_test auth-1.134 {
        !           921:   execsql {SELECT name FROM sqlite_master}
        !           922: } {t2}
        !           923: do_test auth-1.135 {
        !           924:   proc auth {code arg1 arg2 arg3 arg4} {
        !           925:     if {$code=="SQLITE_CREATE_TRIGGER"} {
        !           926:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !           927:       return SQLITE_OK
        !           928:     }
        !           929:     return SQLITE_OK
        !           930:   }
        !           931:   catchsql {
        !           932:     CREATE TABLE tx(id);
        !           933:     CREATE TRIGGER r2 AFTER INSERT ON t2 BEGIN
        !           934:        INSERT INTO tx VALUES(NEW.rowid);
        !           935:     END;
        !           936:   }
        !           937: } {0 {}}
        !           938: do_test auth-1.136.1 {
        !           939:   set ::authargs
        !           940: } {r2 t2 main {}}
        !           941: do_test auth-1.136.2 {
        !           942:   execsql {
        !           943:     SELECT name FROM sqlite_master WHERE type='trigger'
        !           944:   }
        !           945: } {r2}
        !           946: do_test auth-1.136.3 {
        !           947:   proc auth {code arg1 arg2 arg3 arg4} {
        !           948:     lappend ::authargs $code $arg1 $arg2 $arg3 $arg4
        !           949:     return SQLITE_OK
        !           950:   }
        !           951:   set ::authargs {}
        !           952:   execsql {
        !           953:     INSERT INTO t2 VALUES(1,2,3);
        !           954:   }
        !           955:   set ::authargs 
        !           956: } {SQLITE_INSERT t2 {} main {} SQLITE_INSERT tx {} main r2 SQLITE_READ t2 ROWID main r2}
        !           957: do_test auth-1.136.4 {
        !           958:   execsql {
        !           959:     SELECT * FROM tx;
        !           960:   }
        !           961: } {3}
        !           962: do_test auth-1.137 {
        !           963:   execsql {SELECT name FROM sqlite_master}
        !           964: } {t2 tx r2}
        !           965: do_test auth-1.138 {
        !           966:   proc auth {code arg1 arg2 arg3 arg4} {
        !           967:     if {$code=="SQLITE_CREATE_TEMP_TRIGGER"} {
        !           968:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !           969:       return SQLITE_DENY
        !           970:     }
        !           971:     return SQLITE_OK
        !           972:   }
        !           973:   catchsql {
        !           974:     CREATE TRIGGER r1 DELETE on t1 BEGIN
        !           975:         SELECT NULL;
        !           976:     END;
        !           977:   }
        !           978: } {1 {not authorized}}
        !           979: do_test auth-1.139 {
        !           980:   set ::authargs
        !           981: } {r1 t1 temp {}}
        !           982: do_test auth-1.140 {
        !           983:   execsql {SELECT name FROM sqlite_temp_master}
        !           984: } {t1}
        !           985: do_test auth-1.141 {
        !           986:   proc auth {code arg1 arg2 arg3 arg4} {
        !           987:     if {$code=="SQLITE_INSERT" && $arg1=="sqlite_temp_master"} {
        !           988:       return SQLITE_DENY
        !           989:     }
        !           990:     return SQLITE_OK
        !           991:   }
        !           992:   catchsql {
        !           993:     CREATE TRIGGER r1 DELETE on t1 BEGIN
        !           994:         SELECT NULL;
        !           995:     END;
        !           996:   }
        !           997: } {1 {not authorized}}
        !           998: do_test auth-1.142 {
        !           999:   execsql {SELECT name FROM sqlite_temp_master}
        !          1000: } {t1}
        !          1001: do_test auth-1.143 {
        !          1002:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1003:     if {$code=="SQLITE_CREATE_TEMP_TRIGGER"} {
        !          1004:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1005:       return SQLITE_IGNORE
        !          1006:     }
        !          1007:     return SQLITE_OK
        !          1008:   }
        !          1009:   catchsql {
        !          1010:     CREATE TRIGGER r1 DELETE on t1 BEGIN
        !          1011:         SELECT NULL;
        !          1012:     END;
        !          1013:   }
        !          1014: } {0 {}}
        !          1015: do_test auth-1.144 {
        !          1016:   set ::authargs
        !          1017: } {r1 t1 temp {}}
        !          1018: do_test auth-1.145 {
        !          1019:   execsql {SELECT name FROM sqlite_temp_master}
        !          1020: } {t1}
        !          1021: do_test auth-1.146 {
        !          1022:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1023:     if {$code=="SQLITE_INSERT" && $arg1=="sqlite_temp_master"} {
        !          1024:       return SQLITE_IGNORE
        !          1025:     }
        !          1026:     return SQLITE_OK
        !          1027:   }
        !          1028:   catchsql {
        !          1029:     CREATE TRIGGER r1 DELETE on t1 BEGIN
        !          1030:         SELECT NULL;
        !          1031:     END;
        !          1032:   }
        !          1033: } {0 {}}
        !          1034: do_test auth-1.147 {
        !          1035:   execsql {SELECT name FROM sqlite_temp_master}
        !          1036: } {t1}
        !          1037: do_test auth-1.148 {
        !          1038:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1039:     if {$code=="SQLITE_CREATE_TEMP_TRIGGER"} {
        !          1040:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1041:       return SQLITE_OK
        !          1042:     }
        !          1043:     return SQLITE_OK
        !          1044:   }
        !          1045:   catchsql {
        !          1046:     CREATE TRIGGER r1 DELETE on t1 BEGIN
        !          1047:         SELECT NULL;
        !          1048:     END;
        !          1049:   }
        !          1050: } {0 {}}
        !          1051: do_test auth-1.149 {
        !          1052:   set ::authargs
        !          1053: } {r1 t1 temp {}}
        !          1054: do_test auth-1.150 {
        !          1055:   execsql {SELECT name FROM sqlite_temp_master}
        !          1056: } {t1 r1}
        !          1057: 
        !          1058: do_test auth-1.151 {
        !          1059:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1060:     if {$code=="SQLITE_DELETE" && $arg1=="sqlite_master"} {
        !          1061:       return SQLITE_DENY
        !          1062:     }
        !          1063:     return SQLITE_OK
        !          1064:   }
        !          1065:   catchsql {DROP TRIGGER r2}
        !          1066: } {1 {not authorized}}
        !          1067: do_test auth-1.152 {
        !          1068:   execsql {SELECT name FROM sqlite_master}
        !          1069: } {t2 tx r2}
        !          1070: do_test auth-1.153 {
        !          1071:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1072:     if {$code=="SQLITE_DROP_TRIGGER"} {
        !          1073:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1074:       return SQLITE_DENY
        !          1075:     }
        !          1076:     return SQLITE_OK
        !          1077:   }
        !          1078:   catchsql {DROP TRIGGER r2}
        !          1079: } {1 {not authorized}}
        !          1080: do_test auth-1.154 {
        !          1081:   set ::authargs
        !          1082: } {r2 t2 main {}}
        !          1083: do_test auth-1.155 {
        !          1084:   execsql {SELECT name FROM sqlite_master}
        !          1085: } {t2 tx r2}
        !          1086: do_test auth-1.156 {
        !          1087:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1088:     if {$code=="SQLITE_DELETE" && $arg1=="sqlite_master"} {
        !          1089:       return SQLITE_IGNORE
        !          1090:     }
        !          1091:     return SQLITE_OK
        !          1092:   }
        !          1093:   catchsql {DROP TRIGGER r2}
        !          1094: } {0 {}}
        !          1095: do_test auth-1.157 {
        !          1096:   execsql {SELECT name FROM sqlite_master}
        !          1097: } {t2 tx r2}
        !          1098: do_test auth-1.158 {
        !          1099:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1100:     if {$code=="SQLITE_DROP_TRIGGER"} {
        !          1101:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1102:       return SQLITE_IGNORE
        !          1103:     }
        !          1104:     return SQLITE_OK
        !          1105:   }
        !          1106:   catchsql {DROP TRIGGER r2}
        !          1107: } {0 {}}
        !          1108: do_test auth-1.159 {
        !          1109:   set ::authargs
        !          1110: } {r2 t2 main {}}
        !          1111: do_test auth-1.160 {
        !          1112:   execsql {SELECT name FROM sqlite_master}
        !          1113: } {t2 tx r2}
        !          1114: do_test auth-1.161 {
        !          1115:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1116:     if {$code=="SQLITE_DROP_TRIGGER"} {
        !          1117:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1118:       return SQLITE_OK
        !          1119:     }
        !          1120:     return SQLITE_OK
        !          1121:   }
        !          1122:   catchsql {DROP TRIGGER r2}
        !          1123: } {0 {}}
        !          1124: do_test auth-1.162 {
        !          1125:   set ::authargs
        !          1126: } {r2 t2 main {}}
        !          1127: do_test auth-1.163 {
        !          1128:   execsql {
        !          1129:     DROP TABLE tx;
        !          1130:     DELETE FROM t2 WHERE a=1 AND b=2 AND c=3;
        !          1131:     SELECT name FROM sqlite_master;
        !          1132:   }
        !          1133: } {t2}
        !          1134: 
        !          1135: do_test auth-1.164 {
        !          1136:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1137:     if {$code=="SQLITE_DELETE" && $arg1=="sqlite_temp_master"} {
        !          1138:       return SQLITE_DENY
        !          1139:     }
        !          1140:     return SQLITE_OK
        !          1141:   }
        !          1142:   catchsql {DROP TRIGGER r1}
        !          1143: } {1 {not authorized}}
        !          1144: do_test auth-1.165 {
        !          1145:   execsql {SELECT name FROM sqlite_temp_master}
        !          1146: } {t1 r1}
        !          1147: do_test auth-1.166 {
        !          1148:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1149:     if {$code=="SQLITE_DROP_TEMP_TRIGGER"} {
        !          1150:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1151:       return SQLITE_DENY
        !          1152:     }
        !          1153:     return SQLITE_OK
        !          1154:   }
        !          1155:   catchsql {DROP TRIGGER r1}
        !          1156: } {1 {not authorized}}
        !          1157: do_test auth-1.167 {
        !          1158:   set ::authargs
        !          1159: } {r1 t1 temp {}}
        !          1160: do_test auth-1.168 {
        !          1161:   execsql {SELECT name FROM sqlite_temp_master}
        !          1162: } {t1 r1}
        !          1163: do_test auth-1.169 {
        !          1164:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1165:     if {$code=="SQLITE_DELETE" && $arg1=="sqlite_temp_master"} {
        !          1166:       return SQLITE_IGNORE
        !          1167:     }
        !          1168:     return SQLITE_OK
        !          1169:   }
        !          1170:   catchsql {DROP TRIGGER r1}
        !          1171: } {0 {}}
        !          1172: do_test auth-1.170 {
        !          1173:   execsql {SELECT name FROM sqlite_temp_master}
        !          1174: } {t1 r1}
        !          1175: do_test auth-1.171 {
        !          1176:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1177:     if {$code=="SQLITE_DROP_TEMP_TRIGGER"} {
        !          1178:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1179:       return SQLITE_IGNORE
        !          1180:     }
        !          1181:     return SQLITE_OK
        !          1182:   }
        !          1183:   catchsql {DROP TRIGGER r1}
        !          1184: } {0 {}}
        !          1185: do_test auth-1.172 {
        !          1186:   set ::authargs
        !          1187: } {r1 t1 temp {}}
        !          1188: do_test auth-1.173 {
        !          1189:   execsql {SELECT name FROM sqlite_temp_master}
        !          1190: } {t1 r1}
        !          1191: do_test auth-1.174 {
        !          1192:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1193:     if {$code=="SQLITE_DROP_TEMP_TRIGGER"} {
        !          1194:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1195:       return SQLITE_OK
        !          1196:     }
        !          1197:     return SQLITE_OK
        !          1198:   }
        !          1199:   catchsql {DROP TRIGGER r1}
        !          1200: } {0 {}}
        !          1201: do_test auth-1.175 {
        !          1202:   set ::authargs
        !          1203: } {r1 t1 temp {}}
        !          1204: do_test auth-1.176 {
        !          1205:   execsql {SELECT name FROM sqlite_temp_master}
        !          1206: } {t1}
        !          1207: } ;# ifcapable trigger
        !          1208: 
        !          1209: do_test auth-1.177 {
        !          1210:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1211:     if {$code=="SQLITE_CREATE_INDEX"} {
        !          1212:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1213:       return SQLITE_DENY
        !          1214:     }
        !          1215:     return SQLITE_OK
        !          1216:   }
        !          1217:   catchsql {CREATE INDEX i2 ON t2(a)}
        !          1218: } {1 {not authorized}}
        !          1219: do_test auth-1.178 {
        !          1220:   set ::authargs
        !          1221: } {i2 t2 main {}}
        !          1222: do_test auth-1.179 {
        !          1223:   execsql {SELECT name FROM sqlite_master}
        !          1224: } {t2}
        !          1225: do_test auth-1.180 {
        !          1226:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1227:     if {$code=="SQLITE_INSERT" && $arg1=="sqlite_master"} {
        !          1228:       return SQLITE_DENY
        !          1229:     }
        !          1230:     return SQLITE_OK
        !          1231:   }
        !          1232:   catchsql {CREATE INDEX i2 ON t2(a)}
        !          1233: } {1 {not authorized}}
        !          1234: do_test auth-1.181 {
        !          1235:   execsql {SELECT name FROM sqlite_master}
        !          1236: } {t2}
        !          1237: do_test auth-1.182 {
        !          1238:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1239:     if {$code=="SQLITE_CREATE_INDEX"} {
        !          1240:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1241:       return SQLITE_IGNORE
        !          1242:     }
        !          1243:     return SQLITE_OK
        !          1244:   }
        !          1245:   catchsql {CREATE INDEX i2 ON t2(b)}
        !          1246: } {0 {}}
        !          1247: do_test auth-1.183 {
        !          1248:   set ::authargs
        !          1249: } {i2 t2 main {}}
        !          1250: do_test auth-1.184 {
        !          1251:   execsql {SELECT name FROM sqlite_master}
        !          1252: } {t2}
        !          1253: do_test auth-1.185 {
        !          1254:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1255:     if {$code=="SQLITE_INSERT" && $arg1=="sqlite_master"} {
        !          1256:       return SQLITE_IGNORE
        !          1257:     }
        !          1258:     return SQLITE_OK
        !          1259:   }
        !          1260:   catchsql {CREATE INDEX i2 ON t2(b)}
        !          1261: } {0 {}}
        !          1262: do_test auth-1.186 {
        !          1263:   execsql {SELECT name FROM sqlite_master}
        !          1264: } {t2}
        !          1265: do_test auth-1.187 {
        !          1266:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1267:     if {$code=="SQLITE_CREATE_INDEX"} {
        !          1268:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1269:       return SQLITE_OK
        !          1270:     }
        !          1271:     return SQLITE_OK
        !          1272:   }
        !          1273:   catchsql {CREATE INDEX i2 ON t2(a)}
        !          1274: } {0 {}}
        !          1275: do_test auth-1.188 {
        !          1276:   set ::authargs
        !          1277: } {i2 t2 main {}}
        !          1278: do_test auth-1.189 {
        !          1279:   execsql {SELECT name FROM sqlite_master}
        !          1280: } {t2 i2}
        !          1281: 
        !          1282: ifcapable tempdb {
        !          1283:   do_test auth-1.190 {
        !          1284:     proc auth {code arg1 arg2 arg3 arg4} {
        !          1285:       if {$code=="SQLITE_CREATE_TEMP_INDEX"} {
        !          1286:         set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1287:         return SQLITE_DENY
        !          1288:       }
        !          1289:       return SQLITE_OK
        !          1290:     }
        !          1291:     catchsql {CREATE INDEX i1 ON t1(a)}
        !          1292:   } {1 {not authorized}}
        !          1293:   do_test auth-1.191 {
        !          1294:     set ::authargs
        !          1295:   } {i1 t1 temp {}}
        !          1296:   do_test auth-1.192 {
        !          1297:     execsql {SELECT name FROM sqlite_temp_master}
        !          1298:   } {t1}
        !          1299:   do_test auth-1.193 {
        !          1300:     proc auth {code arg1 arg2 arg3 arg4} {
        !          1301:       if {$code=="SQLITE_INSERT" && $arg1=="sqlite_temp_master"} {
        !          1302:         return SQLITE_DENY
        !          1303:       }
        !          1304:       return SQLITE_OK
        !          1305:     }
        !          1306:     catchsql {CREATE INDEX i1 ON t1(b)}
        !          1307:   } {1 {not authorized}}
        !          1308:   do_test auth-1.194 {
        !          1309:     execsql {SELECT name FROM sqlite_temp_master}
        !          1310:   } {t1}
        !          1311:   do_test auth-1.195 {
        !          1312:     proc auth {code arg1 arg2 arg3 arg4} {
        !          1313:       if {$code=="SQLITE_CREATE_TEMP_INDEX"} {
        !          1314:         set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1315:         return SQLITE_IGNORE
        !          1316:       }
        !          1317:       return SQLITE_OK
        !          1318:     }
        !          1319:     catchsql {CREATE INDEX i1 ON t1(b)}
        !          1320:   } {0 {}}
        !          1321:   do_test auth-1.196 {
        !          1322:     set ::authargs
        !          1323:   } {i1 t1 temp {}}
        !          1324:   do_test auth-1.197 {
        !          1325:     execsql {SELECT name FROM sqlite_temp_master}
        !          1326:   } {t1}
        !          1327:   do_test auth-1.198 {
        !          1328:     proc auth {code arg1 arg2 arg3 arg4} {
        !          1329:       if {$code=="SQLITE_INSERT" && $arg1=="sqlite_temp_master"} {
        !          1330:         return SQLITE_IGNORE
        !          1331:       }
        !          1332:       return SQLITE_OK
        !          1333:     }
        !          1334:     catchsql {CREATE INDEX i1 ON t1(c)}
        !          1335:   } {0 {}}
        !          1336:   do_test auth-1.199 {
        !          1337:     execsql {SELECT name FROM sqlite_temp_master}
        !          1338:   } {t1}
        !          1339:   do_test auth-1.200 {
        !          1340:     proc auth {code arg1 arg2 arg3 arg4} {
        !          1341:       if {$code=="SQLITE_CREATE_TEMP_INDEX"} {
        !          1342:         set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1343:         return SQLITE_OK
        !          1344:       }
        !          1345:       return SQLITE_OK
        !          1346:     }
        !          1347:     catchsql {CREATE INDEX i1 ON t1(a)}
        !          1348:   } {0 {}}
        !          1349:   do_test auth-1.201 {
        !          1350:     set ::authargs
        !          1351:   } {i1 t1 temp {}}
        !          1352:   do_test auth-1.202 {
        !          1353:     execsql {SELECT name FROM sqlite_temp_master}
        !          1354:   } {t1 i1}
        !          1355: }
        !          1356: 
        !          1357: do_test auth-1.203 {
        !          1358:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1359:     if {$code=="SQLITE_DELETE" && $arg1=="sqlite_master"} {
        !          1360:       return SQLITE_DENY
        !          1361:     }
        !          1362:     return SQLITE_OK
        !          1363:   }
        !          1364:   catchsql {DROP INDEX i2}
        !          1365: } {1 {not authorized}}
        !          1366: do_test auth-1.204 {
        !          1367:   execsql {SELECT name FROM sqlite_master}
        !          1368: } {t2 i2}
        !          1369: do_test auth-1.205 {
        !          1370:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1371:     if {$code=="SQLITE_DROP_INDEX"} {
        !          1372:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1373:       return SQLITE_DENY
        !          1374:     }
        !          1375:     return SQLITE_OK
        !          1376:   }
        !          1377:   catchsql {DROP INDEX i2}
        !          1378: } {1 {not authorized}}
        !          1379: do_test auth-1.206 {
        !          1380:   set ::authargs
        !          1381: } {i2 t2 main {}}
        !          1382: do_test auth-1.207 {
        !          1383:   execsql {SELECT name FROM sqlite_master}
        !          1384: } {t2 i2}
        !          1385: do_test auth-1.208 {
        !          1386:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1387:     if {$code=="SQLITE_DELETE" && $arg1=="sqlite_master"} {
        !          1388:       return SQLITE_IGNORE
        !          1389:     }
        !          1390:     return SQLITE_OK
        !          1391:   }
        !          1392:   catchsql {DROP INDEX i2}
        !          1393: } {0 {}}
        !          1394: do_test auth-1.209 {
        !          1395:   execsql {SELECT name FROM sqlite_master}
        !          1396: } {t2 i2}
        !          1397: do_test auth-1.210 {
        !          1398:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1399:     if {$code=="SQLITE_DROP_INDEX"} {
        !          1400:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1401:       return SQLITE_IGNORE
        !          1402:     }
        !          1403:     return SQLITE_OK
        !          1404:   }
        !          1405:   catchsql {DROP INDEX i2}
        !          1406: } {0 {}}
        !          1407: do_test auth-1.211 {
        !          1408:   set ::authargs
        !          1409: } {i2 t2 main {}}
        !          1410: do_test auth-1.212 {
        !          1411:   execsql {SELECT name FROM sqlite_master}
        !          1412: } {t2 i2}
        !          1413: do_test auth-1.213 {
        !          1414:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1415:     if {$code=="SQLITE_DROP_INDEX"} {
        !          1416:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1417:       return SQLITE_OK
        !          1418:     }
        !          1419:     return SQLITE_OK
        !          1420:   }
        !          1421:   catchsql {DROP INDEX i2}
        !          1422: } {0 {}}
        !          1423: do_test auth-1.214 {
        !          1424:   set ::authargs
        !          1425: } {i2 t2 main {}}
        !          1426: do_test auth-1.215 {
        !          1427:   execsql {SELECT name FROM sqlite_master}
        !          1428: } {t2}
        !          1429: 
        !          1430: ifcapable tempdb {
        !          1431:   do_test auth-1.216 {
        !          1432:     proc auth {code arg1 arg2 arg3 arg4} {
        !          1433:       if {$code=="SQLITE_DELETE" && $arg1=="sqlite_temp_master"} {
        !          1434:         return SQLITE_DENY
        !          1435:       }
        !          1436:       return SQLITE_OK
        !          1437:     }
        !          1438:     catchsql {DROP INDEX i1}
        !          1439:   } {1 {not authorized}}
        !          1440:   do_test auth-1.217 {
        !          1441:     execsql {SELECT name FROM sqlite_temp_master}
        !          1442:   } {t1 i1}
        !          1443:   do_test auth-1.218 {
        !          1444:     proc auth {code arg1 arg2 arg3 arg4} {
        !          1445:       if {$code=="SQLITE_DROP_TEMP_INDEX"} {
        !          1446:         set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1447:         return SQLITE_DENY
        !          1448:       }
        !          1449:       return SQLITE_OK
        !          1450:     }
        !          1451:     catchsql {DROP INDEX i1}
        !          1452:   } {1 {not authorized}}
        !          1453:   do_test auth-1.219 {
        !          1454:     set ::authargs
        !          1455:   } {i1 t1 temp {}}
        !          1456:   do_test auth-1.220 {
        !          1457:     execsql {SELECT name FROM sqlite_temp_master}
        !          1458:   } {t1 i1}
        !          1459:   do_test auth-1.221 {
        !          1460:     proc auth {code arg1 arg2 arg3 arg4} {
        !          1461:       if {$code=="SQLITE_DELETE" && $arg1=="sqlite_temp_master"} {
        !          1462:         return SQLITE_IGNORE
        !          1463:       }
        !          1464:       return SQLITE_OK
        !          1465:     }
        !          1466:     catchsql {DROP INDEX i1}
        !          1467:   } {0 {}}
        !          1468:   do_test auth-1.222 {
        !          1469:     execsql {SELECT name FROM sqlite_temp_master}
        !          1470:   } {t1 i1}
        !          1471:   do_test auth-1.223 {
        !          1472:     proc auth {code arg1 arg2 arg3 arg4} {
        !          1473:       if {$code=="SQLITE_DROP_TEMP_INDEX"} {
        !          1474:         set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1475:         return SQLITE_IGNORE
        !          1476:       }
        !          1477:       return SQLITE_OK
        !          1478:     }
        !          1479:     catchsql {DROP INDEX i1}
        !          1480:   } {0 {}}
        !          1481:   do_test auth-1.224 {
        !          1482:     set ::authargs
        !          1483:   } {i1 t1 temp {}}
        !          1484:   do_test auth-1.225 {
        !          1485:     execsql {SELECT name FROM sqlite_temp_master}
        !          1486:   } {t1 i1}
        !          1487:   do_test auth-1.226 {
        !          1488:     proc auth {code arg1 arg2 arg3 arg4} {
        !          1489:       if {$code=="SQLITE_DROP_TEMP_INDEX"} {
        !          1490:         set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1491:         return SQLITE_OK
        !          1492:       }
        !          1493:       return SQLITE_OK
        !          1494:     }
        !          1495:     catchsql {DROP INDEX i1}
        !          1496:   } {0 {}}
        !          1497:   do_test auth-1.227 {
        !          1498:     set ::authargs
        !          1499:   } {i1 t1 temp {}}
        !          1500:   do_test auth-1.228 {
        !          1501:     execsql {SELECT name FROM sqlite_temp_master}
        !          1502:   } {t1}
        !          1503: }
        !          1504: 
        !          1505: do_test auth-1.229 {
        !          1506:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1507:     if {$code=="SQLITE_PRAGMA"} {
        !          1508:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1509:       return SQLITE_DENY
        !          1510:     }
        !          1511:     return SQLITE_OK
        !          1512:   }
        !          1513:   catchsql {PRAGMA full_column_names=on}
        !          1514: } {1 {not authorized}}
        !          1515: do_test auth-1.230 {
        !          1516:   set ::authargs
        !          1517: } {full_column_names on {} {}}
        !          1518: do_test auth-1.231 {
        !          1519:   execsql2 {SELECT a FROM t2}
        !          1520: } {a 11 a 7}
        !          1521: do_test auth-1.232 {
        !          1522:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1523:     if {$code=="SQLITE_PRAGMA"} {
        !          1524:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1525:       return SQLITE_IGNORE
        !          1526:     }
        !          1527:     return SQLITE_OK
        !          1528:   }
        !          1529:   catchsql {PRAGMA full_column_names=on}
        !          1530: } {0 {}}
        !          1531: do_test auth-1.233 {
        !          1532:   set ::authargs
        !          1533: } {full_column_names on {} {}}
        !          1534: do_test auth-1.234 {
        !          1535:   execsql2 {SELECT a FROM t2}
        !          1536: } {a 11 a 7}
        !          1537: do_test auth-1.235 {
        !          1538:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1539:     if {$code=="SQLITE_PRAGMA"} {
        !          1540:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1541:       return SQLITE_OK
        !          1542:     }
        !          1543:     return SQLITE_OK
        !          1544:   }
        !          1545:   catchsql {PRAGMA full_column_names=on}
        !          1546: } {0 {}}
        !          1547: do_test auth-1.236 {
        !          1548:   execsql2 {SELECT a FROM t2}
        !          1549: } {t2.a 11 t2.a 7}
        !          1550: do_test auth-1.237 {
        !          1551:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1552:     if {$code=="SQLITE_PRAGMA"} {
        !          1553:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1554:       return SQLITE_OK
        !          1555:     }
        !          1556:     return SQLITE_OK
        !          1557:   }
        !          1558:   catchsql {PRAGMA full_column_names=OFF}
        !          1559: } {0 {}}
        !          1560: do_test auth-1.238 {
        !          1561:   set ::authargs
        !          1562: } {full_column_names OFF {} {}}
        !          1563: do_test auth-1.239 {
        !          1564:   execsql2 {SELECT a FROM t2}
        !          1565: } {a 11 a 7}
        !          1566: 
        !          1567: do_test auth-1.240 {
        !          1568:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1569:     if {$code=="SQLITE_TRANSACTION"} {
        !          1570:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1571:       return SQLITE_DENY
        !          1572:     }
        !          1573:     return SQLITE_OK
        !          1574:   }
        !          1575:   catchsql {BEGIN}
        !          1576: } {1 {not authorized}}
        !          1577: do_test auth-1.241 {
        !          1578:   set ::authargs
        !          1579: } {BEGIN {} {} {}}
        !          1580: do_test auth-1.242 {
        !          1581:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1582:     if {$code=="SQLITE_TRANSACTION" && $arg1!="BEGIN"} {
        !          1583:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1584:       return SQLITE_DENY
        !          1585:     }
        !          1586:     return SQLITE_OK
        !          1587:   }
        !          1588:   catchsql {BEGIN; INSERT INTO t2 VALUES(44,55,66); COMMIT}
        !          1589: } {1 {not authorized}}
        !          1590: do_test auth-1.243 {
        !          1591:   set ::authargs
        !          1592: } {COMMIT {} {} {}}
        !          1593: do_test auth-1.244 {
        !          1594:   execsql {SELECT * FROM t2}
        !          1595: } {11 2 33 7 8 9 44 55 66}
        !          1596: do_test auth-1.245 {
        !          1597:   catchsql {ROLLBACK}
        !          1598: } {1 {not authorized}}
        !          1599: do_test auth-1.246 {
        !          1600:   set ::authargs
        !          1601: } {ROLLBACK {} {} {}}
        !          1602: do_test auth-1.247 {
        !          1603:   catchsql {END TRANSACTION}
        !          1604: } {1 {not authorized}}
        !          1605: do_test auth-1.248 {
        !          1606:   set ::authargs
        !          1607: } {COMMIT {} {} {}}
        !          1608: do_test auth-1.249 {
        !          1609:   db authorizer {}
        !          1610:   catchsql {ROLLBACK}
        !          1611: } {0 {}}
        !          1612: do_test auth-1.250 {
        !          1613:   execsql {SELECT * FROM t2}
        !          1614: } {11 2 33 7 8 9}
        !          1615: 
        !          1616: # ticket #340 - authorization for ATTACH and DETACH.
        !          1617: #
        !          1618: ifcapable attach {
        !          1619:   do_test auth-1.251 {
        !          1620:     db authorizer ::auth
        !          1621:     proc auth {code arg1 arg2 arg3 arg4} {
        !          1622:       if {$code=="SQLITE_ATTACH"} {
        !          1623:         set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1624:       }
        !          1625:       return SQLITE_OK
        !          1626:     }
        !          1627:     catchsql {
        !          1628:       ATTACH DATABASE ':memory:' AS test1
        !          1629:     }
        !          1630:   } {0 {}}
        !          1631:   do_test auth-1.252a {
        !          1632:     set ::authargs
        !          1633:   } {:memory: {} {} {}}
        !          1634:   do_test auth-1.252b {
        !          1635:     db eval {DETACH test1}
        !          1636:     set ::attachfilename :memory:
        !          1637:     db eval {ATTACH $::attachfilename AS test1}
        !          1638:     set ::authargs
        !          1639:   } {{} {} {} {}}
        !          1640:   do_test auth-1.252c {
        !          1641:     db eval {DETACH test1}
        !          1642:     db eval {ATTACH ':mem' || 'ory:' AS test1}
        !          1643:     set ::authargs
        !          1644:   } {{} {} {} {}}
        !          1645:   do_test auth-1.253 {
        !          1646:     catchsql {DETACH DATABASE test1}
        !          1647:     proc auth {code arg1 arg2 arg3 arg4} {
        !          1648:       if {$code=="SQLITE_ATTACH"} {
        !          1649:         set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1650:         return SQLITE_DENY
        !          1651:       }
        !          1652:       return SQLITE_OK
        !          1653:     }
        !          1654:     catchsql {
        !          1655:       ATTACH DATABASE ':memory:' AS test1;
        !          1656:     }
        !          1657:   } {1 {not authorized}}
        !          1658:   do_test auth-1.254 {
        !          1659:     lindex [execsql {PRAGMA database_list}] 7
        !          1660:   } {}
        !          1661:   do_test auth-1.255 {
        !          1662:     catchsql {DETACH DATABASE test1}
        !          1663:     proc auth {code arg1 arg2 arg3 arg4} {
        !          1664:       if {$code=="SQLITE_ATTACH"} {
        !          1665:         set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1666:         return SQLITE_IGNORE
        !          1667:       }
        !          1668:       return SQLITE_OK
        !          1669:     }
        !          1670:     catchsql {
        !          1671:       ATTACH DATABASE ':memory:' AS test1;
        !          1672:     }
        !          1673:   } {0 {}}
        !          1674:   do_test auth-1.256 {
        !          1675:     lindex [execsql {PRAGMA database_list}] 7
        !          1676:   } {}
        !          1677:   do_test auth-1.257 {
        !          1678:     proc auth {code arg1 arg2 arg3 arg4} {
        !          1679:       if {$code=="SQLITE_DETACH"} {
        !          1680:         set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1681:         return SQLITE_OK
        !          1682:       }
        !          1683:       return SQLITE_OK
        !          1684:     }
        !          1685:     execsql {ATTACH DATABASE ':memory:' AS test1}
        !          1686:     catchsql {
        !          1687:       DETACH DATABASE test1;
        !          1688:     }
        !          1689:   } {0 {}}
        !          1690:   do_test auth-1.258 {
        !          1691:     lindex [execsql {PRAGMA database_list}] 7
        !          1692:   } {}
        !          1693:   do_test auth-1.259 {
        !          1694:     execsql {ATTACH DATABASE ':memory:' AS test1}
        !          1695:     proc auth {code arg1 arg2 arg3 arg4} {
        !          1696:       if {$code=="SQLITE_DETACH"} {
        !          1697:         set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1698:         return SQLITE_IGNORE
        !          1699:       }
        !          1700:       return SQLITE_OK
        !          1701:     }
        !          1702:     catchsql {
        !          1703:       DETACH DATABASE test1;
        !          1704:     }
        !          1705:   } {0 {}}
        !          1706:   ifcapable tempdb {
        !          1707:     ifcapable schema_pragmas {
        !          1708:     do_test auth-1.260 {
        !          1709:       lindex [execsql {PRAGMA database_list}] 7
        !          1710:     } {test1}
        !          1711:     } ;# ifcapable schema_pragmas
        !          1712:     do_test auth-1.261 {
        !          1713:       proc auth {code arg1 arg2 arg3 arg4} {
        !          1714:         if {$code=="SQLITE_DETACH"} {
        !          1715:           set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1716:           return SQLITE_DENY
        !          1717:         }
        !          1718:         return SQLITE_OK
        !          1719:       }
        !          1720:       catchsql {
        !          1721:         DETACH DATABASE test1;
        !          1722:       }
        !          1723:     } {1 {not authorized}}
        !          1724:     ifcapable schema_pragmas {
        !          1725:     do_test auth-1.262 {
        !          1726:       lindex [execsql {PRAGMA database_list}] 7
        !          1727:     } {test1}
        !          1728:     } ;# ifcapable schema_pragmas
        !          1729:     db authorizer {}
        !          1730:     execsql {DETACH DATABASE test1}
        !          1731:     db authorizer ::auth
        !          1732:     
        !          1733:     # Authorization for ALTER TABLE. These tests are omitted if the library
        !          1734:     # was built without ALTER TABLE support.
        !          1735:     ifcapable altertable {
        !          1736:     
        !          1737:       do_test auth-1.263 {
        !          1738:         proc auth {code arg1 arg2 arg3 arg4} {
        !          1739:           if {$code=="SQLITE_ALTER_TABLE"} {
        !          1740:             set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1741:             return SQLITE_OK
        !          1742:           }
        !          1743:           return SQLITE_OK
        !          1744:         }
        !          1745:         catchsql {
        !          1746:           ALTER TABLE t1 RENAME TO t1x
        !          1747:         }
        !          1748:       } {0 {}}
        !          1749:       do_test auth-1.264 {
        !          1750:         execsql {SELECT name FROM sqlite_temp_master WHERE type='table'}
        !          1751:       } {t1x}
        !          1752:       do_test auth-1.265 {
        !          1753:         set authargs
        !          1754:       } {temp t1 {} {}}
        !          1755:       do_test auth-1.266 {
        !          1756:         proc auth {code arg1 arg2 arg3 arg4} {
        !          1757:           if {$code=="SQLITE_ALTER_TABLE"} {
        !          1758:             set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1759:             return SQLITE_IGNORE
        !          1760:           }
        !          1761:           return SQLITE_OK
        !          1762:         }
        !          1763:         catchsql {
        !          1764:           ALTER TABLE t1x RENAME TO t1
        !          1765:         }
        !          1766:       } {0 {}}
        !          1767:       do_test auth-1.267 {
        !          1768:         execsql {SELECT name FROM sqlite_temp_master WHERE type='table'}
        !          1769:       } {t1x}
        !          1770:       do_test auth-1.268 {
        !          1771:         set authargs
        !          1772:       } {temp t1x {} {}}
        !          1773:       do_test auth-1.269 {
        !          1774:         proc auth {code arg1 arg2 arg3 arg4} {
        !          1775:           if {$code=="SQLITE_ALTER_TABLE"} {
        !          1776:             set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1777:             return SQLITE_DENY
        !          1778:           }
        !          1779:           return SQLITE_OK
        !          1780:         }
        !          1781:         catchsql {
        !          1782:           ALTER TABLE t1x RENAME TO t1
        !          1783:         }
        !          1784:       } {1 {not authorized}}
        !          1785:       do_test auth-1.270 {
        !          1786:         execsql {SELECT name FROM sqlite_temp_master WHERE type='table'}
        !          1787:       } {t1x}
        !          1788:   
        !          1789:       do_test auth-1.271 {
        !          1790:         set authargs
        !          1791:       } {temp t1x {} {}}
        !          1792:     } ;# ifcapable altertable
        !          1793:   
        !          1794:   } else {
        !          1795:     db authorizer {}
        !          1796:     db eval {
        !          1797:       DETACH DATABASE test1;
        !          1798:     }
        !          1799:   }
        !          1800: }
        !          1801: 
        !          1802: ifcapable  altertable {
        !          1803: db authorizer {}
        !          1804: catchsql {ALTER TABLE t1x RENAME TO t1}
        !          1805: db authorizer ::auth
        !          1806: do_test auth-1.272 {
        !          1807:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1808:     if {$code=="SQLITE_ALTER_TABLE"} {
        !          1809:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1810:       return SQLITE_OK
        !          1811:     }
        !          1812:     return SQLITE_OK
        !          1813:   }
        !          1814:   catchsql {
        !          1815:     ALTER TABLE t2 RENAME TO t2x
        !          1816:   }
        !          1817: } {0 {}}
        !          1818: do_test auth-1.273 {
        !          1819:   execsql {SELECT name FROM sqlite_master WHERE type='table'}
        !          1820: } {t2x}
        !          1821: do_test auth-1.274 {
        !          1822:   set authargs
        !          1823: } {main t2 {} {}}
        !          1824: do_test auth-1.275 {
        !          1825:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1826:     if {$code=="SQLITE_ALTER_TABLE"} {
        !          1827:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1828:       return SQLITE_IGNORE
        !          1829:     }
        !          1830:     return SQLITE_OK
        !          1831:   }
        !          1832:   catchsql {
        !          1833:     ALTER TABLE t2x RENAME TO t2
        !          1834:   }
        !          1835: } {0 {}}
        !          1836: do_test auth-1.276 {
        !          1837:   execsql {SELECT name FROM sqlite_master WHERE type='table'}
        !          1838: } {t2x}
        !          1839: do_test auth-1.277 {
        !          1840:   set authargs
        !          1841: } {main t2x {} {}}
        !          1842: do_test auth-1.278 {
        !          1843:   proc auth {code arg1 arg2 arg3 arg4} {
        !          1844:     if {$code=="SQLITE_ALTER_TABLE"} {
        !          1845:       set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          1846:       return SQLITE_DENY
        !          1847:     }
        !          1848:     return SQLITE_OK
        !          1849:   }
        !          1850:   catchsql {
        !          1851:     ALTER TABLE t2x RENAME TO t2
        !          1852:   }
        !          1853: } {1 {not authorized}}
        !          1854: do_test auth-1.279 {
        !          1855:   execsql {SELECT name FROM sqlite_master WHERE type='table'}
        !          1856: } {t2x}
        !          1857: do_test auth-1.280 {
        !          1858:   set authargs
        !          1859: } {main t2x {} {}}
        !          1860: db authorizer {}
        !          1861: catchsql {ALTER TABLE t2x RENAME TO t2}
        !          1862: 
        !          1863: } ;# ifcapable altertable
        !          1864: 
        !          1865: # Test the authorization callbacks for the REINDEX command.
        !          1866: ifcapable reindex {
        !          1867: 
        !          1868: proc auth {code args} {
        !          1869:   if {$code=="SQLITE_REINDEX"} {
        !          1870:     set ::authargs [concat $::authargs $args]
        !          1871:   }
        !          1872:   return SQLITE_OK
        !          1873: }
        !          1874: db authorizer auth
        !          1875: do_test auth-1.281 {
        !          1876:   execsql {
        !          1877:     CREATE TABLE t3(a PRIMARY KEY, b, c);
        !          1878:     CREATE INDEX t3_idx1 ON t3(c COLLATE BINARY);
        !          1879:     CREATE INDEX t3_idx2 ON t3(b COLLATE NOCASE);
        !          1880:   }
        !          1881: } {}
        !          1882: do_test auth-1.282 {
        !          1883:   set ::authargs {}
        !          1884:   execsql {
        !          1885:     REINDEX t3_idx1;
        !          1886:   }
        !          1887:   set ::authargs
        !          1888: } {t3_idx1 {} main {}}
        !          1889: do_test auth-1.283 {
        !          1890:   set ::authargs {}
        !          1891:   execsql {
        !          1892:     REINDEX BINARY;
        !          1893:   }
        !          1894:   set ::authargs
        !          1895: } {t3_idx1 {} main {} sqlite_autoindex_t3_1 {} main {}}
        !          1896: do_test auth-1.284 {
        !          1897:   set ::authargs {}
        !          1898:   execsql {
        !          1899:     REINDEX NOCASE;
        !          1900:   }
        !          1901:   set ::authargs
        !          1902: } {t3_idx2 {} main {}}
        !          1903: do_test auth-1.285 {
        !          1904:   set ::authargs {}
        !          1905:   execsql {
        !          1906:     REINDEX t3;
        !          1907:   }
        !          1908:   set ::authargs
        !          1909: } {t3_idx2 {} main {} t3_idx1 {} main {} sqlite_autoindex_t3_1 {} main {}}
        !          1910: do_test auth-1.286 {
        !          1911:   execsql {
        !          1912:     DROP TABLE t3;
        !          1913:   }
        !          1914: } {}
        !          1915: ifcapable tempdb {
        !          1916:   do_test auth-1.287 {
        !          1917:     execsql {
        !          1918:       CREATE TEMP TABLE t3(a PRIMARY KEY, b, c);
        !          1919:       CREATE INDEX t3_idx1 ON t3(c COLLATE BINARY);
        !          1920:       CREATE INDEX t3_idx2 ON t3(b COLLATE NOCASE);
        !          1921:     }
        !          1922:   } {}
        !          1923:   do_test auth-1.288 {
        !          1924:     set ::authargs {}
        !          1925:     execsql {
        !          1926:       REINDEX temp.t3_idx1;
        !          1927:     }
        !          1928:     set ::authargs
        !          1929:   } {t3_idx1 {} temp {}}
        !          1930:   do_test auth-1.289 {
        !          1931:     set ::authargs {}
        !          1932:     execsql {
        !          1933:       REINDEX BINARY;
        !          1934:     }
        !          1935:     set ::authargs
        !          1936:   } {t3_idx1 {} temp {} sqlite_autoindex_t3_1 {} temp {}}
        !          1937:   do_test auth-1.290 {
        !          1938:     set ::authargs {}
        !          1939:     execsql {
        !          1940:       REINDEX NOCASE;
        !          1941:     }
        !          1942:     set ::authargs
        !          1943:   } {t3_idx2 {} temp {}}
        !          1944:   do_test auth-1.291 {
        !          1945:     set ::authargs {}
        !          1946:     execsql {
        !          1947:       REINDEX temp.t3;
        !          1948:     }
        !          1949:     set ::authargs
        !          1950:   } {t3_idx2 {} temp {} t3_idx1 {} temp {} sqlite_autoindex_t3_1 {} temp {}}
        !          1951:   proc auth {code args} {
        !          1952:     if {$code=="SQLITE_REINDEX"} {
        !          1953:       set ::authargs [concat $::authargs $args]
        !          1954:       return SQLITE_DENY
        !          1955:     }
        !          1956:     return SQLITE_OK
        !          1957:   }
        !          1958:   do_test auth-1.292 {
        !          1959:     set ::authargs {}
        !          1960:     catchsql {
        !          1961:       REINDEX temp.t3;
        !          1962:     }
        !          1963:   } {1 {not authorized}}
        !          1964:   do_test auth-1.293 {
        !          1965:     execsql {
        !          1966:       DROP TABLE t3;
        !          1967:     }
        !          1968:   } {}
        !          1969: }
        !          1970: 
        !          1971: } ;# ifcapable reindex 
        !          1972: 
        !          1973: ifcapable analyze {
        !          1974:   proc auth {code args} {
        !          1975:     if {$code=="SQLITE_ANALYZE"} {
        !          1976:       set ::authargs [concat $::authargs $args]
        !          1977:     }
        !          1978:     return SQLITE_OK
        !          1979:   }
        !          1980:   do_test auth-1.294 {
        !          1981:     set ::authargs {}
        !          1982:     execsql {
        !          1983:       CREATE TABLE t4(a,b,c);
        !          1984:       CREATE INDEX t4i1 ON t4(a);
        !          1985:       CREATE INDEX t4i2 ON t4(b,a,c);
        !          1986:       INSERT INTO t4 VALUES(1,2,3);
        !          1987:       ANALYZE;
        !          1988:     }
        !          1989:     set ::authargs
        !          1990:   } {t4 {} main {} t2 {} main {}}
        !          1991:   do_test auth-1.295 {
        !          1992:     execsql {
        !          1993:       SELECT count(*) FROM sqlite_stat1;
        !          1994:     }
        !          1995:   } 3
        !          1996:   proc auth {code args} {
        !          1997:     if {$code=="SQLITE_ANALYZE"} {
        !          1998:       set ::authargs [concat $::authargs $args]
        !          1999:       return SQLITE_DENY
        !          2000:     }
        !          2001:     return SQLITE_OK
        !          2002:   }
        !          2003:   do_test auth-1.296 {
        !          2004:     set ::authargs {}
        !          2005:     catchsql {
        !          2006:       ANALYZE;
        !          2007:     }
        !          2008:   } {1 {not authorized}}
        !          2009:   do_test auth-1.297 {
        !          2010:     execsql {
        !          2011:       SELECT count(*) FROM sqlite_stat1;
        !          2012:     }
        !          2013:   } 3
        !          2014: } ;# ifcapable analyze
        !          2015: 
        !          2016: 
        !          2017: # Authorization for ALTER TABLE ADD COLUMN.
        !          2018: # These tests are omitted if the library
        !          2019: # was built without ALTER TABLE support.
        !          2020: ifcapable {altertable} {
        !          2021:   do_test auth-1.300 {
        !          2022:     execsql {CREATE TABLE t5(x)}
        !          2023:     proc auth {code arg1 arg2 arg3 arg4} {
        !          2024:       if {$code=="SQLITE_ALTER_TABLE"} {
        !          2025:         set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          2026:         return SQLITE_OK
        !          2027:       }
        !          2028:       return SQLITE_OK
        !          2029:     }
        !          2030:     catchsql {
        !          2031:       ALTER TABLE t5 ADD COLUMN new_col_1;
        !          2032:     }
        !          2033:   } {0 {}}
        !          2034:   do_test auth-1.301 {
        !          2035:     set x [execsql {SELECT sql FROM sqlite_master WHERE name='t5'}]
        !          2036:     regexp new_col_1 $x
        !          2037:   } {1}
        !          2038:   do_test auth-1.302 {
        !          2039:     set authargs
        !          2040:   } {main t5 {} {}}
        !          2041:   do_test auth-1.303 {
        !          2042:     proc auth {code arg1 arg2 arg3 arg4} {
        !          2043:       if {$code=="SQLITE_ALTER_TABLE"} {
        !          2044:         set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          2045:         return SQLITE_IGNORE
        !          2046:       }
        !          2047:       return SQLITE_OK
        !          2048:     }
        !          2049:     catchsql {
        !          2050:       ALTER TABLE t5 ADD COLUMN new_col_2;
        !          2051:     }
        !          2052:   } {0 {}}
        !          2053:   do_test auth-1.304 {
        !          2054:     set x [execsql {SELECT sql FROM sqlite_master WHERE name='t5'}]
        !          2055:     regexp new_col_2 $x
        !          2056:   } {0}
        !          2057:   do_test auth-1.305 {
        !          2058:     set authargs
        !          2059:   } {main t5 {} {}}
        !          2060:   do_test auth-1.306 {
        !          2061:     proc auth {code arg1 arg2 arg3 arg4} {
        !          2062:       if {$code=="SQLITE_ALTER_TABLE"} {
        !          2063:         set ::authargs [list $arg1 $arg2 $arg3 $arg4]
        !          2064:         return SQLITE_DENY
        !          2065:       }
        !          2066:       return SQLITE_OK
        !          2067:     }
        !          2068:     catchsql {
        !          2069:       ALTER TABLE t5 ADD COLUMN new_col_3
        !          2070:     }
        !          2071:   } {1 {not authorized}}
        !          2072:   do_test auth-1.307 {
        !          2073:     set x [execsql {SELECT sql FROM sqlite_temp_master WHERE type='t5'}]
        !          2074:     regexp new_col_3 $x
        !          2075:   } {0}
        !          2076: 
        !          2077:   do_test auth-1.308 {
        !          2078:     set authargs
        !          2079:   } {main t5 {} {}}
        !          2080:   execsql {DROP TABLE t5}
        !          2081: } ;# ifcapable altertable
        !          2082: 
        !          2083: do_test auth-2.1 {
        !          2084:   proc auth {code arg1 arg2 arg3 arg4} {
        !          2085:     if {$code=="SQLITE_READ" && $arg1=="t3" && $arg2=="x"} {
        !          2086:       return SQLITE_DENY
        !          2087:     }
        !          2088:     return SQLITE_OK
        !          2089:   }
        !          2090:   db authorizer ::auth
        !          2091:   execsql {CREATE TABLE t3(x INTEGER PRIMARY KEY, y, z)}
        !          2092:   catchsql {SELECT * FROM t3}
        !          2093: } {1 {access to t3.x is prohibited}}
        !          2094: do_test auth-2.1 {
        !          2095:   catchsql {SELECT y,z FROM t3}
        !          2096: } {0 {}}
        !          2097: do_test auth-2.2 {
        !          2098:   catchsql {SELECT ROWID,y,z FROM t3}
        !          2099: } {1 {access to t3.x is prohibited}}
        !          2100: do_test auth-2.3 {
        !          2101:   catchsql {SELECT OID,y,z FROM t3}
        !          2102: } {1 {access to t3.x is prohibited}}
        !          2103: do_test auth-2.4 {
        !          2104:   proc auth {code arg1 arg2 arg3 arg4} {
        !          2105:     if {$code=="SQLITE_READ" && $arg1=="t3" && $arg2=="x"} {
        !          2106:       return SQLITE_IGNORE
        !          2107:     }
        !          2108:     return SQLITE_OK
        !          2109:   }
        !          2110:   execsql {INSERT INTO t3 VALUES(44,55,66)}
        !          2111:   catchsql {SELECT * FROM t3}
        !          2112: } {0 {{} 55 66}}
        !          2113: do_test auth-2.5 {
        !          2114:   catchsql {SELECT rowid,y,z FROM t3}
        !          2115: } {0 {{} 55 66}}
        !          2116: do_test auth-2.6 {
        !          2117:   proc auth {code arg1 arg2 arg3 arg4} {
        !          2118:     if {$code=="SQLITE_READ" && $arg1=="t3" && $arg2=="ROWID"} {
        !          2119:       return SQLITE_IGNORE
        !          2120:     }
        !          2121:     return SQLITE_OK
        !          2122:   }
        !          2123:   catchsql {SELECT * FROM t3}
        !          2124: } {0 {44 55 66}}
        !          2125: do_test auth-2.7 {
        !          2126:   catchsql {SELECT ROWID,y,z FROM t3}
        !          2127: } {0 {44 55 66}}
        !          2128: do_test auth-2.8 {
        !          2129:   proc auth {code arg1 arg2 arg3 arg4} {
        !          2130:     if {$code=="SQLITE_READ" && $arg1=="t2" && $arg2=="ROWID"} {
        !          2131:       return SQLITE_IGNORE
        !          2132:     }
        !          2133:     return SQLITE_OK
        !          2134:   }
        !          2135:   catchsql {SELECT ROWID,b,c FROM t2}
        !          2136: } {0 {{} 2 33 {} 8 9}}
        !          2137: do_test auth-2.9.1 {
        !          2138:   # We have to flush the cache here in case the Tcl interface tries to
        !          2139:   # reuse a statement compiled with sqlite3_prepare_v2(). In this case,
        !          2140:   # the first error encountered is an SQLITE_SCHEMA error. Then, when
        !          2141:   # trying to recompile the statement, the authorization error is encountered.
        !          2142:   # If we do not flush the cache, the correct error message is returned, but
        !          2143:   # the error code is SQLITE_SCHEMA, not SQLITE_ERROR as required by the test
        !          2144:   # case after this one.
        !          2145:   #
        !          2146:   db cache flush
        !          2147: 
        !          2148:   proc auth {code arg1 arg2 arg3 arg4} {
        !          2149:     if {$code=="SQLITE_READ" && $arg1=="t2" && $arg2=="ROWID"} {
        !          2150:       return bogus
        !          2151:     }
        !          2152:     return SQLITE_OK
        !          2153:   }
        !          2154:   catchsql {SELECT ROWID,b,c FROM t2}
        !          2155: } {1 {authorizer malfunction}}
        !          2156: do_test auth-2.9.2 {
        !          2157:   db errorcode
        !          2158: } {1}
        !          2159: do_test auth-2.10 {
        !          2160:   proc auth {code arg1 arg2 arg3 arg4} {
        !          2161:     if {$code=="SQLITE_SELECT"} {
        !          2162:       return bogus
        !          2163:     }
        !          2164:     return SQLITE_OK
        !          2165:   }
        !          2166:   catchsql {SELECT ROWID,b,c FROM t2}
        !          2167: } {1 {authorizer malfunction}}
        !          2168: do_test auth-2.11.1 {
        !          2169:   proc auth {code arg1 arg2 arg3 arg4} {
        !          2170:     if {$code=="SQLITE_READ" && $arg2=="a"} {
        !          2171:       return SQLITE_IGNORE
        !          2172:     }
        !          2173:     return SQLITE_OK
        !          2174:   }
        !          2175:   catchsql {SELECT * FROM t2, t3}
        !          2176: } {0 {{} 2 33 44 55 66 {} 8 9 44 55 66}}
        !          2177: do_test auth-2.11.2 {
        !          2178:   proc auth {code arg1 arg2 arg3 arg4} {
        !          2179:     if {$code=="SQLITE_READ" && $arg2=="x"} {
        !          2180:       return SQLITE_IGNORE
        !          2181:     }
        !          2182:     return SQLITE_OK
        !          2183:   }
        !          2184:   catchsql {SELECT * FROM t2, t3}
        !          2185: } {0 {11 2 33 {} 55 66 7 8 9 {} 55 66}}
        !          2186: 
        !          2187: # Make sure the OLD and NEW pseudo-tables of a trigger get authorized.
        !          2188: #
        !          2189: ifcapable trigger {
        !          2190:   do_test auth-3.1 {
        !          2191:     proc auth {code arg1 arg2 arg3 arg4} {
        !          2192:       return SQLITE_OK
        !          2193:     }
        !          2194:     execsql {
        !          2195:       CREATE TABLE tx(a1,a2,b1,b2,c1,c2);
        !          2196:       CREATE TRIGGER r1 AFTER UPDATE ON t2 FOR EACH ROW BEGIN
        !          2197:         INSERT INTO tx VALUES(OLD.a,NEW.a,OLD.b,NEW.b,OLD.c,NEW.c);
        !          2198:       END;
        !          2199:       UPDATE t2 SET a=a+1;
        !          2200:       SELECT * FROM tx;
        !          2201:     }
        !          2202:   } {11 12 2 2 33 33 7 8 8 8 9 9}
        !          2203:   do_test auth-3.2 {
        !          2204:     proc auth {code arg1 arg2 arg3 arg4} {
        !          2205:       if {$code=="SQLITE_READ" && $arg1=="t2" && $arg2=="c"} {
        !          2206:         return SQLITE_IGNORE
        !          2207:       }
        !          2208:       return SQLITE_OK
        !          2209:     }
        !          2210:     execsql {
        !          2211:       DELETE FROM tx;
        !          2212:       UPDATE t2 SET a=a+100;
        !          2213:       SELECT * FROM tx;
        !          2214:     }
        !          2215:   } {12 112 2 2 {} {} 8 108 8 8 {} {}}
        !          2216: } ;# ifcapable trigger
        !          2217: 
        !          2218: # Make sure the names of views and triggers are passed on on arg4.
        !          2219: #
        !          2220: ifcapable trigger {
        !          2221: do_test auth-4.1 {
        !          2222:   proc auth {code arg1 arg2 arg3 arg4} {
        !          2223:     lappend ::authargs $code $arg1 $arg2 $arg3 $arg4
        !          2224:     return SQLITE_OK
        !          2225:   }
        !          2226:   set authargs {}
        !          2227:   execsql {
        !          2228:     UPDATE t2 SET a=a+1;
        !          2229:   }
        !          2230:   set authargs
        !          2231: } [list \
        !          2232:   SQLITE_READ   t2 a  main {} \
        !          2233:   SQLITE_UPDATE t2 a  main {} \
        !          2234:   SQLITE_INSERT tx {} main r1 \
        !          2235:   SQLITE_READ   t2 a  main r1 \
        !          2236:   SQLITE_READ   t2 a  main r1 \
        !          2237:   SQLITE_READ   t2 b  main r1 \
        !          2238:   SQLITE_READ   t2 b  main r1 \
        !          2239:   SQLITE_READ   t2 c  main r1 \
        !          2240:   SQLITE_READ   t2 c  main r1]
        !          2241: }
        !          2242: 
        !          2243: ifcapable {view && trigger} {
        !          2244: do_test auth-4.2 {
        !          2245:   execsql {
        !          2246:     CREATE VIEW v1 AS SELECT a+b AS x FROM t2;
        !          2247:     CREATE TABLE v1chng(x1,x2);
        !          2248:     CREATE TRIGGER r2 INSTEAD OF UPDATE ON v1 BEGIN
        !          2249:       INSERT INTO v1chng VALUES(OLD.x,NEW.x);
        !          2250:     END;
        !          2251:     SELECT * FROM v1;
        !          2252:   }
        !          2253: } {115 117}
        !          2254: do_test auth-4.3 {
        !          2255:   set authargs {}
        !          2256:   execsql {
        !          2257:     UPDATE v1 SET x=1 WHERE x=117
        !          2258:   }
        !          2259:   set authargs
        !          2260: } [list \
        !          2261:   SQLITE_UPDATE v1     x  main {} \
        !          2262:   SQLITE_SELECT {}     {} {}   v1 \
        !          2263:   SQLITE_READ   t2     a  main v1 \
        !          2264:   SQLITE_READ   t2     b  main v1 \
        !          2265:   SQLITE_SELECT {}     {} {}   {} \
        !          2266:   SQLITE_READ   v1     x  main v1 \
        !          2267:   SQLITE_INSERT v1chng {} main r2 \
        !          2268:   SQLITE_READ   v1     x  main r2 \
        !          2269:   SQLITE_READ   v1     x  main r2 \
        !          2270: ]
        !          2271: 
        !          2272: do_test auth-4.4 {
        !          2273:   execsql {
        !          2274:     CREATE TRIGGER r3 INSTEAD OF DELETE ON v1 BEGIN
        !          2275:       INSERT INTO v1chng VALUES(OLD.x,NULL);
        !          2276:     END;
        !          2277:     SELECT * FROM v1;
        !          2278:   }
        !          2279: } {115 117}
        !          2280: do_test auth-4.5 {
        !          2281:   set authargs {}
        !          2282:   execsql {
        !          2283:     DELETE FROM v1 WHERE x=117
        !          2284:   }
        !          2285:   set authargs
        !          2286: } [list \
        !          2287:   SQLITE_DELETE v1     {} main {} \
        !          2288:   SQLITE_SELECT {}     {} {}   v1 \
        !          2289:   SQLITE_READ   t2     a  main v1 \
        !          2290:   SQLITE_READ   t2     b  main v1 \
        !          2291:   SQLITE_SELECT {}     {} {}   {} \
        !          2292:   SQLITE_READ   v1     x  main v1 \
        !          2293:   SQLITE_INSERT v1chng {} main r3 \
        !          2294:   SQLITE_READ   v1     x  main r3 \
        !          2295: ]
        !          2296: 
        !          2297: } ;# ifcapable view && trigger
        !          2298: 
        !          2299: # Ticket #1338:  Make sure authentication works in the presence of an AS
        !          2300: # clause.
        !          2301: #
        !          2302: do_test auth-5.1 {
        !          2303:   proc auth {code arg1 arg2 arg3 arg4} {
        !          2304:     return SQLITE_OK
        !          2305:   }
        !          2306:   execsql {
        !          2307:     SELECT count(a) AS cnt FROM t4 ORDER BY cnt
        !          2308:   }
        !          2309: } {1}
        !          2310: 
        !          2311: # Ticket #1607
        !          2312: #
        !          2313: ifcapable compound&&subquery {
        !          2314:   ifcapable trigger {
        !          2315:     execsql {
        !          2316:       DROP TABLE tx;
        !          2317:     }
        !          2318:     ifcapable view {
        !          2319:       execsql {
        !          2320:         DROP TABLE v1chng;
        !          2321:       }
        !          2322:     }
        !          2323:   }
        !          2324:   ifcapable stat3 {
        !          2325:     set stat3 "sqlite_stat3 "
        !          2326:   } else {
        !          2327:     set stat3 ""
        !          2328:   }
        !          2329:   do_test auth-5.2 {
        !          2330:     execsql {
        !          2331:       SELECT name FROM (
        !          2332:         SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master)
        !          2333:       WHERE type='table'
        !          2334:       ORDER BY name
        !          2335:     }
        !          2336:   } "sqlite_stat1 ${stat3}t1 t2 t3 t4"
        !          2337: }
        !          2338: 
        !          2339: # Ticket #3944
        !          2340: #
        !          2341: ifcapable trigger {
        !          2342:   do_test auth-5.3.1 {
        !          2343:     execsql {
        !          2344:       CREATE TABLE t5 ( x );
        !          2345:       CREATE TRIGGER t5_tr1 AFTER INSERT ON t5 BEGIN 
        !          2346:         UPDATE t5 SET x = 1 WHERE NEW.x = 0;
        !          2347:       END;
        !          2348:     }
        !          2349:   } {}
        !          2350:   set ::authargs [list]
        !          2351:   proc auth {args} {
        !          2352:     eval lappend ::authargs $args
        !          2353:     return SQLITE_OK
        !          2354:   }
        !          2355:   do_test auth-5.3.2 {
        !          2356:     execsql { INSERT INTO t5 (x) values(0) }
        !          2357:     set ::authargs
        !          2358:   } [list SQLITE_INSERT t5 {} main {}    \
        !          2359:           SQLITE_UPDATE t5 x main t5_tr1 \
        !          2360:           SQLITE_READ t5 x main t5_tr1   \
        !          2361:     ]
        !          2362:   do_test auth-5.3.2 {
        !          2363:     execsql { SELECT * FROM t5 }
        !          2364:   } {1}
        !          2365: }
        !          2366: 
        !          2367: 
        !          2368: rename proc {}
        !          2369: rename proc_real proc
        !          2370: 
        !          2371: 
        !          2372: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>