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