1 /* 2 ** 2005 July 8 3 ** 4 ** The author disclaims copyright to this source code. In place of 5 ** a legal notice, here is a blessing: 6 ** 7 ** May you do good and not evil. 8 ** May you find forgiveness for yourself and forgive others. 9 ** May you share freely, never taking more than you give. 10 ** 11 ************************************************************************* 12 ** This file contains code associated with the ANALYZE command. 13 */ 14 #ifndef SQLITE_OMIT_ANALYZE 15 #include "sqliteInt.h" 16 17 /* 18 ** This routine generates code that opens the sqlite_stat1 table for 19 ** writing with cursor iStatCur. If the library was built with the 20 ** SQLITE_ENABLE_STAT2 macro defined, then the sqlite_stat2 table is 21 ** opened for writing using cursor (iStatCur+1) 22 ** 23 ** If the sqlite_stat1 tables does not previously exist, it is created. 24 ** Similarly, if the sqlite_stat2 table does not exist and the library 25 ** is compiled with SQLITE_ENABLE_STAT2 defined, it is created. 26 ** 27 ** Argument zWhere may be a pointer to a buffer containing a table name, 28 ** or it may be a NULL pointer. If it is not NULL, then all entries in 29 ** the sqlite_stat1 and (if applicable) sqlite_stat2 tables associated 30 ** with the named table are deleted. If zWhere==0, then code is generated 31 ** to delete all stat table entries. 32 */ 33 static void openStatTable( 34 Parse *pParse, /* Parsing context */ 35 int iDb, /* The database we are looking in */ 36 int iStatCur, /* Open the sqlite_stat1 table on this cursor */ 37 const char *zWhere /* Delete entries associated with this table */ 38 ){ 39 static const struct { 40 const char *zName; 41 const char *zCols; 42 } aTable[] = { 43 { "sqlite_stat1", "tbl,idx,stat" }, 44 #ifdef SQLITE_ENABLE_STAT2 45 { "sqlite_stat2", "tbl,idx,sampleno,sample" }, 46 #endif 47 }; 48 49 int aRoot[] = {0, 0}; 50 u8 aCreateTbl[] = {0, 0}; 51 52 int i; 53 sqlite3 *db = pParse->db; 54 Db *pDb; 55 Vdbe *v = sqlite3GetVdbe(pParse); 56 if( v==0 ) return; 57 assert( sqlite3BtreeHoldsAllMutexes(db) ); 58 assert( sqlite3VdbeDb(v)==db ); 59 pDb = &db->aDb[iDb]; 60 61 for(i=0; i<ArraySize(aTable); i++){ 62 const char *zTab = aTable[i].zName; 63 Table *pStat; 64 if( (pStat = sqlite3FindTable(db, zTab, pDb->zName))==0 ){ 65 /* The sqlite_stat[12] table does not exist. Create it. Note that a 66 ** side-effect of the CREATE TABLE statement is to leave the rootpage 67 ** of the new table in register pParse->regRoot. This is important 68 ** because the OpenWrite opcode below will be needing it. */ 69 sqlite3NestedParse(pParse, 70 "CREATE TABLE %Q.%s(%s)", pDb->zName, zTab, aTable[i].zCols 71 ); 72 aRoot[i] = pParse->regRoot; 73 aCreateTbl[i] = 1; 74 }else{ 75 /* The table already exists. If zWhere is not NULL, delete all entries 76 ** associated with the table zWhere. If zWhere is NULL, delete the 77 ** entire contents of the table. */ 78 aRoot[i] = pStat->tnum; 79 sqlite3TableLock(pParse, iDb, aRoot[i], 1, zTab); 80 if( zWhere ){ 81 sqlite3NestedParse(pParse, 82 "DELETE FROM %Q.%s WHERE tbl=%Q", pDb->zName, zTab, zWhere 83 ); 84 }else{ 85 /* The sqlite_stat[12] table already exists. Delete all rows. */ 86 sqlite3VdbeAddOp2(v, OP_Clear, aRoot[i], iDb); 87 } 88 } 89 } 90 91 /* Open the sqlite_stat[12] tables for writing. */ 92 for(i=0; i<ArraySize(aTable); i++){ 93 sqlite3VdbeAddOp3(v, OP_OpenWrite, iStatCur+i, aRoot[i], iDb); 94 sqlite3VdbeChangeP4(v, -1, (char *)3, P4_INT32); 95 sqlite3VdbeChangeP5(v, aCreateTbl[i]); 96 } 97 } 98 99 /* 100 ** Generate code to do an analysis of all indices associated with 101 ** a single table. 102 */ 103 static void analyzeOneTable( 104 Parse *pParse, /* Parser context */ 105 Table *pTab, /* Table whose indices are to be analyzed */ 106 int iStatCur, /* Index of VdbeCursor that writes the sqlite_stat1 table */ 107 int iMem /* Available memory locations begin here */ 108 ){ 109 sqlite3 *db = pParse->db; /* Database handle */ 110 Index *pIdx; /* An index to being analyzed */ 111 int iIdxCur; /* Cursor open on index being analyzed */ 112 Vdbe *v; /* The virtual machine being built up */ 113 int i; /* Loop counter */ 114 int topOfLoop; /* The top of the loop */ 115 int endOfLoop; /* The end of the loop */ 116 int addr; /* The address of an instruction */ 117 int iDb; /* Index of database containing pTab */ 118 int regTabname = iMem++; /* Register containing table name */ 119 int regIdxname = iMem++; /* Register containing index name */ 120 int regSampleno = iMem++; /* Register containing next sample number */ 121 int regCol = iMem++; /* Content of a column analyzed table */ 122 int regRec = iMem++; /* Register holding completed record */ 123 int regTemp = iMem++; /* Temporary use register */ 124 int regRowid = iMem++; /* Rowid for the inserted record */ 125 126 #ifdef SQLITE_ENABLE_STAT2 127 int regTemp2 = iMem++; /* Temporary use register */ 128 int regSamplerecno = iMem++; /* Index of next sample to record */ 129 int regRecno = iMem++; /* Current sample index */ 130 int regLast = iMem++; /* Index of last sample to record */ 131 int regFirst = iMem++; /* Index of first sample to record */ 132 #endif 133 134 v = sqlite3GetVdbe(pParse); 135 if( v==0 || NEVER(pTab==0) || pTab->pIndex==0 ){ 136 /* Do no analysis for tables that have no indices */ 137 return; 138 } 139 assert( sqlite3BtreeHoldsAllMutexes(db) ); 140 iDb = sqlite3SchemaToIndex(db, pTab->pSchema); 141 assert( iDb>=0 ); 142 #ifndef SQLITE_OMIT_AUTHORIZATION 143 if( sqlite3AuthCheck(pParse, SQLITE_ANALYZE, pTab->zName, 0, 144 db->aDb[iDb].zName ) ){ 145 return; 146 } 147 #endif 148 149 /* Establish a read-lock on the table at the shared-cache level. */ 150 sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); 151 152 iIdxCur = pParse->nTab++; 153 for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ 154 int nCol = pIdx->nColumn; 155 KeyInfo *pKey = sqlite3IndexKeyinfo(pParse, pIdx); 156 157 if( iMem+1+(nCol*2)>pParse->nMem ){ 158 pParse->nMem = iMem+1+(nCol*2); 159 } 160 161 /* Open a cursor to the index to be analyzed. */ 162 assert( iDb==sqlite3SchemaToIndex(db, pIdx->pSchema) ); 163 sqlite3VdbeAddOp4(v, OP_OpenRead, iIdxCur, pIdx->tnum, iDb, 164 (char *)pKey, P4_KEYINFO_HANDOFF); 165 VdbeComment((v, "%s", pIdx->zName)); 166 167 /* Populate the registers containing the table and index names. */ 168 if( pTab->pIndex==pIdx ){ 169 sqlite3VdbeAddOp4(v, OP_String8, 0, regTabname, 0, pTab->zName, 0); 170 } 171 sqlite3VdbeAddOp4(v, OP_String8, 0, regIdxname, 0, pIdx->zName, 0); 172 173 #ifdef SQLITE_ENABLE_STAT2 174 175 /* If this iteration of the loop is generating code to analyze the 176 ** first index in the pTab->pIndex list, then register regLast has 177 ** not been populated. In this case populate it now. */ 178 if( pTab->pIndex==pIdx ){ 179 sqlite3VdbeAddOp2(v, OP_Integer, SQLITE_INDEX_SAMPLES, regSamplerecno); 180 sqlite3VdbeAddOp2(v, OP_Integer, SQLITE_INDEX_SAMPLES*2-1, regTemp); 181 sqlite3VdbeAddOp2(v, OP_Integer, SQLITE_INDEX_SAMPLES*2, regTemp2); 182 183 sqlite3VdbeAddOp2(v, OP_Count, iIdxCur, regLast); 184 sqlite3VdbeAddOp2(v, OP_Null, 0, regFirst); 185 addr = sqlite3VdbeAddOp3(v, OP_Lt, regSamplerecno, 0, regLast); 186 sqlite3VdbeAddOp3(v, OP_Divide, regTemp2, regLast, regFirst); 187 sqlite3VdbeAddOp3(v, OP_Multiply, regLast, regTemp, regLast); 188 sqlite3VdbeAddOp2(v, OP_AddImm, regLast, SQLITE_INDEX_SAMPLES*2-2); 189 sqlite3VdbeAddOp3(v, OP_Divide, regTemp2, regLast, regLast); 190 sqlite3VdbeJumpHere(v, addr); 191 } 192 193 /* Zero the regSampleno and regRecno registers. */ 194 sqlite3VdbeAddOp2(v, OP_Integer, 0, regSampleno); 195 sqlite3VdbeAddOp2(v, OP_Integer, 0, regRecno); 196 sqlite3VdbeAddOp2(v, OP_Copy, regFirst, regSamplerecno); 197 #endif 198 199 /* The block of memory cells initialized here is used as follows. 200 ** 201 ** iMem: 202 ** The total number of rows in the table. 203 ** 204 ** iMem+1 .. iMem+nCol: 205 ** Number of distinct entries in index considering the 206 ** left-most N columns only, where N is between 1 and nCol, 207 ** inclusive. 208 ** 209 ** iMem+nCol+1 .. Mem+2*nCol: 210 ** Previous value of indexed columns, from left to right. 211 ** 212 ** Cells iMem through iMem+nCol are initialized to 0. The others are 213 ** initialized to contain an SQL NULL. 214 */ 215 for(i=0; i<=nCol; i++){ 216 sqlite3VdbeAddOp2(v, OP_Integer, 0, iMem+i); 217 } 218 for(i=0; i<nCol; i++){ 219 sqlite3VdbeAddOp2(v, OP_Null, 0, iMem+nCol+i+1); 220 } 221 222 /* Start the analysis loop. This loop runs through all the entries in 223 ** the index b-tree. */ 224 endOfLoop = sqlite3VdbeMakeLabel(v); 225 sqlite3VdbeAddOp2(v, OP_Rewind, iIdxCur, endOfLoop); 226 topOfLoop = sqlite3VdbeCurrentAddr(v); 227 sqlite3VdbeAddOp2(v, OP_AddImm, iMem, 1); 228 229 for(i=0; i<nCol; i++){ 230 sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, i, regCol); 231 #ifdef SQLITE_ENABLE_STAT2 232 if( i==0 ){ 233 /* Check if the record that cursor iIdxCur points to contains a 234 ** value that should be stored in the sqlite_stat2 table. If so, 235 ** store it. */ 236 int ne = sqlite3VdbeAddOp3(v, OP_Ne, regRecno, 0, regSamplerecno); 237 assert( regTabname+1==regIdxname 238 && regTabname+2==regSampleno 239 && regTabname+3==regCol 240 ); 241 sqlite3VdbeChangeP5(v, SQLITE_JUMPIFNULL); 242 sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 4, regRec, "aaab", 0); 243 sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur+1, regRowid); 244 sqlite3VdbeAddOp3(v, OP_Insert, iStatCur+1, regRec, regRowid); 245 246 /* Calculate new values for regSamplerecno and regSampleno. 247 ** 248 ** sampleno = sampleno + 1 249 ** samplerecno = samplerecno+(remaining records)/(remaining samples) 250 */ 251 sqlite3VdbeAddOp2(v, OP_AddImm, regSampleno, 1); 252 sqlite3VdbeAddOp3(v, OP_Subtract, regRecno, regLast, regTemp); 253 sqlite3VdbeAddOp2(v, OP_AddImm, regTemp, -1); 254 sqlite3VdbeAddOp2(v, OP_Integer, SQLITE_INDEX_SAMPLES, regTemp2); 255 sqlite3VdbeAddOp3(v, OP_Subtract, regSampleno, regTemp2, regTemp2); 256 sqlite3VdbeAddOp3(v, OP_Divide, regTemp2, regTemp, regTemp); 257 sqlite3VdbeAddOp3(v, OP_Add, regSamplerecno, regTemp, regSamplerecno); 258 259 sqlite3VdbeJumpHere(v, ne); 260 sqlite3VdbeAddOp2(v, OP_AddImm, regRecno, 1); 261 } 262 #endif 263 264 sqlite3VdbeAddOp3(v, OP_Ne, regCol, 0, iMem+nCol+i+1); 265 /**** TODO: add collating sequence *****/ 266 sqlite3VdbeChangeP5(v, SQLITE_JUMPIFNULL); 267 } 268 if( db->mallocFailed ){ 269 /* If a malloc failure has occurred, then the result of the expression 270 ** passed as the second argument to the call to sqlite3VdbeJumpHere() 271 ** below may be negative. Which causes an assert() to fail (or an 272 ** out-of-bounds write if SQLITE_DEBUG is not defined). */ 273 return; 274 } 275 sqlite3VdbeAddOp2(v, OP_Goto, 0, endOfLoop); 276 for(i=0; i<nCol; i++){ 277 sqlite3VdbeJumpHere(v, sqlite3VdbeCurrentAddr(v)-(nCol*2)); 278 sqlite3VdbeAddOp2(v, OP_AddImm, iMem+i+1, 1); 279 sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, i, iMem+nCol+i+1); 280 } 281 282 /* End of the analysis loop. */ 283 sqlite3VdbeResolveLabel(v, endOfLoop); 284 sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, topOfLoop); 285 sqlite3VdbeAddOp1(v, OP_Close, iIdxCur); 286 287 /* Store the results in sqlite_stat1. 288 ** 289 ** The result is a single row of the sqlite_stat1 table. The first 290 ** two columns are the names of the table and index. The third column 291 ** is a string composed of a list of integer statistics about the 292 ** index. The first integer in the list is the total number of entries 293 ** in the index. There is one additional integer in the list for each 294 ** column of the table. This additional integer is a guess of how many 295 ** rows of the table the index will select. If D is the count of distinct 296 ** values and K is the total number of rows, then the integer is computed 297 ** as: 298 ** 299 ** I = (K+D-1)/D 300 ** 301 ** If K==0 then no entry is made into the sqlite_stat1 table. 302 ** If K>0 then it is always the case the D>0 so division by zero 303 ** is never possible. 304 */ 305 addr = sqlite3VdbeAddOp1(v, OP_IfNot, iMem); 306 sqlite3VdbeAddOp2(v, OP_SCopy, iMem, regSampleno); 307 for(i=0; i<nCol; i++){ 308 sqlite3VdbeAddOp4(v, OP_String8, 0, regTemp, 0, " ", 0); 309 sqlite3VdbeAddOp3(v, OP_Concat, regTemp, regSampleno, regSampleno); 310 sqlite3VdbeAddOp3(v, OP_Add, iMem, iMem+i+1, regTemp); 311 sqlite3VdbeAddOp2(v, OP_AddImm, regTemp, -1); 312 sqlite3VdbeAddOp3(v, OP_Divide, iMem+i+1, regTemp, regTemp); 313 sqlite3VdbeAddOp1(v, OP_ToInt, regTemp); 314 sqlite3VdbeAddOp3(v, OP_Concat, regTemp, regSampleno, regSampleno); 315 } 316 sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 3, regRec, "aaa", 0); 317 sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur, regRowid); 318 sqlite3VdbeAddOp3(v, OP_Insert, iStatCur, regRec, regRowid); 319 sqlite3VdbeChangeP5(v, OPFLAG_APPEND); 320 sqlite3VdbeJumpHere(v, addr); 321 } 322 } 323 324 /* 325 ** Generate code that will cause the most recent index analysis to 326 ** be laoded into internal hash tables where is can be used. 327 */ 328 static void loadAnalysis(Parse *pParse, int iDb){ 329 Vdbe *v = sqlite3GetVdbe(pParse); 330 if( v ){ 331 sqlite3VdbeAddOp1(v, OP_LoadAnalysis, iDb); 332 } 333 } 334 335 /* 336 ** Generate code that will do an analysis of an entire database 337 */ 338 static void analyzeDatabase(Parse *pParse, int iDb){ 339 sqlite3 *db = pParse->db; 340 Schema *pSchema = db->aDb[iDb].pSchema; /* Schema of database iDb */ 341 HashElem *k; 342 int iStatCur; 343 int iMem; 344 345 sqlite3BeginWriteOperation(pParse, 0, iDb); 346 iStatCur = pParse->nTab; 347 pParse->nTab += 2; 348 openStatTable(pParse, iDb, iStatCur, 0); 349 iMem = pParse->nMem+1; 350 for(k=sqliteHashFirst(&pSchema->tblHash); k; k=sqliteHashNext(k)){ 351 Table *pTab = (Table*)sqliteHashData(k); 352 analyzeOneTable(pParse, pTab, iStatCur, iMem); 353 } 354 loadAnalysis(pParse, iDb); 355 } 356 357 /* 358 ** Generate code that will do an analysis of a single table in 359 ** a database. 360 */ 361 static void analyzeTable(Parse *pParse, Table *pTab){ 362 int iDb; 363 int iStatCur; 364 365 assert( pTab!=0 ); 366 assert( sqlite3BtreeHoldsAllMutexes(pParse->db) ); 367 iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); 368 sqlite3BeginWriteOperation(pParse, 0, iDb); 369 iStatCur = pParse->nTab; 370 pParse->nTab += 2; 371 openStatTable(pParse, iDb, iStatCur, pTab->zName); 372 analyzeOneTable(pParse, pTab, iStatCur, pParse->nMem+1); 373 loadAnalysis(pParse, iDb); 374 } 375 376 /* 377 ** Generate code for the ANALYZE command. The parser calls this routine 378 ** when it recognizes an ANALYZE command. 379 ** 380 ** ANALYZE -- 1 381 ** ANALYZE <database> -- 2 382 ** ANALYZE ?<database>.?<tablename> -- 3 383 ** 384 ** Form 1 causes all indices in all attached databases to be analyzed. 385 ** Form 2 analyzes all indices the single database named. 386 ** Form 3 analyzes all indices associated with the named table. 387 */ 388 void sqlite3Analyze(Parse *pParse, Token *pName1, Token *pName2){ 389 sqlite3 *db = pParse->db; 390 int iDb; 391 int i; 392 char *z, *zDb; 393 Table *pTab; 394 Token *pTableName; 395 396 /* Read the database schema. If an error occurs, leave an error message 397 ** and code in pParse and return NULL. */ 398 assert( sqlite3BtreeHoldsAllMutexes(pParse->db) ); 399 if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ 400 return; 401 } 402 403 assert( pName2!=0 || pName1==0 ); 404 if( pName1==0 ){ 405 /* Form 1: Analyze everything */ 406 for(i=0; i<db->nDb; i++){ 407 if( i==1 ) continue; /* Do not analyze the TEMP database */ 408 analyzeDatabase(pParse, i); 409 } 410 }else if( pName2->n==0 ){ 411 /* Form 2: Analyze the database or table named */ 412 iDb = sqlite3FindDb(db, pName1); 413 if( iDb>=0 ){ 414 analyzeDatabase(pParse, iDb); 415 }else{ 416 z = sqlite3NameFromToken(db, pName1); 417 if( z ){ 418 pTab = sqlite3LocateTable(pParse, 0, z, 0); 419 sqlite3DbFree(db, z); 420 if( pTab ){ 421 analyzeTable(pParse, pTab); 422 } 423 } 424 } 425 }else{ 426 /* Form 3: Analyze the fully qualified table name */ 427 iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pTableName); 428 if( iDb>=0 ){ 429 zDb = db->aDb[iDb].zName; 430 z = sqlite3NameFromToken(db, pTableName); 431 if( z ){ 432 pTab = sqlite3LocateTable(pParse, 0, z, zDb); 433 sqlite3DbFree(db, z); 434 if( pTab ){ 435 analyzeTable(pParse, pTab); 436 } 437 } 438 } 439 } 440 } 441 442 /* 443 ** Used to pass information from the analyzer reader through to the 444 ** callback routine. 445 */ 446 typedef struct analysisInfo analysisInfo; 447 struct analysisInfo { 448 sqlite3 *db; 449 const char *zDatabase; 450 }; 451 452 /* 453 ** This callback is invoked once for each index when reading the 454 ** sqlite_stat1 table. 455 ** 456 ** argv[0] = name of the index 457 ** argv[1] = results of analysis - on integer for each column 458 */ 459 static int analysisLoader(void *pData, int argc, char **argv, char **NotUsed){ 460 analysisInfo *pInfo = (analysisInfo*)pData; 461 Index *pIndex; 462 int i, c; 463 unsigned int v; 464 const char *z; 465 466 assert( argc==2 ); 467 UNUSED_PARAMETER2(NotUsed, argc); 468 469 if( argv==0 || argv[0]==0 || argv[1]==0 ){ 470 return 0; 471 } 472 pIndex = sqlite3FindIndex(pInfo->db, argv[0], pInfo->zDatabase); 473 if( pIndex==0 ){ 474 return 0; 475 } 476 z = argv[1]; 477 for(i=0; *z && i<=pIndex->nColumn; i++){ 478 v = 0; 479 while( (c=z[0])>='0' && c<='9' ){ 480 v = v*10 + c - '0'; 481 z++; 482 } 483 pIndex->aiRowEst[i] = v; 484 if( *z==' ' ) z++; 485 } 486 return 0; 487 } 488 489 /* 490 ** If the Index.aSample variable is not NULL, delete the aSample[] array 491 ** and its contents. 492 */ 493 void sqlite3DeleteIndexSamples(sqlite3 *db, Index *pIdx){ 494 #ifdef SQLITE_ENABLE_STAT2 495 if( pIdx->aSample ){ 496 int j; 497 for(j=0; j<SQLITE_INDEX_SAMPLES; j++){ 498 IndexSample *p = &pIdx->aSample[j]; 499 if( p->eType==SQLITE_TEXT || p->eType==SQLITE_BLOB ){ 500 sqlite3DbFree(db, p->u.z); 501 } 502 } 503 sqlite3DbFree(db, pIdx->aSample); 504 } 505 #else 506 UNUSED_PARAMETER(db); 507 UNUSED_PARAMETER(pIdx); 508 #endif 509 } 510 511 /* 512 ** Load the content of the sqlite_stat1 and sqlite_stat2 tables. The 513 ** contents of sqlite_stat1 are used to populate the Index.aiRowEst[] 514 ** arrays. The contents of sqlite_stat2 are used to populate the 515 ** Index.aSample[] arrays. 516 ** 517 ** If the sqlite_stat1 table is not present in the database, SQLITE_ERROR 518 ** is returned. In this case, even if SQLITE_ENABLE_STAT2 was defined 519 ** during compilation and the sqlite_stat2 table is present, no data is 520 ** read from it. 521 ** 522 ** If SQLITE_ENABLE_STAT2 was defined during compilation and the 523 ** sqlite_stat2 table is not present in the database, SQLITE_ERROR is 524 ** returned. However, in this case, data is read from the sqlite_stat1 525 ** table (if it is present) before returning. 526 ** 527 ** If an OOM error occurs, this function always sets db->mallocFailed. 528 ** This means if the caller does not care about other errors, the return 529 ** code may be ignored. 530 */ 531 int sqlite3AnalysisLoad(sqlite3 *db, int iDb){ 532 analysisInfo sInfo; 533 HashElem *i; 534 char *zSql; 535 int rc; 536 537 assert( iDb>=0 && iDb<db->nDb ); 538 assert( db->aDb[iDb].pBt!=0 ); 539 assert( sqlite3BtreeHoldsMutex(db->aDb[iDb].pBt) ); 540 541 /* Clear any prior statistics */ 542 for(i=sqliteHashFirst(&db->aDb[iDb].pSchema->idxHash);i;i=sqliteHashNext(i)){ 543 Index *pIdx = sqliteHashData(i); 544 sqlite3DefaultRowEst(pIdx); 545 sqlite3DeleteIndexSamples(db, pIdx); 546 pIdx->aSample = 0; 547 } 548 549 /* Check to make sure the sqlite_stat1 table exists */ 550 sInfo.db = db; 551 sInfo.zDatabase = db->aDb[iDb].zName; 552 if( sqlite3FindTable(db, "sqlite_stat1", sInfo.zDatabase)==0 ){ 553 return SQLITE_ERROR; 554 } 555 556 /* Load new statistics out of the sqlite_stat1 table */ 557 zSql = sqlite3MPrintf(db, 558 "SELECT idx, stat FROM %Q.sqlite_stat1", sInfo.zDatabase); 559 if( zSql==0 ){ 560 rc = SQLITE_NOMEM; 561 }else{ 562 rc = sqlite3_exec(db, zSql, analysisLoader, &sInfo, 0); 563 sqlite3DbFree(db, zSql); 564 } 565 566 567 /* Load the statistics from the sqlite_stat2 table. */ 568 #ifdef SQLITE_ENABLE_STAT2 569 if( rc==SQLITE_OK && !sqlite3FindTable(db, "sqlite_stat2", sInfo.zDatabase) ){ 570 rc = SQLITE_ERROR; 571 } 572 if( rc==SQLITE_OK ){ 573 sqlite3_stmt *pStmt = 0; 574 575 zSql = sqlite3MPrintf(db, 576 "SELECT idx,sampleno,sample FROM %Q.sqlite_stat2", sInfo.zDatabase); 577 if( !zSql ){ 578 rc = SQLITE_NOMEM; 579 }else{ 580 rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0); 581 sqlite3DbFree(db, zSql); 582 } 583 584 if( rc==SQLITE_OK ){ 585 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 586 char *zIndex = (char *)sqlite3_column_text(pStmt, 0); 587 Index *pIdx = sqlite3FindIndex(db, zIndex, sInfo.zDatabase); 588 if( pIdx ){ 589 int iSample = sqlite3_column_int(pStmt, 1); 590 if( iSample<SQLITE_INDEX_SAMPLES && iSample>=0 ){ 591 int eType = sqlite3_column_type(pStmt, 2); 592 593 if( pIdx->aSample==0 ){ 594 static const int sz = sizeof(IndexSample)*SQLITE_INDEX_SAMPLES; 595 pIdx->aSample = (IndexSample *)sqlite3DbMallocRaw(0, sz); 596 if( pIdx->aSample==0 ){ 597 db->mallocFailed = 1; 598 break; 599 } 600 memset(pIdx->aSample, 0, sz); 601 } 602 603 assert( pIdx->aSample ); 604 { 605 IndexSample *pSample = &pIdx->aSample[iSample]; 606 pSample->eType = (u8)eType; 607 if( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT ){ 608 pSample->u.r = sqlite3_column_double(pStmt, 2); 609 }else if( eType==SQLITE_TEXT || eType==SQLITE_BLOB ){ 610 const char *z = (const char *)( 611 (eType==SQLITE_BLOB) ? 612 sqlite3_column_blob(pStmt, 2): 613 sqlite3_column_text(pStmt, 2) 614 ); 615 int n = sqlite3_column_bytes(pStmt, 2); 616 if( n>24 ){ 617 n = 24; 618 } 619 pSample->nByte = (u8)n; 620 if( n < 1){ 621 pSample->u.z = 0; 622 }else{ 623 pSample->u.z = sqlite3DbStrNDup(0, z, n); 624 if( pSample->u.z==0 ){ 625 db->mallocFailed = 1; 626 break; 627 } 628 } 629 } 630 } 631 } 632 } 633 } 634 rc = sqlite3_finalize(pStmt); 635 } 636 } 637 #endif 638 639 if( rc==SQLITE_NOMEM ){ 640 db->mallocFailed = 1; 641 } 642 return rc; 643 } 644 645 646 #endif /* SQLITE_OMIT_ANALYZE */ 647