From: dan Date: Thu, 20 Aug 2009 09:11:06 +0000 (+0000) Subject: Change the code that collects samples for sqlite_stat2 so that the first sample taken... X-Git-Tag: fts3-refactor~242 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=68c4dbbdfc3731094a1e7bf701b6fc1175ef3a40;p=thirdparty%2Fsqlite.git Change the code that collects samples for sqlite_stat2 so that the first sample taken is the (nRow/(2*SQLITE_INDEX_SAMPLES))th entry in the index, where nRow is the total number of index entries. FossilOrigin-Name: cbfe6e9df39684607cbc9637e3fb3c5ee6af2515 --- diff --git a/manifest b/manifest index 432e1a01c5..0a650ecc2b 100644 --- a/manifest +++ b/manifest @@ -1,8 +1,5 @@ ------BEGIN PGP SIGNED MESSAGE----- -Hash: SHA1 - -C Incremental\scode\sand\scomment\scleanup\sin\swhere.c.\s\sThere\sis\smore\sto\sbe\sdone. -D 2009-08-20T13:45:08 +C Change\sthe\scode\sthat\scollects\ssamples\sfor\ssqlite_stat2\sso\sthat\sthe\sfirst\ssample\staken\sis\sthe\s(nRow/(2*SQLITE_INDEX_SAMPLES))th\sentry\sin\sthe\sindex,\swhere\snRow\sis\sthe\stotal\snumber\sof\sindex\sentries. +D 2009-08-20T09:11:06 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.in 0f7761c5d1c62ae7a841e3393ffaff1fa0f5c00a F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 @@ -103,7 +100,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 6be1ad09113570e1fc8dcaff84c9b0b337db5ffc F sqlite3.pc.in ae6f59a76e862f5c561eb32a380228a02afc3cad F src/alter.c 8b42cace4f8e312de596807ba2685179da64fec4 -F src/analyze.c b62fc66fce1f7ac0336f10189ce8a7b809c65b2d +F src/analyze.c e3ad83c1462c68cba458e3bdf21f00bc2069bf31 F src/attach.c 13995348fc5a26cdd136a50806faf292aabc173f F src/auth.c 802a9439dfa0b8c208b10055cba400e82ef18025 F src/backup.c 6f1c2d9862c8a3feb7739dfcca02c1f5352e37f3 @@ -227,7 +224,7 @@ F test/alter3.test 25b95a136708f22b87184fa6a4309eea03d65153 F test/alter4.test 9386ffd1e9c7245f43eca412b2058d747509cc1f F test/altermalloc.test e81ac9657ed25c6c5bb09bebfa5a047cd8e4acfc F test/analyze.test ad5329098fe4de4a96852231d53e3e9e6283ad4b -F test/analyze2.test f3c0944b854fb33987dbadd1e95913365c33deb7 +F test/analyze2.test 297d3d63f2f50976c606227040fe36605745d9dd F test/async.test 8c75d31b8330f8b70cf2571b014d4476a063efdb F test/async2.test bf5e2ca2c96763b4cba3d016249ad7259a5603b6 F test/async3.test 93edaa9122f498e56ea98c36c72abc407f4fb11e @@ -750,14 +747,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/vdbe-compress.tcl 672f81d693a03f80f5ae60bfefacd8a349e76746 -P 167644f33c949b532655c2297aedf13f93876396 -R fb372557659e26b35bbe68ecf447e1ca -U drh -Z 24339a8c1ef1b0f0335c1d9d08b33691 ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1.4.6 (GNU/Linux) - -iD8DBQFKjVNnoxKgR168RlERAlJzAJwNEG76YvhUi3RkLEp7KwaZArgnPQCghw3J -pSL+ypKyYegD2N/rATGSaX4= -=lyU7 ------END PGP SIGNATURE----- +P 4a5d9550bdc08633535a7869d7748f56ac3e9a36 +R a06a46e0e6092a62dbfee6601412e863 +U dan +Z 2c479b2a4ff638923d236b4fdc91cdb8 diff --git a/manifest.uuid b/manifest.uuid index b7291a4b4f..915b1f6236 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4a5d9550bdc08633535a7869d7748f56ac3e9a36 \ No newline at end of file +cbfe6e9df39684607cbc9637e3fb3c5ee6af2515 \ No newline at end of file diff --git a/src/analyze.c b/src/analyze.c index 67495e3807..8a59c55f60 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -124,11 +124,13 @@ static void analyzeOneTable( int regRec = iMem++; /* Register holding completed record */ int regTemp = iMem++; /* Temporary use register */ int regRowid = iMem++; /* Rowid for the inserted record */ + #ifdef SQLITE_ENABLE_STAT2 int regTemp2 = iMem++; /* Temporary use register */ - int regSamplerecno = iMem++; /* Next sample index record number */ - int regRecno = iMem++; /* Register next index record number */ - int regCount = iMem++; /* Total number of records in table */ + int regSamplerecno = iMem++; /* Index of next sample to record */ + int regRecno = iMem++; /* Current sample index */ + int regLast = iMem++; /* Index of last sample to record */ + int regFirst = iMem++; /* Index of first sample to record */ #endif v = sqlite3GetVdbe(pParse); @@ -171,26 +173,29 @@ static void analyzeOneTable( sqlite3VdbeAddOp4(v, OP_String8, 0, regIdxname, 0, pIdx->zName, 0); #ifdef SQLITE_ENABLE_STAT2 + /* If this iteration of the loop is generating code to analyze the - ** first index in the pTab->pIndex list, then register regCount has + ** first index in the pTab->pIndex list, then register regLast has ** not been populated. In this case populate it now. */ if( pTab->pIndex==pIdx ){ - sqlite3VdbeAddOp2(v, OP_Count, iIdxCur, regCount); + sqlite3VdbeAddOp2(v, OP_Integer, SQLITE_INDEX_SAMPLES, regSamplerecno); + sqlite3VdbeAddOp2(v, OP_Integer, SQLITE_INDEX_SAMPLES*2-1, regTemp); + sqlite3VdbeAddOp2(v, OP_Integer, SQLITE_INDEX_SAMPLES*2, regTemp2); + + sqlite3VdbeAddOp2(v, OP_Count, iIdxCur, regLast); + sqlite3VdbeAddOp2(v, OP_Null, 0, regFirst); + addr = sqlite3VdbeAddOp3(v, OP_Lt, regSamplerecno, 0, regLast); + sqlite3VdbeAddOp3(v, OP_Divide, regTemp2, regLast, regFirst); + sqlite3VdbeAddOp3(v, OP_Multiply, regLast, regTemp, regLast); + sqlite3VdbeAddOp2(v, OP_AddImm, regLast, SQLITE_INDEX_SAMPLES*2-2); + sqlite3VdbeAddOp3(v, OP_Divide, regTemp2, regLast, regLast); + sqlite3VdbeJumpHere(v, addr); } /* Zero the regSampleno and regRecno registers. */ sqlite3VdbeAddOp2(v, OP_Integer, 0, regSampleno); sqlite3VdbeAddOp2(v, OP_Integer, 0, regRecno); - - /* If there are less than INDEX_SAMPLES records in the index, then - ** set the contents of regSampleRecno to integer value INDEX_SAMPLES. - ** Otherwise, set it to zero. This is to ensure that if there are - ** less than the said number of entries in the index, no samples at - ** all are collected. */ - sqlite3VdbeAddOp2(v, OP_Integer, SQLITE_INDEX_SAMPLES, regSamplerecno); - sqlite3VdbeAddOp3(v, OP_Lt, regSamplerecno, sqlite3VdbeCurrentAddr(v)+2, - regCount); - sqlite3VdbeAddOp2(v, OP_Integer, 0, regSamplerecno); + sqlite3VdbeAddOp2(v, OP_Copy, regFirst, regSamplerecno); #endif /* The block of memory cells initialized here is used as follows. @@ -235,6 +240,7 @@ static void analyzeOneTable( && regTabname+2==regSampleno && regTabname+3==regCol ); + sqlite3VdbeChangeP5(v, SQLITE_JUMPIFNULL); sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 4, regRec, "aaab", 0); sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur+1, regRowid); sqlite3VdbeAddOp3(v, OP_Insert, iStatCur+1, regRec, regRowid); @@ -245,7 +251,7 @@ static void analyzeOneTable( ** samplerecno = samplerecno+(remaining records)/(remaining samples) */ sqlite3VdbeAddOp2(v, OP_AddImm, regSampleno, 1); - sqlite3VdbeAddOp3(v, OP_Subtract, regRecno, regCount, regTemp); + sqlite3VdbeAddOp3(v, OP_Subtract, regRecno, regLast, regTemp); sqlite3VdbeAddOp2(v, OP_AddImm, regTemp, -1); sqlite3VdbeAddOp2(v, OP_Integer, SQLITE_INDEX_SAMPLES, regTemp2); sqlite3VdbeAddOp3(v, OP_Subtract, regSampleno, regTemp2, regTemp2); diff --git a/test/analyze2.test b/test/analyze2.test index 52b01b6420..84cd76bceb 100644 --- a/test/analyze2.test +++ b/test/analyze2.test @@ -66,17 +66,18 @@ do_test analyze2-1.1 { ANALYZE; SELECT * FROM sqlite_stat2; } -} [list t1 sqlite_autoindex_t1_1 0 0 \ - t1 sqlite_autoindex_t1_1 1 111 \ - t1 sqlite_autoindex_t1_1 2 222 \ - t1 sqlite_autoindex_t1_1 3 333 \ - t1 sqlite_autoindex_t1_1 4 444 \ - t1 sqlite_autoindex_t1_1 5 555 \ - t1 sqlite_autoindex_t1_1 6 666 \ - t1 sqlite_autoindex_t1_1 7 777 \ - t1 sqlite_autoindex_t1_1 8 888 \ - t1 sqlite_autoindex_t1_1 9 999 \ +} [list t1 sqlite_autoindex_t1_1 0 50 \ + t1 sqlite_autoindex_t1_1 1 149 \ + t1 sqlite_autoindex_t1_1 2 249 \ + t1 sqlite_autoindex_t1_1 3 349 \ + t1 sqlite_autoindex_t1_1 4 449 \ + t1 sqlite_autoindex_t1_1 5 549 \ + t1 sqlite_autoindex_t1_1 6 649 \ + t1 sqlite_autoindex_t1_1 7 749 \ + t1 sqlite_autoindex_t1_1 8 849 \ + t1 sqlite_autoindex_t1_1 9 949 \ ] + do_test analyze2-1.2 { execsql { DELETE FROM t1 WHERe x>9; @@ -86,7 +87,7 @@ do_test analyze2-1.2 { } {t1 sqlite_autoindex_t1_1 {0 1 2 3 4 5 6 7 8 9}} do_test analyze2-1.3 { execsql { - DELETE FROM t1 WHERE x>5; + DELETE FROM t1 WHERE x>8; ANALYZE; SELECT * FROM sqlite_stat2; } @@ -99,7 +100,6 @@ do_test analyze2-1.4 { } } {} - do_test analyze2-2.1 { execsql { BEGIN; @@ -162,7 +162,7 @@ do_test analyze2-3.1 { WHERE idx = 't1_x' GROUP BY tbl,idx } -} {t1 t1_x {0 222 444 666 888 bba ddc ffe hhg jjj}} +} {t1 t1_x {100 299 499 699 899 ajj cjj ejj gjj ijj}} do_test analyze2-3.2 { execsql { SELECT tbl,idx,group_concat(sample,' ') @@ -170,7 +170,7 @@ do_test analyze2-3.2 { WHERE idx = 't1_y' GROUP BY tbl,idx } -} {t1 t1_y {0 222 444 666 888 bba ddc ffe hhg jjj}} +} {t1 t1_y {100 299 499 699 899 ajj cjj ejj gjj ijj}} do_test analyze2-3.3 { eqp "SELECT * FROM t1 WHERE x BETWEEN 100 AND 500 AND y BETWEEN 'a' AND 'b'" @@ -185,7 +185,7 @@ do_test analyze2-3.6 { eqp "SELECT * FROM t1 WHERE x<444 AND y>'h'" } {0 0 {TABLE t1 WITH INDEX t1_y}} do_test analyze2-3.7 { - eqp "SELECT * FROM t1 WHERE x<221 AND y>'h'" + eqp "SELECT * FROM t1 WHERE x<221 AND y>'g'" } {0 0 {TABLE t1 WITH INDEX t1_x}} do_test analyze2-4.1 { @@ -210,7 +210,7 @@ do_test analyze2-4.2 { WHERE idx = 't3a' GROUP BY tbl,idx } -} {t3 t3a {AAA bbb CCC ddd EEE fff GGG hhh III jjj}} +} {t3 t3a {AfA bEj CEj dEj EEj fEj GEj hEj IEj jEj}} do_test analyze2-4.3 { execsql { SELECT tbl,idx,group_concat(sample,' ') @@ -218,7 +218,7 @@ do_test analyze2-4.3 { WHERE idx = 't3b' GROUP BY tbl,idx } -} {t3 t3b {AAA CCC EEE GGG III bbb ddd fff hhh jjj}} +} {t3 t3b {AbA CIj EIj GIj IIj bIj dIj fIj hIj jIj}} do_test analyze2-4.4 { eqp "SELECT * FROM t3 WHERE a > 'A' AND a < 'C' AND b > 'A' AND b < 'C'" @@ -253,7 +253,7 @@ do_test analyze2-5.2 { WHERE tbl = 't4' GROUP BY tbl,idx } -} {t4 t4x {aaa bbb ccc ddd eee fff ggg hhh iii jjj}} +} {t4 t4x {afa bej cej dej eej fej gej hej iej jej}} do_test analyze2-5.3 { eqp "SELECT * FROM t4 WHERE x>'ccc'" } {0 0 {TABLE t4 WITH INDEX t4x}}