Add missing comments and fix other issues with routines used by new EQP features.
FossilOrigin-Name: 925f35c535396603e13bb12e9a361072e2c2c223
This commit is contained in:
parent
4a07e3db27
commit
17c0bc0c4a
14
manifest
14
manifest
@ -1,5 +1,5 @@
|
||||
C Further\senhancements\sand\sfixes\sfor\sexplain\squery\splan.
|
||||
D 2010-11-09T14:49:00
|
||||
C Add\smissing\scomments\sand\sfix\sother\sissues\swith\sroutines\sused\sby\snew\sEQP\sfeatures.
|
||||
D 2010-11-09T17:35:20
|
||||
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
||||
F Makefile.in e7a59672eaeb04408d1fa8501618d7501a3c5e39
|
||||
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
||||
@ -174,7 +174,7 @@ F src/printf.c 8ae5082dd38a1b5456030c3755ec3a392cd51506
|
||||
F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50
|
||||
F src/resolve.c 1c0f32b64f8e3f555fe1f732f9d6f501a7f05706
|
||||
F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697
|
||||
F src/select.c 7c92d9d06037065f4a01634d94a4e4cfc4bccf62
|
||||
F src/select.c 3d5086dfccb245af4801234d42b6d2888a30e2b1
|
||||
F src/shell.c 8517fc1f9c59ae4007e6cc8b9af91ab231ea2056
|
||||
F src/sqlite.h.in f47e09412fc9a129f759fa4d96ef21f4b3d529eb
|
||||
F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754
|
||||
@ -239,7 +239,7 @@ F src/vtab.c b297e8fa656ab5e66244ab15680d68db0adbec30
|
||||
F src/wal.c f26b8d297bd11cb792e609917f9d4c6718ac8e0e
|
||||
F src/wal.h c1aac6593a0b02b15dc625987e619edeab39292e
|
||||
F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f
|
||||
F src/where.c 8aded05b9845c1ed6849f0bda4e7c5723ef11624
|
||||
F src/where.c 2b69056fb5a9c271af4cf3d24112e9413b43d6ad
|
||||
F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
|
||||
F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87
|
||||
F test/all.test 6745008c144bd2956d58864d21f7b304689c1cce
|
||||
@ -886,7 +886,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
|
||||
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
||||
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
||||
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
||||
P f4747eb83dacce6430ad6e5eb20155ffad975514
|
||||
R 7fc20a21ba3c9c313a6e02ede2df35d9
|
||||
P 73c93f5a2a32ee8c5d07c9ba33b2641e72626627
|
||||
R 8f6e7c70fce424ee9ca0153ffe26200c
|
||||
U dan
|
||||
Z 5072ca13b6a16309d03aca048a4f29a7
|
||||
Z fb47697d5a40be4039059baaad8146eb
|
||||
|
@ -1 +1 @@
|
||||
73c93f5a2a32ee8c5d07c9ba33b2641e72626627
|
||||
925f35c535396603e13bb12e9a361072e2c2c223
|
32
src/select.c
32
src/select.c
@ -772,6 +772,16 @@ static KeyInfo *keyInfoFromExprList(Parse *pParse, ExprList *pList){
|
||||
}
|
||||
|
||||
#ifndef SQLITE_OMIT_EXPLAIN
|
||||
/*
|
||||
** Unless an "EXPLAIN QUERY PLAN" command is being processed, this function
|
||||
** is a no-op. Otherwise, it adds a single row of output to the EQP result,
|
||||
** where the caption is of the form:
|
||||
**
|
||||
** "USE TEMP B-TREE FOR xxx"
|
||||
**
|
||||
** where xxx is one of "DISTINCT", "ORDER BY" or "GROUP BY". Exactly which
|
||||
** is determined by the zUsage argument.
|
||||
*/
|
||||
static void explainTempTable(Parse *pParse, const char *zUsage){
|
||||
if( pParse->explain==2 ){
|
||||
Vdbe *v = pParse->pVdbe;
|
||||
@ -779,12 +789,20 @@ static void explainTempTable(Parse *pParse, const char *zUsage){
|
||||
sqlite3VdbeAddOp4(v, OP_Explain, pParse->iSelectId, 0, 0, zMsg, P4_DYNAMIC);
|
||||
}
|
||||
}
|
||||
# define explainRestoreSelectId() pParse->iSelectId = iRestoreSelectId
|
||||
# define explainAssignSelectId(pItem, id) pItem->iSelectId = id
|
||||
|
||||
/*
|
||||
** Assign expression b to lvalue a. A second, no-op, version of this macro
|
||||
** is provided when SQLITE_OMIT_EXPLAIN is defined. This allows the code
|
||||
** in sqlite3Select() to assign values to structure member variables that
|
||||
** only exist if SQLITE_OMIT_EXPLAIN is not defined without polluting the
|
||||
** code with #ifndef directives.
|
||||
*/
|
||||
# define explainSetInteger(a, b) a = b
|
||||
|
||||
#else
|
||||
# define explainRestoreSelectId()
|
||||
/* No-op versions of the explainXXX() functions and macros. */
|
||||
# define explainTempTable(y,z)
|
||||
# define explainAssignSelectId(y,z)
|
||||
# define explainSetInteger(y,z)
|
||||
#endif
|
||||
|
||||
/*
|
||||
@ -3681,7 +3699,7 @@ int sqlite3Select(
|
||||
}else{
|
||||
sqlite3SelectDestInit(&dest, SRT_EphemTab, pItem->iCursor);
|
||||
assert( pItem->isPopulated==0 );
|
||||
explainAssignSelectId(pItem, pParse->iNextSelectId);
|
||||
explainSetInteger(pItem->iSelectId, pParse->iNextSelectId);
|
||||
sqlite3Select(pParse, pSub, &dest);
|
||||
pItem->isPopulated = 1;
|
||||
}
|
||||
@ -3720,7 +3738,7 @@ int sqlite3Select(
|
||||
goto select_end;
|
||||
}
|
||||
}
|
||||
explainRestoreSelectId();
|
||||
explainSetInteger(pParse->iSelectId, iRestoreSelectId);
|
||||
return multiSelect(pParse, p, pDest);
|
||||
}
|
||||
#endif
|
||||
@ -4227,7 +4245,7 @@ int sqlite3Select(
|
||||
** successful coding of the SELECT.
|
||||
*/
|
||||
select_end:
|
||||
explainRestoreSelectId();
|
||||
explainSetInteger(pParse->iSelectId, iRestoreSelectId);
|
||||
|
||||
/* Identify column names if results of the SELECT are to be output.
|
||||
*/
|
||||
|
43
src/where.c
43
src/where.c
@ -3131,7 +3131,26 @@ static int codeAllEqualityTerms(
|
||||
}
|
||||
|
||||
#ifndef SQLITE_OMIT_EXPLAIN
|
||||
static char *indexRangeText(sqlite3 *db, WhereLevel *pLevel, Table *pTab){
|
||||
/*
|
||||
** Argument pLevel describes a strategy for scanning table pTab. This
|
||||
** function returns a pointer to a string buffer containing a description
|
||||
** of the subset of table rows scanned by the strategy in the form of an
|
||||
** SQL expression. Or, if all rows are scanned, NULL is returned.
|
||||
**
|
||||
** For example, if the query:
|
||||
**
|
||||
** SELECT * FROM t1 WHERE a=1 AND b>2;
|
||||
**
|
||||
** is run and there is an index on (a, b), then this function returns a
|
||||
** string similar to:
|
||||
**
|
||||
** "a=? AND b>?"
|
||||
**
|
||||
** The returned pointer points to memory obtained from sqlite3DbMalloc().
|
||||
** It is the responsibility of the caller to free the buffer when it is
|
||||
** no longer required.
|
||||
*/
|
||||
static char *explainIndexRange(sqlite3 *db, WhereLevel *pLevel, Table *pTab){
|
||||
WherePlan *pPlan = &pLevel->plan;
|
||||
Index *pIndex = pPlan->u.pIdx;
|
||||
int nEq = pPlan->nEq;
|
||||
@ -3160,7 +3179,13 @@ static char *indexRangeText(sqlite3 *db, WhereLevel *pLevel, Table *pTab){
|
||||
return zRet;
|
||||
}
|
||||
|
||||
static void codeOneLoopExplain(
|
||||
/*
|
||||
** This function is a no-op unless currently processing an EXPLAIN QUERY PLAN
|
||||
** command. If the query being compiled is an EXPLAIN QUERY PLAN, a single
|
||||
** record is added to the output to describe the table scan strategy in
|
||||
** pLevel.
|
||||
*/
|
||||
static void explainOneScan(
|
||||
Parse *pParse, /* Parse context */
|
||||
SrcList *pTabList, /* Table list this loop refers to */
|
||||
WhereLevel *pLevel, /* Scan to write OP_Explain opcode for */
|
||||
@ -3171,9 +3196,9 @@ static void codeOneLoopExplain(
|
||||
if( pParse->explain==2 ){
|
||||
u32 flags = pLevel->plan.wsFlags;
|
||||
struct SrcList_item *pItem = &pTabList->a[pLevel->iFrom];
|
||||
Vdbe *v = pParse->pVdbe;
|
||||
sqlite3 *db = pParse->db;
|
||||
char *zMsg;
|
||||
Vdbe *v = pParse->pVdbe; /* VM being constructed */
|
||||
sqlite3 *db = pParse->db; /* Database handle */
|
||||
char *zMsg; /* Text to add to EQP output */
|
||||
sqlite3_int64 nRow; /* Expected number of rows visited by scan */
|
||||
int iId = pParse->iSelectId; /* Select id (left-most output column) */
|
||||
|
||||
@ -3189,7 +3214,7 @@ static void codeOneLoopExplain(
|
||||
zMsg = sqlite3MAppendf(db, zMsg, "%s AS %s", zMsg, pItem->zAlias);
|
||||
}
|
||||
if( (flags & WHERE_INDEXED)!=0 ){
|
||||
char *zWhere = indexRangeText(db, pLevel, pItem->pTab);
|
||||
char *zWhere = explainIndexRange(db, pLevel, pItem->pTab);
|
||||
zMsg = sqlite3MAppendf(db, zMsg, "%s BY %s%sINDEX%s%s%s", zMsg,
|
||||
((flags & WHERE_TEMP_INDEX)?"AUTOMATIC ":""),
|
||||
((flags & WHERE_IDX_ONLY)?"COVERING ":""),
|
||||
@ -3228,7 +3253,7 @@ static void codeOneLoopExplain(
|
||||
}
|
||||
}
|
||||
#else
|
||||
# define codeOneLoopExplain(u,v,w,x,y,z)
|
||||
# define explainOneScan(u,v,w,x,y,z)
|
||||
#endif /* SQLITE_OMIT_EXPLAIN */
|
||||
|
||||
|
||||
@ -3773,7 +3798,7 @@ static Bitmask codeOneLoopStart(
|
||||
WHERE_OMIT_OPEN | WHERE_OMIT_CLOSE |
|
||||
WHERE_FORCE_TABLE | WHERE_ONETABLE_ONLY);
|
||||
if( pSubWInfo ){
|
||||
codeOneLoopExplain(
|
||||
explainOneScan(
|
||||
pParse, pOrTab, &pSubWInfo->a[0], iLevel, pLevel->iFrom, 0
|
||||
);
|
||||
if( (wctrlFlags & WHERE_DUPLICATES_OK)==0 ){
|
||||
@ -4432,7 +4457,7 @@ WhereInfo *sqlite3WhereBegin(
|
||||
notReady = ~(Bitmask)0;
|
||||
for(i=0; i<nTabList; i++){
|
||||
WhereLevel *pLevel = &pWInfo->a[i];
|
||||
codeOneLoopExplain(pParse, pTabList, pLevel, i, pLevel->iFrom, wctrlFlags);
|
||||
explainOneScan(pParse, pTabList, pLevel, i, pLevel->iFrom, wctrlFlags);
|
||||
notReady = codeOneLoopStart(pWInfo, i, wctrlFlags, notReady);
|
||||
pWInfo->iContinue = pLevel->addrCont;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user