am 8f178b47: FOR MR3: add eventlog entry for all corruption cases in sqlite3.c

Merge commit '8f178b47c678d0b53c035b5066ad0d55f7399228' into eclair-plus-aosp

* commit '8f178b47c678d0b53c035b5066ad0d55f7399228':
  FOR MR3: add eventlog entry for all corruption cases in sqlite3.c
diff --git a/dist/sqlite3.c b/dist/sqlite3.c
index 1667108..da0f0ef 100644
--- a/dist/sqlite3.c
+++ b/dist/sqlite3.c
@@ -8982,15 +8982,45 @@
 ** it allows the operator to set a breakpoint at the spot where database
 ** corruption is first detected.
 */
+// Begin Android Change
+SQLITE_PRIVATE   int sqlite3Corrupt(int);
+# define SQLITE_CORRUPT_BKPT(N) sqlite3Corrupt(N)
 #ifdef SQLITE_DEBUG
-SQLITE_PRIVATE   int sqlite3Corrupt(void);
-# define SQLITE_CORRUPT_BKPT sqlite3Corrupt()
 # define DEBUGONLY(X)        X
 #else
-# define SQLITE_CORRUPT_BKPT SQLITE_CORRUPT
 # define DEBUGONLY(X)
 #endif
+// End Android Change
 
+// Begin Android Add
+# define PAGER_OUT_OF_RANGE_CORRUPTION           101
+# define INVALID_KEY_INTO_POINTERMAP_CORRUPTION  102
+# define INVALID_PETYPE_CORRUPTION               103
+# define PARENT_PAGE_CORRUPTION                  104
+# define TOO_MANY_CELLS_IN_PAGE_CORRUPTION       105
+# define NEED_AT_LEAST_CELL_CORRUPTION           106
+# define FREE_BLOCK_ERR_CORRUPTION               107
+# define FREE_BLOCK_NOT_IN_ORDER_CORRUPTION      108
+# define FREE_SPACE_ERR_CORRUPTION               109
+# define INVALID_PG_FETCH_CORRUPTION             110
+# define PAGE_POINTER_DATA_CORRUPTION            111
+# define PAGE_POINTER_DATA_2_CORRUPTION          112
+# define PTRMAP_ROOTPAGE_CORRUPTION              113
+# define PTRMAP_ISPAGE_CORRUPTION                114
+# define ACCESS_PAYLOAD_CORRUPTION               115
+# define BTREE_KEY_CORRUPTION                    116
+# define MOVE_TO_CHILD_CORRUPTION                117
+# define BTREE_MOVE_TO_CORRUPTION                118
+# define BTREE_PAGE_CORRUPTION                   119
+# define FREE_PAGE_OFF_THE_FILE_CORRUPTION       120
+# define CLEAR_CELL_CORRUPTION                   121
+# define CLEAR_DATABASE_PAGE_CORRUPTION          122
+# define VDBE_INDEX_ROWID_CORRUPTION             123
+# define DATA_CORRUPTION                         124
+# define BTREE_FLAGS_CORRUPTION                  125
+# define NOT_TABLE_NOT_KEY_CORRUPTION            126
+# define BTREE_INTKEY_CORRUPTION                 127
+// End Android Add
 /*
 ** Internal function prototypes
 */
@@ -25820,6 +25850,7 @@
 // Begin Android add 
 #define LOG_TAG "sqlite3"
 #include <utils/Log.h>
+#include <cutils/log.h>
 // END Android add
 
 /*
@@ -27484,7 +27515,7 @@
   ** number greater than this, or zero, is requested.
   */
   if( pgno>PAGER_MAX_PGNO || pgno==0 || pgno==PAGER_MJ_PGNO(pPager) ){
-    return SQLITE_CORRUPT_BKPT;
+    return SQLITE_CORRUPT_BKPT(PAGER_OUT_OF_RANGE_CORRUPTION); // Android Change
   }
 
   /* Make sure we have not hit any critical errors.
@@ -30466,7 +30497,7 @@
 
   assert( pBt->autoVacuum );
   if( key==0 ){
-    return SQLITE_CORRUPT_BKPT;
+    return SQLITE_CORRUPT_BKPT(INVALID_KEY_INTO_POINTERMAP_CORRUPTION); // Android Change
   }
   iPtrmap = PTRMAP_PAGENO(pBt, key);
   rc = sqlite3PagerGet(pBt->pPager, iPtrmap, &pDbPage);
@@ -30518,7 +30549,9 @@
   if( pPgno ) *pPgno = get4byte(&pPtrmap[offset+1]);
 
   sqlite3PagerUnref(pDbPage);
-  if( *pEType<1 || *pEType>5 ) return SQLITE_CORRUPT_BKPT;
+  if( *pEType<1 || *pEType>5 ) {
+    return SQLITE_CORRUPT_BKPT(INVALID_PETYPE_CORRUPTION); // Android Change
+  }
   return SQLITE_OK;
 }
 
@@ -30952,7 +30985,7 @@
   assert( pPage->aData == sqlite3PagerGetData(pPage->pDbPage) );
   if( pPage->pParent!=pParent && (pPage->pParent!=0 || pPage->isInit) ){
     /* The parent page should never change unless the file is corrupt */
-    return SQLITE_CORRUPT_BKPT;
+    return SQLITE_CORRUPT_BKPT(PARENT_PAGE_CORRUPTION); // Android Change
   }
   if( pPage->isInit ) return SQLITE_OK;
   if( pPage->pParent==0 && pParent!=0 ){
@@ -30970,11 +31003,11 @@
   pPage->nCell = get2byte(&data[hdr+3]);
   if( pPage->nCell>MX_CELL(pBt) ){
     /* To many cells for a single page.  The page must be corrupt */
-    return SQLITE_CORRUPT_BKPT;
+    return SQLITE_CORRUPT_BKPT(TOO_MANY_CELLS_IN_PAGE_CORRUPTION); // Android Change
   }
   if( pPage->nCell==0 && pParent!=0 && pParent->pgno!=1 ){
     /* All pages must have at least one cell, except for root pages */
-    return SQLITE_CORRUPT_BKPT;
+    return SQLITE_CORRUPT_BKPT(NEED_AT_LEAST_CELL_CORRUPTION); // Android Change
   }
 
   /* Compute the total free space on the page */
@@ -30984,13 +31017,13 @@
     int next, size;
     if( pc>usableSize-4 ){
       /* Free block is off the page */
-      return SQLITE_CORRUPT_BKPT; 
+      return SQLITE_CORRUPT_BKPT(FREE_BLOCK_ERR_CORRUPTION); // Android Change
     }
     next = get2byte(&data[pc]);
     size = get2byte(&data[pc+2]);
     if( next>0 && next<=pc+size+3 ){
       /* Free blocks must be in accending order */
-      return SQLITE_CORRUPT_BKPT; 
+      return SQLITE_CORRUPT_BKPT(FREE_BLOCK_NOT_IN_ORDER_CORRUPTION); // Android Change
     }
     nFree += size;
     pc = next;
@@ -30998,7 +31031,7 @@
   pPage->nFree = nFree;
   if( nFree>=usableSize ){
     /* Free space cannot exceed total page size */
-    return SQLITE_CORRUPT_BKPT; 
+    return SQLITE_CORRUPT_BKPT(FREE_SPACE_ERR_CORRUPTION); // Android Change
   }
 
   pPage->isInit = 1;
@@ -31084,7 +31117,7 @@
   int rc;
   assert( sqlite3_mutex_held(pBt->mutex) );
   if( pgno==0 ){
-    return SQLITE_CORRUPT_BKPT; 
+    return SQLITE_CORRUPT_BKPT(INVALID_PG_FETCH_CORRUPTION); // Android Change
   }
   rc = sqlite3BtreeGetPage(pBt, pgno, ppPage, 0);
   if( rc==SQLITE_OK && (*ppPage)->isInit==0 ){
@@ -32065,7 +32098,7 @@
   if( eType==PTRMAP_OVERFLOW2 ){
     /* The pointer is always the first 4 bytes of the page in this case.  */
     if( get4byte(pPage->aData)!=iFrom ){
-      return SQLITE_CORRUPT_BKPT;
+      return SQLITE_CORRUPT_BKPT(PAGE_POINTER_DATA_CORRUPTION); // Android Change
     }
     put4byte(pPage->aData, iTo);
   }else{
@@ -32098,7 +32131,7 @@
     if( i==nCell ){
       if( eType!=PTRMAP_BTREE || 
           get4byte(&pPage->aData[pPage->hdrOffset+8])!=iFrom ){
-        return SQLITE_CORRUPT_BKPT;
+        return SQLITE_CORRUPT_BKPT(PAGE_POINTER_DATA_2_CORRUPTION); // Android Change
       }
       put4byte(&pPage->aData[pPage->hdrOffset+8], iTo);
     }
@@ -32228,7 +32261,7 @@
       return rc;
     }
     if( eType==PTRMAP_ROOTPAGE ){
-      return SQLITE_CORRUPT_BKPT;
+      return SQLITE_CORRUPT_BKPT(PTRMAP_ROOTPAGE_CORRUPTION); // Android Change
     }
 
     if( eType==PTRMAP_FREEPAGE ){
@@ -32346,7 +32379,7 @@
       Pgno nOrig = sqlite3PagerPagecount(pBt->pPager);
 
       if( PTRMAP_ISPAGE(pBt, nOrig) ){
-        return SQLITE_CORRUPT_BKPT;
+        return SQLITE_CORRUPT_BKPT(PTRMAP_ISPAGE_CORRUPTION); // Android Change
       }
       if( nOrig==PENDING_BYTE_PAGE(pBt) ){
         nOrig--;
@@ -33242,7 +33275,7 @@
   }
 
   if( rc==SQLITE_OK && amt>0 ){
-    return SQLITE_CORRUPT_BKPT;
+    return SQLITE_CORRUPT_BKPT(ACCESS_PAYLOAD_CORRUPTION); // Android Change
   }
   return rc;
 }
@@ -33265,7 +33298,7 @@
     assert( pCur->eState==CURSOR_VALID );
     assert( pCur->pPage!=0 );
     if( pCur->pPage->intKey ){
-      return SQLITE_CORRUPT_BKPT;
+      return SQLITE_CORRUPT_BKPT(BTREE_KEY_CORRUPTION); // Android Change
     }
     assert( pCur->pPage->intKey==0 );
     assert( pCur->idx>=0 && pCur->idx<pCur->pPage->nCell );
@@ -33406,7 +33439,7 @@
   pCur->info.nSize = 0;
   pCur->validNKey = 0;
   if( pNewPage->nCell<1 ){
-    return SQLITE_CORRUPT_BKPT;
+    return SQLITE_CORRUPT_BKPT(MOVE_TO_CHILD_CORRUPTION); // Android Change
   }
   return SQLITE_OK;
 }
@@ -33703,7 +33736,7 @@
     lwr = 0;
     upr = pPage->nCell-1;
     if( !pPage->intKey && pUnKey==0 ){
-      rc = SQLITE_CORRUPT_BKPT;
+      rc = SQLITE_CORRUPT_BKPT(BTREE_MOVE_TO_CORRUPTION); // Android Change
       goto moveto_finish;
     }
     if( biasRight ){
@@ -34058,7 +34091,7 @@
         TRACE(("ALLOCATE: %d trunk - %d free pages left\n", *pPgno, n-1));
       }else if( k>pBt->usableSize/4 - 8 ){
         /* Value of k is out of range.  Database corruption */
-        rc = SQLITE_CORRUPT_BKPT;
+        rc = SQLITE_CORRUPT_BKPT(BTREE_PAGE_CORRUPTION); // Android Change
         goto end_allocate_page;
 #ifndef SQLITE_OMIT_AUTOVACUUM
       }else if( searchList && nearby==iTrunk ){
@@ -34142,7 +34175,7 @@
           *pPgno = iPage;
           if( *pPgno>sqlite3PagerPagecount(pBt->pPager) ){
             /* Free page off the end of the file */
-            rc = SQLITE_CORRUPT_BKPT;
+            rc = SQLITE_CORRUPT_BKPT(FREE_PAGE_OFF_THE_FILE_CORRUPTION); // Android Change
             goto end_allocate_page;
           }
           TRACE(("ALLOCATE: %d was leaf %d of %d on trunk %d"
@@ -34324,7 +34357,7 @@
   while( nOvfl-- ){
     MemPage *pOvfl;
     if( ovflPgno==0 || ovflPgno>sqlite3PagerPagecount(pBt->pPager) ){
-      return SQLITE_CORRUPT_BKPT;
+      return SQLITE_CORRUPT_BKPT(CLEAR_CELL_CORRUPTION); // Android Change
     }
 
     rc = getOverflowPage(pBt, ovflPgno, &pOvfl, (nOvfl==0)?0:&ovflPgno);
@@ -36046,7 +36079,7 @@
 
   assert( sqlite3_mutex_held(pBt->mutex) );
   if( pgno>sqlite3PagerPagecount(pBt->pPager) ){
-    return SQLITE_CORRUPT_BKPT;
+    return SQLITE_CORRUPT_BKPT(CLEAR_DATABASE_PAGE_CORRUPTION); // Android Change
   }
 
   rc = getAndInitPage(pBt, pgno, &pPage, pParent);
@@ -40779,7 +40812,7 @@
 
   sqlite3BtreeKeySize(pCur, &nCellKey);
   if( nCellKey<=0 ){
-    return SQLITE_CORRUPT_BKPT;
+    return SQLITE_CORRUPT_BKPT(VDBE_INDEX_ROWID_CORRUPTION); // Android Change
   }
   m.flags = 0;
   m.db = 0;
@@ -44200,7 +44233,7 @@
     ** with a corrupt database.
     */
     if( zIdx>zEndHdr || offset>payloadSize || (zIdx==zEndHdr && offset!=payloadSize) ){
-      rc = SQLITE_CORRUPT_BKPT;
+      rc = SQLITE_CORRUPT_BKPT(DATA_CORRUPTION); // Android Change
       goto op_column_out;
     }
   }
@@ -44791,7 +44824,7 @@
       ** only mean that we are dealing with a corrupt database file
       */
       if( (flags & 0xf0)!=0 || ((flags & 0x07)!=5 && (flags & 0x07)!=2) ){
-        rc = SQLITE_CORRUPT_BKPT;
+        rc = SQLITE_CORRUPT_BKPT(BTREE_FLAGS_CORRUPTION); // Android Change
         goto abort_due_to_error;
       }
       pCur->isTable = (flags & BTREE_INTKEY)!=0;
@@ -44802,7 +44835,7 @@
       */
       if( (pCur->isTable && pOp->p4type==P4_KEYINFO)
        || (pCur->isIndex && pOp->p4type!=P4_KEYINFO) ){
-        rc = SQLITE_CORRUPT_BKPT;
+        rc = SQLITE_CORRUPT_BKPT(NOT_TABLE_NOT_KEY_CORRUPTION); // Android Change
         goto abort_due_to_error;
       }
       break;
@@ -45358,7 +45391,7 @@
     cnt = 0;
     if( (sqlite3BtreeFlags(pC->pCursor)&(BTREE_INTKEY|BTREE_ZERODATA)) !=
           BTREE_INTKEY ){
-      rc = SQLITE_CORRUPT_BKPT;
+      rc = SQLITE_CORRUPT_BKPT(BTREE_INTKEY_CORRUPTION); // Android Change
       goto abort_due_to_error;
     }
     assert( (sqlite3BtreeFlags(pC->pCursor) & BTREE_INTKEY)!=0 );
@@ -78688,16 +78721,25 @@
   return db->autoCommit;
 }
 
-#ifdef SQLITE_DEBUG
+// Android Change #ifdef SQLITE_DEBUG
 /*
 ** The following routine is subtituted for constant SQLITE_CORRUPT in
 ** debugging builds.  This provides a way to set a breakpoint for when
 ** corruption is first detected.
 */
-SQLITE_PRIVATE int sqlite3Corrupt(void){
+// Begin Android Change
+// the following should match up with value in java/android/database/sqlite/SQLiteDatabase.java
+# define EVENT_DB_CORRUPT 75004
+
+SQLITE_PRIVATE int sqlite3Corrupt(int corruption_type){
+  // write an event to the log
+  char buf[50];
+  int payload_len = sprintf(buf, "corruption_type = %d", corruption_type);
+  android_btWriteLog(EVENT_DB_CORRUPT, EVENT_TYPE_STRING, buf, payload_len);
   return SQLITE_CORRUPT;
 }
-#endif
+// #endif
+// End Android Change
 
 /*
 ** This is a convenience routine that makes sure that all thread-specific