mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-01 06:27:03 +03:00
Enhancements to the xBestIndex output from the ext/misc/vtablog.c
extension. FossilOrigin-Name: 8b31acc0b18f38eb4af6efebd1ea25cd65a146651101579aee20afd9ec6dc2de
This commit is contained in:
@ -435,6 +435,39 @@ static int vtablogFilter(
|
||||
return SQLITE_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
** Return an sqlite3_index_info operator name in static space.
|
||||
** The name is possibly overwritten on subsequent calls.
|
||||
*/
|
||||
static char *vtablogOpName(unsigned char op){
|
||||
static char zUnknown[30];
|
||||
char *zOut;
|
||||
switch( op ){
|
||||
case SQLITE_INDEX_CONSTRAINT_EQ: zOut = "EQ"; break;
|
||||
case SQLITE_INDEX_CONSTRAINT_GT: zOut = "GT"; break;
|
||||
case SQLITE_INDEX_CONSTRAINT_LE: zOut = "LE"; break;
|
||||
case SQLITE_INDEX_CONSTRAINT_LT: zOut = "LT"; break;
|
||||
case SQLITE_INDEX_CONSTRAINT_GE: zOut = "GE"; break;
|
||||
case SQLITE_INDEX_CONSTRAINT_MATCH: zOut = "MATCH"; break;
|
||||
case SQLITE_INDEX_CONSTRAINT_LIKE: zOut = "LIKE"; break;
|
||||
case SQLITE_INDEX_CONSTRAINT_GLOB: zOut = "GLOB"; break;
|
||||
case SQLITE_INDEX_CONSTRAINT_REGEXP: zOut = "REGEXP"; break;
|
||||
case SQLITE_INDEX_CONSTRAINT_NE: zOut = "NE"; break;
|
||||
case SQLITE_INDEX_CONSTRAINT_ISNOT: zOut = "ISNOT"; break;
|
||||
case SQLITE_INDEX_CONSTRAINT_ISNOTNULL: zOut = "ISNOTNULL"; break;
|
||||
case SQLITE_INDEX_CONSTRAINT_ISNULL: zOut = "ISNULL"; break;
|
||||
case SQLITE_INDEX_CONSTRAINT_IS: zOut = "IS"; break;
|
||||
case SQLITE_INDEX_CONSTRAINT_LIMIT: zOut = "LIMIT"; break;
|
||||
case SQLITE_INDEX_CONSTRAINT_OFFSET: zOut = "OFFSET"; break;
|
||||
case SQLITE_INDEX_CONSTRAINT_FUNCTION: zOut = "FUNCTION"; break;
|
||||
default:
|
||||
sqlite3_snprintf(sizeof(zUnknown),zUnknown,"%d",op);
|
||||
zOut = zUnknown;
|
||||
break;
|
||||
}
|
||||
return zOut;
|
||||
}
|
||||
|
||||
/*
|
||||
** SQLite will invoke this method one or more times while planning a query
|
||||
** that uses the vtablog virtual table. This routine needs to create
|
||||
@ -451,14 +484,33 @@ static int vtablogBestIndex(
|
||||
printf(" colUsed: 0x%016llx\n", p->colUsed);
|
||||
printf(" nConstraint: %d\n", p->nConstraint);
|
||||
for(i=0; i<p->nConstraint; i++){
|
||||
sqlite3_value *pVal = 0;
|
||||
int rc;
|
||||
char zRhs[50];
|
||||
rc = sqlite3_vtab_rhs_value(p, i, &pVal);
|
||||
if( rc==SQLITE_OK ){
|
||||
switch( sqlite3_value_type(pVal) ){
|
||||
case SQLITE_NULL: sqlite3_snprintf(50,zRhs,"NULL"); break;
|
||||
case SQLITE_INTEGER: sqlite3_snprintf(50,zRhs,"%lld",
|
||||
sqlite3_value_int64(pVal)); break;
|
||||
case SQLITE_FLOAT: sqlite3_snprintf(50,zRhs,"%g",
|
||||
sqlite3_value_double(pVal)); break;
|
||||
case SQLITE_TEXT: sqlite3_snprintf(50,zRhs,"TEXT"); break;
|
||||
default: sqlite3_snprintf(50,zRhs,"BLOB"); break;
|
||||
}
|
||||
}else{
|
||||
sqlite3_snprintf(50,zRhs,"N/A");
|
||||
}
|
||||
printf(
|
||||
" constraint[%d]: col=%d termid=%d op=%d usabled=%d collseq=%s\n",
|
||||
" constraint[%d]: col=%d termid=%d op=%s usabled=%d coll=%s rhs=%s\n",
|
||||
i,
|
||||
p->aConstraint[i].iColumn,
|
||||
p->aConstraint[i].iTermOffset,
|
||||
p->aConstraint[i].op,
|
||||
vtablogOpName(p->aConstraint[i].op),
|
||||
p->aConstraint[i].usable,
|
||||
sqlite3_vtab_collation(p,i));
|
||||
sqlite3_vtab_collation(p,i),
|
||||
zRhs
|
||||
);
|
||||
}
|
||||
printf(" nOrderBy: %d\n", p->nOrderBy);
|
||||
for(i=0; i<p->nOrderBy; i++){
|
||||
|
Reference in New Issue
Block a user