Annotation of embedaddon/sqlite3/test/auth.test, revision 1.1.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>