1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-30 19:03:16 +03:00

Add the --progress, --using, and -q options to the index_usage utility program.

FossilOrigin-Name: a5e6be7cbc5d931308ddcc073c9cd6275c9711cae055d72a7c4aa71c1d15914c
This commit is contained in:
drh
2019-01-30 15:47:38 +00:00
parent 5a9c6bcc15
commit a8614259c1
3 changed files with 84 additions and 17 deletions

View File

@ -1,5 +1,5 @@
C Enhancements\sto\sthe\sindex_usage\sutility\sprogram. C Add\sthe\s--progress,\s--using,\sand\s-q\soptions\sto\sthe\sindex_usage\sutility\sprogram.
D 2019-01-30T14:01:43.193 D 2019-01-30T15:47:38.444
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4
@ -1721,7 +1721,7 @@ F tool/fuzzershell.c e1d90a03ca790d7c331c2aae08ca46ff435f1ae1faa6cb9cc48f4687c18
F tool/genfkey.README cf68fddd4643bbe3ff8e31b8b6d8b0a1b85e20f4 F tool/genfkey.README cf68fddd4643bbe3ff8e31b8b6d8b0a1b85e20f4
F tool/genfkey.test b6afd7b825d797a1e1274f519ab5695373552ecad5cd373530c63533638a5a4f F tool/genfkey.test b6afd7b825d797a1e1274f519ab5695373552ecad5cd373530c63533638a5a4f
F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce
F tool/index_usage.c 28194fb8422b16adada6723d7516e404d011ffd1a7fd43ae20253001e5ddd2dc F tool/index_usage.c 9827f0f5252a6c0468e1addbd098ce9bbf909442d820d70b3ae91aa317e62a66
F tool/kvtest-speed.sh 4761a9c4b3530907562314d7757995787f7aef8f F tool/kvtest-speed.sh 4761a9c4b3530907562314d7757995787f7aef8f
F tool/lemon.c 900a15b9efba9890d10e7959914db94c4ad5162912127f061c4328add122d6fb F tool/lemon.c 900a15b9efba9890d10e7959914db94c4ad5162912127f061c4328add122d6fb
F tool/lempar.c 61af95b8fac2bfd59c09d55330e78f3f5e352d7aa80bf37404b96ef795be3fdc F tool/lempar.c 61af95b8fac2bfd59c09d55330e78f3f5e352d7aa80bf37404b96ef795be3fdc
@ -1804,7 +1804,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P 760d14374d40bcd9ce3a89771c18dc236c9728553c4747c9b7452ee7b24f4140 P 19c739b4a8a43d894e37a99fa34838f3e3fa1fe0d019aefbc33f1d38d76af1a4
R f27c58459d19582c78b75fe1a98114b7 R f8f216729fd1c799fb3786b449861140
U drh U drh
Z eaaf90eb816c0def68c7e8f9deaf5b3d Z 016d67606384203f33b230415c37c583

View File

@ -1 +1 @@
19c739b4a8a43d894e37a99fa34838f3e3fa1fe0d019aefbc33f1d38d76af1a4 a5e6be7cbc5d931308ddcc073c9cd6275c9711cae055d72a7c4aa71c1d15914c

View File

@ -21,7 +21,7 @@
#include <string.h> #include <string.h>
static void usage(const char *argv0){ static void usage(const char *argv0){
printf("Usage: %s DATABASE LOG\n\n", argv0); printf("Usage: %s [OPTIONS] DATABASE LOG\n\n", argv0);
printf( printf(
"DATABASE is an SQLite database against which various statements\n" "DATABASE is an SQLite database against which various statements\n"
"have been run. The SQL text is stored in LOG. LOG is an SQLite\n" "have been run. The SQL text is stored in LOG. LOG is an SQLite\n"
@ -36,6 +36,12 @@ static void usage(const char *argv0){
"DATABASE only needs to contain the schema used by the statements in\n" "DATABASE only needs to contain the schema used by the statements in\n"
"LOG. The content can be removed from DATABASE.\n" "LOG. The content can be removed from DATABASE.\n"
); );
printf(
"\nOPTIONS:\n\n"
" --progress N Show a progress message after every N input rows\n"
" -q Omit error message when parsing log entries\n"
" --using NAME Print SQL statements that use index NAME\n"
);
printf("\nAnalysis will be done by SQLite version %s dated %.20s\n" printf("\nAnalysis will be done by SQLite version %s dated %.20s\n"
"checkin number %.40s. Different versions\n" "checkin number %.40s. Different versions\n"
"of SQLite might use different indexes.\n", "of SQLite might use different indexes.\n",
@ -49,6 +55,48 @@ int main(int argc, char **argv){
char *zSql; char *zSql;
int nErr = 0; int nErr = 0;
int rc; int rc;
int bQuiet = 0;
int i, j;
const char *zUsing = 0;
sqlite3_stmt *pIncrCnt = 0;
int nRow = 0;
int iProgress = 0;
for(i=j=1; i<argc; i++){
const char *z = argv[i];
if( z[0]=='-' ){
z++;
if( z[0]=='-' ) z++;
if( strcmp(z,"progress")==0 ){
if( i+1<argc ){
iProgress = strtol(argv[++i],0,0);
continue;
}
printf("The --progress option requires an argument\n");
exit(0);
}
if( strcmp(z,"q")==0 ){
bQuiet = 1;
continue;
}
if( strcmp(z,"using")==0 ){
if( i+1<argc ){
zUsing = argv[++i];
continue;
}
printf("The --using option requires an argument\n");
exit(0);
}
if( strcmp(z, "help")==0 || strcmp(z, "?")==0 ){
usage(argv[0]);
}
printf("Unknown command-line option: \"%s\"\n", argv[i]);
exit(0);
}else{
if( j<i ) argv[j++] = argv[i];
}
}
argc = j;
if( argc!=3 ) usage(argv[0]); if( argc!=3 ) usage(argv[0]);
rc = sqlite3_open_v2(argv[1], &db, SQLITE_OPEN_READONLY, 0); rc = sqlite3_open_v2(argv[1], &db, SQLITE_OPEN_READONLY, 0);
@ -66,8 +114,8 @@ int main(int argc, char **argv){
pStmt = 0; pStmt = 0;
rc = sqlite3_exec(db, rc = sqlite3_exec(db,
"CREATE TABLE temp.idxu(\n" "CREATE TABLE temp.idxu(\n"
" tbl TEXT,\n" " tbl TEXT COLLATE nocase,\n"
" idx TEXT,\n" " idx TEXT COLLATE nocase,\n"
" cnt INT,\n" " cnt INT,\n"
" PRIMARY KEY(idx)\n" " PRIMARY KEY(idx)\n"
") WITHOUT ROWID;", 0, 0, 0); ") WITHOUT ROWID;", 0, 0, 0);
@ -100,6 +148,15 @@ int main(int argc, char **argv){
goto errorOut; goto errorOut;
} }
rc = sqlite3_prepare_v2(db,
"UPDATE temp.idxu SET cnt=cnt+1 WHERE idx=?1",
-1, &pIncrCnt, 0);
if( rc ){
printf("Cannot prepare a statement to increment a counter for "
"indexes used\n");
goto errorOut;
}
/* Update the counts based on LOG */ /* Update the counts based on LOG */
while( sqlite3_step(pStmt)==SQLITE_ROW ){ while( sqlite3_step(pStmt)==SQLITE_ROW ){
const char *zLog = (const char*)sqlite3_column_text(pStmt, 0); const char *zLog = (const char*)sqlite3_column_text(pStmt, 0);
@ -109,10 +166,18 @@ int main(int argc, char **argv){
rc = sqlite3_prepare_v2(db, zSql, -1, &pS2, 0); rc = sqlite3_prepare_v2(db, zSql, -1, &pS2, 0);
sqlite3_free(zSql); sqlite3_free(zSql);
if( rc ){ if( rc ){
printf("Cannot compile LOG entry %d (%s): %s\n", if( !bQuiet ){
printf("Cannot compile LOG entry %d (%s): %s\n",
sqlite3_column_int(pStmt, 1), zLog, sqlite3_errmsg(db)); sqlite3_column_int(pStmt, 1), zLog, sqlite3_errmsg(db));
fflush(stdout);
}
nErr++; nErr++;
}else{ }else{
nRow++;
if( iProgress>0 && (nRow%iProgress)==0 ){
printf("%d...\n", nRow);
fflush(stdout);
}
while( sqlite3_step(pS2)==SQLITE_ROW ){ while( sqlite3_step(pS2)==SQLITE_ROW ){
const char *zExplain = (const char*)sqlite3_column_text(pS2,3); const char *zExplain = (const char*)sqlite3_column_text(pS2,3);
const char *z1, *z2; const char *z1, *z2;
@ -123,12 +188,13 @@ int main(int argc, char **argv){
z1 += 13; z1 += 13;
for(z2=z1+1; z2[1] && z2[1]!='('; z2++){} for(z2=z1+1; z2[1] && z2[1]!='('; z2++){}
n = z2 - z1; n = z2 - z1;
zSql = sqlite3_mprintf( if( zUsing && sqlite3_strnicmp(zUsing, z1, n)==0 ){
"UPDATE temp.idxu SET cnt=cnt+1 WHERE idx='%.*q'", n, z1 printf("Using %s:\n%s\n", zUsing, zLog);
); fflush(stdout);
/* printf("sql: %s\n", zSql); */ }
sqlite3_exec(db, zSql, 0, 0, 0); sqlite3_bind_text(pIncrCnt,1,z1,n,SQLITE_STATIC);
sqlite3_free(zSql); sqlite3_step(pIncrCnt);
sqlite3_reset(pIncrCnt);
} }
} }
sqlite3_finalize(pS2); sqlite3_finalize(pS2);
@ -160,6 +226,7 @@ int main(int argc, char **argv){
pStmt = 0; pStmt = 0;
errorOut: errorOut:
sqlite3_finalize(pIncrCnt);
sqlite3_finalize(pStmt); sqlite3_finalize(pStmt);
sqlite3_close(db); sqlite3_close(db);
return nErr; return nErr;