From: drh Date: Sat, 12 Oct 2013 20:22:00 +0000 (+0000) Subject: Restore the index_list pragma back to its former operation. Create a new X-Git-Tag: version-3.8.1~17 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3ef261567abf1b70a8de037e1058916618b9f248;p=thirdparty%2Fsqlite.git Restore the index_list pragma back to its former operation. Create a new PRAGMA stats used to access the table and index widths and heights. FossilOrigin-Name: f0cf8c85dcbcc7778aed2816792c368d777f79cb --- diff --git a/manifest b/manifest index 10577d4ef5..dc0e75d8d8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\shandling\sof\s"DROP\sTABLE"\scommands\swhen\s"PRAGMA\sdefer_foreign_keys=1"\sis\sset. -D 2013-10-12T15:12:43.761 +C Restore\sthe\sindex_list\spragma\sback\sto\sits\sformer\soperation.\s\sCreate\sa\snew\nPRAGMA\sstats\sused\sto\saccess\sthe\stable\sand\sindex\swidths\sand\sheights. +D 2013-10-12T20:22:00.025 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e2d28ec95bd17ab4f3b6ee40b7102e9d7a0857b9 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -211,7 +211,7 @@ F src/parse.y a97566d6da75075589a7c716d1bda14b586cf8da F src/pcache.c f8043b433a57aba85384a531e3937a804432a346 F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222 F src/pcache1.c a467393909a4ed7ca9de066d85ba5c5b04a5be63 -F src/pragma.c f4ff6e29c316d06bf7dffca0c8cee7c229cae42e +F src/pragma.c 1c00ed0dea8bc119d248e26e648d438e16e92010 F src/prepare.c fa6988589f39af8504a61731614cd4f6ae71554f F src/printf.c da9119eb31a187a4b99f60aa4a225141c0ebb74b F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68 @@ -725,7 +725,7 @@ F test/pcache.test b09104b03160aca0d968d99e8cd2c5b1921a993d F test/pcache2.test a83efe2dec0d392f814bfc998def1d1833942025 F test/percentile.test b98fc868d71eb5619d42a1702e9ab91718cbed54 F test/permutations.test e154f5ed66d4d4913a99a110e870c9407f75b055 -F test/pragma.test 5c6e8ae9eaa9a505cc1035b51f7f0da9805092c7 +F test/pragma.test 5e7de6c32a5d764f09437d2025f07e4917b9e178 F test/pragma2.test aea7b3d82c76034a2df2b38a13745172ddc0bc13 F test/printf.test ec9870c4dce8686a37818e0bf1aba6e6a1863552 F test/progress.test a282973d1d17f08071bc58a77d6b80f2a81c354d @@ -1090,7 +1090,7 @@ F tool/logest.c 7ad625cac3d54012b27d468b7af6612f78b9ba75 F tool/mkautoconfamal.sh f8d8dbf7d62f409ebed5134998bf5b51d7266383 F tool/mkkeywordhash.c bb52064aa614e1426445e4b2b9b00eeecd23cc79 F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e -F tool/mkpragmatab.tcl ceaaeebcd882864caefe4176592ca6fa4648fab1 +F tool/mkpragmatab.tcl 3fc52e00a234750675e8a569d2919ff48558e9eb F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 F tool/mksqlite3c-noext.tcl 8bce31074e4cbe631bb7676526a048335f4c9f02 F tool/mksqlite3c.tcl d8dc444d403019167260e5578f5c362741f03696 @@ -1123,7 +1123,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 67e28a11de97e97889f0c0f41c05605721c605c1 -R dc1f4dd0df343cdf7a68b757db650d93 -U dan -Z abee286031badbf2a2b4e2d1bb40e0a3 +P 27001356ed8201529b3f31d4313f2010f1b4e1b1 +R f3adfc8132b3f36843e2e67728415fbc +U drh +Z d16ae1a1de8f3334074e16125e33c2b1 diff --git a/manifest.uuid b/manifest.uuid index 2f25de0eb8..6559ca61a5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -27001356ed8201529b3f31d4313f2010f1b4e1b1 \ No newline at end of file +f0cf8c85dcbcc7778aed2816792c368d777f79cb \ No newline at end of file diff --git a/src/pragma.c b/src/pragma.c index 969af6af34..735dafc39f 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -56,18 +56,19 @@ #define PragTyp_SECURE_DELETE 25 #define PragTyp_SHRINK_MEMORY 26 #define PragTyp_SOFT_HEAP_LIMIT 27 -#define PragTyp_SYNCHRONOUS 28 -#define PragTyp_TABLE_INFO 29 -#define PragTyp_TEMP_STORE 30 -#define PragTyp_TEMP_STORE_DIRECTORY 31 -#define PragTyp_WAL_AUTOCHECKPOINT 32 -#define PragTyp_WAL_CHECKPOINT 33 -#define PragTyp_ACTIVATE_EXTENSIONS 34 -#define PragTyp_HEXKEY 35 -#define PragTyp_KEY 36 -#define PragTyp_REKEY 37 -#define PragTyp_LOCK_STATUS 38 -#define PragTyp_PARSER_TRACE 39 +#define PragTyp_STATS 28 +#define PragTyp_SYNCHRONOUS 29 +#define PragTyp_TABLE_INFO 30 +#define PragTyp_TEMP_STORE 31 +#define PragTyp_TEMP_STORE_DIRECTORY 32 +#define PragTyp_WAL_AUTOCHECKPOINT 33 +#define PragTyp_WAL_CHECKPOINT 34 +#define PragTyp_ACTIVATE_EXTENSIONS 35 +#define PragTyp_HEXKEY 36 +#define PragTyp_KEY 37 +#define PragTyp_REKEY 38 +#define PragTyp_LOCK_STATUS 39 +#define PragTyp_PARSER_TRACE 40 #define PragFlag_NeedSchema 0x01 static const struct sPragmaNames { const char *const zName; /* Name of pragma */ @@ -359,6 +360,12 @@ static const struct sPragmaNames { /* ePragFlag: */ 0, /* iArg: */ SQLITE_SqlTrace }, #endif +#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) + { /* zName: */ "stats", + /* ePragTyp: */ PragTyp_STATS, + /* ePragFlag: */ PragFlag_NeedSchema, + /* iArg: */ 0 }, +#endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) { /* zName: */ "synchronous", /* ePragTyp: */ PragTyp_SYNCHRONOUS, @@ -420,7 +427,7 @@ static const struct sPragmaNames { /* ePragFlag: */ 0, /* iArg: */ SQLITE_WriteSchema|SQLITE_RecoveryMode }, }; -/* Number of pragmas: 55 on by default, 67 total. */ +/* Number of pragmas: 56 on by default, 68 total. */ /* End of the automatically generated pragma table. ***************************************************************************/ @@ -1425,6 +1432,36 @@ void sqlite3Pragma( } break; + case PragTyp_STATS: { + Index *pIdx; + HashElem *i; + v = sqlite3GetVdbe(pParse); + sqlite3VdbeSetNumCols(v, 4); + pParse->nMem = 4; + sqlite3CodeVerifySchema(pParse, iDb); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "table", SQLITE_STATIC); + sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "index", SQLITE_STATIC); + sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "width", SQLITE_STATIC); + sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "height", SQLITE_STATIC); + for(i=sqliteHashFirst(&pDb->pSchema->tblHash); i; i=sqliteHashNext(i)){ + Table *pTab = sqliteHashData(i); + sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, pTab->zName, 0); + sqlite3VdbeAddOp2(v, OP_Null, 0, 2); + sqlite3VdbeAddOp2(v, OP_Integer, + (int)sqlite3LogEstToInt(pTab->szTabRow), 3); + sqlite3VdbeAddOp2(v, OP_Integer, (int)pTab->nRowEst, 4); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 4); + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, pIdx->zName, 0); + sqlite3VdbeAddOp2(v, OP_Integer, + (int)sqlite3LogEstToInt(pIdx->szIdxRow), 3); + sqlite3VdbeAddOp2(v, OP_Integer, (int)pIdx->aiRowEst[0], 4); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 4); + } + } + } + break; + case PragTyp_INDEX_INFO: if( zRight ){ Index *pIdx; Table *pTab; @@ -1457,26 +1494,17 @@ void sqlite3Pragma( pTab = sqlite3FindTable(db, zRight, zDb); if( pTab ){ v = sqlite3GetVdbe(pParse); - sqlite3VdbeSetNumCols(v, 4); - pParse->nMem = 4; + sqlite3VdbeSetNumCols(v, 3); + pParse->nMem = 3; sqlite3CodeVerifySchema(pParse, iDb); sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", SQLITE_STATIC); sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", SQLITE_STATIC); sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "unique", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "avgrowsize", SQLITE_STATIC); - sqlite3VdbeAddOp2(v, OP_Integer, 0, 1); - sqlite3VdbeAddOp2(v, OP_Null, 0, 2); - sqlite3VdbeAddOp2(v, OP_Integer, 1, 3); - sqlite3VdbeAddOp2(v, OP_Integer, - (int)sqlite3LogEstToInt(pTab->szTabRow), 4); - sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 4); - for(pIdx=pTab->pIndex, i=1; pIdx; pIdx=pIdx->pNext, i++){ + for(pIdx=pTab->pIndex, i=0; pIdx; pIdx=pIdx->pNext, i++){ sqlite3VdbeAddOp2(v, OP_Integer, i, 1); sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, pIdx->zName, 0); sqlite3VdbeAddOp2(v, OP_Integer, pIdx->onError!=OE_None, 3); - sqlite3VdbeAddOp2(v, OP_Integer, - (int)sqlite3LogEstToInt(pIdx->szIdxRow), 4); - sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 4); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3); } } } diff --git a/test/pragma.test b/test/pragma.test index 808aeb04d9..a6d198eb69 100644 --- a/test/pragma.test +++ b/test/pragma.test @@ -574,7 +574,7 @@ ifcapable {foreignkey} { execsql { pragma index_list(t3); } - } {/0 {} 1 \d+ 1 sqlite_autoindex_t3_1 1 \d+/} + } {0 sqlite_autoindex_t3_1 1} } ifcapable {!foreignkey} { execsql {CREATE TABLE t3(a,b UNIQUE)} @@ -647,7 +647,7 @@ do_test pragma-7.1.1 { execsql { pragma index_list(t3); } -} {/0 {} 1 \d+ 1 t3i1 0 \d+ 2 sqlite_autoindex_t3_1 1 \d+/} +} {0 t3i1 0 1 sqlite_autoindex_t3_1 1} do_test pragma-7.1.2 { execsql { pragma index_list(t3_bogus); @@ -1661,7 +1661,7 @@ do_test 23.3 { CREATE INDEX i3 ON t1(d,b,c); } db2 eval {PRAGMA index_list(t1)} -} {/0 {} 1 \d+ 1 i3 0 \d+ 2 i2 0 \d+ 3 i1 0 \d+/} +} {0 i3 0 1 i2 0 2 i1 0} do_test 23.4 { db eval { ALTER TABLE t1 ADD COLUMN e; diff --git a/tool/mkpragmatab.tcl b/tool/mkpragmatab.tcl index a5d9f5ab6d..1ba0bd6be9 100644 --- a/tool/mkpragmatab.tcl +++ b/tool/mkpragmatab.tcl @@ -172,6 +172,10 @@ set pragma_def { FLAG: NeedSchema IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) + NAME: stats + FLAG: NeedSchema + IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) + NAME: index_info FLAG: NeedSchema IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)