=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/sqlite3/Attic/shell.c,v retrieving revision 1.12 retrieving revision 1.13 diff -c -r1.12 -r1.13 *** src/usr.bin/sqlite3/Attic/shell.c 2015/04/19 14:25:05 1.12 --- src/usr.bin/sqlite3/Attic/shell.c 2015/09/12 02:08:36 1.13 *************** *** 101,130 **** #if defined(_WIN32) || defined(WIN32) # include # include ! #define isatty(h) _isatty(h) ! #ifndef access ! # define access(f,m) _access((f),(m)) ! #endif ! #undef popen ! #define popen _popen ! #undef pclose ! #define pclose _pclose #else ! /* Make sure isatty() has a prototype. ! */ ! extern int isatty(int); ! #if !defined(__RTP__) && !defined(_WRS_KERNEL) ! /* popen and pclose are not C89 functions and so are sometimes omitted from ! ** the header */ ! extern FILE *popen(const char*,const char*); ! extern int pclose(FILE*); ! #else ! # define SQLITE_OMIT_POPEN 1 #endif - #endif - #if defined(_WIN32_WCE) /* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty() * thus we always assume that we have a console. That can be --- 101,128 ---- #if defined(_WIN32) || defined(WIN32) # include # include ! # define isatty(h) _isatty(h) ! # ifndef access ! # define access(f,m) _access((f),(m)) ! # endif ! # undef popen ! # define popen _popen ! # undef pclose ! # define pclose _pclose #else ! /* Make sure isatty() has a prototype. */ ! extern int isatty(int); ! # if !defined(__RTP__) && !defined(_WRS_KERNEL) ! /* popen and pclose are not C89 functions and so are ! ** sometimes omitted from the header */ ! extern FILE *popen(const char*,const char*); ! extern int pclose(FILE*); ! # else ! # define SQLITE_OMIT_POPEN 1 ! # endif #endif #if defined(_WIN32_WCE) /* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty() * thus we always assume that we have a console. That can be *************** *** 336,342 **** ** to this database a static variable so that it can be accessed ** by the SIGINT handler to interrupt database processing. */ ! static sqlite3 *db = 0; /* ** True if an interrupt (Control-C) has been received. --- 334,340 ---- ** to this database a static variable so that it can be accessed ** by the SIGINT handler to interrupt database processing. */ ! static sqlite3 *globalDb = 0; /* ** True if an interrupt (Control-C) has been received. *************** *** 527,532 **** --- 525,531 ---- int autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */ int statsOn; /* True to display memory stats before each finalize */ int scanstatsOn; /* True to display scan stats before each finalize */ + int backslashOn; /* Resolve C-style \x escapes in SQL input text */ int outCount; /* Revert to stdout when reaching zero */ int cnt; /* Number of records displayed so far */ FILE *out; /* Write results here */ *************** *** 804,810 **** UNUSED_PARAMETER(NotUsed); seenInterrupt++; if( seenInterrupt>2 ) exit(1); ! if( db ) sqlite3_interrupt(db); } #endif --- 803,809 ---- UNUSED_PARAMETER(NotUsed); seenInterrupt++; if( seenInterrupt>2 ) exit(1); ! if( globalDb ) sqlite3_interrupt(globalDb); } #endif *************** *** 989,995 **** case MODE_Insert: { p->cnt++; if( azArg==0 ) break; ! fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable); for(i=0; i0 ? ",": ""; if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ --- 988,1003 ---- case MODE_Insert: { p->cnt++; if( azArg==0 ) break; ! fprintf(p->out,"INSERT INTO %s",p->zDestTable); ! if( p->showHeader ){ ! fprintf(p->out,"("); ! for(i=0; i0 ? ",": ""; ! fprintf(p->out, "%s%s", zSep, azCol[i]); ! } ! fprintf(p->out,")"); ! } ! fprintf(p->out," VALUES("); for(i=0; i0 ? ",": ""; if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ *************** *** 1190,1196 **** sqlite3 *db /* Database to query */ ){ int nErrMsg = 1+strlen30(sqlite3_errmsg(db)); ! char *zErrMsg = sqlite3_malloc(nErrMsg); if( zErrMsg ){ memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg); } --- 1198,1204 ---- sqlite3 *db /* Database to query */ ){ int nErrMsg = 1+strlen30(sqlite3_errmsg(db)); ! char *zErrMsg = sqlite3_malloc64(nErrMsg); if( zErrMsg ){ memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg); } *************** *** 1321,1327 **** sqlite3 *db, /* Database to query */ ShellState *pArg /* Pointer to ShellState */ ){ ! #ifdef SQLITE_ENABLE_STMT_SCANSTATUS int i, k, n, mx; fprintf(pArg->out, "-------- scanstats --------\n"); mx = 0; --- 1329,1338 ---- sqlite3 *db, /* Database to query */ ShellState *pArg /* Pointer to ShellState */ ){ ! #ifndef SQLITE_ENABLE_STMT_SCANSTATUS ! UNUSED_PARAMETER(db); ! UNUSED_PARAMETER(pArg); ! #else int i, k, n, mx; fprintf(pArg->out, "-------- scanstats --------\n"); mx = 0; *************** *** 1427,1434 **** /* Grow the p->aiIndent array as required */ if( iOp>=nAlloc ){ nAlloc += 100; ! p->aiIndent = (int*)sqlite3_realloc(p->aiIndent, nAlloc*sizeof(int)); ! abYield = (int*)sqlite3_realloc(abYield, nAlloc*sizeof(int)); } abYield[iOp] = str_in_array(zOp, azYield); p->aiIndent[iOp] = 0; --- 1438,1445 ---- /* Grow the p->aiIndent array as required */ if( iOp>=nAlloc ){ nAlloc += 100; ! p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int)); ! abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int)); } abYield[iOp] = str_in_array(zOp, azYield); p->aiIndent[iOp] = 0; *************** *** 1545,1551 **** if( xCallback ){ /* allocate space for col name ptr, value ptr, and type */ int nCol = sqlite3_column_count(pStmt); ! void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1); if( !pData ){ rc = SQLITE_NOMEM; }else{ --- 1556,1562 ---- if( xCallback ){ /* allocate space for col name ptr, value ptr, and type */ int nCol = sqlite3_column_count(pStmt); ! void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1); if( !pData ){ rc = SQLITE_NOMEM; }else{ *************** *** 1771,1776 **** --- 1782,1788 ---- static char zHelp[] = ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n" ".bail on|off Stop after hitting an error. Default OFF\n" + ".binary on|off Turn binary output on or off. Default OFF\n" ".clone NEWDB Clone data into NEWDB from the existing database\n" ".databases List names and files of attached databases\n" ".dbinfo ?DB? Show status information about the database\n" *************** *** 1792,1797 **** --- 1804,1810 ---- #ifdef SQLITE_ENABLE_IOTRACE ".iotrace FILE Enable I/O diagnostic logging to FILE\n" #endif + ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT\n" #ifndef SQLITE_OMIT_LOAD_EXTENSION ".load FILE ?ENTRY? Load an extension library\n" #endif *************** *** 1854,1859 **** --- 1867,1873 ---- long nIn; void *pBuf; + UNUSED_PARAMETER(argc); zName = (const char*)sqlite3_value_text(argv[0]); if( zName==0 ) return; in = fopen(zName, "rb"); *************** *** 1861,1867 **** fseek(in, 0, SEEK_END); nIn = ftell(in); rewind(in); ! pBuf = sqlite3_malloc( nIn ); if( pBuf && 1==fread(pBuf, nIn, 1, in) ){ sqlite3_result_blob(context, pBuf, nIn, sqlite3_free); }else{ --- 1875,1881 ---- fseek(in, 0, SEEK_END); nIn = ftell(in); rewind(in); ! pBuf = sqlite3_malloc64( nIn ); if( pBuf && 1==fread(pBuf, nIn, 1, in) ){ sqlite3_result_blob(context, pBuf, nIn, sqlite3_free); }else{ *************** *** 1886,1891 **** --- 1900,1906 ---- sqlite3_int64 rc; const char *zFile; + UNUSED_PARAMETER(argc); zFile = (const char*)sqlite3_value_text(argv[0]); if( zFile==0 ) return; out = fopen(zFile, "wb"); *************** *** 1908,1930 **** if( p->db==0 ){ sqlite3_initialize(); sqlite3_open(p->zDbFilename, &p->db); ! db = p->db; ! if( db && sqlite3_errcode(db)==SQLITE_OK ){ ! sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0, shellstaticFunc, 0, 0); } ! if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){ fprintf(stderr,"Error: unable to open database \"%s\": %s\n", ! p->zDbFilename, sqlite3_errmsg(db)); if( keepAlive ) return; exit(1); } #ifndef SQLITE_OMIT_LOAD_EXTENSION sqlite3_enable_load_extension(p->db, 1); #endif ! sqlite3_create_function(db, "readfile", 1, SQLITE_UTF8, 0, readfileFunc, 0, 0); ! sqlite3_create_function(db, "writefile", 2, SQLITE_UTF8, 0, writefileFunc, 0, 0); } } --- 1923,1945 ---- if( p->db==0 ){ sqlite3_initialize(); sqlite3_open(p->zDbFilename, &p->db); ! globalDb = p->db; ! if( p->db && sqlite3_errcode(p->db)==SQLITE_OK ){ ! sqlite3_create_function(p->db, "shellstatic", 0, SQLITE_UTF8, 0, shellstaticFunc, 0, 0); } ! if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){ fprintf(stderr,"Error: unable to open database \"%s\": %s\n", ! p->zDbFilename, sqlite3_errmsg(p->db)); if( keepAlive ) return; exit(1); } #ifndef SQLITE_OMIT_LOAD_EXTENSION sqlite3_enable_load_extension(p->db, 1); #endif ! sqlite3_create_function(p->db, "readfile", 1, SQLITE_UTF8, 0, readfileFunc, 0, 0); ! sqlite3_create_function(p->db, "writefile", 2, SQLITE_UTF8, 0, writefileFunc, 0, 0); } } *************** *** 1932,1957 **** /* ** Do C-language style dequoting. ** ** \t -> tab ** \n -> newline ** \r -> carriage return ** \" -> " ! ** \NNN -> ascii character NNN in octal ** \\ -> backslash */ static void resolve_backslashes(char *z){ int i, j; char c; while( *z && *z!='\\' ) z++; for(i=j=0; (c = z[i])!=0; i++, j++){ ! if( c=='\\' ){ c = z[++i]; ! if( c=='n' ){ ! c = '\n'; }else if( c=='t' ){ c = '\t'; }else if( c=='r' ){ c = '\r'; }else if( c=='\\' ){ c = '\\'; }else if( c>='0' && c<='7' ){ --- 1947,1990 ---- /* ** Do C-language style dequoting. ** + ** \a -> alarm + ** \b -> backspace ** \t -> tab ** \n -> newline + ** \v -> vertical tab + ** \f -> form feed ** \r -> carriage return + ** \s -> space ** \" -> " ! ** \' -> ' ** \\ -> backslash + ** \NNN -> ascii character NNN in octal */ static void resolve_backslashes(char *z){ int i, j; char c; while( *z && *z!='\\' ) z++; for(i=j=0; (c = z[i])!=0; i++, j++){ ! if( c=='\\' && z[i+1]!=0 ){ c = z[++i]; ! if( c=='a' ){ ! c = '\a'; ! }else if( c=='b' ){ ! c = '\b'; }else if( c=='t' ){ c = '\t'; + }else if( c=='n' ){ + c = '\n'; + }else if( c=='v' ){ + c = '\v'; + }else if( c=='f' ){ + c = '\f'; }else if( c=='r' ){ c = '\r'; + }else if( c=='"' ){ + c = '"'; + }else if( c=='\'' ){ + c = '\''; }else if( c=='\\' ){ c = '\\'; }else if( c>='0' && c<='7' ){ *************** *** 2121,2127 **** static void import_append_char(ImportCtx *p, int c){ if( p->n+1>=p->nAlloc ){ p->nAlloc += p->nAlloc + 100; ! p->z = sqlite3_realloc(p->z, p->nAlloc); if( p->z==0 ){ fprintf(stderr, "out of memory\n"); exit(1); --- 2154,2160 ---- static void import_append_char(ImportCtx *p, int c){ if( p->n+1>=p->nAlloc ){ p->nAlloc += p->nAlloc + 100; ! p->z = sqlite3_realloc64(p->z, p->nAlloc); if( p->z==0 ){ fprintf(stderr, "out of memory\n"); exit(1); *************** *** 2135,2141 **** ** ** + Input comes from p->in. ** + Store results in p->z of length p->n. Space to hold p->z comes ! ** from sqlite3_malloc(). ** + Use p->cSep as the column separator. The default is ",". ** + Use p->rSep as the row separator. The default is "\n". ** + Keep track of the line number in p->nLine. --- 2168,2174 ---- ** ** + Input comes from p->in. ** + Store results in p->z of length p->n. Space to hold p->z comes ! ** from sqlite3_malloc64(). ** + Use p->cSep as the column separator. The default is ",". ** + Use p->rSep as the row separator. The default is "\n". ** + Keep track of the line number in p->nLine. *************** *** 2209,2215 **** ** ** + Input comes from p->in. ** + Store results in p->z of length p->n. Space to hold p->z comes ! ** from sqlite3_malloc(). ** + Use p->cSep as the column separator. The default is "\x1F". ** + Use p->rSep as the row separator. The default is "\x1E". ** + Keep track of the row number in p->nLine. --- 2242,2248 ---- ** ** + Input comes from p->in. ** + Store results in p->z of length p->n. Space to hold p->z comes ! ** from sqlite3_malloc64(). ** + Use p->cSep as the column separator. The default is "\x1F". ** + Use p->rSep as the row separator. The default is "\x1E". ** + Keep track of the row number in p->nLine. *************** *** 2269,2275 **** goto end_data_xfer; } n = sqlite3_column_count(pQuery); ! zInsert = sqlite3_malloc(200 + nTable + n*3); if( zInsert==0 ){ fprintf(stderr, "out of memory\n"); goto end_data_xfer; --- 2302,2308 ---- goto end_data_xfer; } n = sqlite3_column_count(pQuery); ! zInsert = sqlite3_malloc64(200 + nTable + n*3); if( zInsert==0 ){ fprintf(stderr, "out of memory\n"); goto end_data_xfer; *************** *** 2547,2553 **** fprintf(p->out, "%-20s %d\n", "write format:", aHdr[18]); fprintf(p->out, "%-20s %d\n", "read format:", aHdr[19]); fprintf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]); ! for(i=0; iout, "%-20s %u", aField[i].zName, val); --- 2580,2586 ---- fprintf(p->out, "%-20s %d\n", "write format:", aHdr[18]); fprintf(p->out, "%-20s %d\n", "read format:", aHdr[19]); fprintf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]); ! for(i=0; iout, "%-20s %u", aField[i].zName, val); *************** *** 2567,2573 **** }else{ zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb); } ! for(i=0; i=3 && strncmp(azArg[0], "binary", n)==0 ){ + if( nArg==2 ){ + if( booleanValue(azArg[1]) ){ + setBinaryMode(p->out); + }else{ + setTextMode(p->out); + } + }else{ + fprintf(stderr, "Usage: .binary on|off\n"); + rc = 1; + } + }else + /* The undocumented ".breakpoint" command causes a call to the no-op ** routine named test_breakpoint(). */ *************** *** 2986,2992 **** nByte = strlen30(zSql); rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */ ! if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(db))==0 ){ char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable); char cSep = '('; while( xRead(&sCtx) ){ --- 3032,3038 ---- nByte = strlen30(zSql); rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */ ! if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){ char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable); char cSep = '('; while( xRead(&sCtx) ){ *************** *** 3006,3012 **** sqlite3_free(zCreate); if( rc ){ fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable, ! sqlite3_errmsg(db)); sqlite3_free(sCtx.z); xCloser(sCtx.in); return 1; --- 3052,3058 ---- sqlite3_free(zCreate); if( rc ){ fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable, ! sqlite3_errmsg(p->db)); sqlite3_free(sCtx.z); xCloser(sCtx.in); return 1; *************** *** 3016,3022 **** sqlite3_free(zSql); if( rc ){ if (pStmt) sqlite3_finalize(pStmt); ! fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db)); xCloser(sCtx.in); return 1; } --- 3062,3068 ---- sqlite3_free(zSql); if( rc ){ if (pStmt) sqlite3_finalize(pStmt); ! fprintf(stderr,"Error: %s\n", sqlite3_errmsg(p->db)); xCloser(sCtx.in); return 1; } *************** *** 3024,3030 **** sqlite3_finalize(pStmt); pStmt = 0; if( nCol==0 ) return 0; /* no columns, no error */ ! zSql = sqlite3_malloc( nByte*2 + 20 + nCol*2 ); if( zSql==0 ){ fprintf(stderr, "Error: out of memory\n"); xCloser(sCtx.in); --- 3070,3076 ---- sqlite3_finalize(pStmt); pStmt = 0; if( nCol==0 ) return 0; /* no columns, no error */ ! zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 ); if( zSql==0 ){ fprintf(stderr, "Error: out of memory\n"); xCloser(sCtx.in); *************** *** 3041,3053 **** rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); sqlite3_free(zSql); if( rc ){ ! fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db)); if (pStmt) sqlite3_finalize(pStmt); xCloser(sCtx.in); return 1; } ! needCommit = sqlite3_get_autocommit(db); ! if( needCommit ) sqlite3_exec(db, "BEGIN", 0, 0, 0); do{ int startLine = sCtx.nLine; for(i=0; idb, zSql, -1, &pStmt, 0); sqlite3_free(zSql); if( rc ){ ! fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); if (pStmt) sqlite3_finalize(pStmt); xCloser(sCtx.in); return 1; } ! needCommit = sqlite3_get_autocommit(p->db); ! if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0); do{ int startLine = sCtx.nLine; for(i=0; idb)); } } }while( sCtx.cTerm!=EOF ); *************** *** 3094,3100 **** xCloser(sCtx.in); sqlite3_free(sCtx.z); sqlite3_finalize(pStmt); ! if( needCommit ) sqlite3_exec(db, "COMMIT", 0, 0, 0); }else if( c=='i' && (strncmp(azArg[0], "indices", n)==0 --- 3140,3146 ---- xCloser(sCtx.in); sqlite3_free(sCtx.z); sqlite3_finalize(pStmt); ! if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0); }else if( c=='i' && (strncmp(azArg[0], "indices", n)==0 *************** *** 3164,3169 **** --- 3210,3273 ---- } }else #endif + if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){ + static const struct { + const char *zLimitName; /* Name of a limit */ + int limitCode; /* Integer code for that limit */ + } aLimit[] = { + { "length", SQLITE_LIMIT_LENGTH }, + { "sql_length", SQLITE_LIMIT_SQL_LENGTH }, + { "column", SQLITE_LIMIT_COLUMN }, + { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH }, + { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT }, + { "vdbe_op", SQLITE_LIMIT_VDBE_OP }, + { "function_arg", SQLITE_LIMIT_FUNCTION_ARG }, + { "attached", SQLITE_LIMIT_ATTACHED }, + { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH }, + { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER }, + { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH }, + { "worker_threads", SQLITE_LIMIT_WORKER_THREADS }, + }; + int i, n2; + open_db(p, 0); + if( nArg==1 ){ + for(i=0; idb, aLimit[i].limitCode, -1)); + } + }else if( nArg>3 ){ + fprintf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n"); + rc = 1; + goto meta_command_exit; + }else{ + int iLimit = -1; + n2 = strlen30(azArg[1]); + for(i=0; idb, aLimit[iLimit].limitCode, + (int)integerValue(azArg[2])); + } + printf("%20s %d\n", aLimit[iLimit].zLimitName, + sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1)); + } + }else #ifndef SQLITE_OMIT_LOAD_EXTENSION if( c=='l' && strncmp(azArg[0], "load", n)==0 ){ *************** *** 3248,3256 **** const char *zSavedFilename = p->zDbFilename; char *zNewFilename = 0; p->db = 0; ! if( nArg>=2 ){ ! p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]); ! } open_db(p, 1); if( p->db!=0 ){ sqlite3_close(savedDb); --- 3352,3359 ---- const char *zSavedFilename = p->zDbFilename; char *zNewFilename = 0; p->db = 0; ! if( nArg>=2 ) zNewFilename = sqlite3_mprintf("%s", azArg[1]); ! p->zDbFilename = zNewFilename; open_db(p, 1); if( p->db!=0 ){ sqlite3_close(savedDb); *************** *** 3648,3660 **** while( sqlite3_step(pStmt)==SQLITE_ROW ){ if( nRow>=nAlloc ){ char **azNew; ! int n = nAlloc*2 + 10; ! azNew = sqlite3_realloc(azResult, sizeof(azResult[0])*n); if( azNew==0 ){ fprintf(stderr, "Error: out of memory\n"); break; } ! nAlloc = n; azResult = azNew; } azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0)); --- 3751,3763 ---- while( sqlite3_step(pStmt)==SQLITE_ROW ){ if( nRow>=nAlloc ){ char **azNew; ! int n2 = nAlloc*2 + 10; ! azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2); if( azNew==0 ){ fprintf(stderr, "Error: out of memory\n"); break; } ! nAlloc = n2; azResult = azNew; } azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0)); *************** *** 3707,3721 **** { "imposter", SQLITE_TESTCTRL_IMPOSTER }, }; int testctrl = -1; ! int rc = 0; ! int i, n; open_db(p, 0); /* convert testctrl text option to value. allow any unique prefix ** of the option name, or a numerical value. */ ! n = strlen30(azArg[1]); ! for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){ ! if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){ if( testctrl<0 ){ testctrl = aCtrl[i].ctrlCode; }else{ --- 3810,3824 ---- { "imposter", SQLITE_TESTCTRL_IMPOSTER }, }; int testctrl = -1; ! int rc2 = 0; ! int i, n2; open_db(p, 0); /* convert testctrl text option to value. allow any unique prefix ** of the option name, or a numerical value. */ ! n2 = strlen30(azArg[1]); ! for(i=0; idb, opt); ! fprintf(p->out, "%d (0x%08x)\n", rc, rc); } else { fprintf(stderr,"Error: testctrl %s takes a single int option\n", azArg[1]); --- 3839,3846 ---- case SQLITE_TESTCTRL_RESERVE: if( nArg==3 ){ int opt = (int)strtol(azArg[2], 0, 0); ! rc2 = sqlite3_test_control(testctrl, p->db, opt); ! fprintf(p->out, "%d (0x%08x)\n", rc2, rc2); } else { fprintf(stderr,"Error: testctrl %s takes a single int option\n", azArg[1]); *************** *** 3750,3757 **** case SQLITE_TESTCTRL_PRNG_RESET: case SQLITE_TESTCTRL_BYTEORDER: if( nArg==2 ){ ! rc = sqlite3_test_control(testctrl); ! fprintf(p->out, "%d (0x%08x)\n", rc, rc); } else { fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]); } --- 3853,3860 ---- case SQLITE_TESTCTRL_PRNG_RESET: case SQLITE_TESTCTRL_BYTEORDER: if( nArg==2 ){ ! rc2 = sqlite3_test_control(testctrl); ! fprintf(p->out, "%d (0x%08x)\n", rc2, rc2); } else { fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]); } *************** *** 3761,3768 **** case SQLITE_TESTCTRL_PENDING_BYTE: if( nArg==3 ){ unsigned int opt = (unsigned int)integerValue(azArg[2]); ! rc = sqlite3_test_control(testctrl, opt); ! fprintf(p->out, "%d (0x%08x)\n", rc, rc); } else { fprintf(stderr,"Error: testctrl %s takes a single unsigned" " int option\n", azArg[1]); --- 3864,3871 ---- case SQLITE_TESTCTRL_PENDING_BYTE: if( nArg==3 ){ unsigned int opt = (unsigned int)integerValue(azArg[2]); ! rc2 = sqlite3_test_control(testctrl, opt); ! fprintf(p->out, "%d (0x%08x)\n", rc2, rc2); } else { fprintf(stderr,"Error: testctrl %s takes a single unsigned" " int option\n", azArg[1]); *************** *** 3775,3782 **** case SQLITE_TESTCTRL_NEVER_CORRUPT: if( nArg==3 ){ int opt = booleanValue(azArg[2]); ! rc = sqlite3_test_control(testctrl, opt); ! fprintf(p->out, "%d (0x%08x)\n", rc, rc); } else { fprintf(stderr,"Error: testctrl %s takes a single int option\n", azArg[1]); --- 3878,3885 ---- case SQLITE_TESTCTRL_NEVER_CORRUPT: if( nArg==3 ){ int opt = booleanValue(azArg[2]); ! rc2 = sqlite3_test_control(testctrl, opt); ! fprintf(p->out, "%d (0x%08x)\n", rc2, rc2); } else { fprintf(stderr,"Error: testctrl %s takes a single int option\n", azArg[1]); *************** *** 3788,3795 **** case SQLITE_TESTCTRL_ISKEYWORD: if( nArg==3 ){ const char *opt = azArg[2]; ! rc = sqlite3_test_control(testctrl, opt); ! fprintf(p->out, "%d (0x%08x)\n", rc, rc); } else { fprintf(stderr,"Error: testctrl %s takes a single char * option\n", azArg[1]); --- 3891,3898 ---- case SQLITE_TESTCTRL_ISKEYWORD: if( nArg==3 ){ const char *opt = azArg[2]; ! rc2 = sqlite3_test_control(testctrl, opt); ! fprintf(p->out, "%d (0x%08x)\n", rc2, rc2); } else { fprintf(stderr,"Error: testctrl %s takes a single char * option\n", azArg[1]); *************** *** 3799,3809 **** case SQLITE_TESTCTRL_IMPOSTER: if( nArg==5 ){ ! rc = sqlite3_test_control(testctrl, p->db, azArg[2], integerValue(azArg[3]), integerValue(azArg[4])); ! fprintf(p->out, "%d (0x%08x)\n", rc, rc); }else{ fprintf(stderr,"Usage: .testctrl imposter dbName onoff tnum\n"); } --- 3902,3912 ---- case SQLITE_TESTCTRL_IMPOSTER: if( nArg==5 ){ ! rc2 = sqlite3_test_control(testctrl, p->db, azArg[2], integerValue(azArg[3]), integerValue(azArg[4])); ! fprintf(p->out, "%d (0x%08x)\n", rc2, rc2); }else{ fprintf(stderr,"Usage: .testctrl imposter dbName onoff tnum\n"); } *************** *** 4111,4116 **** --- 4214,4220 ---- && sqlite3_complete(zSql) ){ p->cnt = 0; open_db(p, 0); + if( p->backslashOn ) resolve_backslashes(zSql); BEGIN_TIMER; rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg); END_TIMER; *************** *** 4577,4582 **** --- 4681,4693 ---- data.statsOn = 1; }else if( strcmp(z,"-scanstats")==0 ){ data.scanstatsOn = 1; + }else if( strcmp(z,"-backslash")==0 ){ + /* Undocumented command-line option: -backslash + ** Causes C-style backslash escapes to be evaluated in SQL statements + ** prior to sending the SQL into SQLite. Useful for injecting + ** crazy bytes in the middle of SQL statements for testing and debugging. + */ + data.backslashOn = 1; }else if( strcmp(z,"-bail")==0 ){ bail_on_error = 1; }else if( strcmp(z,"-version")==0 ){ *************** *** 4683,4689 **** sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome); } } ! if( zHistory ) shell_read_history(zHistory); rc = process_input(&data, 0); if( zHistory ){ shell_stifle_history(100); --- 4794,4800 ---- sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome); } } ! if( zHistory ){ shell_read_history(zHistory); } rc = process_input(&data, 0); if( zHistory ){ shell_stifle_history(100);