blob: 9dde40b932a94bb31956ab3d1d75478c7813dc30 [file] [log] [blame]
drh75897232000-05-29 14:26:00 +00001/*
drhb19a2bc2001-09-16 00:13:26 +00002** 2001 September 15
drh75897232000-05-29 14:26:00 +00003**
drhb19a2bc2001-09-16 00:13:26 +00004** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
drh75897232000-05-29 14:26:00 +00006**
drhb19a2bc2001-09-16 00:13:26 +00007** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
drh75897232000-05-29 14:26:00 +000010**
11*************************************************************************
12** This file contains code to implement the "sqlite" command line
13** utility for accessing SQLite databases.
14**
drhde7446b2009-05-31 17:16:09 +000015** $Id: shell.c,v 1.210 2009/05/31 17:16:10 drh Exp $
drh75897232000-05-29 14:26:00 +000016*/
shane18e526c2008-12-10 22:30:24 +000017#if defined(_WIN32) || defined(WIN32)
18/* This needs to come before any includes for MSVC compiler */
19#define _CRT_SECURE_NO_WARNINGS
20#endif
21
drh75897232000-05-29 14:26:00 +000022#include <stdlib.h>
23#include <string.h>
24#include <stdio.h>
danielk19772a02e332004-06-05 08:04:36 +000025#include <assert.h>
drh1d482dd2004-05-31 18:23:07 +000026#include "sqlite3.h"
drh75897232000-05-29 14:26:00 +000027#include <ctype.h>
drhb0603412007-02-28 04:47:26 +000028#include <stdarg.h>
persicom7e2dfdd2002-04-18 02:46:52 +000029
drh454ad582007-11-26 22:54:27 +000030#if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__)
drh4c504392000-10-16 22:06:40 +000031# include <signal.h>
chw97185482008-11-17 08:05:31 +000032# if !defined(__RTP__) && !defined(_WRS_KERNEL)
33# include <pwd.h>
34# endif
drhdd45df82002-04-18 12:39:03 +000035# include <unistd.h>
36# include <sys/types.h>
drh4c504392000-10-16 22:06:40 +000037#endif
drh75897232000-05-29 14:26:00 +000038
drhcdb36b72006-06-12 12:57:45 +000039#ifdef __OS2__
40# include <unistd.h>
41#endif
42
drh16e59552000-07-31 11:57:37 +000043#if defined(HAVE_READLINE) && HAVE_READLINE==1
drh8e7e7a22000-05-30 18:45:23 +000044# include <readline/readline.h>
45# include <readline/history.h>
46#else
drh9347b202003-07-18 01:30:59 +000047# define readline(p) local_getline(p,stdin)
persicom1d0b8722002-04-18 02:53:04 +000048# define add_history(X)
drh67505e72002-04-19 12:34:06 +000049# define read_history(X)
50# define write_history(X)
51# define stifle_history(X)
drh75897232000-05-29 14:26:00 +000052#endif
53
adamd2e8464a2006-09-06 21:39:40 +000054#if defined(_WIN32) || defined(WIN32)
55# include <io.h>
shane18e526c2008-12-10 22:30:24 +000056#define isatty(h) _isatty(h)
57#define access(f,m) _access((f),(m))
adamd2e8464a2006-09-06 21:39:40 +000058#else
drh4328c8b2003-04-26 02:50:11 +000059/* Make sure isatty() has a prototype.
60*/
61extern int isatty();
adamd2e8464a2006-09-06 21:39:40 +000062#endif
drh4328c8b2003-04-26 02:50:11 +000063
chw65d3c132007-11-12 21:09:10 +000064#if defined(_WIN32_WCE)
65/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
66 * thus we always assume that we have a console. That can be
67 * overridden with the -batch command line option.
68 */
69#define isatty(x) 1
70#endif
71
chw97185482008-11-17 08:05:31 +000072#if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__) && !defined(__RTP__) && !defined(_WRS_KERNEL)
drh3b1a9882007-11-02 12:53:03 +000073#include <sys/time.h>
74#include <sys/resource.h>
75
drhda108222009-02-25 19:07:24 +000076/* Saved resource information for the beginning of an operation */
77static struct rusage sBegin;
78
79/* True if the timer is enabled */
80static int enableTimer = 0;
81
82/*
83** Begin timing an operation
84*/
85static void beginTimer(void){
86 if( enableTimer ){
87 getrusage(RUSAGE_SELF, &sBegin);
88 }
89}
90
91/* Return the difference of two time_structs in seconds */
92static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
93 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
94 (double)(pEnd->tv_sec - pStart->tv_sec);
95}
96
97/*
98** Print the timing results.
99*/
100static void endTimer(void){
101 if( enableTimer ){
102 struct rusage sEnd;
103 getrusage(RUSAGE_SELF, &sEnd);
104 printf("CPU Time: user %f sys %f\n",
105 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
106 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
107 }
108}
109#define BEGIN_TIMER beginTimer()
110#define END_TIMER endTimer()
111#define HAS_TIMER 1
112#else
113#define BEGIN_TIMER
114#define END_TIMER
115#define HAS_TIMER 0
116#endif
117
shanec0688ea2009-03-05 03:48:06 +0000118/*
119** Used to prevent warnings about unused parameters
120*/
121#define UNUSED_PARAMETER(x) (void)(x)
122
danielk1977c8c70692009-02-25 15:22:02 +0000123
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
133static int genfkey_create_triggers(sqlite3 *, const char *, void *,
134 int (*)(void *, int, const char *)
135);
136
137struct GenfkeyCb {
138 void *pCtx;
139 int eType;
140 int (*xData)(void *, int, const char *);
141};
142typedef 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
199typedef struct SchemaTable SchemaTable;
200struct 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
214typedef struct schema_vtab schema_vtab;
215typedef struct schema_cursor schema_cursor;
216
217/* A schema table object */
218struct schema_vtab {
219 sqlite3_vtab base;
220 sqlite3 *db;
221 SchemaTable *pType;
222};
223
224/* A schema table cursor object */
225struct 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*/
236static int schemaDestroy(sqlite3_vtab *pVtab){
237 sqlite3_free(pVtab);
238 return 0;
239}
240
241/*
242** Table constructor for the schema module.
243*/
244static 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
shanec0688ea2009-03-05 03:48:06 +0000255 UNUSED_PARAMETER(pzErr);
danielk1977c8c70692009-02-25 15:22:02 +0000256 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*/
283static int schemaOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
284 int rc = SQLITE_NOMEM;
285 schema_cursor *pCur;
shanec0688ea2009-03-05 03:48:06 +0000286 UNUSED_PARAMETER(pVTab);
danielk1977c8c70692009-02-25 15:22:02 +0000287 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*/
299static 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
308static 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*/
330static 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*/
349static 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
355static int finalize(sqlite3_stmt **ppStmt){
356 int rc = sqlite3_finalize(*ppStmt);
357 *ppStmt = 0;
358 return rc;
359}
360
361static 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*/
369static 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
433next_exit:
434 /* TODO: Handle rc */
435 return rc;
436}
437
438/*
439** Reset a schema table cursor.
440*/
441static 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;
shanec0688ea2009-03-05 03:48:06 +0000449 UNUSED_PARAMETER(idxNum);
450 UNUSED_PARAMETER(idxStr);
451 UNUSED_PARAMETER(argc);
452 UNUSED_PARAMETER(argv);
danielk1977c8c70692009-02-25 15:22:02 +0000453 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*/
464static int schemaBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
shanec0688ea2009-03-05 03:48:06 +0000465 UNUSED_PARAMETER(tab);
466 UNUSED_PARAMETER(pIdxInfo);
danielk1977c8c70692009-02-25 15:22:02 +0000467 return SQLITE_OK;
468}
469
470/*
471** A virtual table module that merely echos method calls into TCL
472** variables.
473*/
474static 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*/
500static 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*/
528struct StrBuffer {
529 char *zBuf;
530};
531typedef struct StrBuffer StrBuffer;
532static 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}
538static void joinStep(
539 sqlite3_context *context,
540 int argc,
541 sqlite3_value **argv
542){
543 StrBuffer *p;
shanec0688ea2009-03-05 03:48:06 +0000544 UNUSED_PARAMETER(argc);
danielk1977c8c70692009-02-25 15:22:02 +0000545 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*/
567static 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
shanec0688ea2009-03-05 03:48:06 +0000578 UNUSED_PARAMETER(argc);
danielk1977c8c70692009-02-25 15:22:02 +0000579 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*/
598static 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 ){
drhde7446b2009-05-31 17:16:09 +0000626 char *zNew;
danielk19779365c672009-03-13 15:32:53 +0000627 nMalloc = 16 + (nOut+nCopy)*2;
drhde7446b2009-05-31 17:16:09 +0000628 zNew = (char*)sqlite3_realloc(zOut, nMalloc);
629 if( zNew==0 ){
630 sqlite3_result_error_nomem(context);
631 return;
632 }else{
633 zOut = zNew;
634 }
danielk1977c8c70692009-02-25 15:22:02 +0000635 }
danielk19779365c672009-03-13 15:32:53 +0000636 assert( nMalloc>=(nOut+nCopy) );
danielk1977c8c70692009-02-25 15:22:02 +0000637 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*/
650static int invokeCallback(void *p, int nArg, char **azArg, char **azCol){
651 GenfkeyCb *pCb = (GenfkeyCb *)p;
shanec0688ea2009-03-05 03:48:06 +0000652 UNUSED_PARAMETER(nArg);
653 UNUSED_PARAMETER(azCol);
danielk1977c8c70692009-02-25 15:22:02 +0000654 return pCb->xData(pCb->pCtx, pCb->eType, azArg[0]);
655}
656
657int 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*/
691static 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
802static 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
dan1da40a32009-09-19 17:00:31 +0000854 /* The "AFTER UPDATE ON <referenced>" trigger. This trigger's job
danielk1977c8c70692009-02-25 15:22:02 +0000855 ** 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
shanec0688ea2009-03-05 03:48:06 +0000936 UNUSED_PARAMETER(zDb);
937
danielk1977c8c70692009-02-25 15:22:02 +0000938 /* 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
974genfkey_exit:
975 sqlite3_close(db);
976 return rc;
977}
978
979
980#endif
981/* End genfkey logic. */
982/*************************************************************************/
983/*************************************************************************/
984
drhe91d16b2008-12-08 18:27:31 +0000985/*
drhc49f44e2006-10-26 18:15:42 +0000986** If the following flag is set, then command execution stops
987** at an error if we are not interactive.
988*/
989static int bail_on_error = 0;
990
991/*
drhc28490c2006-10-26 14:25:58 +0000992** Threat stdin as an interactive input if the following variable
993** is true. Otherwise, assume stdin is connected to a file or pipe.
994*/
995static int stdin_is_interactive = 1;
996
997/*
drh4c504392000-10-16 22:06:40 +0000998** The following is the open SQLite database. We make a pointer
999** to this database a static variable so that it can be accessed
1000** by the SIGINT handler to interrupt database processing.
1001*/
danielk197792f9a1b2004-06-19 09:08:16 +00001002static sqlite3 *db = 0;
drh4c504392000-10-16 22:06:40 +00001003
1004/*
drh67505e72002-04-19 12:34:06 +00001005** True if an interrupt (Control-C) has been received.
1006*/
drh43617e92006-03-06 20:55:46 +00001007static volatile int seenInterrupt = 0;
drh67505e72002-04-19 12:34:06 +00001008
1009/*
persicom7e2dfdd2002-04-18 02:46:52 +00001010** This is the name of our program. It is set in main(), used
1011** in a number of other places, mostly for error messages.
1012*/
1013static char *Argv0;
1014
1015/*
1016** Prompt strings. Initialized in main. Settable with
1017** .prompt main continue
1018*/
1019static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
1020static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
1021
drhb0603412007-02-28 04:47:26 +00001022/*
1023** Write I/O traces to the following stream.
1024*/
rsebe0a9092007-07-30 18:24:38 +00001025#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00001026static FILE *iotrace = 0;
rsebe0a9092007-07-30 18:24:38 +00001027#endif
drhb0603412007-02-28 04:47:26 +00001028
1029/*
1030** This routine works like printf in that its first argument is a
1031** format string and subsequent arguments are values to be substituted
1032** in place of % fields. The result of formatting this string
1033** is written to iotrace.
1034*/
rsebe0a9092007-07-30 18:24:38 +00001035#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00001036static void iotracePrintf(const char *zFormat, ...){
1037 va_list ap;
drhf075cd02007-02-28 06:14:25 +00001038 char *z;
drhb0603412007-02-28 04:47:26 +00001039 if( iotrace==0 ) return;
1040 va_start(ap, zFormat);
drhf075cd02007-02-28 06:14:25 +00001041 z = sqlite3_vmprintf(zFormat, ap);
drhb0603412007-02-28 04:47:26 +00001042 va_end(ap);
drhf075cd02007-02-28 06:14:25 +00001043 fprintf(iotrace, "%s", z);
1044 sqlite3_free(z);
drhb0603412007-02-28 04:47:26 +00001045}
rsebe0a9092007-07-30 18:24:38 +00001046#endif
drhb0603412007-02-28 04:47:26 +00001047
drh44c2eb12003-04-30 11:38:26 +00001048
persicom7e2dfdd2002-04-18 02:46:52 +00001049/*
drh83965662003-04-17 02:54:13 +00001050** Determines if a string is a number of not.
1051*/
danielk19772e588c72005-12-09 14:25:08 +00001052static int isNumber(const char *z, int *realnum){
drhc8d74412004-08-31 23:41:26 +00001053 if( *z=='-' || *z=='+' ) z++;
1054 if( !isdigit(*z) ){
1055 return 0;
1056 }
1057 z++;
1058 if( realnum ) *realnum = 0;
1059 while( isdigit(*z) ){ z++; }
1060 if( *z=='.' ){
1061 z++;
1062 if( !isdigit(*z) ) return 0;
1063 while( isdigit(*z) ){ z++; }
1064 if( realnum ) *realnum = 1;
1065 }
1066 if( *z=='e' || *z=='E' ){
1067 z++;
1068 if( *z=='+' || *z=='-' ) z++;
1069 if( !isdigit(*z) ) return 0;
1070 while( isdigit(*z) ){ z++; }
1071 if( realnum ) *realnum = 1;
1072 }
1073 return *z==0;
1074}
drh83965662003-04-17 02:54:13 +00001075
1076/*
danielk1977bc6ada42004-06-30 08:20:16 +00001077** A global char* and an SQL function to access its current value
1078** from within an SQL statement. This program used to use the
1079** sqlite_exec_printf() API to substitue a string into an SQL statement.
1080** The correct way to do this with sqlite3 is to use the bind API, but
1081** since the shell is built around the callback paradigm it would be a lot
1082** of work. Instead just use this hack, which is quite harmless.
1083*/
1084static const char *zShellStatic = 0;
1085static void shellstaticFunc(
1086 sqlite3_context *context,
1087 int argc,
1088 sqlite3_value **argv
1089){
1090 assert( 0==argc );
1091 assert( zShellStatic );
shaned87897d2009-01-30 05:40:27 +00001092 UNUSED_PARAMETER(argc);
drh902b9ee2008-12-05 17:17:07 +00001093 UNUSED_PARAMETER(argv);
danielk1977bc6ada42004-06-30 08:20:16 +00001094 sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC);
1095}
1096
1097
1098/*
drhfeac5f82004-08-01 00:10:45 +00001099** This routine reads a line of text from FILE in, stores
drh8e7e7a22000-05-30 18:45:23 +00001100** the text in memory obtained from malloc() and returns a pointer
1101** to the text. NULL is returned at end of file, or if malloc()
1102** fails.
1103**
1104** The interface is like "readline" but no command-line editing
1105** is done.
1106*/
drh9347b202003-07-18 01:30:59 +00001107static char *local_getline(char *zPrompt, FILE *in){
drh8e7e7a22000-05-30 18:45:23 +00001108 char *zLine;
1109 int nLine;
drh8e7e7a22000-05-30 18:45:23 +00001110 int n;
1111 int eol;
1112
1113 if( zPrompt && *zPrompt ){
1114 printf("%s",zPrompt);
1115 fflush(stdout);
1116 }
1117 nLine = 100;
1118 zLine = malloc( nLine );
1119 if( zLine==0 ) return 0;
1120 n = 0;
1121 eol = 0;
1122 while( !eol ){
1123 if( n+100>nLine ){
1124 nLine = nLine*2 + 100;
1125 zLine = realloc(zLine, nLine);
1126 if( zLine==0 ) return 0;
1127 }
drhdaffd0e2001-04-11 14:28:42 +00001128 if( fgets(&zLine[n], nLine - n, in)==0 ){
drh8e7e7a22000-05-30 18:45:23 +00001129 if( n==0 ){
1130 free(zLine);
1131 return 0;
1132 }
1133 zLine[n] = 0;
1134 eol = 1;
1135 break;
1136 }
1137 while( zLine[n] ){ n++; }
1138 if( n>0 && zLine[n-1]=='\n' ){
1139 n--;
1140 zLine[n] = 0;
1141 eol = 1;
1142 }
1143 }
1144 zLine = realloc( zLine, n+1 );
1145 return zLine;
1146}
1147
1148/*
drhc28490c2006-10-26 14:25:58 +00001149** Retrieve a single line of input text.
drh8e7e7a22000-05-30 18:45:23 +00001150**
1151** zPrior is a string of prior text retrieved. If not the empty
1152** string, then issue a continuation prompt.
1153*/
drhdaffd0e2001-04-11 14:28:42 +00001154static char *one_input_line(const char *zPrior, FILE *in){
drh8e7e7a22000-05-30 18:45:23 +00001155 char *zPrompt;
1156 char *zResult;
drhdaffd0e2001-04-11 14:28:42 +00001157 if( in!=0 ){
drh9347b202003-07-18 01:30:59 +00001158 return local_getline(0, in);
drh8e7e7a22000-05-30 18:45:23 +00001159 }
1160 if( zPrior && zPrior[0] ){
persicom7e2dfdd2002-04-18 02:46:52 +00001161 zPrompt = continuePrompt;
drh8e7e7a22000-05-30 18:45:23 +00001162 }else{
persicom7e2dfdd2002-04-18 02:46:52 +00001163 zPrompt = mainPrompt;
drh8e7e7a22000-05-30 18:45:23 +00001164 }
1165 zResult = readline(zPrompt);
danielk19774af00c62005-01-23 23:43:21 +00001166#if defined(HAVE_READLINE) && HAVE_READLINE==1
drheb741d52006-06-03 17:37:25 +00001167 if( zResult && *zResult ) add_history(zResult);
danielk19774af00c62005-01-23 23:43:21 +00001168#endif
drh8e7e7a22000-05-30 18:45:23 +00001169 return zResult;
1170}
1171
persicom7e2dfdd2002-04-18 02:46:52 +00001172struct previous_mode_data {
1173 int valid; /* Is there legit data in here? */
1174 int mode;
1175 int showHeader;
1176 int colWidth[100];
1177};
drh45e29d82006-11-20 16:21:10 +00001178
drh8e7e7a22000-05-30 18:45:23 +00001179/*
drh75897232000-05-29 14:26:00 +00001180** An pointer to an instance of this structure is passed from
1181** the main program to the callback. This is used to communicate
1182** state and mode information.
1183*/
1184struct callback_data {
danielk197792f9a1b2004-06-19 09:08:16 +00001185 sqlite3 *db; /* The database */
drhdaffd0e2001-04-11 14:28:42 +00001186 int echoOn; /* True to echo input commands */
drh28bd4bc2000-06-15 15:57:22 +00001187 int cnt; /* Number of records displayed so far */
1188 FILE *out; /* Write results here */
1189 int mode; /* An output mode setting */
drh45e29d82006-11-20 16:21:10 +00001190 int writableSchema; /* True if PRAGMA writable_schema=ON */
drh28bd4bc2000-06-15 15:57:22 +00001191 int showHeader; /* True to show column names in List or Column mode */
drh33048c02001-10-01 14:29:22 +00001192 char *zDestTable; /* Name of destination table when MODE_Insert */
drh28bd4bc2000-06-15 15:57:22 +00001193 char separator[20]; /* Separator character for MODE_List */
drha0c66f52000-07-29 13:20:21 +00001194 int colWidth[100]; /* Requested width of each column when in column mode*/
1195 int actualWidth[100]; /* Actual width of each column */
drh83965662003-04-17 02:54:13 +00001196 char nullvalue[20]; /* The text to print when a NULL comes back from
1197 ** the database */
persicom7e2dfdd2002-04-18 02:46:52 +00001198 struct previous_mode_data explainPrev;
drh83965662003-04-17 02:54:13 +00001199 /* Holds the mode information just before
1200 ** .explain ON */
drh44c2eb12003-04-30 11:38:26 +00001201 char outfile[FILENAME_MAX]; /* Filename for *out */
1202 const char *zDbFilename; /* name of the database file */
drh75897232000-05-29 14:26:00 +00001203};
1204
1205/*
1206** These are the allowed modes.
1207*/
drh967e8b72000-06-21 13:59:10 +00001208#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +00001209#define MODE_Column 1 /* One record per line in neat columns */
1210#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +00001211#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
1212#define MODE_Html 4 /* Generate an XHTML table */
1213#define MODE_Insert 5 /* Generate SQL "insert" statements */
drhfeac5f82004-08-01 00:10:45 +00001214#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
drh8e64d1c2004-10-07 00:32:39 +00001215#define MODE_Csv 7 /* Quote strings, numbers are plain */
drh66ce4d02008-02-15 17:38:06 +00001216#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */
persicom7e2dfdd2002-04-18 02:46:52 +00001217
drh66ce4d02008-02-15 17:38:06 +00001218static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +00001219 "line",
1220 "column",
1221 "list",
1222 "semi",
1223 "html",
drhfeac5f82004-08-01 00:10:45 +00001224 "insert",
1225 "tcl",
drh8e64d1c2004-10-07 00:32:39 +00001226 "csv",
drh66ce4d02008-02-15 17:38:06 +00001227 "explain",
persicom7e2dfdd2002-04-18 02:46:52 +00001228};
drh75897232000-05-29 14:26:00 +00001229
1230/*
1231** Number of elements in an array
1232*/
drh902b9ee2008-12-05 17:17:07 +00001233#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +00001234
1235/*
drhea678832008-12-10 19:26:22 +00001236** Compute a string length that is limited to what can be stored in
1237** lower 30 bits of a 32-bit signed integer.
1238*/
drh4f21c4a2008-12-10 22:15:00 +00001239static int strlen30(const char *z){
drhea678832008-12-10 19:26:22 +00001240 const char *z2 = z;
1241 while( *z2 ){ z2++; }
1242 return 0x3fffffff & (int)(z2 - z);
1243}
1244
1245/*
drh28bd4bc2000-06-15 15:57:22 +00001246** Output the given string as a quoted string using SQL quoting conventions.
1247*/
1248static void output_quoted_string(FILE *out, const char *z){
1249 int i;
1250 int nSingle = 0;
drh28bd4bc2000-06-15 15:57:22 +00001251 for(i=0; z[i]; i++){
1252 if( z[i]=='\'' ) nSingle++;
drh28bd4bc2000-06-15 15:57:22 +00001253 }
1254 if( nSingle==0 ){
1255 fprintf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +00001256 }else{
1257 fprintf(out,"'");
1258 while( *z ){
1259 for(i=0; z[i] && z[i]!='\''; i++){}
1260 if( i==0 ){
1261 fprintf(out,"''");
1262 z++;
1263 }else if( z[i]=='\'' ){
1264 fprintf(out,"%.*s''",i,z);
1265 z += i+1;
1266 }else{
drhcd7d2732002-02-26 23:24:26 +00001267 fprintf(out,"%s",z);
drh28bd4bc2000-06-15 15:57:22 +00001268 break;
1269 }
1270 }
drhcd7d2732002-02-26 23:24:26 +00001271 fprintf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +00001272 }
1273}
1274
1275/*
drhfeac5f82004-08-01 00:10:45 +00001276** Output the given string as a quoted according to C or TCL quoting rules.
1277*/
1278static void output_c_string(FILE *out, const char *z){
1279 unsigned int c;
1280 fputc('"', out);
1281 while( (c = *(z++))!=0 ){
1282 if( c=='\\' ){
1283 fputc(c, out);
1284 fputc(c, out);
1285 }else if( c=='\t' ){
1286 fputc('\\', out);
1287 fputc('t', out);
1288 }else if( c=='\n' ){
1289 fputc('\\', out);
1290 fputc('n', out);
1291 }else if( c=='\r' ){
1292 fputc('\\', out);
1293 fputc('r', out);
1294 }else if( !isprint(c) ){
drh0a8640d2005-08-30 20:12:02 +00001295 fprintf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +00001296 }else{
1297 fputc(c, out);
1298 }
1299 }
1300 fputc('"', out);
1301}
1302
1303/*
drhc08a4f12000-06-15 16:49:48 +00001304** Output the given string with characters that are special to
1305** HTML escaped.
1306*/
1307static void output_html_string(FILE *out, const char *z){
1308 int i;
1309 while( *z ){
1310 for(i=0; z[i] && z[i]!='<' && z[i]!='&'; i++){}
1311 if( i>0 ){
1312 fprintf(out,"%.*s",i,z);
1313 }
1314 if( z[i]=='<' ){
1315 fprintf(out,"&lt;");
1316 }else if( z[i]=='&' ){
1317 fprintf(out,"&amp;");
1318 }else{
1319 break;
1320 }
1321 z += i + 1;
1322 }
1323}
1324
1325/*
drhc49f44e2006-10-26 18:15:42 +00001326** If a field contains any character identified by a 1 in the following
1327** array, then the string must be quoted for CSV.
1328*/
1329static const char needCsvQuote[] = {
1330 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1331 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1332 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
1333 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1334 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1335 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1336 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1337 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1338 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1339 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1340 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1341 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1342 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1343 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1344 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1345 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1346};
1347
1348/*
drh8e64d1c2004-10-07 00:32:39 +00001349** Output a single term of CSV. Actually, p->separator is used for
1350** the separator, which may or may not be a comma. p->nullvalue is
1351** the null value. Strings are quoted using ANSI-C rules. Numbers
1352** appear outside of quotes.
1353*/
1354static void output_csv(struct callback_data *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +00001355 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +00001356 if( z==0 ){
drhc49f44e2006-10-26 18:15:42 +00001357 fprintf(out,"%s",p->nullvalue);
drh8e64d1c2004-10-07 00:32:39 +00001358 }else{
drhc49f44e2006-10-26 18:15:42 +00001359 int i;
drh4f21c4a2008-12-10 22:15:00 +00001360 int nSep = strlen30(p->separator);
drhc49f44e2006-10-26 18:15:42 +00001361 for(i=0; z[i]; i++){
drhc85375d2007-12-18 15:41:44 +00001362 if( needCsvQuote[((unsigned char*)z)[i]]
1363 || (z[i]==p->separator[0] &&
1364 (nSep==1 || memcmp(z, p->separator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +00001365 i = 0;
1366 break;
1367 }
1368 }
1369 if( i==0 ){
1370 putc('"', out);
1371 for(i=0; z[i]; i++){
1372 if( z[i]=='"' ) putc('"', out);
1373 putc(z[i], out);
1374 }
1375 putc('"', out);
1376 }else{
1377 fprintf(out, "%s", z);
1378 }
drh8e64d1c2004-10-07 00:32:39 +00001379 }
1380 if( bSep ){
drhd0e77882008-01-14 15:20:08 +00001381 fprintf(p->out, "%s", p->separator);
drh8e64d1c2004-10-07 00:32:39 +00001382 }
1383}
1384
danielk19774af00c62005-01-23 23:43:21 +00001385#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +00001386/*
drh4c504392000-10-16 22:06:40 +00001387** This routine runs when the user presses Ctrl-C
1388*/
1389static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +00001390 UNUSED_PARAMETER(NotUsed);
drh67505e72002-04-19 12:34:06 +00001391 seenInterrupt = 1;
danielk19776f8a5032004-05-10 10:34:51 +00001392 if( db ) sqlite3_interrupt(db);
drh4c504392000-10-16 22:06:40 +00001393}
danielk19774af00c62005-01-23 23:43:21 +00001394#endif
drh4c504392000-10-16 22:06:40 +00001395
1396/*
drh75897232000-05-29 14:26:00 +00001397** This is the callback routine that the SQLite library
1398** invokes for each row of a query result.
1399*/
1400static int callback(void *pArg, int nArg, char **azArg, char **azCol){
1401 int i;
1402 struct callback_data *p = (struct callback_data*)pArg;
1403 switch( p->mode ){
1404 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +00001405 int w = 5;
drh6a535342001-10-19 16:44:56 +00001406 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +00001407 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +00001408 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +00001409 if( len>w ) w = len;
1410 }
drh75897232000-05-29 14:26:00 +00001411 if( p->cnt++>0 ) fprintf(p->out,"\n");
1412 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +00001413 fprintf(p->out,"%*s = %s\n", w, azCol[i],
drha69d9162003-04-17 22:57:53 +00001414 azArg[i] ? azArg[i] : p->nullvalue);
drh75897232000-05-29 14:26:00 +00001415 }
1416 break;
1417 }
danielk19770d78bae2008-01-03 07:09:48 +00001418 case MODE_Explain:
drh75897232000-05-29 14:26:00 +00001419 case MODE_Column: {
drha0c66f52000-07-29 13:20:21 +00001420 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +00001421 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +00001422 int w, n;
1423 if( i<ArraySize(p->colWidth) ){
danielk19770d78bae2008-01-03 07:09:48 +00001424 w = p->colWidth[i];
drh75897232000-05-29 14:26:00 +00001425 }else{
danielk19770d78bae2008-01-03 07:09:48 +00001426 w = 0;
drh75897232000-05-29 14:26:00 +00001427 }
drha0c66f52000-07-29 13:20:21 +00001428 if( w<=0 ){
drh4f21c4a2008-12-10 22:15:00 +00001429 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +00001430 if( w<10 ) w = 10;
drh4f21c4a2008-12-10 22:15:00 +00001431 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullvalue);
drha0c66f52000-07-29 13:20:21 +00001432 if( w<n ) w = n;
1433 }
1434 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +00001435 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +00001436 }
1437 if( p->showHeader ){
1438 fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " ");
1439 }
1440 }
1441 if( p->showHeader ){
1442 for(i=0; i<nArg; i++){
1443 int w;
1444 if( i<ArraySize(p->actualWidth) ){
1445 w = p->actualWidth[i];
1446 }else{
1447 w = 10;
1448 }
1449 fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
1450 "----------------------------------------------------------",
1451 i==nArg-1 ? "\n": " ");
1452 }
drh75897232000-05-29 14:26:00 +00001453 }
1454 }
drh6a535342001-10-19 16:44:56 +00001455 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +00001456 for(i=0; i<nArg; i++){
1457 int w;
drha0c66f52000-07-29 13:20:21 +00001458 if( i<ArraySize(p->actualWidth) ){
1459 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +00001460 }else{
1461 w = 10;
1462 }
drhea678832008-12-10 19:26:22 +00001463 if( p->mode==MODE_Explain && azArg[i] &&
drh4f21c4a2008-12-10 22:15:00 +00001464 strlen30(azArg[i])>w ){
1465 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +00001466 }
drhc61053b2000-06-04 12:58:36 +00001467 fprintf(p->out,"%-*.*s%s",w,w,
persicom7e2dfdd2002-04-18 02:46:52 +00001468 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
drh75897232000-05-29 14:26:00 +00001469 }
1470 break;
1471 }
drhe3710332000-09-29 13:30:53 +00001472 case MODE_Semi:
drh75897232000-05-29 14:26:00 +00001473 case MODE_List: {
1474 if( p->cnt++==0 && p->showHeader ){
1475 for(i=0; i<nArg; i++){
1476 fprintf(p->out,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator);
1477 }
1478 }
drh6a535342001-10-19 16:44:56 +00001479 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +00001480 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +00001481 char *z = azArg[i];
persicom7e2dfdd2002-04-18 02:46:52 +00001482 if( z==0 ) z = p->nullvalue;
drh71172c52002-01-24 00:00:21 +00001483 fprintf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +00001484 if( i<nArg-1 ){
1485 fprintf(p->out, "%s", p->separator);
1486 }else if( p->mode==MODE_Semi ){
1487 fprintf(p->out, ";\n");
1488 }else{
1489 fprintf(p->out, "\n");
1490 }
drh75897232000-05-29 14:26:00 +00001491 }
1492 break;
1493 }
drh1e5d0e92000-05-31 23:33:17 +00001494 case MODE_Html: {
1495 if( p->cnt++==0 && p->showHeader ){
mihailim57c591a2008-06-23 21:26:05 +00001496 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +00001497 for(i=0; i<nArg; i++){
mihailim57c591a2008-06-23 21:26:05 +00001498 fprintf(p->out,"<TH>%s</TH>",azCol[i]);
drh1e5d0e92000-05-31 23:33:17 +00001499 }
mihailim57c591a2008-06-23 21:26:05 +00001500 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +00001501 }
drh6a535342001-10-19 16:44:56 +00001502 if( azArg==0 ) break;
mihailim57c591a2008-06-23 21:26:05 +00001503 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +00001504 for(i=0; i<nArg; i++){
mihailim57c591a2008-06-23 21:26:05 +00001505 fprintf(p->out,"<TD>");
persicom7e2dfdd2002-04-18 02:46:52 +00001506 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mihailim57c591a2008-06-23 21:26:05 +00001507 fprintf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +00001508 }
mihailim57c591a2008-06-23 21:26:05 +00001509 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +00001510 break;
1511 }
drhfeac5f82004-08-01 00:10:45 +00001512 case MODE_Tcl: {
1513 if( p->cnt++==0 && p->showHeader ){
1514 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +00001515 output_c_string(p->out,azCol[i] ? azCol[i] : "");
drhfeac5f82004-08-01 00:10:45 +00001516 fprintf(p->out, "%s", p->separator);
1517 }
1518 fprintf(p->out,"\n");
1519 }
1520 if( azArg==0 ) break;
1521 for(i=0; i<nArg; i++){
1522 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
1523 fprintf(p->out, "%s", p->separator);
1524 }
1525 fprintf(p->out,"\n");
1526 break;
1527 }
drh8e64d1c2004-10-07 00:32:39 +00001528 case MODE_Csv: {
1529 if( p->cnt++==0 && p->showHeader ){
1530 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +00001531 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +00001532 }
1533 fprintf(p->out,"\n");
1534 }
1535 if( azArg==0 ) break;
1536 for(i=0; i<nArg; i++){
1537 output_csv(p, azArg[i], i<nArg-1);
1538 }
1539 fprintf(p->out,"\n");
1540 break;
1541 }
drh28bd4bc2000-06-15 15:57:22 +00001542 case MODE_Insert: {
drh6a535342001-10-19 16:44:56 +00001543 if( azArg==0 ) break;
drh33048c02001-10-01 14:29:22 +00001544 fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable);
drh28bd4bc2000-06-15 15:57:22 +00001545 for(i=0; i<nArg; i++){
1546 char *zSep = i>0 ? ",": "";
1547 if( azArg[i]==0 ){
1548 fprintf(p->out,"%sNULL",zSep);
drhc8d74412004-08-31 23:41:26 +00001549 }else if( isNumber(azArg[i], 0) ){
drh28bd4bc2000-06-15 15:57:22 +00001550 fprintf(p->out,"%s%s",zSep, azArg[i]);
1551 }else{
1552 if( zSep[0] ) fprintf(p->out,"%s",zSep);
1553 output_quoted_string(p->out, azArg[i]);
1554 }
1555 }
1556 fprintf(p->out,");\n");
drh6a535342001-10-19 16:44:56 +00001557 break;
drh28bd4bc2000-06-15 15:57:22 +00001558 }
persicom1d0b8722002-04-18 02:53:04 +00001559 }
drh75897232000-05-29 14:26:00 +00001560 return 0;
1561}
1562
1563/*
drh33048c02001-10-01 14:29:22 +00001564** Set the destination table field of the callback_data structure to
1565** the name of the table given. Escape any quote characters in the
1566** table name.
1567*/
1568static void set_table_name(struct callback_data *p, const char *zName){
1569 int i, n;
1570 int needQuote;
1571 char *z;
1572
1573 if( p->zDestTable ){
1574 free(p->zDestTable);
1575 p->zDestTable = 0;
1576 }
1577 if( zName==0 ) return;
drh4c755c02004-08-08 20:22:17 +00001578 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
drh33048c02001-10-01 14:29:22 +00001579 for(i=n=0; zName[i]; i++, n++){
drh4c755c02004-08-08 20:22:17 +00001580 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
drh33048c02001-10-01 14:29:22 +00001581 needQuote = 1;
1582 if( zName[i]=='\'' ) n++;
1583 }
1584 }
1585 if( needQuote ) n += 2;
1586 z = p->zDestTable = malloc( n+1 );
1587 if( z==0 ){
1588 fprintf(stderr,"Out of memory!\n");
1589 exit(1);
1590 }
1591 n = 0;
1592 if( needQuote ) z[n++] = '\'';
1593 for(i=0; zName[i]; i++){
1594 z[n++] = zName[i];
1595 if( zName[i]=='\'' ) z[n++] = '\'';
1596 }
1597 if( needQuote ) z[n++] = '\'';
1598 z[n] = 0;
1599}
1600
danielk19772a02e332004-06-05 08:04:36 +00001601/* zIn is either a pointer to a NULL-terminated string in memory obtained
1602** from malloc(), or a NULL pointer. The string pointed to by zAppend is
1603** added to zIn, and the result returned in memory obtained from malloc().
1604** zIn, if it was not NULL, is freed.
1605**
1606** If the third argument, quote, is not '\0', then it is used as a
1607** quote character for zAppend.
1608*/
drhc28490c2006-10-26 14:25:58 +00001609static char *appendText(char *zIn, char const *zAppend, char quote){
danielk19772a02e332004-06-05 08:04:36 +00001610 int len;
1611 int i;
drh4f21c4a2008-12-10 22:15:00 +00001612 int nAppend = strlen30(zAppend);
1613 int nIn = (zIn?strlen30(zIn):0);
danielk19772a02e332004-06-05 08:04:36 +00001614
1615 len = nAppend+nIn+1;
1616 if( quote ){
1617 len += 2;
1618 for(i=0; i<nAppend; i++){
1619 if( zAppend[i]==quote ) len++;
1620 }
1621 }
1622
1623 zIn = (char *)realloc(zIn, len);
1624 if( !zIn ){
1625 return 0;
1626 }
1627
1628 if( quote ){
1629 char *zCsr = &zIn[nIn];
1630 *zCsr++ = quote;
1631 for(i=0; i<nAppend; i++){
1632 *zCsr++ = zAppend[i];
1633 if( zAppend[i]==quote ) *zCsr++ = quote;
1634 }
1635 *zCsr++ = quote;
1636 *zCsr++ = '\0';
1637 assert( (zCsr-zIn)==len );
1638 }else{
1639 memcpy(&zIn[nIn], zAppend, nAppend);
1640 zIn[len-1] = '\0';
1641 }
1642
1643 return zIn;
1644}
1645
drhdd3d4592004-08-30 01:54:05 +00001646
1647/*
1648** Execute a query statement that has a single result column. Print
1649** that result column on a line by itself with a semicolon terminator.
drh45e29d82006-11-20 16:21:10 +00001650**
1651** This is used, for example, to show the schema of the database by
1652** querying the SQLITE_MASTER table.
drhdd3d4592004-08-30 01:54:05 +00001653*/
drh157e29a2009-05-21 15:15:00 +00001654static int run_table_dump_query(
1655 FILE *out, /* Send output here */
1656 sqlite3 *db, /* Database to query */
1657 const char *zSelect, /* SELECT statement to extract content */
1658 const char *zFirstRow /* Print before first row, if not NULL */
1659){
drhdd3d4592004-08-30 01:54:05 +00001660 sqlite3_stmt *pSelect;
1661 int rc;
1662 rc = sqlite3_prepare(db, zSelect, -1, &pSelect, 0);
1663 if( rc!=SQLITE_OK || !pSelect ){
1664 return rc;
1665 }
1666 rc = sqlite3_step(pSelect);
1667 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +00001668 if( zFirstRow ){
1669 fprintf(out, "%s", zFirstRow);
1670 zFirstRow = 0;
1671 }
drhdd3d4592004-08-30 01:54:05 +00001672 fprintf(out, "%s;\n", sqlite3_column_text(pSelect, 0));
1673 rc = sqlite3_step(pSelect);
1674 }
1675 return sqlite3_finalize(pSelect);
1676}
1677
1678
drh33048c02001-10-01 14:29:22 +00001679/*
drh4c653a02000-06-07 01:27:47 +00001680** This is a different callback routine used for dumping the database.
1681** Each row received by this callback consists of a table name,
1682** the table type ("index" or "table") and SQL to create the table.
1683** This routine should print text sufficient to recreate the table.
1684*/
1685static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00001686 int rc;
1687 const char *zTable;
1688 const char *zType;
1689 const char *zSql;
drh157e29a2009-05-21 15:15:00 +00001690 const char *zPrepStmt = 0;
drhdaffd0e2001-04-11 14:28:42 +00001691 struct callback_data *p = (struct callback_data *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00001692
drh902b9ee2008-12-05 17:17:07 +00001693 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00001694 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00001695 zTable = azArg[0];
1696 zType = azArg[1];
1697 zSql = azArg[2];
1698
drh00b950d2005-09-11 02:03:03 +00001699 if( strcmp(zTable, "sqlite_sequence")==0 ){
drh157e29a2009-05-21 15:15:00 +00001700 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
drh00b950d2005-09-11 02:03:03 +00001701 }else if( strcmp(zTable, "sqlite_stat1")==0 ){
1702 fprintf(p->out, "ANALYZE sqlite_master;\n");
1703 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1704 return 0;
drh45e29d82006-11-20 16:21:10 +00001705 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1706 char *zIns;
1707 if( !p->writableSchema ){
1708 fprintf(p->out, "PRAGMA writable_schema=ON;\n");
1709 p->writableSchema = 1;
1710 }
1711 zIns = sqlite3_mprintf(
1712 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1713 "VALUES('table','%q','%q',0,'%q');",
1714 zTable, zTable, zSql);
1715 fprintf(p->out, "%s\n", zIns);
1716 sqlite3_free(zIns);
1717 return 0;
drh00b950d2005-09-11 02:03:03 +00001718 }else{
1719 fprintf(p->out, "%s;\n", zSql);
drhf8eb96a2005-02-03 00:42:34 +00001720 }
danielk19772a02e332004-06-05 08:04:36 +00001721
1722 if( strcmp(zType, "table")==0 ){
1723 sqlite3_stmt *pTableInfo = 0;
danielk19772a02e332004-06-05 08:04:36 +00001724 char *zSelect = 0;
1725 char *zTableInfo = 0;
1726 char *zTmp = 0;
drh157e29a2009-05-21 15:15:00 +00001727 int nRow = 0;
danielk19772a02e332004-06-05 08:04:36 +00001728
1729 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1730 zTableInfo = appendText(zTableInfo, zTable, '"');
1731 zTableInfo = appendText(zTableInfo, ");", 0);
1732
1733 rc = sqlite3_prepare(p->db, zTableInfo, -1, &pTableInfo, 0);
drh157e29a2009-05-21 15:15:00 +00001734 free(zTableInfo);
danielk19772a02e332004-06-05 08:04:36 +00001735 if( rc!=SQLITE_OK || !pTableInfo ){
1736 return 1;
1737 }
1738
1739 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
1740 zTmp = appendText(zTmp, zTable, '"');
1741 if( zTmp ){
1742 zSelect = appendText(zSelect, zTmp, '\'');
1743 }
1744 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1745 rc = sqlite3_step(pTableInfo);
1746 while( rc==SQLITE_ROW ){
danielk19772e588c72005-12-09 14:25:08 +00001747 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
danielk19773f41e972004-06-08 00:39:01 +00001748 zSelect = appendText(zSelect, "quote(", 0);
danielk19772e588c72005-12-09 14:25:08 +00001749 zSelect = appendText(zSelect, zText, '"');
danielk19772a02e332004-06-05 08:04:36 +00001750 rc = sqlite3_step(pTableInfo);
1751 if( rc==SQLITE_ROW ){
drh45e29d82006-11-20 16:21:10 +00001752 zSelect = appendText(zSelect, ") || ',' || ", 0);
danielk19772a02e332004-06-05 08:04:36 +00001753 }else{
1754 zSelect = appendText(zSelect, ") ", 0);
1755 }
drh157e29a2009-05-21 15:15:00 +00001756 nRow++;
danielk19772a02e332004-06-05 08:04:36 +00001757 }
1758 rc = sqlite3_finalize(pTableInfo);
drh157e29a2009-05-21 15:15:00 +00001759 if( rc!=SQLITE_OK || nRow==0 ){
1760 free(zSelect);
danielk19772a02e332004-06-05 08:04:36 +00001761 return 1;
1762 }
1763 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1764 zSelect = appendText(zSelect, zTable, '"');
1765
drh157e29a2009-05-21 15:15:00 +00001766 rc = run_table_dump_query(p->out, p->db, zSelect, zPrepStmt);
drhdd3d4592004-08-30 01:54:05 +00001767 if( rc==SQLITE_CORRUPT ){
1768 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
drh157e29a2009-05-21 15:15:00 +00001769 rc = run_table_dump_query(p->out, p->db, zSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001770 }
danielk19772a02e332004-06-05 08:04:36 +00001771 if( zSelect ) free(zSelect);
drh4c653a02000-06-07 01:27:47 +00001772 }
drh4c653a02000-06-07 01:27:47 +00001773 return 0;
1774}
1775
1776/*
drh45e29d82006-11-20 16:21:10 +00001777** Run zQuery. Use dump_callback() as the callback routine so that
1778** the contents of the query are output as SQL statements.
1779**
drhdd3d4592004-08-30 01:54:05 +00001780** If we get a SQLITE_CORRUPT error, rerun the query after appending
1781** "ORDER BY rowid DESC" to the end.
1782*/
1783static int run_schema_dump_query(
1784 struct callback_data *p,
1785 const char *zQuery,
1786 char **pzErrMsg
1787){
1788 int rc;
1789 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, pzErrMsg);
1790 if( rc==SQLITE_CORRUPT ){
1791 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00001792 int len = strlen30(zQuery);
drhdd3d4592004-08-30 01:54:05 +00001793 if( pzErrMsg ) sqlite3_free(*pzErrMsg);
1794 zQ2 = malloc( len+100 );
1795 if( zQ2==0 ) return rc;
drh5bb3eb92007-05-04 13:15:55 +00001796 sqlite3_snprintf(sizeof(zQ2), zQ2, "%s ORDER BY rowid DESC", zQuery);
drhdd3d4592004-08-30 01:54:05 +00001797 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, pzErrMsg);
1798 free(zQ2);
1799 }
1800 return rc;
1801}
1802
danielk1977c8c70692009-02-25 15:22:02 +00001803#if !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_SUBQUERY)
1804struct 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};
1812typedef struct GenfkeyCmd GenfkeyCmd;
1813
1814static 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++){
drh93a989c2009-03-16 10:59:44 +00001819 int n = strlen30(azArg[ii]);
danielk1977c8c70692009-02-25 15:22:02 +00001820
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
1836static 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
drhdd3d4592004-08-30 01:54:05 +00001859/*
drh75897232000-05-29 14:26:00 +00001860** Text of a help message
1861*/
persicom1d0b8722002-04-18 02:53:04 +00001862static char zHelp[] =
drh9ff849f2009-02-04 20:55:57 +00001863 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drh20f99c42007-01-08 14:31:35 +00001864 ".bail ON|OFF Stop after hitting an error. Default OFF\n"
jplyon6a65bb32003-05-04 07:25:57 +00001865 ".databases List names and files of attached databases\n"
drhb860bc92004-08-04 15:16:55 +00001866 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
drhdaffd0e2001-04-11 14:28:42 +00001867 ".echo ON|OFF Turn command echo on or off\n"
drh75897232000-05-29 14:26:00 +00001868 ".exit Exit this program\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001869 ".explain ON|OFF Turn output mode suitable for EXPLAIN on or off.\n"
danielk1977c8c70692009-02-25 15:22:02 +00001870#if !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_SUBQUERY)
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"
danielk1977e6320042009-02-25 15:43:57 +00001875 " See file tool/genfkey.README in the source \n"
1876 " distribution for further information.\n"
danielk1977c8c70692009-02-25 15:22:02 +00001877#endif
persicom7e2dfdd2002-04-18 02:46:52 +00001878 ".header(s) ON|OFF Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00001879 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00001880 ".import FILE TABLE Import data from FILE into TABLE\n"
drh75897232000-05-29 14:26:00 +00001881 ".indices TABLE Show names of all indices on TABLE\n"
drhae5e4452007-05-03 17:18:36 +00001882#ifdef SQLITE_ENABLE_IOTRACE
1883 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1884#endif
drh70df4fe2006-06-13 15:12:21 +00001885#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001886 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00001887#endif
danielk19776b77a362005-01-13 11:10:25 +00001888 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
drh3b584fa2004-09-24 12:50:03 +00001889 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00001890 " column Left-aligned columns. (See .width)\n"
1891 " html HTML <table> code\n"
1892 " insert SQL insert statements for TABLE\n"
1893 " line One value per line\n"
1894 " list Values delimited by .separator string\n"
1895 " tabs Tab-separated values\n"
1896 " tcl TCL list elements\n"
1897 ".nullvalue STRING Print STRING in place of NULL values\n"
drh75897232000-05-29 14:26:00 +00001898 ".output FILENAME Send output to FILENAME\n"
1899 ".output stdout Send output to the screen\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001900 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001901 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00001902 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00001903 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh75897232000-05-29 14:26:00 +00001904 ".schema ?TABLE? Show the CREATE statements\n"
drhb860bc92004-08-04 15:16:55 +00001905 ".separator STRING Change separator used by output mode and .import\n"
drhdd45df82002-04-18 12:39:03 +00001906 ".show Show the current values for various settings\n"
drhfeac5f82004-08-01 00:10:45 +00001907 ".tables ?PATTERN? List names of tables matching a LIKE pattern\n"
drh2dfbbca2000-07-28 14:32:48 +00001908 ".timeout MS Try opening locked tables for MS milliseconds\n"
drh3b1a9882007-11-02 12:53:03 +00001909#if HAS_TIMER
1910 ".timer ON|OFF Turn the CPU timer measurement on or off\n"
1911#endif
drh75897232000-05-29 14:26:00 +00001912 ".width NUM NUM ... Set column widths for \"column\" mode\n"
1913;
1914
drhdaffd0e2001-04-11 14:28:42 +00001915/* Forward reference */
drhc28490c2006-10-26 14:25:58 +00001916static int process_input(struct callback_data *p, FILE *in);
drhdaffd0e2001-04-11 14:28:42 +00001917
drh75897232000-05-29 14:26:00 +00001918/*
drh44c2eb12003-04-30 11:38:26 +00001919** 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.
1921*/
1922static void open_db(struct callback_data *p){
1923 if( p->db==0 ){
danielk19774f057f92004-06-08 00:02:33 +00001924 sqlite3_open(p->zDbFilename, &p->db);
danielk197780290862004-05-22 09:21:21 +00001925 db = p->db;
drh4cea5ba2008-05-05 16:27:24 +00001926 if( db && sqlite3_errcode(db)==SQLITE_OK ){
1927 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0,
1928 shellstaticFunc, 0, 0);
1929 }
1930 if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){
danielk197780290862004-05-22 09:21:21 +00001931 fprintf(stderr,"Unable to open database \"%s\": %s\n",
1932 p->zDbFilename, sqlite3_errmsg(db));
drh22fbcb82004-02-01 01:22:50 +00001933 exit(1);
drh44c2eb12003-04-30 11:38:26 +00001934 }
drhc2e87a32006-06-27 15:16:14 +00001935#ifndef SQLITE_OMIT_LOAD_EXTENSION
1936 sqlite3_enable_load_extension(p->db, 1);
1937#endif
drh44c2eb12003-04-30 11:38:26 +00001938 }
1939}
1940
1941/*
drhfeac5f82004-08-01 00:10:45 +00001942** Do C-language style dequoting.
1943**
1944** \t -> tab
1945** \n -> newline
1946** \r -> carriage return
1947** \NNN -> ascii character NNN in octal
1948** \\ -> backslash
1949*/
1950static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00001951 int i, j;
1952 char c;
drhfeac5f82004-08-01 00:10:45 +00001953 for(i=j=0; (c = z[i])!=0; i++, j++){
1954 if( c=='\\' ){
1955 c = z[++i];
1956 if( c=='n' ){
1957 c = '\n';
1958 }else if( c=='t' ){
1959 c = '\t';
1960 }else if( c=='r' ){
1961 c = '\r';
1962 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00001963 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00001964 if( z[i+1]>='0' && z[i+1]<='7' ){
1965 i++;
1966 c = (c<<3) + z[i] - '0';
1967 if( z[i+1]>='0' && z[i+1]<='7' ){
1968 i++;
1969 c = (c<<3) + z[i] - '0';
1970 }
1971 }
1972 }
1973 }
1974 z[j] = c;
1975 }
1976 z[j] = 0;
1977}
1978
1979/*
drhc28490c2006-10-26 14:25:58 +00001980** Interpret zArg as a boolean value. Return either 0 or 1.
1981*/
1982static int booleanValue(char *zArg){
1983 int val = atoi(zArg);
1984 int j;
1985 for(j=0; zArg[j]; j++){
shane7d3846a2008-12-11 02:58:26 +00001986 zArg[j] = (char)tolower(zArg[j]);
drhc28490c2006-10-26 14:25:58 +00001987 }
1988 if( strcmp(zArg,"on")==0 ){
1989 val = 1;
1990 }else if( strcmp(zArg,"yes")==0 ){
1991 val = 1;
1992 }
1993 return val;
1994}
1995
1996/*
drh75897232000-05-29 14:26:00 +00001997** If an input line begins with "." then invoke this routine to
1998** process that line.
drh67505e72002-04-19 12:34:06 +00001999**
drh47ad6842006-11-08 12:25:42 +00002000** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00002001*/
drh44c2eb12003-04-30 11:38:26 +00002002static int do_meta_command(char *zLine, struct callback_data *p){
drh75897232000-05-29 14:26:00 +00002003 int i = 1;
2004 int nArg = 0;
2005 int n, c;
drh67505e72002-04-19 12:34:06 +00002006 int rc = 0;
drh75897232000-05-29 14:26:00 +00002007 char *azArg[50];
2008
2009 /* Parse the input line into tokens.
2010 */
2011 while( zLine[i] && nArg<ArraySize(azArg) ){
drh4c755c02004-08-08 20:22:17 +00002012 while( isspace((unsigned char)zLine[i]) ){ i++; }
drh06333682004-03-09 13:37:45 +00002013 if( zLine[i]==0 ) break;
drh75897232000-05-29 14:26:00 +00002014 if( zLine[i]=='\'' || zLine[i]=='"' ){
2015 int delim = zLine[i++];
2016 azArg[nArg++] = &zLine[i];
2017 while( zLine[i] && zLine[i]!=delim ){ i++; }
2018 if( zLine[i]==delim ){
2019 zLine[i++] = 0;
2020 }
drhfeac5f82004-08-01 00:10:45 +00002021 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002022 }else{
2023 azArg[nArg++] = &zLine[i];
drh4c755c02004-08-08 20:22:17 +00002024 while( zLine[i] && !isspace((unsigned char)zLine[i]) ){ i++; }
drh75897232000-05-29 14:26:00 +00002025 if( zLine[i] ) zLine[i++] = 0;
drhfeac5f82004-08-01 00:10:45 +00002026 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002027 }
2028 }
2029
2030 /* Process the input line.
2031 */
drh67505e72002-04-19 12:34:06 +00002032 if( nArg==0 ) return rc;
drh4f21c4a2008-12-10 22:15:00 +00002033 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00002034 c = azArg[0][0];
drh9ff849f2009-02-04 20:55:57 +00002035 if( c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0 && nArg>1 ){
2036 const char *zDestFile;
2037 const char *zDb;
2038 sqlite3 *pDest;
2039 sqlite3_backup *pBackup;
2040 int rc;
2041 if( nArg==2 ){
2042 zDestFile = azArg[1];
2043 zDb = "main";
2044 }else{
2045 zDestFile = azArg[2];
2046 zDb = azArg[1];
2047 }
2048 rc = sqlite3_open(zDestFile, &pDest);
2049 if( rc!=SQLITE_OK ){
2050 fprintf(stderr, "Error: cannot open %s\n", zDestFile);
2051 sqlite3_close(pDest);
2052 return 1;
2053 }
drhdc2c4912009-02-04 22:46:47 +00002054 open_db(p);
drh9ff849f2009-02-04 20:55:57 +00002055 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
2056 if( pBackup==0 ){
2057 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
2058 sqlite3_close(pDest);
2059 return 1;
2060 }
2061 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
2062 sqlite3_backup_finish(pBackup);
2063 if( rc==SQLITE_DONE ){
2064 rc = SQLITE_OK;
2065 }else{
2066 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
2067 }
2068 sqlite3_close(pDest);
2069 }else
2070
2071 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 && nArg>1 ){
drhc49f44e2006-10-26 18:15:42 +00002072 bail_on_error = booleanValue(azArg[1]);
2073 }else
2074
jplyon6a65bb32003-05-04 07:25:57 +00002075 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
jplyon672a1ed2003-05-11 20:07:05 +00002076 struct callback_data data;
2077 char *zErrMsg = 0;
jplyon6a65bb32003-05-04 07:25:57 +00002078 open_db(p);
jplyon672a1ed2003-05-11 20:07:05 +00002079 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00002080 data.showHeader = 1;
jplyon672a1ed2003-05-11 20:07:05 +00002081 data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00002082 data.colWidth[0] = 3;
2083 data.colWidth[1] = 15;
2084 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00002085 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00002086 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00002087 if( zErrMsg ){
2088 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002089 sqlite3_free(zErrMsg);
jplyon6a65bb32003-05-04 07:25:57 +00002090 }
2091 }else
2092
drh4c653a02000-06-07 01:27:47 +00002093 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
2094 char *zErrMsg = 0;
drh44c2eb12003-04-30 11:38:26 +00002095 open_db(p);
drhf1dfc4f2009-09-23 15:51:35 +00002096 /* When playing back a "dump", the content might appear in an order
2097 ** which causes immediate foreign key constraints to be violated.
2098 ** So disable foreign-key constraint enforcement to prevent problems. */
2099 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
drh33048c02001-10-01 14:29:22 +00002100 fprintf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00002101 p->writableSchema = 0;
drh93f41e52008-08-11 19:12:34 +00002102 sqlite3_exec(p->db, "PRAGMA writable_schema=ON", 0, 0, 0);
drh4c653a02000-06-07 01:27:47 +00002103 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00002104 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002105 "SELECT name, type, sql FROM sqlite_master "
drh4f324762009-05-21 14:51:03 +00002106 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'", 0
2107 );
2108 run_schema_dump_query(p,
2109 "SELECT name, type, sql FROM sqlite_master "
2110 "WHERE name=='sqlite_sequence'", 0
drh0b9a5942006-09-13 20:22:02 +00002111 );
2112 run_table_dump_query(p->out, p->db,
2113 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00002114 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00002115 );
drh4c653a02000-06-07 01:27:47 +00002116 }else{
2117 int i;
drhdd3d4592004-08-30 01:54:05 +00002118 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00002119 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00002120 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002121 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00002122 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh45e29d82006-11-20 16:21:10 +00002123 " AND sql NOT NULL", 0);
drh0b9a5942006-09-13 20:22:02 +00002124 run_table_dump_query(p->out, p->db,
2125 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00002126 "WHERE sql NOT NULL"
2127 " AND type IN ('index','trigger','view')"
drh157e29a2009-05-21 15:15:00 +00002128 " AND tbl_name LIKE shellstatic()", 0
drh0b9a5942006-09-13 20:22:02 +00002129 );
danielk1977bc6ada42004-06-30 08:20:16 +00002130 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00002131 }
2132 }
drh45e29d82006-11-20 16:21:10 +00002133 if( p->writableSchema ){
2134 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
2135 p->writableSchema = 0;
2136 }
drh93f41e52008-08-11 19:12:34 +00002137 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF", 0, 0, 0);
drh4c653a02000-06-07 01:27:47 +00002138 if( zErrMsg ){
2139 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002140 sqlite3_free(zErrMsg);
drh33048c02001-10-01 14:29:22 +00002141 }else{
2142 fprintf(p->out, "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00002143 }
2144 }else
drh75897232000-05-29 14:26:00 +00002145
drhdaffd0e2001-04-11 14:28:42 +00002146 if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 ){
drhc28490c2006-10-26 14:25:58 +00002147 p->echoOn = booleanValue(azArg[1]);
drhdaffd0e2001-04-11 14:28:42 +00002148 }else
2149
drh75897232000-05-29 14:26:00 +00002150 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh47ad6842006-11-08 12:25:42 +00002151 rc = 2;
drh75897232000-05-29 14:26:00 +00002152 }else
2153
drhdd45df82002-04-18 12:39:03 +00002154 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
drhc28490c2006-10-26 14:25:58 +00002155 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002156 if(val == 1) {
2157 if(!p->explainPrev.valid) {
2158 p->explainPrev.valid = 1;
2159 p->explainPrev.mode = p->mode;
2160 p->explainPrev.showHeader = p->showHeader;
2161 memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth));
2162 }
2163 /* We could put this code under the !p->explainValid
2164 ** condition so that it does not execute if we are already in
2165 ** explain mode. However, always executing it allows us an easy
2166 ** was to reset to explain mode in case the user previously
2167 ** did an .explain followed by a .width, .mode or .header
2168 ** command.
2169 */
danielk19770d78bae2008-01-03 07:09:48 +00002170 p->mode = MODE_Explain;
persicom7e2dfdd2002-04-18 02:46:52 +00002171 p->showHeader = 1;
2172 memset(p->colWidth,0,ArraySize(p->colWidth));
danielk19770d78bae2008-01-03 07:09:48 +00002173 p->colWidth[0] = 4; /* addr */
drh60a713c2008-01-21 16:22:45 +00002174 p->colWidth[1] = 13; /* opcode */
2175 p->colWidth[2] = 4; /* P1 */
2176 p->colWidth[3] = 4; /* P2 */
2177 p->colWidth[4] = 4; /* P3 */
2178 p->colWidth[5] = 13; /* P4 */
danielk19770d78bae2008-01-03 07:09:48 +00002179 p->colWidth[6] = 2; /* P5 */
drh60a713c2008-01-21 16:22:45 +00002180 p->colWidth[7] = 13; /* Comment */
persicom7e2dfdd2002-04-18 02:46:52 +00002181 }else if (p->explainPrev.valid) {
2182 p->explainPrev.valid = 0;
2183 p->mode = p->explainPrev.mode;
2184 p->showHeader = p->explainPrev.showHeader;
2185 memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth));
2186 }
drh75897232000-05-29 14:26:00 +00002187 }else
2188
danielk1977c8c70692009-02-25 15:22:02 +00002189#if !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_SUBQUERY)
2190 if( c=='g' && strncmp(azArg[0], "genfkey", n)==0 ){
2191 GenfkeyCmd cmd;
2192 if( 0==genfkeyParseArgs(&cmd, &azArg[1], nArg-1) ){
2193 cmd.db = p->db;
2194 cmd.pCb = p;
2195 genfkey_create_triggers(p->db, "main", (void *)&cmd, genfkeyCmdCb);
2196 }
2197 }else
2198#endif
2199
drhc28490c2006-10-26 14:25:58 +00002200 if( c=='h' && (strncmp(azArg[0], "header", n)==0 ||
persicom7e2dfdd2002-04-18 02:46:52 +00002201 strncmp(azArg[0], "headers", n)==0 )&& nArg>1 ){
drhc28490c2006-10-26 14:25:58 +00002202 p->showHeader = booleanValue(azArg[1]);
drh75897232000-05-29 14:26:00 +00002203 }else
2204
2205 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
drha81c64a2009-01-14 23:38:02 +00002206 fprintf(stderr,"%s",zHelp);
drh75897232000-05-29 14:26:00 +00002207 }else
2208
drhfeac5f82004-08-01 00:10:45 +00002209 if( c=='i' && strncmp(azArg[0], "import", n)==0 && nArg>=3 ){
2210 char *zTable = azArg[2]; /* Insert data into this table */
2211 char *zFile = azArg[1]; /* The file from which to extract data */
2212 sqlite3_stmt *pStmt; /* A statement */
2213 int rc; /* Result code */
2214 int nCol; /* Number of columns in the table */
2215 int nByte; /* Number of bytes in an SQL string */
2216 int i, j; /* Loop counters */
2217 int nSep; /* Number of bytes in p->separator[] */
2218 char *zSql; /* An SQL statement */
2219 char *zLine; /* A single line of input from the file */
2220 char **azCol; /* zLine[] broken up into columns */
2221 char *zCommit; /* How to commit changes */
drhb860bc92004-08-04 15:16:55 +00002222 FILE *in; /* The input file */
2223 int lineno = 0; /* Line number of input file */
drhfeac5f82004-08-01 00:10:45 +00002224
drha543c822006-06-08 16:10:14 +00002225 open_db(p);
drh4f21c4a2008-12-10 22:15:00 +00002226 nSep = strlen30(p->separator);
drhfeac5f82004-08-01 00:10:45 +00002227 if( nSep==0 ){
2228 fprintf(stderr, "non-null separator required for import\n");
2229 return 0;
2230 }
2231 zSql = sqlite3_mprintf("SELECT * FROM '%q'", zTable);
2232 if( zSql==0 ) return 0;
drh4f21c4a2008-12-10 22:15:00 +00002233 nByte = strlen30(zSql);
drh5e6078b2006-01-31 19:07:22 +00002234 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
drhfeac5f82004-08-01 00:10:45 +00002235 sqlite3_free(zSql);
2236 if( rc ){
2237 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
2238 nCol = 0;
drh47ad6842006-11-08 12:25:42 +00002239 rc = 1;
drhfeac5f82004-08-01 00:10:45 +00002240 }else{
2241 nCol = sqlite3_column_count(pStmt);
2242 }
2243 sqlite3_finalize(pStmt);
2244 if( nCol==0 ) return 0;
2245 zSql = malloc( nByte + 20 + nCol*2 );
2246 if( zSql==0 ) return 0;
2247 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO '%q' VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00002248 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00002249 for(i=1; i<nCol; i++){
2250 zSql[j++] = ',';
2251 zSql[j++] = '?';
2252 }
2253 zSql[j++] = ')';
2254 zSql[j] = 0;
drh5e6078b2006-01-31 19:07:22 +00002255 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
drhfeac5f82004-08-01 00:10:45 +00002256 free(zSql);
2257 if( rc ){
2258 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
2259 sqlite3_finalize(pStmt);
drh47ad6842006-11-08 12:25:42 +00002260 return 1;
drhfeac5f82004-08-01 00:10:45 +00002261 }
2262 in = fopen(zFile, "rb");
2263 if( in==0 ){
2264 fprintf(stderr, "cannot open file: %s\n", zFile);
2265 sqlite3_finalize(pStmt);
2266 return 0;
2267 }
2268 azCol = malloc( sizeof(azCol[0])*(nCol+1) );
drh43617e92006-03-06 20:55:46 +00002269 if( azCol==0 ){
2270 fclose(in);
2271 return 0;
2272 }
drhfeac5f82004-08-01 00:10:45 +00002273 sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
2274 zCommit = "COMMIT";
2275 while( (zLine = local_getline(0, in))!=0 ){
2276 char *z;
2277 i = 0;
drhb860bc92004-08-04 15:16:55 +00002278 lineno++;
drhfeac5f82004-08-01 00:10:45 +00002279 azCol[0] = zLine;
drh36d4e972004-10-06 14:39:06 +00002280 for(i=0, z=zLine; *z && *z!='\n' && *z!='\r'; z++){
drhfeac5f82004-08-01 00:10:45 +00002281 if( *z==p->separator[0] && strncmp(z, p->separator, nSep)==0 ){
2282 *z = 0;
2283 i++;
drhb860bc92004-08-04 15:16:55 +00002284 if( i<nCol ){
2285 azCol[i] = &z[nSep];
2286 z += nSep-1;
2287 }
drhfeac5f82004-08-01 00:10:45 +00002288 }
2289 }
drh1cd7f832005-08-05 18:50:51 +00002290 *z = 0;
drhb860bc92004-08-04 15:16:55 +00002291 if( i+1!=nCol ){
2292 fprintf(stderr,"%s line %d: expected %d columns of data but found %d\n",
2293 zFile, lineno, nCol, i+1);
2294 zCommit = "ROLLBACK";
drh1822eee2008-12-04 12:26:00 +00002295 free(zLine);
drhb860bc92004-08-04 15:16:55 +00002296 break;
2297 }
drhfeac5f82004-08-01 00:10:45 +00002298 for(i=0; i<nCol; i++){
2299 sqlite3_bind_text(pStmt, i+1, azCol[i], -1, SQLITE_STATIC);
2300 }
2301 sqlite3_step(pStmt);
2302 rc = sqlite3_reset(pStmt);
2303 free(zLine);
2304 if( rc!=SQLITE_OK ){
2305 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
2306 zCommit = "ROLLBACK";
drh47ad6842006-11-08 12:25:42 +00002307 rc = 1;
drhfeac5f82004-08-01 00:10:45 +00002308 break;
2309 }
2310 }
2311 free(azCol);
2312 fclose(in);
2313 sqlite3_finalize(pStmt);
drhb860bc92004-08-04 15:16:55 +00002314 sqlite3_exec(p->db, zCommit, 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00002315 }else
2316
drh75897232000-05-29 14:26:00 +00002317 if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg>1 ){
2318 struct callback_data data;
2319 char *zErrMsg = 0;
drh44c2eb12003-04-30 11:38:26 +00002320 open_db(p);
drh75897232000-05-29 14:26:00 +00002321 memcpy(&data, p, sizeof(data));
2322 data.showHeader = 0;
2323 data.mode = MODE_List;
danielk1977bc6ada42004-06-30 08:20:16 +00002324 zShellStatic = azArg[1];
2325 sqlite3_exec(p->db,
drha18c5682000-10-08 22:20:57 +00002326 "SELECT name FROM sqlite_master "
danielk1977bc6ada42004-06-30 08:20:16 +00002327 "WHERE type='index' AND tbl_name LIKE shellstatic() "
drhe0bc4042002-06-25 01:09:11 +00002328 "UNION ALL "
2329 "SELECT name FROM sqlite_temp_master "
danielk1977bc6ada42004-06-30 08:20:16 +00002330 "WHERE type='index' AND tbl_name LIKE shellstatic() "
drhe0bc4042002-06-25 01:09:11 +00002331 "ORDER BY 1",
danielk1977bc6ada42004-06-30 08:20:16 +00002332 callback, &data, &zErrMsg
drha18c5682000-10-08 22:20:57 +00002333 );
danielk1977bc6ada42004-06-30 08:20:16 +00002334 zShellStatic = 0;
drh75897232000-05-29 14:26:00 +00002335 if( zErrMsg ){
2336 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002337 sqlite3_free(zErrMsg);
drh75897232000-05-29 14:26:00 +00002338 }
2339 }else
2340
drhae5e4452007-05-03 17:18:36 +00002341#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00002342 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002343 extern void (*sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00002344 if( iotrace && iotrace!=stdout ) fclose(iotrace);
2345 iotrace = 0;
2346 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00002347 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00002348 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002349 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002350 iotrace = stdout;
2351 }else{
2352 iotrace = fopen(azArg[1], "w");
2353 if( iotrace==0 ){
2354 fprintf(stderr, "cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00002355 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00002356 }else{
mlcreech3a00f902008-03-04 17:45:01 +00002357 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002358 }
2359 }
2360 }else
drhae5e4452007-05-03 17:18:36 +00002361#endif
drhb0603412007-02-28 04:47:26 +00002362
drh70df4fe2006-06-13 15:12:21 +00002363#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00002364 if( c=='l' && strncmp(azArg[0], "load", n)==0 && nArg>=2 ){
2365 const char *zFile, *zProc;
2366 char *zErrMsg = 0;
2367 int rc;
2368 zFile = azArg[1];
2369 zProc = nArg>=3 ? azArg[2] : 0;
2370 open_db(p);
2371 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
2372 if( rc!=SQLITE_OK ){
2373 fprintf(stderr, "%s\n", zErrMsg);
2374 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00002375 rc = 1;
drh1e397f82006-06-08 15:28:43 +00002376 }
2377 }else
drh70df4fe2006-06-13 15:12:21 +00002378#endif
drh1e397f82006-06-08 15:28:43 +00002379
drh28bd4bc2000-06-15 15:57:22 +00002380 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg>=2 ){
drh4f21c4a2008-12-10 22:15:00 +00002381 int n2 = strlen30(azArg[1]);
persicom7e2dfdd2002-04-18 02:46:52 +00002382 if( strncmp(azArg[1],"line",n2)==0
2383 ||
2384 strncmp(azArg[1],"lines",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002385 p->mode = MODE_Line;
persicom7e2dfdd2002-04-18 02:46:52 +00002386 }else if( strncmp(azArg[1],"column",n2)==0
2387 ||
2388 strncmp(azArg[1],"columns",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002389 p->mode = MODE_Column;
2390 }else if( strncmp(azArg[1],"list",n2)==0 ){
2391 p->mode = MODE_List;
drh1e5d0e92000-05-31 23:33:17 +00002392 }else if( strncmp(azArg[1],"html",n2)==0 ){
2393 p->mode = MODE_Html;
drhfeac5f82004-08-01 00:10:45 +00002394 }else if( strncmp(azArg[1],"tcl",n2)==0 ){
2395 p->mode = MODE_Tcl;
2396 }else if( strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00002397 p->mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00002398 sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
drhfeac5f82004-08-01 00:10:45 +00002399 }else if( strncmp(azArg[1],"tabs",n2)==0 ){
2400 p->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00002401 sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
drh28bd4bc2000-06-15 15:57:22 +00002402 }else if( strncmp(azArg[1],"insert",n2)==0 ){
2403 p->mode = MODE_Insert;
2404 if( nArg>=3 ){
drh33048c02001-10-01 14:29:22 +00002405 set_table_name(p, azArg[2]);
drh28bd4bc2000-06-15 15:57:22 +00002406 }else{
drh33048c02001-10-01 14:29:22 +00002407 set_table_name(p, "table");
drh28bd4bc2000-06-15 15:57:22 +00002408 }
drhdaffd0e2001-04-11 14:28:42 +00002409 }else {
drhcf68ae92006-12-19 18:47:41 +00002410 fprintf(stderr,"mode should be one of: "
drhfeac5f82004-08-01 00:10:45 +00002411 "column csv html insert line list tabs tcl\n");
drh75897232000-05-29 14:26:00 +00002412 }
2413 }else
2414
persicom7e2dfdd2002-04-18 02:46:52 +00002415 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) {
drh5bb3eb92007-05-04 13:15:55 +00002416 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
2417 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
persicom7e2dfdd2002-04-18 02:46:52 +00002418 }else
2419
drh75897232000-05-29 14:26:00 +00002420 if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){
2421 if( p->out!=stdout ){
2422 fclose(p->out);
2423 }
2424 if( strcmp(azArg[1],"stdout")==0 ){
2425 p->out = stdout;
drh5bb3eb92007-05-04 13:15:55 +00002426 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "stdout");
drh75897232000-05-29 14:26:00 +00002427 }else{
drha1f9b5e2004-02-14 16:31:02 +00002428 p->out = fopen(azArg[1], "wb");
drh75897232000-05-29 14:26:00 +00002429 if( p->out==0 ){
2430 fprintf(stderr,"can't write to \"%s\"\n", azArg[1]);
2431 p->out = stdout;
persicom7e2dfdd2002-04-18 02:46:52 +00002432 } else {
drh5bb3eb92007-05-04 13:15:55 +00002433 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
drh75897232000-05-29 14:26:00 +00002434 }
2435 }
2436 }else
2437
drhdd45df82002-04-18 12:39:03 +00002438 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && (nArg==2 || nArg==3)){
persicom7e2dfdd2002-04-18 02:46:52 +00002439 if( nArg >= 2) {
2440 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
2441 }
2442 if( nArg >= 3) {
2443 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
2444 }
2445 }else
2446
2447 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
drh47ad6842006-11-08 12:25:42 +00002448 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00002449 }else
2450
drh9ff849f2009-02-04 20:55:57 +00002451 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 && nArg==2 ){
drha1f9b5e2004-02-14 16:31:02 +00002452 FILE *alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00002453 if( alt==0 ){
2454 fprintf(stderr,"can't open \"%s\"\n", azArg[1]);
2455 }else{
2456 process_input(p, alt);
2457 fclose(alt);
2458 }
2459 }else
2460
drh9ff849f2009-02-04 20:55:57 +00002461 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 && nArg>1 ){
2462 const char *zSrcFile;
2463 const char *zDb;
2464 sqlite3 *pSrc;
2465 sqlite3_backup *pBackup;
2466 int rc;
drhdc2c4912009-02-04 22:46:47 +00002467 int nTimeout = 0;
2468
drh9ff849f2009-02-04 20:55:57 +00002469 if( nArg==2 ){
2470 zSrcFile = azArg[1];
2471 zDb = "main";
2472 }else{
2473 zSrcFile = azArg[2];
2474 zDb = azArg[1];
2475 }
2476 rc = sqlite3_open(zSrcFile, &pSrc);
2477 if( rc!=SQLITE_OK ){
2478 fprintf(stderr, "Error: cannot open %s\n", zSrcFile);
2479 sqlite3_close(pSrc);
2480 return 1;
2481 }
drhdc2c4912009-02-04 22:46:47 +00002482 open_db(p);
drh9ff849f2009-02-04 20:55:57 +00002483 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
2484 if( pBackup==0 ){
2485 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
2486 sqlite3_close(pSrc);
2487 return 1;
2488 }
drhdc2c4912009-02-04 22:46:47 +00002489 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
2490 || rc==SQLITE_BUSY ){
2491 if( rc==SQLITE_BUSY ){
2492 if( nTimeout++ >= 3 ) break;
2493 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00002494 }
2495 }
2496 sqlite3_backup_finish(pBackup);
2497 if( rc==SQLITE_DONE ){
2498 rc = SQLITE_OK;
drhdc2c4912009-02-04 22:46:47 +00002499 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
2500 fprintf(stderr, "source database is busy\n");
drh9ff849f2009-02-04 20:55:57 +00002501 }else{
2502 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
2503 }
2504 sqlite3_close(pSrc);
2505 }else
2506
drh75897232000-05-29 14:26:00 +00002507 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
2508 struct callback_data data;
2509 char *zErrMsg = 0;
drh44c2eb12003-04-30 11:38:26 +00002510 open_db(p);
drh75897232000-05-29 14:26:00 +00002511 memcpy(&data, p, sizeof(data));
2512 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00002513 data.mode = MODE_Semi;
drh75897232000-05-29 14:26:00 +00002514 if( nArg>1 ){
drhc8d74412004-08-31 23:41:26 +00002515 int i;
shane7d3846a2008-12-11 02:58:26 +00002516 for(i=0; azArg[1][i]; i++) azArg[1][i] = (char)tolower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00002517 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00002518 char *new_argv[2], *new_colv[2];
2519 new_argv[0] = "CREATE TABLE sqlite_master (\n"
2520 " type text,\n"
2521 " name text,\n"
2522 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00002523 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00002524 " sql text\n"
2525 ")";
2526 new_argv[1] = 0;
2527 new_colv[0] = "sql";
2528 new_colv[1] = 0;
2529 callback(&data, 1, new_argv, new_colv);
drhc8d74412004-08-31 23:41:26 +00002530 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00002531 char *new_argv[2], *new_colv[2];
2532 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
2533 " type text,\n"
2534 " name text,\n"
2535 " tbl_name text,\n"
2536 " rootpage integer,\n"
2537 " sql text\n"
2538 ")";
2539 new_argv[1] = 0;
2540 new_colv[0] = "sql";
2541 new_colv[1] = 0;
2542 callback(&data, 1, new_argv, new_colv);
drha18c5682000-10-08 22:20:57 +00002543 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00002544 zShellStatic = azArg[1];
2545 sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002546 "SELECT sql FROM "
drh8f800a72009-01-14 23:17:55 +00002547 " (SELECT sql sql, type type, tbl_name tbl_name, name name"
2548 " FROM sqlite_master UNION ALL"
2549 " SELECT sql, type, tbl_name, name FROM sqlite_temp_master) "
danielk1977bc6ada42004-06-30 08:20:16 +00002550 "WHERE tbl_name LIKE shellstatic() AND type!='meta' AND sql NOTNULL "
drhe0bc4042002-06-25 01:09:11 +00002551 "ORDER BY substr(type,2,1), name",
danielk1977bc6ada42004-06-30 08:20:16 +00002552 callback, &data, &zErrMsg);
2553 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00002554 }
drh75897232000-05-29 14:26:00 +00002555 }else{
danielk19776f8a5032004-05-10 10:34:51 +00002556 sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002557 "SELECT sql FROM "
drh8f800a72009-01-14 23:17:55 +00002558 " (SELECT sql sql, type type, tbl_name tbl_name, name name"
2559 " FROM sqlite_master UNION ALL"
2560 " SELECT sql, type, tbl_name, name FROM sqlite_temp_master) "
drh0c356672005-09-10 22:40:53 +00002561 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'"
drhe0bc4042002-06-25 01:09:11 +00002562 "ORDER BY substr(type,2,1), name",
drha18c5682000-10-08 22:20:57 +00002563 callback, &data, &zErrMsg
2564 );
drh75897232000-05-29 14:26:00 +00002565 }
drh75897232000-05-29 14:26:00 +00002566 if( zErrMsg ){
2567 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002568 sqlite3_free(zErrMsg);
drh75897232000-05-29 14:26:00 +00002569 }
2570 }else
2571
2572 if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){
drh5bb3eb92007-05-04 13:15:55 +00002573 sqlite3_snprintf(sizeof(p->separator), p->separator,
2574 "%.*s", (int)sizeof(p->separator)-1, azArg[1]);
drh75897232000-05-29 14:26:00 +00002575 }else
2576
persicom7e2dfdd2002-04-18 02:46:52 +00002577 if( c=='s' && strncmp(azArg[0], "show", n)==0){
2578 int i;
2579 fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
drh67505e72002-04-19 12:34:06 +00002580 fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off");
drhdd45df82002-04-18 12:39:03 +00002581 fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00002582 fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]);
drhfeac5f82004-08-01 00:10:45 +00002583 fprintf(p->out,"%9.9s: ", "nullvalue");
2584 output_c_string(p->out, p->nullvalue);
2585 fprintf(p->out, "\n");
drh67505e72002-04-19 12:34:06 +00002586 fprintf(p->out,"%9.9s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00002587 strlen30(p->outfile) ? p->outfile : "stdout");
drhfeac5f82004-08-01 00:10:45 +00002588 fprintf(p->out,"%9.9s: ", "separator");
2589 output_c_string(p->out, p->separator);
2590 fprintf(p->out, "\n");
persicom7e2dfdd2002-04-18 02:46:52 +00002591 fprintf(p->out,"%9.9s: ","width");
2592 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
drhfeac5f82004-08-01 00:10:45 +00002593 fprintf(p->out,"%d ",p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00002594 }
drhfeac5f82004-08-01 00:10:45 +00002595 fprintf(p->out,"\n");
persicom7e2dfdd2002-04-18 02:46:52 +00002596 }else
2597
drh2dfbbca2000-07-28 14:32:48 +00002598 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){
drhe3710332000-09-29 13:30:53 +00002599 char **azResult;
2600 int nRow, rc;
2601 char *zErrMsg;
drh44c2eb12003-04-30 11:38:26 +00002602 open_db(p);
drha50da102000-08-08 20:19:09 +00002603 if( nArg==1 ){
danielk19776f8a5032004-05-10 10:34:51 +00002604 rc = sqlite3_get_table(p->db,
drha50da102000-08-08 20:19:09 +00002605 "SELECT name FROM sqlite_master "
drh0c356672005-09-10 22:40:53 +00002606 "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'"
drhe0bc4042002-06-25 01:09:11 +00002607 "UNION ALL "
2608 "SELECT name FROM sqlite_temp_master "
2609 "WHERE type IN ('table','view') "
2610 "ORDER BY 1",
drha18c5682000-10-08 22:20:57 +00002611 &azResult, &nRow, 0, &zErrMsg
2612 );
drha50da102000-08-08 20:19:09 +00002613 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00002614 zShellStatic = azArg[1];
2615 rc = sqlite3_get_table(p->db,
drha50da102000-08-08 20:19:09 +00002616 "SELECT name FROM sqlite_master "
danielk1977bc6ada42004-06-30 08:20:16 +00002617 "WHERE type IN ('table','view') AND name LIKE '%'||shellstatic()||'%' "
drhe0bc4042002-06-25 01:09:11 +00002618 "UNION ALL "
2619 "SELECT name FROM sqlite_temp_master "
danielk1977bc6ada42004-06-30 08:20:16 +00002620 "WHERE type IN ('table','view') AND name LIKE '%'||shellstatic()||'%' "
drhe0bc4042002-06-25 01:09:11 +00002621 "ORDER BY 1",
danielk1977bc6ada42004-06-30 08:20:16 +00002622 &azResult, &nRow, 0, &zErrMsg
drha18c5682000-10-08 22:20:57 +00002623 );
danielk1977bc6ada42004-06-30 08:20:16 +00002624 zShellStatic = 0;
drha50da102000-08-08 20:19:09 +00002625 }
drh75897232000-05-29 14:26:00 +00002626 if( zErrMsg ){
2627 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002628 sqlite3_free(zErrMsg);
drh75897232000-05-29 14:26:00 +00002629 }
drhe3710332000-09-29 13:30:53 +00002630 if( rc==SQLITE_OK ){
2631 int len, maxlen = 0;
2632 int i, j;
2633 int nPrintCol, nPrintRow;
2634 for(i=1; i<=nRow; i++){
2635 if( azResult[i]==0 ) continue;
drh4f21c4a2008-12-10 22:15:00 +00002636 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00002637 if( len>maxlen ) maxlen = len;
2638 }
2639 nPrintCol = 80/(maxlen+2);
2640 if( nPrintCol<1 ) nPrintCol = 1;
2641 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
2642 for(i=0; i<nPrintRow; i++){
2643 for(j=i+1; j<=nRow; j+=nPrintRow){
2644 char *zSp = j<=nPrintRow ? "" : " ";
2645 printf("%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : "");
2646 }
2647 printf("\n");
2648 }
drh47ad6842006-11-08 12:25:42 +00002649 }else{
2650 rc = 1;
drhe3710332000-09-29 13:30:53 +00002651 }
danielk19776f8a5032004-05-10 10:34:51 +00002652 sqlite3_free_table(azResult);
drh75897232000-05-29 14:26:00 +00002653 }else
2654
drh3b1a9882007-11-02 12:53:03 +00002655 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 && nArg>=2 ){
drh44c2eb12003-04-30 11:38:26 +00002656 open_db(p);
danielk19776f8a5032004-05-10 10:34:51 +00002657 sqlite3_busy_timeout(p->db, atoi(azArg[1]));
drh2dfbbca2000-07-28 14:32:48 +00002658 }else
drh3b1a9882007-11-02 12:53:03 +00002659
2660#if HAS_TIMER
2661 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 && nArg>1 ){
2662 enableTimer = booleanValue(azArg[1]);
2663 }else
2664#endif
drh2dfbbca2000-07-28 14:32:48 +00002665
drh75897232000-05-29 14:26:00 +00002666 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
2667 int j;
drh43617e92006-03-06 20:55:46 +00002668 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00002669 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
2670 p->colWidth[j-1] = atoi(azArg[j]);
2671 }
2672 }else
2673
drh3b1a9882007-11-02 12:53:03 +00002674
drh75897232000-05-29 14:26:00 +00002675 {
drh67505e72002-04-19 12:34:06 +00002676 fprintf(stderr, "unknown command or invalid arguments: "
2677 " \"%s\". Enter \".help\" for help\n", azArg[0]);
drh75897232000-05-29 14:26:00 +00002678 }
drh67505e72002-04-19 12:34:06 +00002679
2680 return rc;
drh75897232000-05-29 14:26:00 +00002681}
2682
drh67505e72002-04-19 12:34:06 +00002683/*
drh91a66392007-09-07 01:12:32 +00002684** Return TRUE if a semicolon occurs anywhere in the first N characters
2685** of string z[].
drh324ccef2003-02-05 14:06:20 +00002686*/
drh91a66392007-09-07 01:12:32 +00002687static int _contains_semicolon(const char *z, int N){
2688 int i;
2689 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
2690 return 0;
drh324ccef2003-02-05 14:06:20 +00002691}
2692
2693/*
drh70c7a4b2003-04-26 03:03:06 +00002694** Test to see if a line consists entirely of whitespace.
2695*/
2696static int _all_whitespace(const char *z){
2697 for(; *z; z++){
drh4c755c02004-08-08 20:22:17 +00002698 if( isspace(*(unsigned char*)z) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00002699 if( *z=='/' && z[1]=='*' ){
2700 z += 2;
2701 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
2702 if( *z==0 ) return 0;
2703 z++;
2704 continue;
2705 }
2706 if( *z=='-' && z[1]=='-' ){
2707 z += 2;
2708 while( *z && *z!='\n' ){ z++; }
2709 if( *z==0 ) return 1;
2710 continue;
2711 }
2712 return 0;
2713 }
2714 return 1;
2715}
2716
2717/*
drha9b17162003-04-29 18:01:28 +00002718** Return TRUE if the line typed in is an SQL command terminator other
2719** than a semi-colon. The SQL Server style "go" command is understood
2720** as is the Oracle "/".
2721*/
2722static int _is_command_terminator(const char *zLine){
drh4c755c02004-08-08 20:22:17 +00002723 while( isspace(*(unsigned char*)zLine) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00002724 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
2725 return 1; /* Oracle */
2726 }
drhc8d74412004-08-31 23:41:26 +00002727 if( tolower(zLine[0])=='g' && tolower(zLine[1])=='o'
2728 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00002729 return 1; /* SQL Server */
2730 }
2731 return 0;
2732}
2733
2734/*
drh233a5312008-12-18 22:25:13 +00002735** Return true if zSql is a complete SQL statement. Return false if it
2736** ends in the middle of a string literal or C-style comment.
2737*/
2738static int _is_complete(char *zSql, int nSql){
2739 int rc;
2740 if( zSql==0 ) return 1;
2741 zSql[nSql] = ';';
2742 zSql[nSql+1] = 0;
2743 rc = sqlite3_complete(zSql);
2744 zSql[nSql] = 0;
2745 return rc;
2746}
2747
2748/*
drh67505e72002-04-19 12:34:06 +00002749** Read input from *in and process it. If *in==0 then input
2750** is interactive - the user is typing it it. Otherwise, input
2751** is coming from a file or device. A prompt is issued and history
2752** is saved only if input is interactive. An interrupt signal will
2753** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00002754**
2755** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00002756*/
drhc28490c2006-10-26 14:25:58 +00002757static int process_input(struct callback_data *p, FILE *in){
danielk19772ac27622007-07-03 05:31:16 +00002758 char *zLine = 0;
drhdaffd0e2001-04-11 14:28:42 +00002759 char *zSql = 0;
2760 int nSql = 0;
drh91a66392007-09-07 01:12:32 +00002761 int nSqlPrior = 0;
drhdaffd0e2001-04-11 14:28:42 +00002762 char *zErrMsg;
drhc49f44e2006-10-26 18:15:42 +00002763 int rc;
2764 int errCnt = 0;
drhc28490c2006-10-26 14:25:58 +00002765 int lineno = 0;
2766 int startline = 0;
drhc49f44e2006-10-26 18:15:42 +00002767
2768 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
2769 fflush(p->out);
danielk19772ac27622007-07-03 05:31:16 +00002770 free(zLine);
drhc49f44e2006-10-26 18:15:42 +00002771 zLine = one_input_line(zSql, in);
2772 if( zLine==0 ){
2773 break; /* We have reached EOF */
2774 }
drh67505e72002-04-19 12:34:06 +00002775 if( seenInterrupt ){
2776 if( in!=0 ) break;
2777 seenInterrupt = 0;
2778 }
drhc28490c2006-10-26 14:25:58 +00002779 lineno++;
drhdaffd0e2001-04-11 14:28:42 +00002780 if( p->echoOn ) printf("%s\n", zLine);
drhf817b6b2003-06-16 00:16:41 +00002781 if( (zSql==0 || zSql[0]==0) && _all_whitespace(zLine) ) continue;
drh2af0b2d2002-02-21 02:25:02 +00002782 if( zLine && zLine[0]=='.' && nSql==0 ){
drhc49f44e2006-10-26 18:15:42 +00002783 rc = do_meta_command(zLine, p);
drh47ad6842006-11-08 12:25:42 +00002784 if( rc==2 ){
2785 break;
2786 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00002787 errCnt++;
2788 }
drhdaffd0e2001-04-11 14:28:42 +00002789 continue;
2790 }
drh233a5312008-12-18 22:25:13 +00002791 if( _is_command_terminator(zLine) && _is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00002792 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00002793 }
drh91a66392007-09-07 01:12:32 +00002794 nSqlPrior = nSql;
drhdaffd0e2001-04-11 14:28:42 +00002795 if( zSql==0 ){
2796 int i;
drh4c755c02004-08-08 20:22:17 +00002797 for(i=0; zLine[i] && isspace((unsigned char)zLine[i]); i++){}
drhdaffd0e2001-04-11 14:28:42 +00002798 if( zLine[i]!=0 ){
drh4f21c4a2008-12-10 22:15:00 +00002799 nSql = strlen30(zLine);
drh233a5312008-12-18 22:25:13 +00002800 zSql = malloc( nSql+3 );
drhc1f44942006-05-10 14:39:13 +00002801 if( zSql==0 ){
2802 fprintf(stderr, "out of memory\n");
2803 exit(1);
2804 }
drh5bb3eb92007-05-04 13:15:55 +00002805 memcpy(zSql, zLine, nSql+1);
drhc28490c2006-10-26 14:25:58 +00002806 startline = lineno;
drhdaffd0e2001-04-11 14:28:42 +00002807 }
2808 }else{
drh4f21c4a2008-12-10 22:15:00 +00002809 int len = strlen30(zLine);
drh233a5312008-12-18 22:25:13 +00002810 zSql = realloc( zSql, nSql + len + 4 );
drhdaffd0e2001-04-11 14:28:42 +00002811 if( zSql==0 ){
2812 fprintf(stderr,"%s: out of memory!\n", Argv0);
2813 exit(1);
2814 }
drh5bb3eb92007-05-04 13:15:55 +00002815 zSql[nSql++] = '\n';
2816 memcpy(&zSql[nSql], zLine, len+1);
drhdaffd0e2001-04-11 14:28:42 +00002817 nSql += len;
2818 }
drh91a66392007-09-07 01:12:32 +00002819 if( zSql && _contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
2820 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00002821 p->cnt = 0;
drh44c2eb12003-04-30 11:38:26 +00002822 open_db(p);
drh3b1a9882007-11-02 12:53:03 +00002823 BEGIN_TIMER;
danielk19776f8a5032004-05-10 10:34:51 +00002824 rc = sqlite3_exec(p->db, zSql, callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00002825 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00002826 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00002827 char zPrefix[100];
2828 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00002829 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
2830 "SQL error near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00002831 }else{
drh5bb3eb92007-05-04 13:15:55 +00002832 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "SQL error:");
drhc28490c2006-10-26 14:25:58 +00002833 }
drh7f953e22002-07-13 17:33:45 +00002834 if( zErrMsg!=0 ){
drhc28490c2006-10-26 14:25:58 +00002835 printf("%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002836 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00002837 zErrMsg = 0;
2838 }else{
drhc28490c2006-10-26 14:25:58 +00002839 printf("%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00002840 }
drhc49f44e2006-10-26 18:15:42 +00002841 errCnt++;
drhdaffd0e2001-04-11 14:28:42 +00002842 }
2843 free(zSql);
2844 zSql = 0;
2845 nSql = 0;
2846 }
2847 }
2848 if( zSql ){
drhdfef4992008-11-11 18:55:03 +00002849 if( !_all_whitespace(zSql) ) fprintf(stderr, "Incomplete SQL: %s\n", zSql);
drhdaffd0e2001-04-11 14:28:42 +00002850 free(zSql);
2851 }
danielk19772ac27622007-07-03 05:31:16 +00002852 free(zLine);
drhc49f44e2006-10-26 18:15:42 +00002853 return errCnt;
drhdaffd0e2001-04-11 14:28:42 +00002854}
2855
drh67505e72002-04-19 12:34:06 +00002856/*
2857** Return a pathname which is the user's home directory. A
2858** 0 return indicates an error of some kind. Space to hold the
2859** resulting string is obtained from malloc(). The calling
2860** function should free the result.
2861*/
2862static char *find_home_dir(void){
2863 char *home_dir = NULL;
persicom7e2dfdd2002-04-18 02:46:52 +00002864
chw97185482008-11-17 08:05:31 +00002865#if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__) && !defined(_WIN32_WCE) && !defined(__RTP__) && !defined(_WRS_KERNEL)
drh67505e72002-04-19 12:34:06 +00002866 struct passwd *pwent;
2867 uid_t uid = getuid();
drhbd842ba2002-08-21 11:26:41 +00002868 if( (pwent=getpwuid(uid)) != NULL) {
2869 home_dir = pwent->pw_dir;
drh67505e72002-04-19 12:34:06 +00002870 }
2871#endif
2872
chw65d3c132007-11-12 21:09:10 +00002873#if defined(_WIN32_WCE)
2874 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
2875 */
2876 home_dir = strdup("/");
2877#else
2878
drh164a1b62006-08-19 11:15:20 +00002879#if defined(_WIN32) || defined(WIN32) || defined(__OS2__)
2880 if (!home_dir) {
2881 home_dir = getenv("USERPROFILE");
2882 }
2883#endif
2884
drh67505e72002-04-19 12:34:06 +00002885 if (!home_dir) {
2886 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00002887 }
2888
drhcdb36b72006-06-12 12:57:45 +00002889#if defined(_WIN32) || defined(WIN32) || defined(__OS2__)
drhe98d4fa2002-04-21 19:06:22 +00002890 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00002891 char *zDrive, *zPath;
2892 int n;
2893 zDrive = getenv("HOMEDRIVE");
2894 zPath = getenv("HOMEPATH");
2895 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00002896 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00002897 home_dir = malloc( n );
2898 if( home_dir==0 ) return 0;
2899 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
2900 return home_dir;
2901 }
2902 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00002903 }
2904#endif
2905
chw65d3c132007-11-12 21:09:10 +00002906#endif /* !_WIN32_WCE */
2907
drh67505e72002-04-19 12:34:06 +00002908 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00002909 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00002910 char *z = malloc( n );
2911 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00002912 home_dir = z;
2913 }
drhe98d4fa2002-04-21 19:06:22 +00002914
drh67505e72002-04-19 12:34:06 +00002915 return home_dir;
2916}
2917
2918/*
2919** Read input from the file given by sqliterc_override. Or if that
2920** parameter is NULL, take input from ~/.sqliterc
2921*/
drh22fbcb82004-02-01 01:22:50 +00002922static void process_sqliterc(
2923 struct callback_data *p, /* Configuration data */
2924 const char *sqliterc_override /* Name of config file. NULL to use default */
2925){
persicom7e2dfdd2002-04-18 02:46:52 +00002926 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00002927 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00002928 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00002929 FILE *in = NULL;
drha959ac42007-06-20 13:10:00 +00002930 int nBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00002931
2932 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00002933 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00002934 if( home_dir==0 ){
chw97185482008-11-17 08:05:31 +00002935#if !defined(__RTP__) && !defined(_WRS_KERNEL)
drhe98d4fa2002-04-21 19:06:22 +00002936 fprintf(stderr,"%s: cannot locate your home directory!\n", Argv0);
chw97185482008-11-17 08:05:31 +00002937#endif
drhe98d4fa2002-04-21 19:06:22 +00002938 return;
2939 }
drh4f21c4a2008-12-10 22:15:00 +00002940 nBuf = strlen30(home_dir) + 16;
drha959ac42007-06-20 13:10:00 +00002941 zBuf = malloc( nBuf );
drh22fbcb82004-02-01 01:22:50 +00002942 if( zBuf==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00002943 fprintf(stderr,"%s: out of memory!\n", Argv0);
2944 exit(1);
2945 }
drha959ac42007-06-20 13:10:00 +00002946 sqlite3_snprintf(nBuf, zBuf,"%s/.sqliterc",home_dir);
drh67505e72002-04-19 12:34:06 +00002947 free(home_dir);
drh22fbcb82004-02-01 01:22:50 +00002948 sqliterc = (const char*)zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00002949 }
drha1f9b5e2004-02-14 16:31:02 +00002950 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00002951 if( in ){
drhc28490c2006-10-26 14:25:58 +00002952 if( stdin_is_interactive ){
drhb695aca2007-07-30 20:41:52 +00002953 printf("-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00002954 }
persicom7e2dfdd2002-04-18 02:46:52 +00002955 process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00002956 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00002957 }
drh43617e92006-03-06 20:55:46 +00002958 free(zBuf);
persicom7e2dfdd2002-04-18 02:46:52 +00002959 return;
2960}
2961
drh67505e72002-04-19 12:34:06 +00002962/*
drhe1e38c42003-05-04 18:30:59 +00002963** Show available command line options
2964*/
2965static const char zOptions[] =
2966 " -init filename read/process named file\n"
2967 " -echo print commands before execution\n"
2968 " -[no]header turn headers on or off\n"
drhc49f44e2006-10-26 18:15:42 +00002969 " -bail stop after hitting an error\n"
2970 " -interactive force interactive I/O\n"
2971 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00002972 " -column set output mode to 'column'\n"
drhc49f44e2006-10-26 18:15:42 +00002973 " -csv set output mode to 'csv'\n"
drhe1e38c42003-05-04 18:30:59 +00002974 " -html set output mode to HTML\n"
2975 " -line set output mode to 'line'\n"
2976 " -list set output mode to 'list'\n"
2977 " -separator 'x' set output field separator (|)\n"
2978 " -nullvalue 'text' set text string for NULL values\n"
2979 " -version show SQLite version\n"
drhe1e38c42003-05-04 18:30:59 +00002980;
2981static void usage(int showDetail){
drh80e8be92006-08-29 12:04:19 +00002982 fprintf(stderr,
2983 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
2984 "FILENAME is the name of an SQLite database. A new database is created\n"
2985 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00002986 if( showDetail ){
drh80e8be92006-08-29 12:04:19 +00002987 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00002988 }else{
2989 fprintf(stderr, "Use the -help option for additional information\n");
2990 }
2991 exit(1);
2992}
2993
2994/*
drh67505e72002-04-19 12:34:06 +00002995** Initialize the state information in data
2996*/
drh0850b532006-01-31 19:31:43 +00002997static void main_init(struct callback_data *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00002998 memset(data, 0, sizeof(*data));
2999 data->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00003000 memcpy(data->separator,"|", 2);
persicom7e2dfdd2002-04-18 02:46:52 +00003001 data->showHeader = 0;
drh5bb3eb92007-05-04 13:15:55 +00003002 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
3003 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
persicom7e2dfdd2002-04-18 02:46:52 +00003004}
3005
drh75897232000-05-29 14:26:00 +00003006int main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00003007 char *zErrMsg = 0;
3008 struct callback_data data;
drh22fbcb82004-02-01 01:22:50 +00003009 const char *zInitFile = 0;
3010 char *zFirstCmd = 0;
drh44c2eb12003-04-30 11:38:26 +00003011 int i;
drhc28490c2006-10-26 14:25:58 +00003012 int rc = 0;
drh75897232000-05-29 14:26:00 +00003013
drhdaffd0e2001-04-11 14:28:42 +00003014 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00003015 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00003016 stdin_is_interactive = isatty(0);
persicom7e2dfdd2002-04-18 02:46:52 +00003017
drh44c2eb12003-04-30 11:38:26 +00003018 /* Make sure we have a valid signal handler early, before anything
3019 ** else is done.
3020 */
drh4c504392000-10-16 22:06:40 +00003021#ifdef SIGINT
3022 signal(SIGINT, interrupt_handler);
3023#endif
drh44c2eb12003-04-30 11:38:26 +00003024
drh22fbcb82004-02-01 01:22:50 +00003025 /* Do an initial pass through the command-line argument to locate
3026 ** the name of the database file, the name of the initialization file,
3027 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00003028 */
drh22fbcb82004-02-01 01:22:50 +00003029 for(i=1; i<argc-1; i++){
drhc28490c2006-10-26 14:25:58 +00003030 char *z;
drh44c2eb12003-04-30 11:38:26 +00003031 if( argv[i][0]!='-' ) break;
drhc28490c2006-10-26 14:25:58 +00003032 z = argv[i];
3033 if( z[0]=='-' && z[1]=='-' ) z++;
drh44c2eb12003-04-30 11:38:26 +00003034 if( strcmp(argv[i],"-separator")==0 || strcmp(argv[i],"-nullvalue")==0 ){
3035 i++;
drh22fbcb82004-02-01 01:22:50 +00003036 }else if( strcmp(argv[i],"-init")==0 ){
3037 i++;
3038 zInitFile = argv[i];
drh44c2eb12003-04-30 11:38:26 +00003039 }
3040 }
drh22fbcb82004-02-01 01:22:50 +00003041 if( i<argc ){
danielk197729bafea2008-06-26 10:41:19 +00003042#if defined(SQLITE_OS_OS2) && SQLITE_OS_OS2
pweilbacherd190be82008-04-15 18:50:02 +00003043 data.zDbFilename = (const char *)convertCpPathToUtf8( argv[i++] );
3044#else
drh22fbcb82004-02-01 01:22:50 +00003045 data.zDbFilename = argv[i++];
pweilbacherd190be82008-04-15 18:50:02 +00003046#endif
drh22fbcb82004-02-01 01:22:50 +00003047 }else{
danielk197703aded42004-11-22 05:26:27 +00003048#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00003049 data.zDbFilename = ":memory:";
danielk197703aded42004-11-22 05:26:27 +00003050#else
3051 data.zDbFilename = 0;
3052#endif
drh22fbcb82004-02-01 01:22:50 +00003053 }
3054 if( i<argc ){
3055 zFirstCmd = argv[i++];
3056 }
drh44c2eb12003-04-30 11:38:26 +00003057 data.out = stdout;
3058
drh01b41712005-08-29 23:06:23 +00003059#ifdef SQLITE_OMIT_MEMORYDB
3060 if( data.zDbFilename==0 ){
3061 fprintf(stderr,"%s: no database filename specified\n", argv[0]);
3062 exit(1);
3063 }
3064#endif
3065
drh44c2eb12003-04-30 11:38:26 +00003066 /* Go ahead and open the database file if it already exists. If the
3067 ** file does not exist, delay opening it. This prevents empty database
3068 ** files from being created if a user mistypes the database name argument
3069 ** to the sqlite command-line tool.
3070 */
drhc8d74412004-08-31 23:41:26 +00003071 if( access(data.zDbFilename, 0)==0 ){
drh44c2eb12003-04-30 11:38:26 +00003072 open_db(&data);
3073 }
3074
drh22fbcb82004-02-01 01:22:50 +00003075 /* Process the initialization file if there is one. If no -init option
3076 ** is given on the command line, look for a file named ~/.sqliterc and
3077 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00003078 */
drh22fbcb82004-02-01 01:22:50 +00003079 process_sqliterc(&data,zInitFile);
drh44c2eb12003-04-30 11:38:26 +00003080
drh22fbcb82004-02-01 01:22:50 +00003081 /* Make a second pass through the command-line argument and set
3082 ** options. This second pass is delayed until after the initialization
3083 ** file is processed so that the command-line arguments will override
3084 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00003085 */
drh22fbcb82004-02-01 01:22:50 +00003086 for(i=1; i<argc && argv[i][0]=='-'; i++){
3087 char *z = argv[i];
drhc28490c2006-10-26 14:25:58 +00003088 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00003089 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00003090 i++;
3091 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003092 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00003093 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003094 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00003095 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003096 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00003097 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00003098 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00003099 }else if( strcmp(z,"-csv")==0 ){
3100 data.mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00003101 memcpy(data.separator,",",2);
drh22fbcb82004-02-01 01:22:50 +00003102 }else if( strcmp(z,"-separator")==0 ){
3103 i++;
drh5bb3eb92007-05-04 13:15:55 +00003104 sqlite3_snprintf(sizeof(data.separator), data.separator,
3105 "%.*s",(int)sizeof(data.separator)-1,argv[i]);
drh22fbcb82004-02-01 01:22:50 +00003106 }else if( strcmp(z,"-nullvalue")==0 ){
3107 i++;
drh5bb3eb92007-05-04 13:15:55 +00003108 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue,
3109 "%.*s",(int)sizeof(data.nullvalue)-1,argv[i]);
drh22fbcb82004-02-01 01:22:50 +00003110 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003111 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00003112 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003113 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00003114 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00003115 data.echoOn = 1;
drhc49f44e2006-10-26 18:15:42 +00003116 }else if( strcmp(z,"-bail")==0 ){
3117 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00003118 }else if( strcmp(z,"-version")==0 ){
drhc8d74412004-08-31 23:41:26 +00003119 printf("%s\n", sqlite3_libversion());
drh151e3e12006-06-06 12:32:21 +00003120 return 0;
drhc28490c2006-10-26 14:25:58 +00003121 }else if( strcmp(z,"-interactive")==0 ){
3122 stdin_is_interactive = 1;
3123 }else if( strcmp(z,"-batch")==0 ){
3124 stdin_is_interactive = 0;
drh80e8be92006-08-29 12:04:19 +00003125 }else if( strcmp(z,"-help")==0 || strcmp(z, "--help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00003126 usage(1);
drh1e5d0e92000-05-31 23:33:17 +00003127 }else{
drh22fbcb82004-02-01 01:22:50 +00003128 fprintf(stderr,"%s: unknown option: %s\n", Argv0, z);
drhe1e38c42003-05-04 18:30:59 +00003129 fprintf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00003130 return 1;
3131 }
3132 }
drh44c2eb12003-04-30 11:38:26 +00003133
drh22fbcb82004-02-01 01:22:50 +00003134 if( zFirstCmd ){
drh44c2eb12003-04-30 11:38:26 +00003135 /* Run just the command that follows the database name
3136 */
drh22fbcb82004-02-01 01:22:50 +00003137 if( zFirstCmd[0]=='.' ){
3138 do_meta_command(zFirstCmd, &data);
drh6ff13852001-11-25 13:18:23 +00003139 exit(0);
3140 }else{
3141 int rc;
drh44c2eb12003-04-30 11:38:26 +00003142 open_db(&data);
danielk19776f8a5032004-05-10 10:34:51 +00003143 rc = sqlite3_exec(data.db, zFirstCmd, callback, &data, &zErrMsg);
drh6ff13852001-11-25 13:18:23 +00003144 if( rc!=0 && zErrMsg!=0 ){
3145 fprintf(stderr,"SQL error: %s\n", zErrMsg);
3146 exit(1);
3147 }
drh75897232000-05-29 14:26:00 +00003148 }
3149 }else{
drh44c2eb12003-04-30 11:38:26 +00003150 /* Run commands received from standard input
3151 */
drhc28490c2006-10-26 14:25:58 +00003152 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00003153 char *zHome;
3154 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00003155 int nHistory;
drh75897232000-05-29 14:26:00 +00003156 printf(
drhb217a572000-08-22 13:40:18 +00003157 "SQLite version %s\n"
mihailim65df9db2008-06-28 11:29:22 +00003158 "Enter \".help\" for instructions\n"
3159 "Enter SQL statements terminated with a \";\"\n",
drhc8d74412004-08-31 23:41:26 +00003160 sqlite3_libversion()
drh75897232000-05-29 14:26:00 +00003161 );
drh67505e72002-04-19 12:34:06 +00003162 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00003163 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00003164 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00003165 if( (zHistory = malloc(nHistory))!=0 ){
3166 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
3167 }
drh67505e72002-04-19 12:34:06 +00003168 }
danielk19774af00c62005-01-23 23:43:21 +00003169#if defined(HAVE_READLINE) && HAVE_READLINE==1
drh67505e72002-04-19 12:34:06 +00003170 if( zHistory ) read_history(zHistory);
danielk19774af00c62005-01-23 23:43:21 +00003171#endif
drhc28490c2006-10-26 14:25:58 +00003172 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00003173 if( zHistory ){
3174 stifle_history(100);
3175 write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00003176 free(zHistory);
drh67505e72002-04-19 12:34:06 +00003177 }
adamd0a3daa32006-07-28 20:16:14 +00003178 free(zHome);
drhdaffd0e2001-04-11 14:28:42 +00003179 }else{
drhc28490c2006-10-26 14:25:58 +00003180 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00003181 }
3182 }
drh33048c02001-10-01 14:29:22 +00003183 set_table_name(&data, 0);
adamd0a3daa32006-07-28 20:16:14 +00003184 if( db ){
3185 if( sqlite3_close(db)!=SQLITE_OK ){
3186 fprintf(stderr,"error closing database: %s\n", sqlite3_errmsg(db));
3187 }
3188 }
drhc28490c2006-10-26 14:25:58 +00003189 return rc;
drh75897232000-05-29 14:26:00 +00003190}