@@ -19999,36 +19999,28 @@ static int do_meta_command(char *zLine, ShellState *p){
19999
19999
char *zNewFilename = 0; /* Name of the database file to open */
20000
20000
int iName = 1; /* Index in azArg[] of the filename */
20001
20001
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
+
20012
20004
/* Check for command-line arguments */
20013
20005
for(iName=1; iName<nArg; iName++){
20014
20006
const char *z = azArg[iName];
20015
20007
if( optionMatch(z,"new") ){
20016
20008
newFlag = 1;
20017
20009
#ifdef SQLITE_HAVE_ZLIB
20018
20010
}else if( optionMatch(z, "zip") ){
20019
- p-> openMode = SHELL_OPEN_ZIPFILE;
20011
+ openMode = SHELL_OPEN_ZIPFILE;
20020
20012
#endif
20021
20013
}else if( optionMatch(z, "append") ){
20022
- p-> openMode = SHELL_OPEN_APPENDVFS;
20014
+ openMode = SHELL_OPEN_APPENDVFS;
20023
20015
}else if( optionMatch(z, "readonly") ){
20024
- p-> openMode = SHELL_OPEN_READONLY;
20016
+ openMode = SHELL_OPEN_READONLY;
20025
20017
}else if( optionMatch(z, "nofollow") ){
20026
20018
p->openFlags |= SQLITE_OPEN_NOFOLLOW;
20027
20019
#ifndef SQLITE_OMIT_DESERIALIZE
20028
20020
}else if( optionMatch(z, "deserialize") ){
20029
- p-> openMode = SHELL_OPEN_DESERIALIZE;
20021
+ openMode = SHELL_OPEN_DESERIALIZE;
20030
20022
}else if( optionMatch(z, "hexdb") ){
20031
- p-> openMode = SHELL_OPEN_HEXDB;
20023
+ openMode = SHELL_OPEN_HEXDB;
20032
20024
}else if( optionMatch(z, "maxsize") && iName+1<nArg ){
20033
20025
p->szMax = integerValue(azArg[++iName]);
20034
20026
#endif /* SQLITE_OMIT_DESERIALIZE */
@@ -20044,6 +20036,18 @@ static int do_meta_command(char *zLine, ShellState *p){
20044
20036
zNewFilename = sqlite3_mprintf("%s", z);
20045
20037
}
20046
20038
}
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
+
20047
20051
/* If a filename is specified, try to open it first */
20048
20052
if( zNewFilename || p->openMode==SHELL_OPEN_HEXDB ){
20049
20053
if( newFlag && !p->bSafeMode ) shellDeleteFile(zNewFilename);
@@ -21262,30 +21266,31 @@ static int do_meta_command(char *zLine, ShellState *p){
21262
21266
static const struct {
21263
21267
const char *zCtrlName; /* Name of a test-control option */
21264
21268
int ctrlCode; /* Integer code for that option */
21269
+ int unSafe; /* Not valid for --safe mode */
21265
21270
const char *zUsage; /* Usage notes */
21266
21271
} 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" },
21279
21284
#ifdef YYCOVERAGE
21280
- { "parser_coverage", SQLITE_TESTCTRL_PARSER_COVERAGE, "" },
21285
+ { "parser_coverage", SQLITE_TESTCTRL_PARSER_COVERAGE,0, "" },
21281
21286
#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" },
21289
21294
};
21290
21295
int testctrl = -1;
21291
21296
int iCtrl = -1;
@@ -21333,6 +21338,11 @@ static int do_meta_command(char *zLine, ShellState *p){
21333
21338
if( testctrl<0 ){
21334
21339
utf8_printf(stderr,"Error: unknown test-control: %s\n"
21335
21340
"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);
21336
21346
}else{
21337
21347
switch(testctrl){
21338
21348
0 commit comments