@@ -19999,36 +19999,28 @@ static int do_meta_command(char *zLine, ShellState *p){
1999919999 char *zNewFilename = 0; /* Name of the database file to open */
2000020000 int iName = 1; /* Index in azArg[] of the filename */
2000120001 int newFlag = 0; /* True to delete file before opening */
20002- /* Close the existing database */
20003- session_close_all(p, -1);
20004- close_db(p->db);
20005- p->db = 0;
20006- p->pAuxDb->zDbFilename = 0;
20007- sqlite3_free(p->pAuxDb->zFreeOnClose);
20008- p->pAuxDb->zFreeOnClose = 0;
20009- p->openMode = SHELL_OPEN_UNSPEC;
20010- p->openFlags = 0;
20011- p->szMax = 0;
20002+ int openMode = SHELL_OPEN_UNSPEC;
20003+
2001220004 /* Check for command-line arguments */
2001320005 for(iName=1; iName<nArg; iName++){
2001420006 const char *z = azArg[iName];
2001520007 if( optionMatch(z,"new") ){
2001620008 newFlag = 1;
2001720009#ifdef SQLITE_HAVE_ZLIB
2001820010 }else if( optionMatch(z, "zip") ){
20019- p-> openMode = SHELL_OPEN_ZIPFILE;
20011+ openMode = SHELL_OPEN_ZIPFILE;
2002020012#endif
2002120013 }else if( optionMatch(z, "append") ){
20022- p-> openMode = SHELL_OPEN_APPENDVFS;
20014+ openMode = SHELL_OPEN_APPENDVFS;
2002320015 }else if( optionMatch(z, "readonly") ){
20024- p-> openMode = SHELL_OPEN_READONLY;
20016+ openMode = SHELL_OPEN_READONLY;
2002520017 }else if( optionMatch(z, "nofollow") ){
2002620018 p->openFlags |= SQLITE_OPEN_NOFOLLOW;
2002720019#ifndef SQLITE_OMIT_DESERIALIZE
2002820020 }else if( optionMatch(z, "deserialize") ){
20029- p-> openMode = SHELL_OPEN_DESERIALIZE;
20021+ openMode = SHELL_OPEN_DESERIALIZE;
2003020022 }else if( optionMatch(z, "hexdb") ){
20031- p-> openMode = SHELL_OPEN_HEXDB;
20023+ openMode = SHELL_OPEN_HEXDB;
2003220024 }else if( optionMatch(z, "maxsize") && iName+1<nArg ){
2003320025 p->szMax = integerValue(azArg[++iName]);
2003420026#endif /* SQLITE_OMIT_DESERIALIZE */
@@ -20044,6 +20036,18 @@ static int do_meta_command(char *zLine, ShellState *p){
2004420036 zNewFilename = sqlite3_mprintf("%s", z);
2004520037 }
2004620038 }
20039+
20040+ /* Close the existing database */
20041+ session_close_all(p, -1);
20042+ close_db(p->db);
20043+ p->db = 0;
20044+ p->pAuxDb->zDbFilename = 0;
20045+ sqlite3_free(p->pAuxDb->zFreeOnClose);
20046+ p->pAuxDb->zFreeOnClose = 0;
20047+ p->openMode = openMode;
20048+ p->openFlags = 0;
20049+ p->szMax = 0;
20050+
2004720051 /* If a filename is specified, try to open it first */
2004820052 if( zNewFilename || p->openMode==SHELL_OPEN_HEXDB ){
2004920053 if( newFlag && !p->bSafeMode ) shellDeleteFile(zNewFilename);
@@ -21262,30 +21266,31 @@ static int do_meta_command(char *zLine, ShellState *p){
2126221266 static const struct {
2126321267 const char *zCtrlName; /* Name of a test-control option */
2126421268 int ctrlCode; /* Integer code for that option */
21269+ int unSafe; /* Not valid for --safe mode */
2126521270 const char *zUsage; /* Usage notes */
2126621271 } aCtrl[] = {
21267- { "always", SQLITE_TESTCTRL_ALWAYS, "BOOLEAN" },
21268- { "assert", SQLITE_TESTCTRL_ASSERT, "BOOLEAN" },
21269- /*{ "benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS, "" },*/
21270- /*{ "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST, "" },*/
21271- { "byteorder", SQLITE_TESTCTRL_BYTEORDER, "" },
21272- { "extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,"BOOLEAN" },
21273- /*{ "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL, "" },*/
21274- { "imposter", SQLITE_TESTCTRL_IMPOSTER, "SCHEMA ON/OFF ROOTPAGE"},
21275- { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS, "" },
21276- { "localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT,"BOOLEAN" },
21277- { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT, "BOOLEAN" },
21278- { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS, "DISABLE-MASK" },
21272+ { "always", SQLITE_TESTCTRL_ALWAYS, 1, "BOOLEAN" },
21273+ { "assert", SQLITE_TESTCTRL_ASSERT, 1, "BOOLEAN" },
21274+ /*{ "benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS,1, "" },*/
21275+ /*{ "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST, 1, "" },*/
21276+ { "byteorder", SQLITE_TESTCTRL_BYTEORDER, 0, "" },
21277+ { "extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,0, "BOOLEAN" },
21278+ /*{ "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL, 1,"" },*/
21279+ { "imposter", SQLITE_TESTCTRL_IMPOSTER,1, "SCHEMA ON/OFF ROOTPAGE"},
21280+ { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS,0,"" },
21281+ { "localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT,0, "BOOLEAN" },
21282+ { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT,1, "BOOLEAN" },
21283+ { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS,0, "DISABLE-MASK" },
2127921284#ifdef YYCOVERAGE
21280- { "parser_coverage", SQLITE_TESTCTRL_PARSER_COVERAGE, "" },
21285+ { "parser_coverage", SQLITE_TESTCTRL_PARSER_COVERAGE,0, "" },
2128121286#endif
21282- { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE, "OFFSET " },
21283- { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE, "" },
21284- { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE, "" },
21285- { "prng_seed", SQLITE_TESTCTRL_PRNG_SEED, "SEED ?db?" },
21286- { "seek_count", SQLITE_TESTCTRL_SEEK_COUNT, "" },
21287- { "sorter_mmap", SQLITE_TESTCTRL_SORTER_MMAP, "NMAX" },
21288- { "tune", SQLITE_TESTCTRL_TUNE, "ID VALUE" },
21287+ { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE,0, "OFFSET " },
21288+ { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE,0, "" },
21289+ { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE, 0, "" },
21290+ { "prng_seed", SQLITE_TESTCTRL_PRNG_SEED, 0, "SEED ?db?" },
21291+ { "seek_count", SQLITE_TESTCTRL_SEEK_COUNT, 0, "" },
21292+ { "sorter_mmap", SQLITE_TESTCTRL_SORTER_MMAP, 0, "NMAX" },
21293+ { "tune", SQLITE_TESTCTRL_TUNE, 1, "ID VALUE" },
2128921294 };
2129021295 int testctrl = -1;
2129121296 int iCtrl = -1;
@@ -21333,6 +21338,11 @@ static int do_meta_command(char *zLine, ShellState *p){
2133321338 if( testctrl<0 ){
2133421339 utf8_printf(stderr,"Error: unknown test-control: %s\n"
2133521340 "Use \".testctrl --help\" for help\n", zCmd);
21341+ }else if( aCtrl[iCtrl].unSafe && p->bSafeMode ){
21342+ utf8_printf(stderr,
21343+ "line %d: \".testctrl %s\" may not be used in safe mode\n",
21344+ p->lineno, aCtrl[iCtrl].zCtrlName);
21345+ exit(1);
2133621346 }else{
2133721347 switch(testctrl){
2133821348
0 commit comments