1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-11-05 04:30:38 +03:00

Improve error handling in shell command ".tables".

FossilOrigin-Name: 31a91ee7d32af8580a170903eb857ed9222fdb0a
This commit is contained in:
dan
2015-09-30 11:19:05 +00:00
parent 4b92f98ccc
commit d95bb39c52
3 changed files with 53 additions and 18 deletions

View File

@@ -1,5 +1,5 @@
C Use\ssymbolic\snames\sXN_ROWID\sand\sXN_EXPR\sin\splace\sof\sthe\s(-1)\sand\s(-2)\nmagic\snumbers\sin\sIndex.aiColumn[].\s\sAdd\sasserts\sto\shelp\sverify\sthat\nIndex.aiColumn[]\sis\salways\sused\scorrectly.\s\sFix\sone\splace\sin\sFK\sprocessing\nwhere\sIndex.aiColumn[]\swas\snot\sbeing\sused\scorrectly. C Improve\serror\shandling\sin\sshell\scommand\s".tables".
D 2015-09-29T17:20:14.958 D 2015-09-30T11:19:05.250
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -341,7 +341,7 @@ F src/random.c ba2679f80ec82c4190062d756f22d0c358180696
F src/resolve.c 1954a0f01bf65d78d7d559aea3d5c67f33376d91 F src/resolve.c 1954a0f01bf65d78d7d559aea3d5c67f33376d91
F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e
F src/select.c e49f4af9748c9e0cc1bf864b4190aa94841c8409 F src/select.c e49f4af9748c9e0cc1bf864b4190aa94841c8409
F src/shell.c a11b20da4c6630e0e8f83c47ce36f717dd0422f0 F src/shell.c dfd18e56fcb88dd79378774e9bc3246a9bd52243
F src/sqlite.h.in 4b76d74d69af48c534c58fb723137dc6944bdedc F src/sqlite.h.in 4b76d74d69af48c534c58fb723137dc6944bdedc
F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad
F src/sqlite3ext.h 64350bf36833a56ad675e27392a913f417c5c308 F src/sqlite3ext.h 64350bf36833a56ad675e27392a913f417c5c308
@@ -1389,7 +1389,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
P a1d08fd3d0419da8c22355d48c6d83eed6fd7e07 P 7d272aa62cd4cbbf4b5d04e3b918de27671e8301
R 52625b1830d3c09e89f8505fdc133a11 R 182210397719a41b40c126f91ca11c51
U drh U dan
Z 6b238da064de6e3b5f5d0b4365b7caf0 Z f61744228c664ef1bbc36bc13dfb9d49

View File

@@ -1 +1 @@
7d272aa62cd4cbbf4b5d04e3b918de27671e8301 31a91ee7d32af8580a170903eb857ed9222fdb0a

View File

@@ -2612,6 +2612,22 @@ static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
return 0; return 0;
} }
/*
** Print the current sqlite3_errmsg() value to stderr and return 1.
*/
static int shellDatabaseError(sqlite3 *db){
const char *zErr = sqlite3_errmsg(db);
fprintf(stderr, "Error: %s\n", zErr);
return 1;
}
/*
** Print an out-of-memory message to stderr and return 1.
*/
static int shellNomemError(void){
fprintf(stderr, "Error: out of memory\n");
return 1;
}
/* /*
** If an input line begins with "." then invoke this routine to ** If an input line begins with "." then invoke this routine to
@@ -3713,13 +3729,17 @@ static int do_meta_command(char *zLine, ShellState *p){
int ii; int ii;
open_db(p, 0); open_db(p, 0);
rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0); rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
if( rc ) return rc; if( rc ) return shellDatabaseError(p->db);
/* Create an SQL statement to query for the list of tables in the
** main and all attached databases where the table name matches the
** LIKE pattern bound to variable "?1". */
zSql = sqlite3_mprintf( zSql = sqlite3_mprintf(
"SELECT name FROM sqlite_master" "SELECT name FROM sqlite_master"
" WHERE type IN ('table','view')" " WHERE type IN ('table','view')"
" AND name NOT LIKE 'sqlite_%%'" " AND name NOT LIKE 'sqlite_%%'"
" AND name LIKE ?1"); " AND name LIKE ?1");
while( sqlite3_step(pStmt)==SQLITE_ROW ){ while( zSql && sqlite3_step(pStmt)==SQLITE_ROW ){
const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1); const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue; if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
if( strcmp(zDbName,"temp")==0 ){ if( strcmp(zDbName,"temp")==0 ){
@@ -3738,11 +3758,17 @@ static int do_meta_command(char *zLine, ShellState *p){
" AND name LIKE ?1", zSql, zDbName, zDbName); " AND name LIKE ?1", zSql, zDbName, zDbName);
} }
} }
sqlite3_finalize(pStmt); rc = sqlite3_finalize(pStmt);
if( zSql && rc==SQLITE_OK ){
zSql = sqlite3_mprintf("%z ORDER BY 1", zSql); zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); if( zSql ) rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
}
sqlite3_free(zSql); sqlite3_free(zSql);
if( rc ) return rc; if( !zSql ) return shellNomemError();
if( rc ) return shellDatabaseError(p->db);
/* Run the SQL statement prepared by the above block. Store the results
** as an array of nul-terminated strings in azResult[]. */
nRow = nAlloc = 0; nRow = nAlloc = 0;
azResult = 0; azResult = 0;
if( nArg>1 ){ if( nArg>1 ){
@@ -3756,17 +3782,25 @@ static int do_meta_command(char *zLine, ShellState *p){
int n2 = nAlloc*2 + 10; int n2 = nAlloc*2 + 10;
azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2); azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
if( azNew==0 ){ if( azNew==0 ){
fprintf(stderr, "Error: out of memory\n"); rc = shellNomemError();
break; break;
} }
nAlloc = n2; nAlloc = n2;
azResult = azNew; azResult = azNew;
} }
azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0)); azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
if( azResult[nRow] ) nRow++; if( 0==azResult[nRow] ){
rc = shellNomemError();
break;
} }
sqlite3_finalize(pStmt); nRow++;
if( nRow>0 ){ }
if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
rc = shellDatabaseError(p->db);
}
/* Pretty-print the contents of array azResult[] to the output */
if( rc==0 && nRow>0 ){
int len, maxlen = 0; int len, maxlen = 0;
int i, j; int i, j;
int nPrintCol, nPrintRow; int nPrintCol, nPrintRow;
@@ -3785,6 +3819,7 @@ static int do_meta_command(char *zLine, ShellState *p){
fprintf(p->out, "\n"); fprintf(p->out, "\n");
} }
} }
for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]); for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
sqlite3_free(azResult); sqlite3_free(azResult);
}else }else