Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Update the mechanism for reporting SQL that does not use indices. The warnings can be suppressed by comments in the SQL text. |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA1: |
9f1d490dd6e692dc5392b452038080d7 |
| User & Date: | drh 2010-03-31 15:27:48.000 |
Context
|
2010-03-31
| ||
| 17:14 | Patch SQLite to provide a better error message to sqlite3_log() when it is unable to open a file. ... (check-in: a158c4e75d user: drh tags: trunk) | |
| 15:27 | Update the mechanism for reporting SQL that does not use indices. The warnings can be suppressed by comments in the SQL text. ... (check-in: 9f1d490dd6 user: drh tags: trunk) | |
| 15:17 | Improvements to the SQLite error logging output format. ... (check-in: b30e35fcd2 user: drh tags: trunk) | |
Changes
Changes to src/branch.c.
| ︙ | ︙ | |||
244 245 246 247 248 249 250 |
@ </ol>
style_sidebox_end();
db_prepare(&q,
"SELECT DISTINCT value FROM tagxref"
" WHERE tagid=%d AND value NOT NULL"
" AND rid IN leaves"
| | | 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 |
@ </ol>
style_sidebox_end();
db_prepare(&q,
"SELECT DISTINCT value FROM tagxref"
" WHERE tagid=%d AND value NOT NULL"
" AND rid IN leaves"
" ORDER BY value /*sort*/",
TAG_BRANCH
);
cnt = 0;
while( db_step(&q)==SQLITE_ROW ){
const char *zBr = db_column_text(&q, 0);
if( cnt==0 ){
@ <h2>Open Branches:</h2>
|
| ︙ | ︙ | |||
273 274 275 276 277 278 279 |
db_prepare(&q,
"SELECT value FROM tagxref"
" WHERE tagid=%d AND value NOT NULL"
" EXCEPT "
"SELECT value FROM tagxref"
" WHERE tagid=%d AND value NOT NULL"
" AND rid IN leaves"
| | | 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 |
db_prepare(&q,
"SELECT value FROM tagxref"
" WHERE tagid=%d AND value NOT NULL"
" EXCEPT "
"SELECT value FROM tagxref"
" WHERE tagid=%d AND value NOT NULL"
" AND rid IN leaves"
" ORDER BY value /*sort*/",
TAG_BRANCH, TAG_BRANCH
);
while( db_step(&q)==SQLITE_ROW ){
const char *zBr = db_column_text(&q, 0);
if( cnt==0 ){
@ <h2>Closed Branches:</h2>
@ <ul>
|
| ︙ | ︙ |
Changes to src/browse.c.
| ︙ | ︙ | |||
215 216 217 218 219 220 221 |
" SELECT pathelement(x,0), u FROM allfiles"
);
}
/* Generate a multi-column table listing the contents of zD[]
** directory.
*/
| | | | | 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 |
" SELECT pathelement(x,0), u FROM allfiles"
);
}
/* Generate a multi-column table listing the contents of zD[]
** directory.
*/
mxLen = db_int(12, "SELECT max(length(x)) FROM localfiles /*scan*/");
cnt = db_int(0, "SELECT count(*) FROM localfiles /*scan*/");
nCol = 4;
nRow = (cnt+nCol-1)/nCol;
db_prepare(&q, "SELECT x, u FROM localfiles ORDER BY x /*scan*/");
@ <table border="0" width="100%%"><tr><td valign="top" width="25%%">
i = 0;
while( db_step(&q)==SQLITE_ROW ){
const char *zFN;
if( i==nRow ){
@ </td><td valign="top" width="25%%">
i = 0;
|
| ︙ | ︙ |
Changes to src/db.c.
| ︙ | ︙ | |||
276 277 278 279 280 281 282 | rc = sqlite3_step(pStmt->pStmt); return rc; } /* ** Print warnings if a query is inefficient. */ | | > > | | < < | | | | | | | 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 |
rc = sqlite3_step(pStmt->pStmt);
return rc;
}
/*
** Print warnings if a query is inefficient.
*/
static void db_stats(sqlite3_stmt *pStmt){
#ifdef FOSSIL_DEBUG
int c1, c2;
const char *zSql = sqlite3_sql(pStmt);
if( zSql==0 ) return;
c1 = sqlite3_stmt_status(pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, 1);
c2 = sqlite3_stmt_status(pStmt, SQLITE_STMTSTATUS_SORT, 1);
if( c1>5 && strstr(zSql,"/*scan*/")==0 ){
fossil_warning("%d scan steps in [%s]", c1, zSql);
}else if( c2 && strstr(zSql,"/*sort*/")==0 && strstr(zSql,"/*scan*/")==0 ){
fossil_warning("sort w/o index in [%s]", zSql);
}
#endif
}
/*
** Reset or finalize a statement.
*/
int db_reset(Stmt *pStmt){
int rc;
db_stats(pStmt->pStmt);
rc = sqlite3_reset(pStmt->pStmt);
db_check_result(rc);
return rc;
}
int db_finalize(Stmt *pStmt){
int rc;
db_stats(pStmt->pStmt);
blob_reset(&pStmt->sql);
rc = sqlite3_finalize(pStmt->pStmt);
db_check_result(rc);
pStmt->pStmt = 0;
if( pStmt->pNext ){
pStmt->pNext->pPrev = pStmt->pPrev;
}
|
| ︙ | ︙ |
Changes to src/timeline.c.
| ︙ | ︙ | |||
254 255 256 257 258 259 260 |
int nParent = 0;
int aParent[32];
const char *zBr;
int gidx;
static Stmt qparent;
static Stmt qbranch;
db_static_prepare(&qparent,
| | | 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 |
int nParent = 0;
int aParent[32];
const char *zBr;
int gidx;
static Stmt qparent;
static Stmt qbranch;
db_static_prepare(&qparent,
"SELECT pid FROM plink WHERE cid=:rid ORDER BY isprim DESC /*sort*/"
);
db_static_prepare(&qbranch,
"SELECT value FROM tagxref WHERE tagid=%d AND tagtype>0 AND rid=:rid",
TAG_BRANCH
);
db_bind_int(&qparent, ":rid", rid);
while( db_step(&qparent)==SQLITE_ROW && nParent<32 ){
|
| ︙ | ︙ | |||
874 875 876 877 878 879 880 |
}
}else{
blob_appendf(&sql, " ORDER BY event.mtime DESC");
}
blob_appendf(&sql, " LIMIT %d", nEntry);
db_multi_exec("%s", blob_str(&sql));
| | | 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 |
}
}else{
blob_appendf(&sql, " ORDER BY event.mtime DESC");
}
blob_appendf(&sql, " LIMIT %d", nEntry);
db_multi_exec("%s", blob_str(&sql));
n = db_int(0, "SELECT count(*) FROM timeline /*scan*/");
if( n<nEntry && zAfter ){
cgi_redirect(url_render(&url, "a", 0, "b", 0));
}
if( zAfter==0 && zBefore==0 && zCirca==0 ){
blob_appendf(&desc, "%d most recent %ss", n, zEType);
}else{
blob_appendf(&desc, "%d %ss", n, zEType);
|
| ︙ | ︙ | |||
903 904 905 906 907 908 909 |
blob_appendf(&desc, " occurring around %h.<br>", zCirca);
}
if( zSearch ){
blob_appendf(&desc, " matching \"%h\"", zSearch);
}
if( g.okHistory ){
if( zAfter || n==nEntry ){
| | | | 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 |
blob_appendf(&desc, " occurring around %h.<br>", zCirca);
}
if( zSearch ){
blob_appendf(&desc, " matching \"%h\"", zSearch);
}
if( g.okHistory ){
if( zAfter || n==nEntry ){
zDate = db_text(0, "SELECT min(timestamp) FROM timeline /*scan*/");
timeline_submenu(&url, "Older", "b", zDate, "a");
free(zDate);
}
if( zBefore || (zAfter && n==nEntry) ){
zDate = db_text(0, "SELECT max(timestamp) FROM timeline /*scan*/");
timeline_submenu(&url, "Newer", "a", zDate, "b");
free(zDate);
}else if( tagid==0 ){
if( zType[0]!='a' ){
timeline_submenu(&url, "All Types", "y", "all", 0);
}
if( zType[0]!='w' && g.okRdWiki ){
|
| ︙ | ︙ | |||
934 935 936 937 938 939 940 |
}
if( nEntry<200 ){
timeline_submenu(&url, "200 Events", "n", "200", 0);
}
}
}
blob_zero(&sql);
| | | 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 |
}
if( nEntry<200 ){
timeline_submenu(&url, "200 Events", "n", "200", 0);
}
}
}
blob_zero(&sql);
db_prepare(&q, "SELECT * FROM timeline ORDER BY timestamp DESC /*scan*/");
@ <h2>%b(&desc)</h2>
blob_reset(&desc);
www_print_timeline(&q, tmFlags, 0);
db_finalize(&q);
style_footer();
}
|
| ︙ | ︙ |
Changes to src/wiki.c.
| ︙ | ︙ | |||
670 671 672 673 674 675 676 |
}
@ <ul>
db_prepare(&q,
"SELECT"
" substr(tagname, 6),"
" (SELECT value FROM tagxref WHERE tagid=tag.tagid ORDER BY mtime DESC)"
" FROM tag WHERE tagname GLOB 'wiki-*'"
| | | 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 |
}
@ <ul>
db_prepare(&q,
"SELECT"
" substr(tagname, 6),"
" (SELECT value FROM tagxref WHERE tagid=tag.tagid ORDER BY mtime DESC)"
" FROM tag WHERE tagname GLOB 'wiki-*'"
" ORDER BY lower(tagname) /*sort*/"
);
while( db_step(&q)==SQLITE_ROW ){
const char *zName = db_column_text(&q, 0);
int size = db_column_int(&q, 1);
if( size>0 ){
@ <li><a href="%s(g.zTop)/wiki?name=%T(zName)">%h(zName)</a></li>
}else if( showAll ){
|
| ︙ | ︙ | |||
701 702 703 704 705 706 707 |
const char * zTitle;
login_check_credentials();
if( !g.okRdWiki ){ login_needed(); return; }
zTitle = PD("title","*");
style_header("Wiki Pages Found");
@ <ul>
db_prepare(&q,
| | > | 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 |
const char * zTitle;
login_check_credentials();
if( !g.okRdWiki ){ login_needed(); return; }
zTitle = PD("title","*");
style_header("Wiki Pages Found");
@ <ul>
db_prepare(&q,
"SELECT substr(tagname, 6, 1000) FROM tag WHERE tagname like 'wiki-%%%q%%'"
" ORDER BY lower(tagname) /*sort*/" ,
zTitle);
while( db_step(&q)==SQLITE_ROW ){
const char *zName = db_column_text(&q, 0);
@ <li><a href="%s(g.zBaseURL)/wiki?name=%T(zName)">%h(zName)</a></li>
}
db_finalize(&q);
@ </ul>
|
| ︙ | ︙ | |||
1025 1026 1027 1028 1029 1030 1031 |
}
fossil_fatal("delete not yet implemented.");
}else
if( strncmp(g.argv[2],"list",n)==0 ){
Stmt q;
db_prepare(&q,
"SELECT substr(tagname, 6) FROM tag WHERE tagname GLOB 'wiki-*'"
| | | 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 |
}
fossil_fatal("delete not yet implemented.");
}else
if( strncmp(g.argv[2],"list",n)==0 ){
Stmt q;
db_prepare(&q,
"SELECT substr(tagname, 6) FROM tag WHERE tagname GLOB 'wiki-*'"
" ORDER BY lower(tagname) /*sort*/"
);
while( db_step(&q)==SQLITE_ROW ){
const char *zName = db_column_text(&q, 0);
printf( "%s\n",zName);
}
db_finalize(&q);
}else
|
| ︙ | ︙ |