diff options
Diffstat (limited to 'src/shell.c.in')
-rw-r--r-- | src/shell.c.in | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/src/shell.c.in b/src/shell.c.in index 462cd717b..517e12cb5 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -7739,11 +7739,26 @@ static int do_meta_command(char *zLine, ShellState *p){ sqlite3_free(zLike); goto meta_command_exit; } - }else if( zLike ){ - zLike = sqlite3_mprintf("%z OR name LIKE %Q ESCAPE '\\'", - zLike, azArg[i]); }else{ - zLike = sqlite3_mprintf("name LIKE %Q ESCAPE '\\'", azArg[i]); + /* azArg[i] contains a LIKE pattern. This ".dump" request should + ** only dump data for tables for which either the table name matches + ** the LIKE pattern, or the table appears to be a shadow table of + ** a virtual table for which the name matches the LIKE pattern. + */ + char *zExpr = sqlite3_mprintf( + "name LIKE %Q ESCAPE '\\' OR EXISTS (" + " SELECT 1 FROM sqlite_schema WHERE " + " name LIKE %Q ESCAPE '\\' AND" + " sql LIKE 'CREATE VIRTUAL TABLE%%' AND" + " substr(o.name, 1, length(name)+1) == (name||'_')" + ")", azArg[i], azArg[i] + ); + + if( zLike ){ + zLike = sqlite3_mprintf("%z OR %z", zLike, zExpr); + }else{ + zLike = zExpr; + } } } @@ -7765,7 +7780,7 @@ static int do_meta_command(char *zLine, ShellState *p){ p->nErr = 0; if( zLike==0 ) zLike = sqlite3_mprintf("true"); zSql = sqlite3_mprintf( - "SELECT name, type, sql FROM sqlite_schema " + "SELECT name, type, sql FROM sqlite_schema AS o " "WHERE (%s) AND type=='table'" " AND sql NOT NULL" " ORDER BY tbl_name='sqlite_sequence', rowid", @@ -7775,7 +7790,7 @@ static int do_meta_command(char *zLine, ShellState *p){ sqlite3_free(zSql); if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){ zSql = sqlite3_mprintf( - "SELECT sql FROM sqlite_schema " + "SELECT sql FROM sqlite_schema AS o " "WHERE (%s) AND sql NOT NULL" " AND type IN ('index','trigger','view')", zLike |