1 /* 2 ** 2017 April 09 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 */ 13 #include "sqlite3expert.h" 14 #include <assert.h> 15 #include <string.h> 16 #include <stdio.h> 17 18 #ifndef SQLITE_OMIT_VIRTUALTABLE 19 20 typedef sqlite3_int64 i64; 21 typedef sqlite3_uint64 u64; 22 23 typedef struct IdxColumn IdxColumn; 24 typedef struct IdxConstraint IdxConstraint; 25 typedef struct IdxScan IdxScan; 26 typedef struct IdxStatement IdxStatement; 27 typedef struct IdxTable IdxTable; 28 typedef struct IdxWrite IdxWrite; 29 30 #define STRLEN (int)strlen 31 32 /* 33 ** A temp table name that we assume no user database will actually use. 34 ** If this assumption proves incorrect triggers on the table with the 35 ** conflicting name will be ignored. 36 */ 37 #define UNIQUE_TABLE_NAME "t592690916721053953805701627921227776" 38 39 /* 40 ** A single constraint. Equivalent to either "col = ?" or "col < ?" (or 41 ** any other type of single-ended range constraint on a column). 42 ** 43 ** pLink: 44 ** Used to temporarily link IdxConstraint objects into lists while 45 ** creating candidate indexes. 46 */ 47 struct IdxConstraint { 48 char *zColl; /* Collation sequence */ 49 int bRange; /* True for range, false for eq */ 50 int iCol; /* Constrained table column */ 51 int bFlag; /* Used by idxFindCompatible() */ 52 int bDesc; /* True if ORDER BY <expr> DESC */ 53 IdxConstraint *pNext; /* Next constraint in pEq or pRange list */ 54 IdxConstraint *pLink; /* See above */ 55 }; 56 57 /* 58 ** A single scan of a single table. 59 */ 60 struct IdxScan { 61 IdxTable *pTab; /* Associated table object */ 62 int iDb; /* Database containing table zTable */ 63 i64 covering; /* Mask of columns required for cov. index */ 64 IdxConstraint *pOrder; /* ORDER BY columns */ 65 IdxConstraint *pEq; /* List of == constraints */ 66 IdxConstraint *pRange; /* List of < constraints */ 67 IdxScan *pNextScan; /* Next IdxScan object for same analysis */ 68 }; 69 70 /* 71 ** Information regarding a single database table. Extracted from 72 ** "PRAGMA table_info" by function idxGetTableInfo(). 73 */ 74 struct IdxColumn { 75 char *zName; 76 char *zColl; 77 int iPk; 78 }; 79 struct IdxTable { 80 int nCol; 81 char *zName; /* Table name */ 82 IdxColumn *aCol; 83 IdxTable *pNext; /* Next table in linked list of all tables */ 84 }; 85 86 /* 87 ** An object of the following type is created for each unique table/write-op 88 ** seen. The objects are stored in a singly-linked list beginning at 89 ** sqlite3expert.pWrite. 90 */ 91 struct IdxWrite { 92 IdxTable *pTab; 93 int eOp; /* SQLITE_UPDATE, DELETE or INSERT */ 94 IdxWrite *pNext; 95 }; 96 97 /* 98 ** Each statement being analyzed is represented by an instance of this 99 ** structure. 100 */ 101 struct IdxStatement { 102 int iId; /* Statement number */ 103 char *zSql; /* SQL statement */ 104 char *zIdx; /* Indexes */ 105 char *zEQP; /* Plan */ 106 IdxStatement *pNext; 107 }; 108 109 110 /* 111 ** A hash table for storing strings. With space for a payload string 112 ** with each entry. Methods are: 113 ** 114 ** idxHashInit() 115 ** idxHashClear() 116 ** idxHashAdd() 117 ** idxHashSearch() 118 */ 119 #define IDX_HASH_SIZE 1023 120 typedef struct IdxHashEntry IdxHashEntry; 121 typedef struct IdxHash IdxHash; 122 struct IdxHashEntry { 123 char *zKey; /* nul-terminated key */ 124 char *zVal; /* nul-terminated value string */ 125 char *zVal2; /* nul-terminated value string 2 */ 126 IdxHashEntry *pHashNext; /* Next entry in same hash bucket */ 127 IdxHashEntry *pNext; /* Next entry in hash */ 128 }; 129 struct IdxHash { 130 IdxHashEntry *pFirst; 131 IdxHashEntry *aHash[IDX_HASH_SIZE]; 132 }; 133 134 /* 135 ** sqlite3expert object. 136 */ 137 struct sqlite3expert { 138 int iSample; /* Percentage of tables to sample for stat1 */ 139 sqlite3 *db; /* User database */ 140 sqlite3 *dbm; /* In-memory db for this analysis */ 141 sqlite3 *dbv; /* Vtab schema for this analysis */ 142 IdxTable *pTable; /* List of all IdxTable objects */ 143 IdxScan *pScan; /* List of scan objects */ 144 IdxWrite *pWrite; /* List of write objects */ 145 IdxStatement *pStatement; /* List of IdxStatement objects */ 146 int bRun; /* True once analysis has run */ 147 char **pzErrmsg; 148 int rc; /* Error code from whereinfo hook */ 149 IdxHash hIdx; /* Hash containing all candidate indexes */ 150 char *zCandidates; /* For EXPERT_REPORT_CANDIDATES */ 151 }; 152 153 154 /* 155 ** Allocate and return nByte bytes of zeroed memory using sqlite3_malloc(). 156 ** If the allocation fails, set *pRc to SQLITE_NOMEM and return NULL. 157 */ 158 static void *idxMalloc(int *pRc, int nByte){ 159 void *pRet; 160 assert( *pRc==SQLITE_OK ); 161 assert( nByte>0 ); 162 pRet = sqlite3_malloc(nByte); 163 if( pRet ){ 164 memset(pRet, 0, nByte); 165 }else{ 166 *pRc = SQLITE_NOMEM; 167 } 168 return pRet; 169 } 170 171 /* 172 ** Initialize an IdxHash hash table. 173 */ 174 static void idxHashInit(IdxHash *pHash){ 175 memset(pHash, 0, sizeof(IdxHash)); 176 } 177 178 /* 179 ** Reset an IdxHash hash table. 180 */ 181 static void idxHashClear(IdxHash *pHash){ 182 int i; 183 for(i=0; i<IDX_HASH_SIZE; i++){ 184 IdxHashEntry *pEntry; 185 IdxHashEntry *pNext; 186 for(pEntry=pHash->aHash[i]; pEntry; pEntry=pNext){ 187 pNext = pEntry->pHashNext; 188 sqlite3_free(pEntry->zVal2); 189 sqlite3_free(pEntry); 190 } 191 } 192 memset(pHash, 0, sizeof(IdxHash)); 193 } 194 195 /* 196 ** Return the index of the hash bucket that the string specified by the 197 ** arguments to this function belongs. 198 */ 199 static int idxHashString(const char *z, int n){ 200 unsigned int ret = 0; 201 int i; 202 for(i=0; i<n; i++){ 203 ret += (ret<<3) + (unsigned char)(z[i]); 204 } 205 return (int)(ret % IDX_HASH_SIZE); 206 } 207 208 /* 209 ** If zKey is already present in the hash table, return non-zero and do 210 ** nothing. Otherwise, add an entry with key zKey and payload string zVal to 211 ** the hash table passed as the second argument. 212 */ 213 static int idxHashAdd( 214 int *pRc, 215 IdxHash *pHash, 216 const char *zKey, 217 const char *zVal 218 ){ 219 int nKey = STRLEN(zKey); 220 int iHash = idxHashString(zKey, nKey); 221 int nVal = (zVal ? STRLEN(zVal) : 0); 222 IdxHashEntry *pEntry; 223 assert( iHash>=0 ); 224 for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){ 225 if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){ 226 return 1; 227 } 228 } 229 pEntry = idxMalloc(pRc, sizeof(IdxHashEntry) + nKey+1 + nVal+1); 230 if( pEntry ){ 231 pEntry->zKey = (char*)&pEntry[1]; 232 memcpy(pEntry->zKey, zKey, nKey); 233 if( zVal ){ 234 pEntry->zVal = &pEntry->zKey[nKey+1]; 235 memcpy(pEntry->zVal, zVal, nVal); 236 } 237 pEntry->pHashNext = pHash->aHash[iHash]; 238 pHash->aHash[iHash] = pEntry; 239 240 pEntry->pNext = pHash->pFirst; 241 pHash->pFirst = pEntry; 242 } 243 return 0; 244 } 245 246 /* 247 ** If zKey/nKey is present in the hash table, return a pointer to the 248 ** hash-entry object. 249 */ 250 static IdxHashEntry *idxHashFind(IdxHash *pHash, const char *zKey, int nKey){ 251 int iHash; 252 IdxHashEntry *pEntry; 253 if( nKey<0 ) nKey = STRLEN(zKey); 254 iHash = idxHashString(zKey, nKey); 255 assert( iHash>=0 ); 256 for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){ 257 if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){ 258 return pEntry; 259 } 260 } 261 return 0; 262 } 263 264 /* 265 ** If the hash table contains an entry with a key equal to the string 266 ** passed as the final two arguments to this function, return a pointer 267 ** to the payload string. Otherwise, if zKey/nKey is not present in the 268 ** hash table, return NULL. 269 */ 270 static const char *idxHashSearch(IdxHash *pHash, const char *zKey, int nKey){ 271 IdxHashEntry *pEntry = idxHashFind(pHash, zKey, nKey); 272 if( pEntry ) return pEntry->zVal; 273 return 0; 274 } 275 276 /* 277 ** Allocate and return a new IdxConstraint object. Set the IdxConstraint.zColl 278 ** variable to point to a copy of nul-terminated string zColl. 279 */ 280 static IdxConstraint *idxNewConstraint(int *pRc, const char *zColl){ 281 IdxConstraint *pNew; 282 int nColl = STRLEN(zColl); 283 284 assert( *pRc==SQLITE_OK ); 285 pNew = (IdxConstraint*)idxMalloc(pRc, sizeof(IdxConstraint) * nColl + 1); 286 if( pNew ){ 287 pNew->zColl = (char*)&pNew[1]; 288 memcpy(pNew->zColl, zColl, nColl+1); 289 } 290 return pNew; 291 } 292 293 /* 294 ** An error associated with database handle db has just occurred. Pass 295 ** the error message to callback function xOut. 296 */ 297 static void idxDatabaseError( 298 sqlite3 *db, /* Database handle */ 299 char **pzErrmsg /* Write error here */ 300 ){ 301 *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db)); 302 } 303 304 /* 305 ** Prepare an SQL statement. 306 */ 307 static int idxPrepareStmt( 308 sqlite3 *db, /* Database handle to compile against */ 309 sqlite3_stmt **ppStmt, /* OUT: Compiled SQL statement */ 310 char **pzErrmsg, /* OUT: sqlite3_malloc()ed error message */ 311 const char *zSql /* SQL statement to compile */ 312 ){ 313 int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0); 314 if( rc!=SQLITE_OK ){ 315 *ppStmt = 0; 316 idxDatabaseError(db, pzErrmsg); 317 } 318 return rc; 319 } 320 321 /* 322 ** Prepare an SQL statement using the results of a printf() formatting. 323 */ 324 static int idxPrintfPrepareStmt( 325 sqlite3 *db, /* Database handle to compile against */ 326 sqlite3_stmt **ppStmt, /* OUT: Compiled SQL statement */ 327 char **pzErrmsg, /* OUT: sqlite3_malloc()ed error message */ 328 const char *zFmt, /* printf() format of SQL statement */ 329 ... /* Trailing printf() arguments */ 330 ){ 331 va_list ap; 332 int rc; 333 char *zSql; 334 va_start(ap, zFmt); 335 zSql = sqlite3_vmprintf(zFmt, ap); 336 if( zSql==0 ){ 337 rc = SQLITE_NOMEM; 338 }else{ 339 rc = idxPrepareStmt(db, ppStmt, pzErrmsg, zSql); 340 sqlite3_free(zSql); 341 } 342 va_end(ap); 343 return rc; 344 } 345 346 347 /************************************************************************* 348 ** Beginning of virtual table implementation. 349 */ 350 typedef struct ExpertVtab ExpertVtab; 351 struct ExpertVtab { 352 sqlite3_vtab base; 353 IdxTable *pTab; 354 sqlite3expert *pExpert; 355 }; 356 357 typedef struct ExpertCsr ExpertCsr; 358 struct ExpertCsr { 359 sqlite3_vtab_cursor base; 360 sqlite3_stmt *pData; 361 }; 362 363 static char *expertDequote(const char *zIn){ 364 int n = STRLEN(zIn); 365 char *zRet = sqlite3_malloc(n); 366 367 assert( zIn[0]=='\'' ); 368 assert( zIn[n-1]=='\'' ); 369 370 if( zRet ){ 371 int iOut = 0; 372 int iIn = 0; 373 for(iIn=1; iIn<(n-1); iIn++){ 374 if( zIn[iIn]=='\'' ){ 375 assert( zIn[iIn+1]=='\'' ); 376 iIn++; 377 } 378 zRet[iOut++] = zIn[iIn]; 379 } 380 zRet[iOut] = '\0'; 381 } 382 383 return zRet; 384 } 385 386 /* 387 ** This function is the implementation of both the xConnect and xCreate 388 ** methods of the r-tree virtual table. 389 ** 390 ** argv[0] -> module name 391 ** argv[1] -> database name 392 ** argv[2] -> table name 393 ** argv[...] -> column names... 394 */ 395 static int expertConnect( 396 sqlite3 *db, 397 void *pAux, 398 int argc, const char *const*argv, 399 sqlite3_vtab **ppVtab, 400 char **pzErr 401 ){ 402 sqlite3expert *pExpert = (sqlite3expert*)pAux; 403 ExpertVtab *p = 0; 404 int rc; 405 406 if( argc!=4 ){ 407 *pzErr = sqlite3_mprintf("internal error!"); 408 rc = SQLITE_ERROR; 409 }else{ 410 char *zCreateTable = expertDequote(argv[3]); 411 if( zCreateTable ){ 412 rc = sqlite3_declare_vtab(db, zCreateTable); 413 if( rc==SQLITE_OK ){ 414 p = idxMalloc(&rc, sizeof(ExpertVtab)); 415 } 416 if( rc==SQLITE_OK ){ 417 p->pExpert = pExpert; 418 p->pTab = pExpert->pTable; 419 assert( sqlite3_stricmp(p->pTab->zName, argv[2])==0 ); 420 } 421 sqlite3_free(zCreateTable); 422 }else{ 423 rc = SQLITE_NOMEM; 424 } 425 } 426 427 *ppVtab = (sqlite3_vtab*)p; 428 return rc; 429 } 430 431 static int expertDisconnect(sqlite3_vtab *pVtab){ 432 ExpertVtab *p = (ExpertVtab*)pVtab; 433 sqlite3_free(p); 434 return SQLITE_OK; 435 } 436 437 static int expertBestIndex(sqlite3_vtab *pVtab, sqlite3_index_info *pIdxInfo){ 438 ExpertVtab *p = (ExpertVtab*)pVtab; 439 int rc = SQLITE_OK; 440 int n = 0; 441 IdxScan *pScan; 442 const int opmask = 443 SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_GT | 444 SQLITE_INDEX_CONSTRAINT_LT | SQLITE_INDEX_CONSTRAINT_GE | 445 SQLITE_INDEX_CONSTRAINT_LE; 446 447 pScan = idxMalloc(&rc, sizeof(IdxScan)); 448 if( pScan ){ 449 int i; 450 451 /* Link the new scan object into the list */ 452 pScan->pTab = p->pTab; 453 pScan->pNextScan = p->pExpert->pScan; 454 p->pExpert->pScan = pScan; 455 456 /* Add the constraints to the IdxScan object */ 457 for(i=0; i<pIdxInfo->nConstraint; i++){ 458 struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i]; 459 if( pCons->usable 460 && pCons->iColumn>=0 461 && p->pTab->aCol[pCons->iColumn].iPk==0 462 && (pCons->op & opmask) 463 ){ 464 IdxConstraint *pNew; 465 const char *zColl = sqlite3_vtab_collation(pIdxInfo, i); 466 pNew = idxNewConstraint(&rc, zColl); 467 if( pNew ){ 468 pNew->iCol = pCons->iColumn; 469 if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){ 470 pNew->pNext = pScan->pEq; 471 pScan->pEq = pNew; 472 }else{ 473 pNew->bRange = 1; 474 pNew->pNext = pScan->pRange; 475 pScan->pRange = pNew; 476 } 477 } 478 n++; 479 pIdxInfo->aConstraintUsage[i].argvIndex = n; 480 } 481 } 482 483 /* Add the ORDER BY to the IdxScan object */ 484 for(i=pIdxInfo->nOrderBy-1; i>=0; i--){ 485 int iCol = pIdxInfo->aOrderBy[i].iColumn; 486 if( iCol>=0 ){ 487 IdxConstraint *pNew = idxNewConstraint(&rc, p->pTab->aCol[iCol].zColl); 488 if( pNew ){ 489 pNew->iCol = iCol; 490 pNew->bDesc = pIdxInfo->aOrderBy[i].desc; 491 pNew->pNext = pScan->pOrder; 492 pNew->pLink = pScan->pOrder; 493 pScan->pOrder = pNew; 494 n++; 495 } 496 } 497 } 498 } 499 500 pIdxInfo->estimatedCost = 1000000.0 / (n+1); 501 return rc; 502 } 503 504 static int expertUpdate( 505 sqlite3_vtab *pVtab, 506 int nData, 507 sqlite3_value **azData, 508 sqlite_int64 *pRowid 509 ){ 510 (void)pVtab; 511 (void)nData; 512 (void)azData; 513 (void)pRowid; 514 return SQLITE_OK; 515 } 516 517 /* 518 ** Virtual table module xOpen method. 519 */ 520 static int expertOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ 521 int rc = SQLITE_OK; 522 ExpertCsr *pCsr; 523 (void)pVTab; 524 pCsr = idxMalloc(&rc, sizeof(ExpertCsr)); 525 *ppCursor = (sqlite3_vtab_cursor*)pCsr; 526 return rc; 527 } 528 529 /* 530 ** Virtual table module xClose method. 531 */ 532 static int expertClose(sqlite3_vtab_cursor *cur){ 533 ExpertCsr *pCsr = (ExpertCsr*)cur; 534 sqlite3_finalize(pCsr->pData); 535 sqlite3_free(pCsr); 536 return SQLITE_OK; 537 } 538 539 /* 540 ** Virtual table module xEof method. 541 ** 542 ** Return non-zero if the cursor does not currently point to a valid 543 ** record (i.e if the scan has finished), or zero otherwise. 544 */ 545 static int expertEof(sqlite3_vtab_cursor *cur){ 546 ExpertCsr *pCsr = (ExpertCsr*)cur; 547 return pCsr->pData==0; 548 } 549 550 /* 551 ** Virtual table module xNext method. 552 */ 553 static int expertNext(sqlite3_vtab_cursor *cur){ 554 ExpertCsr *pCsr = (ExpertCsr*)cur; 555 int rc = SQLITE_OK; 556 557 assert( pCsr->pData ); 558 rc = sqlite3_step(pCsr->pData); 559 if( rc!=SQLITE_ROW ){ 560 rc = sqlite3_finalize(pCsr->pData); 561 pCsr->pData = 0; 562 }else{ 563 rc = SQLITE_OK; 564 } 565 566 return rc; 567 } 568 569 /* 570 ** Virtual table module xRowid method. 571 */ 572 static int expertRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ 573 (void)cur; 574 *pRowid = 0; 575 return SQLITE_OK; 576 } 577 578 /* 579 ** Virtual table module xColumn method. 580 */ 581 static int expertColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){ 582 ExpertCsr *pCsr = (ExpertCsr*)cur; 583 sqlite3_value *pVal; 584 pVal = sqlite3_column_value(pCsr->pData, i); 585 if( pVal ){ 586 sqlite3_result_value(ctx, pVal); 587 } 588 return SQLITE_OK; 589 } 590 591 /* 592 ** Virtual table module xFilter method. 593 */ 594 static int expertFilter( 595 sqlite3_vtab_cursor *cur, 596 int idxNum, const char *idxStr, 597 int argc, sqlite3_value **argv 598 ){ 599 ExpertCsr *pCsr = (ExpertCsr*)cur; 600 ExpertVtab *pVtab = (ExpertVtab*)(cur->pVtab); 601 sqlite3expert *pExpert = pVtab->pExpert; 602 int rc; 603 604 (void)idxNum; 605 (void)idxStr; 606 (void)argc; 607 (void)argv; 608 rc = sqlite3_finalize(pCsr->pData); 609 pCsr->pData = 0; 610 if( rc==SQLITE_OK ){ 611 rc = idxPrintfPrepareStmt(pExpert->db, &pCsr->pData, &pVtab->base.zErrMsg, 612 "SELECT * FROM main.%Q WHERE sample()", pVtab->pTab->zName 613 ); 614 } 615 616 if( rc==SQLITE_OK ){ 617 rc = expertNext(cur); 618 } 619 return rc; 620 } 621 622 static int idxRegisterVtab(sqlite3expert *p){ 623 static sqlite3_module expertModule = { 624 2, /* iVersion */ 625 expertConnect, /* xCreate - create a table */ 626 expertConnect, /* xConnect - connect to an existing table */ 627 expertBestIndex, /* xBestIndex - Determine search strategy */ 628 expertDisconnect, /* xDisconnect - Disconnect from a table */ 629 expertDisconnect, /* xDestroy - Drop a table */ 630 expertOpen, /* xOpen - open a cursor */ 631 expertClose, /* xClose - close a cursor */ 632 expertFilter, /* xFilter - configure scan constraints */ 633 expertNext, /* xNext - advance a cursor */ 634 expertEof, /* xEof */ 635 expertColumn, /* xColumn - read data */ 636 expertRowid, /* xRowid - read data */ 637 expertUpdate, /* xUpdate - write data */ 638 0, /* xBegin - begin transaction */ 639 0, /* xSync - sync transaction */ 640 0, /* xCommit - commit transaction */ 641 0, /* xRollback - rollback transaction */ 642 0, /* xFindFunction - function overloading */ 643 0, /* xRename - rename the table */ 644 0, /* xSavepoint */ 645 0, /* xRelease */ 646 0, /* xRollbackTo */ 647 0, /* xShadowName */ 648 }; 649 650 return sqlite3_create_module(p->dbv, "expert", &expertModule, (void*)p); 651 } 652 /* 653 ** End of virtual table implementation. 654 *************************************************************************/ 655 /* 656 ** Finalize SQL statement pStmt. If (*pRc) is SQLITE_OK when this function 657 ** is called, set it to the return value of sqlite3_finalize() before 658 ** returning. Otherwise, discard the sqlite3_finalize() return value. 659 */ 660 static void idxFinalize(int *pRc, sqlite3_stmt *pStmt){ 661 int rc = sqlite3_finalize(pStmt); 662 if( *pRc==SQLITE_OK ) *pRc = rc; 663 } 664 665 /* 666 ** Attempt to allocate an IdxTable structure corresponding to table zTab 667 ** in the main database of connection db. If successful, set (*ppOut) to 668 ** point to the new object and return SQLITE_OK. Otherwise, return an 669 ** SQLite error code and set (*ppOut) to NULL. In this case *pzErrmsg may be 670 ** set to point to an error string. 671 ** 672 ** It is the responsibility of the caller to eventually free either the 673 ** IdxTable object or error message using sqlite3_free(). 674 */ 675 static int idxGetTableInfo( 676 sqlite3 *db, /* Database connection to read details from */ 677 const char *zTab, /* Table name */ 678 IdxTable **ppOut, /* OUT: New object (if successful) */ 679 char **pzErrmsg /* OUT: Error message (if not) */ 680 ){ 681 sqlite3_stmt *p1 = 0; 682 int nCol = 0; 683 int nTab = STRLEN(zTab); 684 int nByte = sizeof(IdxTable) + nTab + 1; 685 IdxTable *pNew = 0; 686 int rc, rc2; 687 char *pCsr = 0; 688 int nPk = 0; 689 690 rc = idxPrintfPrepareStmt(db, &p1, pzErrmsg, "PRAGMA table_xinfo=%Q", zTab); 691 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){ 692 const char *zCol = (const char*)sqlite3_column_text(p1, 1); 693 const char *zColSeq = 0; 694 nByte += 1 + STRLEN(zCol); 695 rc = sqlite3_table_column_metadata( 696 db, "main", zTab, zCol, 0, &zColSeq, 0, 0, 0 697 ); 698 if( zColSeq==0 ) zColSeq = "binary"; 699 nByte += 1 + STRLEN(zColSeq); 700 nCol++; 701 nPk += (sqlite3_column_int(p1, 5)>0); 702 } 703 rc2 = sqlite3_reset(p1); 704 if( rc==SQLITE_OK ) rc = rc2; 705 706 nByte += sizeof(IdxColumn) * nCol; 707 if( rc==SQLITE_OK ){ 708 pNew = idxMalloc(&rc, nByte); 709 } 710 if( rc==SQLITE_OK ){ 711 pNew->aCol = (IdxColumn*)&pNew[1]; 712 pNew->nCol = nCol; 713 pCsr = (char*)&pNew->aCol[nCol]; 714 } 715 716 nCol = 0; 717 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){ 718 const char *zCol = (const char*)sqlite3_column_text(p1, 1); 719 const char *zColSeq = 0; 720 int nCopy = STRLEN(zCol) + 1; 721 pNew->aCol[nCol].zName = pCsr; 722 pNew->aCol[nCol].iPk = (sqlite3_column_int(p1, 5)==1 && nPk==1); 723 memcpy(pCsr, zCol, nCopy); 724 pCsr += nCopy; 725 726 rc = sqlite3_table_column_metadata( 727 db, "main", zTab, zCol, 0, &zColSeq, 0, 0, 0 728 ); 729 if( rc==SQLITE_OK ){ 730 if( zColSeq==0 ) zColSeq = "binary"; 731 nCopy = STRLEN(zColSeq) + 1; 732 pNew->aCol[nCol].zColl = pCsr; 733 memcpy(pCsr, zColSeq, nCopy); 734 pCsr += nCopy; 735 } 736 737 nCol++; 738 } 739 idxFinalize(&rc, p1); 740 741 if( rc!=SQLITE_OK ){ 742 sqlite3_free(pNew); 743 pNew = 0; 744 }else{ 745 pNew->zName = pCsr; 746 memcpy(pNew->zName, zTab, nTab+1); 747 } 748 749 *ppOut = pNew; 750 return rc; 751 } 752 753 /* 754 ** This function is a no-op if *pRc is set to anything other than 755 ** SQLITE_OK when it is called. 756 ** 757 ** If *pRc is initially set to SQLITE_OK, then the text specified by 758 ** the printf() style arguments is appended to zIn and the result returned 759 ** in a buffer allocated by sqlite3_malloc(). sqlite3_free() is called on 760 ** zIn before returning. 761 */ 762 static char *idxAppendText(int *pRc, char *zIn, const char *zFmt, ...){ 763 va_list ap; 764 char *zAppend = 0; 765 char *zRet = 0; 766 int nIn = zIn ? STRLEN(zIn) : 0; 767 int nAppend = 0; 768 va_start(ap, zFmt); 769 if( *pRc==SQLITE_OK ){ 770 zAppend = sqlite3_vmprintf(zFmt, ap); 771 if( zAppend ){ 772 nAppend = STRLEN(zAppend); 773 zRet = (char*)sqlite3_malloc(nIn + nAppend + 1); 774 } 775 if( zAppend && zRet ){ 776 if( nIn ) memcpy(zRet, zIn, nIn); 777 memcpy(&zRet[nIn], zAppend, nAppend+1); 778 }else{ 779 sqlite3_free(zRet); 780 zRet = 0; 781 *pRc = SQLITE_NOMEM; 782 } 783 sqlite3_free(zAppend); 784 sqlite3_free(zIn); 785 } 786 va_end(ap); 787 return zRet; 788 } 789 790 /* 791 ** Return true if zId must be quoted in order to use it as an SQL 792 ** identifier, or false otherwise. 793 */ 794 static int idxIdentifierRequiresQuotes(const char *zId){ 795 int i; 796 for(i=0; zId[i]; i++){ 797 if( !(zId[i]=='_') 798 && !(zId[i]>='0' && zId[i]<='9') 799 && !(zId[i]>='a' && zId[i]<='z') 800 && !(zId[i]>='A' && zId[i]<='Z') 801 ){ 802 return 1; 803 } 804 } 805 return 0; 806 } 807 808 /* 809 ** This function appends an index column definition suitable for constraint 810 ** pCons to the string passed as zIn and returns the result. 811 */ 812 static char *idxAppendColDefn( 813 int *pRc, /* IN/OUT: Error code */ 814 char *zIn, /* Column defn accumulated so far */ 815 IdxTable *pTab, /* Table index will be created on */ 816 IdxConstraint *pCons 817 ){ 818 char *zRet = zIn; 819 IdxColumn *p = &pTab->aCol[pCons->iCol]; 820 if( zRet ) zRet = idxAppendText(pRc, zRet, ", "); 821 822 if( idxIdentifierRequiresQuotes(p->zName) ){ 823 zRet = idxAppendText(pRc, zRet, "%Q", p->zName); 824 }else{ 825 zRet = idxAppendText(pRc, zRet, "%s", p->zName); 826 } 827 828 if( sqlite3_stricmp(p->zColl, pCons->zColl) ){ 829 if( idxIdentifierRequiresQuotes(pCons->zColl) ){ 830 zRet = idxAppendText(pRc, zRet, " COLLATE %Q", pCons->zColl); 831 }else{ 832 zRet = idxAppendText(pRc, zRet, " COLLATE %s", pCons->zColl); 833 } 834 } 835 836 if( pCons->bDesc ){ 837 zRet = idxAppendText(pRc, zRet, " DESC"); 838 } 839 return zRet; 840 } 841 842 /* 843 ** Search database dbm for an index compatible with the one idxCreateFromCons() 844 ** would create from arguments pScan, pEq and pTail. If no error occurs and 845 ** such an index is found, return non-zero. Or, if no such index is found, 846 ** return zero. 847 ** 848 ** If an error occurs, set *pRc to an SQLite error code and return zero. 849 */ 850 static int idxFindCompatible( 851 int *pRc, /* OUT: Error code */ 852 sqlite3* dbm, /* Database to search */ 853 IdxScan *pScan, /* Scan for table to search for index on */ 854 IdxConstraint *pEq, /* List of == constraints */ 855 IdxConstraint *pTail /* List of range constraints */ 856 ){ 857 const char *zTbl = pScan->pTab->zName; 858 sqlite3_stmt *pIdxList = 0; 859 IdxConstraint *pIter; 860 int nEq = 0; /* Number of elements in pEq */ 861 int rc; 862 863 /* Count the elements in list pEq */ 864 for(pIter=pEq; pIter; pIter=pIter->pLink) nEq++; 865 866 rc = idxPrintfPrepareStmt(dbm, &pIdxList, 0, "PRAGMA index_list=%Q", zTbl); 867 while( rc==SQLITE_OK && sqlite3_step(pIdxList)==SQLITE_ROW ){ 868 int bMatch = 1; 869 IdxConstraint *pT = pTail; 870 sqlite3_stmt *pInfo = 0; 871 const char *zIdx = (const char*)sqlite3_column_text(pIdxList, 1); 872 873 /* Zero the IdxConstraint.bFlag values in the pEq list */ 874 for(pIter=pEq; pIter; pIter=pIter->pLink) pIter->bFlag = 0; 875 876 rc = idxPrintfPrepareStmt(dbm, &pInfo, 0, "PRAGMA index_xInfo=%Q", zIdx); 877 while( rc==SQLITE_OK && sqlite3_step(pInfo)==SQLITE_ROW ){ 878 int iIdx = sqlite3_column_int(pInfo, 0); 879 int iCol = sqlite3_column_int(pInfo, 1); 880 const char *zColl = (const char*)sqlite3_column_text(pInfo, 4); 881 882 if( iIdx<nEq ){ 883 for(pIter=pEq; pIter; pIter=pIter->pLink){ 884 if( pIter->bFlag ) continue; 885 if( pIter->iCol!=iCol ) continue; 886 if( sqlite3_stricmp(pIter->zColl, zColl) ) continue; 887 pIter->bFlag = 1; 888 break; 889 } 890 if( pIter==0 ){ 891 bMatch = 0; 892 break; 893 } 894 }else{ 895 if( pT ){ 896 if( pT->iCol!=iCol || sqlite3_stricmp(pT->zColl, zColl) ){ 897 bMatch = 0; 898 break; 899 } 900 pT = pT->pLink; 901 } 902 } 903 } 904 idxFinalize(&rc, pInfo); 905 906 if( rc==SQLITE_OK && bMatch ){ 907 sqlite3_finalize(pIdxList); 908 return 1; 909 } 910 } 911 idxFinalize(&rc, pIdxList); 912 913 *pRc = rc; 914 return 0; 915 } 916 917 /* Callback for sqlite3_exec() with query with leading count(*) column. 918 * The first argument is expected to be an int*, referent to be incremented 919 * if that leading column is not exactly '0'. 920 */ 921 static int countNonzeros(void* pCount, int nc, 922 char* azResults[], char* azColumns[]){ 923 if( nc>0 && azResults[0][0]!='0' || azResults[0][1]!=0 ){ 924 *((int *)pCount) += 1; 925 } 926 return 0; 927 } 928 929 static int idxCreateFromCons( 930 sqlite3expert *p, 931 IdxScan *pScan, 932 IdxConstraint *pEq, 933 IdxConstraint *pTail 934 ){ 935 sqlite3 *dbm = p->dbm; 936 int rc = SQLITE_OK; 937 if( (pEq || pTail) && 0==idxFindCompatible(&rc, dbm, pScan, pEq, pTail) ){ 938 IdxTable *pTab = pScan->pTab; 939 char *zCols = 0; 940 char *zIdx = 0; 941 IdxConstraint *pCons; 942 unsigned int h = 0; 943 const char *zFmt; 944 945 for(pCons=pEq; pCons; pCons=pCons->pLink){ 946 zCols = idxAppendColDefn(&rc, zCols, pTab, pCons); 947 } 948 for(pCons=pTail; pCons; pCons=pCons->pLink){ 949 zCols = idxAppendColDefn(&rc, zCols, pTab, pCons); 950 } 951 952 if( rc==SQLITE_OK ){ 953 /* Hash the list of columns to come up with a name for the index */ 954 const char *zTable = pScan->pTab->zName; 955 int quoteTable = idxIdentifierRequiresQuotes(zTable); 956 char *zName = 0; /* Index name */ 957 int collisions = 0; 958 do{ 959 int i; 960 char *zFind; 961 for(i=0; zCols[i]; i++){ 962 h += ((h<<3) + zCols[i]); 963 } 964 sqlite3_free(zName); 965 zName = sqlite3_mprintf("%s_idx_%08x", zTable, h); 966 if( zName==0 ) break; 967 /* Is is unique among table, view and index names? */ 968 zFmt = "SELECT count(*) FROM sqlite_schema WHERE name=%Q" 969 " AND type in ('index','table','view')"; 970 zFind = sqlite3_mprintf(zFmt, zName); 971 i = 0; 972 rc = sqlite3_exec(dbm, zFind, countNonzeros, &i, 0); 973 assert(rc==SQLITE_OK); 974 sqlite3_free(zFind); 975 if( i==0 ){ 976 collisions = 0; 977 break; 978 } 979 ++collisions; 980 }while( collisions<50 && zName!=0 ); 981 if( collisions ){ 982 /* This return means "Gave up trying to find a unique index name." */ 983 rc = SQLITE_BUSY_TIMEOUT; 984 }else if( zName==0 ){ 985 rc = SQLITE_NOMEM; 986 }else{ 987 if( quoteTable ){ 988 zFmt = "CREATE INDEX \"%w\" ON \"%w\"(%s)"; 989 }else{ 990 zFmt = "CREATE INDEX %s ON %s(%s)"; 991 } 992 zIdx = sqlite3_mprintf(zFmt, zName, zTable, zCols); 993 if( !zIdx ){ 994 rc = SQLITE_NOMEM; 995 }else{ 996 rc = sqlite3_exec(dbm, zIdx, 0, 0, p->pzErrmsg); 997 if( rc!=SQLITE_OK ){ 998 rc = SQLITE_BUSY_TIMEOUT; 999 }else{ 1000 idxHashAdd(&rc, &p->hIdx, zName, zIdx); 1001 } 1002 } 1003 sqlite3_free(zName); 1004 sqlite3_free(zIdx); 1005 } 1006 } 1007 1008 sqlite3_free(zCols); 1009 } 1010 return rc; 1011 } 1012 1013 /* 1014 ** Return true if list pList (linked by IdxConstraint.pLink) contains 1015 ** a constraint compatible with *p. Otherwise return false. 1016 */ 1017 static int idxFindConstraint(IdxConstraint *pList, IdxConstraint *p){ 1018 IdxConstraint *pCmp; 1019 for(pCmp=pList; pCmp; pCmp=pCmp->pLink){ 1020 if( p->iCol==pCmp->iCol ) return 1; 1021 } 1022 return 0; 1023 } 1024 1025 static int idxCreateFromWhere( 1026 sqlite3expert *p, 1027 IdxScan *pScan, /* Create indexes for this scan */ 1028 IdxConstraint *pTail /* range/ORDER BY constraints for inclusion */ 1029 ){ 1030 IdxConstraint *p1 = 0; 1031 IdxConstraint *pCon; 1032 int rc; 1033 1034 /* Gather up all the == constraints. */ 1035 for(pCon=pScan->pEq; pCon; pCon=pCon->pNext){ 1036 if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){ 1037 pCon->pLink = p1; 1038 p1 = pCon; 1039 } 1040 } 1041 1042 /* Create an index using the == constraints collected above. And the 1043 ** range constraint/ORDER BY terms passed in by the caller, if any. */ 1044 rc = idxCreateFromCons(p, pScan, p1, pTail); 1045 1046 /* If no range/ORDER BY passed by the caller, create a version of the 1047 ** index for each range constraint. */ 1048 if( pTail==0 ){ 1049 for(pCon=pScan->pRange; rc==SQLITE_OK && pCon; pCon=pCon->pNext){ 1050 assert( pCon->pLink==0 ); 1051 if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){ 1052 rc = idxCreateFromCons(p, pScan, p1, pCon); 1053 } 1054 } 1055 } 1056 1057 return rc; 1058 } 1059 1060 /* 1061 ** Create candidate indexes in database [dbm] based on the data in 1062 ** linked-list pScan. 1063 */ 1064 static int idxCreateCandidates(sqlite3expert *p){ 1065 int rc = SQLITE_OK; 1066 IdxScan *pIter; 1067 1068 for(pIter=p->pScan; pIter && rc==SQLITE_OK; pIter=pIter->pNextScan){ 1069 rc = idxCreateFromWhere(p, pIter, 0); 1070 if( rc==SQLITE_OK && pIter->pOrder ){ 1071 rc = idxCreateFromWhere(p, pIter, pIter->pOrder); 1072 } 1073 } 1074 1075 return rc; 1076 } 1077 1078 /* 1079 ** Free all elements of the linked list starting at pConstraint. 1080 */ 1081 static void idxConstraintFree(IdxConstraint *pConstraint){ 1082 IdxConstraint *pNext; 1083 IdxConstraint *p; 1084 1085 for(p=pConstraint; p; p=pNext){ 1086 pNext = p->pNext; 1087 sqlite3_free(p); 1088 } 1089 } 1090 1091 /* 1092 ** Free all elements of the linked list starting from pScan up until pLast 1093 ** (pLast is not freed). 1094 */ 1095 static void idxScanFree(IdxScan *pScan, IdxScan *pLast){ 1096 IdxScan *p; 1097 IdxScan *pNext; 1098 for(p=pScan; p!=pLast; p=pNext){ 1099 pNext = p->pNextScan; 1100 idxConstraintFree(p->pOrder); 1101 idxConstraintFree(p->pEq); 1102 idxConstraintFree(p->pRange); 1103 sqlite3_free(p); 1104 } 1105 } 1106 1107 /* 1108 ** Free all elements of the linked list starting from pStatement up 1109 ** until pLast (pLast is not freed). 1110 */ 1111 static void idxStatementFree(IdxStatement *pStatement, IdxStatement *pLast){ 1112 IdxStatement *p; 1113 IdxStatement *pNext; 1114 for(p=pStatement; p!=pLast; p=pNext){ 1115 pNext = p->pNext; 1116 sqlite3_free(p->zEQP); 1117 sqlite3_free(p->zIdx); 1118 sqlite3_free(p); 1119 } 1120 } 1121 1122 /* 1123 ** Free the linked list of IdxTable objects starting at pTab. 1124 */ 1125 static void idxTableFree(IdxTable *pTab){ 1126 IdxTable *pIter; 1127 IdxTable *pNext; 1128 for(pIter=pTab; pIter; pIter=pNext){ 1129 pNext = pIter->pNext; 1130 sqlite3_free(pIter); 1131 } 1132 } 1133 1134 /* 1135 ** Free the linked list of IdxWrite objects starting at pTab. 1136 */ 1137 static void idxWriteFree(IdxWrite *pTab){ 1138 IdxWrite *pIter; 1139 IdxWrite *pNext; 1140 for(pIter=pTab; pIter; pIter=pNext){ 1141 pNext = pIter->pNext; 1142 sqlite3_free(pIter); 1143 } 1144 } 1145 1146 1147 1148 /* 1149 ** This function is called after candidate indexes have been created. It 1150 ** runs all the queries to see which indexes they prefer, and populates 1151 ** IdxStatement.zIdx and IdxStatement.zEQP with the results. 1152 */ 1153 int idxFindIndexes( 1154 sqlite3expert *p, 1155 char **pzErr /* OUT: Error message (sqlite3_malloc) */ 1156 ){ 1157 IdxStatement *pStmt; 1158 sqlite3 *dbm = p->dbm; 1159 int rc = SQLITE_OK; 1160 1161 IdxHash hIdx; 1162 idxHashInit(&hIdx); 1163 1164 for(pStmt=p->pStatement; rc==SQLITE_OK && pStmt; pStmt=pStmt->pNext){ 1165 IdxHashEntry *pEntry; 1166 sqlite3_stmt *pExplain = 0; 1167 idxHashClear(&hIdx); 1168 rc = idxPrintfPrepareStmt(dbm, &pExplain, pzErr, 1169 "EXPLAIN QUERY PLAN %s", pStmt->zSql 1170 ); 1171 while( rc==SQLITE_OK && sqlite3_step(pExplain)==SQLITE_ROW ){ 1172 /* int iId = sqlite3_column_int(pExplain, 0); */ 1173 /* int iParent = sqlite3_column_int(pExplain, 1); */ 1174 /* int iNotUsed = sqlite3_column_int(pExplain, 2); */ 1175 const char *zDetail = (const char*)sqlite3_column_text(pExplain, 3); 1176 int nDetail; 1177 int i; 1178 1179 if( !zDetail ) continue; 1180 nDetail = STRLEN(zDetail); 1181 1182 for(i=0; i<nDetail; i++){ 1183 const char *zIdx = 0; 1184 if( i+13<nDetail && memcmp(&zDetail[i], " USING INDEX ", 13)==0 ){ 1185 zIdx = &zDetail[i+13]; 1186 }else if( i+22<nDetail 1187 && memcmp(&zDetail[i], " USING COVERING INDEX ", 22)==0 1188 ){ 1189 zIdx = &zDetail[i+22]; 1190 } 1191 if( zIdx ){ 1192 const char *zSql; 1193 int nIdx = 0; 1194 while( zIdx[nIdx]!='\0' && (zIdx[nIdx]!=' ' || zIdx[nIdx+1]!='(') ){ 1195 nIdx++; 1196 } 1197 zSql = idxHashSearch(&p->hIdx, zIdx, nIdx); 1198 if( zSql ){ 1199 idxHashAdd(&rc, &hIdx, zSql, 0); 1200 if( rc ) goto find_indexes_out; 1201 } 1202 break; 1203 } 1204 } 1205 1206 if( zDetail[0]!='-' ){ 1207 pStmt->zEQP = idxAppendText(&rc, pStmt->zEQP, "%s\n", zDetail); 1208 } 1209 } 1210 1211 for(pEntry=hIdx.pFirst; pEntry; pEntry=pEntry->pNext){ 1212 pStmt->zIdx = idxAppendText(&rc, pStmt->zIdx, "%s;\n", pEntry->zKey); 1213 } 1214 1215 idxFinalize(&rc, pExplain); 1216 } 1217 1218 find_indexes_out: 1219 idxHashClear(&hIdx); 1220 return rc; 1221 } 1222 1223 static int idxAuthCallback( 1224 void *pCtx, 1225 int eOp, 1226 const char *z3, 1227 const char *z4, 1228 const char *zDb, 1229 const char *zTrigger 1230 ){ 1231 int rc = SQLITE_OK; 1232 (void)z4; 1233 (void)zTrigger; 1234 if( eOp==SQLITE_INSERT || eOp==SQLITE_UPDATE || eOp==SQLITE_DELETE ){ 1235 if( sqlite3_stricmp(zDb, "main")==0 ){ 1236 sqlite3expert *p = (sqlite3expert*)pCtx; 1237 IdxTable *pTab; 1238 for(pTab=p->pTable; pTab; pTab=pTab->pNext){ 1239 if( 0==sqlite3_stricmp(z3, pTab->zName) ) break; 1240 } 1241 if( pTab ){ 1242 IdxWrite *pWrite; 1243 for(pWrite=p->pWrite; pWrite; pWrite=pWrite->pNext){ 1244 if( pWrite->pTab==pTab && pWrite->eOp==eOp ) break; 1245 } 1246 if( pWrite==0 ){ 1247 pWrite = idxMalloc(&rc, sizeof(IdxWrite)); 1248 if( rc==SQLITE_OK ){ 1249 pWrite->pTab = pTab; 1250 pWrite->eOp = eOp; 1251 pWrite->pNext = p->pWrite; 1252 p->pWrite = pWrite; 1253 } 1254 } 1255 } 1256 } 1257 } 1258 return rc; 1259 } 1260 1261 static int idxProcessOneTrigger( 1262 sqlite3expert *p, 1263 IdxWrite *pWrite, 1264 char **pzErr 1265 ){ 1266 static const char *zInt = UNIQUE_TABLE_NAME; 1267 static const char *zDrop = "DROP TABLE " UNIQUE_TABLE_NAME; 1268 IdxTable *pTab = pWrite->pTab; 1269 const char *zTab = pTab->zName; 1270 const char *zSql = 1271 "SELECT 'CREATE TEMP' || substr(sql, 7) FROM sqlite_schema " 1272 "WHERE tbl_name = %Q AND type IN ('table', 'trigger') " 1273 "ORDER BY type;"; 1274 sqlite3_stmt *pSelect = 0; 1275 int rc = SQLITE_OK; 1276 char *zWrite = 0; 1277 1278 /* Create the table and its triggers in the temp schema */ 1279 rc = idxPrintfPrepareStmt(p->db, &pSelect, pzErr, zSql, zTab, zTab); 1280 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSelect) ){ 1281 const char *zCreate = (const char*)sqlite3_column_text(pSelect, 0); 1282 rc = sqlite3_exec(p->dbv, zCreate, 0, 0, pzErr); 1283 } 1284 idxFinalize(&rc, pSelect); 1285 1286 /* Rename the table in the temp schema to zInt */ 1287 if( rc==SQLITE_OK ){ 1288 char *z = sqlite3_mprintf("ALTER TABLE temp.%Q RENAME TO %Q", zTab, zInt); 1289 if( z==0 ){ 1290 rc = SQLITE_NOMEM; 1291 }else{ 1292 rc = sqlite3_exec(p->dbv, z, 0, 0, pzErr); 1293 sqlite3_free(z); 1294 } 1295 } 1296 1297 switch( pWrite->eOp ){ 1298 case SQLITE_INSERT: { 1299 int i; 1300 zWrite = idxAppendText(&rc, zWrite, "INSERT INTO %Q VALUES(", zInt); 1301 for(i=0; i<pTab->nCol; i++){ 1302 zWrite = idxAppendText(&rc, zWrite, "%s?", i==0 ? "" : ", "); 1303 } 1304 zWrite = idxAppendText(&rc, zWrite, ")"); 1305 break; 1306 } 1307 case SQLITE_UPDATE: { 1308 int i; 1309 zWrite = idxAppendText(&rc, zWrite, "UPDATE %Q SET ", zInt); 1310 for(i=0; i<pTab->nCol; i++){ 1311 zWrite = idxAppendText(&rc, zWrite, "%s%Q=?", i==0 ? "" : ", ", 1312 pTab->aCol[i].zName 1313 ); 1314 } 1315 break; 1316 } 1317 default: { 1318 assert( pWrite->eOp==SQLITE_DELETE ); 1319 if( rc==SQLITE_OK ){ 1320 zWrite = sqlite3_mprintf("DELETE FROM %Q", zInt); 1321 if( zWrite==0 ) rc = SQLITE_NOMEM; 1322 } 1323 } 1324 } 1325 1326 if( rc==SQLITE_OK ){ 1327 sqlite3_stmt *pX = 0; 1328 rc = sqlite3_prepare_v2(p->dbv, zWrite, -1, &pX, 0); 1329 idxFinalize(&rc, pX); 1330 if( rc!=SQLITE_OK ){ 1331 idxDatabaseError(p->dbv, pzErr); 1332 } 1333 } 1334 sqlite3_free(zWrite); 1335 1336 if( rc==SQLITE_OK ){ 1337 rc = sqlite3_exec(p->dbv, zDrop, 0, 0, pzErr); 1338 } 1339 1340 return rc; 1341 } 1342 1343 static int idxProcessTriggers(sqlite3expert *p, char **pzErr){ 1344 int rc = SQLITE_OK; 1345 IdxWrite *pEnd = 0; 1346 IdxWrite *pFirst = p->pWrite; 1347 1348 while( rc==SQLITE_OK && pFirst!=pEnd ){ 1349 IdxWrite *pIter; 1350 for(pIter=pFirst; rc==SQLITE_OK && pIter!=pEnd; pIter=pIter->pNext){ 1351 rc = idxProcessOneTrigger(p, pIter, pzErr); 1352 } 1353 pEnd = pFirst; 1354 pFirst = p->pWrite; 1355 } 1356 1357 return rc; 1358 } 1359 1360 1361 static int idxCreateVtabSchema(sqlite3expert *p, char **pzErrmsg){ 1362 int rc = idxRegisterVtab(p); 1363 sqlite3_stmt *pSchema = 0; 1364 1365 /* For each table in the main db schema: 1366 ** 1367 ** 1) Add an entry to the p->pTable list, and 1368 ** 2) Create the equivalent virtual table in dbv. 1369 */ 1370 rc = idxPrepareStmt(p->db, &pSchema, pzErrmsg, 1371 "SELECT type, name, sql, 1 FROM sqlite_schema " 1372 "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%%' " 1373 " UNION ALL " 1374 "SELECT type, name, sql, 2 FROM sqlite_schema " 1375 "WHERE type = 'trigger'" 1376 " AND tbl_name IN(SELECT name FROM sqlite_schema WHERE type = 'view') " 1377 "ORDER BY 4, 1" 1378 ); 1379 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSchema) ){ 1380 const char *zType = (const char*)sqlite3_column_text(pSchema, 0); 1381 const char *zName = (const char*)sqlite3_column_text(pSchema, 1); 1382 const char *zSql = (const char*)sqlite3_column_text(pSchema, 2); 1383 1384 if( zType[0]=='v' || zType[1]=='r' ){ 1385 rc = sqlite3_exec(p->dbv, zSql, 0, 0, pzErrmsg); 1386 }else{ 1387 IdxTable *pTab; 1388 rc = idxGetTableInfo(p->db, zName, &pTab, pzErrmsg); 1389 if( rc==SQLITE_OK ){ 1390 int i; 1391 char *zInner = 0; 1392 char *zOuter = 0; 1393 pTab->pNext = p->pTable; 1394 p->pTable = pTab; 1395 1396 /* The statement the vtab will pass to sqlite3_declare_vtab() */ 1397 zInner = idxAppendText(&rc, 0, "CREATE TABLE x("); 1398 for(i=0; i<pTab->nCol; i++){ 1399 zInner = idxAppendText(&rc, zInner, "%s%Q COLLATE %s", 1400 (i==0 ? "" : ", "), pTab->aCol[i].zName, pTab->aCol[i].zColl 1401 ); 1402 } 1403 zInner = idxAppendText(&rc, zInner, ")"); 1404 1405 /* The CVT statement to create the vtab */ 1406 zOuter = idxAppendText(&rc, 0, 1407 "CREATE VIRTUAL TABLE %Q USING expert(%Q)", zName, zInner 1408 ); 1409 if( rc==SQLITE_OK ){ 1410 rc = sqlite3_exec(p->dbv, zOuter, 0, 0, pzErrmsg); 1411 } 1412 sqlite3_free(zInner); 1413 sqlite3_free(zOuter); 1414 } 1415 } 1416 } 1417 idxFinalize(&rc, pSchema); 1418 return rc; 1419 } 1420 1421 struct IdxSampleCtx { 1422 int iTarget; 1423 double target; /* Target nRet/nRow value */ 1424 double nRow; /* Number of rows seen */ 1425 double nRet; /* Number of rows returned */ 1426 }; 1427 1428 static void idxSampleFunc( 1429 sqlite3_context *pCtx, 1430 int argc, 1431 sqlite3_value **argv 1432 ){ 1433 struct IdxSampleCtx *p = (struct IdxSampleCtx*)sqlite3_user_data(pCtx); 1434 int bRet; 1435 1436 (void)argv; 1437 assert( argc==0 ); 1438 if( p->nRow==0.0 ){ 1439 bRet = 1; 1440 }else{ 1441 bRet = (p->nRet / p->nRow) <= p->target; 1442 if( bRet==0 ){ 1443 unsigned short rnd; 1444 sqlite3_randomness(2, (void*)&rnd); 1445 bRet = ((int)rnd % 100) <= p->iTarget; 1446 } 1447 } 1448 1449 sqlite3_result_int(pCtx, bRet); 1450 p->nRow += 1.0; 1451 p->nRet += (double)bRet; 1452 } 1453 1454 struct IdxRemCtx { 1455 int nSlot; 1456 struct IdxRemSlot { 1457 int eType; /* SQLITE_NULL, INTEGER, REAL, TEXT, BLOB */ 1458 i64 iVal; /* SQLITE_INTEGER value */ 1459 double rVal; /* SQLITE_FLOAT value */ 1460 int nByte; /* Bytes of space allocated at z */ 1461 int n; /* Size of buffer z */ 1462 char *z; /* SQLITE_TEXT/BLOB value */ 1463 } aSlot[1]; 1464 }; 1465 1466 /* 1467 ** Implementation of scalar function rem(). 1468 */ 1469 static void idxRemFunc( 1470 sqlite3_context *pCtx, 1471 int argc, 1472 sqlite3_value **argv 1473 ){ 1474 struct IdxRemCtx *p = (struct IdxRemCtx*)sqlite3_user_data(pCtx); 1475 struct IdxRemSlot *pSlot; 1476 int iSlot; 1477 assert( argc==2 ); 1478 1479 iSlot = sqlite3_value_int(argv[0]); 1480 assert( iSlot<=p->nSlot ); 1481 pSlot = &p->aSlot[iSlot]; 1482 1483 switch( pSlot->eType ){ 1484 case SQLITE_NULL: 1485 /* no-op */ 1486 break; 1487 1488 case SQLITE_INTEGER: 1489 sqlite3_result_int64(pCtx, pSlot->iVal); 1490 break; 1491 1492 case SQLITE_FLOAT: 1493 sqlite3_result_double(pCtx, pSlot->rVal); 1494 break; 1495 1496 case SQLITE_BLOB: 1497 sqlite3_result_blob(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT); 1498 break; 1499 1500 case SQLITE_TEXT: 1501 sqlite3_result_text(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT); 1502 break; 1503 } 1504 1505 pSlot->eType = sqlite3_value_type(argv[1]); 1506 switch( pSlot->eType ){ 1507 case SQLITE_NULL: 1508 /* no-op */ 1509 break; 1510 1511 case SQLITE_INTEGER: 1512 pSlot->iVal = sqlite3_value_int64(argv[1]); 1513 break; 1514 1515 case SQLITE_FLOAT: 1516 pSlot->rVal = sqlite3_value_double(argv[1]); 1517 break; 1518 1519 case SQLITE_BLOB: 1520 case SQLITE_TEXT: { 1521 int nByte = sqlite3_value_bytes(argv[1]); 1522 if( nByte>pSlot->nByte ){ 1523 char *zNew = (char*)sqlite3_realloc(pSlot->z, nByte*2); 1524 if( zNew==0 ){ 1525 sqlite3_result_error_nomem(pCtx); 1526 return; 1527 } 1528 pSlot->nByte = nByte*2; 1529 pSlot->z = zNew; 1530 } 1531 pSlot->n = nByte; 1532 if( pSlot->eType==SQLITE_BLOB ){ 1533 memcpy(pSlot->z, sqlite3_value_blob(argv[1]), nByte); 1534 }else{ 1535 memcpy(pSlot->z, sqlite3_value_text(argv[1]), nByte); 1536 } 1537 break; 1538 } 1539 } 1540 } 1541 1542 static int idxLargestIndex(sqlite3 *db, int *pnMax, char **pzErr){ 1543 int rc = SQLITE_OK; 1544 const char *zMax = 1545 "SELECT max(i.seqno) FROM " 1546 " sqlite_schema AS s, " 1547 " pragma_index_list(s.name) AS l, " 1548 " pragma_index_info(l.name) AS i " 1549 "WHERE s.type = 'table'"; 1550 sqlite3_stmt *pMax = 0; 1551 1552 *pnMax = 0; 1553 rc = idxPrepareStmt(db, &pMax, pzErr, zMax); 1554 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pMax) ){ 1555 *pnMax = sqlite3_column_int(pMax, 0) + 1; 1556 } 1557 idxFinalize(&rc, pMax); 1558 1559 return rc; 1560 } 1561 1562 static int idxPopulateOneStat1( 1563 sqlite3expert *p, 1564 sqlite3_stmt *pIndexXInfo, 1565 sqlite3_stmt *pWriteStat, 1566 const char *zTab, 1567 const char *zIdx, 1568 char **pzErr 1569 ){ 1570 char *zCols = 0; 1571 char *zOrder = 0; 1572 char *zQuery = 0; 1573 int nCol = 0; 1574 int i; 1575 sqlite3_stmt *pQuery = 0; 1576 int *aStat = 0; 1577 int rc = SQLITE_OK; 1578 1579 assert( p->iSample>0 ); 1580 1581 /* Formulate the query text */ 1582 sqlite3_bind_text(pIndexXInfo, 1, zIdx, -1, SQLITE_STATIC); 1583 while( SQLITE_OK==rc && SQLITE_ROW==sqlite3_step(pIndexXInfo) ){ 1584 const char *zComma = zCols==0 ? "" : ", "; 1585 const char *zName = (const char*)sqlite3_column_text(pIndexXInfo, 0); 1586 const char *zColl = (const char*)sqlite3_column_text(pIndexXInfo, 1); 1587 zCols = idxAppendText(&rc, zCols, 1588 "%sx.%Q IS rem(%d, x.%Q) COLLATE %s", zComma, zName, nCol, zName, zColl 1589 ); 1590 zOrder = idxAppendText(&rc, zOrder, "%s%d", zComma, ++nCol); 1591 } 1592 sqlite3_reset(pIndexXInfo); 1593 if( rc==SQLITE_OK ){ 1594 if( p->iSample==100 ){ 1595 zQuery = sqlite3_mprintf( 1596 "SELECT %s FROM %Q x ORDER BY %s", zCols, zTab, zOrder 1597 ); 1598 }else{ 1599 zQuery = sqlite3_mprintf( 1600 "SELECT %s FROM temp."UNIQUE_TABLE_NAME" x ORDER BY %s", zCols, zOrder 1601 ); 1602 } 1603 } 1604 sqlite3_free(zCols); 1605 sqlite3_free(zOrder); 1606 1607 /* Formulate the query text */ 1608 if( rc==SQLITE_OK ){ 1609 sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv); 1610 rc = idxPrepareStmt(dbrem, &pQuery, pzErr, zQuery); 1611 } 1612 sqlite3_free(zQuery); 1613 1614 if( rc==SQLITE_OK ){ 1615 aStat = (int*)idxMalloc(&rc, sizeof(int)*(nCol+1)); 1616 } 1617 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){ 1618 IdxHashEntry *pEntry; 1619 char *zStat = 0; 1620 for(i=0; i<=nCol; i++) aStat[i] = 1; 1621 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){ 1622 aStat[0]++; 1623 for(i=0; i<nCol; i++){ 1624 if( sqlite3_column_int(pQuery, i)==0 ) break; 1625 } 1626 for(/*no-op*/; i<nCol; i++){ 1627 aStat[i+1]++; 1628 } 1629 } 1630 1631 if( rc==SQLITE_OK ){ 1632 int s0 = aStat[0]; 1633 zStat = sqlite3_mprintf("%d", s0); 1634 if( zStat==0 ) rc = SQLITE_NOMEM; 1635 for(i=1; rc==SQLITE_OK && i<=nCol; i++){ 1636 zStat = idxAppendText(&rc, zStat, " %d", (s0+aStat[i]/2) / aStat[i]); 1637 } 1638 } 1639 1640 if( rc==SQLITE_OK ){ 1641 sqlite3_bind_text(pWriteStat, 1, zTab, -1, SQLITE_STATIC); 1642 sqlite3_bind_text(pWriteStat, 2, zIdx, -1, SQLITE_STATIC); 1643 sqlite3_bind_text(pWriteStat, 3, zStat, -1, SQLITE_STATIC); 1644 sqlite3_step(pWriteStat); 1645 rc = sqlite3_reset(pWriteStat); 1646 } 1647 1648 pEntry = idxHashFind(&p->hIdx, zIdx, STRLEN(zIdx)); 1649 if( pEntry ){ 1650 assert( pEntry->zVal2==0 ); 1651 pEntry->zVal2 = zStat; 1652 }else{ 1653 sqlite3_free(zStat); 1654 } 1655 } 1656 sqlite3_free(aStat); 1657 idxFinalize(&rc, pQuery); 1658 1659 return rc; 1660 } 1661 1662 static int idxBuildSampleTable(sqlite3expert *p, const char *zTab){ 1663 int rc; 1664 char *zSql; 1665 1666 rc = sqlite3_exec(p->dbv,"DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0); 1667 if( rc!=SQLITE_OK ) return rc; 1668 1669 zSql = sqlite3_mprintf( 1670 "CREATE TABLE temp." UNIQUE_TABLE_NAME " AS SELECT * FROM %Q", zTab 1671 ); 1672 if( zSql==0 ) return SQLITE_NOMEM; 1673 rc = sqlite3_exec(p->dbv, zSql, 0, 0, 0); 1674 sqlite3_free(zSql); 1675 1676 return rc; 1677 } 1678 1679 /* 1680 ** This function is called as part of sqlite3_expert_analyze(). Candidate 1681 ** indexes have already been created in database sqlite3expert.dbm, this 1682 ** function populates sqlite_stat1 table in the same database. 1683 ** 1684 ** The stat1 data is generated by querying the 1685 */ 1686 static int idxPopulateStat1(sqlite3expert *p, char **pzErr){ 1687 int rc = SQLITE_OK; 1688 int nMax =0; 1689 struct IdxRemCtx *pCtx = 0; 1690 struct IdxSampleCtx samplectx; 1691 int i; 1692 i64 iPrev = -100000; 1693 sqlite3_stmt *pAllIndex = 0; 1694 sqlite3_stmt *pIndexXInfo = 0; 1695 sqlite3_stmt *pWrite = 0; 1696 1697 const char *zAllIndex = 1698 "SELECT s.rowid, s.name, l.name FROM " 1699 " sqlite_schema AS s, " 1700 " pragma_index_list(s.name) AS l " 1701 "WHERE s.type = 'table'"; 1702 const char *zIndexXInfo = 1703 "SELECT name, coll FROM pragma_index_xinfo(?) WHERE key"; 1704 const char *zWrite = "INSERT INTO sqlite_stat1 VALUES(?, ?, ?)"; 1705 1706 /* If iSample==0, no sqlite_stat1 data is required. */ 1707 if( p->iSample==0 ) return SQLITE_OK; 1708 1709 rc = idxLargestIndex(p->dbm, &nMax, pzErr); 1710 if( nMax<=0 || rc!=SQLITE_OK ) return rc; 1711 1712 rc = sqlite3_exec(p->dbm, "ANALYZE; PRAGMA writable_schema=1", 0, 0, 0); 1713 1714 if( rc==SQLITE_OK ){ 1715 int nByte = sizeof(struct IdxRemCtx) + (sizeof(struct IdxRemSlot) * nMax); 1716 pCtx = (struct IdxRemCtx*)idxMalloc(&rc, nByte); 1717 } 1718 1719 if( rc==SQLITE_OK ){ 1720 sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv); 1721 rc = sqlite3_create_function( 1722 dbrem, "rem", 2, SQLITE_UTF8, (void*)pCtx, idxRemFunc, 0, 0 1723 ); 1724 } 1725 if( rc==SQLITE_OK ){ 1726 rc = sqlite3_create_function( 1727 p->db, "sample", 0, SQLITE_UTF8, (void*)&samplectx, idxSampleFunc, 0, 0 1728 ); 1729 } 1730 1731 if( rc==SQLITE_OK ){ 1732 pCtx->nSlot = nMax+1; 1733 rc = idxPrepareStmt(p->dbm, &pAllIndex, pzErr, zAllIndex); 1734 } 1735 if( rc==SQLITE_OK ){ 1736 rc = idxPrepareStmt(p->dbm, &pIndexXInfo, pzErr, zIndexXInfo); 1737 } 1738 if( rc==SQLITE_OK ){ 1739 rc = idxPrepareStmt(p->dbm, &pWrite, pzErr, zWrite); 1740 } 1741 1742 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pAllIndex) ){ 1743 i64 iRowid = sqlite3_column_int64(pAllIndex, 0); 1744 const char *zTab = (const char*)sqlite3_column_text(pAllIndex, 1); 1745 const char *zIdx = (const char*)sqlite3_column_text(pAllIndex, 2); 1746 if( p->iSample<100 && iPrev!=iRowid ){ 1747 samplectx.target = (double)p->iSample / 100.0; 1748 samplectx.iTarget = p->iSample; 1749 samplectx.nRow = 0.0; 1750 samplectx.nRet = 0.0; 1751 rc = idxBuildSampleTable(p, zTab); 1752 if( rc!=SQLITE_OK ) break; 1753 } 1754 rc = idxPopulateOneStat1(p, pIndexXInfo, pWrite, zTab, zIdx, pzErr); 1755 iPrev = iRowid; 1756 } 1757 if( rc==SQLITE_OK && p->iSample<100 ){ 1758 rc = sqlite3_exec(p->dbv, 1759 "DROP TABLE IF EXISTS temp." UNIQUE_TABLE_NAME, 0,0,0 1760 ); 1761 } 1762 1763 idxFinalize(&rc, pAllIndex); 1764 idxFinalize(&rc, pIndexXInfo); 1765 idxFinalize(&rc, pWrite); 1766 1767 if( pCtx ){ 1768 for(i=0; i<pCtx->nSlot; i++){ 1769 sqlite3_free(pCtx->aSlot[i].z); 1770 } 1771 sqlite3_free(pCtx); 1772 } 1773 1774 if( rc==SQLITE_OK ){ 1775 rc = sqlite3_exec(p->dbm, "ANALYZE sqlite_schema", 0, 0, 0); 1776 } 1777 1778 sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0); 1779 return rc; 1780 } 1781 1782 /* 1783 ** Allocate a new sqlite3expert object. 1784 */ 1785 sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErrmsg){ 1786 int rc = SQLITE_OK; 1787 sqlite3expert *pNew; 1788 1789 pNew = (sqlite3expert*)idxMalloc(&rc, sizeof(sqlite3expert)); 1790 1791 /* Open two in-memory databases to work with. The "vtab database" (dbv) 1792 ** will contain a virtual table corresponding to each real table in 1793 ** the user database schema, and a copy of each view. It is used to 1794 ** collect information regarding the WHERE, ORDER BY and other clauses 1795 ** of the user's query. 1796 */ 1797 if( rc==SQLITE_OK ){ 1798 pNew->db = db; 1799 pNew->iSample = 100; 1800 rc = sqlite3_open(":memory:", &pNew->dbv); 1801 } 1802 if( rc==SQLITE_OK ){ 1803 rc = sqlite3_open(":memory:", &pNew->dbm); 1804 if( rc==SQLITE_OK ){ 1805 sqlite3_db_config(pNew->dbm, SQLITE_DBCONFIG_TRIGGER_EQP, 1, (int*)0); 1806 } 1807 } 1808 1809 1810 /* Copy the entire schema of database [db] into [dbm]. */ 1811 if( rc==SQLITE_OK ){ 1812 sqlite3_stmt *pSql; 1813 rc = idxPrintfPrepareStmt(pNew->db, &pSql, pzErrmsg, 1814 "SELECT sql FROM sqlite_schema WHERE name NOT LIKE 'sqlite_%%'" 1815 " AND sql NOT LIKE 'CREATE VIRTUAL %%'" 1816 ); 1817 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){ 1818 const char *zSql = (const char*)sqlite3_column_text(pSql, 0); 1819 rc = sqlite3_exec(pNew->dbm, zSql, 0, 0, pzErrmsg); 1820 } 1821 idxFinalize(&rc, pSql); 1822 } 1823 1824 /* Create the vtab schema */ 1825 if( rc==SQLITE_OK ){ 1826 rc = idxCreateVtabSchema(pNew, pzErrmsg); 1827 } 1828 1829 /* Register the auth callback with dbv */ 1830 if( rc==SQLITE_OK ){ 1831 sqlite3_set_authorizer(pNew->dbv, idxAuthCallback, (void*)pNew); 1832 } 1833 1834 /* If an error has occurred, free the new object and reutrn NULL. Otherwise, 1835 ** return the new sqlite3expert handle. */ 1836 if( rc!=SQLITE_OK ){ 1837 sqlite3_expert_destroy(pNew); 1838 pNew = 0; 1839 } 1840 return pNew; 1841 } 1842 1843 /* 1844 ** Configure an sqlite3expert object. 1845 */ 1846 int sqlite3_expert_config(sqlite3expert *p, int op, ...){ 1847 int rc = SQLITE_OK; 1848 va_list ap; 1849 va_start(ap, op); 1850 switch( op ){ 1851 case EXPERT_CONFIG_SAMPLE: { 1852 int iVal = va_arg(ap, int); 1853 if( iVal<0 ) iVal = 0; 1854 if( iVal>100 ) iVal = 100; 1855 p->iSample = iVal; 1856 break; 1857 } 1858 default: 1859 rc = SQLITE_NOTFOUND; 1860 break; 1861 } 1862 1863 va_end(ap); 1864 return rc; 1865 } 1866 1867 /* 1868 ** Add an SQL statement to the analysis. 1869 */ 1870 int sqlite3_expert_sql( 1871 sqlite3expert *p, /* From sqlite3_expert_new() */ 1872 const char *zSql, /* SQL statement to add */ 1873 char **pzErr /* OUT: Error message (if any) */ 1874 ){ 1875 IdxScan *pScanOrig = p->pScan; 1876 IdxStatement *pStmtOrig = p->pStatement; 1877 int rc = SQLITE_OK; 1878 const char *zStmt = zSql; 1879 1880 if( p->bRun ) return SQLITE_MISUSE; 1881 1882 while( rc==SQLITE_OK && zStmt && zStmt[0] ){ 1883 sqlite3_stmt *pStmt = 0; 1884 rc = sqlite3_prepare_v2(p->dbv, zStmt, -1, &pStmt, &zStmt); 1885 if( rc==SQLITE_OK ){ 1886 if( pStmt ){ 1887 IdxStatement *pNew; 1888 const char *z = sqlite3_sql(pStmt); 1889 int n = STRLEN(z); 1890 pNew = (IdxStatement*)idxMalloc(&rc, sizeof(IdxStatement) + n+1); 1891 if( rc==SQLITE_OK ){ 1892 pNew->zSql = (char*)&pNew[1]; 1893 memcpy(pNew->zSql, z, n+1); 1894 pNew->pNext = p->pStatement; 1895 if( p->pStatement ) pNew->iId = p->pStatement->iId+1; 1896 p->pStatement = pNew; 1897 } 1898 sqlite3_finalize(pStmt); 1899 } 1900 }else{ 1901 idxDatabaseError(p->dbv, pzErr); 1902 } 1903 } 1904 1905 if( rc!=SQLITE_OK ){ 1906 idxScanFree(p->pScan, pScanOrig); 1907 idxStatementFree(p->pStatement, pStmtOrig); 1908 p->pScan = pScanOrig; 1909 p->pStatement = pStmtOrig; 1910 } 1911 1912 return rc; 1913 } 1914 1915 int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr){ 1916 int rc; 1917 IdxHashEntry *pEntry; 1918 1919 /* Do trigger processing to collect any extra IdxScan structures */ 1920 rc = idxProcessTriggers(p, pzErr); 1921 1922 /* Create candidate indexes within the in-memory database file */ 1923 if( rc==SQLITE_OK ){ 1924 rc = idxCreateCandidates(p); 1925 }else if ( rc==SQLITE_BUSY_TIMEOUT ){ 1926 if( pzErr ) 1927 *pzErr = sqlite3_mprintf("Cannot find a unique index name to propose."); 1928 return rc; 1929 } 1930 1931 /* Generate the stat1 data */ 1932 if( rc==SQLITE_OK ){ 1933 rc = idxPopulateStat1(p, pzErr); 1934 } 1935 1936 /* Formulate the EXPERT_REPORT_CANDIDATES text */ 1937 for(pEntry=p->hIdx.pFirst; pEntry; pEntry=pEntry->pNext){ 1938 p->zCandidates = idxAppendText(&rc, p->zCandidates, 1939 "%s;%s%s\n", pEntry->zVal, 1940 pEntry->zVal2 ? " -- stat1: " : "", pEntry->zVal2 1941 ); 1942 } 1943 1944 /* Figure out which of the candidate indexes are preferred by the query 1945 ** planner and report the results to the user. */ 1946 if( rc==SQLITE_OK ){ 1947 rc = idxFindIndexes(p, pzErr); 1948 } 1949 1950 if( rc==SQLITE_OK ){ 1951 p->bRun = 1; 1952 } 1953 return rc; 1954 } 1955 1956 /* 1957 ** Return the total number of statements that have been added to this 1958 ** sqlite3expert using sqlite3_expert_sql(). 1959 */ 1960 int sqlite3_expert_count(sqlite3expert *p){ 1961 int nRet = 0; 1962 if( p->pStatement ) nRet = p->pStatement->iId+1; 1963 return nRet; 1964 } 1965 1966 /* 1967 ** Return a component of the report. 1968 */ 1969 const char *sqlite3_expert_report(sqlite3expert *p, int iStmt, int eReport){ 1970 const char *zRet = 0; 1971 IdxStatement *pStmt; 1972 1973 if( p->bRun==0 ) return 0; 1974 for(pStmt=p->pStatement; pStmt && pStmt->iId!=iStmt; pStmt=pStmt->pNext); 1975 switch( eReport ){ 1976 case EXPERT_REPORT_SQL: 1977 if( pStmt ) zRet = pStmt->zSql; 1978 break; 1979 case EXPERT_REPORT_INDEXES: 1980 if( pStmt ) zRet = pStmt->zIdx; 1981 break; 1982 case EXPERT_REPORT_PLAN: 1983 if( pStmt ) zRet = pStmt->zEQP; 1984 break; 1985 case EXPERT_REPORT_CANDIDATES: 1986 zRet = p->zCandidates; 1987 break; 1988 } 1989 return zRet; 1990 } 1991 1992 /* 1993 ** Free an sqlite3expert object. 1994 */ 1995 void sqlite3_expert_destroy(sqlite3expert *p){ 1996 if( p ){ 1997 sqlite3_close(p->dbm); 1998 sqlite3_close(p->dbv); 1999 idxScanFree(p->pScan, 0); 2000 idxStatementFree(p->pStatement, 0); 2001 idxTableFree(p->pTable); 2002 idxWriteFree(p->pWrite); 2003 idxHashClear(&p->hIdx); 2004 sqlite3_free(p->zCandidates); 2005 sqlite3_free(p); 2006 } 2007 } 2008 2009 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ 2010