From: drh <> Date: Thu, 3 Jul 2025 14:10:03 +0000 (+0000) Subject: Enhancements to the xBestIndex output from the ext/misc/vtablog.c X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1ff6f19d8b8199f49cd67171ae03873766d12c3f;p=thirdparty%2Fsqlite.git Enhancements to the xBestIndex output from the ext/misc/vtablog.c extension. FossilOrigin-Name: 8b31acc0b18f38eb4af6efebd1ea25cd65a146651101579aee20afd9ec6dc2de --- diff --git a/ext/misc/vtablog.c b/ext/misc/vtablog.c index e8f084e1b2..8e4631595d 100644 --- a/ext/misc/vtablog.c +++ b/ext/misc/vtablog.c @@ -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; inConstraint; 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; inOrderBy; i++){ diff --git a/manifest b/manifest index bf56baa156..c3d677cc50 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\suninitialized\svariable\sadded\syesterday\sby\s[d27d34fb746280e7].\nThis\sproblem\swas\sdiscovered\sovernight\sby\s\n[https://github.com/google/oss-fuzz|OSSFuzz]. -D 2025-07-03T11:52:17.583 +C Enhancements\sto\sthe\sxBestIndex\soutput\sfrom\sthe\sext/misc/vtablog.c\nextension. +D 2025-07-03T14:10:03.834 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -456,7 +456,7 @@ F ext/misc/uuid.c 5bb2264c1b64d163efa46509544fd7500cb8769cb7c16dd52052da8d961505 F ext/misc/vfslog.c 3932ab932eeb2601dbc4447cb14d445aaa9fbe43b863ef5f014401c3420afd20 F ext/misc/vfsstat.c 0b23c0a69a2b63dc0ef0af44f9c1fc977300c480a1f7a9814500369d8211f56e F ext/misc/vfstrace.c 0e4b8b17ac0675ea90f6d168d8214687e06ca3efbc0060aad4814994d82b41fb -F ext/misc/vtablog.c a197addbbd1e267a5476274b74953e1b6f050e28516f0a5fe7d6382753165ee6 +F ext/misc/vtablog.c ee27ec6595751db0ce4b8c2a2b72f6eca4d018d9d33e139dbd477e8d173f7b0e F ext/misc/vtshim.c e5bce24ab8c532f4fdc600148718fe1802cb6ed57417f1c1032d8961f72b0e8f F ext/misc/wholenumber.c 0fa0c082676b7868bf2fa918e911133f2b349bcdceabd1198bba5f65b4fc0668 F ext/misc/windirent.h 02211ce51f3034c675f2dbf4d228194d51b3ee05734678bad5106fff6292e60c @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 1ad0169b022b280bcaaf94a7fa231591be96b514230ab5c98fbf15cd7df842dd F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 2d2b61cba44a756a3a41ef5c95bbb0c0b7111f4b679c578fec9bd0b214cca367 -R 1edf105752f8a1297dddf11638994a45 +P 6db4703f1178fc808f3a75c355fb6638fb12c88f6e1ce7f579e200ced8089114 +R 50c4d2dc6029c61dab20b65ad02b720b U drh -Z 4ca8b7187871a2cc09690de9bf418693 +Z 46c80e4b7ddf6a82d5b12bfb66b8a7fe # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 3cd0cbc0ec..24b6ee8c9a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6db4703f1178fc808f3a75c355fb6638fb12c88f6e1ce7f579e200ced8089114 +8b31acc0b18f38eb4af6efebd1ea25cd65a146651101579aee20afd9ec6dc2de