Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(42)

Side by Side Diff: third_party/sqlite/src/src/shell.c

Issue 6990047: Import SQLite 3.7.6.3. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « third_party/sqlite/src/src/select.c ('k') | third_party/sqlite/src/src/sqlite.h.in » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 ** 2001 September 15 2 ** 2001 September 15
3 ** 3 **
4 ** The author disclaims copyright to this source code. In place of 4 ** The author disclaims copyright to this source code. In place of
5 ** a legal notice, here is a blessing: 5 ** a legal notice, here is a blessing:
6 ** 6 **
7 ** May you do good and not evil. 7 ** May you do good and not evil.
8 ** May you find forgiveness for yourself and forgive others. 8 ** May you find forgiveness for yourself and forgive others.
9 ** May you share freely, never taking more than you give. 9 ** May you share freely, never taking more than you give.
10 ** 10 **
11 ************************************************************************* 11 *************************************************************************
12 ** This file contains code to implement the "sqlite" command line 12 ** This file contains code to implement the "sqlite" command line
13 ** utility for accessing SQLite databases. 13 ** utility for accessing SQLite databases.
14 **
15 ** $Id: shell.c,v 1.210 2009/05/31 17:16:10 drh Exp $
16 */ 14 */
17 #if defined(_WIN32) || defined(WIN32) 15 #if defined(_WIN32) || defined(WIN32)
18 /* This needs to come before any includes for MSVC compiler */ 16 /* This needs to come before any includes for MSVC compiler */
19 #define _CRT_SECURE_NO_WARNINGS 17 #define _CRT_SECURE_NO_WARNINGS
20 #endif 18 #endif
21 19
22 #include <stdlib.h> 20 #include <stdlib.h>
23 #include <string.h> 21 #include <string.h>
24 #include <stdio.h> 22 #include <stdio.h>
25 #include <assert.h> 23 #include <assert.h>
26 #include "sqlite3.h" 24 #include "sqlite3.h"
27 #include <ctype.h> 25 #include <ctype.h>
28 #include <stdarg.h> 26 #include <stdarg.h>
29 27
30 #if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__) 28 #if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__)
31 # include <signal.h> 29 # include <signal.h>
32 # if !defined(__RTP__) && !defined(_WRS_KERNEL) 30 # if !defined(__RTP__) && !defined(_WRS_KERNEL)
33 # include <pwd.h> 31 # include <pwd.h>
34 # endif 32 # endif
35 # include <unistd.h> 33 # include <unistd.h>
36 # include <sys/types.h> 34 # include <sys/types.h>
37 #endif 35 #endif
38 36
39 #ifdef __OS2__ 37 #ifdef __OS2__
40 # include <unistd.h> 38 # include <unistd.h>
41 #endif 39 #endif
42 40
41 #ifdef HAVE_EDITLINE
42 # include <editline/editline.h>
43 #endif
43 #if defined(HAVE_READLINE) && HAVE_READLINE==1 44 #if defined(HAVE_READLINE) && HAVE_READLINE==1
44 # include <readline/readline.h> 45 # include <readline/readline.h>
45 # include <readline/history.h> 46 # include <readline/history.h>
46 #else 47 #endif
48 #if !defined(HAVE_EDITLINE) && (!defined(HAVE_READLINE) || HAVE_READLINE!=1)
47 # define readline(p) local_getline(p,stdin) 49 # define readline(p) local_getline(p,stdin)
48 # define add_history(X) 50 # define add_history(X)
49 # define read_history(X) 51 # define read_history(X)
50 # define write_history(X) 52 # define write_history(X)
51 # define stifle_history(X) 53 # define stifle_history(X)
52 #endif 54 #endif
53 55
54 #if defined(_WIN32) || defined(WIN32) 56 #if defined(_WIN32) || defined(WIN32)
55 # include <io.h> 57 # include <io.h>
56 #define isatty(h) _isatty(h) 58 #define isatty(h) _isatty(h)
57 #define access(f,m) _access((f),(m)) 59 #define access(f,m) _access((f),(m))
58 #else 60 #else
59 /* Make sure isatty() has a prototype. 61 /* Make sure isatty() has a prototype.
60 */ 62 */
61 extern int isatty(); 63 extern int isatty();
62 #endif 64 #endif
63 65
64 #if defined(_WIN32_WCE) 66 #if defined(_WIN32_WCE)
65 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty() 67 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
66 * thus we always assume that we have a console. That can be 68 * thus we always assume that we have a console. That can be
67 * overridden with the -batch command line option. 69 * overridden with the -batch command line option.
68 */ 70 */
69 #define isatty(x) 1 71 #define isatty(x) 1
70 #endif 72 #endif
71 73
74 /* True if the timer is enabled */
75 static int enableTimer = 0;
76
72 #if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__) && !defined(__RTP__ ) && !defined(_WRS_KERNEL) 77 #if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__) && !defined(__RTP__ ) && !defined(_WRS_KERNEL)
73 #include <sys/time.h> 78 #include <sys/time.h>
74 #include <sys/resource.h> 79 #include <sys/resource.h>
75 80
76 /* Saved resource information for the beginning of an operation */ 81 /* Saved resource information for the beginning of an operation */
77 static struct rusage sBegin; 82 static struct rusage sBegin;
78 83
79 /* True if the timer is enabled */
80 static int enableTimer = 0;
81
82 /* 84 /*
83 ** Begin timing an operation 85 ** Begin timing an operation
84 */ 86 */
85 static void beginTimer(void){ 87 static void beginTimer(void){
86 if( enableTimer ){ 88 if( enableTimer ){
87 getrusage(RUSAGE_SELF, &sBegin); 89 getrusage(RUSAGE_SELF, &sBegin);
88 } 90 }
89 } 91 }
90 92
91 /* Return the difference of two time_structs in seconds */ 93 /* Return the difference of two time_structs in seconds */
92 static double timeDiff(struct timeval *pStart, struct timeval *pEnd){ 94 static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
93 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 + 95 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
94 (double)(pEnd->tv_sec - pStart->tv_sec); 96 (double)(pEnd->tv_sec - pStart->tv_sec);
95 } 97 }
96 98
97 /* 99 /*
98 ** Print the timing results. 100 ** Print the timing results.
99 */ 101 */
100 static void endTimer(void){ 102 static void endTimer(void){
101 if( enableTimer ){ 103 if( enableTimer ){
102 struct rusage sEnd; 104 struct rusage sEnd;
103 getrusage(RUSAGE_SELF, &sEnd); 105 getrusage(RUSAGE_SELF, &sEnd);
104 printf("CPU Time: user %f sys %f\n", 106 printf("CPU Time: user %f sys %f\n",
105 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime), 107 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
106 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime)); 108 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
107 } 109 }
108 } 110 }
111
109 #define BEGIN_TIMER beginTimer() 112 #define BEGIN_TIMER beginTimer()
110 #define END_TIMER endTimer() 113 #define END_TIMER endTimer()
111 #define HAS_TIMER 1 114 #define HAS_TIMER 1
115
116 #elif (defined(_WIN32) || defined(WIN32))
117
118 #include <windows.h>
119
120 /* Saved resource information for the beginning of an operation */
121 static HANDLE hProcess;
122 static FILETIME ftKernelBegin;
123 static FILETIME ftUserBegin;
124 typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME);
125 static GETPROCTIMES getProcessTimesAddr = NULL;
126
127 /*
128 ** Check to see if we have timer support. Return 1 if necessary
129 ** support found (or found previously).
130 */
131 static int hasTimer(void){
132 if( getProcessTimesAddr ){
133 return 1;
134 } else {
135 /* GetProcessTimes() isn't supported in WIN95 and some other Windows version s.
136 ** See if the version we are running on has it, and if it does, save off
137 ** a pointer to it and the current process handle.
138 */
139 hProcess = GetCurrentProcess();
140 if( hProcess ){
141 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
142 if( NULL != hinstLib ){
143 getProcessTimesAddr = (GETPROCTIMES) GetProcAddress(hinstLib, "GetProces sTimes");
144 if( NULL != getProcessTimesAddr ){
145 return 1;
146 }
147 FreeLibrary(hinstLib);
148 }
149 }
150 }
151 return 0;
152 }
153
154 /*
155 ** Begin timing an operation
156 */
157 static void beginTimer(void){
158 if( enableTimer && getProcessTimesAddr ){
159 FILETIME ftCreation, ftExit;
160 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelBegin, &ftUserB egin);
161 }
162 }
163
164 /* Return the difference of two FILETIME structs in seconds */
165 static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
166 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
167 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
168 return (double) ((i64End - i64Start) / 10000000.0);
169 }
170
171 /*
172 ** Print the timing results.
173 */
174 static void endTimer(void){
175 if( enableTimer && getProcessTimesAddr){
176 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
177 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelEnd, &ftUserEnd );
178 printf("CPU Time: user %f sys %f\n",
179 timeDiff(&ftUserBegin, &ftUserEnd),
180 timeDiff(&ftKernelBegin, &ftKernelEnd));
181 }
182 }
183
184 #define BEGIN_TIMER beginTimer()
185 #define END_TIMER endTimer()
186 #define HAS_TIMER hasTimer()
187
112 #else 188 #else
113 #define BEGIN_TIMER 189 #define BEGIN_TIMER
114 #define END_TIMER 190 #define END_TIMER
115 #define HAS_TIMER 0 191 #define HAS_TIMER 0
116 #endif 192 #endif
117 193
118 /* 194 /*
119 ** Used to prevent warnings about unused parameters 195 ** Used to prevent warnings about unused parameters
120 */ 196 */
121 #define UNUSED_PARAMETER(x) (void)(x) 197 #define UNUSED_PARAMETER(x) (void)(x)
122 198
123
124 /**************************************************************************
125 ***************************************************************************
126 ** Begin genfkey logic.
127 */
128 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined SQLITE_OMIT_SUBQUERY
129
130 #define GENFKEY_ERROR 1
131 #define GENFKEY_DROPTRIGGER 2
132 #define GENFKEY_CREATETRIGGER 3
133 static int genfkey_create_triggers(sqlite3 *, const char *, void *,
134 int (*)(void *, int, const char *)
135 );
136
137 struct GenfkeyCb {
138 void *pCtx;
139 int eType;
140 int (*xData)(void *, int, const char *);
141 };
142 typedef struct GenfkeyCb GenfkeyCb;
143
144 /* The code in this file defines a sqlite3 virtual-table module that
145 ** provides a read-only view of the current database schema. There is one
146 ** row in the schema table for each column in the database schema.
147 */
148 #define SCHEMA \
149 "CREATE TABLE x(" \
150 "database," /* Name of database (i.e. main, temp etc.) */ \
151 "tablename," /* Name of table */ \
152 "cid," /* Column number (from left-to-right, 0 upward) */ \
153 "name," /* Column name */ \
154 "type," /* Specified type (i.e. VARCHAR(32)) */ \
155 "not_null," /* Boolean. True if NOT NULL was specified */ \
156 "dflt_value," /* Default value for this column */ \
157 "pk" /* True if this column is part of the primary key */ \
158 ")"
159
160 #define SCHEMA2 \
161 "CREATE TABLE x(" \
162 "database," /* Name of database (i.e. main, temp etc.) */ \
163 "from_tbl," /* Name of table */ \
164 "fkid," \
165 "seq," \
166 "to_tbl," \
167 "from_col," \
168 "to_col," \
169 "on_update," \
170 "on_delete," \
171 "match" \
172 ")"
173
174 #define SCHEMA3 \
175 "CREATE TABLE x(" \
176 "database," /* Name of database (i.e. main, temp etc.) */ \
177 "tablename," /* Name of table */ \
178 "seq," \
179 "name," \
180 "isunique" \
181 ")"
182
183 #define SCHEMA4 \
184 "CREATE TABLE x(" \
185 "database," /* Name of database (i.e. main, temp etc.) */ \
186 "indexname," /* Name of table */ \
187 "seqno," \
188 "cid," \
189 "name" \
190 ")"
191
192 #define SCHEMA5 \
193 "CREATE TABLE x(" \
194 "database," /* Name of database (i.e. main, temp etc.) */ \
195 "triggername," /* Name of trigger */ \
196 "dummy" /* Unused */ \
197 ")"
198
199 typedef struct SchemaTable SchemaTable;
200 struct SchemaTable {
201 const char *zName;
202 const char *zObject;
203 const char *zPragma;
204 const char *zSchema;
205 } aSchemaTable[] = {
206 { "table_info", "table", "PRAGMA %Q.table_info(%Q)", SCHEMA },
207 { "foreign_key_list", "table", "PRAGMA %Q.foreign_key_list(%Q)", SCHEMA2 },
208 { "index_list", "table", "PRAGMA %Q.index_list(%Q)", SCHEMA3 },
209 { "index_info", "index", "PRAGMA %Q.index_info(%Q)", SCHEMA4 },
210 { "trigger_list", "trigger", "SELECT 1", SCHEMA5 },
211 { 0, 0, 0, 0 }
212 };
213
214 typedef struct schema_vtab schema_vtab;
215 typedef struct schema_cursor schema_cursor;
216
217 /* A schema table object */
218 struct schema_vtab {
219 sqlite3_vtab base;
220 sqlite3 *db;
221 SchemaTable *pType;
222 };
223
224 /* A schema table cursor object */
225 struct schema_cursor {
226 sqlite3_vtab_cursor base;
227 sqlite3_stmt *pDbList;
228 sqlite3_stmt *pTableList;
229 sqlite3_stmt *pColumnList;
230 int rowid;
231 };
232
233 /*
234 ** Table destructor for the schema module.
235 */
236 static int schemaDestroy(sqlite3_vtab *pVtab){
237 sqlite3_free(pVtab);
238 return 0;
239 }
240
241 /*
242 ** Table constructor for the schema module.
243 */
244 static int schemaCreate(
245 sqlite3 *db,
246 void *pAux,
247 int argc, const char *const*argv,
248 sqlite3_vtab **ppVtab,
249 char **pzErr
250 ){
251 int rc = SQLITE_NOMEM;
252 schema_vtab *pVtab;
253 SchemaTable *pType = &aSchemaTable[0];
254
255 UNUSED_PARAMETER(pzErr);
256 if( argc>3 ){
257 int i;
258 pType = 0;
259 for(i=0; aSchemaTable[i].zName; i++){
260 if( 0==strcmp(argv[3], aSchemaTable[i].zName) ){
261 pType = &aSchemaTable[i];
262 }
263 }
264 if( !pType ){
265 return SQLITE_ERROR;
266 }
267 }
268
269 pVtab = sqlite3_malloc(sizeof(schema_vtab));
270 if( pVtab ){
271 memset(pVtab, 0, sizeof(schema_vtab));
272 pVtab->db = (sqlite3 *)pAux;
273 pVtab->pType = pType;
274 rc = sqlite3_declare_vtab(db, pType->zSchema);
275 }
276 *ppVtab = (sqlite3_vtab *)pVtab;
277 return rc;
278 }
279
280 /*
281 ** Open a new cursor on the schema table.
282 */
283 static int schemaOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
284 int rc = SQLITE_NOMEM;
285 schema_cursor *pCur;
286 UNUSED_PARAMETER(pVTab);
287 pCur = sqlite3_malloc(sizeof(schema_cursor));
288 if( pCur ){
289 memset(pCur, 0, sizeof(schema_cursor));
290 *ppCursor = (sqlite3_vtab_cursor *)pCur;
291 rc = SQLITE_OK;
292 }
293 return rc;
294 }
295
296 /*
297 ** Close a schema table cursor.
298 */
299 static int schemaClose(sqlite3_vtab_cursor *cur){
300 schema_cursor *pCur = (schema_cursor *)cur;
301 sqlite3_finalize(pCur->pDbList);
302 sqlite3_finalize(pCur->pTableList);
303 sqlite3_finalize(pCur->pColumnList);
304 sqlite3_free(pCur);
305 return SQLITE_OK;
306 }
307
308 static void columnToResult(sqlite3_context *ctx, sqlite3_stmt *pStmt, int iCol){
309 switch( sqlite3_column_type(pStmt, iCol) ){
310 case SQLITE_NULL:
311 sqlite3_result_null(ctx);
312 break;
313 case SQLITE_INTEGER:
314 sqlite3_result_int64(ctx, sqlite3_column_int64(pStmt, iCol));
315 break;
316 case SQLITE_FLOAT:
317 sqlite3_result_double(ctx, sqlite3_column_double(pStmt, iCol));
318 break;
319 case SQLITE_TEXT: {
320 const char *z = (const char *)sqlite3_column_text(pStmt, iCol);
321 sqlite3_result_text(ctx, z, -1, SQLITE_TRANSIENT);
322 break;
323 }
324 }
325 }
326
327 /*
328 ** Retrieve a column of data.
329 */
330 static int schemaColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){
331 schema_cursor *pCur = (schema_cursor *)cur;
332 switch( i ){
333 case 0:
334 columnToResult(ctx, pCur->pDbList, 1);
335 break;
336 case 1:
337 columnToResult(ctx, pCur->pTableList, 0);
338 break;
339 default:
340 columnToResult(ctx, pCur->pColumnList, i-2);
341 break;
342 }
343 return SQLITE_OK;
344 }
345
346 /*
347 ** Retrieve the current rowid.
348 */
349 static int schemaRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
350 schema_cursor *pCur = (schema_cursor *)cur;
351 *pRowid = pCur->rowid;
352 return SQLITE_OK;
353 }
354
355 static int finalize(sqlite3_stmt **ppStmt){
356 int rc = sqlite3_finalize(*ppStmt);
357 *ppStmt = 0;
358 return rc;
359 }
360
361 static int schemaEof(sqlite3_vtab_cursor *cur){
362 schema_cursor *pCur = (schema_cursor *)cur;
363 return (pCur->pDbList ? 0 : 1);
364 }
365
366 /*
367 ** Advance the cursor to the next row.
368 */
369 static int schemaNext(sqlite3_vtab_cursor *cur){
370 int rc = SQLITE_OK;
371 schema_cursor *pCur = (schema_cursor *)cur;
372 schema_vtab *pVtab = (schema_vtab *)(cur->pVtab);
373 char *zSql = 0;
374
375 while( !pCur->pColumnList || SQLITE_ROW!=sqlite3_step(pCur->pColumnList) ){
376 if( SQLITE_OK!=(rc = finalize(&pCur->pColumnList)) ) goto next_exit;
377
378 while( !pCur->pTableList || SQLITE_ROW!=sqlite3_step(pCur->pTableList) ){
379 if( SQLITE_OK!=(rc = finalize(&pCur->pTableList)) ) goto next_exit;
380
381 assert(pCur->pDbList);
382 while( SQLITE_ROW!=sqlite3_step(pCur->pDbList) ){
383 rc = finalize(&pCur->pDbList);
384 goto next_exit;
385 }
386
387 /* Set zSql to the SQL to pull the list of tables from the
388 ** sqlite_master (or sqlite_temp_master) table of the database
389 ** identfied by the row pointed to by the SQL statement pCur->pDbList
390 ** (iterating through a "PRAGMA database_list;" statement).
391 */
392 if( sqlite3_column_int(pCur->pDbList, 0)==1 ){
393 zSql = sqlite3_mprintf(
394 "SELECT name FROM sqlite_temp_master WHERE type=%Q",
395 pVtab->pType->zObject
396 );
397 }else{
398 sqlite3_stmt *pDbList = pCur->pDbList;
399 zSql = sqlite3_mprintf(
400 "SELECT name FROM %Q.sqlite_master WHERE type=%Q",
401 sqlite3_column_text(pDbList, 1), pVtab->pType->zObject
402 );
403 }
404 if( !zSql ){
405 rc = SQLITE_NOMEM;
406 goto next_exit;
407 }
408
409 rc = sqlite3_prepare(pVtab->db, zSql, -1, &pCur->pTableList, 0);
410 sqlite3_free(zSql);
411 if( rc!=SQLITE_OK ) goto next_exit;
412 }
413
414 /* Set zSql to the SQL to the table_info pragma for the table currently
415 ** identified by the rows pointed to by statements pCur->pDbList and
416 ** pCur->pTableList.
417 */
418 zSql = sqlite3_mprintf(pVtab->pType->zPragma,
419 sqlite3_column_text(pCur->pDbList, 1),
420 sqlite3_column_text(pCur->pTableList, 0)
421 );
422
423 if( !zSql ){
424 rc = SQLITE_NOMEM;
425 goto next_exit;
426 }
427 rc = sqlite3_prepare(pVtab->db, zSql, -1, &pCur->pColumnList, 0);
428 sqlite3_free(zSql);
429 if( rc!=SQLITE_OK ) goto next_exit;
430 }
431 pCur->rowid++;
432
433 next_exit:
434 /* TODO: Handle rc */
435 return rc;
436 }
437
438 /*
439 ** Reset a schema table cursor.
440 */
441 static int schemaFilter(
442 sqlite3_vtab_cursor *pVtabCursor,
443 int idxNum, const char *idxStr,
444 int argc, sqlite3_value **argv
445 ){
446 int rc;
447 schema_vtab *pVtab = (schema_vtab *)(pVtabCursor->pVtab);
448 schema_cursor *pCur = (schema_cursor *)pVtabCursor;
449 UNUSED_PARAMETER(idxNum);
450 UNUSED_PARAMETER(idxStr);
451 UNUSED_PARAMETER(argc);
452 UNUSED_PARAMETER(argv);
453 pCur->rowid = 0;
454 finalize(&pCur->pTableList);
455 finalize(&pCur->pColumnList);
456 finalize(&pCur->pDbList);
457 rc = sqlite3_prepare(pVtab->db,"SELECT 0, 'main'", -1, &pCur->pDbList, 0);
458 return (rc==SQLITE_OK ? schemaNext(pVtabCursor) : rc);
459 }
460
461 /*
462 ** Analyse the WHERE condition.
463 */
464 static int schemaBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
465 UNUSED_PARAMETER(tab);
466 UNUSED_PARAMETER(pIdxInfo);
467 return SQLITE_OK;
468 }
469
470 /*
471 ** A virtual table module that merely echos method calls into TCL
472 ** variables.
473 */
474 static sqlite3_module schemaModule = {
475 0, /* iVersion */
476 schemaCreate,
477 schemaCreate,
478 schemaBestIndex,
479 schemaDestroy,
480 schemaDestroy,
481 schemaOpen, /* xOpen - open a cursor */
482 schemaClose, /* xClose - close a cursor */
483 schemaFilter, /* xFilter - configure scan constraints */
484 schemaNext, /* xNext - advance a cursor */
485 schemaEof, /* xEof */
486 schemaColumn, /* xColumn - read data */
487 schemaRowid, /* xRowid - read data */
488 0, /* xUpdate */
489 0, /* xBegin */
490 0, /* xSync */
491 0, /* xCommit */
492 0, /* xRollback */
493 0, /* xFindMethod */
494 0, /* xRename */
495 };
496
497 /*
498 ** Extension load function.
499 */
500 static int installSchemaModule(sqlite3 *db, sqlite3 *sdb){
501 sqlite3_create_module(db, "schema", &schemaModule, (void *)sdb);
502 return 0;
503 }
504
505 /*
506 ** sj(zValue, zJoin)
507 **
508 ** The following block contains the implementation of an aggregate
509 ** function that returns a string. Each time the function is stepped,
510 ** it appends data to an internal buffer. When the aggregate is finalized,
511 ** the contents of the buffer are returned.
512 **
513 ** The first time the aggregate is stepped the buffer is set to a copy
514 ** of the first argument. The second time and subsequent times it is
515 ** stepped a copy of the second argument is appended to the buffer, then
516 ** a copy of the first.
517 **
518 ** Example:
519 **
520 ** INSERT INTO t1(a) VALUES('1');
521 ** INSERT INTO t1(a) VALUES('2');
522 ** INSERT INTO t1(a) VALUES('3');
523 ** SELECT sj(a, ', ') FROM t1;
524 **
525 ** => "1, 2, 3"
526 **
527 */
528 struct StrBuffer {
529 char *zBuf;
530 };
531 typedef struct StrBuffer StrBuffer;
532 static void joinFinalize(sqlite3_context *context){
533 StrBuffer *p;
534 p = (StrBuffer *)sqlite3_aggregate_context(context, sizeof(StrBuffer));
535 sqlite3_result_text(context, p->zBuf, -1, SQLITE_TRANSIENT);
536 sqlite3_free(p->zBuf);
537 }
538 static void joinStep(
539 sqlite3_context *context,
540 int argc,
541 sqlite3_value **argv
542 ){
543 StrBuffer *p;
544 UNUSED_PARAMETER(argc);
545 p = (StrBuffer *)sqlite3_aggregate_context(context, sizeof(StrBuffer));
546 if( p->zBuf==0 ){
547 p->zBuf = sqlite3_mprintf("%s", sqlite3_value_text(argv[0]));
548 }else{
549 char *zTmp = p->zBuf;
550 p->zBuf = sqlite3_mprintf("%s%s%s",
551 zTmp, sqlite3_value_text(argv[1]), sqlite3_value_text(argv[0])
552 );
553 sqlite3_free(zTmp);
554 }
555 }
556
557 /*
558 ** dq(zString)
559 **
560 ** This scalar function accepts a single argument and interprets it as
561 ** a text value. The return value is the argument enclosed in double
562 ** quotes. If any double quote characters are present in the argument,
563 ** these are escaped.
564 **
565 ** dq('the raven "Nevermore."') == '"the raven ""Nevermore."""'
566 */
567 static void doublequote(
568 sqlite3_context *context,
569 int argc,
570 sqlite3_value **argv
571 ){
572 int ii;
573 char *zOut;
574 char *zCsr;
575 const char *zIn = (const char *)sqlite3_value_text(argv[0]);
576 int nIn = sqlite3_value_bytes(argv[0]);
577
578 UNUSED_PARAMETER(argc);
579 zOut = sqlite3_malloc(nIn*2+3);
580 zCsr = zOut;
581 *zCsr++ = '"';
582 for(ii=0; ii<nIn; ii++){
583 *zCsr++ = zIn[ii];
584 if( zIn[ii]=='"' ){
585 *zCsr++ = '"';
586 }
587 }
588 *zCsr++ = '"';
589 *zCsr++ = '\0';
590
591 sqlite3_result_text(context, zOut, -1, SQLITE_TRANSIENT);
592 sqlite3_free(zOut);
593 }
594
595 /*
596 ** multireplace(zString, zSearch1, zReplace1, ...)
597 */
598 static void multireplace(
599 sqlite3_context *context,
600 int argc,
601 sqlite3_value **argv
602 ){
603 int i = 0;
604 char *zOut = 0;
605 int nOut = 0;
606 int nMalloc = 0;
607 const char *zIn = (const char *)sqlite3_value_text(argv[0]);
608 int nIn = sqlite3_value_bytes(argv[0]);
609
610 while( i<nIn ){
611 const char *zCopy = &zIn[i];
612 int nCopy = 1;
613 int nReplace = 1;
614 int j;
615 for(j=1; j<(argc-1); j+=2){
616 const char *z = (const char *)sqlite3_value_text(argv[j]);
617 int n = sqlite3_value_bytes(argv[j]);
618 if( n<=(nIn-i) && 0==strncmp(z, zCopy, n) ){
619 zCopy = (const char *)sqlite3_value_text(argv[j+1]);
620 nCopy = sqlite3_value_bytes(argv[j+1]);
621 nReplace = n;
622 break;
623 }
624 }
625 if( (nOut+nCopy)>nMalloc ){
626 char *zNew;
627 nMalloc = 16 + (nOut+nCopy)*2;
628 zNew = (char*)sqlite3_realloc(zOut, nMalloc);
629 if( zNew==0 ){
630 sqlite3_result_error_nomem(context);
631 return;
632 }else{
633 zOut = zNew;
634 }
635 }
636 assert( nMalloc>=(nOut+nCopy) );
637 memcpy(&zOut[nOut], zCopy, nCopy);
638 i += nReplace;
639 nOut += nCopy;
640 }
641
642 sqlite3_result_text(context, zOut, nOut, SQLITE_TRANSIENT);
643 sqlite3_free(zOut);
644 }
645
646 /*
647 ** A callback for sqlite3_exec() invokes the callback specified by the
648 ** GenfkeyCb structure pointed to by the void* passed as the first argument.
649 */
650 static int invokeCallback(void *p, int nArg, char **azArg, char **azCol){
651 GenfkeyCb *pCb = (GenfkeyCb *)p;
652 UNUSED_PARAMETER(nArg);
653 UNUSED_PARAMETER(azCol);
654 return pCb->xData(pCb->pCtx, pCb->eType, azArg[0]);
655 }
656
657 int detectSchemaProblem(
658 sqlite3 *db, /* Database connection */
659 const char *zMessage, /* English language error message */
660 const char *zSql, /* SQL statement to run */
661 GenfkeyCb *pCb
662 ){
663 sqlite3_stmt *pStmt;
664 int rc;
665 rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0);
666 if( rc!=SQLITE_OK ){
667 return rc;
668 }
669 while( SQLITE_ROW==sqlite3_step(pStmt) ){
670 char *zDel;
671 int iFk = sqlite3_column_int(pStmt, 0);
672 const char *zTab = (const char *)sqlite3_column_text(pStmt, 1);
673 zDel = sqlite3_mprintf("Error in table %s: %s", zTab, zMessage);
674 rc = pCb->xData(pCb->pCtx, pCb->eType, zDel);
675 sqlite3_free(zDel);
676 if( rc!=SQLITE_OK ) return rc;
677 zDel = sqlite3_mprintf(
678 "DELETE FROM temp.fkey WHERE from_tbl = %Q AND fkid = %d"
679 , zTab, iFk
680 );
681 sqlite3_exec(db, zDel, 0, 0, 0);
682 sqlite3_free(zDel);
683 }
684 sqlite3_finalize(pStmt);
685 return SQLITE_OK;
686 }
687
688 /*
689 ** Create and populate temporary table "fkey".
690 */
691 static int populateTempTable(sqlite3 *db, GenfkeyCb *pCallback){
692 int rc;
693
694 rc = sqlite3_exec(db,
695 "CREATE VIRTUAL TABLE temp.v_fkey USING schema(foreign_key_list);"
696 "CREATE VIRTUAL TABLE temp.v_col USING schema(table_info);"
697 "CREATE VIRTUAL TABLE temp.v_idxlist USING schema(index_list);"
698 "CREATE VIRTUAL TABLE temp.v_idxinfo USING schema(index_info);"
699 "CREATE VIRTUAL TABLE temp.v_triggers USING schema(trigger_list);"
700 "CREATE TABLE temp.fkey AS "
701 "SELECT from_tbl, to_tbl, fkid, from_col, to_col, on_update, on_delete "
702 "FROM temp.v_fkey WHERE database = 'main';"
703 , 0, 0, 0
704 );
705 if( rc!=SQLITE_OK ) return rc;
706
707 rc = detectSchemaProblem(db, "foreign key columns do not exist",
708 "SELECT fkid, from_tbl "
709 "FROM temp.fkey "
710 "WHERE to_col IS NOT NULL AND NOT EXISTS (SELECT 1 "
711 "FROM temp.v_col WHERE tablename=to_tbl AND name==to_col"
712 ")", pCallback
713 );
714 if( rc!=SQLITE_OK ) return rc;
715
716 /* At this point the temp.fkey table is mostly populated. If any foreign
717 ** keys were specified so that they implicitly refer to they primary
718 ** key of the parent table, the "to_col" values of the temp.fkey rows
719 ** are still set to NULL.
720 **
721 ** This is easily fixed for single column primary keys, but not for
722 ** composites. With a composite primary key, there is no way to reliably
723 ** query sqlite for the order in which the columns that make up the
724 ** composite key were declared i.e. there is no way to tell if the
725 ** schema actually contains "PRIMARY KEY(a, b)" or "PRIMARY KEY(b, a)".
726 ** Therefore, this case is not handled. The following function call
727 ** detects instances of this case.
728 */
729 rc = detectSchemaProblem(db, "implicit mapping to composite primary key",
730 "SELECT fkid, from_tbl "
731 "FROM temp.fkey "
732 "WHERE to_col IS NULL "
733 "GROUP BY fkid, from_tbl HAVING count(*) > 1", pCallback
734 );
735 if( rc!=SQLITE_OK ) return rc;
736
737 /* Detect attempts to implicitly map to the primary key of a table
738 ** that has no primary key column.
739 */
740 rc = detectSchemaProblem(db, "implicit mapping to non-existant primary key",
741 "SELECT fkid, from_tbl "
742 "FROM temp.fkey "
743 "WHERE to_col IS NULL AND NOT EXISTS "
744 "(SELECT 1 FROM temp.v_col WHERE pk AND tablename = temp.fkey.to_tbl)"
745 , pCallback
746 );
747 if( rc!=SQLITE_OK ) return rc;
748
749 /* Fix all the implicit primary key mappings in the temp.fkey table. */
750 rc = sqlite3_exec(db,
751 "UPDATE temp.fkey SET to_col = "
752 "(SELECT name FROM temp.v_col WHERE pk AND tablename=temp.fkey.to_tbl)"
753 " WHERE to_col IS NULL;"
754 , 0, 0, 0
755 );
756 if( rc!=SQLITE_OK ) return rc;
757
758 /* Now check that all all parent keys are either primary keys or
759 ** subject to a unique constraint.
760 */
761 rc = sqlite3_exec(db,
762 "CREATE TABLE temp.idx2 AS SELECT "
763 "il.tablename AS tablename,"
764 "ii.indexname AS indexname,"
765 "ii.name AS col "
766 "FROM temp.v_idxlist AS il, temp.v_idxinfo AS ii "
767 "WHERE il.isunique AND il.database='main' AND ii.indexname = il.name;"
768 "INSERT INTO temp.idx2 "
769 "SELECT tablename, 'pk', name FROM temp.v_col WHERE pk;"
770
771 "CREATE TABLE temp.idx AS SELECT "
772 "tablename, indexname, sj(dq(col),',') AS cols "
773 "FROM (SELECT * FROM temp.idx2 ORDER BY col) "
774 "GROUP BY tablename, indexname;"
775
776 "CREATE TABLE temp.fkey2 AS SELECT "
777 "fkid, from_tbl, to_tbl, sj(dq(to_col),',') AS cols "
778 "FROM (SELECT * FROM temp.fkey ORDER BY to_col) "
779 "GROUP BY fkid, from_tbl;"
780
781 "CREATE TABLE temp.triggers AS SELECT "
782 "triggername FROM temp.v_triggers WHERE database='main' AND "
783 "triggername LIKE 'genfkey%';"
784 , 0, 0, 0
785 );
786 if( rc!=SQLITE_OK ) return rc;
787 rc = detectSchemaProblem(db, "foreign key is not unique",
788 "SELECT fkid, from_tbl "
789 "FROM temp.fkey2 "
790 "WHERE NOT EXISTS (SELECT 1 "
791 "FROM temp.idx WHERE tablename=to_tbl AND fkey2.cols==idx.cols"
792 ")", pCallback
793 );
794 if( rc!=SQLITE_OK ) return rc;
795
796 return rc;
797 }
798
799 #define GENFKEY_ERROR 1
800 #define GENFKEY_DROPTRIGGER 2
801 #define GENFKEY_CREATETRIGGER 3
802 static int genfkey_create_triggers(
803 sqlite3 *sdb, /* Connection to read schema from */
804 const char *zDb, /* Name of db to read ("main", "temp") */
805 void *pCtx, /* Context pointer to pass to xData */
806 int (*xData)(void *, int, const char *)
807 ){
808 const char *zSql =
809 "SELECT multireplace('"
810
811 "-- Triggers for foreign key mapping:\n"
812 "--\n"
813 "-- /from_readable/ REFERENCES /to_readable/\n"
814 "-- on delete /on_delete/\n"
815 "-- on update /on_update/\n"
816 "--\n"
817
818 /* The "BEFORE INSERT ON <referencing>" trigger. This trigger's job is to
819 ** throw an exception if the user tries to insert a row into the
820 ** referencing table for which there is no corresponding row in
821 ** the referenced table.
822 */
823 "CREATE TRIGGER /name/_insert_referencing BEFORE INSERT ON /tbl/ WHEN \n"
824 " /key_notnull/ AND NOT EXISTS (SELECT 1 FROM /ref/ WHERE /cond1/)\n"
825 "BEGIN\n"
826 " SELECT RAISE(ABORT, ''constraint failed'');\n"
827 "END;\n"
828
829 /* The "BEFORE UPDATE ON <referencing>" trigger. This trigger's job
830 ** is to throw an exception if the user tries to update a row in the
831 ** referencing table causing it to correspond to no row in the
832 ** referenced table.
833 */
834 "CREATE TRIGGER /name/_update_referencing BEFORE\n"
835 " UPDATE OF /rkey_list/ ON /tbl/ WHEN \n"
836 " /key_notnull/ AND \n"
837 " NOT EXISTS (SELECT 1 FROM /ref/ WHERE /cond1/)\n"
838 "BEGIN\n"
839 " SELECT RAISE(ABORT, ''constraint failed'');\n"
840 "END;\n"
841
842
843 /* The "BEFORE DELETE ON <referenced>" trigger. This trigger's job
844 ** is to detect when a row is deleted from the referenced table to
845 ** which rows in the referencing table correspond. The action taken
846 ** depends on the value of the 'ON DELETE' clause.
847 */
848 "CREATE TRIGGER /name/_delete_referenced BEFORE DELETE ON /ref/ WHEN\n"
849 " EXISTS (SELECT 1 FROM /tbl/ WHERE /cond2/)\n"
850 "BEGIN\n"
851 " /delete_action/\n"
852 "END;\n"
853
854 /* The "BEFORE DELETE ON <referenced>" trigger. This trigger's job
855 ** is to detect when the key columns of a row in the referenced table
856 ** to which one or more rows in the referencing table correspond are
857 ** updated. The action taken depends on the value of the 'ON UPDATE'
858 ** clause.
859 */
860 "CREATE TRIGGER /name/_update_referenced AFTER\n"
861 " UPDATE OF /fkey_list/ ON /ref/ WHEN \n"
862 " EXISTS (SELECT 1 FROM /tbl/ WHERE /cond2/)\n"
863 "BEGIN\n"
864 " /update_action/\n"
865 "END;\n"
866 "'"
867
868 /* These are used in the SQL comment written above each set of triggers */
869 ", '/from_readable/', from_tbl || '(' || sj(from_col, ', ') || ')'"
870 ", '/to_readable/', to_tbl || '(' || sj(to_col, ', ') || ')'"
871 ", '/on_delete/', on_delete"
872 ", '/on_update/', on_update"
873
874 ", '/name/', 'genfkey' || min(rowid)"
875 ", '/tbl/', dq(from_tbl)"
876 ", '/ref/', dq(to_tbl)"
877 ", '/key_notnull/', sj('new.' || dq(from_col) || ' IS NOT NULL', ' AND ')"
878
879 ", '/fkey_list/', sj(to_col, ', ')"
880 ", '/rkey_list/', sj(from_col, ', ')"
881
882 ", '/cond1/', sj(multireplace('new./from/ == /to/'"
883 ", '/from/', dq(from_col)"
884 ", '/to/', dq(to_col)"
885 "), ' AND ')"
886 ", '/cond2/', sj(multireplace('old./to/ == /from/'"
887 ", '/from/', dq(from_col)"
888 ", '/to/', dq(to_col)"
889 "), ' AND ')"
890
891 ", '/update_action/', CASE on_update "
892 "WHEN 'SET NULL' THEN "
893 "multireplace('UPDATE /tbl/ SET /setlist/ WHERE /where/;' "
894 ", '/setlist/', sj(from_col||' = NULL',', ')"
895 ", '/tbl/', dq(from_tbl)"
896 ", '/where/', sj(from_col||' = old.'||dq(to_col),' AND ')"
897 ")"
898 "WHEN 'CASCADE' THEN "
899 "multireplace('UPDATE /tbl/ SET /setlist/ WHERE /where/;' "
900 ", '/setlist/', sj(dq(from_col)||' = new.'||dq(to_col),', ')"
901 ", '/tbl/', dq(from_tbl)"
902 ", '/where/', sj(dq(from_col)||' = old.'||dq(to_col),' AND ')"
903 ")"
904 "ELSE "
905 " 'SELECT RAISE(ABORT, ''constraint failed'');'"
906 "END "
907
908 ", '/delete_action/', CASE on_delete "
909 "WHEN 'SET NULL' THEN "
910 "multireplace('UPDATE /tbl/ SET /setlist/ WHERE /where/;' "
911 ", '/setlist/', sj(from_col||' = NULL',', ')"
912 ", '/tbl/', dq(from_tbl)"
913 ", '/where/', sj(from_col||' = old.'||dq(to_col),' AND ')"
914 ")"
915 "WHEN 'CASCADE' THEN "
916 "multireplace('DELETE FROM /tbl/ WHERE /where/;' "
917 ", '/tbl/', dq(from_tbl)"
918 ", '/where/', sj(dq(from_col)||' = old.'||dq(to_col),' AND ')"
919 ")"
920 "ELSE "
921 " 'SELECT RAISE(ABORT, ''constraint failed'');'"
922 "END "
923
924 ") FROM temp.fkey "
925 "GROUP BY from_tbl, fkid"
926 ;
927
928 int rc;
929 const int enc = SQLITE_UTF8;
930 sqlite3 *db = 0;
931
932 GenfkeyCb cb;
933 cb.xData = xData;
934 cb.pCtx = pCtx;
935
936 UNUSED_PARAMETER(zDb);
937
938 /* Open the working database handle. */
939 rc = sqlite3_open(":memory:", &db);
940 if( rc!=SQLITE_OK ) goto genfkey_exit;
941
942 /* Create the special scalar and aggregate functions used by this program. */
943 sqlite3_create_function(db, "dq", 1, enc, 0, doublequote, 0, 0);
944 sqlite3_create_function(db, "multireplace", -1, enc, db, multireplace, 0, 0);
945 sqlite3_create_function(db, "sj", 2, enc, 0, 0, joinStep, joinFinalize);
946
947 /* Install the "schema" virtual table module */
948 installSchemaModule(db, sdb);
949
950 /* Create and populate a temp table with the information required to
951 ** build the foreign key triggers. See function populateTempTable()
952 ** for details.
953 */
954 cb.eType = GENFKEY_ERROR;
955 rc = populateTempTable(db, &cb);
956 if( rc!=SQLITE_OK ) goto genfkey_exit;
957
958 /* Unless the --no-drop option was specified, generate DROP TRIGGER
959 ** statements to drop any triggers in the database generated by a
960 ** previous run of this program.
961 */
962 cb.eType = GENFKEY_DROPTRIGGER;
963 rc = sqlite3_exec(db,
964 "SELECT 'DROP TRIGGER main.' || dq(triggername) || ';' FROM triggers"
965 ,invokeCallback, (void *)&cb, 0
966 );
967 if( rc!=SQLITE_OK ) goto genfkey_exit;
968
969 /* Run the main query to create the trigger definitions. */
970 cb.eType = GENFKEY_CREATETRIGGER;
971 rc = sqlite3_exec(db, zSql, invokeCallback, (void *)&cb, 0);
972 if( rc!=SQLITE_OK ) goto genfkey_exit;
973
974 genfkey_exit:
975 sqlite3_close(db);
976 return rc;
977 }
978
979
980 #endif
981 /* End genfkey logic. */
982 /*************************************************************************/
983 /*************************************************************************/
984
985 /* 199 /*
986 ** If the following flag is set, then command execution stops 200 ** If the following flag is set, then command execution stops
987 ** at an error if we are not interactive. 201 ** at an error if we are not interactive.
988 */ 202 */
989 static int bail_on_error = 0; 203 static int bail_on_error = 0;
990 204
991 /* 205 /*
992 ** Threat stdin as an interactive input if the following variable 206 ** Threat stdin as an interactive input if the following variable
993 ** is true. Otherwise, assume stdin is connected to a file or pipe. 207 ** is true. Otherwise, assume stdin is connected to a file or pipe.
994 */ 208 */
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
1130 free(zLine); 344 free(zLine);
1131 return 0; 345 return 0;
1132 } 346 }
1133 zLine[n] = 0; 347 zLine[n] = 0;
1134 eol = 1; 348 eol = 1;
1135 break; 349 break;
1136 } 350 }
1137 while( zLine[n] ){ n++; } 351 while( zLine[n] ){ n++; }
1138 if( n>0 && zLine[n-1]=='\n' ){ 352 if( n>0 && zLine[n-1]=='\n' ){
1139 n--; 353 n--;
354 if( n>0 && zLine[n-1]=='\r' ) n--;
1140 zLine[n] = 0; 355 zLine[n] = 0;
1141 eol = 1; 356 eol = 1;
1142 } 357 }
1143 } 358 }
1144 zLine = realloc( zLine, n+1 ); 359 zLine = realloc( zLine, n+1 );
1145 return zLine; 360 return zLine;
1146 } 361 }
1147 362
1148 /* 363 /*
1149 ** Retrieve a single line of input text. 364 ** Retrieve a single line of input text.
(...skipping 25 matching lines...) Expand all
1175 int showHeader; 390 int showHeader;
1176 int colWidth[100]; 391 int colWidth[100];
1177 }; 392 };
1178 393
1179 /* 394 /*
1180 ** An pointer to an instance of this structure is passed from 395 ** An pointer to an instance of this structure is passed from
1181 ** the main program to the callback. This is used to communicate 396 ** the main program to the callback. This is used to communicate
1182 ** state and mode information. 397 ** state and mode information.
1183 */ 398 */
1184 struct callback_data { 399 struct callback_data {
1185 sqlite3 *db; /* The database */ 400 sqlite3 *db; /* The database */
1186 int echoOn; /* True to echo input commands */ 401 int echoOn; /* True to echo input commands */
402 int statsOn; /* True to display memory stats before each finalize */
1187 int cnt; /* Number of records displayed so far */ 403 int cnt; /* Number of records displayed so far */
1188 FILE *out; /* Write results here */ 404 FILE *out; /* Write results here */
1189 int mode; /* An output mode setting */ 405 int mode; /* An output mode setting */
1190 int writableSchema; /* True if PRAGMA writable_schema=ON */ 406 int writableSchema; /* True if PRAGMA writable_schema=ON */
1191 int showHeader; /* True to show column names in List or Column mode */ 407 int showHeader; /* True to show column names in List or Column mode */
1192 char *zDestTable; /* Name of destination table when MODE_Insert */ 408 char *zDestTable; /* Name of destination table when MODE_Insert */
1193 char separator[20]; /* Separator character for MODE_List */ 409 char separator[20]; /* Separator character for MODE_List */
1194 int colWidth[100]; /* Requested width of each column when in column mode*/ 410 int colWidth[100]; /* Requested width of each column when in column mode*/
1195 int actualWidth[100]; /* Actual width of each column */ 411 int actualWidth[100]; /* Actual width of each column */
1196 char nullvalue[20]; /* The text to print when a NULL comes back from 412 char nullvalue[20]; /* The text to print when a NULL comes back from
1197 ** the database */ 413 ** the database */
1198 struct previous_mode_data explainPrev; 414 struct previous_mode_data explainPrev;
1199 /* Holds the mode information just before 415 /* Holds the mode information just before
1200 ** .explain ON */ 416 ** .explain ON */
1201 char outfile[FILENAME_MAX]; /* Filename for *out */ 417 char outfile[FILENAME_MAX]; /* Filename for *out */
1202 const char *zDbFilename; /* name of the database file */ 418 const char *zDbFilename; /* name of the database file */
419 const char *zVfs; /* Name of VFS to use */
420 sqlite3_stmt *pStmt; /* Current statement if any. */
421 FILE *pLog; /* Write log output here */
1203 }; 422 };
1204 423
1205 /* 424 /*
1206 ** These are the allowed modes. 425 ** These are the allowed modes.
1207 */ 426 */
1208 #define MODE_Line 0 /* One column per line. Blank line between records */ 427 #define MODE_Line 0 /* One column per line. Blank line between records */
1209 #define MODE_Column 1 /* One record per line in neat columns */ 428 #define MODE_Column 1 /* One record per line in neat columns */
1210 #define MODE_List 2 /* One record per line with a separator */ 429 #define MODE_List 2 /* One record per line with a separator */
1211 #define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */ 430 #define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
1212 #define MODE_Html 4 /* Generate an XHTML table */ 431 #define MODE_Html 4 /* Generate an XHTML table */
(...skipping 23 matching lines...) Expand all
1236 ** Compute a string length that is limited to what can be stored in 455 ** Compute a string length that is limited to what can be stored in
1237 ** lower 30 bits of a 32-bit signed integer. 456 ** lower 30 bits of a 32-bit signed integer.
1238 */ 457 */
1239 static int strlen30(const char *z){ 458 static int strlen30(const char *z){
1240 const char *z2 = z; 459 const char *z2 = z;
1241 while( *z2 ){ z2++; } 460 while( *z2 ){ z2++; }
1242 return 0x3fffffff & (int)(z2 - z); 461 return 0x3fffffff & (int)(z2 - z);
1243 } 462 }
1244 463
1245 /* 464 /*
465 ** A callback for the sqlite3_log() interface.
466 */
467 static void shellLog(void *pArg, int iErrCode, const char *zMsg){
468 struct callback_data *p = (struct callback_data*)pArg;
469 if( p->pLog==0 ) return;
470 fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
471 fflush(p->pLog);
472 }
473
474 /*
475 ** Output the given string as a hex-encoded blob (eg. X'1234' )
476 */
477 static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
478 int i;
479 char *zBlob = (char *)pBlob;
480 fprintf(out,"X'");
481 for(i=0; i<nBlob; i++){ fprintf(out,"%02x",zBlob[i]); }
482 fprintf(out,"'");
483 }
484
485 /*
1246 ** Output the given string as a quoted string using SQL quoting conventions. 486 ** Output the given string as a quoted string using SQL quoting conventions.
1247 */ 487 */
1248 static void output_quoted_string(FILE *out, const char *z){ 488 static void output_quoted_string(FILE *out, const char *z){
1249 int i; 489 int i;
1250 int nSingle = 0; 490 int nSingle = 0;
1251 for(i=0; z[i]; i++){ 491 for(i=0; z[i]; i++){
1252 if( z[i]=='\'' ) nSingle++; 492 if( z[i]=='\'' ) nSingle++;
1253 } 493 }
1254 if( nSingle==0 ){ 494 if( nSingle==0 ){
1255 fprintf(out,"'%s'",z); 495 fprintf(out,"'%s'",z);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1300 fputc('"', out); 540 fputc('"', out);
1301 } 541 }
1302 542
1303 /* 543 /*
1304 ** Output the given string with characters that are special to 544 ** Output the given string with characters that are special to
1305 ** HTML escaped. 545 ** HTML escaped.
1306 */ 546 */
1307 static void output_html_string(FILE *out, const char *z){ 547 static void output_html_string(FILE *out, const char *z){
1308 int i; 548 int i;
1309 while( *z ){ 549 while( *z ){
1310 for(i=0; z[i] && z[i]!='<' && z[i]!='&'; i++){} 550 for(i=0; z[i]
551 && z[i]!='<'
552 && z[i]!='&'
553 && z[i]!='>'
554 && z[i]!='\"'
555 && z[i]!='\'';
556 i++){}
1311 if( i>0 ){ 557 if( i>0 ){
1312 fprintf(out,"%.*s",i,z); 558 fprintf(out,"%.*s",i,z);
1313 } 559 }
1314 if( z[i]=='<' ){ 560 if( z[i]=='<' ){
1315 fprintf(out,"&lt;"); 561 fprintf(out,"&lt;");
1316 }else if( z[i]=='&' ){ 562 }else if( z[i]=='&' ){
1317 fprintf(out,"&amp;"); 563 fprintf(out,"&amp;");
564 }else if( z[i]=='>' ){
565 fprintf(out,"&gt;");
566 }else if( z[i]=='\"' ){
567 fprintf(out,"&quot;");
568 }else if( z[i]=='\'' ){
569 fprintf(out,"&#39;");
1318 }else{ 570 }else{
1319 break; 571 break;
1320 } 572 }
1321 z += i + 1; 573 z += i + 1;
1322 } 574 }
1323 } 575 }
1324 576
1325 /* 577 /*
1326 ** If a field contains any character identified by a 1 in the following 578 ** If a field contains any character identified by a 1 in the following
1327 ** array, then the string must be quoted for CSV. 579 ** array, then the string must be quoted for CSV.
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
1387 ** This routine runs when the user presses Ctrl-C 639 ** This routine runs when the user presses Ctrl-C
1388 */ 640 */
1389 static void interrupt_handler(int NotUsed){ 641 static void interrupt_handler(int NotUsed){
1390 UNUSED_PARAMETER(NotUsed); 642 UNUSED_PARAMETER(NotUsed);
1391 seenInterrupt = 1; 643 seenInterrupt = 1;
1392 if( db ) sqlite3_interrupt(db); 644 if( db ) sqlite3_interrupt(db);
1393 } 645 }
1394 #endif 646 #endif
1395 647
1396 /* 648 /*
1397 ** This is the callback routine that the SQLite library 649 ** This is the callback routine that the shell
1398 ** invokes for each row of a query result. 650 ** invokes for each row of a query result.
1399 */ 651 */
1400 static int callback(void *pArg, int nArg, char **azArg, char **azCol){ 652 static int shell_callback(void *pArg, int nArg, char **azArg, char **azCol, int *aiType){
1401 int i; 653 int i;
1402 struct callback_data *p = (struct callback_data*)pArg; 654 struct callback_data *p = (struct callback_data*)pArg;
655
1403 switch( p->mode ){ 656 switch( p->mode ){
1404 case MODE_Line: { 657 case MODE_Line: {
1405 int w = 5; 658 int w = 5;
1406 if( azArg==0 ) break; 659 if( azArg==0 ) break;
1407 for(i=0; i<nArg; i++){ 660 for(i=0; i<nArg; i++){
1408 int len = strlen30(azCol[i] ? azCol[i] : ""); 661 int len = strlen30(azCol[i] ? azCol[i] : "");
1409 if( len>w ) w = len; 662 if( len>w ) w = len;
1410 } 663 }
1411 if( p->cnt++>0 ) fprintf(p->out,"\n"); 664 if( p->cnt++>0 ) fprintf(p->out,"\n");
1412 for(i=0; i<nArg; i++){ 665 for(i=0; i<nArg; i++){
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1488 }else{ 741 }else{
1489 fprintf(p->out, "\n"); 742 fprintf(p->out, "\n");
1490 } 743 }
1491 } 744 }
1492 break; 745 break;
1493 } 746 }
1494 case MODE_Html: { 747 case MODE_Html: {
1495 if( p->cnt++==0 && p->showHeader ){ 748 if( p->cnt++==0 && p->showHeader ){
1496 fprintf(p->out,"<TR>"); 749 fprintf(p->out,"<TR>");
1497 for(i=0; i<nArg; i++){ 750 for(i=0; i<nArg; i++){
1498 fprintf(p->out,"<TH>%s</TH>",azCol[i]); 751 fprintf(p->out,"<TH>");
752 output_html_string(p->out, azCol[i]);
753 fprintf(p->out,"</TH>\n");
1499 } 754 }
1500 fprintf(p->out,"</TR>\n"); 755 fprintf(p->out,"</TR>\n");
1501 } 756 }
1502 if( azArg==0 ) break; 757 if( azArg==0 ) break;
1503 fprintf(p->out,"<TR>"); 758 fprintf(p->out,"<TR>");
1504 for(i=0; i<nArg; i++){ 759 for(i=0; i<nArg; i++){
1505 fprintf(p->out,"<TD>"); 760 fprintf(p->out,"<TD>");
1506 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue); 761 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
1507 fprintf(p->out,"</TD>\n"); 762 fprintf(p->out,"</TD>\n");
1508 } 763 }
(...skipping 24 matching lines...) Expand all
1533 fprintf(p->out,"\n"); 788 fprintf(p->out,"\n");
1534 } 789 }
1535 if( azArg==0 ) break; 790 if( azArg==0 ) break;
1536 for(i=0; i<nArg; i++){ 791 for(i=0; i<nArg; i++){
1537 output_csv(p, azArg[i], i<nArg-1); 792 output_csv(p, azArg[i], i<nArg-1);
1538 } 793 }
1539 fprintf(p->out,"\n"); 794 fprintf(p->out,"\n");
1540 break; 795 break;
1541 } 796 }
1542 case MODE_Insert: { 797 case MODE_Insert: {
798 p->cnt++;
1543 if( azArg==0 ) break; 799 if( azArg==0 ) break;
1544 fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable); 800 fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable);
1545 for(i=0; i<nArg; i++){ 801 for(i=0; i<nArg; i++){
1546 char *zSep = i>0 ? ",": ""; 802 char *zSep = i>0 ? ",": "";
1547 if( azArg[i]==0 ){ 803 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
1548 fprintf(p->out,"%sNULL",zSep); 804 fprintf(p->out,"%sNULL",zSep);
805 }else if( aiType && aiType[i]==SQLITE_TEXT ){
806 if( zSep[0] ) fprintf(p->out,"%s",zSep);
807 output_quoted_string(p->out, azArg[i]);
808 }else if( aiType && (aiType[i]==SQLITE_INTEGER || aiType[i]==SQLITE_FLOA T) ){
809 fprintf(p->out,"%s%s",zSep, azArg[i]);
810 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
811 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
812 int nBlob = sqlite3_column_bytes(p->pStmt, i);
813 if( zSep[0] ) fprintf(p->out,"%s",zSep);
814 output_hex_blob(p->out, pBlob, nBlob);
1549 }else if( isNumber(azArg[i], 0) ){ 815 }else if( isNumber(azArg[i], 0) ){
1550 fprintf(p->out,"%s%s",zSep, azArg[i]); 816 fprintf(p->out,"%s%s",zSep, azArg[i]);
1551 }else{ 817 }else{
1552 if( zSep[0] ) fprintf(p->out,"%s",zSep); 818 if( zSep[0] ) fprintf(p->out,"%s",zSep);
1553 output_quoted_string(p->out, azArg[i]); 819 output_quoted_string(p->out, azArg[i]);
1554 } 820 }
1555 } 821 }
1556 fprintf(p->out,");\n"); 822 fprintf(p->out,");\n");
1557 break; 823 break;
1558 } 824 }
1559 } 825 }
1560 return 0; 826 return 0;
1561 } 827 }
1562 828
1563 /* 829 /*
830 ** This is the callback routine that the SQLite library
831 ** invokes for each row of a query result.
832 */
833 static int callback(void *pArg, int nArg, char **azArg, char **azCol){
834 /* since we don't have type info, call the shell_callback with a NULL value */
835 return shell_callback(pArg, nArg, azArg, azCol, NULL);
836 }
837
838 /*
1564 ** Set the destination table field of the callback_data structure to 839 ** Set the destination table field of the callback_data structure to
1565 ** the name of the table given. Escape any quote characters in the 840 ** the name of the table given. Escape any quote characters in the
1566 ** table name. 841 ** table name.
1567 */ 842 */
1568 static void set_table_name(struct callback_data *p, const char *zName){ 843 static void set_table_name(struct callback_data *p, const char *zName){
1569 int i, n; 844 int i, n;
1570 int needQuote; 845 int needQuote;
1571 char *z; 846 char *z;
1572 847
1573 if( p->zDestTable ){ 848 if( p->zDestTable ){
1574 free(p->zDestTable); 849 free(p->zDestTable);
1575 p->zDestTable = 0; 850 p->zDestTable = 0;
1576 } 851 }
1577 if( zName==0 ) return; 852 if( zName==0 ) return;
1578 needQuote = !isalpha((unsigned char)*zName) && *zName!='_'; 853 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
1579 for(i=n=0; zName[i]; i++, n++){ 854 for(i=n=0; zName[i]; i++, n++){
1580 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){ 855 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
1581 needQuote = 1; 856 needQuote = 1;
1582 if( zName[i]=='\'' ) n++; 857 if( zName[i]=='\'' ) n++;
1583 } 858 }
1584 } 859 }
1585 if( needQuote ) n += 2; 860 if( needQuote ) n += 2;
1586 z = p->zDestTable = malloc( n+1 ); 861 z = p->zDestTable = malloc( n+1 );
1587 if( z==0 ){ 862 if( z==0 ){
1588 fprintf(stderr,"Out of memory!\n"); 863 fprintf(stderr,"Error: out of memory\n");
1589 exit(1); 864 exit(1);
1590 } 865 }
1591 n = 0; 866 n = 0;
1592 if( needQuote ) z[n++] = '\''; 867 if( needQuote ) z[n++] = '\'';
1593 for(i=0; zName[i]; i++){ 868 for(i=0; zName[i]; i++){
1594 z[n++] = zName[i]; 869 z[n++] = zName[i];
1595 if( zName[i]=='\'' ) z[n++] = '\''; 870 if( zName[i]=='\'' ) z[n++] = '\'';
1596 } 871 }
1597 if( needQuote ) z[n++] = '\''; 872 if( needQuote ) z[n++] = '\'';
1598 z[n] = 0; 873 z[n] = 0;
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1668 if( zFirstRow ){ 943 if( zFirstRow ){
1669 fprintf(out, "%s", zFirstRow); 944 fprintf(out, "%s", zFirstRow);
1670 zFirstRow = 0; 945 zFirstRow = 0;
1671 } 946 }
1672 fprintf(out, "%s;\n", sqlite3_column_text(pSelect, 0)); 947 fprintf(out, "%s;\n", sqlite3_column_text(pSelect, 0));
1673 rc = sqlite3_step(pSelect); 948 rc = sqlite3_step(pSelect);
1674 } 949 }
1675 return sqlite3_finalize(pSelect); 950 return sqlite3_finalize(pSelect);
1676 } 951 }
1677 952
953 /*
954 ** Allocate space and save off current error string.
955 */
956 static char *save_err_msg(
957 sqlite3 *db /* Database to query */
958 ){
959 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
960 char *zErrMsg = sqlite3_malloc(nErrMsg);
961 if( zErrMsg ){
962 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
963 }
964 return zErrMsg;
965 }
966
967 /*
968 ** Display memory stats.
969 */
970 static int display_stats(
971 sqlite3 *db, /* Database to query */
972 struct callback_data *pArg, /* Pointer to struct callback_data */
973 int bReset /* True to reset the stats */
974 ){
975 int iCur;
976 int iHiwtr;
977
978 if( pArg && pArg->out ){
979
980 iHiwtr = iCur = -1;
981 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
982 fprintf(pArg->out, "Memory Used: %d (max %d) bytes\n ", iCur, iHiwtr);
983 iHiwtr = iCur = -1;
984 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
985 fprintf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n", iCu r, iHiwtr);
986 /*
987 ** Not currently used by the CLI.
988 ** iHiwtr = iCur = -1;
989 ** sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
990 ** fprintf(pArg->out, "Number of Pcache Pages Used: %d (max %d) pages \n", iCur, iHiwtr);
991 */
992 iHiwtr = iCur = -1;
993 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
994 fprintf(pArg->out, "Number of Pcache Overflow Bytes: %d (max %d) bytes\n ", iCur, iHiwtr);
995 /*
996 ** Not currently used by the CLI.
997 ** iHiwtr = iCur = -1;
998 ** sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
999 ** fprintf(pArg->out, "Number of Scratch Allocations Used: %d (max %d)\n", i Cur, iHiwtr);
1000 */
1001 iHiwtr = iCur = -1;
1002 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
1003 fprintf(pArg->out, "Number of Scratch Overflow Bytes: %d (max %d) bytes\n ", iCur, iHiwtr);
1004 iHiwtr = iCur = -1;
1005 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
1006 fprintf(pArg->out, "Largest Allocation: %d bytes\n", iHiwtr );
1007 iHiwtr = iCur = -1;
1008 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
1009 fprintf(pArg->out, "Largest Pcache Allocation: %d bytes\n", iHiwtr );
1010 iHiwtr = iCur = -1;
1011 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
1012 fprintf(pArg->out, "Largest Scratch Allocation: %d bytes\n", iHiwtr );
1013 #ifdef YYTRACKMAXSTACKDEPTH
1014 iHiwtr = iCur = -1;
1015 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
1016 fprintf(pArg->out, "Deepest Parser Stack: %d (max %d)\n", iCu r, iHiwtr);
1017 #endif
1018 }
1019
1020 if( pArg && pArg->out && db ){
1021 iHiwtr = iCur = -1;
1022 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, &iCur, &iHiwtr, bReset );
1023 fprintf(pArg->out, "Lookaside Slots Used: %d (max %d)\n", iCu r, iHiwtr);
1024 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, &iCur, &iHiwtr, bReset) ;
1025 fprintf(pArg->out, "Successful lookaside attempts: %d\n", iHiwtr);
1026 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, &iCur, &iHiwtr, b Reset);
1027 fprintf(pArg->out, "Lookaside failures due to size: %d\n", iHiwtr);
1028 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, &iCur, &iHiwtr, b Reset);
1029 fprintf(pArg->out, "Lookaside failures due to OOM: %d\n", iHiwtr);
1030 iHiwtr = iCur = -1;
1031 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
1032 fprintf(pArg->out, "Pager Heap Usage: %d bytes\n", iCur);
1033 iHiwtr = iCur = -1;
1034 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
1035 fprintf(pArg->out, "Schema Heap Usage: %d bytes\n", iCur);
1036 iHiwtr = iCur = -1;
1037 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
1038 fprintf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", iCur);
1039 }
1040
1041 if( pArg && pArg->out && db && pArg->pStmt ){
1042 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, bRe set);
1043 fprintf(pArg->out, "Fullscan Steps: %d\n", iCur);
1044 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1045 fprintf(pArg->out, "Sort Operations: %d\n", iCur);
1046 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX, bReset) ;
1047 fprintf(pArg->out, "Autoindex Inserts: %d\n", iCur);
1048 }
1049
1050 return 0;
1051 }
1052
1053 /*
1054 ** Execute a statement or set of statements. Print
1055 ** any result rows/columns depending on the current mode
1056 ** set via the supplied callback.
1057 **
1058 ** This is very similar to SQLite's built-in sqlite3_exec()
1059 ** function except it takes a slightly different callback
1060 ** and callback data argument.
1061 */
1062 static int shell_exec(
1063 sqlite3 *db, /* An open database */
1064 const char *zSql, /* SQL to be evaluated */
1065 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
1066 /* (not the same as sqlite3_exec) */
1067 struct callback_data *pArg, /* Pointer to struct callback_data */
1068 char **pzErrMsg /* Error msg written here */
1069 ){
1070 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1071 int rc = SQLITE_OK; /* Return Code */
1072 const char *zLeftover; /* Tail of unprocessed SQL */
1073
1074 if( pzErrMsg ){
1075 *pzErrMsg = NULL;
1076 }
1077
1078 while( zSql[0] && (SQLITE_OK == rc) ){
1079 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1080 if( SQLITE_OK != rc ){
1081 if( pzErrMsg ){
1082 *pzErrMsg = save_err_msg(db);
1083 }
1084 }else{
1085 if( !pStmt ){
1086 /* this happens for a comment or white-space */
1087 zSql = zLeftover;
1088 while( isspace(zSql[0]) ) zSql++;
1089 continue;
1090 }
1091
1092 /* save off the prepared statment handle and reset row count */
1093 if( pArg ){
1094 pArg->pStmt = pStmt;
1095 pArg->cnt = 0;
1096 }
1097
1098 /* echo the sql statement if echo on */
1099 if( pArg && pArg->echoOn ){
1100 const char *zStmtSql = sqlite3_sql(pStmt);
1101 fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
1102 }
1103
1104 /* perform the first step. this will tell us if we
1105 ** have a result set or not and how wide it is.
1106 */
1107 rc = sqlite3_step(pStmt);
1108 /* if we have a result set... */
1109 if( SQLITE_ROW == rc ){
1110 /* if we have a callback... */
1111 if( xCallback ){
1112 /* allocate space for col name ptr, value ptr, and type */
1113 int nCol = sqlite3_column_count(pStmt);
1114 void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1);
1115 if( !pData ){
1116 rc = SQLITE_NOMEM;
1117 }else{
1118 char **azCols = (char **)pData; /* Names of result columns */
1119 char **azVals = &azCols[nCol]; /* Results */
1120 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
1121 int i;
1122 assert(sizeof(int) <= sizeof(char *));
1123 /* save off ptrs to column names */
1124 for(i=0; i<nCol; i++){
1125 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1126 }
1127 do{
1128 /* extract the data and data types */
1129 for(i=0; i<nCol; i++){
1130 azVals[i] = (char *)sqlite3_column_text(pStmt, i);
1131 aiTypes[i] = sqlite3_column_type(pStmt, i);
1132 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1133 rc = SQLITE_NOMEM;
1134 break; /* from for */
1135 }
1136 } /* end for */
1137
1138 /* if data and types extracted successfully... */
1139 if( SQLITE_ROW == rc ){
1140 /* call the supplied callback with the result row data */
1141 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1142 rc = SQLITE_ABORT;
1143 }else{
1144 rc = sqlite3_step(pStmt);
1145 }
1146 }
1147 } while( SQLITE_ROW == rc );
1148 sqlite3_free(pData);
1149 }
1150 }else{
1151 do{
1152 rc = sqlite3_step(pStmt);
1153 } while( rc == SQLITE_ROW );
1154 }
1155 }
1156
1157 /* print usage stats if stats on */
1158 if( pArg && pArg->statsOn ){
1159 display_stats(db, pArg, 0);
1160 }
1161
1162 /* Finalize the statement just executed. If this fails, save a
1163 ** copy of the error message. Otherwise, set zSql to point to the
1164 ** next statement to execute. */
1165 rc = sqlite3_finalize(pStmt);
1166 if( rc==SQLITE_OK ){
1167 zSql = zLeftover;
1168 while( isspace(zSql[0]) ) zSql++;
1169 }else if( pzErrMsg ){
1170 *pzErrMsg = save_err_msg(db);
1171 }
1172
1173 /* clear saved stmt handle */
1174 if( pArg ){
1175 pArg->pStmt = NULL;
1176 }
1177 }
1178 } /* end while */
1179
1180 return rc;
1181 }
1182
1678 1183
1679 /* 1184 /*
1680 ** This is a different callback routine used for dumping the database. 1185 ** This is a different callback routine used for dumping the database.
1681 ** Each row received by this callback consists of a table name, 1186 ** Each row received by this callback consists of a table name,
1682 ** the table type ("index" or "table") and SQL to create the table. 1187 ** the table type ("index" or "table") and SQL to create the table.
1683 ** This routine should print text sufficient to recreate the table. 1188 ** This routine should print text sufficient to recreate the table.
1684 */ 1189 */
1685 static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){ 1190 static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
1686 int rc; 1191 int rc;
1687 const char *zTable; 1192 const char *zTable;
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
1793 if( pzErrMsg ) sqlite3_free(*pzErrMsg); 1298 if( pzErrMsg ) sqlite3_free(*pzErrMsg);
1794 zQ2 = malloc( len+100 ); 1299 zQ2 = malloc( len+100 );
1795 if( zQ2==0 ) return rc; 1300 if( zQ2==0 ) return rc;
1796 sqlite3_snprintf(sizeof(zQ2), zQ2, "%s ORDER BY rowid DESC", zQuery); 1301 sqlite3_snprintf(sizeof(zQ2), zQ2, "%s ORDER BY rowid DESC", zQuery);
1797 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, pzErrMsg); 1302 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, pzErrMsg);
1798 free(zQ2); 1303 free(zQ2);
1799 } 1304 }
1800 return rc; 1305 return rc;
1801 } 1306 }
1802 1307
1803 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_SUBQUERY)
1804 struct GenfkeyCmd {
1805 sqlite3 *db; /* Database handle */
1806 struct callback_data *pCb; /* Callback data */
1807 int isIgnoreErrors; /* True for --ignore-errors */
1808 int isExec; /* True for --exec */
1809 int isNoDrop; /* True for --no-drop */
1810 int nErr; /* Number of errors seen so far */
1811 };
1812 typedef struct GenfkeyCmd GenfkeyCmd;
1813
1814 static int genfkeyParseArgs(GenfkeyCmd *p, char **azArg, int nArg){
1815 int ii;
1816 memset(p, 0, sizeof(GenfkeyCmd));
1817
1818 for(ii=0; ii<nArg; ii++){
1819 int n = strlen30(azArg[ii]);
1820
1821 if( n>2 && n<10 && 0==strncmp(azArg[ii], "--no-drop", n) ){
1822 p->isNoDrop = 1;
1823 }else if( n>2 && n<16 && 0==strncmp(azArg[ii], "--ignore-errors", n) ){
1824 p->isIgnoreErrors = 1;
1825 }else if( n>2 && n<7 && 0==strncmp(azArg[ii], "--exec", n) ){
1826 p->isExec = 1;
1827 }else{
1828 fprintf(stderr, "unknown option: %s\n", azArg[ii]);
1829 return -1;
1830 }
1831 }
1832
1833 return SQLITE_OK;
1834 }
1835
1836 static int genfkeyCmdCb(void *pCtx, int eType, const char *z){
1837 GenfkeyCmd *p = (GenfkeyCmd *)pCtx;
1838 if( eType==GENFKEY_ERROR && !p->isIgnoreErrors ){
1839 p->nErr++;
1840 fprintf(stderr, "%s\n", z);
1841 }
1842
1843 if( p->nErr==0 && (
1844 (eType==GENFKEY_CREATETRIGGER)
1845 || (eType==GENFKEY_DROPTRIGGER && !p->isNoDrop)
1846 )){
1847 if( p->isExec ){
1848 sqlite3_exec(p->db, z, 0, 0, 0);
1849 }else{
1850 char *zCol = "sql";
1851 callback((void *)p->pCb, 1, (char **)&z, (char **)&zCol);
1852 }
1853 }
1854
1855 return SQLITE_OK;
1856 }
1857 #endif
1858
1859 /* 1308 /*
1860 ** Text of a help message 1309 ** Text of a help message
1861 */ 1310 */
1862 static char zHelp[] = 1311 static char zHelp[] =
1863 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n" 1312 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
1864 ".bail ON|OFF Stop after hitting an error. Default OFF\n" 1313 ".bail ON|OFF Stop after hitting an error. Default OFF\n"
1865 ".databases List names and files of attached databases\n" 1314 ".databases List names and files of attached databases\n"
1866 ".dump ?TABLE? ... Dump the database in an SQL text format\n" 1315 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
1316 " If TABLE specified, only dump tables matching\n"
1317 " LIKE pattern TABLE.\n"
1867 ".echo ON|OFF Turn command echo on or off\n" 1318 ".echo ON|OFF Turn command echo on or off\n"
1868 ".exit Exit this program\n" 1319 ".exit Exit this program\n"
1869 ".explain ON|OFF Turn output mode suitable for EXPLAIN on or off.\n" 1320 ".explain ?ON|OFF? Turn output mode suitable for EXPLAIN on or off.\n"
1870 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_SUBQUERY) 1321 " With no args, it turns EXPLAIN on.\n"
1871 ".genfkey ?OPTIONS? Options are:\n"
1872 " --no-drop: Do not drop old fkey triggers.\n"
1873 " --ignore-errors: Ignore tables with fkey errors\n"
1874 " --exec: Execute generated SQL immediately\n"
1875 " See file tool/genfkey.README in the source \n"
1876 " distribution for further information.\n"
1877 #endif
1878 ".header(s) ON|OFF Turn display of headers on or off\n" 1322 ".header(s) ON|OFF Turn display of headers on or off\n"
1879 ".help Show this message\n" 1323 ".help Show this message\n"
1880 ".import FILE TABLE Import data from FILE into TABLE\n" 1324 ".import FILE TABLE Import data from FILE into TABLE\n"
1881 ".indices TABLE Show names of all indices on TABLE\n" 1325 ".indices ?TABLE? Show names of all indices\n"
1326 " If TABLE specified, only show indices for tables\n"
1327 " matching LIKE pattern TABLE.\n"
1882 #ifdef SQLITE_ENABLE_IOTRACE 1328 #ifdef SQLITE_ENABLE_IOTRACE
1883 ".iotrace FILE Enable I/O diagnostic logging to FILE\n" 1329 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1884 #endif 1330 #endif
1885 #ifndef SQLITE_OMIT_LOAD_EXTENSION 1331 #ifndef SQLITE_OMIT_LOAD_EXTENSION
1886 ".load FILE ?ENTRY? Load an extension library\n" 1332 ".load FILE ?ENTRY? Load an extension library\n"
1887 #endif 1333 #endif
1334 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
1888 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n" 1335 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
1889 " csv Comma-separated values\n" 1336 " csv Comma-separated values\n"
1890 " column Left-aligned columns. (See .width)\n" 1337 " column Left-aligned columns. (See .width)\n"
1891 " html HTML <table> code\n" 1338 " html HTML <table> code\n"
1892 " insert SQL insert statements for TABLE\n" 1339 " insert SQL insert statements for TABLE\n"
1893 " line One value per line\n" 1340 " line One value per line\n"
1894 " list Values delimited by .separator string\n" 1341 " list Values delimited by .separator string\n"
1895 " tabs Tab-separated values\n" 1342 " tabs Tab-separated values\n"
1896 " tcl TCL list elements\n" 1343 " tcl TCL list elements\n"
1897 ".nullvalue STRING Print STRING in place of NULL values\n" 1344 ".nullvalue STRING Print STRING in place of NULL values\n"
1898 ".output FILENAME Send output to FILENAME\n" 1345 ".output FILENAME Send output to FILENAME\n"
1899 ".output stdout Send output to the screen\n" 1346 ".output stdout Send output to the screen\n"
1900 ".prompt MAIN CONTINUE Replace the standard prompts\n" 1347 ".prompt MAIN CONTINUE Replace the standard prompts\n"
1901 ".quit Exit this program\n" 1348 ".quit Exit this program\n"
1902 ".read FILENAME Execute SQL in FILENAME\n" 1349 ".read FILENAME Execute SQL in FILENAME\n"
1903 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n" 1350 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
1904 ".schema ?TABLE? Show the CREATE statements\n" 1351 ".schema ?TABLE? Show the CREATE statements\n"
1352 " If TABLE specified, only show tables matching\n"
1353 " LIKE pattern TABLE.\n"
1905 ".separator STRING Change separator used by output mode and .import\n" 1354 ".separator STRING Change separator used by output mode and .import\n"
1906 ".show Show the current values for various settings\n" 1355 ".show Show the current values for various settings\n"
1907 ".tables ?PATTERN? List names of tables matching a LIKE pattern\n" 1356 ".stats ON|OFF Turn stats on or off\n"
1357 ".tables ?TABLE? List names of tables\n"
1358 " If TABLE specified, only list tables matching\n"
1359 " LIKE pattern TABLE.\n"
1908 ".timeout MS Try opening locked tables for MS milliseconds\n" 1360 ".timeout MS Try opening locked tables for MS milliseconds\n"
1909 #if HAS_TIMER 1361 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
1362 ;
1363
1364 static char zTimerHelp[] =
1910 ".timer ON|OFF Turn the CPU timer measurement on or off\n" 1365 ".timer ON|OFF Turn the CPU timer measurement on or off\n"
1911 #endif
1912 ".width NUM NUM ... Set column widths for \"column\" mode\n"
1913 ; 1366 ;
1914 1367
1915 /* Forward reference */ 1368 /* Forward reference */
1916 static int process_input(struct callback_data *p, FILE *in); 1369 static int process_input(struct callback_data *p, FILE *in);
1917 1370
1918 /* 1371 /*
1919 ** Make sure the database is open. If it is not, then open it. If 1372 ** Make sure the database is open. If it is not, then open it. If
1920 ** the database fails to open, print an error message and exit. 1373 ** the database fails to open, print an error message and exit.
1921 */ 1374 */
1922 static void open_db(struct callback_data *p){ 1375 static void open_db(struct callback_data *p){
1923 if( p->db==0 ){ 1376 if( p->db==0 ){
1924 sqlite3_open(p->zDbFilename, &p->db); 1377 sqlite3_open(p->zDbFilename, &p->db);
1925 db = p->db; 1378 db = p->db;
1926 if( db && sqlite3_errcode(db)==SQLITE_OK ){ 1379 if( db && sqlite3_errcode(db)==SQLITE_OK ){
1927 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0, 1380 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0,
1928 shellstaticFunc, 0, 0); 1381 shellstaticFunc, 0, 0);
1929 } 1382 }
1930 if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){ 1383 if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){
1931 fprintf(stderr,"Unable to open database \"%s\": %s\n", 1384 fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
1932 p->zDbFilename, sqlite3_errmsg(db)); 1385 p->zDbFilename, sqlite3_errmsg(db));
1933 exit(1); 1386 exit(1);
1934 } 1387 }
1935 #ifndef SQLITE_OMIT_LOAD_EXTENSION 1388 #ifndef SQLITE_OMIT_LOAD_EXTENSION
1936 sqlite3_enable_load_extension(p->db, 1); 1389 sqlite3_enable_load_extension(p->db, 1);
1937 #endif 1390 #endif
1938 } 1391 }
1939 } 1392 }
1940 1393
1941 /* 1394 /*
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
2022 }else{ 1475 }else{
2023 azArg[nArg++] = &zLine[i]; 1476 azArg[nArg++] = &zLine[i];
2024 while( zLine[i] && !isspace((unsigned char)zLine[i]) ){ i++; } 1477 while( zLine[i] && !isspace((unsigned char)zLine[i]) ){ i++; }
2025 if( zLine[i] ) zLine[i++] = 0; 1478 if( zLine[i] ) zLine[i++] = 0;
2026 resolve_backslashes(azArg[nArg-1]); 1479 resolve_backslashes(azArg[nArg-1]);
2027 } 1480 }
2028 } 1481 }
2029 1482
2030 /* Process the input line. 1483 /* Process the input line.
2031 */ 1484 */
2032 if( nArg==0 ) return rc; 1485 if( nArg==0 ) return 0; /* no tokens, no error */
2033 n = strlen30(azArg[0]); 1486 n = strlen30(azArg[0]);
2034 c = azArg[0][0]; 1487 c = azArg[0][0];
2035 if( c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0 && nArg>1 ){ 1488 if( c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0 && nArg>1 && nArg<4){
2036 const char *zDestFile; 1489 const char *zDestFile;
2037 const char *zDb; 1490 const char *zDb;
2038 sqlite3 *pDest; 1491 sqlite3 *pDest;
2039 sqlite3_backup *pBackup; 1492 sqlite3_backup *pBackup;
2040 int rc;
2041 if( nArg==2 ){ 1493 if( nArg==2 ){
2042 zDestFile = azArg[1]; 1494 zDestFile = azArg[1];
2043 zDb = "main"; 1495 zDb = "main";
2044 }else{ 1496 }else{
2045 zDestFile = azArg[2]; 1497 zDestFile = azArg[2];
2046 zDb = azArg[1]; 1498 zDb = azArg[1];
2047 } 1499 }
2048 rc = sqlite3_open(zDestFile, &pDest); 1500 rc = sqlite3_open(zDestFile, &pDest);
2049 if( rc!=SQLITE_OK ){ 1501 if( rc!=SQLITE_OK ){
2050 fprintf(stderr, "Error: cannot open %s\n", zDestFile); 1502 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
2051 sqlite3_close(pDest); 1503 sqlite3_close(pDest);
2052 return 1; 1504 return 1;
2053 } 1505 }
2054 open_db(p); 1506 open_db(p);
2055 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb); 1507 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
2056 if( pBackup==0 ){ 1508 if( pBackup==0 ){
2057 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); 1509 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
2058 sqlite3_close(pDest); 1510 sqlite3_close(pDest);
2059 return 1; 1511 return 1;
2060 } 1512 }
2061 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){} 1513 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
2062 sqlite3_backup_finish(pBackup); 1514 sqlite3_backup_finish(pBackup);
2063 if( rc==SQLITE_DONE ){ 1515 if( rc==SQLITE_DONE ){
2064 rc = SQLITE_OK; 1516 rc = 0;
2065 }else{ 1517 }else{
2066 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); 1518 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
1519 rc = 1;
2067 } 1520 }
2068 sqlite3_close(pDest); 1521 sqlite3_close(pDest);
2069 }else 1522 }else
2070 1523
2071 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 && nArg>1 ){ 1524 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 && nArg>1 && nArg<3 ){
2072 bail_on_error = booleanValue(azArg[1]); 1525 bail_on_error = booleanValue(azArg[1]);
2073 }else 1526 }else
2074 1527
2075 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){ 1528 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 && nArg==1 ){
2076 struct callback_data data; 1529 struct callback_data data;
2077 char *zErrMsg = 0; 1530 char *zErrMsg = 0;
2078 open_db(p); 1531 open_db(p);
2079 memcpy(&data, p, sizeof(data)); 1532 memcpy(&data, p, sizeof(data));
2080 data.showHeader = 1; 1533 data.showHeader = 1;
2081 data.mode = MODE_Column; 1534 data.mode = MODE_Column;
2082 data.colWidth[0] = 3; 1535 data.colWidth[0] = 3;
2083 data.colWidth[1] = 15; 1536 data.colWidth[1] = 15;
2084 data.colWidth[2] = 58; 1537 data.colWidth[2] = 58;
2085 data.cnt = 0; 1538 data.cnt = 0;
2086 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg); 1539 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
2087 if( zErrMsg ){ 1540 if( zErrMsg ){
2088 fprintf(stderr,"Error: %s\n", zErrMsg); 1541 fprintf(stderr,"Error: %s\n", zErrMsg);
2089 sqlite3_free(zErrMsg); 1542 sqlite3_free(zErrMsg);
1543 rc = 1;
2090 } 1544 }
2091 }else 1545 }else
2092 1546
2093 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){ 1547 if( c=='d' && strncmp(azArg[0], "dump", n)==0 && nArg<3 ){
2094 char *zErrMsg = 0; 1548 char *zErrMsg = 0;
2095 open_db(p); 1549 open_db(p);
1550 /* When playing back a "dump", the content might appear in an order
1551 ** which causes immediate foreign key constraints to be violated.
1552 ** So disable foreign-key constraint enforcement to prevent problems. */
1553 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
2096 fprintf(p->out, "BEGIN TRANSACTION;\n"); 1554 fprintf(p->out, "BEGIN TRANSACTION;\n");
2097 p->writableSchema = 0; 1555 p->writableSchema = 0;
2098 sqlite3_exec(p->db, "PRAGMA writable_schema=ON", 0, 0, 0); 1556 sqlite3_exec(p->db, "PRAGMA writable_schema=ON", 0, 0, 0);
2099 if( nArg==1 ){ 1557 if( nArg==1 ){
2100 run_schema_dump_query(p, 1558 run_schema_dump_query(p,
2101 "SELECT name, type, sql FROM sqlite_master " 1559 "SELECT name, type, sql FROM sqlite_master "
2102 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'", 0 1560 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'", 0
2103 ); 1561 );
2104 run_schema_dump_query(p, 1562 run_schema_dump_query(p,
2105 "SELECT name, type, sql FROM sqlite_master " 1563 "SELECT name, type, sql FROM sqlite_master "
(...skipping 26 matching lines...) Expand all
2132 } 1590 }
2133 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF", 0, 0, 0); 1591 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF", 0, 0, 0);
2134 if( zErrMsg ){ 1592 if( zErrMsg ){
2135 fprintf(stderr,"Error: %s\n", zErrMsg); 1593 fprintf(stderr,"Error: %s\n", zErrMsg);
2136 sqlite3_free(zErrMsg); 1594 sqlite3_free(zErrMsg);
2137 }else{ 1595 }else{
2138 fprintf(p->out, "COMMIT;\n"); 1596 fprintf(p->out, "COMMIT;\n");
2139 } 1597 }
2140 }else 1598 }else
2141 1599
2142 if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 ){ 1600 if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 && nArg<3 ){
2143 p->echoOn = booleanValue(azArg[1]); 1601 p->echoOn = booleanValue(azArg[1]);
2144 }else 1602 }else
2145 1603
2146 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){ 1604 if( c=='e' && strncmp(azArg[0], "exit", n)==0 && nArg==1 ){
2147 rc = 2; 1605 rc = 2;
2148 }else 1606 }else
2149 1607
2150 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){ 1608 if( c=='e' && strncmp(azArg[0], "explain", n)==0 && nArg<3 ){
2151 int val = nArg>=2 ? booleanValue(azArg[1]) : 1; 1609 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
2152 if(val == 1) { 1610 if(val == 1) {
2153 if(!p->explainPrev.valid) { 1611 if(!p->explainPrev.valid) {
2154 p->explainPrev.valid = 1; 1612 p->explainPrev.valid = 1;
2155 p->explainPrev.mode = p->mode; 1613 p->explainPrev.mode = p->mode;
2156 p->explainPrev.showHeader = p->showHeader; 1614 p->explainPrev.showHeader = p->showHeader;
2157 memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth)); 1615 memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth));
2158 } 1616 }
2159 /* We could put this code under the !p->explainValid 1617 /* We could put this code under the !p->explainValid
2160 ** condition so that it does not execute if we are already in 1618 ** condition so that it does not execute if we are already in
(...skipping 14 matching lines...) Expand all
2175 p->colWidth[6] = 2; /* P5 */ 1633 p->colWidth[6] = 2; /* P5 */
2176 p->colWidth[7] = 13; /* Comment */ 1634 p->colWidth[7] = 13; /* Comment */
2177 }else if (p->explainPrev.valid) { 1635 }else if (p->explainPrev.valid) {
2178 p->explainPrev.valid = 0; 1636 p->explainPrev.valid = 0;
2179 p->mode = p->explainPrev.mode; 1637 p->mode = p->explainPrev.mode;
2180 p->showHeader = p->explainPrev.showHeader; 1638 p->showHeader = p->explainPrev.showHeader;
2181 memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth)); 1639 memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth));
2182 } 1640 }
2183 }else 1641 }else
2184 1642
2185 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_SUBQUERY)
2186 if( c=='g' && strncmp(azArg[0], "genfkey", n)==0 ){
2187 GenfkeyCmd cmd;
2188 if( 0==genfkeyParseArgs(&cmd, &azArg[1], nArg-1) ){
2189 cmd.db = p->db;
2190 cmd.pCb = p;
2191 genfkey_create_triggers(p->db, "main", (void *)&cmd, genfkeyCmdCb);
2192 }
2193 }else
2194 #endif
2195
2196 if( c=='h' && (strncmp(azArg[0], "header", n)==0 || 1643 if( c=='h' && (strncmp(azArg[0], "header", n)==0 ||
2197 strncmp(azArg[0], "headers", n)==0 )&& nArg>1 ){ 1644 strncmp(azArg[0], "headers", n)==0) && nArg>1 && nArg<3 ){
2198 p->showHeader = booleanValue(azArg[1]); 1645 p->showHeader = booleanValue(azArg[1]);
2199 }else 1646 }else
2200 1647
2201 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){ 1648 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
2202 fprintf(stderr,"%s",zHelp); 1649 fprintf(stderr,"%s",zHelp);
1650 if( HAS_TIMER ){
1651 fprintf(stderr,"%s",zTimerHelp);
1652 }
2203 }else 1653 }else
2204 1654
2205 if( c=='i' && strncmp(azArg[0], "import", n)==0 && nArg>=3 ){ 1655 if( c=='i' && strncmp(azArg[0], "import", n)==0 && nArg==3 ){
2206 char *zTable = azArg[2]; /* Insert data into this table */ 1656 char *zTable = azArg[2]; /* Insert data into this table */
2207 char *zFile = azArg[1]; /* The file from which to extract data */ 1657 char *zFile = azArg[1]; /* The file from which to extract data */
2208 sqlite3_stmt *pStmt; /* A statement */ 1658 sqlite3_stmt *pStmt = NULL; /* A statement */
2209 int rc; /* Result code */
2210 int nCol; /* Number of columns in the table */ 1659 int nCol; /* Number of columns in the table */
2211 int nByte; /* Number of bytes in an SQL string */ 1660 int nByte; /* Number of bytes in an SQL string */
2212 int i, j; /* Loop counters */ 1661 int i, j; /* Loop counters */
2213 int nSep; /* Number of bytes in p->separator[] */ 1662 int nSep; /* Number of bytes in p->separator[] */
2214 char *zSql; /* An SQL statement */ 1663 char *zSql; /* An SQL statement */
2215 char *zLine; /* A single line of input from the file */ 1664 char *zLine; /* A single line of input from the file */
2216 char **azCol; /* zLine[] broken up into columns */ 1665 char **azCol; /* zLine[] broken up into columns */
2217 char *zCommit; /* How to commit changes */ 1666 char *zCommit; /* How to commit changes */
2218 FILE *in; /* The input file */ 1667 FILE *in; /* The input file */
2219 int lineno = 0; /* Line number of input file */ 1668 int lineno = 0; /* Line number of input file */
2220 1669
2221 open_db(p); 1670 open_db(p);
2222 nSep = strlen30(p->separator); 1671 nSep = strlen30(p->separator);
2223 if( nSep==0 ){ 1672 if( nSep==0 ){
2224 fprintf(stderr, "non-null separator required for import\n"); 1673 fprintf(stderr, "Error: non-null separator required for import\n");
2225 return 0; 1674 return 1;
2226 } 1675 }
2227 zSql = sqlite3_mprintf("SELECT * FROM '%q'", zTable); 1676 zSql = sqlite3_mprintf("SELECT * FROM '%q'", zTable);
2228 if( zSql==0 ) return 0; 1677 if( zSql==0 ){
1678 fprintf(stderr, "Error: out of memory\n");
1679 return 1;
1680 }
2229 nByte = strlen30(zSql); 1681 nByte = strlen30(zSql);
2230 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0); 1682 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
2231 sqlite3_free(zSql); 1683 sqlite3_free(zSql);
2232 if( rc ){ 1684 if( rc ){
1685 if (pStmt) sqlite3_finalize(pStmt);
2233 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db)); 1686 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
2234 nCol = 0; 1687 return 1;
2235 rc = 1;
2236 }else{
2237 nCol = sqlite3_column_count(pStmt);
2238 } 1688 }
1689 nCol = sqlite3_column_count(pStmt);
2239 sqlite3_finalize(pStmt); 1690 sqlite3_finalize(pStmt);
2240 if( nCol==0 ) return 0; 1691 pStmt = 0;
1692 if( nCol==0 ) return 0; /* no columns, no error */
2241 zSql = malloc( nByte + 20 + nCol*2 ); 1693 zSql = malloc( nByte + 20 + nCol*2 );
2242 if( zSql==0 ) return 0; 1694 if( zSql==0 ){
1695 fprintf(stderr, "Error: out of memory\n");
1696 return 1;
1697 }
2243 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO '%q' VALUES(?", zTable); 1698 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO '%q' VALUES(?", zTable);
2244 j = strlen30(zSql); 1699 j = strlen30(zSql);
2245 for(i=1; i<nCol; i++){ 1700 for(i=1; i<nCol; i++){
2246 zSql[j++] = ','; 1701 zSql[j++] = ',';
2247 zSql[j++] = '?'; 1702 zSql[j++] = '?';
2248 } 1703 }
2249 zSql[j++] = ')'; 1704 zSql[j++] = ')';
2250 zSql[j] = 0; 1705 zSql[j] = 0;
2251 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0); 1706 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
2252 free(zSql); 1707 free(zSql);
2253 if( rc ){ 1708 if( rc ){
2254 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db)); 1709 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
2255 sqlite3_finalize(pStmt); 1710 if (pStmt) sqlite3_finalize(pStmt);
2256 return 1; 1711 return 1;
2257 } 1712 }
2258 in = fopen(zFile, "rb"); 1713 in = fopen(zFile, "rb");
2259 if( in==0 ){ 1714 if( in==0 ){
2260 fprintf(stderr, "cannot open file: %s\n", zFile); 1715 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
2261 sqlite3_finalize(pStmt); 1716 sqlite3_finalize(pStmt);
2262 return 0; 1717 return 1;
2263 } 1718 }
2264 azCol = malloc( sizeof(azCol[0])*(nCol+1) ); 1719 azCol = malloc( sizeof(azCol[0])*(nCol+1) );
2265 if( azCol==0 ){ 1720 if( azCol==0 ){
1721 fprintf(stderr, "Error: out of memory\n");
2266 fclose(in); 1722 fclose(in);
2267 return 0; 1723 sqlite3_finalize(pStmt);
1724 return 1;
2268 } 1725 }
2269 sqlite3_exec(p->db, "BEGIN", 0, 0, 0); 1726 sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
2270 zCommit = "COMMIT"; 1727 zCommit = "COMMIT";
2271 while( (zLine = local_getline(0, in))!=0 ){ 1728 while( (zLine = local_getline(0, in))!=0 ){
2272 char *z; 1729 char *z;
2273 i = 0; 1730 i = 0;
2274 lineno++; 1731 lineno++;
2275 azCol[0] = zLine; 1732 azCol[0] = zLine;
2276 for(i=0, z=zLine; *z && *z!='\n' && *z!='\r'; z++){ 1733 for(i=0, z=zLine; *z && *z!='\n' && *z!='\r'; z++){
2277 if( *z==p->separator[0] && strncmp(z, p->separator, nSep)==0 ){ 1734 if( *z==p->separator[0] && strncmp(z, p->separator, nSep)==0 ){
2278 *z = 0; 1735 *z = 0;
2279 i++; 1736 i++;
2280 if( i<nCol ){ 1737 if( i<nCol ){
2281 azCol[i] = &z[nSep]; 1738 azCol[i] = &z[nSep];
2282 z += nSep-1; 1739 z += nSep-1;
2283 } 1740 }
2284 } 1741 }
2285 } 1742 } /* end for */
2286 *z = 0; 1743 *z = 0;
2287 if( i+1!=nCol ){ 1744 if( i+1!=nCol ){
2288 fprintf(stderr,"%s line %d: expected %d columns of data but found %d\n", 1745 fprintf(stderr,
2289 zFile, lineno, nCol, i+1); 1746 "Error: %s line %d: expected %d columns of data but found %d\n",
1747 zFile, lineno, nCol, i+1);
2290 zCommit = "ROLLBACK"; 1748 zCommit = "ROLLBACK";
2291 free(zLine); 1749 free(zLine);
2292 break; 1750 rc = 1;
1751 break; /* from while */
2293 } 1752 }
2294 for(i=0; i<nCol; i++){ 1753 for(i=0; i<nCol; i++){
2295 sqlite3_bind_text(pStmt, i+1, azCol[i], -1, SQLITE_STATIC); 1754 sqlite3_bind_text(pStmt, i+1, azCol[i], -1, SQLITE_STATIC);
2296 } 1755 }
2297 sqlite3_step(pStmt); 1756 sqlite3_step(pStmt);
2298 rc = sqlite3_reset(pStmt); 1757 rc = sqlite3_reset(pStmt);
2299 free(zLine); 1758 free(zLine);
2300 if( rc!=SQLITE_OK ){ 1759 if( rc!=SQLITE_OK ){
2301 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db)); 1760 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
2302 zCommit = "ROLLBACK"; 1761 zCommit = "ROLLBACK";
2303 rc = 1; 1762 rc = 1;
2304 break; 1763 break; /* from while */
2305 } 1764 }
2306 } 1765 } /* end while */
2307 free(azCol); 1766 free(azCol);
2308 fclose(in); 1767 fclose(in);
2309 sqlite3_finalize(pStmt); 1768 sqlite3_finalize(pStmt);
2310 sqlite3_exec(p->db, zCommit, 0, 0, 0); 1769 sqlite3_exec(p->db, zCommit, 0, 0, 0);
2311 }else 1770 }else
2312 1771
2313 if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg>1 ){ 1772 if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg<3 ){
2314 struct callback_data data; 1773 struct callback_data data;
2315 char *zErrMsg = 0; 1774 char *zErrMsg = 0;
2316 open_db(p); 1775 open_db(p);
2317 memcpy(&data, p, sizeof(data)); 1776 memcpy(&data, p, sizeof(data));
2318 data.showHeader = 0; 1777 data.showHeader = 0;
2319 data.mode = MODE_List; 1778 data.mode = MODE_List;
2320 zShellStatic = azArg[1]; 1779 if( nArg==1 ){
2321 sqlite3_exec(p->db, 1780 rc = sqlite3_exec(p->db,
2322 "SELECT name FROM sqlite_master " 1781 "SELECT name FROM sqlite_master "
2323 "WHERE type='index' AND tbl_name LIKE shellstatic() " 1782 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
2324 "UNION ALL " 1783 "UNION ALL "
2325 "SELECT name FROM sqlite_temp_master " 1784 "SELECT name FROM sqlite_temp_master "
2326 "WHERE type='index' AND tbl_name LIKE shellstatic() " 1785 "WHERE type='index' "
2327 "ORDER BY 1", 1786 "ORDER BY 1",
2328 callback, &data, &zErrMsg 1787 callback, &data, &zErrMsg
2329 ); 1788 );
2330 zShellStatic = 0; 1789 }else{
1790 zShellStatic = azArg[1];
1791 rc = sqlite3_exec(p->db,
1792 "SELECT name FROM sqlite_master "
1793 "WHERE type='index' AND tbl_name LIKE shellstatic() "
1794 "UNION ALL "
1795 "SELECT name FROM sqlite_temp_master "
1796 "WHERE type='index' AND tbl_name LIKE shellstatic() "
1797 "ORDER BY 1",
1798 callback, &data, &zErrMsg
1799 );
1800 zShellStatic = 0;
1801 }
2331 if( zErrMsg ){ 1802 if( zErrMsg ){
2332 fprintf(stderr,"Error: %s\n", zErrMsg); 1803 fprintf(stderr,"Error: %s\n", zErrMsg);
2333 sqlite3_free(zErrMsg); 1804 sqlite3_free(zErrMsg);
1805 rc = 1;
1806 }else if( rc != SQLITE_OK ){
1807 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
1808 rc = 1;
2334 } 1809 }
2335 }else 1810 }else
2336 1811
2337 #ifdef SQLITE_ENABLE_IOTRACE 1812 #ifdef SQLITE_ENABLE_IOTRACE
2338 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){ 1813 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
2339 extern void (*sqlite3IoTrace)(const char*, ...); 1814 extern void (*sqlite3IoTrace)(const char*, ...);
2340 if( iotrace && iotrace!=stdout ) fclose(iotrace); 1815 if( iotrace && iotrace!=stdout ) fclose(iotrace);
2341 iotrace = 0; 1816 iotrace = 0;
2342 if( nArg<2 ){ 1817 if( nArg<2 ){
2343 sqlite3IoTrace = 0; 1818 sqlite3IoTrace = 0;
2344 }else if( strcmp(azArg[1], "-")==0 ){ 1819 }else if( strcmp(azArg[1], "-")==0 ){
2345 sqlite3IoTrace = iotracePrintf; 1820 sqlite3IoTrace = iotracePrintf;
2346 iotrace = stdout; 1821 iotrace = stdout;
2347 }else{ 1822 }else{
2348 iotrace = fopen(azArg[1], "w"); 1823 iotrace = fopen(azArg[1], "w");
2349 if( iotrace==0 ){ 1824 if( iotrace==0 ){
2350 fprintf(stderr, "cannot open \"%s\"\n", azArg[1]); 1825 fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
2351 sqlite3IoTrace = 0; 1826 sqlite3IoTrace = 0;
1827 rc = 1;
2352 }else{ 1828 }else{
2353 sqlite3IoTrace = iotracePrintf; 1829 sqlite3IoTrace = iotracePrintf;
2354 } 1830 }
2355 } 1831 }
2356 }else 1832 }else
2357 #endif 1833 #endif
2358 1834
2359 #ifndef SQLITE_OMIT_LOAD_EXTENSION 1835 #ifndef SQLITE_OMIT_LOAD_EXTENSION
2360 if( c=='l' && strncmp(azArg[0], "load", n)==0 && nArg>=2 ){ 1836 if( c=='l' && strncmp(azArg[0], "load", n)==0 && nArg>=2 ){
2361 const char *zFile, *zProc; 1837 const char *zFile, *zProc;
2362 char *zErrMsg = 0; 1838 char *zErrMsg = 0;
2363 int rc;
2364 zFile = azArg[1]; 1839 zFile = azArg[1];
2365 zProc = nArg>=3 ? azArg[2] : 0; 1840 zProc = nArg>=3 ? azArg[2] : 0;
2366 open_db(p); 1841 open_db(p);
2367 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg); 1842 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
2368 if( rc!=SQLITE_OK ){ 1843 if( rc!=SQLITE_OK ){
2369 fprintf(stderr, "%s\n", zErrMsg); 1844 fprintf(stderr, "Error: %s\n", zErrMsg);
2370 sqlite3_free(zErrMsg); 1845 sqlite3_free(zErrMsg);
2371 rc = 1; 1846 rc = 1;
2372 } 1847 }
2373 }else 1848 }else
2374 #endif 1849 #endif
2375 1850
2376 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg>=2 ){ 1851 if( c=='l' && strncmp(azArg[0], "log", n)==0 && nArg>=2 ){
2377 int n2 = strlen30(azArg[1]); 1852 const char *zFile = azArg[1];
2378 if( strncmp(azArg[1],"line",n2)==0 1853 if( p->pLog && p->pLog!=stdout && p->pLog!=stderr ){
2379 || 1854 fclose(p->pLog);
2380 strncmp(azArg[1],"lines",n2)==0 ){ 1855 p->pLog = 0;
2381 p->mode = MODE_Line; 1856 }
2382 }else if( strncmp(azArg[1],"column",n2)==0 1857 if( strcmp(zFile,"stdout")==0 ){
2383 || 1858 p->pLog = stdout;
2384 strncmp(azArg[1],"columns",n2)==0 ){ 1859 }else if( strcmp(zFile, "stderr")==0 ){
2385 p->mode = MODE_Column; 1860 p->pLog = stderr;
2386 }else if( strncmp(azArg[1],"list",n2)==0 ){ 1861 }else if( strcmp(zFile, "off")==0 ){
2387 p->mode = MODE_List; 1862 p->pLog = 0;
2388 }else if( strncmp(azArg[1],"html",n2)==0 ){ 1863 }else{
2389 p->mode = MODE_Html; 1864 p->pLog = fopen(zFile, "w");
2390 }else if( strncmp(azArg[1],"tcl",n2)==0 ){ 1865 if( p->pLog==0 ){
2391 p->mode = MODE_Tcl; 1866 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
2392 }else if( strncmp(azArg[1],"csv",n2)==0 ){
2393 p->mode = MODE_Csv;
2394 sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
2395 }else if( strncmp(azArg[1],"tabs",n2)==0 ){
2396 p->mode = MODE_List;
2397 sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
2398 }else if( strncmp(azArg[1],"insert",n2)==0 ){
2399 p->mode = MODE_Insert;
2400 if( nArg>=3 ){
2401 set_table_name(p, azArg[2]);
2402 }else{
2403 set_table_name(p, "table");
2404 } 1867 }
2405 }else {
2406 fprintf(stderr,"mode should be one of: "
2407 "column csv html insert line list tabs tcl\n");
2408 } 1868 }
2409 }else 1869 }else
2410 1870
1871 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==2 ){
1872 int n2 = strlen30(azArg[1]);
1873 if( (n2==4 && strncmp(azArg[1],"line",n2)==0)
1874 ||
1875 (n2==5 && strncmp(azArg[1],"lines",n2)==0) ){
1876 p->mode = MODE_Line;
1877 }else if( (n2==6 && strncmp(azArg[1],"column",n2)==0)
1878 ||
1879 (n2==7 && strncmp(azArg[1],"columns",n2)==0) ){
1880 p->mode = MODE_Column;
1881 }else if( n2==4 && strncmp(azArg[1],"list",n2)==0 ){
1882 p->mode = MODE_List;
1883 }else if( n2==4 && strncmp(azArg[1],"html",n2)==0 ){
1884 p->mode = MODE_Html;
1885 }else if( n2==3 && strncmp(azArg[1],"tcl",n2)==0 ){
1886 p->mode = MODE_Tcl;
1887 }else if( n2==3 && strncmp(azArg[1],"csv",n2)==0 ){
1888 p->mode = MODE_Csv;
1889 sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
1890 }else if( n2==4 && strncmp(azArg[1],"tabs",n2)==0 ){
1891 p->mode = MODE_List;
1892 sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
1893 }else if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
1894 p->mode = MODE_Insert;
1895 set_table_name(p, "table");
1896 }else {
1897 fprintf(stderr,"Error: mode should be one of: "
1898 "column csv html insert line list tabs tcl\n");
1899 rc = 1;
1900 }
1901 }else
1902
1903 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==3 ){
1904 int n2 = strlen30(azArg[1]);
1905 if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
1906 p->mode = MODE_Insert;
1907 set_table_name(p, azArg[2]);
1908 }else {
1909 fprintf(stderr, "Error: invalid arguments: "
1910 " \"%s\". Enter \".help\" for help\n", azArg[2]);
1911 rc = 1;
1912 }
1913 }else
1914
2411 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) { 1915 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) {
2412 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue, 1916 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
2413 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]); 1917 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
2414 }else 1918 }else
2415 1919
2416 if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){ 1920 if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){
2417 if( p->out!=stdout ){ 1921 if( p->out!=stdout ){
2418 fclose(p->out); 1922 fclose(p->out);
2419 } 1923 }
2420 if( strcmp(azArg[1],"stdout")==0 ){ 1924 if( strcmp(azArg[1],"stdout")==0 ){
2421 p->out = stdout; 1925 p->out = stdout;
2422 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "stdout"); 1926 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "stdout");
2423 }else{ 1927 }else{
2424 p->out = fopen(azArg[1], "wb"); 1928 p->out = fopen(azArg[1], "wb");
2425 if( p->out==0 ){ 1929 if( p->out==0 ){
2426 fprintf(stderr,"can't write to \"%s\"\n", azArg[1]); 1930 fprintf(stderr,"Error: cannot write to \"%s\"\n", azArg[1]);
2427 p->out = stdout; 1931 p->out = stdout;
1932 rc = 1;
2428 } else { 1933 } else {
2429 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]); 1934 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
2430 } 1935 }
2431 } 1936 }
2432 }else 1937 }else
2433 1938
2434 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && (nArg==2 || nArg==3)){ 1939 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && (nArg==2 || nArg==3)){
2435 if( nArg >= 2) { 1940 if( nArg >= 2) {
2436 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1); 1941 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
2437 } 1942 }
2438 if( nArg >= 3) { 1943 if( nArg >= 3) {
2439 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1); 1944 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
2440 } 1945 }
2441 }else 1946 }else
2442 1947
2443 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){ 1948 if( c=='q' && strncmp(azArg[0], "quit", n)==0 && nArg==1 ){
2444 rc = 2; 1949 rc = 2;
2445 }else 1950 }else
2446 1951
2447 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 && nArg==2 ){ 1952 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 && nArg==2 ){
2448 FILE *alt = fopen(azArg[1], "rb"); 1953 FILE *alt = fopen(azArg[1], "rb");
2449 if( alt==0 ){ 1954 if( alt==0 ){
2450 fprintf(stderr,"can't open \"%s\"\n", azArg[1]); 1955 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
1956 rc = 1;
2451 }else{ 1957 }else{
2452 process_input(p, alt); 1958 rc = process_input(p, alt);
2453 fclose(alt); 1959 fclose(alt);
2454 } 1960 }
2455 }else 1961 }else
2456 1962
2457 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 && nArg>1 ){ 1963 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 && nArg>1 && nArg<4){
2458 const char *zSrcFile; 1964 const char *zSrcFile;
2459 const char *zDb; 1965 const char *zDb;
2460 sqlite3 *pSrc; 1966 sqlite3 *pSrc;
2461 sqlite3_backup *pBackup; 1967 sqlite3_backup *pBackup;
2462 int rc;
2463 int nTimeout = 0; 1968 int nTimeout = 0;
2464 1969
2465 if( nArg==2 ){ 1970 if( nArg==2 ){
2466 zSrcFile = azArg[1]; 1971 zSrcFile = azArg[1];
2467 zDb = "main"; 1972 zDb = "main";
2468 }else{ 1973 }else{
2469 zSrcFile = azArg[2]; 1974 zSrcFile = azArg[2];
2470 zDb = azArg[1]; 1975 zDb = azArg[1];
2471 } 1976 }
2472 rc = sqlite3_open(zSrcFile, &pSrc); 1977 rc = sqlite3_open(zSrcFile, &pSrc);
2473 if( rc!=SQLITE_OK ){ 1978 if( rc!=SQLITE_OK ){
2474 fprintf(stderr, "Error: cannot open %s\n", zSrcFile); 1979 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
2475 sqlite3_close(pSrc); 1980 sqlite3_close(pSrc);
2476 return 1; 1981 return 1;
2477 } 1982 }
2478 open_db(p); 1983 open_db(p);
2479 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main"); 1984 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
2480 if( pBackup==0 ){ 1985 if( pBackup==0 ){
2481 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 1986 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
2482 sqlite3_close(pSrc); 1987 sqlite3_close(pSrc);
2483 return 1; 1988 return 1;
2484 } 1989 }
2485 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK 1990 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
2486 || rc==SQLITE_BUSY ){ 1991 || rc==SQLITE_BUSY ){
2487 if( rc==SQLITE_BUSY ){ 1992 if( rc==SQLITE_BUSY ){
2488 if( nTimeout++ >= 3 ) break; 1993 if( nTimeout++ >= 3 ) break;
2489 sqlite3_sleep(100); 1994 sqlite3_sleep(100);
2490 } 1995 }
2491 } 1996 }
2492 sqlite3_backup_finish(pBackup); 1997 sqlite3_backup_finish(pBackup);
2493 if( rc==SQLITE_DONE ){ 1998 if( rc==SQLITE_DONE ){
2494 rc = SQLITE_OK; 1999 rc = 0;
2495 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){ 2000 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
2496 fprintf(stderr, "source database is busy\n"); 2001 fprintf(stderr, "Error: source database is busy\n");
2002 rc = 1;
2497 }else{ 2003 }else{
2498 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 2004 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
2005 rc = 1;
2499 } 2006 }
2500 sqlite3_close(pSrc); 2007 sqlite3_close(pSrc);
2501 }else 2008 }else
2502 2009
2503 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){ 2010 if( c=='s' && strncmp(azArg[0], "schema", n)==0 && nArg<3 ){
2504 struct callback_data data; 2011 struct callback_data data;
2505 char *zErrMsg = 0; 2012 char *zErrMsg = 0;
2506 open_db(p); 2013 open_db(p);
2507 memcpy(&data, p, sizeof(data)); 2014 memcpy(&data, p, sizeof(data));
2508 data.showHeader = 0; 2015 data.showHeader = 0;
2509 data.mode = MODE_Semi; 2016 data.mode = MODE_Semi;
2510 if( nArg>1 ){ 2017 if( nArg>1 ){
2511 int i; 2018 int i;
2512 for(i=0; azArg[1][i]; i++) azArg[1][i] = (char)tolower(azArg[1][i]); 2019 for(i=0; azArg[1][i]; i++) azArg[1][i] = (char)tolower(azArg[1][i]);
2513 if( strcmp(azArg[1],"sqlite_master")==0 ){ 2020 if( strcmp(azArg[1],"sqlite_master")==0 ){
2514 char *new_argv[2], *new_colv[2]; 2021 char *new_argv[2], *new_colv[2];
2515 new_argv[0] = "CREATE TABLE sqlite_master (\n" 2022 new_argv[0] = "CREATE TABLE sqlite_master (\n"
2516 " type text,\n" 2023 " type text,\n"
2517 " name text,\n" 2024 " name text,\n"
2518 " tbl_name text,\n" 2025 " tbl_name text,\n"
2519 " rootpage integer,\n" 2026 " rootpage integer,\n"
2520 " sql text\n" 2027 " sql text\n"
2521 ")"; 2028 ")";
2522 new_argv[1] = 0; 2029 new_argv[1] = 0;
2523 new_colv[0] = "sql"; 2030 new_colv[0] = "sql";
2524 new_colv[1] = 0; 2031 new_colv[1] = 0;
2525 callback(&data, 1, new_argv, new_colv); 2032 callback(&data, 1, new_argv, new_colv);
2033 rc = SQLITE_OK;
2526 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){ 2034 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
2527 char *new_argv[2], *new_colv[2]; 2035 char *new_argv[2], *new_colv[2];
2528 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n" 2036 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
2529 " type text,\n" 2037 " type text,\n"
2530 " name text,\n" 2038 " name text,\n"
2531 " tbl_name text,\n" 2039 " tbl_name text,\n"
2532 " rootpage integer,\n" 2040 " rootpage integer,\n"
2533 " sql text\n" 2041 " sql text\n"
2534 ")"; 2042 ")";
2535 new_argv[1] = 0; 2043 new_argv[1] = 0;
2536 new_colv[0] = "sql"; 2044 new_colv[0] = "sql";
2537 new_colv[1] = 0; 2045 new_colv[1] = 0;
2538 callback(&data, 1, new_argv, new_colv); 2046 callback(&data, 1, new_argv, new_colv);
2047 rc = SQLITE_OK;
2539 }else{ 2048 }else{
2540 zShellStatic = azArg[1]; 2049 zShellStatic = azArg[1];
2541 sqlite3_exec(p->db, 2050 rc = sqlite3_exec(p->db,
2542 "SELECT sql FROM " 2051 "SELECT sql FROM "
2543 " (SELECT sql sql, type type, tbl_name tbl_name, name name" 2052 " (SELECT sql sql, type type, tbl_name tbl_name, name name"
2544 " FROM sqlite_master UNION ALL" 2053 " FROM sqlite_master UNION ALL"
2545 " SELECT sql, type, tbl_name, name FROM sqlite_temp_master) " 2054 " SELECT sql, type, tbl_name, name FROM sqlite_temp_master) "
2546 "WHERE tbl_name LIKE shellstatic() AND type!='meta' AND sql NOTNULL " 2055 "WHERE tbl_name LIKE shellstatic() AND type!='meta' AND sql NOTNULL "
2547 "ORDER BY substr(type,2,1), name", 2056 "ORDER BY substr(type,2,1), name",
2548 callback, &data, &zErrMsg); 2057 callback, &data, &zErrMsg);
2549 zShellStatic = 0; 2058 zShellStatic = 0;
2550 } 2059 }
2551 }else{ 2060 }else{
2552 sqlite3_exec(p->db, 2061 rc = sqlite3_exec(p->db,
2553 "SELECT sql FROM " 2062 "SELECT sql FROM "
2554 " (SELECT sql sql, type type, tbl_name tbl_name, name name" 2063 " (SELECT sql sql, type type, tbl_name tbl_name, name name"
2555 " FROM sqlite_master UNION ALL" 2064 " FROM sqlite_master UNION ALL"
2556 " SELECT sql, type, tbl_name, name FROM sqlite_temp_master) " 2065 " SELECT sql, type, tbl_name, name FROM sqlite_temp_master) "
2557 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'" 2066 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'"
2558 "ORDER BY substr(type,2,1), name", 2067 "ORDER BY substr(type,2,1), name",
2559 callback, &data, &zErrMsg 2068 callback, &data, &zErrMsg
2560 ); 2069 );
2561 } 2070 }
2562 if( zErrMsg ){ 2071 if( zErrMsg ){
2563 fprintf(stderr,"Error: %s\n", zErrMsg); 2072 fprintf(stderr,"Error: %s\n", zErrMsg);
2564 sqlite3_free(zErrMsg); 2073 sqlite3_free(zErrMsg);
2074 rc = 1;
2075 }else if( rc != SQLITE_OK ){
2076 fprintf(stderr,"Error: querying schema information\n");
2077 rc = 1;
2078 }else{
2079 rc = 0;
2565 } 2080 }
2566 }else 2081 }else
2567 2082
2568 if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){ 2083 if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){
2569 sqlite3_snprintf(sizeof(p->separator), p->separator, 2084 sqlite3_snprintf(sizeof(p->separator), p->separator,
2570 "%.*s", (int)sizeof(p->separator)-1, azArg[1]); 2085 "%.*s", (int)sizeof(p->separator)-1, azArg[1]);
2571 }else 2086 }else
2572 2087
2573 if( c=='s' && strncmp(azArg[0], "show", n)==0){ 2088 if( c=='s' && strncmp(azArg[0], "show", n)==0 && nArg==1 ){
2574 int i; 2089 int i;
2575 fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off"); 2090 fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
2576 fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off"); 2091 fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off");
2577 fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off"); 2092 fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off");
2578 fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]); 2093 fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]);
2579 fprintf(p->out,"%9.9s: ", "nullvalue"); 2094 fprintf(p->out,"%9.9s: ", "nullvalue");
2580 output_c_string(p->out, p->nullvalue); 2095 output_c_string(p->out, p->nullvalue);
2581 fprintf(p->out, "\n"); 2096 fprintf(p->out, "\n");
2582 fprintf(p->out,"%9.9s: %s\n","output", 2097 fprintf(p->out,"%9.9s: %s\n","output",
2583 strlen30(p->outfile) ? p->outfile : "stdout"); 2098 strlen30(p->outfile) ? p->outfile : "stdout");
2584 fprintf(p->out,"%9.9s: ", "separator"); 2099 fprintf(p->out,"%9.9s: ", "separator");
2585 output_c_string(p->out, p->separator); 2100 output_c_string(p->out, p->separator);
2586 fprintf(p->out, "\n"); 2101 fprintf(p->out, "\n");
2102 fprintf(p->out,"%9.9s: %s\n","stats", p->statsOn ? "on" : "off");
2587 fprintf(p->out,"%9.9s: ","width"); 2103 fprintf(p->out,"%9.9s: ","width");
2588 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) { 2104 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
2589 fprintf(p->out,"%d ",p->colWidth[i]); 2105 fprintf(p->out,"%d ",p->colWidth[i]);
2590 } 2106 }
2591 fprintf(p->out,"\n"); 2107 fprintf(p->out,"\n");
2592 }else 2108 }else
2593 2109
2594 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){ 2110 if( c=='s' && strncmp(azArg[0], "stats", n)==0 && nArg>1 && nArg<3 ){
2111 p->statsOn = booleanValue(azArg[1]);
2112 }else
2113
2114 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 && nArg<3 ){
2595 char **azResult; 2115 char **azResult;
2596 int nRow, rc; 2116 int nRow;
2597 char *zErrMsg; 2117 char *zErrMsg;
2598 open_db(p); 2118 open_db(p);
2599 if( nArg==1 ){ 2119 if( nArg==1 ){
2600 rc = sqlite3_get_table(p->db, 2120 rc = sqlite3_get_table(p->db,
2601 "SELECT name FROM sqlite_master " 2121 "SELECT name FROM sqlite_master "
2602 "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'" 2122 "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%' "
2603 "UNION ALL " 2123 "UNION ALL "
2604 "SELECT name FROM sqlite_temp_master " 2124 "SELECT name FROM sqlite_temp_master "
2605 "WHERE type IN ('table','view') " 2125 "WHERE type IN ('table','view') "
2606 "ORDER BY 1", 2126 "ORDER BY 1",
2607 &azResult, &nRow, 0, &zErrMsg 2127 &azResult, &nRow, 0, &zErrMsg
2608 ); 2128 );
2609 }else{ 2129 }else{
2610 zShellStatic = azArg[1]; 2130 zShellStatic = azArg[1];
2611 rc = sqlite3_get_table(p->db, 2131 rc = sqlite3_get_table(p->db,
2612 "SELECT name FROM sqlite_master " 2132 "SELECT name FROM sqlite_master "
2613 "WHERE type IN ('table','view') AND name LIKE '%'||shellstatic()||'%' " 2133 "WHERE type IN ('table','view') AND name LIKE shellstatic() "
2614 "UNION ALL " 2134 "UNION ALL "
2615 "SELECT name FROM sqlite_temp_master " 2135 "SELECT name FROM sqlite_temp_master "
2616 "WHERE type IN ('table','view') AND name LIKE '%'||shellstatic()||'%' " 2136 "WHERE type IN ('table','view') AND name LIKE shellstatic() "
2617 "ORDER BY 1", 2137 "ORDER BY 1",
2618 &azResult, &nRow, 0, &zErrMsg 2138 &azResult, &nRow, 0, &zErrMsg
2619 ); 2139 );
2620 zShellStatic = 0; 2140 zShellStatic = 0;
2621 } 2141 }
2622 if( zErrMsg ){ 2142 if( zErrMsg ){
2623 fprintf(stderr,"Error: %s\n", zErrMsg); 2143 fprintf(stderr,"Error: %s\n", zErrMsg);
2624 sqlite3_free(zErrMsg); 2144 sqlite3_free(zErrMsg);
2625 } 2145 rc = 1;
2626 if( rc==SQLITE_OK ){ 2146 }else if( rc != SQLITE_OK ){
2147 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
2148 rc = 1;
2149 }else{
2627 int len, maxlen = 0; 2150 int len, maxlen = 0;
2628 int i, j; 2151 int i, j;
2629 int nPrintCol, nPrintRow; 2152 int nPrintCol, nPrintRow;
2630 for(i=1; i<=nRow; i++){ 2153 for(i=1; i<=nRow; i++){
2631 if( azResult[i]==0 ) continue; 2154 if( azResult[i]==0 ) continue;
2632 len = strlen30(azResult[i]); 2155 len = strlen30(azResult[i]);
2633 if( len>maxlen ) maxlen = len; 2156 if( len>maxlen ) maxlen = len;
2634 } 2157 }
2635 nPrintCol = 80/(maxlen+2); 2158 nPrintCol = 80/(maxlen+2);
2636 if( nPrintCol<1 ) nPrintCol = 1; 2159 if( nPrintCol<1 ) nPrintCol = 1;
2637 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol; 2160 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
2638 for(i=0; i<nPrintRow; i++){ 2161 for(i=0; i<nPrintRow; i++){
2639 for(j=i+1; j<=nRow; j+=nPrintRow){ 2162 for(j=i+1; j<=nRow; j+=nPrintRow){
2640 char *zSp = j<=nPrintRow ? "" : " "; 2163 char *zSp = j<=nPrintRow ? "" : " ";
2641 printf("%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : ""); 2164 printf("%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : "");
2642 } 2165 }
2643 printf("\n"); 2166 printf("\n");
2644 } 2167 }
2645 }else{
2646 rc = 1;
2647 } 2168 }
2648 sqlite3_free_table(azResult); 2169 sqlite3_free_table(azResult);
2649 }else 2170 }else
2650 2171
2651 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 && nArg>=2 ){ 2172 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
2173 static const struct {
2174 const char *zCtrlName; /* Name of a test-control option */
2175 int ctrlCode; /* Integer code for that option */
2176 } aCtrl[] = {
2177 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
2178 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
2179 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
2180 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
2181 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
2182 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
2183 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
2184 { "assert", SQLITE_TESTCTRL_ASSERT },
2185 { "always", SQLITE_TESTCTRL_ALWAYS },
2186 { "reserve", SQLITE_TESTCTRL_RESERVE },
2187 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
2188 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
2189 { "pghdrsz", SQLITE_TESTCTRL_PGHDRSZ },
2190 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
2191 };
2192 int testctrl = -1;
2193 int rc = 0;
2194 int i, n;
2195 open_db(p);
2196
2197 /* convert testctrl text option to value. allow any unique prefix
2198 ** of the option name, or a numerical value. */
2199 n = strlen30(azArg[1]);
2200 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
2201 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
2202 if( testctrl<0 ){
2203 testctrl = aCtrl[i].ctrlCode;
2204 }else{
2205 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[i]);
2206 testctrl = -1;
2207 break;
2208 }
2209 }
2210 }
2211 if( testctrl<0 ) testctrl = atoi(azArg[1]);
2212 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
2213 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
2214 }else{
2215 switch(testctrl){
2216
2217 /* sqlite3_test_control(int, db, int) */
2218 case SQLITE_TESTCTRL_OPTIMIZATIONS:
2219 case SQLITE_TESTCTRL_RESERVE:
2220 if( nArg==3 ){
2221 int opt = (int)strtol(azArg[2], 0, 0);
2222 rc = sqlite3_test_control(testctrl, p->db, opt);
2223 printf("%d (0x%08x)\n", rc, rc);
2224 } else {
2225 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
2226 azArg[1]);
2227 }
2228 break;
2229
2230 /* sqlite3_test_control(int) */
2231 case SQLITE_TESTCTRL_PRNG_SAVE:
2232 case SQLITE_TESTCTRL_PRNG_RESTORE:
2233 case SQLITE_TESTCTRL_PRNG_RESET:
2234 case SQLITE_TESTCTRL_PGHDRSZ:
2235 if( nArg==2 ){
2236 rc = sqlite3_test_control(testctrl);
2237 printf("%d (0x%08x)\n", rc, rc);
2238 } else {
2239 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
2240 }
2241 break;
2242
2243 /* sqlite3_test_control(int, uint) */
2244 case SQLITE_TESTCTRL_PENDING_BYTE:
2245 if( nArg==3 ){
2246 unsigned int opt = (unsigned int)atoi(azArg[2]);
2247 rc = sqlite3_test_control(testctrl, opt);
2248 printf("%d (0x%08x)\n", rc, rc);
2249 } else {
2250 fprintf(stderr,"Error: testctrl %s takes a single unsigned"
2251 " int option\n", azArg[1]);
2252 }
2253 break;
2254
2255 /* sqlite3_test_control(int, int) */
2256 case SQLITE_TESTCTRL_ASSERT:
2257 case SQLITE_TESTCTRL_ALWAYS:
2258 if( nArg==3 ){
2259 int opt = atoi(azArg[2]);
2260 rc = sqlite3_test_control(testctrl, opt);
2261 printf("%d (0x%08x)\n", rc, rc);
2262 } else {
2263 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
2264 azArg[1]);
2265 }
2266 break;
2267
2268 /* sqlite3_test_control(int, char *) */
2269 #ifdef SQLITE_N_KEYWORD
2270 case SQLITE_TESTCTRL_ISKEYWORD:
2271 if( nArg==3 ){
2272 const char *opt = azArg[2];
2273 rc = sqlite3_test_control(testctrl, opt);
2274 printf("%d (0x%08x)\n", rc, rc);
2275 } else {
2276 fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
2277 azArg[1]);
2278 }
2279 break;
2280 #endif
2281
2282 case SQLITE_TESTCTRL_BITVEC_TEST:
2283 case SQLITE_TESTCTRL_FAULT_INSTALL:
2284 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
2285 case SQLITE_TESTCTRL_SCRATCHMALLOC:
2286 default:
2287 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
2288 azArg[1]);
2289 break;
2290 }
2291 }
2292 }else
2293
2294 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 && nArg==2 ){
2652 open_db(p); 2295 open_db(p);
2653 sqlite3_busy_timeout(p->db, atoi(azArg[1])); 2296 sqlite3_busy_timeout(p->db, atoi(azArg[1]));
2654 }else 2297 }else
2655 2298
2656 #if HAS_TIMER 2299 if( HAS_TIMER && c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0
2657 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 && nArg>1 ){ 2300 && nArg==2
2301 ){
2658 enableTimer = booleanValue(azArg[1]); 2302 enableTimer = booleanValue(azArg[1]);
2659 }else 2303 }else
2660 #endif 2304
2661 2305 if( c=='w' && strncmp(azArg[0], "width", n)==0 && nArg>1 ){
2662 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
2663 int j; 2306 int j;
2664 assert( nArg<=ArraySize(azArg) ); 2307 assert( nArg<=ArraySize(azArg) );
2665 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){ 2308 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
2666 p->colWidth[j-1] = atoi(azArg[j]); 2309 p->colWidth[j-1] = atoi(azArg[j]);
2667 } 2310 }
2668 }else 2311 }else
2669 2312
2670
2671 { 2313 {
2672 fprintf(stderr, "unknown command or invalid arguments: " 2314 fprintf(stderr, "Error: unknown command or invalid arguments: "
2673 " \"%s\". Enter \".help\" for help\n", azArg[0]); 2315 " \"%s\". Enter \".help\" for help\n", azArg[0]);
2316 rc = 1;
2674 } 2317 }
2675 2318
2676 return rc; 2319 return rc;
2677 } 2320 }
2678 2321
2679 /* 2322 /*
2680 ** Return TRUE if a semicolon occurs anywhere in the first N characters 2323 ** Return TRUE if a semicolon occurs anywhere in the first N characters
2681 ** of string z[]. 2324 ** of string z[].
2682 */ 2325 */
2683 static int _contains_semicolon(const char *z, int N){ 2326 static int _contains_semicolon(const char *z, int N){
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
2766 free(zLine); 2409 free(zLine);
2767 zLine = one_input_line(zSql, in); 2410 zLine = one_input_line(zSql, in);
2768 if( zLine==0 ){ 2411 if( zLine==0 ){
2769 break; /* We have reached EOF */ 2412 break; /* We have reached EOF */
2770 } 2413 }
2771 if( seenInterrupt ){ 2414 if( seenInterrupt ){
2772 if( in!=0 ) break; 2415 if( in!=0 ) break;
2773 seenInterrupt = 0; 2416 seenInterrupt = 0;
2774 } 2417 }
2775 lineno++; 2418 lineno++;
2776 if( p->echoOn ) printf("%s\n", zLine);
2777 if( (zSql==0 || zSql[0]==0) && _all_whitespace(zLine) ) continue; 2419 if( (zSql==0 || zSql[0]==0) && _all_whitespace(zLine) ) continue;
2778 if( zLine && zLine[0]=='.' && nSql==0 ){ 2420 if( zLine && zLine[0]=='.' && nSql==0 ){
2421 if( p->echoOn ) printf("%s\n", zLine);
2779 rc = do_meta_command(zLine, p); 2422 rc = do_meta_command(zLine, p);
2780 if( rc==2 ){ 2423 if( rc==2 ){ /* exit requested */
2781 break; 2424 break;
2782 }else if( rc ){ 2425 }else if( rc ){
2783 errCnt++; 2426 errCnt++;
2784 } 2427 }
2785 continue; 2428 continue;
2786 } 2429 }
2787 if( _is_command_terminator(zLine) && _is_complete(zSql, nSql) ){ 2430 if( _is_command_terminator(zLine) && _is_complete(zSql, nSql) ){
2788 memcpy(zLine,";",2); 2431 memcpy(zLine,";",2);
2789 } 2432 }
2790 nSqlPrior = nSql; 2433 nSqlPrior = nSql;
2791 if( zSql==0 ){ 2434 if( zSql==0 ){
2792 int i; 2435 int i;
2793 for(i=0; zLine[i] && isspace((unsigned char)zLine[i]); i++){} 2436 for(i=0; zLine[i] && isspace((unsigned char)zLine[i]); i++){}
2794 if( zLine[i]!=0 ){ 2437 if( zLine[i]!=0 ){
2795 nSql = strlen30(zLine); 2438 nSql = strlen30(zLine);
2796 zSql = malloc( nSql+3 ); 2439 zSql = malloc( nSql+3 );
2797 if( zSql==0 ){ 2440 if( zSql==0 ){
2798 fprintf(stderr, "out of memory\n"); 2441 fprintf(stderr, "Error: out of memory\n");
2799 exit(1); 2442 exit(1);
2800 } 2443 }
2801 memcpy(zSql, zLine, nSql+1); 2444 memcpy(zSql, zLine, nSql+1);
2802 startline = lineno; 2445 startline = lineno;
2803 } 2446 }
2804 }else{ 2447 }else{
2805 int len = strlen30(zLine); 2448 int len = strlen30(zLine);
2806 zSql = realloc( zSql, nSql + len + 4 ); 2449 zSql = realloc( zSql, nSql + len + 4 );
2807 if( zSql==0 ){ 2450 if( zSql==0 ){
2808 fprintf(stderr,"%s: out of memory!\n", Argv0); 2451 fprintf(stderr,"Error: out of memory\n");
2809 exit(1); 2452 exit(1);
2810 } 2453 }
2811 zSql[nSql++] = '\n'; 2454 zSql[nSql++] = '\n';
2812 memcpy(&zSql[nSql], zLine, len+1); 2455 memcpy(&zSql[nSql], zLine, len+1);
2813 nSql += len; 2456 nSql += len;
2814 } 2457 }
2815 if( zSql && _contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior) 2458 if( zSql && _contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
2816 && sqlite3_complete(zSql) ){ 2459 && sqlite3_complete(zSql) ){
2817 p->cnt = 0; 2460 p->cnt = 0;
2818 open_db(p); 2461 open_db(p);
2819 BEGIN_TIMER; 2462 BEGIN_TIMER;
2820 rc = sqlite3_exec(p->db, zSql, callback, p, &zErrMsg); 2463 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
2821 END_TIMER; 2464 END_TIMER;
2822 if( rc || zErrMsg ){ 2465 if( rc || zErrMsg ){
2823 char zPrefix[100]; 2466 char zPrefix[100];
2824 if( in!=0 || !stdin_is_interactive ){ 2467 if( in!=0 || !stdin_is_interactive ){
2825 sqlite3_snprintf(sizeof(zPrefix), zPrefix, 2468 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
2826 "SQL error near line %d:", startline); 2469 "Error: near line %d:", startline);
2827 }else{ 2470 }else{
2828 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "SQL error:"); 2471 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
2829 } 2472 }
2830 if( zErrMsg!=0 ){ 2473 if( zErrMsg!=0 ){
2831 printf("%s %s\n", zPrefix, zErrMsg); 2474 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
2832 sqlite3_free(zErrMsg); 2475 sqlite3_free(zErrMsg);
2833 zErrMsg = 0; 2476 zErrMsg = 0;
2834 }else{ 2477 }else{
2835 printf("%s %s\n", zPrefix, sqlite3_errmsg(p->db)); 2478 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
2836 } 2479 }
2837 errCnt++; 2480 errCnt++;
2838 } 2481 }
2839 free(zSql); 2482 free(zSql);
2840 zSql = 0; 2483 zSql = 0;
2841 nSql = 0; 2484 nSql = 0;
2842 } 2485 }
2843 } 2486 }
2844 if( zSql ){ 2487 if( zSql ){
2845 if( !_all_whitespace(zSql) ) fprintf(stderr, "Incomplete SQL: %s\n", zSql); 2488 if( !_all_whitespace(zSql) ){
2489 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
2490 }
2846 free(zSql); 2491 free(zSql);
2847 } 2492 }
2848 free(zLine); 2493 free(zLine);
2849 return errCnt; 2494 return errCnt;
2850 } 2495 }
2851 2496
2852 /* 2497 /*
2853 ** Return a pathname which is the user's home directory. A 2498 ** Return a pathname which is the user's home directory. A
2854 ** 0 return indicates an error of some kind. Space to hold the 2499 ** 0 return indicates an error of some kind. Space to hold the
2855 ** resulting string is obtained from malloc(). The calling 2500 ** resulting string is obtained from malloc(). The calling
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
2907 if( z ) memcpy(z, home_dir, n); 2552 if( z ) memcpy(z, home_dir, n);
2908 home_dir = z; 2553 home_dir = z;
2909 } 2554 }
2910 2555
2911 return home_dir; 2556 return home_dir;
2912 } 2557 }
2913 2558
2914 /* 2559 /*
2915 ** Read input from the file given by sqliterc_override. Or if that 2560 ** Read input from the file given by sqliterc_override. Or if that
2916 ** parameter is NULL, take input from ~/.sqliterc 2561 ** parameter is NULL, take input from ~/.sqliterc
2562 **
2563 ** Returns the number of errors.
2917 */ 2564 */
2918 static void process_sqliterc( 2565 static int process_sqliterc(
2919 struct callback_data *p, /* Configuration data */ 2566 struct callback_data *p, /* Configuration data */
2920 const char *sqliterc_override /* Name of config file. NULL to use default */ 2567 const char *sqliterc_override /* Name of config file. NULL to use default */
2921 ){ 2568 ){
2922 char *home_dir = NULL; 2569 char *home_dir = NULL;
2923 const char *sqliterc = sqliterc_override; 2570 const char *sqliterc = sqliterc_override;
2924 char *zBuf = 0; 2571 char *zBuf = 0;
2925 FILE *in = NULL; 2572 FILE *in = NULL;
2926 int nBuf; 2573 int nBuf;
2574 int rc = 0;
2927 2575
2928 if (sqliterc == NULL) { 2576 if (sqliterc == NULL) {
2929 home_dir = find_home_dir(); 2577 home_dir = find_home_dir();
2930 if( home_dir==0 ){ 2578 if( home_dir==0 ){
2931 #if !defined(__RTP__) && !defined(_WRS_KERNEL) 2579 #if !defined(__RTP__) && !defined(_WRS_KERNEL)
2932 fprintf(stderr,"%s: cannot locate your home directory!\n", Argv0); 2580 fprintf(stderr,"%s: Error: cannot locate your home directory\n", Argv0);
2933 #endif 2581 #endif
2934 return; 2582 return 1;
2935 } 2583 }
2936 nBuf = strlen30(home_dir) + 16; 2584 nBuf = strlen30(home_dir) + 16;
2937 zBuf = malloc( nBuf ); 2585 zBuf = malloc( nBuf );
2938 if( zBuf==0 ){ 2586 if( zBuf==0 ){
2939 fprintf(stderr,"%s: out of memory!\n", Argv0); 2587 fprintf(stderr,"%s: Error: out of memory\n",Argv0);
2940 exit(1); 2588 return 1;
2941 } 2589 }
2942 sqlite3_snprintf(nBuf, zBuf,"%s/.sqliterc",home_dir); 2590 sqlite3_snprintf(nBuf, zBuf,"%s/.sqliterc",home_dir);
2943 free(home_dir); 2591 free(home_dir);
2944 sqliterc = (const char*)zBuf; 2592 sqliterc = (const char*)zBuf;
2945 } 2593 }
2946 in = fopen(sqliterc,"rb"); 2594 in = fopen(sqliterc,"rb");
2947 if( in ){ 2595 if( in ){
2948 if( stdin_is_interactive ){ 2596 if( stdin_is_interactive ){
2949 printf("-- Loading resources from %s\n",sqliterc); 2597 fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
2950 } 2598 }
2951 process_input(p,in); 2599 rc = process_input(p,in);
2952 fclose(in); 2600 fclose(in);
2953 } 2601 }
2954 free(zBuf); 2602 free(zBuf);
2955 return; 2603 return rc;
2956 } 2604 }
2957 2605
2958 /* 2606 /*
2959 ** Show available command line options 2607 ** Show available command line options
2960 */ 2608 */
2961 static const char zOptions[] = 2609 static const char zOptions[] =
2610 " -help show this message\n"
2962 " -init filename read/process named file\n" 2611 " -init filename read/process named file\n"
2963 " -echo print commands before execution\n" 2612 " -echo print commands before execution\n"
2964 " -[no]header turn headers on or off\n" 2613 " -[no]header turn headers on or off\n"
2965 " -bail stop after hitting an error\n" 2614 " -bail stop after hitting an error\n"
2966 " -interactive force interactive I/O\n" 2615 " -interactive force interactive I/O\n"
2967 " -batch force batch I/O\n" 2616 " -batch force batch I/O\n"
2968 " -column set output mode to 'column'\n" 2617 " -column set output mode to 'column'\n"
2969 " -csv set output mode to 'csv'\n" 2618 " -csv set output mode to 'csv'\n"
2970 " -html set output mode to HTML\n" 2619 " -html set output mode to HTML\n"
2971 " -line set output mode to 'line'\n" 2620 " -line set output mode to 'line'\n"
2972 " -list set output mode to 'list'\n" 2621 " -list set output mode to 'list'\n"
2973 " -separator 'x' set output field separator (|)\n" 2622 " -separator 'x' set output field separator (|)\n"
2623 " -stats print memory stats before each finalize\n"
2974 " -nullvalue 'text' set text string for NULL values\n" 2624 " -nullvalue 'text' set text string for NULL values\n"
2975 " -version show SQLite version\n" 2625 " -version show SQLite version\n"
2626 " -vfs NAME use NAME as the default VFS\n"
2627 #ifdef SQLITE_ENABLE_VFSTRACE
2628 " -vfstrace enable tracing of all VFS calls\n"
2629 #endif
2976 ; 2630 ;
2977 static void usage(int showDetail){ 2631 static void usage(int showDetail){
2978 fprintf(stderr, 2632 fprintf(stderr,
2979 "Usage: %s [OPTIONS] FILENAME [SQL]\n" 2633 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
2980 "FILENAME is the name of an SQLite database. A new database is created\n" 2634 "FILENAME is the name of an SQLite database. A new database is created\n"
2981 "if the file does not previously exist.\n", Argv0); 2635 "if the file does not previously exist.\n", Argv0);
2982 if( showDetail ){ 2636 if( showDetail ){
2983 fprintf(stderr, "OPTIONS include:\n%s", zOptions); 2637 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
2984 }else{ 2638 }else{
2985 fprintf(stderr, "Use the -help option for additional information\n"); 2639 fprintf(stderr, "Use the -help option for additional information\n");
2986 } 2640 }
2987 exit(1); 2641 exit(1);
2988 } 2642 }
2989 2643
2990 /* 2644 /*
2991 ** Initialize the state information in data 2645 ** Initialize the state information in data
2992 */ 2646 */
2993 static void main_init(struct callback_data *data) { 2647 static void main_init(struct callback_data *data) {
2994 memset(data, 0, sizeof(*data)); 2648 memset(data, 0, sizeof(*data));
2995 data->mode = MODE_List; 2649 data->mode = MODE_List;
2996 memcpy(data->separator,"|", 2); 2650 memcpy(data->separator,"|", 2);
2997 data->showHeader = 0; 2651 data->showHeader = 0;
2652 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
2998 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> "); 2653 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
2999 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> "); 2654 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
2655 sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);
3000 } 2656 }
3001 2657
3002 int main(int argc, char **argv){ 2658 int main(int argc, char **argv){
3003 char *zErrMsg = 0; 2659 char *zErrMsg = 0;
3004 struct callback_data data; 2660 struct callback_data data;
3005 const char *zInitFile = 0; 2661 const char *zInitFile = 0;
3006 char *zFirstCmd = 0; 2662 char *zFirstCmd = 0;
3007 int i; 2663 int i;
3008 int rc = 0; 2664 int rc = 0;
3009 2665
(...skipping 11 matching lines...) Expand all
3021 2677
3022 /* Make sure we have a valid signal handler early, before anything 2678 /* Make sure we have a valid signal handler early, before anything
3023 ** else is done. 2679 ** else is done.
3024 */ 2680 */
3025 #ifdef SIGINT 2681 #ifdef SIGINT
3026 signal(SIGINT, interrupt_handler); 2682 signal(SIGINT, interrupt_handler);
3027 #endif 2683 #endif
3028 2684
3029 /* Do an initial pass through the command-line argument to locate 2685 /* Do an initial pass through the command-line argument to locate
3030 ** the name of the database file, the name of the initialization file, 2686 ** the name of the database file, the name of the initialization file,
2687 ** the size of the alternative malloc heap,
3031 ** and the first command to execute. 2688 ** and the first command to execute.
3032 */ 2689 */
3033 for(i=1; i<argc-1; i++){ 2690 for(i=1; i<argc-1; i++){
3034 char *z; 2691 char *z;
3035 if( argv[i][0]!='-' ) break; 2692 if( argv[i][0]!='-' ) break;
3036 z = argv[i]; 2693 z = argv[i];
3037 if( z[0]=='-' && z[1]=='-' ) z++; 2694 if( z[0]=='-' && z[1]=='-' ) z++;
3038 if( strcmp(argv[i],"-separator")==0 || strcmp(argv[i],"-nullvalue")==0 ){ 2695 if( strcmp(argv[i],"-separator")==0 || strcmp(argv[i],"-nullvalue")==0 ){
3039 i++; 2696 i++;
3040 }else if( strcmp(argv[i],"-init")==0 ){ 2697 }else if( strcmp(argv[i],"-init")==0 ){
3041 i++; 2698 i++;
3042 zInitFile = argv[i]; 2699 zInitFile = argv[i];
2700 /* Need to check for batch mode here to so we can avoid printing
2701 ** informational messages (like from process_sqliterc) before
2702 ** we do the actual processing of arguments later in a second pass.
2703 */
2704 }else if( strcmp(argv[i],"-batch")==0 ){
2705 stdin_is_interactive = 0;
2706 }else if( strcmp(argv[i],"-heap")==0 ){
2707 int j, c;
2708 const char *zSize;
2709 sqlite3_int64 szHeap;
2710
2711 zSize = argv[++i];
2712 szHeap = atoi(zSize);
2713 for(j=0; (c = zSize[j])!=0; j++){
2714 if( c=='M' ){ szHeap *= 1000000; break; }
2715 if( c=='K' ){ szHeap *= 1000; break; }
2716 if( c=='G' ){ szHeap *= 1000000000; break; }
2717 }
2718 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
2719 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
2720 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
2721 #endif
2722 #ifdef SQLITE_ENABLE_VFSTRACE
2723 }else if( strcmp(argv[i],"-vfstrace")==0 ){
2724 extern int vfstrace_register(
2725 const char *zTraceName,
2726 const char *zOldVfsName,
2727 int (*xOut)(const char*,void*),
2728 void *pOutArg,
2729 int makeDefault
2730 );
2731 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
2732 #endif
2733 }else if( strcmp(argv[i],"-vfs")==0 ){
2734 sqlite3_vfs *pVfs = sqlite3_vfs_find(argv[++i]);
2735 if( pVfs ){
2736 sqlite3_vfs_register(pVfs, 1);
2737 }else{
2738 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
2739 exit(1);
2740 }
3043 } 2741 }
3044 } 2742 }
3045 if( i<argc ){ 2743 if( i<argc ){
3046 #if defined(SQLITE_OS_OS2) && SQLITE_OS_OS2 2744 #if defined(SQLITE_OS_OS2) && SQLITE_OS_OS2
3047 data.zDbFilename = (const char *)convertCpPathToUtf8( argv[i++] ); 2745 data.zDbFilename = (const char *)convertCpPathToUtf8( argv[i++] );
3048 #else 2746 #else
3049 data.zDbFilename = argv[i++]; 2747 data.zDbFilename = argv[i++];
3050 #endif 2748 #endif
3051 }else{ 2749 }else{
3052 #ifndef SQLITE_OMIT_MEMORYDB 2750 #ifndef SQLITE_OMIT_MEMORYDB
3053 data.zDbFilename = ":memory:"; 2751 data.zDbFilename = ":memory:";
3054 #else 2752 #else
3055 data.zDbFilename = 0; 2753 data.zDbFilename = 0;
3056 #endif 2754 #endif
3057 } 2755 }
3058 if( i<argc ){ 2756 if( i<argc ){
3059 zFirstCmd = argv[i++]; 2757 zFirstCmd = argv[i++];
3060 } 2758 }
2759 if( i<argc ){
2760 fprintf(stderr,"%s: Error: too many options: \"%s\"\n", Argv0, argv[i]);
2761 fprintf(stderr,"Use -help for a list of options.\n");
2762 return 1;
2763 }
3061 data.out = stdout; 2764 data.out = stdout;
3062 2765
3063 #ifdef SQLITE_OMIT_MEMORYDB 2766 #ifdef SQLITE_OMIT_MEMORYDB
3064 if( data.zDbFilename==0 ){ 2767 if( data.zDbFilename==0 ){
3065 fprintf(stderr,"%s: no database filename specified\n", argv[0]); 2768 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
3066 exit(1); 2769 return 1;
3067 } 2770 }
3068 #endif 2771 #endif
3069 2772
3070 /* Go ahead and open the database file if it already exists. If the 2773 /* Go ahead and open the database file if it already exists. If the
3071 ** file does not exist, delay opening it. This prevents empty database 2774 ** file does not exist, delay opening it. This prevents empty database
3072 ** files from being created if a user mistypes the database name argument 2775 ** files from being created if a user mistypes the database name argument
3073 ** to the sqlite command-line tool. 2776 ** to the sqlite command-line tool.
3074 */ 2777 */
3075 if( access(data.zDbFilename, 0)==0 ){ 2778 if( access(data.zDbFilename, 0)==0 ){
3076 open_db(&data); 2779 open_db(&data);
3077 } 2780 }
3078 2781
3079 /* Process the initialization file if there is one. If no -init option 2782 /* Process the initialization file if there is one. If no -init option
3080 ** is given on the command line, look for a file named ~/.sqliterc and 2783 ** is given on the command line, look for a file named ~/.sqliterc and
3081 ** try to process it. 2784 ** try to process it.
3082 */ 2785 */
3083 process_sqliterc(&data,zInitFile); 2786 rc = process_sqliterc(&data,zInitFile);
2787 if( rc>0 ){
2788 return rc;
2789 }
3084 2790
3085 /* Make a second pass through the command-line argument and set 2791 /* Make a second pass through the command-line argument and set
3086 ** options. This second pass is delayed until after the initialization 2792 ** options. This second pass is delayed until after the initialization
3087 ** file is processed so that the command-line arguments will override 2793 ** file is processed so that the command-line arguments will override
3088 ** settings in the initialization file. 2794 ** settings in the initialization file.
3089 */ 2795 */
3090 for(i=1; i<argc && argv[i][0]=='-'; i++){ 2796 for(i=1; i<argc && argv[i][0]=='-'; i++){
3091 char *z = argv[i]; 2797 char *z = argv[i];
3092 if( z[1]=='-' ){ z++; } 2798 if( z[1]=='-' ){ z++; }
3093 if( strcmp(z,"-init")==0 ){ 2799 if( strcmp(z,"-init")==0 ){
3094 i++; 2800 i++;
3095 }else if( strcmp(z,"-html")==0 ){ 2801 }else if( strcmp(z,"-html")==0 ){
3096 data.mode = MODE_Html; 2802 data.mode = MODE_Html;
3097 }else if( strcmp(z,"-list")==0 ){ 2803 }else if( strcmp(z,"-list")==0 ){
3098 data.mode = MODE_List; 2804 data.mode = MODE_List;
3099 }else if( strcmp(z,"-line")==0 ){ 2805 }else if( strcmp(z,"-line")==0 ){
3100 data.mode = MODE_Line; 2806 data.mode = MODE_Line;
3101 }else if( strcmp(z,"-column")==0 ){ 2807 }else if( strcmp(z,"-column")==0 ){
3102 data.mode = MODE_Column; 2808 data.mode = MODE_Column;
3103 }else if( strcmp(z,"-csv")==0 ){ 2809 }else if( strcmp(z,"-csv")==0 ){
3104 data.mode = MODE_Csv; 2810 data.mode = MODE_Csv;
3105 memcpy(data.separator,",",2); 2811 memcpy(data.separator,",",2);
3106 }else if( strcmp(z,"-separator")==0 ){ 2812 }else if( strcmp(z,"-separator")==0 ){
3107 i++; 2813 i++;
2814 if(i>=argc){
2815 fprintf(stderr,"%s: Error: missing argument for option: %s\n", Argv0, z) ;
2816 fprintf(stderr,"Use -help for a list of options.\n");
2817 return 1;
2818 }
3108 sqlite3_snprintf(sizeof(data.separator), data.separator, 2819 sqlite3_snprintf(sizeof(data.separator), data.separator,
3109 "%.*s",(int)sizeof(data.separator)-1,argv[i]); 2820 "%.*s",(int)sizeof(data.separator)-1,argv[i]);
3110 }else if( strcmp(z,"-nullvalue")==0 ){ 2821 }else if( strcmp(z,"-nullvalue")==0 ){
3111 i++; 2822 i++;
2823 if(i>=argc){
2824 fprintf(stderr,"%s: Error: missing argument for option: %s\n", Argv0, z) ;
2825 fprintf(stderr,"Use -help for a list of options.\n");
2826 return 1;
2827 }
3112 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue, 2828 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue,
3113 "%.*s",(int)sizeof(data.nullvalue)-1,argv[i]); 2829 "%.*s",(int)sizeof(data.nullvalue)-1,argv[i]);
3114 }else if( strcmp(z,"-header")==0 ){ 2830 }else if( strcmp(z,"-header")==0 ){
3115 data.showHeader = 1; 2831 data.showHeader = 1;
3116 }else if( strcmp(z,"-noheader")==0 ){ 2832 }else if( strcmp(z,"-noheader")==0 ){
3117 data.showHeader = 0; 2833 data.showHeader = 0;
3118 }else if( strcmp(z,"-echo")==0 ){ 2834 }else if( strcmp(z,"-echo")==0 ){
3119 data.echoOn = 1; 2835 data.echoOn = 1;
2836 }else if( strcmp(z,"-stats")==0 ){
2837 data.statsOn = 1;
3120 }else if( strcmp(z,"-bail")==0 ){ 2838 }else if( strcmp(z,"-bail")==0 ){
3121 bail_on_error = 1; 2839 bail_on_error = 1;
3122 }else if( strcmp(z,"-version")==0 ){ 2840 }else if( strcmp(z,"-version")==0 ){
3123 printf("%s\n", sqlite3_libversion()); 2841 printf("%s\n", sqlite3_libversion());
3124 return 0; 2842 return 0;
3125 }else if( strcmp(z,"-interactive")==0 ){ 2843 }else if( strcmp(z,"-interactive")==0 ){
3126 stdin_is_interactive = 1; 2844 stdin_is_interactive = 1;
3127 }else if( strcmp(z,"-batch")==0 ){ 2845 }else if( strcmp(z,"-batch")==0 ){
3128 stdin_is_interactive = 0; 2846 stdin_is_interactive = 0;
2847 }else if( strcmp(z,"-heap")==0 ){
2848 i++;
2849 }else if( strcmp(z,"-vfs")==0 ){
2850 i++;
2851 }else if( strcmp(z,"-vfstrace")==0 ){
2852 i++;
3129 }else if( strcmp(z,"-help")==0 || strcmp(z, "--help")==0 ){ 2853 }else if( strcmp(z,"-help")==0 || strcmp(z, "--help")==0 ){
3130 usage(1); 2854 usage(1);
3131 }else{ 2855 }else{
3132 fprintf(stderr,"%s: unknown option: %s\n", Argv0, z); 2856 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
3133 fprintf(stderr,"Use -help for a list of options.\n"); 2857 fprintf(stderr,"Use -help for a list of options.\n");
3134 return 1; 2858 return 1;
3135 } 2859 }
3136 } 2860 }
3137 2861
3138 if( zFirstCmd ){ 2862 if( zFirstCmd ){
3139 /* Run just the command that follows the database name 2863 /* Run just the command that follows the database name
3140 */ 2864 */
3141 if( zFirstCmd[0]=='.' ){ 2865 if( zFirstCmd[0]=='.' ){
3142 do_meta_command(zFirstCmd, &data); 2866 rc = do_meta_command(zFirstCmd, &data);
3143 exit(0);
3144 }else{ 2867 }else{
3145 int rc;
3146 open_db(&data); 2868 open_db(&data);
3147 rc = sqlite3_exec(data.db, zFirstCmd, callback, &data, &zErrMsg); 2869 rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg);
3148 if( rc!=0 && zErrMsg!=0 ){ 2870 if( zErrMsg!=0 ){
3149 fprintf(stderr,"SQL error: %s\n", zErrMsg); 2871 fprintf(stderr,"Error: %s\n", zErrMsg);
3150 exit(1); 2872 return rc!=0 ? rc : 1;
2873 }else if( rc!=0 ){
2874 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", zFirstCmd);
2875 return rc;
3151 } 2876 }
3152 } 2877 }
3153 }else{ 2878 }else{
3154 /* Run commands received from standard input 2879 /* Run commands received from standard input
3155 */ 2880 */
3156 if( stdin_is_interactive ){ 2881 if( stdin_is_interactive ){
3157 char *zHome; 2882 char *zHome;
3158 char *zHistory = 0; 2883 char *zHistory = 0;
3159 int nHistory; 2884 int nHistory;
3160 printf( 2885 printf(
(...skipping 17 matching lines...) Expand all
3178 stifle_history(100); 2903 stifle_history(100);
3179 write_history(zHistory); 2904 write_history(zHistory);
3180 free(zHistory); 2905 free(zHistory);
3181 } 2906 }
3182 free(zHome); 2907 free(zHome);
3183 }else{ 2908 }else{
3184 rc = process_input(&data, stdin); 2909 rc = process_input(&data, stdin);
3185 } 2910 }
3186 } 2911 }
3187 set_table_name(&data, 0); 2912 set_table_name(&data, 0);
3188 if( db ){ 2913 if( data.db ){
3189 if( sqlite3_close(db)!=SQLITE_OK ){ 2914 sqlite3_close(data.db);
3190 fprintf(stderr,"error closing database: %s\n", sqlite3_errmsg(db));
3191 }
3192 } 2915 }
3193 return rc; 2916 return rc;
3194 } 2917 }
OLDNEW
« no previous file with comments | « third_party/sqlite/src/src/select.c ('k') | third_party/sqlite/src/src/sqlite.h.in » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698