]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Testing improvements and corner-case bug fixes for the dbstat virtual table.
authordrh <drh@noemail.net>
Thu, 7 May 2015 18:29:04 +0000 (18:29 +0000)
committerdrh <drh@noemail.net>
Thu, 7 May 2015 18:29:04 +0000 (18:29 +0000)
FossilOrigin-Name: d51ce539327b4807150b030a10bb105fa34cbc24

manifest
manifest.uuid
src/dbstat.c

index 0cbe50bfcb64a1ef47021acf13b49994dd654600..a505bd9b18afd0070aa0df6234da7e3fb78ba09d 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Enhance\sthe\sdbstat\svirtual\stable\swith\sthe\sability\sto\sanalyze\sATTACHed\ndatabases.
-D 2015-05-07T14:41:56.372
+C Testing\simprovements\sand\scorner-case\sbug\sfixes\sfor\sthe\sdbstat\svirtual\stable.
+D 2015-05-07T18:29:04.911
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 08728ecbeddca339c77bfd564d3484b523dffdb1
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -181,7 +181,7 @@ F src/callback.c 7b44ce59674338ad48b0e84e7b72f935ea4f68b0
 F src/complete.c a5cf5b4b56390cfb7b8636e8f7ddef90258dd575
 F src/ctime.c 98f89724adc891a1a4c655bee04e33e716e05887
 F src/date.c e4d50b3283696836ec1036b695ead9a19e37a5ac
-F src/dbstat.c a9c0550fe90b765e1ac38760e1822bb7a1dfe857
+F src/dbstat.c db36fbd268f778ea1cdb8b0c1eb9828c1f10bf70
 F src/delete.c 37964e6c1d73ff49cbea9ff690c9605fb15f600e
 F src/expr.c 3fb2ab3ab69d15b4b75ae53fceb4e317f64cb306
 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
@@ -1256,7 +1256,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P cf975957b9ae671f34bb65f049acf351e650d437
-R e2036c834faa435fbd4ece874ab9ac24
+P 25ec09400b753fcb10a2aae57eb43dbf0548b7ca
+R a722e2e22e0813a5eab44a056c8ee5fc
 U drh
-Z cef1b7912e822bf40819db2b70a8eba6
+Z 6e76fa3acb898a213eb3b606e7343836
index dde28b002b2cc9d017997f8d3dbad7b63b6eeacf..20d14f8a2cbc14eeb0f39f812da081cdc88173d1 100644 (file)
@@ -1 +1 @@
-25ec09400b753fcb10a2aae57eb43dbf0548b7ca
\ No newline at end of file
+d51ce539327b4807150b030a10bb105fa34cbc24
\ No newline at end of file
index 8351926dcc2f70c6f5af0d8b67898a481fad7e6f..64cd5d8120744105e2c34bcc7e281cf4f8a98dd5 100644 (file)
@@ -424,6 +424,7 @@ static void statSizeAndOffset(StatCursor *pCsr){
 static int statNext(sqlite3_vtab_cursor *pCursor){
   int rc;
   int nPayload;
+  char *z;
   StatCursor *pCsr = (StatCursor *)pCursor;
   StatTable *pTab = (StatTable *)pCursor->pVtab;
   Btree *pBt = pTab->db->aDb[pTab->iDb].pBt;
@@ -446,8 +447,9 @@ statNextRestart:
       rc = sqlite3PagerGet(pPager, iRoot, &pCsr->aPage[0].pPg);
       pCsr->aPage[0].iPgno = iRoot;
       pCsr->aPage[0].iCell = 0;
-      pCsr->aPage[0].zPath = sqlite3_mprintf("/");
+      pCsr->aPage[0].zPath = z = sqlite3_mprintf("/");
       pCsr->iPage = 0;
+      if( z==0 ) rc = SQLITE_NOMEM;
     }else{
       pCsr->isEof = 1;
       return sqlite3_reset(pCsr->pStmt);
@@ -470,7 +472,7 @@ statNextRestart:
         pCsr->zPagetype = "overflow";
         pCsr->nCell = 0;
         pCsr->nMxPayload = 0;
-        pCsr->zPath = sqlite3_mprintf(
+        pCsr->zPath = z = sqlite3_mprintf(
             "%s%.3x+%.6x", p->zPath, p->iCell, pCell->iOvfl
         );
         if( pCell->iOvfl<pCell->nOvfl-1 ){
@@ -482,7 +484,7 @@ statNextRestart:
         }
         pCell->iOvfl++;
         statSizeAndOffset(pCsr);
-        return SQLITE_OK;
+        return z==0 ? SQLITE_NOMEM : SQLITE_OK;
       }
       if( p->iRightChildPg ) break;
       p->iCell++;
@@ -504,8 +506,9 @@ statNextRestart:
     }
     rc = sqlite3PagerGet(pPager, p[1].iPgno, &p[1].pPg);
     p[1].iCell = 0;
-    p[1].zPath = sqlite3_mprintf("%s%.3x/", p->zPath, p->iCell);
+    p[1].zPath = z = sqlite3_mprintf("%s%.3x/", p->zPath, p->iCell);
     p->iCell++;
+    if( z==0 ) rc = SQLITE_NOMEM;
   }
 
 
@@ -538,7 +541,8 @@ statNextRestart:
       pCsr->nCell = p->nCell;
       pCsr->nUnused = p->nUnused;
       pCsr->nMxPayload = p->nMxPayload;
-      pCsr->zPath = sqlite3_mprintf("%s", p->zPath);
+      pCsr->zPath = z = sqlite3_mprintf("%s", p->zPath);
+      if( z==0 ) rc = SQLITE_NOMEM;
       nPayload = 0;
       for(i=0; i<p->nCell; i++){
         nPayload += p->aCell[i].nLocal;
@@ -574,7 +578,7 @@ static int statColumn(
   StatCursor *pCsr = (StatCursor *)pCursor;
   switch( i ){
     case 0:            /* name */
-      sqlite3_result_text(ctx, pCsr->zName, -1, SQLITE_STATIC);
+      sqlite3_result_text(ctx, pCsr->zName, -1, SQLITE_TRANSIENT);
       break;
     case 1:            /* path */
       sqlite3_result_text(ctx, pCsr->zPath, -1, SQLITE_TRANSIENT);
@@ -600,7 +604,8 @@ static int statColumn(
     case 8:            /* pgoffset */
       sqlite3_result_int64(ctx, pCsr->iOffset);
       break;
-    case 9:            /* pgsize */
+    default:           /* pgsize */
+      assert( i==9 );
       sqlite3_result_int(ctx, pCsr->szPage);
       break;
   }