Team Ai
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 10mo agoView on Hugging Face
0likes
vtab.c1381 linesDownload Raw Back to src
1/*2** 2006 June 103**4** The author disclaims copyright to this source code.  In place of5** a legal notice, here is a blessing:6**7**    May you do good and not evil.8**    May you find forgiveness for yourself and forgive others.9**    May you share freely, never taking more than you give.10**11*************************************************************************12** This file contains code used to help implement virtual tables.13*/14#ifndef SQLITE_OMIT_VIRTUALTABLE15#include "sqliteInt.h"16 17/*18** Before a virtual table xCreate() or xConnect() method is invoked, the19** sqlite3.pVtabCtx member variable is set to point to an instance of20** this struct allocated on the stack. It is used by the implementation of21** the sqlite3_declare_vtab() and sqlite3_vtab_config() APIs, both of which22** are invoked only from within xCreate and xConnect methods.23*/24struct VtabCtx {25  VTable *pVTable;    /* The virtual table being constructed */26  Table *pTab;        /* The Table object to which the virtual table belongs */27  VtabCtx *pPrior;    /* Parent context (if any) */28  int bDeclared;      /* True after sqlite3_declare_vtab() is called */29};30 31/*32** Construct and install a Module object for a virtual table.  When this33** routine is called, it is guaranteed that all appropriate locks are held34** and the module is not already part of the connection.35**36** If there already exists a module with zName, replace it with the new one.37** If pModule==0, then delete the module zName if it exists.38*/39Module *sqlite3VtabCreateModule(40  sqlite3 *db,                    /* Database in which module is registered */41  const char *zName,              /* Name assigned to this module */42  const sqlite3_module *pModule,  /* The definition of the module */43  void *pAux,                     /* Context pointer for xCreate/xConnect */44  void (*xDestroy)(void *)        /* Module destructor function */45){46  Module *pMod;47  Module *pDel;48  char *zCopy;49  if( pModule==0 ){50    zCopy = (char*)zName;51    pMod = 0;52  }else{53    int nName = sqlite3Strlen30(zName);54    pMod = (Module *)sqlite3Malloc(sizeof(Module) + nName + 1);55    if( pMod==0 ){56      sqlite3OomFault(db);57      return 0;58    }59    zCopy = (char *)(&pMod[1]);60    memcpy(zCopy, zName, nName+1);61    pMod->zName = zCopy;62    pMod->pModule = pModule;63    pMod->pAux = pAux;64    pMod->xDestroy = xDestroy;65    pMod->pEpoTab = 0;66    pMod->nRefModule = 1;67  }68  pDel = (Module *)sqlite3HashInsert(&db->aModule,zCopy,(void*)pMod);69  if( pDel ){70    if( pDel==pMod ){71      sqlite3OomFault(db);72      sqlite3DbFree(db, pDel);73      pMod = 0;74    }else{75      sqlite3VtabEponymousTableClear(db, pDel);76      sqlite3VtabModuleUnref(db, pDel);77    }78  }79  return pMod;80}81 82/*83** The actual function that does the work of creating a new module.84** This function implements the sqlite3_create_module() and85** sqlite3_create_module_v2() interfaces.86*/87static int createModule(88  sqlite3 *db,                    /* Database in which module is registered */89  const char *zName,              /* Name assigned to this module */90  const sqlite3_module *pModule,  /* The definition of the module */91  void *pAux,                     /* Context pointer for xCreate/xConnect */92  void (*xDestroy)(void *)        /* Module destructor function */93){94  int rc = SQLITE_OK;95 96  sqlite3_mutex_enter(db->mutex);97  (void)sqlite3VtabCreateModule(db, zName, pModule, pAux, xDestroy);98  rc = sqlite3ApiExit(db, rc);99  if( rc!=SQLITE_OK && xDestroy ) xDestroy(pAux);100  sqlite3_mutex_leave(db->mutex);101  return rc;102}103 104 105/*106** External API function used to create a new virtual-table module.107*/108int sqlite3_create_module(109  sqlite3 *db,                    /* Database in which module is registered */110  const char *zName,              /* Name assigned to this module */111  const sqlite3_module *pModule,  /* The definition of the module */112  void *pAux                      /* Context pointer for xCreate/xConnect */113){114#ifdef SQLITE_ENABLE_API_ARMOR115  if( !sqlite3SafetyCheckOk(db) || zName==0 ) return SQLITE_MISUSE_BKPT;116#endif117  return createModule(db, zName, pModule, pAux, 0);118}119 120/*121** External API function used to create a new virtual-table module.122*/123int sqlite3_create_module_v2(124  sqlite3 *db,                    /* Database in which module is registered */125  const char *zName,              /* Name assigned to this module */126  const sqlite3_module *pModule,  /* The definition of the module */127  void *pAux,                     /* Context pointer for xCreate/xConnect */128  void (*xDestroy)(void *)        /* Module destructor function */129){130#ifdef SQLITE_ENABLE_API_ARMOR131  if( !sqlite3SafetyCheckOk(db) || zName==0 ) return SQLITE_MISUSE_BKPT;132#endif133  return createModule(db, zName, pModule, pAux, xDestroy);134}135 136/*137** External API to drop all virtual-table modules, except those named138** on the azNames list.139*/140int sqlite3_drop_modules(sqlite3 *db, const char** azNames){141  HashElem *pThis, *pNext;142#ifdef SQLITE_ENABLE_API_ARMOR143  if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT;144#endif145  for(pThis=sqliteHashFirst(&db->aModule); pThis; pThis=pNext){146    Module *pMod = (Module*)sqliteHashData(pThis);147    pNext = sqliteHashNext(pThis);148    if( azNames ){149      int ii;150      for(ii=0; azNames[ii]!=0 && strcmp(azNames[ii],pMod->zName)!=0; ii++){}151      if( azNames[ii]!=0 ) continue;152    }153    createModule(db, pMod->zName, 0, 0, 0);154  }155  return SQLITE_OK;156}157 158/*159** Decrement the reference count on a Module object.  Destroy the160** module when the reference count reaches zero.161*/162void sqlite3VtabModuleUnref(sqlite3 *db, Module *pMod){163  assert( pMod->nRefModule>0 );164  pMod->nRefModule--;165  if( pMod->nRefModule==0 ){166    if( pMod->xDestroy ){167      pMod->xDestroy(pMod->pAux);168    }169    assert( pMod->pEpoTab==0 );170    sqlite3DbFree(db, pMod);171  }172}173 174/*175** Lock the virtual table so that it cannot be disconnected.176** Locks nest.  Every lock should have a corresponding unlock.177** If an unlock is omitted, resources leaks will occur.178**179** If a disconnect is attempted while a virtual table is locked,180** the disconnect is deferred until all locks have been removed.181*/182void sqlite3VtabLock(VTable *pVTab){183  pVTab->nRef++;184}185 186 187/*188** pTab is a pointer to a Table structure representing a virtual-table.189** Return a pointer to the VTable object used by connection db to access190** this virtual-table, if one has been created, or NULL otherwise.191*/192VTable *sqlite3GetVTable(sqlite3 *db, Table *pTab){193  VTable *pVtab;194  assert( IsVirtual(pTab) );195  for(pVtab=pTab->u.vtab.p; pVtab && pVtab->db!=db; pVtab=pVtab->pNext);196  return pVtab;197}198 199/*200** Decrement the ref-count on a virtual table object. When the ref-count201** reaches zero, call the xDisconnect() method to delete the object.202*/203void sqlite3VtabUnlock(VTable *pVTab){204  sqlite3 *db = pVTab->db;205 206  assert( db );207  assert( pVTab->nRef>0 );208  assert( db->eOpenState==SQLITE_STATE_OPEN209       || db->eOpenState==SQLITE_STATE_ZOMBIE );210 211  pVTab->nRef--;212  if( pVTab->nRef==0 ){213    sqlite3_vtab *p = pVTab->pVtab;214    if( p ){215      p->pModule->xDisconnect(p);216    }217    sqlite3VtabModuleUnref(pVTab->db, pVTab->pMod);218    sqlite3DbFree(db, pVTab);219  }220}221 222/*223** Table p is a virtual table. This function moves all elements in the224** p->u.vtab.p list to the sqlite3.pDisconnect lists of their associated225** database connections to be disconnected at the next opportunity.226** Except, if argument db is not NULL, then the entry associated with227** connection db is left in the p->u.vtab.p list.228*/229static VTable *vtabDisconnectAll(sqlite3 *db, Table *p){230  VTable *pRet = 0;231  VTable *pVTable;232 233  assert( IsVirtual(p) );234  pVTable = p->u.vtab.p;235  p->u.vtab.p = 0;236 237  /* Assert that the mutex (if any) associated with the BtShared database238  ** that contains table p is held by the caller. See header comments239  ** above function sqlite3VtabUnlockList() for an explanation of why240  ** this makes it safe to access the sqlite3.pDisconnect list of any241  ** database connection that may have an entry in the p->u.vtab.p list.242  */243  assert( db==0 || sqlite3SchemaMutexHeld(db, 0, p->pSchema) );244 245  while( pVTable ){246    sqlite3 *db2 = pVTable->db;247    VTable *pNext = pVTable->pNext;248    assert( db2 );249    if( db2==db ){250      pRet = pVTable;251      p->u.vtab.p = pRet;252      pRet->pNext = 0;253    }else{254      pVTable->pNext = db2->pDisconnect;255      db2->pDisconnect = pVTable;256    }257    pVTable = pNext;258  }259 260  assert( !db || pRet );261  return pRet;262}263 264/*265** Table *p is a virtual table. This function removes the VTable object266** for table *p associated with database connection db from the linked267** list in p->pVTab. It also decrements the VTable ref count. This is268** used when closing database connection db to free all of its VTable269** objects without disturbing the rest of the Schema object (which may270** be being used by other shared-cache connections).271*/272void sqlite3VtabDisconnect(sqlite3 *db, Table *p){273  VTable **ppVTab;274 275  assert( IsVirtual(p) );276  assert( sqlite3BtreeHoldsAllMutexes(db) );277  assert( sqlite3_mutex_held(db->mutex) );278 279  for(ppVTab=&p->u.vtab.p; *ppVTab; ppVTab=&(*ppVTab)->pNext){280    if( (*ppVTab)->db==db  ){281      VTable *pVTab = *ppVTab;282      *ppVTab = pVTab->pNext;283      sqlite3VtabUnlock(pVTab);284      break;285    }286  }287}288 289 290/*291** Disconnect all the virtual table objects in the sqlite3.pDisconnect list.292**293** This function may only be called when the mutexes associated with all294** shared b-tree databases opened using connection db are held by the295** caller. This is done to protect the sqlite3.pDisconnect list. The296** sqlite3.pDisconnect list is accessed only as follows:297**298**   1) By this function. In this case, all BtShared mutexes and the mutex299**      associated with the database handle itself must be held.300**301**   2) By function vtabDisconnectAll(), when it adds a VTable entry to302**      the sqlite3.pDisconnect list. In this case either the BtShared mutex303**      associated with the database the virtual table is stored in is held304**      or, if the virtual table is stored in a non-sharable database, then305**      the database handle mutex is held.306**307** As a result, a sqlite3.pDisconnect cannot be accessed simultaneously308** by multiple threads. It is thread-safe.309*/310void sqlite3VtabUnlockList(sqlite3 *db){311  VTable *p = db->pDisconnect;312 313  assert( sqlite3BtreeHoldsAllMutexes(db) );314  assert( sqlite3_mutex_held(db->mutex) );315 316  if( p ){317    db->pDisconnect = 0;318    do {319      VTable *pNext = p->pNext;320      sqlite3VtabUnlock(p);321      p = pNext;322    }while( p );323  }324}325 326/*327** Clear any and all virtual-table information from the Table record.328** This routine is called, for example, just before deleting the Table329** record.330**331** Since it is a virtual-table, the Table structure contains a pointer332** to the head of a linked list of VTable structures. Each VTable333** structure is associated with a single sqlite3* user of the schema.334** The reference count of the VTable structure associated with database335** connection db is decremented immediately (which may lead to the336** structure being xDisconnected and free). Any other VTable structures337** in the list are moved to the sqlite3.pDisconnect list of the associated338** database connection.339*/340void sqlite3VtabClear(sqlite3 *db, Table *p){341  assert( IsVirtual(p) );342  assert( db!=0 );343  if( db->pnBytesFreed==0 ) vtabDisconnectAll(0, p);344  if( p->u.vtab.azArg ){345    int i;346    for(i=0; i<p->u.vtab.nArg; i++){347      if( i!=1 ) sqlite3DbFree(db, p->u.vtab.azArg[i]);348    }349    sqlite3DbFree(db, p->u.vtab.azArg);350  }351}352 353/*354** Add a new module argument to pTable->u.vtab.azArg[].355** The string is not copied - the pointer is stored.  The356** string will be freed automatically when the table is357** deleted.358*/359static void addModuleArgument(Parse *pParse, Table *pTable, char *zArg){360  sqlite3_int64 nBytes;361  char **azModuleArg;362  sqlite3 *db = pParse->db;363 364  assert( IsVirtual(pTable) );365  nBytes = sizeof(char *)*(2+pTable->u.vtab.nArg);366  if( pTable->u.vtab.nArg+3>=db->aLimit[SQLITE_LIMIT_COLUMN] ){367    sqlite3ErrorMsg(pParse, "too many columns on %s", pTable->zName);368  }369  azModuleArg = sqlite3DbRealloc(db, pTable->u.vtab.azArg, nBytes);370  if( azModuleArg==0 ){371    sqlite3DbFree(db, zArg);372  }else{373    int i = pTable->u.vtab.nArg++;374    azModuleArg[i] = zArg;375    azModuleArg[i+1] = 0;376    pTable->u.vtab.azArg = azModuleArg;377  }378}379 380/*381** The parser calls this routine when it first sees a CREATE VIRTUAL TABLE382** statement.  The module name has been parsed, but the optional list383** of parameters that follow the module name are still pending.384*/385void sqlite3VtabBeginParse(386  Parse *pParse,        /* Parsing context */387  Token *pName1,        /* Name of new table, or database name */388  Token *pName2,        /* Name of new table or NULL */389  Token *pModuleName,   /* Name of the module for the virtual table */390  int ifNotExists       /* No error if the table already exists */391){392  Table *pTable;        /* The new virtual table */393  sqlite3 *db;          /* Database connection */394 395  sqlite3StartTable(pParse, pName1, pName2, 0, 0, 1, ifNotExists);396  pTable = pParse->pNewTable;397  if( pTable==0 ) return;398  assert( 0==pTable->pIndex );399  pTable->eTabType = TABTYP_VTAB;400 401  db = pParse->db;402 403  assert( pTable->u.vtab.nArg==0 );404  addModuleArgument(pParse, pTable, sqlite3NameFromToken(db, pModuleName));405  addModuleArgument(pParse, pTable, 0);406  addModuleArgument(pParse, pTable, sqlite3DbStrDup(db, pTable->zName));407  assert( (pParse->sNameToken.z==pName2->z && pName2->z!=0)408       || (pParse->sNameToken.z==pName1->z && pName2->z==0)409  );410  pParse->sNameToken.n = (int)(411      &pModuleName->z[pModuleName->n] - pParse->sNameToken.z412  );413 414#ifndef SQLITE_OMIT_AUTHORIZATION415  /* Creating a virtual table invokes the authorization callback twice.416  ** The first invocation, to obtain permission to INSERT a row into the417  ** sqlite_schema table, has already been made by sqlite3StartTable().418  ** The second call, to obtain permission to create the table, is made now.419  */420  if( pTable->u.vtab.azArg ){421    int iDb = sqlite3SchemaToIndex(db, pTable->pSchema);422    assert( iDb>=0 ); /* The database the table is being created in */423    sqlite3AuthCheck(pParse, SQLITE_CREATE_VTABLE, pTable->zName,424            pTable->u.vtab.azArg[0], pParse->db->aDb[iDb].zDbSName);425  }426#endif427}428 429/*430** This routine takes the module argument that has been accumulating431** in pParse->zArg[] and appends it to the list of arguments on the432** virtual table currently under construction in pParse->pTable.433*/434static void addArgumentToVtab(Parse *pParse){435  if( pParse->sArg.z && pParse->pNewTable ){436    const char *z = (const char*)pParse->sArg.z;437    int n = pParse->sArg.n;438    sqlite3 *db = pParse->db;439    addModuleArgument(pParse, pParse->pNewTable, sqlite3DbStrNDup(db, z, n));440  }441}442 443/*444** The parser calls this routine after the CREATE VIRTUAL TABLE statement445** has been completely parsed.446*/447void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){448  Table *pTab = pParse->pNewTable;  /* The table being constructed */449  sqlite3 *db = pParse->db;         /* The database connection */450 451  if( pTab==0 ) return;452  assert( IsVirtual(pTab) );453  addArgumentToVtab(pParse);454  pParse->sArg.z = 0;455  if( pTab->u.vtab.nArg<1 ) return;456 457  /* If the CREATE VIRTUAL TABLE statement is being entered for the458  ** first time (in other words if the virtual table is actually being459  ** created now instead of just being read out of sqlite_schema) then460  ** do additional initialization work and store the statement text461  ** in the sqlite_schema table.462  */463  if( !db->init.busy ){464    char *zStmt;465    char *zWhere;466    int iDb;467    int iReg;468    Vdbe *v;469 470    sqlite3MayAbort(pParse);471 472    /* Compute the complete text of the CREATE VIRTUAL TABLE statement */473    if( pEnd ){474      pParse->sNameToken.n = (int)(pEnd->z - pParse->sNameToken.z) + pEnd->n;475    }476    zStmt = sqlite3MPrintf(db, "CREATE VIRTUAL TABLE %T", &pParse->sNameToken);477 478    /* A slot for the record has already been allocated in the479    ** schema table.  We just need to update that slot with all480    ** the information we've collected.481    **482    ** The VM register number pParse->u1.cr.regRowid holds the rowid of an483    ** entry in the sqlite_schema table that was created for this vtab484    ** by sqlite3StartTable().485    */486    iDb = sqlite3SchemaToIndex(db, pTab->pSchema);487    assert( pParse->isCreate );488    sqlite3NestedParse(pParse,489      "UPDATE %Q." LEGACY_SCHEMA_TABLE " "490         "SET type='table', name=%Q, tbl_name=%Q, rootpage=0, sql=%Q "491       "WHERE rowid=#%d",492      db->aDb[iDb].zDbSName,493      pTab->zName,494      pTab->zName,495      zStmt,496      pParse->u1.cr.regRowid497    );498    v = sqlite3GetVdbe(pParse);499    sqlite3ChangeCookie(pParse, iDb);500 501    sqlite3VdbeAddOp0(v, OP_Expire);502    zWhere = sqlite3MPrintf(db, "name=%Q AND sql=%Q", pTab->zName, zStmt);503    sqlite3VdbeAddParseSchemaOp(v, iDb, zWhere, 0);504    sqlite3DbFree(db, zStmt);505 506    iReg = ++pParse->nMem;507    sqlite3VdbeLoadString(v, iReg, pTab->zName);508    sqlite3VdbeAddOp2(v, OP_VCreate, iDb, iReg);509  }else{510    /* If we are rereading the sqlite_schema table create the in-memory511    ** record of the table. */512    Table *pOld;513    Schema *pSchema = pTab->pSchema;514    const char *zName = pTab->zName;515    assert( zName!=0 );516    sqlite3MarkAllShadowTablesOf(db, pTab);517    pOld = sqlite3HashInsert(&pSchema->tblHash, zName, pTab);518    if( pOld ){519      sqlite3OomFault(db);520      assert( pTab==pOld );  /* Malloc must have failed inside HashInsert() */521      return;522    }523    pParse->pNewTable = 0;524  }525}526 527/*528** The parser calls this routine when it sees the first token529** of an argument to the module name in a CREATE VIRTUAL TABLE statement.530*/531void sqlite3VtabArgInit(Parse *pParse){532  addArgumentToVtab(pParse);533  pParse->sArg.z = 0;534  pParse->sArg.n = 0;535}536 537/*538** The parser calls this routine for each token after the first token539** in an argument to the module name in a CREATE VIRTUAL TABLE statement.540*/541void sqlite3VtabArgExtend(Parse *pParse, Token *p){542  Token *pArg = &pParse->sArg;543  if( pArg->z==0 ){544    pArg->z = p->z;545    pArg->n = p->n;546  }else{547    assert(pArg->z <= p->z);548    pArg->n = (int)(&p->z[p->n] - pArg->z);549  }550}551 552/*553** Invoke a virtual table constructor (either xCreate or xConnect). The554** pointer to the function to invoke is passed as the fourth parameter555** to this procedure.556*/557static int vtabCallConstructor(558  sqlite3 *db,559  Table *pTab,560  Module *pMod,561  int (*xConstruct)(sqlite3*,void*,int,const char*const*,sqlite3_vtab**,char**),562  char **pzErr563){564  VtabCtx sCtx;565  VTable *pVTable;566  int rc;567  const char *const*azArg;568  int nArg = pTab->u.vtab.nArg;569  char *zErr = 0;570  char *zModuleName;571  int iDb;572  VtabCtx *pCtx;573 574  assert( IsVirtual(pTab) );575  azArg = (const char *const*)pTab->u.vtab.azArg;576 577  /* Check that the virtual-table is not already being initialized */578  for(pCtx=db->pVtabCtx; pCtx; pCtx=pCtx->pPrior){579    if( pCtx->pTab==pTab ){580      *pzErr = sqlite3MPrintf(db,581          "vtable constructor called recursively: %s", pTab->zName582      );583      return SQLITE_LOCKED;584    }585  }586 587  zModuleName = sqlite3DbStrDup(db, pTab->zName);588  if( !zModuleName ){589    return SQLITE_NOMEM_BKPT;590  }591 592  pVTable = sqlite3MallocZero(sizeof(VTable));593  if( !pVTable ){594    sqlite3OomFault(db);595    sqlite3DbFree(db, zModuleName);596    return SQLITE_NOMEM_BKPT;597  }598  pVTable->db = db;599  pVTable->pMod = pMod;600  pVTable->eVtabRisk = SQLITE_VTABRISK_Normal;601 602  iDb = sqlite3SchemaToIndex(db, pTab->pSchema);603  pTab->u.vtab.azArg[1] = db->aDb[iDb].zDbSName;604 605  /* Invoke the virtual table constructor */606  assert( &db->pVtabCtx );607  assert( xConstruct );608  sCtx.pTab = pTab;609  sCtx.pVTable = pVTable;610  sCtx.pPrior = db->pVtabCtx;611  sCtx.bDeclared = 0;612  db->pVtabCtx = &sCtx;613  pTab->nTabRef++;614  rc = xConstruct(db, pMod->pAux, nArg, azArg, &pVTable->pVtab, &zErr);615  assert( pTab!=0 );616  assert( pTab->nTabRef>1 || rc!=SQLITE_OK );617  sqlite3DeleteTable(db, pTab);618  db->pVtabCtx = sCtx.pPrior;619  if( rc==SQLITE_NOMEM ) sqlite3OomFault(db);620  assert( sCtx.pTab==pTab );621 622  if( SQLITE_OK!=rc ){623    if( zErr==0 ){624      *pzErr = sqlite3MPrintf(db, "vtable constructor failed: %s", zModuleName);625    }else {626      *pzErr = sqlite3MPrintf(db, "%s", zErr);627      sqlite3_free(zErr);628    }629    sqlite3DbFree(db, pVTable);630  }else if( ALWAYS(pVTable->pVtab) ){631    /* Justification of ALWAYS():  A correct vtab constructor must allocate632    ** the sqlite3_vtab object if successful.  */633    memset(pVTable->pVtab, 0, sizeof(pVTable->pVtab[0]));634    pVTable->pVtab->pModule = pMod->pModule;635    pMod->nRefModule++;636    pVTable->nRef = 1;637    if( sCtx.bDeclared==0 ){638      const char *zFormat = "vtable constructor did not declare schema: %s";639      *pzErr = sqlite3MPrintf(db, zFormat, zModuleName);640      sqlite3VtabUnlock(pVTable);641      rc = SQLITE_ERROR;642    }else{643      int iCol;644      u16 oooHidden = 0;645      /* If everything went according to plan, link the new VTable structure646      ** into the linked list headed by pTab->u.vtab.p. Then loop through the647      ** columns of the table to see if any of them contain the token "hidden".648      ** If so, set the Column COLFLAG_HIDDEN flag and remove the token from649      ** the type string.  */650      pVTable->pNext = pTab->u.vtab.p;651      pTab->u.vtab.p = pVTable;652 653      for(iCol=0; iCol<pTab->nCol; iCol++){654        char *zType = sqlite3ColumnType(&pTab->aCol[iCol], "");655        int nType;656        int i = 0;657        nType = sqlite3Strlen30(zType);658        for(i=0; i<nType; i++){659          if( 0==sqlite3StrNICmp("hidden", &zType[i], 6)660           && (i==0 || zType[i-1]==' ')661           && (zType[i+6]=='\0' || zType[i+6]==' ')662          ){663            break;664          }665        }666        if( i<nType ){667          int j;668          int nDel = 6 + (zType[i+6] ? 1 : 0);669          for(j=i; (j+nDel)<=nType; j++){670            zType[j] = zType[j+nDel];671          }672          if( zType[i]=='\0' && i>0 ){673            assert(zType[i-1]==' ');674            zType[i-1] = '\0';675          }676          pTab->aCol[iCol].colFlags |= COLFLAG_HIDDEN;677          pTab->tabFlags |= TF_HasHidden;678          oooHidden = TF_OOOHidden;679        }else{680          pTab->tabFlags |= oooHidden;681        }682      }683    }684  }685 686  sqlite3DbFree(db, zModuleName);687  return rc;688}689 690/*691** This function is invoked by the parser to call the xConnect() method692** of the virtual table pTab. If an error occurs, an error code is returned693** and an error left in pParse.694**695** This call is a no-op if table pTab is not a virtual table.696*/697int sqlite3VtabCallConnect(Parse *pParse, Table *pTab){698  sqlite3 *db = pParse->db;699  const char *zMod;700  Module *pMod;701  int rc;702 703  assert( pTab );704  assert( IsVirtual(pTab) );705  if( sqlite3GetVTable(db, pTab) ){706    return SQLITE_OK;707  }708 709  /* Locate the required virtual table module */710  zMod = pTab->u.vtab.azArg[0];711  pMod = (Module*)sqlite3HashFind(&db->aModule, zMod);712 713  if( !pMod ){714    const char *zModule = pTab->u.vtab.azArg[0];715    sqlite3ErrorMsg(pParse, "no such module: %s", zModule);716    rc = SQLITE_ERROR;717  }else{718    char *zErr = 0;719    rc = vtabCallConstructor(db, pTab, pMod, pMod->pModule->xConnect, &zErr);720    if( rc!=SQLITE_OK ){721      sqlite3ErrorMsg(pParse, "%s", zErr);722      pParse->rc = rc;723    }724    sqlite3DbFree(db, zErr);725  }726 727  return rc;728}729/*730** Grow the db->aVTrans[] array so that there is room for at least one731** more v-table. Return SQLITE_NOMEM if a malloc fails, or SQLITE_OK otherwise.732*/733static int growVTrans(sqlite3 *db){734  const int ARRAY_INCR = 5;735 736  /* Grow the sqlite3.aVTrans array if required */737  if( (db->nVTrans%ARRAY_INCR)==0 ){738    VTable **aVTrans;739    sqlite3_int64 nBytes = sizeof(sqlite3_vtab*)*740                                 ((sqlite3_int64)db->nVTrans + ARRAY_INCR);741    aVTrans = sqlite3DbRealloc(db, (void *)db->aVTrans, nBytes);742    if( !aVTrans ){743      return SQLITE_NOMEM_BKPT;744    }745    memset(&aVTrans[db->nVTrans], 0, sizeof(sqlite3_vtab *)*ARRAY_INCR);746    db->aVTrans = aVTrans;747  }748 749  return SQLITE_OK;750}751 752/*753** Add the virtual table pVTab to the array sqlite3.aVTrans[]. Space should754** have already been reserved using growVTrans().755*/756static void addToVTrans(sqlite3 *db, VTable *pVTab){757  /* Add pVtab to the end of sqlite3.aVTrans */758  db->aVTrans[db->nVTrans++] = pVTab;759  sqlite3VtabLock(pVTab);760}761 762/*763** This function is invoked by the vdbe to call the xCreate method764** of the virtual table named zTab in database iDb.765**766** If an error occurs, *pzErr is set to point to an English language767** description of the error and an SQLITE_XXX error code is returned.768** In this case the caller must call sqlite3DbFree(db, ) on *pzErr.769*/770int sqlite3VtabCallCreate(sqlite3 *db, int iDb, const char *zTab, char **pzErr){771  int rc = SQLITE_OK;772  Table *pTab;773  Module *pMod;774  const char *zMod;775 776  pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zDbSName);777  assert( pTab && IsVirtual(pTab) && !pTab->u.vtab.p );778 779  /* Locate the required virtual table module */780  zMod = pTab->u.vtab.azArg[0];781  pMod = (Module*)sqlite3HashFind(&db->aModule, zMod);782 783  /* If the module has been registered and includes a Create method,784  ** invoke it now. If the module has not been registered, return an785  ** error. Otherwise, do nothing.786  */787  if( pMod==0 || pMod->pModule->xCreate==0 || pMod->pModule->xDestroy==0 ){788    *pzErr = sqlite3MPrintf(db, "no such module: %s", zMod);789    rc = SQLITE_ERROR;790  }else{791    rc = vtabCallConstructor(db, pTab, pMod, pMod->pModule->xCreate, pzErr);792  }793 794  /* Justification of ALWAYS():  The xConstructor method is required to795  ** create a valid sqlite3_vtab if it returns SQLITE_OK. */796  if( rc==SQLITE_OK && ALWAYS(sqlite3GetVTable(db, pTab)) ){797    rc = growVTrans(db);798    if( rc==SQLITE_OK ){799      addToVTrans(db, sqlite3GetVTable(db, pTab));800    }801  }802 803  return rc;804}805 806/*807** This function is used to set the schema of a virtual table.  It is only808** valid to call this function from within the xCreate() or xConnect() of a809** virtual table module.810*/811int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){812  VtabCtx *pCtx;813  int rc = SQLITE_OK;814  Table *pTab;815  Parse sParse;816  int initBusy;817  int i;818  const unsigned char *z;819  static const u8 aKeyword[] = { TK_CREATE, TK_TABLE, 0 };820 821#ifdef SQLITE_ENABLE_API_ARMOR822  if( !sqlite3SafetyCheckOk(db) || zCreateTable==0 ){823    return SQLITE_MISUSE_BKPT;824  }825#endif826 827  /* Verify that the first two keywords in the CREATE TABLE statement828  ** really are "CREATE" and "TABLE".  If this is not the case, then829  ** sqlite3_declare_vtab() is being misused.830  */831  z = (const unsigned char*)zCreateTable;832  for(i=0; aKeyword[i]; i++){833    int tokenType = 0;834    do{835      z += sqlite3GetToken(z, &tokenType);836    }while( tokenType==TK_SPACE || tokenType==TK_COMMENT );837    if( tokenType!=aKeyword[i] ){838      sqlite3ErrorWithMsg(db, SQLITE_ERROR, "syntax error");839      return SQLITE_ERROR;840    }841  }842 843  sqlite3_mutex_enter(db->mutex);844  pCtx = db->pVtabCtx;845  if( !pCtx || pCtx->bDeclared ){846    sqlite3Error(db, SQLITE_MISUSE_BKPT);847    sqlite3_mutex_leave(db->mutex);848    return SQLITE_MISUSE_BKPT;849  }850 851  pTab = pCtx->pTab;852  assert( IsVirtual(pTab) );853 854  sqlite3ParseObjectInit(&sParse, db);855  sParse.eParseMode = PARSE_MODE_DECLARE_VTAB;856  sParse.disableTriggers = 1;857  /* We should never be able to reach this point while loading the858  ** schema.  Nevertheless, defend against that (turn off db->init.busy)859  ** in case a bug arises. */860  assert( db->init.busy==0 );861  initBusy = db->init.busy;862  db->init.busy = 0;863  sParse.nQueryLoop = 1;864  if( SQLITE_OK==sqlite3RunParser(&sParse, zCreateTable) ){865    assert( sParse.pNewTable!=0 );866    assert( !db->mallocFailed );867    assert( IsOrdinaryTable(sParse.pNewTable) );868    assert( sParse.zErrMsg==0 );869    if( !pTab->aCol ){870      Table *pNew = sParse.pNewTable;871      Index *pIdx;872      pTab->aCol = pNew->aCol;873      assert( IsOrdinaryTable(pNew) );874      sqlite3ExprListDelete(db, pNew->u.tab.pDfltList);875      pTab->nNVCol = pTab->nCol = pNew->nCol;876      pTab->tabFlags |= pNew->tabFlags & (TF_WithoutRowid|TF_NoVisibleRowid);877      pNew->nCol = 0;878      pNew->aCol = 0;879      assert( pTab->pIndex==0 );880      assert( HasRowid(pNew) || sqlite3PrimaryKeyIndex(pNew)!=0 );881      if( !HasRowid(pNew)882       && pCtx->pVTable->pMod->pModule->xUpdate!=0883       && sqlite3PrimaryKeyIndex(pNew)->nKeyCol!=1884      ){885        /* WITHOUT ROWID virtual tables must either be read-only (xUpdate==0)886        ** or else must have a single-column PRIMARY KEY */887        rc = SQLITE_ERROR;888      }889      pIdx = pNew->pIndex;890      if( pIdx ){891        assert( pIdx->pNext==0 );892        pTab->pIndex = pIdx;893        pNew->pIndex = 0;894        pIdx->pTable = pTab;895      }896    }897    pCtx->bDeclared = 1;898  }else{899    sqlite3ErrorWithMsg(db, SQLITE_ERROR,900          (sParse.zErrMsg ? "%s" : 0), sParse.zErrMsg);901    sqlite3DbFree(db, sParse.zErrMsg);902    rc = SQLITE_ERROR;903  }904  sParse.eParseMode = PARSE_MODE_NORMAL;905 906  if( sParse.pVdbe ){907    sqlite3VdbeFinalize(sParse.pVdbe);908  }909  sqlite3DeleteTable(db, sParse.pNewTable);910  sqlite3ParseObjectReset(&sParse);911  db->init.busy = initBusy;912 913  assert( (rc&0xff)==rc );914  rc = sqlite3ApiExit(db, rc);915  sqlite3_mutex_leave(db->mutex);916  return rc;917}918 919/*920** This function is invoked by the vdbe to call the xDestroy method921** of the virtual table named zTab in database iDb. This occurs922** when a DROP TABLE is mentioned.923**924** This call is a no-op if zTab is not a virtual table.925*/926int sqlite3VtabCallDestroy(sqlite3 *db, int iDb, const char *zTab){927  int rc = SQLITE_OK;928  Table *pTab;929 930  pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zDbSName);931  if( ALWAYS(pTab!=0)932   && ALWAYS(IsVirtual(pTab))933   && ALWAYS(pTab->u.vtab.p!=0)934  ){935    VTable *p;936    int (*xDestroy)(sqlite3_vtab *);937    for(p=pTab->u.vtab.p; p; p=p->pNext){938      assert( p->pVtab );939      if( p->pVtab->nRef>0 ){940        return SQLITE_LOCKED;941      }942    }943    p = vtabDisconnectAll(db, pTab);944    xDestroy = p->pMod->pModule->xDestroy;945    if( xDestroy==0 ) xDestroy = p->pMod->pModule->xDisconnect;946    assert( xDestroy!=0 );947    pTab->nTabRef++;948    rc = xDestroy(p->pVtab);949    /* Remove the sqlite3_vtab* from the aVTrans[] array, if applicable */950    if( rc==SQLITE_OK ){951      assert( pTab->u.vtab.p==p && p->pNext==0 );952      p->pVtab = 0;953      pTab->u.vtab.p = 0;954      sqlite3VtabUnlock(p);955    }956    sqlite3DeleteTable(db, pTab);957  }958 959  return rc;960}961 962/*963** This function invokes either the xRollback or xCommit method964** of each of the virtual tables in the sqlite3.aVTrans array. The method965** called is identified by the second argument, "offset", which is966** the offset of the method to call in the sqlite3_module structure.967**968** The array is cleared after invoking the callbacks.969*/970static void callFinaliser(sqlite3 *db, int offset){971  int i;972  if( db->aVTrans ){973    VTable **aVTrans = db->aVTrans;974    db->aVTrans = 0;975    for(i=0; i<db->nVTrans; i++){976      VTable *pVTab = aVTrans[i];977      sqlite3_vtab *p = pVTab->pVtab;978      if( p ){979        int (*x)(sqlite3_vtab *);980        x = *(int (**)(sqlite3_vtab *))((char *)p->pModule + offset);981        if( x ) x(p);982      }983      pVTab->iSavepoint = 0;984      sqlite3VtabUnlock(pVTab);985    }986    sqlite3DbFree(db, aVTrans);987    db->nVTrans = 0;988  }989}990 991/*992** Invoke the xSync method of all virtual tables in the sqlite3.aVTrans993** array. Return the error code for the first error that occurs, or994** SQLITE_OK if all xSync operations are successful.995**996** If an error message is available, leave it in p->zErrMsg.997*/998int sqlite3VtabSync(sqlite3 *db, Vdbe *p){999  int i;1000  int rc = SQLITE_OK;1001  VTable **aVTrans = db->aVTrans;1002 1003  db->aVTrans = 0;1004  for(i=0; rc==SQLITE_OK && i<db->nVTrans; i++){1005    int (*x)(sqlite3_vtab *);1006    sqlite3_vtab *pVtab = aVTrans[i]->pVtab;1007    if( pVtab && (x = pVtab->pModule->xSync)!=0 ){1008      rc = x(pVtab);1009      sqlite3VtabImportErrmsg(p, pVtab);1010    }1011  }1012  db->aVTrans = aVTrans;1013  return rc;1014}1015 1016/*1017** Invoke the xRollback method of all virtual tables in the1018** sqlite3.aVTrans array. Then clear the array itself.1019*/1020int sqlite3VtabRollback(sqlite3 *db){1021  callFinaliser(db, offsetof(sqlite3_module,xRollback));1022  return SQLITE_OK;1023}1024 1025/*1026** Invoke the xCommit method of all virtual tables in the1027** sqlite3.aVTrans array. Then clear the array itself.1028*/1029int sqlite3VtabCommit(sqlite3 *db){1030  callFinaliser(db, offsetof(sqlite3_module,xCommit));1031  return SQLITE_OK;1032}1033 1034/*1035** If the virtual table pVtab supports the transaction interface1036** (xBegin/xRollback/xCommit and optionally xSync) and a transaction is1037** not currently open, invoke the xBegin method now.1038**1039** If the xBegin call is successful, place the sqlite3_vtab pointer1040** in the sqlite3.aVTrans array.1041*/1042int sqlite3VtabBegin(sqlite3 *db, VTable *pVTab){1043  int rc = SQLITE_OK;1044  const sqlite3_module *pModule;1045 1046  /* Special case: If db->aVTrans is NULL and db->nVTrans is greater1047  ** than zero, then this function is being called from within a1048  ** virtual module xSync() callback. It is illegal to write to1049  ** virtual module tables in this case, so return SQLITE_LOCKED.1050  */1051  if( sqlite3VtabInSync(db) ){1052    return SQLITE_LOCKED;1053  }1054  if( !pVTab ){1055    return SQLITE_OK;1056  }1057  pModule = pVTab->pVtab->pModule;1058 1059  if( pModule->xBegin ){1060    int i;1061 1062    /* If pVtab is already in the aVTrans array, return early */1063    for(i=0; i<db->nVTrans; i++){1064      if( db->aVTrans[i]==pVTab ){1065        return SQLITE_OK;1066      }1067    }1068 1069    /* Invoke the xBegin method. If successful, add the vtab to the1070    ** sqlite3.aVTrans[] array. */1071    rc = growVTrans(db);1072    if( rc==SQLITE_OK ){1073      rc = pModule->xBegin(pVTab->pVtab);1074      if( rc==SQLITE_OK ){1075        int iSvpt = db->nStatement + db->nSavepoint;1076        addToVTrans(db, pVTab);1077        if( iSvpt && pModule->xSavepoint ){1078          pVTab->iSavepoint = iSvpt;1079          rc = pModule->xSavepoint(pVTab->pVtab, iSvpt-1);1080        }1081      }1082    }1083  }1084  return rc;1085}1086 1087/*1088** Invoke either the xSavepoint, xRollbackTo or xRelease method of all1089** virtual tables that currently have an open transaction. Pass iSavepoint1090** as the second argument to the virtual table method invoked.1091**1092** If op is SAVEPOINT_BEGIN, the xSavepoint method is invoked. If it is1093** SAVEPOINT_ROLLBACK, the xRollbackTo method. Otherwise, if op is1094** SAVEPOINT_RELEASE, then the xRelease method of each virtual table with1095** an open transaction is invoked.1096**1097** If any virtual table method returns an error code other than SQLITE_OK,1098** processing is abandoned and the error returned to the caller of this1099** function immediately. If all calls to virtual table methods are successful,1100** SQLITE_OK is returned.1101*/1102int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){1103  int rc = SQLITE_OK;1104 1105  assert( op==SAVEPOINT_RELEASE||op==SAVEPOINT_ROLLBACK||op==SAVEPOINT_BEGIN );1106  assert( iSavepoint>=-1 );1107  if( db->aVTrans ){1108    int i;1109    for(i=0; rc==SQLITE_OK && i<db->nVTrans; i++){1110      VTable *pVTab = db->aVTrans[i];1111      const sqlite3_module *pMod = pVTab->pMod->pModule;1112      if( pVTab->pVtab && pMod->iVersion>=2 ){1113        int (*xMethod)(sqlite3_vtab *, int);1114        sqlite3VtabLock(pVTab);1115        switch( op ){1116          case SAVEPOINT_BEGIN:1117            xMethod = pMod->xSavepoint;1118            pVTab->iSavepoint = iSavepoint+1;1119            break;1120          case SAVEPOINT_ROLLBACK:1121            xMethod = pMod->xRollbackTo;1122            break;1123          default:1124            xMethod = pMod->xRelease;1125            break;1126        }1127        if( xMethod && pVTab->iSavepoint>iSavepoint ){1128          u64 savedFlags = (db->flags & SQLITE_Defensive);1129          db->flags &= ~(u64)SQLITE_Defensive;1130          rc = xMethod(pVTab->pVtab, iSavepoint);1131          db->flags |= savedFlags;1132        }1133        sqlite3VtabUnlock(pVTab);1134      }1135    }1136  }1137  return rc;1138}1139 1140/*1141** The first parameter (pDef) is a function implementation.  The1142** second parameter (pExpr) is the first argument to this function.1143** If pExpr is a column in a virtual table, then let the virtual1144** table implementation have an opportunity to overload the function.1145**1146** This routine is used to allow virtual table implementations to1147** overload MATCH, LIKE, GLOB, and REGEXP operators.1148**1149** Return either the pDef argument (indicating no change) or a1150** new FuncDef structure that is marked as ephemeral using the1151** SQLITE_FUNC_EPHEM flag.1152*/1153FuncDef *sqlite3VtabOverloadFunction(1154  sqlite3 *db,    /* Database connection for reporting malloc problems */1155  FuncDef *pDef,  /* Function to possibly overload */1156  int nArg,       /* Number of arguments to the function */1157  Expr *pExpr     /* First argument to the function */1158){1159  Table *pTab;1160  sqlite3_vtab *pVtab;1161  sqlite3_module *pMod;1162  void (*xSFunc)(sqlite3_context*,int,sqlite3_value**) = 0;1163  void *pArg = 0;1164  FuncDef *pNew;1165  int rc = 0;1166 1167  /* Check to see the left operand is a column in a virtual table */1168  if( NEVER(pExpr==0) ) return pDef;1169  if( pExpr->op!=TK_COLUMN ) return pDef;1170  assert( ExprUseYTab(pExpr) );1171  pTab = pExpr->y.pTab;1172  if( NEVER(pTab==0) ) return pDef;1173  if( !IsVirtual(pTab) ) return pDef;1174  pVtab = sqlite3GetVTable(db, pTab)->pVtab;1175  assert( pVtab!=0 );1176  assert( pVtab->pModule!=0 );1177  pMod = (sqlite3_module *)pVtab->pModule;1178  if( pMod->xFindFunction==0 ) return pDef;1179 1180  /* Call the xFindFunction method on the virtual table implementation1181  ** to see if the implementation wants to overload this function.1182  **1183  ** Though undocumented, we have historically always invoked xFindFunction1184  ** with an all lower-case function name.  Continue in this tradition to1185  ** avoid any chance of an incompatibility.1186  */1187#ifdef SQLITE_DEBUG1188  {1189    int i;1190    for(i=0; pDef->zName[i]; i++){1191      unsigned char x = (unsigned char)pDef->zName[i];1192      assert( x==sqlite3UpperToLower[x] );1193    }1194  }1195#endif1196  rc = pMod->xFindFunction(pVtab, nArg, pDef->zName, &xSFunc, &pArg);1197  if( rc==0 ){1198    return pDef;1199  }1200 

Showing the first 1,200 of 1381 lines. Download the file for the rest.