Annotation of embedaddon/sqlite3/src/build.c, revision 1.1
1.1 ! misho 1: /*
! 2: ** 2001 September 15
! 3: **
! 4: ** The author disclaims copyright to this source code. In place of
! 5: ** a legal notice, here is a blessing:
! 6: **
! 7: ** May you do good and not evil.
! 8: ** May you find forgiveness for yourself and forgive others.
! 9: ** May you share freely, never taking more than you give.
! 10: **
! 11: *************************************************************************
! 12: ** This file contains C code routines that are called by the SQLite parser
! 13: ** when syntax rules are reduced. The routines in this file handle the
! 14: ** following kinds of SQL syntax:
! 15: **
! 16: ** CREATE TABLE
! 17: ** DROP TABLE
! 18: ** CREATE INDEX
! 19: ** DROP INDEX
! 20: ** creating ID lists
! 21: ** BEGIN TRANSACTION
! 22: ** COMMIT
! 23: ** ROLLBACK
! 24: */
! 25: #include "sqliteInt.h"
! 26:
! 27: /*
! 28: ** This routine is called when a new SQL statement is beginning to
! 29: ** be parsed. Initialize the pParse structure as needed.
! 30: */
! 31: void sqlite3BeginParse(Parse *pParse, int explainFlag){
! 32: pParse->explain = (u8)explainFlag;
! 33: pParse->nVar = 0;
! 34: }
! 35:
! 36: #ifndef SQLITE_OMIT_SHARED_CACHE
! 37: /*
! 38: ** The TableLock structure is only used by the sqlite3TableLock() and
! 39: ** codeTableLocks() functions.
! 40: */
! 41: struct TableLock {
! 42: int iDb; /* The database containing the table to be locked */
! 43: int iTab; /* The root page of the table to be locked */
! 44: u8 isWriteLock; /* True for write lock. False for a read lock */
! 45: const char *zName; /* Name of the table */
! 46: };
! 47:
! 48: /*
! 49: ** Record the fact that we want to lock a table at run-time.
! 50: **
! 51: ** The table to be locked has root page iTab and is found in database iDb.
! 52: ** A read or a write lock can be taken depending on isWritelock.
! 53: **
! 54: ** This routine just records the fact that the lock is desired. The
! 55: ** code to make the lock occur is generated by a later call to
! 56: ** codeTableLocks() which occurs during sqlite3FinishCoding().
! 57: */
! 58: void sqlite3TableLock(
! 59: Parse *pParse, /* Parsing context */
! 60: int iDb, /* Index of the database containing the table to lock */
! 61: int iTab, /* Root page number of the table to be locked */
! 62: u8 isWriteLock, /* True for a write lock */
! 63: const char *zName /* Name of the table to be locked */
! 64: ){
! 65: Parse *pToplevel = sqlite3ParseToplevel(pParse);
! 66: int i;
! 67: int nBytes;
! 68: TableLock *p;
! 69: assert( iDb>=0 );
! 70:
! 71: for(i=0; i<pToplevel->nTableLock; i++){
! 72: p = &pToplevel->aTableLock[i];
! 73: if( p->iDb==iDb && p->iTab==iTab ){
! 74: p->isWriteLock = (p->isWriteLock || isWriteLock);
! 75: return;
! 76: }
! 77: }
! 78:
! 79: nBytes = sizeof(TableLock) * (pToplevel->nTableLock+1);
! 80: pToplevel->aTableLock =
! 81: sqlite3DbReallocOrFree(pToplevel->db, pToplevel->aTableLock, nBytes);
! 82: if( pToplevel->aTableLock ){
! 83: p = &pToplevel->aTableLock[pToplevel->nTableLock++];
! 84: p->iDb = iDb;
! 85: p->iTab = iTab;
! 86: p->isWriteLock = isWriteLock;
! 87: p->zName = zName;
! 88: }else{
! 89: pToplevel->nTableLock = 0;
! 90: pToplevel->db->mallocFailed = 1;
! 91: }
! 92: }
! 93:
! 94: /*
! 95: ** Code an OP_TableLock instruction for each table locked by the
! 96: ** statement (configured by calls to sqlite3TableLock()).
! 97: */
! 98: static void codeTableLocks(Parse *pParse){
! 99: int i;
! 100: Vdbe *pVdbe;
! 101:
! 102: pVdbe = sqlite3GetVdbe(pParse);
! 103: assert( pVdbe!=0 ); /* sqlite3GetVdbe cannot fail: VDBE already allocated */
! 104:
! 105: for(i=0; i<pParse->nTableLock; i++){
! 106: TableLock *p = &pParse->aTableLock[i];
! 107: int p1 = p->iDb;
! 108: sqlite3VdbeAddOp4(pVdbe, OP_TableLock, p1, p->iTab, p->isWriteLock,
! 109: p->zName, P4_STATIC);
! 110: }
! 111: }
! 112: #else
! 113: #define codeTableLocks(x)
! 114: #endif
! 115:
! 116: /*
! 117: ** This routine is called after a single SQL statement has been
! 118: ** parsed and a VDBE program to execute that statement has been
! 119: ** prepared. This routine puts the finishing touches on the
! 120: ** VDBE program and resets the pParse structure for the next
! 121: ** parse.
! 122: **
! 123: ** Note that if an error occurred, it might be the case that
! 124: ** no VDBE code was generated.
! 125: */
! 126: void sqlite3FinishCoding(Parse *pParse){
! 127: sqlite3 *db;
! 128: Vdbe *v;
! 129:
! 130: db = pParse->db;
! 131: if( db->mallocFailed ) return;
! 132: if( pParse->nested ) return;
! 133: if( pParse->nErr ) return;
! 134:
! 135: /* Begin by generating some termination code at the end of the
! 136: ** vdbe program
! 137: */
! 138: v = sqlite3GetVdbe(pParse);
! 139: assert( !pParse->isMultiWrite
! 140: || sqlite3VdbeAssertMayAbort(v, pParse->mayAbort));
! 141: if( v ){
! 142: sqlite3VdbeAddOp0(v, OP_Halt);
! 143:
! 144: /* The cookie mask contains one bit for each database file open.
! 145: ** (Bit 0 is for main, bit 1 is for temp, and so forth.) Bits are
! 146: ** set for each database that is used. Generate code to start a
! 147: ** transaction on each used database and to verify the schema cookie
! 148: ** on each used database.
! 149: */
! 150: if( pParse->cookieGoto>0 ){
! 151: yDbMask mask;
! 152: int iDb;
! 153: sqlite3VdbeJumpHere(v, pParse->cookieGoto-1);
! 154: for(iDb=0, mask=1; iDb<db->nDb; mask<<=1, iDb++){
! 155: if( (mask & pParse->cookieMask)==0 ) continue;
! 156: sqlite3VdbeUsesBtree(v, iDb);
! 157: sqlite3VdbeAddOp2(v,OP_Transaction, iDb, (mask & pParse->writeMask)!=0);
! 158: if( db->init.busy==0 ){
! 159: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
! 160: sqlite3VdbeAddOp3(v, OP_VerifyCookie,
! 161: iDb, pParse->cookieValue[iDb],
! 162: db->aDb[iDb].pSchema->iGeneration);
! 163: }
! 164: }
! 165: #ifndef SQLITE_OMIT_VIRTUALTABLE
! 166: {
! 167: int i;
! 168: for(i=0; i<pParse->nVtabLock; i++){
! 169: char *vtab = (char *)sqlite3GetVTable(db, pParse->apVtabLock[i]);
! 170: sqlite3VdbeAddOp4(v, OP_VBegin, 0, 0, 0, vtab, P4_VTAB);
! 171: }
! 172: pParse->nVtabLock = 0;
! 173: }
! 174: #endif
! 175:
! 176: /* Once all the cookies have been verified and transactions opened,
! 177: ** obtain the required table-locks. This is a no-op unless the
! 178: ** shared-cache feature is enabled.
! 179: */
! 180: codeTableLocks(pParse);
! 181:
! 182: /* Initialize any AUTOINCREMENT data structures required.
! 183: */
! 184: sqlite3AutoincrementBegin(pParse);
! 185:
! 186: /* Finally, jump back to the beginning of the executable code. */
! 187: sqlite3VdbeAddOp2(v, OP_Goto, 0, pParse->cookieGoto);
! 188: }
! 189: }
! 190:
! 191:
! 192: /* Get the VDBE program ready for execution
! 193: */
! 194: if( v && ALWAYS(pParse->nErr==0) && !db->mallocFailed ){
! 195: #ifdef SQLITE_DEBUG
! 196: FILE *trace = (db->flags & SQLITE_VdbeTrace)!=0 ? stdout : 0;
! 197: sqlite3VdbeTrace(v, trace);
! 198: #endif
! 199: assert( pParse->iCacheLevel==0 ); /* Disables and re-enables match */
! 200: /* A minimum of one cursor is required if autoincrement is used
! 201: * See ticket [a696379c1f08866] */
! 202: if( pParse->pAinc!=0 && pParse->nTab==0 ) pParse->nTab = 1;
! 203: sqlite3VdbeMakeReady(v, pParse);
! 204: pParse->rc = SQLITE_DONE;
! 205: pParse->colNamesSet = 0;
! 206: }else{
! 207: pParse->rc = SQLITE_ERROR;
! 208: }
! 209: pParse->nTab = 0;
! 210: pParse->nMem = 0;
! 211: pParse->nSet = 0;
! 212: pParse->nVar = 0;
! 213: pParse->cookieMask = 0;
! 214: pParse->cookieGoto = 0;
! 215: }
! 216:
! 217: /*
! 218: ** Run the parser and code generator recursively in order to generate
! 219: ** code for the SQL statement given onto the end of the pParse context
! 220: ** currently under construction. When the parser is run recursively
! 221: ** this way, the final OP_Halt is not appended and other initialization
! 222: ** and finalization steps are omitted because those are handling by the
! 223: ** outermost parser.
! 224: **
! 225: ** Not everything is nestable. This facility is designed to permit
! 226: ** INSERT, UPDATE, and DELETE operations against SQLITE_MASTER. Use
! 227: ** care if you decide to try to use this routine for some other purposes.
! 228: */
! 229: void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){
! 230: va_list ap;
! 231: char *zSql;
! 232: char *zErrMsg = 0;
! 233: sqlite3 *db = pParse->db;
! 234: # define SAVE_SZ (sizeof(Parse) - offsetof(Parse,nVar))
! 235: char saveBuf[SAVE_SZ];
! 236:
! 237: if( pParse->nErr ) return;
! 238: assert( pParse->nested<10 ); /* Nesting should only be of limited depth */
! 239: va_start(ap, zFormat);
! 240: zSql = sqlite3VMPrintf(db, zFormat, ap);
! 241: va_end(ap);
! 242: if( zSql==0 ){
! 243: return; /* A malloc must have failed */
! 244: }
! 245: pParse->nested++;
! 246: memcpy(saveBuf, &pParse->nVar, SAVE_SZ);
! 247: memset(&pParse->nVar, 0, SAVE_SZ);
! 248: sqlite3RunParser(pParse, zSql, &zErrMsg);
! 249: sqlite3DbFree(db, zErrMsg);
! 250: sqlite3DbFree(db, zSql);
! 251: memcpy(&pParse->nVar, saveBuf, SAVE_SZ);
! 252: pParse->nested--;
! 253: }
! 254:
! 255: /*
! 256: ** Locate the in-memory structure that describes a particular database
! 257: ** table given the name of that table and (optionally) the name of the
! 258: ** database containing the table. Return NULL if not found.
! 259: **
! 260: ** If zDatabase is 0, all databases are searched for the table and the
! 261: ** first matching table is returned. (No checking for duplicate table
! 262: ** names is done.) The search order is TEMP first, then MAIN, then any
! 263: ** auxiliary databases added using the ATTACH command.
! 264: **
! 265: ** See also sqlite3LocateTable().
! 266: */
! 267: Table *sqlite3FindTable(sqlite3 *db, const char *zName, const char *zDatabase){
! 268: Table *p = 0;
! 269: int i;
! 270: int nName;
! 271: assert( zName!=0 );
! 272: nName = sqlite3Strlen30(zName);
! 273: /* All mutexes are required for schema access. Make sure we hold them. */
! 274: assert( zDatabase!=0 || sqlite3BtreeHoldsAllMutexes(db) );
! 275: for(i=OMIT_TEMPDB; i<db->nDb; i++){
! 276: int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */
! 277: if( zDatabase!=0 && sqlite3StrICmp(zDatabase, db->aDb[j].zName) ) continue;
! 278: assert( sqlite3SchemaMutexHeld(db, j, 0) );
! 279: p = sqlite3HashFind(&db->aDb[j].pSchema->tblHash, zName, nName);
! 280: if( p ) break;
! 281: }
! 282: return p;
! 283: }
! 284:
! 285: /*
! 286: ** Locate the in-memory structure that describes a particular database
! 287: ** table given the name of that table and (optionally) the name of the
! 288: ** database containing the table. Return NULL if not found. Also leave an
! 289: ** error message in pParse->zErrMsg.
! 290: **
! 291: ** The difference between this routine and sqlite3FindTable() is that this
! 292: ** routine leaves an error message in pParse->zErrMsg where
! 293: ** sqlite3FindTable() does not.
! 294: */
! 295: Table *sqlite3LocateTable(
! 296: Parse *pParse, /* context in which to report errors */
! 297: int isView, /* True if looking for a VIEW rather than a TABLE */
! 298: const char *zName, /* Name of the table we are looking for */
! 299: const char *zDbase /* Name of the database. Might be NULL */
! 300: ){
! 301: Table *p;
! 302:
! 303: /* Read the database schema. If an error occurs, leave an error message
! 304: ** and code in pParse and return NULL. */
! 305: if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
! 306: return 0;
! 307: }
! 308:
! 309: p = sqlite3FindTable(pParse->db, zName, zDbase);
! 310: if( p==0 ){
! 311: const char *zMsg = isView ? "no such view" : "no such table";
! 312: if( zDbase ){
! 313: sqlite3ErrorMsg(pParse, "%s: %s.%s", zMsg, zDbase, zName);
! 314: }else{
! 315: sqlite3ErrorMsg(pParse, "%s: %s", zMsg, zName);
! 316: }
! 317: pParse->checkSchema = 1;
! 318: }
! 319: return p;
! 320: }
! 321:
! 322: /*
! 323: ** Locate the in-memory structure that describes
! 324: ** a particular index given the name of that index
! 325: ** and the name of the database that contains the index.
! 326: ** Return NULL if not found.
! 327: **
! 328: ** If zDatabase is 0, all databases are searched for the
! 329: ** table and the first matching index is returned. (No checking
! 330: ** for duplicate index names is done.) The search order is
! 331: ** TEMP first, then MAIN, then any auxiliary databases added
! 332: ** using the ATTACH command.
! 333: */
! 334: Index *sqlite3FindIndex(sqlite3 *db, const char *zName, const char *zDb){
! 335: Index *p = 0;
! 336: int i;
! 337: int nName = sqlite3Strlen30(zName);
! 338: /* All mutexes are required for schema access. Make sure we hold them. */
! 339: assert( zDb!=0 || sqlite3BtreeHoldsAllMutexes(db) );
! 340: for(i=OMIT_TEMPDB; i<db->nDb; i++){
! 341: int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */
! 342: Schema *pSchema = db->aDb[j].pSchema;
! 343: assert( pSchema );
! 344: if( zDb && sqlite3StrICmp(zDb, db->aDb[j].zName) ) continue;
! 345: assert( sqlite3SchemaMutexHeld(db, j, 0) );
! 346: p = sqlite3HashFind(&pSchema->idxHash, zName, nName);
! 347: if( p ) break;
! 348: }
! 349: return p;
! 350: }
! 351:
! 352: /*
! 353: ** Reclaim the memory used by an index
! 354: */
! 355: static void freeIndex(sqlite3 *db, Index *p){
! 356: #ifndef SQLITE_OMIT_ANALYZE
! 357: sqlite3DeleteIndexSamples(db, p);
! 358: #endif
! 359: sqlite3DbFree(db, p->zColAff);
! 360: sqlite3DbFree(db, p);
! 361: }
! 362:
! 363: /*
! 364: ** For the index called zIdxName which is found in the database iDb,
! 365: ** unlike that index from its Table then remove the index from
! 366: ** the index hash table and free all memory structures associated
! 367: ** with the index.
! 368: */
! 369: void sqlite3UnlinkAndDeleteIndex(sqlite3 *db, int iDb, const char *zIdxName){
! 370: Index *pIndex;
! 371: int len;
! 372: Hash *pHash;
! 373:
! 374: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
! 375: pHash = &db->aDb[iDb].pSchema->idxHash;
! 376: len = sqlite3Strlen30(zIdxName);
! 377: pIndex = sqlite3HashInsert(pHash, zIdxName, len, 0);
! 378: if( ALWAYS(pIndex) ){
! 379: if( pIndex->pTable->pIndex==pIndex ){
! 380: pIndex->pTable->pIndex = pIndex->pNext;
! 381: }else{
! 382: Index *p;
! 383: /* Justification of ALWAYS(); The index must be on the list of
! 384: ** indices. */
! 385: p = pIndex->pTable->pIndex;
! 386: while( ALWAYS(p) && p->pNext!=pIndex ){ p = p->pNext; }
! 387: if( ALWAYS(p && p->pNext==pIndex) ){
! 388: p->pNext = pIndex->pNext;
! 389: }
! 390: }
! 391: freeIndex(db, pIndex);
! 392: }
! 393: db->flags |= SQLITE_InternChanges;
! 394: }
! 395:
! 396: /*
! 397: ** Erase all schema information from the in-memory hash tables of
! 398: ** a single database. This routine is called to reclaim memory
! 399: ** before the database closes. It is also called during a rollback
! 400: ** if there were schema changes during the transaction or if a
! 401: ** schema-cookie mismatch occurs.
! 402: **
! 403: ** If iDb<0 then reset the internal schema tables for all database
! 404: ** files. If iDb>=0 then reset the internal schema for only the
! 405: ** single file indicated.
! 406: */
! 407: void sqlite3ResetInternalSchema(sqlite3 *db, int iDb){
! 408: int i, j;
! 409: assert( iDb<db->nDb );
! 410:
! 411: if( iDb>=0 ){
! 412: /* Case 1: Reset the single schema identified by iDb */
! 413: Db *pDb = &db->aDb[iDb];
! 414: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
! 415: assert( pDb->pSchema!=0 );
! 416: sqlite3SchemaClear(pDb->pSchema);
! 417:
! 418: /* If any database other than TEMP is reset, then also reset TEMP
! 419: ** since TEMP might be holding triggers that reference tables in the
! 420: ** other database.
! 421: */
! 422: if( iDb!=1 ){
! 423: pDb = &db->aDb[1];
! 424: assert( pDb->pSchema!=0 );
! 425: sqlite3SchemaClear(pDb->pSchema);
! 426: }
! 427: return;
! 428: }
! 429: /* Case 2 (from here to the end): Reset all schemas for all attached
! 430: ** databases. */
! 431: assert( iDb<0 );
! 432: sqlite3BtreeEnterAll(db);
! 433: for(i=0; i<db->nDb; i++){
! 434: Db *pDb = &db->aDb[i];
! 435: if( pDb->pSchema ){
! 436: sqlite3SchemaClear(pDb->pSchema);
! 437: }
! 438: }
! 439: db->flags &= ~SQLITE_InternChanges;
! 440: sqlite3VtabUnlockList(db);
! 441: sqlite3BtreeLeaveAll(db);
! 442:
! 443: /* If one or more of the auxiliary database files has been closed,
! 444: ** then remove them from the auxiliary database list. We take the
! 445: ** opportunity to do this here since we have just deleted all of the
! 446: ** schema hash tables and therefore do not have to make any changes
! 447: ** to any of those tables.
! 448: */
! 449: for(i=j=2; i<db->nDb; i++){
! 450: struct Db *pDb = &db->aDb[i];
! 451: if( pDb->pBt==0 ){
! 452: sqlite3DbFree(db, pDb->zName);
! 453: pDb->zName = 0;
! 454: continue;
! 455: }
! 456: if( j<i ){
! 457: db->aDb[j] = db->aDb[i];
! 458: }
! 459: j++;
! 460: }
! 461: memset(&db->aDb[j], 0, (db->nDb-j)*sizeof(db->aDb[j]));
! 462: db->nDb = j;
! 463: if( db->nDb<=2 && db->aDb!=db->aDbStatic ){
! 464: memcpy(db->aDbStatic, db->aDb, 2*sizeof(db->aDb[0]));
! 465: sqlite3DbFree(db, db->aDb);
! 466: db->aDb = db->aDbStatic;
! 467: }
! 468: }
! 469:
! 470: /*
! 471: ** This routine is called when a commit occurs.
! 472: */
! 473: void sqlite3CommitInternalChanges(sqlite3 *db){
! 474: db->flags &= ~SQLITE_InternChanges;
! 475: }
! 476:
! 477: /*
! 478: ** Delete memory allocated for the column names of a table or view (the
! 479: ** Table.aCol[] array).
! 480: */
! 481: static void sqliteDeleteColumnNames(sqlite3 *db, Table *pTable){
! 482: int i;
! 483: Column *pCol;
! 484: assert( pTable!=0 );
! 485: if( (pCol = pTable->aCol)!=0 ){
! 486: for(i=0; i<pTable->nCol; i++, pCol++){
! 487: sqlite3DbFree(db, pCol->zName);
! 488: sqlite3ExprDelete(db, pCol->pDflt);
! 489: sqlite3DbFree(db, pCol->zDflt);
! 490: sqlite3DbFree(db, pCol->zType);
! 491: sqlite3DbFree(db, pCol->zColl);
! 492: }
! 493: sqlite3DbFree(db, pTable->aCol);
! 494: }
! 495: }
! 496:
! 497: /*
! 498: ** Remove the memory data structures associated with the given
! 499: ** Table. No changes are made to disk by this routine.
! 500: **
! 501: ** This routine just deletes the data structure. It does not unlink
! 502: ** the table data structure from the hash table. But it does destroy
! 503: ** memory structures of the indices and foreign keys associated with
! 504: ** the table.
! 505: */
! 506: void sqlite3DeleteTable(sqlite3 *db, Table *pTable){
! 507: Index *pIndex, *pNext;
! 508:
! 509: assert( !pTable || pTable->nRef>0 );
! 510:
! 511: /* Do not delete the table until the reference count reaches zero. */
! 512: if( !pTable ) return;
! 513: if( ((!db || db->pnBytesFreed==0) && (--pTable->nRef)>0) ) return;
! 514:
! 515: /* Delete all indices associated with this table. */
! 516: for(pIndex = pTable->pIndex; pIndex; pIndex=pNext){
! 517: pNext = pIndex->pNext;
! 518: assert( pIndex->pSchema==pTable->pSchema );
! 519: if( !db || db->pnBytesFreed==0 ){
! 520: char *zName = pIndex->zName;
! 521: TESTONLY ( Index *pOld = ) sqlite3HashInsert(
! 522: &pIndex->pSchema->idxHash, zName, sqlite3Strlen30(zName), 0
! 523: );
! 524: assert( db==0 || sqlite3SchemaMutexHeld(db, 0, pIndex->pSchema) );
! 525: assert( pOld==pIndex || pOld==0 );
! 526: }
! 527: freeIndex(db, pIndex);
! 528: }
! 529:
! 530: /* Delete any foreign keys attached to this table. */
! 531: sqlite3FkDelete(db, pTable);
! 532:
! 533: /* Delete the Table structure itself.
! 534: */
! 535: sqliteDeleteColumnNames(db, pTable);
! 536: sqlite3DbFree(db, pTable->zName);
! 537: sqlite3DbFree(db, pTable->zColAff);
! 538: sqlite3SelectDelete(db, pTable->pSelect);
! 539: #ifndef SQLITE_OMIT_CHECK
! 540: sqlite3ExprDelete(db, pTable->pCheck);
! 541: #endif
! 542: #ifndef SQLITE_OMIT_VIRTUALTABLE
! 543: sqlite3VtabClear(db, pTable);
! 544: #endif
! 545: sqlite3DbFree(db, pTable);
! 546: }
! 547:
! 548: /*
! 549: ** Unlink the given table from the hash tables and the delete the
! 550: ** table structure with all its indices and foreign keys.
! 551: */
! 552: void sqlite3UnlinkAndDeleteTable(sqlite3 *db, int iDb, const char *zTabName){
! 553: Table *p;
! 554: Db *pDb;
! 555:
! 556: assert( db!=0 );
! 557: assert( iDb>=0 && iDb<db->nDb );
! 558: assert( zTabName );
! 559: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
! 560: testcase( zTabName[0]==0 ); /* Zero-length table names are allowed */
! 561: pDb = &db->aDb[iDb];
! 562: p = sqlite3HashInsert(&pDb->pSchema->tblHash, zTabName,
! 563: sqlite3Strlen30(zTabName),0);
! 564: sqlite3DeleteTable(db, p);
! 565: db->flags |= SQLITE_InternChanges;
! 566: }
! 567:
! 568: /*
! 569: ** Given a token, return a string that consists of the text of that
! 570: ** token. Space to hold the returned string
! 571: ** is obtained from sqliteMalloc() and must be freed by the calling
! 572: ** function.
! 573: **
! 574: ** Any quotation marks (ex: "name", 'name', [name], or `name`) that
! 575: ** surround the body of the token are removed.
! 576: **
! 577: ** Tokens are often just pointers into the original SQL text and so
! 578: ** are not \000 terminated and are not persistent. The returned string
! 579: ** is \000 terminated and is persistent.
! 580: */
! 581: char *sqlite3NameFromToken(sqlite3 *db, Token *pName){
! 582: char *zName;
! 583: if( pName ){
! 584: zName = sqlite3DbStrNDup(db, (char*)pName->z, pName->n);
! 585: sqlite3Dequote(zName);
! 586: }else{
! 587: zName = 0;
! 588: }
! 589: return zName;
! 590: }
! 591:
! 592: /*
! 593: ** Open the sqlite_master table stored in database number iDb for
! 594: ** writing. The table is opened using cursor 0.
! 595: */
! 596: void sqlite3OpenMasterTable(Parse *p, int iDb){
! 597: Vdbe *v = sqlite3GetVdbe(p);
! 598: sqlite3TableLock(p, iDb, MASTER_ROOT, 1, SCHEMA_TABLE(iDb));
! 599: sqlite3VdbeAddOp3(v, OP_OpenWrite, 0, MASTER_ROOT, iDb);
! 600: sqlite3VdbeChangeP4(v, -1, (char *)5, P4_INT32); /* 5 column table */
! 601: if( p->nTab==0 ){
! 602: p->nTab = 1;
! 603: }
! 604: }
! 605:
! 606: /*
! 607: ** Parameter zName points to a nul-terminated buffer containing the name
! 608: ** of a database ("main", "temp" or the name of an attached db). This
! 609: ** function returns the index of the named database in db->aDb[], or
! 610: ** -1 if the named db cannot be found.
! 611: */
! 612: int sqlite3FindDbName(sqlite3 *db, const char *zName){
! 613: int i = -1; /* Database number */
! 614: if( zName ){
! 615: Db *pDb;
! 616: int n = sqlite3Strlen30(zName);
! 617: for(i=(db->nDb-1), pDb=&db->aDb[i]; i>=0; i--, pDb--){
! 618: if( (!OMIT_TEMPDB || i!=1 ) && n==sqlite3Strlen30(pDb->zName) &&
! 619: 0==sqlite3StrICmp(pDb->zName, zName) ){
! 620: break;
! 621: }
! 622: }
! 623: }
! 624: return i;
! 625: }
! 626:
! 627: /*
! 628: ** The token *pName contains the name of a database (either "main" or
! 629: ** "temp" or the name of an attached db). This routine returns the
! 630: ** index of the named database in db->aDb[], or -1 if the named db
! 631: ** does not exist.
! 632: */
! 633: int sqlite3FindDb(sqlite3 *db, Token *pName){
! 634: int i; /* Database number */
! 635: char *zName; /* Name we are searching for */
! 636: zName = sqlite3NameFromToken(db, pName);
! 637: i = sqlite3FindDbName(db, zName);
! 638: sqlite3DbFree(db, zName);
! 639: return i;
! 640: }
! 641:
! 642: /* The table or view or trigger name is passed to this routine via tokens
! 643: ** pName1 and pName2. If the table name was fully qualified, for example:
! 644: **
! 645: ** CREATE TABLE xxx.yyy (...);
! 646: **
! 647: ** Then pName1 is set to "xxx" and pName2 "yyy". On the other hand if
! 648: ** the table name is not fully qualified, i.e.:
! 649: **
! 650: ** CREATE TABLE yyy(...);
! 651: **
! 652: ** Then pName1 is set to "yyy" and pName2 is "".
! 653: **
! 654: ** This routine sets the *ppUnqual pointer to point at the token (pName1 or
! 655: ** pName2) that stores the unqualified table name. The index of the
! 656: ** database "xxx" is returned.
! 657: */
! 658: int sqlite3TwoPartName(
! 659: Parse *pParse, /* Parsing and code generating context */
! 660: Token *pName1, /* The "xxx" in the name "xxx.yyy" or "xxx" */
! 661: Token *pName2, /* The "yyy" in the name "xxx.yyy" */
! 662: Token **pUnqual /* Write the unqualified object name here */
! 663: ){
! 664: int iDb; /* Database holding the object */
! 665: sqlite3 *db = pParse->db;
! 666:
! 667: if( ALWAYS(pName2!=0) && pName2->n>0 ){
! 668: if( db->init.busy ) {
! 669: sqlite3ErrorMsg(pParse, "corrupt database");
! 670: pParse->nErr++;
! 671: return -1;
! 672: }
! 673: *pUnqual = pName2;
! 674: iDb = sqlite3FindDb(db, pName1);
! 675: if( iDb<0 ){
! 676: sqlite3ErrorMsg(pParse, "unknown database %T", pName1);
! 677: pParse->nErr++;
! 678: return -1;
! 679: }
! 680: }else{
! 681: assert( db->init.iDb==0 || db->init.busy );
! 682: iDb = db->init.iDb;
! 683: *pUnqual = pName1;
! 684: }
! 685: return iDb;
! 686: }
! 687:
! 688: /*
! 689: ** This routine is used to check if the UTF-8 string zName is a legal
! 690: ** unqualified name for a new schema object (table, index, view or
! 691: ** trigger). All names are legal except those that begin with the string
! 692: ** "sqlite_" (in upper, lower or mixed case). This portion of the namespace
! 693: ** is reserved for internal use.
! 694: */
! 695: int sqlite3CheckObjectName(Parse *pParse, const char *zName){
! 696: if( !pParse->db->init.busy && pParse->nested==0
! 697: && (pParse->db->flags & SQLITE_WriteSchema)==0
! 698: && 0==sqlite3StrNICmp(zName, "sqlite_", 7) ){
! 699: sqlite3ErrorMsg(pParse, "object name reserved for internal use: %s", zName);
! 700: return SQLITE_ERROR;
! 701: }
! 702: return SQLITE_OK;
! 703: }
! 704:
! 705: /*
! 706: ** Begin constructing a new table representation in memory. This is
! 707: ** the first of several action routines that get called in response
! 708: ** to a CREATE TABLE statement. In particular, this routine is called
! 709: ** after seeing tokens "CREATE" and "TABLE" and the table name. The isTemp
! 710: ** flag is true if the table should be stored in the auxiliary database
! 711: ** file instead of in the main database file. This is normally the case
! 712: ** when the "TEMP" or "TEMPORARY" keyword occurs in between
! 713: ** CREATE and TABLE.
! 714: **
! 715: ** The new table record is initialized and put in pParse->pNewTable.
! 716: ** As more of the CREATE TABLE statement is parsed, additional action
! 717: ** routines will be called to add more information to this record.
! 718: ** At the end of the CREATE TABLE statement, the sqlite3EndTable() routine
! 719: ** is called to complete the construction of the new table record.
! 720: */
! 721: void sqlite3StartTable(
! 722: Parse *pParse, /* Parser context */
! 723: Token *pName1, /* First part of the name of the table or view */
! 724: Token *pName2, /* Second part of the name of the table or view */
! 725: int isTemp, /* True if this is a TEMP table */
! 726: int isView, /* True if this is a VIEW */
! 727: int isVirtual, /* True if this is a VIRTUAL table */
! 728: int noErr /* Do nothing if table already exists */
! 729: ){
! 730: Table *pTable;
! 731: char *zName = 0; /* The name of the new table */
! 732: sqlite3 *db = pParse->db;
! 733: Vdbe *v;
! 734: int iDb; /* Database number to create the table in */
! 735: Token *pName; /* Unqualified name of the table to create */
! 736:
! 737: /* The table or view name to create is passed to this routine via tokens
! 738: ** pName1 and pName2. If the table name was fully qualified, for example:
! 739: **
! 740: ** CREATE TABLE xxx.yyy (...);
! 741: **
! 742: ** Then pName1 is set to "xxx" and pName2 "yyy". On the other hand if
! 743: ** the table name is not fully qualified, i.e.:
! 744: **
! 745: ** CREATE TABLE yyy(...);
! 746: **
! 747: ** Then pName1 is set to "yyy" and pName2 is "".
! 748: **
! 749: ** The call below sets the pName pointer to point at the token (pName1 or
! 750: ** pName2) that stores the unqualified table name. The variable iDb is
! 751: ** set to the index of the database that the table or view is to be
! 752: ** created in.
! 753: */
! 754: iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName);
! 755: if( iDb<0 ) return;
! 756: if( !OMIT_TEMPDB && isTemp && pName2->n>0 && iDb!=1 ){
! 757: /* If creating a temp table, the name may not be qualified. Unless
! 758: ** the database name is "temp" anyway. */
! 759: sqlite3ErrorMsg(pParse, "temporary table name must be unqualified");
! 760: return;
! 761: }
! 762: if( !OMIT_TEMPDB && isTemp ) iDb = 1;
! 763:
! 764: pParse->sNameToken = *pName;
! 765: zName = sqlite3NameFromToken(db, pName);
! 766: if( zName==0 ) return;
! 767: if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){
! 768: goto begin_table_error;
! 769: }
! 770: if( db->init.iDb==1 ) isTemp = 1;
! 771: #ifndef SQLITE_OMIT_AUTHORIZATION
! 772: assert( (isTemp & 1)==isTemp );
! 773: {
! 774: int code;
! 775: char *zDb = db->aDb[iDb].zName;
! 776: if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(isTemp), 0, zDb) ){
! 777: goto begin_table_error;
! 778: }
! 779: if( isView ){
! 780: if( !OMIT_TEMPDB && isTemp ){
! 781: code = SQLITE_CREATE_TEMP_VIEW;
! 782: }else{
! 783: code = SQLITE_CREATE_VIEW;
! 784: }
! 785: }else{
! 786: if( !OMIT_TEMPDB && isTemp ){
! 787: code = SQLITE_CREATE_TEMP_TABLE;
! 788: }else{
! 789: code = SQLITE_CREATE_TABLE;
! 790: }
! 791: }
! 792: if( !isVirtual && sqlite3AuthCheck(pParse, code, zName, 0, zDb) ){
! 793: goto begin_table_error;
! 794: }
! 795: }
! 796: #endif
! 797:
! 798: /* Make sure the new table name does not collide with an existing
! 799: ** index or table name in the same database. Issue an error message if
! 800: ** it does. The exception is if the statement being parsed was passed
! 801: ** to an sqlite3_declare_vtab() call. In that case only the column names
! 802: ** and types will be used, so there is no need to test for namespace
! 803: ** collisions.
! 804: */
! 805: if( !IN_DECLARE_VTAB ){
! 806: char *zDb = db->aDb[iDb].zName;
! 807: if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
! 808: goto begin_table_error;
! 809: }
! 810: pTable = sqlite3FindTable(db, zName, zDb);
! 811: if( pTable ){
! 812: if( !noErr ){
! 813: sqlite3ErrorMsg(pParse, "table %T already exists", pName);
! 814: }else{
! 815: assert( !db->init.busy );
! 816: sqlite3CodeVerifySchema(pParse, iDb);
! 817: }
! 818: goto begin_table_error;
! 819: }
! 820: if( sqlite3FindIndex(db, zName, zDb)!=0 ){
! 821: sqlite3ErrorMsg(pParse, "there is already an index named %s", zName);
! 822: goto begin_table_error;
! 823: }
! 824: }
! 825:
! 826: pTable = sqlite3DbMallocZero(db, sizeof(Table));
! 827: if( pTable==0 ){
! 828: db->mallocFailed = 1;
! 829: pParse->rc = SQLITE_NOMEM;
! 830: pParse->nErr++;
! 831: goto begin_table_error;
! 832: }
! 833: pTable->zName = zName;
! 834: pTable->iPKey = -1;
! 835: pTable->pSchema = db->aDb[iDb].pSchema;
! 836: pTable->nRef = 1;
! 837: pTable->nRowEst = 1000000;
! 838: assert( pParse->pNewTable==0 );
! 839: pParse->pNewTable = pTable;
! 840:
! 841: /* If this is the magic sqlite_sequence table used by autoincrement,
! 842: ** then record a pointer to this table in the main database structure
! 843: ** so that INSERT can find the table easily.
! 844: */
! 845: #ifndef SQLITE_OMIT_AUTOINCREMENT
! 846: if( !pParse->nested && strcmp(zName, "sqlite_sequence")==0 ){
! 847: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
! 848: pTable->pSchema->pSeqTab = pTable;
! 849: }
! 850: #endif
! 851:
! 852: /* Begin generating the code that will insert the table record into
! 853: ** the SQLITE_MASTER table. Note in particular that we must go ahead
! 854: ** and allocate the record number for the table entry now. Before any
! 855: ** PRIMARY KEY or UNIQUE keywords are parsed. Those keywords will cause
! 856: ** indices to be created and the table record must come before the
! 857: ** indices. Hence, the record number for the table must be allocated
! 858: ** now.
! 859: */
! 860: if( !db->init.busy && (v = sqlite3GetVdbe(pParse))!=0 ){
! 861: int j1;
! 862: int fileFormat;
! 863: int reg1, reg2, reg3;
! 864: sqlite3BeginWriteOperation(pParse, 0, iDb);
! 865:
! 866: #ifndef SQLITE_OMIT_VIRTUALTABLE
! 867: if( isVirtual ){
! 868: sqlite3VdbeAddOp0(v, OP_VBegin);
! 869: }
! 870: #endif
! 871:
! 872: /* If the file format and encoding in the database have not been set,
! 873: ** set them now.
! 874: */
! 875: reg1 = pParse->regRowid = ++pParse->nMem;
! 876: reg2 = pParse->regRoot = ++pParse->nMem;
! 877: reg3 = ++pParse->nMem;
! 878: sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, reg3, BTREE_FILE_FORMAT);
! 879: sqlite3VdbeUsesBtree(v, iDb);
! 880: j1 = sqlite3VdbeAddOp1(v, OP_If, reg3);
! 881: fileFormat = (db->flags & SQLITE_LegacyFileFmt)!=0 ?
! 882: 1 : SQLITE_MAX_FILE_FORMAT;
! 883: sqlite3VdbeAddOp2(v, OP_Integer, fileFormat, reg3);
! 884: sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, reg3);
! 885: sqlite3VdbeAddOp2(v, OP_Integer, ENC(db), reg3);
! 886: sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_TEXT_ENCODING, reg3);
! 887: sqlite3VdbeJumpHere(v, j1);
! 888:
! 889: /* This just creates a place-holder record in the sqlite_master table.
! 890: ** The record created does not contain anything yet. It will be replaced
! 891: ** by the real entry in code generated at sqlite3EndTable().
! 892: **
! 893: ** The rowid for the new entry is left in register pParse->regRowid.
! 894: ** The root page number of the new table is left in reg pParse->regRoot.
! 895: ** The rowid and root page number values are needed by the code that
! 896: ** sqlite3EndTable will generate.
! 897: */
! 898: #if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE)
! 899: if( isView || isVirtual ){
! 900: sqlite3VdbeAddOp2(v, OP_Integer, 0, reg2);
! 901: }else
! 902: #endif
! 903: {
! 904: sqlite3VdbeAddOp2(v, OP_CreateTable, iDb, reg2);
! 905: }
! 906: sqlite3OpenMasterTable(pParse, iDb);
! 907: sqlite3VdbeAddOp2(v, OP_NewRowid, 0, reg1);
! 908: sqlite3VdbeAddOp2(v, OP_Null, 0, reg3);
! 909: sqlite3VdbeAddOp3(v, OP_Insert, 0, reg3, reg1);
! 910: sqlite3VdbeChangeP5(v, OPFLAG_APPEND);
! 911: sqlite3VdbeAddOp0(v, OP_Close);
! 912: }
! 913:
! 914: /* Normal (non-error) return. */
! 915: return;
! 916:
! 917: /* If an error occurs, we jump here */
! 918: begin_table_error:
! 919: sqlite3DbFree(db, zName);
! 920: return;
! 921: }
! 922:
! 923: /*
! 924: ** This macro is used to compare two strings in a case-insensitive manner.
! 925: ** It is slightly faster than calling sqlite3StrICmp() directly, but
! 926: ** produces larger code.
! 927: **
! 928: ** WARNING: This macro is not compatible with the strcmp() family. It
! 929: ** returns true if the two strings are equal, otherwise false.
! 930: */
! 931: #define STRICMP(x, y) (\
! 932: sqlite3UpperToLower[*(unsigned char *)(x)]== \
! 933: sqlite3UpperToLower[*(unsigned char *)(y)] \
! 934: && sqlite3StrICmp((x)+1,(y)+1)==0 )
! 935:
! 936: /*
! 937: ** Add a new column to the table currently being constructed.
! 938: **
! 939: ** The parser calls this routine once for each column declaration
! 940: ** in a CREATE TABLE statement. sqlite3StartTable() gets called
! 941: ** first to get things going. Then this routine is called for each
! 942: ** column.
! 943: */
! 944: void sqlite3AddColumn(Parse *pParse, Token *pName){
! 945: Table *p;
! 946: int i;
! 947: char *z;
! 948: Column *pCol;
! 949: sqlite3 *db = pParse->db;
! 950: if( (p = pParse->pNewTable)==0 ) return;
! 951: #if SQLITE_MAX_COLUMN
! 952: if( p->nCol+1>db->aLimit[SQLITE_LIMIT_COLUMN] ){
! 953: sqlite3ErrorMsg(pParse, "too many columns on %s", p->zName);
! 954: return;
! 955: }
! 956: #endif
! 957: z = sqlite3NameFromToken(db, pName);
! 958: if( z==0 ) return;
! 959: for(i=0; i<p->nCol; i++){
! 960: if( STRICMP(z, p->aCol[i].zName) ){
! 961: sqlite3ErrorMsg(pParse, "duplicate column name: %s", z);
! 962: sqlite3DbFree(db, z);
! 963: return;
! 964: }
! 965: }
! 966: if( (p->nCol & 0x7)==0 ){
! 967: Column *aNew;
! 968: aNew = sqlite3DbRealloc(db,p->aCol,(p->nCol+8)*sizeof(p->aCol[0]));
! 969: if( aNew==0 ){
! 970: sqlite3DbFree(db, z);
! 971: return;
! 972: }
! 973: p->aCol = aNew;
! 974: }
! 975: pCol = &p->aCol[p->nCol];
! 976: memset(pCol, 0, sizeof(p->aCol[0]));
! 977: pCol->zName = z;
! 978:
! 979: /* If there is no type specified, columns have the default affinity
! 980: ** 'NONE'. If there is a type specified, then sqlite3AddColumnType() will
! 981: ** be called next to set pCol->affinity correctly.
! 982: */
! 983: pCol->affinity = SQLITE_AFF_NONE;
! 984: p->nCol++;
! 985: }
! 986:
! 987: /*
! 988: ** This routine is called by the parser while in the middle of
! 989: ** parsing a CREATE TABLE statement. A "NOT NULL" constraint has
! 990: ** been seen on a column. This routine sets the notNull flag on
! 991: ** the column currently under construction.
! 992: */
! 993: void sqlite3AddNotNull(Parse *pParse, int onError){
! 994: Table *p;
! 995: p = pParse->pNewTable;
! 996: if( p==0 || NEVER(p->nCol<1) ) return;
! 997: p->aCol[p->nCol-1].notNull = (u8)onError;
! 998: }
! 999:
! 1000: /*
! 1001: ** Scan the column type name zType (length nType) and return the
! 1002: ** associated affinity type.
! 1003: **
! 1004: ** This routine does a case-independent search of zType for the
! 1005: ** substrings in the following table. If one of the substrings is
! 1006: ** found, the corresponding affinity is returned. If zType contains
! 1007: ** more than one of the substrings, entries toward the top of
! 1008: ** the table take priority. For example, if zType is 'BLOBINT',
! 1009: ** SQLITE_AFF_INTEGER is returned.
! 1010: **
! 1011: ** Substring | Affinity
! 1012: ** --------------------------------
! 1013: ** 'INT' | SQLITE_AFF_INTEGER
! 1014: ** 'CHAR' | SQLITE_AFF_TEXT
! 1015: ** 'CLOB' | SQLITE_AFF_TEXT
! 1016: ** 'TEXT' | SQLITE_AFF_TEXT
! 1017: ** 'BLOB' | SQLITE_AFF_NONE
! 1018: ** 'REAL' | SQLITE_AFF_REAL
! 1019: ** 'FLOA' | SQLITE_AFF_REAL
! 1020: ** 'DOUB' | SQLITE_AFF_REAL
! 1021: **
! 1022: ** If none of the substrings in the above table are found,
! 1023: ** SQLITE_AFF_NUMERIC is returned.
! 1024: */
! 1025: char sqlite3AffinityType(const char *zIn){
! 1026: u32 h = 0;
! 1027: char aff = SQLITE_AFF_NUMERIC;
! 1028:
! 1029: if( zIn ) while( zIn[0] ){
! 1030: h = (h<<8) + sqlite3UpperToLower[(*zIn)&0xff];
! 1031: zIn++;
! 1032: if( h==(('c'<<24)+('h'<<16)+('a'<<8)+'r') ){ /* CHAR */
! 1033: aff = SQLITE_AFF_TEXT;
! 1034: }else if( h==(('c'<<24)+('l'<<16)+('o'<<8)+'b') ){ /* CLOB */
! 1035: aff = SQLITE_AFF_TEXT;
! 1036: }else if( h==(('t'<<24)+('e'<<16)+('x'<<8)+'t') ){ /* TEXT */
! 1037: aff = SQLITE_AFF_TEXT;
! 1038: }else if( h==(('b'<<24)+('l'<<16)+('o'<<8)+'b') /* BLOB */
! 1039: && (aff==SQLITE_AFF_NUMERIC || aff==SQLITE_AFF_REAL) ){
! 1040: aff = SQLITE_AFF_NONE;
! 1041: #ifndef SQLITE_OMIT_FLOATING_POINT
! 1042: }else if( h==(('r'<<24)+('e'<<16)+('a'<<8)+'l') /* REAL */
! 1043: && aff==SQLITE_AFF_NUMERIC ){
! 1044: aff = SQLITE_AFF_REAL;
! 1045: }else if( h==(('f'<<24)+('l'<<16)+('o'<<8)+'a') /* FLOA */
! 1046: && aff==SQLITE_AFF_NUMERIC ){
! 1047: aff = SQLITE_AFF_REAL;
! 1048: }else if( h==(('d'<<24)+('o'<<16)+('u'<<8)+'b') /* DOUB */
! 1049: && aff==SQLITE_AFF_NUMERIC ){
! 1050: aff = SQLITE_AFF_REAL;
! 1051: #endif
! 1052: }else if( (h&0x00FFFFFF)==(('i'<<16)+('n'<<8)+'t') ){ /* INT */
! 1053: aff = SQLITE_AFF_INTEGER;
! 1054: break;
! 1055: }
! 1056: }
! 1057:
! 1058: return aff;
! 1059: }
! 1060:
! 1061: /*
! 1062: ** This routine is called by the parser while in the middle of
! 1063: ** parsing a CREATE TABLE statement. The pFirst token is the first
! 1064: ** token in the sequence of tokens that describe the type of the
! 1065: ** column currently under construction. pLast is the last token
! 1066: ** in the sequence. Use this information to construct a string
! 1067: ** that contains the typename of the column and store that string
! 1068: ** in zType.
! 1069: */
! 1070: void sqlite3AddColumnType(Parse *pParse, Token *pType){
! 1071: Table *p;
! 1072: Column *pCol;
! 1073:
! 1074: p = pParse->pNewTable;
! 1075: if( p==0 || NEVER(p->nCol<1) ) return;
! 1076: pCol = &p->aCol[p->nCol-1];
! 1077: assert( pCol->zType==0 );
! 1078: pCol->zType = sqlite3NameFromToken(pParse->db, pType);
! 1079: pCol->affinity = sqlite3AffinityType(pCol->zType);
! 1080: }
! 1081:
! 1082: /*
! 1083: ** The expression is the default value for the most recently added column
! 1084: ** of the table currently under construction.
! 1085: **
! 1086: ** Default value expressions must be constant. Raise an exception if this
! 1087: ** is not the case.
! 1088: **
! 1089: ** This routine is called by the parser while in the middle of
! 1090: ** parsing a CREATE TABLE statement.
! 1091: */
! 1092: void sqlite3AddDefaultValue(Parse *pParse, ExprSpan *pSpan){
! 1093: Table *p;
! 1094: Column *pCol;
! 1095: sqlite3 *db = pParse->db;
! 1096: p = pParse->pNewTable;
! 1097: if( p!=0 ){
! 1098: pCol = &(p->aCol[p->nCol-1]);
! 1099: if( !sqlite3ExprIsConstantOrFunction(pSpan->pExpr) ){
! 1100: sqlite3ErrorMsg(pParse, "default value of column [%s] is not constant",
! 1101: pCol->zName);
! 1102: }else{
! 1103: /* A copy of pExpr is used instead of the original, as pExpr contains
! 1104: ** tokens that point to volatile memory. The 'span' of the expression
! 1105: ** is required by pragma table_info.
! 1106: */
! 1107: sqlite3ExprDelete(db, pCol->pDflt);
! 1108: pCol->pDflt = sqlite3ExprDup(db, pSpan->pExpr, EXPRDUP_REDUCE);
! 1109: sqlite3DbFree(db, pCol->zDflt);
! 1110: pCol->zDflt = sqlite3DbStrNDup(db, (char*)pSpan->zStart,
! 1111: (int)(pSpan->zEnd - pSpan->zStart));
! 1112: }
! 1113: }
! 1114: sqlite3ExprDelete(db, pSpan->pExpr);
! 1115: }
! 1116:
! 1117: /*
! 1118: ** Designate the PRIMARY KEY for the table. pList is a list of names
! 1119: ** of columns that form the primary key. If pList is NULL, then the
! 1120: ** most recently added column of the table is the primary key.
! 1121: **
! 1122: ** A table can have at most one primary key. If the table already has
! 1123: ** a primary key (and this is the second primary key) then create an
! 1124: ** error.
! 1125: **
! 1126: ** If the PRIMARY KEY is on a single column whose datatype is INTEGER,
! 1127: ** then we will try to use that column as the rowid. Set the Table.iPKey
! 1128: ** field of the table under construction to be the index of the
! 1129: ** INTEGER PRIMARY KEY column. Table.iPKey is set to -1 if there is
! 1130: ** no INTEGER PRIMARY KEY.
! 1131: **
! 1132: ** If the key is not an INTEGER PRIMARY KEY, then create a unique
! 1133: ** index for the key. No index is created for INTEGER PRIMARY KEYs.
! 1134: */
! 1135: void sqlite3AddPrimaryKey(
! 1136: Parse *pParse, /* Parsing context */
! 1137: ExprList *pList, /* List of field names to be indexed */
! 1138: int onError, /* What to do with a uniqueness conflict */
! 1139: int autoInc, /* True if the AUTOINCREMENT keyword is present */
! 1140: int sortOrder /* SQLITE_SO_ASC or SQLITE_SO_DESC */
! 1141: ){
! 1142: Table *pTab = pParse->pNewTable;
! 1143: char *zType = 0;
! 1144: int iCol = -1, i;
! 1145: if( pTab==0 || IN_DECLARE_VTAB ) goto primary_key_exit;
! 1146: if( pTab->tabFlags & TF_HasPrimaryKey ){
! 1147: sqlite3ErrorMsg(pParse,
! 1148: "table \"%s\" has more than one primary key", pTab->zName);
! 1149: goto primary_key_exit;
! 1150: }
! 1151: pTab->tabFlags |= TF_HasPrimaryKey;
! 1152: if( pList==0 ){
! 1153: iCol = pTab->nCol - 1;
! 1154: pTab->aCol[iCol].isPrimKey = 1;
! 1155: }else{
! 1156: for(i=0; i<pList->nExpr; i++){
! 1157: for(iCol=0; iCol<pTab->nCol; iCol++){
! 1158: if( sqlite3StrICmp(pList->a[i].zName, pTab->aCol[iCol].zName)==0 ){
! 1159: break;
! 1160: }
! 1161: }
! 1162: if( iCol<pTab->nCol ){
! 1163: pTab->aCol[iCol].isPrimKey = 1;
! 1164: }
! 1165: }
! 1166: if( pList->nExpr>1 ) iCol = -1;
! 1167: }
! 1168: if( iCol>=0 && iCol<pTab->nCol ){
! 1169: zType = pTab->aCol[iCol].zType;
! 1170: }
! 1171: if( zType && sqlite3StrICmp(zType, "INTEGER")==0
! 1172: && sortOrder==SQLITE_SO_ASC ){
! 1173: pTab->iPKey = iCol;
! 1174: pTab->keyConf = (u8)onError;
! 1175: assert( autoInc==0 || autoInc==1 );
! 1176: pTab->tabFlags |= autoInc*TF_Autoincrement;
! 1177: }else if( autoInc ){
! 1178: #ifndef SQLITE_OMIT_AUTOINCREMENT
! 1179: sqlite3ErrorMsg(pParse, "AUTOINCREMENT is only allowed on an "
! 1180: "INTEGER PRIMARY KEY");
! 1181: #endif
! 1182: }else{
! 1183: Index *p;
! 1184: p = sqlite3CreateIndex(pParse, 0, 0, 0, pList, onError, 0, 0, sortOrder, 0);
! 1185: if( p ){
! 1186: p->autoIndex = 2;
! 1187: }
! 1188: pList = 0;
! 1189: }
! 1190:
! 1191: primary_key_exit:
! 1192: sqlite3ExprListDelete(pParse->db, pList);
! 1193: return;
! 1194: }
! 1195:
! 1196: /*
! 1197: ** Add a new CHECK constraint to the table currently under construction.
! 1198: */
! 1199: void sqlite3AddCheckConstraint(
! 1200: Parse *pParse, /* Parsing context */
! 1201: Expr *pCheckExpr /* The check expression */
! 1202: ){
! 1203: sqlite3 *db = pParse->db;
! 1204: #ifndef SQLITE_OMIT_CHECK
! 1205: Table *pTab = pParse->pNewTable;
! 1206: if( pTab && !IN_DECLARE_VTAB ){
! 1207: pTab->pCheck = sqlite3ExprAnd(db, pTab->pCheck, pCheckExpr);
! 1208: }else
! 1209: #endif
! 1210: {
! 1211: sqlite3ExprDelete(db, pCheckExpr);
! 1212: }
! 1213: }
! 1214:
! 1215: /*
! 1216: ** Set the collation function of the most recently parsed table column
! 1217: ** to the CollSeq given.
! 1218: */
! 1219: void sqlite3AddCollateType(Parse *pParse, Token *pToken){
! 1220: Table *p;
! 1221: int i;
! 1222: char *zColl; /* Dequoted name of collation sequence */
! 1223: sqlite3 *db;
! 1224:
! 1225: if( (p = pParse->pNewTable)==0 ) return;
! 1226: i = p->nCol-1;
! 1227: db = pParse->db;
! 1228: zColl = sqlite3NameFromToken(db, pToken);
! 1229: if( !zColl ) return;
! 1230:
! 1231: if( sqlite3LocateCollSeq(pParse, zColl) ){
! 1232: Index *pIdx;
! 1233: p->aCol[i].zColl = zColl;
! 1234:
! 1235: /* If the column is declared as "<name> PRIMARY KEY COLLATE <type>",
! 1236: ** then an index may have been created on this column before the
! 1237: ** collation type was added. Correct this if it is the case.
! 1238: */
! 1239: for(pIdx=p->pIndex; pIdx; pIdx=pIdx->pNext){
! 1240: assert( pIdx->nColumn==1 );
! 1241: if( pIdx->aiColumn[0]==i ){
! 1242: pIdx->azColl[0] = p->aCol[i].zColl;
! 1243: }
! 1244: }
! 1245: }else{
! 1246: sqlite3DbFree(db, zColl);
! 1247: }
! 1248: }
! 1249:
! 1250: /*
! 1251: ** This function returns the collation sequence for database native text
! 1252: ** encoding identified by the string zName, length nName.
! 1253: **
! 1254: ** If the requested collation sequence is not available, or not available
! 1255: ** in the database native encoding, the collation factory is invoked to
! 1256: ** request it. If the collation factory does not supply such a sequence,
! 1257: ** and the sequence is available in another text encoding, then that is
! 1258: ** returned instead.
! 1259: **
! 1260: ** If no versions of the requested collations sequence are available, or
! 1261: ** another error occurs, NULL is returned and an error message written into
! 1262: ** pParse.
! 1263: **
! 1264: ** This routine is a wrapper around sqlite3FindCollSeq(). This routine
! 1265: ** invokes the collation factory if the named collation cannot be found
! 1266: ** and generates an error message.
! 1267: **
! 1268: ** See also: sqlite3FindCollSeq(), sqlite3GetCollSeq()
! 1269: */
! 1270: CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char *zName){
! 1271: sqlite3 *db = pParse->db;
! 1272: u8 enc = ENC(db);
! 1273: u8 initbusy = db->init.busy;
! 1274: CollSeq *pColl;
! 1275:
! 1276: pColl = sqlite3FindCollSeq(db, enc, zName, initbusy);
! 1277: if( !initbusy && (!pColl || !pColl->xCmp) ){
! 1278: pColl = sqlite3GetCollSeq(db, enc, pColl, zName);
! 1279: if( !pColl ){
! 1280: sqlite3ErrorMsg(pParse, "no such collation sequence: %s", zName);
! 1281: }
! 1282: }
! 1283:
! 1284: return pColl;
! 1285: }
! 1286:
! 1287:
! 1288: /*
! 1289: ** Generate code that will increment the schema cookie.
! 1290: **
! 1291: ** The schema cookie is used to determine when the schema for the
! 1292: ** database changes. After each schema change, the cookie value
! 1293: ** changes. When a process first reads the schema it records the
! 1294: ** cookie. Thereafter, whenever it goes to access the database,
! 1295: ** it checks the cookie to make sure the schema has not changed
! 1296: ** since it was last read.
! 1297: **
! 1298: ** This plan is not completely bullet-proof. It is possible for
! 1299: ** the schema to change multiple times and for the cookie to be
! 1300: ** set back to prior value. But schema changes are infrequent
! 1301: ** and the probability of hitting the same cookie value is only
! 1302: ** 1 chance in 2^32. So we're safe enough.
! 1303: */
! 1304: void sqlite3ChangeCookie(Parse *pParse, int iDb){
! 1305: int r1 = sqlite3GetTempReg(pParse);
! 1306: sqlite3 *db = pParse->db;
! 1307: Vdbe *v = pParse->pVdbe;
! 1308: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
! 1309: sqlite3VdbeAddOp2(v, OP_Integer, db->aDb[iDb].pSchema->schema_cookie+1, r1);
! 1310: sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_SCHEMA_VERSION, r1);
! 1311: sqlite3ReleaseTempReg(pParse, r1);
! 1312: }
! 1313:
! 1314: /*
! 1315: ** Measure the number of characters needed to output the given
! 1316: ** identifier. The number returned includes any quotes used
! 1317: ** but does not include the null terminator.
! 1318: **
! 1319: ** The estimate is conservative. It might be larger that what is
! 1320: ** really needed.
! 1321: */
! 1322: static int identLength(const char *z){
! 1323: int n;
! 1324: for(n=0; *z; n++, z++){
! 1325: if( *z=='"' ){ n++; }
! 1326: }
! 1327: return n + 2;
! 1328: }
! 1329:
! 1330: /*
! 1331: ** The first parameter is a pointer to an output buffer. The second
! 1332: ** parameter is a pointer to an integer that contains the offset at
! 1333: ** which to write into the output buffer. This function copies the
! 1334: ** nul-terminated string pointed to by the third parameter, zSignedIdent,
! 1335: ** to the specified offset in the buffer and updates *pIdx to refer
! 1336: ** to the first byte after the last byte written before returning.
! 1337: **
! 1338: ** If the string zSignedIdent consists entirely of alpha-numeric
! 1339: ** characters, does not begin with a digit and is not an SQL keyword,
! 1340: ** then it is copied to the output buffer exactly as it is. Otherwise,
! 1341: ** it is quoted using double-quotes.
! 1342: */
! 1343: static void identPut(char *z, int *pIdx, char *zSignedIdent){
! 1344: unsigned char *zIdent = (unsigned char*)zSignedIdent;
! 1345: int i, j, needQuote;
! 1346: i = *pIdx;
! 1347:
! 1348: for(j=0; zIdent[j]; j++){
! 1349: if( !sqlite3Isalnum(zIdent[j]) && zIdent[j]!='_' ) break;
! 1350: }
! 1351: needQuote = sqlite3Isdigit(zIdent[0]) || sqlite3KeywordCode(zIdent, j)!=TK_ID;
! 1352: if( !needQuote ){
! 1353: needQuote = zIdent[j];
! 1354: }
! 1355:
! 1356: if( needQuote ) z[i++] = '"';
! 1357: for(j=0; zIdent[j]; j++){
! 1358: z[i++] = zIdent[j];
! 1359: if( zIdent[j]=='"' ) z[i++] = '"';
! 1360: }
! 1361: if( needQuote ) z[i++] = '"';
! 1362: z[i] = 0;
! 1363: *pIdx = i;
! 1364: }
! 1365:
! 1366: /*
! 1367: ** Generate a CREATE TABLE statement appropriate for the given
! 1368: ** table. Memory to hold the text of the statement is obtained
! 1369: ** from sqliteMalloc() and must be freed by the calling function.
! 1370: */
! 1371: static char *createTableStmt(sqlite3 *db, Table *p){
! 1372: int i, k, n;
! 1373: char *zStmt;
! 1374: char *zSep, *zSep2, *zEnd;
! 1375: Column *pCol;
! 1376: n = 0;
! 1377: for(pCol = p->aCol, i=0; i<p->nCol; i++, pCol++){
! 1378: n += identLength(pCol->zName) + 5;
! 1379: }
! 1380: n += identLength(p->zName);
! 1381: if( n<50 ){
! 1382: zSep = "";
! 1383: zSep2 = ",";
! 1384: zEnd = ")";
! 1385: }else{
! 1386: zSep = "\n ";
! 1387: zSep2 = ",\n ";
! 1388: zEnd = "\n)";
! 1389: }
! 1390: n += 35 + 6*p->nCol;
! 1391: zStmt = sqlite3DbMallocRaw(0, n);
! 1392: if( zStmt==0 ){
! 1393: db->mallocFailed = 1;
! 1394: return 0;
! 1395: }
! 1396: sqlite3_snprintf(n, zStmt, "CREATE TABLE ");
! 1397: k = sqlite3Strlen30(zStmt);
! 1398: identPut(zStmt, &k, p->zName);
! 1399: zStmt[k++] = '(';
! 1400: for(pCol=p->aCol, i=0; i<p->nCol; i++, pCol++){
! 1401: static const char * const azType[] = {
! 1402: /* SQLITE_AFF_TEXT */ " TEXT",
! 1403: /* SQLITE_AFF_NONE */ "",
! 1404: /* SQLITE_AFF_NUMERIC */ " NUM",
! 1405: /* SQLITE_AFF_INTEGER */ " INT",
! 1406: /* SQLITE_AFF_REAL */ " REAL"
! 1407: };
! 1408: int len;
! 1409: const char *zType;
! 1410:
! 1411: sqlite3_snprintf(n-k, &zStmt[k], zSep);
! 1412: k += sqlite3Strlen30(&zStmt[k]);
! 1413: zSep = zSep2;
! 1414: identPut(zStmt, &k, pCol->zName);
! 1415: assert( pCol->affinity-SQLITE_AFF_TEXT >= 0 );
! 1416: assert( pCol->affinity-SQLITE_AFF_TEXT < ArraySize(azType) );
! 1417: testcase( pCol->affinity==SQLITE_AFF_TEXT );
! 1418: testcase( pCol->affinity==SQLITE_AFF_NONE );
! 1419: testcase( pCol->affinity==SQLITE_AFF_NUMERIC );
! 1420: testcase( pCol->affinity==SQLITE_AFF_INTEGER );
! 1421: testcase( pCol->affinity==SQLITE_AFF_REAL );
! 1422:
! 1423: zType = azType[pCol->affinity - SQLITE_AFF_TEXT];
! 1424: len = sqlite3Strlen30(zType);
! 1425: assert( pCol->affinity==SQLITE_AFF_NONE
! 1426: || pCol->affinity==sqlite3AffinityType(zType) );
! 1427: memcpy(&zStmt[k], zType, len);
! 1428: k += len;
! 1429: assert( k<=n );
! 1430: }
! 1431: sqlite3_snprintf(n-k, &zStmt[k], "%s", zEnd);
! 1432: return zStmt;
! 1433: }
! 1434:
! 1435: /*
! 1436: ** This routine is called to report the final ")" that terminates
! 1437: ** a CREATE TABLE statement.
! 1438: **
! 1439: ** The table structure that other action routines have been building
! 1440: ** is added to the internal hash tables, assuming no errors have
! 1441: ** occurred.
! 1442: **
! 1443: ** An entry for the table is made in the master table on disk, unless
! 1444: ** this is a temporary table or db->init.busy==1. When db->init.busy==1
! 1445: ** it means we are reading the sqlite_master table because we just
! 1446: ** connected to the database or because the sqlite_master table has
! 1447: ** recently changed, so the entry for this table already exists in
! 1448: ** the sqlite_master table. We do not want to create it again.
! 1449: **
! 1450: ** If the pSelect argument is not NULL, it means that this routine
! 1451: ** was called to create a table generated from a
! 1452: ** "CREATE TABLE ... AS SELECT ..." statement. The column names of
! 1453: ** the new table will match the result set of the SELECT.
! 1454: */
! 1455: void sqlite3EndTable(
! 1456: Parse *pParse, /* Parse context */
! 1457: Token *pCons, /* The ',' token after the last column defn. */
! 1458: Token *pEnd, /* The final ')' token in the CREATE TABLE */
! 1459: Select *pSelect /* Select from a "CREATE ... AS SELECT" */
! 1460: ){
! 1461: Table *p;
! 1462: sqlite3 *db = pParse->db;
! 1463: int iDb;
! 1464:
! 1465: if( (pEnd==0 && pSelect==0) || db->mallocFailed ){
! 1466: return;
! 1467: }
! 1468: p = pParse->pNewTable;
! 1469: if( p==0 ) return;
! 1470:
! 1471: assert( !db->init.busy || !pSelect );
! 1472:
! 1473: iDb = sqlite3SchemaToIndex(db, p->pSchema);
! 1474:
! 1475: #ifndef SQLITE_OMIT_CHECK
! 1476: /* Resolve names in all CHECK constraint expressions.
! 1477: */
! 1478: if( p->pCheck ){
! 1479: SrcList sSrc; /* Fake SrcList for pParse->pNewTable */
! 1480: NameContext sNC; /* Name context for pParse->pNewTable */
! 1481:
! 1482: memset(&sNC, 0, sizeof(sNC));
! 1483: memset(&sSrc, 0, sizeof(sSrc));
! 1484: sSrc.nSrc = 1;
! 1485: sSrc.a[0].zName = p->zName;
! 1486: sSrc.a[0].pTab = p;
! 1487: sSrc.a[0].iCursor = -1;
! 1488: sNC.pParse = pParse;
! 1489: sNC.pSrcList = &sSrc;
! 1490: sNC.isCheck = 1;
! 1491: if( sqlite3ResolveExprNames(&sNC, p->pCheck) ){
! 1492: return;
! 1493: }
! 1494: }
! 1495: #endif /* !defined(SQLITE_OMIT_CHECK) */
! 1496:
! 1497: /* If the db->init.busy is 1 it means we are reading the SQL off the
! 1498: ** "sqlite_master" or "sqlite_temp_master" table on the disk.
! 1499: ** So do not write to the disk again. Extract the root page number
! 1500: ** for the table from the db->init.newTnum field. (The page number
! 1501: ** should have been put there by the sqliteOpenCb routine.)
! 1502: */
! 1503: if( db->init.busy ){
! 1504: p->tnum = db->init.newTnum;
! 1505: }
! 1506:
! 1507: /* If not initializing, then create a record for the new table
! 1508: ** in the SQLITE_MASTER table of the database.
! 1509: **
! 1510: ** If this is a TEMPORARY table, write the entry into the auxiliary
! 1511: ** file instead of into the main database file.
! 1512: */
! 1513: if( !db->init.busy ){
! 1514: int n;
! 1515: Vdbe *v;
! 1516: char *zType; /* "view" or "table" */
! 1517: char *zType2; /* "VIEW" or "TABLE" */
! 1518: char *zStmt; /* Text of the CREATE TABLE or CREATE VIEW statement */
! 1519:
! 1520: v = sqlite3GetVdbe(pParse);
! 1521: if( NEVER(v==0) ) return;
! 1522:
! 1523: sqlite3VdbeAddOp1(v, OP_Close, 0);
! 1524:
! 1525: /*
! 1526: ** Initialize zType for the new view or table.
! 1527: */
! 1528: if( p->pSelect==0 ){
! 1529: /* A regular table */
! 1530: zType = "table";
! 1531: zType2 = "TABLE";
! 1532: #ifndef SQLITE_OMIT_VIEW
! 1533: }else{
! 1534: /* A view */
! 1535: zType = "view";
! 1536: zType2 = "VIEW";
! 1537: #endif
! 1538: }
! 1539:
! 1540: /* If this is a CREATE TABLE xx AS SELECT ..., execute the SELECT
! 1541: ** statement to populate the new table. The root-page number for the
! 1542: ** new table is in register pParse->regRoot.
! 1543: **
! 1544: ** Once the SELECT has been coded by sqlite3Select(), it is in a
! 1545: ** suitable state to query for the column names and types to be used
! 1546: ** by the new table.
! 1547: **
! 1548: ** A shared-cache write-lock is not required to write to the new table,
! 1549: ** as a schema-lock must have already been obtained to create it. Since
! 1550: ** a schema-lock excludes all other database users, the write-lock would
! 1551: ** be redundant.
! 1552: */
! 1553: if( pSelect ){
! 1554: SelectDest dest;
! 1555: Table *pSelTab;
! 1556:
! 1557: assert(pParse->nTab==1);
! 1558: sqlite3VdbeAddOp3(v, OP_OpenWrite, 1, pParse->regRoot, iDb);
! 1559: sqlite3VdbeChangeP5(v, 1);
! 1560: pParse->nTab = 2;
! 1561: sqlite3SelectDestInit(&dest, SRT_Table, 1);
! 1562: sqlite3Select(pParse, pSelect, &dest);
! 1563: sqlite3VdbeAddOp1(v, OP_Close, 1);
! 1564: if( pParse->nErr==0 ){
! 1565: pSelTab = sqlite3ResultSetOfSelect(pParse, pSelect);
! 1566: if( pSelTab==0 ) return;
! 1567: assert( p->aCol==0 );
! 1568: p->nCol = pSelTab->nCol;
! 1569: p->aCol = pSelTab->aCol;
! 1570: pSelTab->nCol = 0;
! 1571: pSelTab->aCol = 0;
! 1572: sqlite3DeleteTable(db, pSelTab);
! 1573: }
! 1574: }
! 1575:
! 1576: /* Compute the complete text of the CREATE statement */
! 1577: if( pSelect ){
! 1578: zStmt = createTableStmt(db, p);
! 1579: }else{
! 1580: n = (int)(pEnd->z - pParse->sNameToken.z) + 1;
! 1581: zStmt = sqlite3MPrintf(db,
! 1582: "CREATE %s %.*s", zType2, n, pParse->sNameToken.z
! 1583: );
! 1584: }
! 1585:
! 1586: /* A slot for the record has already been allocated in the
! 1587: ** SQLITE_MASTER table. We just need to update that slot with all
! 1588: ** the information we've collected.
! 1589: */
! 1590: sqlite3NestedParse(pParse,
! 1591: "UPDATE %Q.%s "
! 1592: "SET type='%s', name=%Q, tbl_name=%Q, rootpage=#%d, sql=%Q "
! 1593: "WHERE rowid=#%d",
! 1594: db->aDb[iDb].zName, SCHEMA_TABLE(iDb),
! 1595: zType,
! 1596: p->zName,
! 1597: p->zName,
! 1598: pParse->regRoot,
! 1599: zStmt,
! 1600: pParse->regRowid
! 1601: );
! 1602: sqlite3DbFree(db, zStmt);
! 1603: sqlite3ChangeCookie(pParse, iDb);
! 1604:
! 1605: #ifndef SQLITE_OMIT_AUTOINCREMENT
! 1606: /* Check to see if we need to create an sqlite_sequence table for
! 1607: ** keeping track of autoincrement keys.
! 1608: */
! 1609: if( p->tabFlags & TF_Autoincrement ){
! 1610: Db *pDb = &db->aDb[iDb];
! 1611: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
! 1612: if( pDb->pSchema->pSeqTab==0 ){
! 1613: sqlite3NestedParse(pParse,
! 1614: "CREATE TABLE %Q.sqlite_sequence(name,seq)",
! 1615: pDb->zName
! 1616: );
! 1617: }
! 1618: }
! 1619: #endif
! 1620:
! 1621: /* Reparse everything to update our internal data structures */
! 1622: sqlite3VdbeAddParseSchemaOp(v, iDb,
! 1623: sqlite3MPrintf(db, "tbl_name='%q'", p->zName));
! 1624: }
! 1625:
! 1626:
! 1627: /* Add the table to the in-memory representation of the database.
! 1628: */
! 1629: if( db->init.busy ){
! 1630: Table *pOld;
! 1631: Schema *pSchema = p->pSchema;
! 1632: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
! 1633: pOld = sqlite3HashInsert(&pSchema->tblHash, p->zName,
! 1634: sqlite3Strlen30(p->zName),p);
! 1635: if( pOld ){
! 1636: assert( p==pOld ); /* Malloc must have failed inside HashInsert() */
! 1637: db->mallocFailed = 1;
! 1638: return;
! 1639: }
! 1640: pParse->pNewTable = 0;
! 1641: db->nTable++;
! 1642: db->flags |= SQLITE_InternChanges;
! 1643:
! 1644: #ifndef SQLITE_OMIT_ALTERTABLE
! 1645: if( !p->pSelect ){
! 1646: const char *zName = (const char *)pParse->sNameToken.z;
! 1647: int nName;
! 1648: assert( !pSelect && pCons && pEnd );
! 1649: if( pCons->z==0 ){
! 1650: pCons = pEnd;
! 1651: }
! 1652: nName = (int)((const char *)pCons->z - zName);
! 1653: p->addColOffset = 13 + sqlite3Utf8CharLen(zName, nName);
! 1654: }
! 1655: #endif
! 1656: }
! 1657: }
! 1658:
! 1659: #ifndef SQLITE_OMIT_VIEW
! 1660: /*
! 1661: ** The parser calls this routine in order to create a new VIEW
! 1662: */
! 1663: void sqlite3CreateView(
! 1664: Parse *pParse, /* The parsing context */
! 1665: Token *pBegin, /* The CREATE token that begins the statement */
! 1666: Token *pName1, /* The token that holds the name of the view */
! 1667: Token *pName2, /* The token that holds the name of the view */
! 1668: Select *pSelect, /* A SELECT statement that will become the new view */
! 1669: int isTemp, /* TRUE for a TEMPORARY view */
! 1670: int noErr /* Suppress error messages if VIEW already exists */
! 1671: ){
! 1672: Table *p;
! 1673: int n;
! 1674: const char *z;
! 1675: Token sEnd;
! 1676: DbFixer sFix;
! 1677: Token *pName = 0;
! 1678: int iDb;
! 1679: sqlite3 *db = pParse->db;
! 1680:
! 1681: if( pParse->nVar>0 ){
! 1682: sqlite3ErrorMsg(pParse, "parameters are not allowed in views");
! 1683: sqlite3SelectDelete(db, pSelect);
! 1684: return;
! 1685: }
! 1686: sqlite3StartTable(pParse, pName1, pName2, isTemp, 1, 0, noErr);
! 1687: p = pParse->pNewTable;
! 1688: if( p==0 || pParse->nErr ){
! 1689: sqlite3SelectDelete(db, pSelect);
! 1690: return;
! 1691: }
! 1692: sqlite3TwoPartName(pParse, pName1, pName2, &pName);
! 1693: iDb = sqlite3SchemaToIndex(db, p->pSchema);
! 1694: if( sqlite3FixInit(&sFix, pParse, iDb, "view", pName)
! 1695: && sqlite3FixSelect(&sFix, pSelect)
! 1696: ){
! 1697: sqlite3SelectDelete(db, pSelect);
! 1698: return;
! 1699: }
! 1700:
! 1701: /* Make a copy of the entire SELECT statement that defines the view.
! 1702: ** This will force all the Expr.token.z values to be dynamically
! 1703: ** allocated rather than point to the input string - which means that
! 1704: ** they will persist after the current sqlite3_exec() call returns.
! 1705: */
! 1706: p->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE);
! 1707: sqlite3SelectDelete(db, pSelect);
! 1708: if( db->mallocFailed ){
! 1709: return;
! 1710: }
! 1711: if( !db->init.busy ){
! 1712: sqlite3ViewGetColumnNames(pParse, p);
! 1713: }
! 1714:
! 1715: /* Locate the end of the CREATE VIEW statement. Make sEnd point to
! 1716: ** the end.
! 1717: */
! 1718: sEnd = pParse->sLastToken;
! 1719: if( ALWAYS(sEnd.z[0]!=0) && sEnd.z[0]!=';' ){
! 1720: sEnd.z += sEnd.n;
! 1721: }
! 1722: sEnd.n = 0;
! 1723: n = (int)(sEnd.z - pBegin->z);
! 1724: z = pBegin->z;
! 1725: while( ALWAYS(n>0) && sqlite3Isspace(z[n-1]) ){ n--; }
! 1726: sEnd.z = &z[n-1];
! 1727: sEnd.n = 1;
! 1728:
! 1729: /* Use sqlite3EndTable() to add the view to the SQLITE_MASTER table */
! 1730: sqlite3EndTable(pParse, 0, &sEnd, 0);
! 1731: return;
! 1732: }
! 1733: #endif /* SQLITE_OMIT_VIEW */
! 1734:
! 1735: #if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE)
! 1736: /*
! 1737: ** The Table structure pTable is really a VIEW. Fill in the names of
! 1738: ** the columns of the view in the pTable structure. Return the number
! 1739: ** of errors. If an error is seen leave an error message in pParse->zErrMsg.
! 1740: */
! 1741: int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){
! 1742: Table *pSelTab; /* A fake table from which we get the result set */
! 1743: Select *pSel; /* Copy of the SELECT that implements the view */
! 1744: int nErr = 0; /* Number of errors encountered */
! 1745: int n; /* Temporarily holds the number of cursors assigned */
! 1746: sqlite3 *db = pParse->db; /* Database connection for malloc errors */
! 1747: int (*xAuth)(void*,int,const char*,const char*,const char*,const char*);
! 1748:
! 1749: assert( pTable );
! 1750:
! 1751: #ifndef SQLITE_OMIT_VIRTUALTABLE
! 1752: if( sqlite3VtabCallConnect(pParse, pTable) ){
! 1753: return SQLITE_ERROR;
! 1754: }
! 1755: if( IsVirtual(pTable) ) return 0;
! 1756: #endif
! 1757:
! 1758: #ifndef SQLITE_OMIT_VIEW
! 1759: /* A positive nCol means the columns names for this view are
! 1760: ** already known.
! 1761: */
! 1762: if( pTable->nCol>0 ) return 0;
! 1763:
! 1764: /* A negative nCol is a special marker meaning that we are currently
! 1765: ** trying to compute the column names. If we enter this routine with
! 1766: ** a negative nCol, it means two or more views form a loop, like this:
! 1767: **
! 1768: ** CREATE VIEW one AS SELECT * FROM two;
! 1769: ** CREATE VIEW two AS SELECT * FROM one;
! 1770: **
! 1771: ** Actually, the error above is now caught prior to reaching this point.
! 1772: ** But the following test is still important as it does come up
! 1773: ** in the following:
! 1774: **
! 1775: ** CREATE TABLE main.ex1(a);
! 1776: ** CREATE TEMP VIEW ex1 AS SELECT a FROM ex1;
! 1777: ** SELECT * FROM temp.ex1;
! 1778: */
! 1779: if( pTable->nCol<0 ){
! 1780: sqlite3ErrorMsg(pParse, "view %s is circularly defined", pTable->zName);
! 1781: return 1;
! 1782: }
! 1783: assert( pTable->nCol>=0 );
! 1784:
! 1785: /* If we get this far, it means we need to compute the table names.
! 1786: ** Note that the call to sqlite3ResultSetOfSelect() will expand any
! 1787: ** "*" elements in the results set of the view and will assign cursors
! 1788: ** to the elements of the FROM clause. But we do not want these changes
! 1789: ** to be permanent. So the computation is done on a copy of the SELECT
! 1790: ** statement that defines the view.
! 1791: */
! 1792: assert( pTable->pSelect );
! 1793: pSel = sqlite3SelectDup(db, pTable->pSelect, 0);
! 1794: if( pSel ){
! 1795: u8 enableLookaside = db->lookaside.bEnabled;
! 1796: n = pParse->nTab;
! 1797: sqlite3SrcListAssignCursors(pParse, pSel->pSrc);
! 1798: pTable->nCol = -1;
! 1799: db->lookaside.bEnabled = 0;
! 1800: #ifndef SQLITE_OMIT_AUTHORIZATION
! 1801: xAuth = db->xAuth;
! 1802: db->xAuth = 0;
! 1803: pSelTab = sqlite3ResultSetOfSelect(pParse, pSel);
! 1804: db->xAuth = xAuth;
! 1805: #else
! 1806: pSelTab = sqlite3ResultSetOfSelect(pParse, pSel);
! 1807: #endif
! 1808: db->lookaside.bEnabled = enableLookaside;
! 1809: pParse->nTab = n;
! 1810: if( pSelTab ){
! 1811: assert( pTable->aCol==0 );
! 1812: pTable->nCol = pSelTab->nCol;
! 1813: pTable->aCol = pSelTab->aCol;
! 1814: pSelTab->nCol = 0;
! 1815: pSelTab->aCol = 0;
! 1816: sqlite3DeleteTable(db, pSelTab);
! 1817: assert( sqlite3SchemaMutexHeld(db, 0, pTable->pSchema) );
! 1818: pTable->pSchema->flags |= DB_UnresetViews;
! 1819: }else{
! 1820: pTable->nCol = 0;
! 1821: nErr++;
! 1822: }
! 1823: sqlite3SelectDelete(db, pSel);
! 1824: } else {
! 1825: nErr++;
! 1826: }
! 1827: #endif /* SQLITE_OMIT_VIEW */
! 1828: return nErr;
! 1829: }
! 1830: #endif /* !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) */
! 1831:
! 1832: #ifndef SQLITE_OMIT_VIEW
! 1833: /*
! 1834: ** Clear the column names from every VIEW in database idx.
! 1835: */
! 1836: static void sqliteViewResetAll(sqlite3 *db, int idx){
! 1837: HashElem *i;
! 1838: assert( sqlite3SchemaMutexHeld(db, idx, 0) );
! 1839: if( !DbHasProperty(db, idx, DB_UnresetViews) ) return;
! 1840: for(i=sqliteHashFirst(&db->aDb[idx].pSchema->tblHash); i;i=sqliteHashNext(i)){
! 1841: Table *pTab = sqliteHashData(i);
! 1842: if( pTab->pSelect ){
! 1843: sqliteDeleteColumnNames(db, pTab);
! 1844: pTab->aCol = 0;
! 1845: pTab->nCol = 0;
! 1846: }
! 1847: }
! 1848: DbClearProperty(db, idx, DB_UnresetViews);
! 1849: }
! 1850: #else
! 1851: # define sqliteViewResetAll(A,B)
! 1852: #endif /* SQLITE_OMIT_VIEW */
! 1853:
! 1854: /*
! 1855: ** This function is called by the VDBE to adjust the internal schema
! 1856: ** used by SQLite when the btree layer moves a table root page. The
! 1857: ** root-page of a table or index in database iDb has changed from iFrom
! 1858: ** to iTo.
! 1859: **
! 1860: ** Ticket #1728: The symbol table might still contain information
! 1861: ** on tables and/or indices that are the process of being deleted.
! 1862: ** If you are unlucky, one of those deleted indices or tables might
! 1863: ** have the same rootpage number as the real table or index that is
! 1864: ** being moved. So we cannot stop searching after the first match
! 1865: ** because the first match might be for one of the deleted indices
! 1866: ** or tables and not the table/index that is actually being moved.
! 1867: ** We must continue looping until all tables and indices with
! 1868: ** rootpage==iFrom have been converted to have a rootpage of iTo
! 1869: ** in order to be certain that we got the right one.
! 1870: */
! 1871: #ifndef SQLITE_OMIT_AUTOVACUUM
! 1872: void sqlite3RootPageMoved(sqlite3 *db, int iDb, int iFrom, int iTo){
! 1873: HashElem *pElem;
! 1874: Hash *pHash;
! 1875: Db *pDb;
! 1876:
! 1877: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
! 1878: pDb = &db->aDb[iDb];
! 1879: pHash = &pDb->pSchema->tblHash;
! 1880: for(pElem=sqliteHashFirst(pHash); pElem; pElem=sqliteHashNext(pElem)){
! 1881: Table *pTab = sqliteHashData(pElem);
! 1882: if( pTab->tnum==iFrom ){
! 1883: pTab->tnum = iTo;
! 1884: }
! 1885: }
! 1886: pHash = &pDb->pSchema->idxHash;
! 1887: for(pElem=sqliteHashFirst(pHash); pElem; pElem=sqliteHashNext(pElem)){
! 1888: Index *pIdx = sqliteHashData(pElem);
! 1889: if( pIdx->tnum==iFrom ){
! 1890: pIdx->tnum = iTo;
! 1891: }
! 1892: }
! 1893: }
! 1894: #endif
! 1895:
! 1896: /*
! 1897: ** Write code to erase the table with root-page iTable from database iDb.
! 1898: ** Also write code to modify the sqlite_master table and internal schema
! 1899: ** if a root-page of another table is moved by the btree-layer whilst
! 1900: ** erasing iTable (this can happen with an auto-vacuum database).
! 1901: */
! 1902: static void destroyRootPage(Parse *pParse, int iTable, int iDb){
! 1903: Vdbe *v = sqlite3GetVdbe(pParse);
! 1904: int r1 = sqlite3GetTempReg(pParse);
! 1905: sqlite3VdbeAddOp3(v, OP_Destroy, iTable, r1, iDb);
! 1906: sqlite3MayAbort(pParse);
! 1907: #ifndef SQLITE_OMIT_AUTOVACUUM
! 1908: /* OP_Destroy stores an in integer r1. If this integer
! 1909: ** is non-zero, then it is the root page number of a table moved to
! 1910: ** location iTable. The following code modifies the sqlite_master table to
! 1911: ** reflect this.
! 1912: **
! 1913: ** The "#NNN" in the SQL is a special constant that means whatever value
! 1914: ** is in register NNN. See grammar rules associated with the TK_REGISTER
! 1915: ** token for additional information.
! 1916: */
! 1917: sqlite3NestedParse(pParse,
! 1918: "UPDATE %Q.%s SET rootpage=%d WHERE #%d AND rootpage=#%d",
! 1919: pParse->db->aDb[iDb].zName, SCHEMA_TABLE(iDb), iTable, r1, r1);
! 1920: #endif
! 1921: sqlite3ReleaseTempReg(pParse, r1);
! 1922: }
! 1923:
! 1924: /*
! 1925: ** Write VDBE code to erase table pTab and all associated indices on disk.
! 1926: ** Code to update the sqlite_master tables and internal schema definitions
! 1927: ** in case a root-page belonging to another table is moved by the btree layer
! 1928: ** is also added (this can happen with an auto-vacuum database).
! 1929: */
! 1930: static void destroyTable(Parse *pParse, Table *pTab){
! 1931: #ifdef SQLITE_OMIT_AUTOVACUUM
! 1932: Index *pIdx;
! 1933: int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
! 1934: destroyRootPage(pParse, pTab->tnum, iDb);
! 1935: for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
! 1936: destroyRootPage(pParse, pIdx->tnum, iDb);
! 1937: }
! 1938: #else
! 1939: /* If the database may be auto-vacuum capable (if SQLITE_OMIT_AUTOVACUUM
! 1940: ** is not defined), then it is important to call OP_Destroy on the
! 1941: ** table and index root-pages in order, starting with the numerically
! 1942: ** largest root-page number. This guarantees that none of the root-pages
! 1943: ** to be destroyed is relocated by an earlier OP_Destroy. i.e. if the
! 1944: ** following were coded:
! 1945: **
! 1946: ** OP_Destroy 4 0
! 1947: ** ...
! 1948: ** OP_Destroy 5 0
! 1949: **
! 1950: ** and root page 5 happened to be the largest root-page number in the
! 1951: ** database, then root page 5 would be moved to page 4 by the
! 1952: ** "OP_Destroy 4 0" opcode. The subsequent "OP_Destroy 5 0" would hit
! 1953: ** a free-list page.
! 1954: */
! 1955: int iTab = pTab->tnum;
! 1956: int iDestroyed = 0;
! 1957:
! 1958: while( 1 ){
! 1959: Index *pIdx;
! 1960: int iLargest = 0;
! 1961:
! 1962: if( iDestroyed==0 || iTab<iDestroyed ){
! 1963: iLargest = iTab;
! 1964: }
! 1965: for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
! 1966: int iIdx = pIdx->tnum;
! 1967: assert( pIdx->pSchema==pTab->pSchema );
! 1968: if( (iDestroyed==0 || (iIdx<iDestroyed)) && iIdx>iLargest ){
! 1969: iLargest = iIdx;
! 1970: }
! 1971: }
! 1972: if( iLargest==0 ){
! 1973: return;
! 1974: }else{
! 1975: int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
! 1976: destroyRootPage(pParse, iLargest, iDb);
! 1977: iDestroyed = iLargest;
! 1978: }
! 1979: }
! 1980: #endif
! 1981: }
! 1982:
! 1983: /*
! 1984: ** Remove entries from the sqlite_statN tables (for N in (1,2,3))
! 1985: ** after a DROP INDEX or DROP TABLE command.
! 1986: */
! 1987: static void sqlite3ClearStatTables(
! 1988: Parse *pParse, /* The parsing context */
! 1989: int iDb, /* The database number */
! 1990: const char *zType, /* "idx" or "tbl" */
! 1991: const char *zName /* Name of index or table */
! 1992: ){
! 1993: int i;
! 1994: const char *zDbName = pParse->db->aDb[iDb].zName;
! 1995: for(i=1; i<=3; i++){
! 1996: char zTab[24];
! 1997: sqlite3_snprintf(sizeof(zTab),zTab,"sqlite_stat%d",i);
! 1998: if( sqlite3FindTable(pParse->db, zTab, zDbName) ){
! 1999: sqlite3NestedParse(pParse,
! 2000: "DELETE FROM %Q.%s WHERE %s=%Q",
! 2001: zDbName, zTab, zType, zName
! 2002: );
! 2003: }
! 2004: }
! 2005: }
! 2006:
! 2007: /*
! 2008: ** Generate code to drop a table.
! 2009: */
! 2010: void sqlite3CodeDropTable(Parse *pParse, Table *pTab, int iDb, int isView){
! 2011: Vdbe *v;
! 2012: sqlite3 *db = pParse->db;
! 2013: Trigger *pTrigger;
! 2014: Db *pDb = &db->aDb[iDb];
! 2015:
! 2016: v = sqlite3GetVdbe(pParse);
! 2017: assert( v!=0 );
! 2018: sqlite3BeginWriteOperation(pParse, 1, iDb);
! 2019:
! 2020: #ifndef SQLITE_OMIT_VIRTUALTABLE
! 2021: if( IsVirtual(pTab) ){
! 2022: sqlite3VdbeAddOp0(v, OP_VBegin);
! 2023: }
! 2024: #endif
! 2025:
! 2026: /* Drop all triggers associated with the table being dropped. Code
! 2027: ** is generated to remove entries from sqlite_master and/or
! 2028: ** sqlite_temp_master if required.
! 2029: */
! 2030: pTrigger = sqlite3TriggerList(pParse, pTab);
! 2031: while( pTrigger ){
! 2032: assert( pTrigger->pSchema==pTab->pSchema ||
! 2033: pTrigger->pSchema==db->aDb[1].pSchema );
! 2034: sqlite3DropTriggerPtr(pParse, pTrigger);
! 2035: pTrigger = pTrigger->pNext;
! 2036: }
! 2037:
! 2038: #ifndef SQLITE_OMIT_AUTOINCREMENT
! 2039: /* Remove any entries of the sqlite_sequence table associated with
! 2040: ** the table being dropped. This is done before the table is dropped
! 2041: ** at the btree level, in case the sqlite_sequence table needs to
! 2042: ** move as a result of the drop (can happen in auto-vacuum mode).
! 2043: */
! 2044: if( pTab->tabFlags & TF_Autoincrement ){
! 2045: sqlite3NestedParse(pParse,
! 2046: "DELETE FROM %Q.sqlite_sequence WHERE name=%Q",
! 2047: pDb->zName, pTab->zName
! 2048: );
! 2049: }
! 2050: #endif
! 2051:
! 2052: /* Drop all SQLITE_MASTER table and index entries that refer to the
! 2053: ** table. The program name loops through the master table and deletes
! 2054: ** every row that refers to a table of the same name as the one being
! 2055: ** dropped. Triggers are handled seperately because a trigger can be
! 2056: ** created in the temp database that refers to a table in another
! 2057: ** database.
! 2058: */
! 2059: sqlite3NestedParse(pParse,
! 2060: "DELETE FROM %Q.%s WHERE tbl_name=%Q and type!='trigger'",
! 2061: pDb->zName, SCHEMA_TABLE(iDb), pTab->zName);
! 2062: if( !isView && !IsVirtual(pTab) ){
! 2063: destroyTable(pParse, pTab);
! 2064: }
! 2065:
! 2066: /* Remove the table entry from SQLite's internal schema and modify
! 2067: ** the schema cookie.
! 2068: */
! 2069: if( IsVirtual(pTab) ){
! 2070: sqlite3VdbeAddOp4(v, OP_VDestroy, iDb, 0, 0, pTab->zName, 0);
! 2071: }
! 2072: sqlite3VdbeAddOp4(v, OP_DropTable, iDb, 0, 0, pTab->zName, 0);
! 2073: sqlite3ChangeCookie(pParse, iDb);
! 2074: sqliteViewResetAll(db, iDb);
! 2075: }
! 2076:
! 2077: /*
! 2078: ** This routine is called to do the work of a DROP TABLE statement.
! 2079: ** pName is the name of the table to be dropped.
! 2080: */
! 2081: void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView, int noErr){
! 2082: Table *pTab;
! 2083: Vdbe *v;
! 2084: sqlite3 *db = pParse->db;
! 2085: int iDb;
! 2086:
! 2087: if( db->mallocFailed ){
! 2088: goto exit_drop_table;
! 2089: }
! 2090: assert( pParse->nErr==0 );
! 2091: assert( pName->nSrc==1 );
! 2092: if( noErr ) db->suppressErr++;
! 2093: pTab = sqlite3LocateTable(pParse, isView,
! 2094: pName->a[0].zName, pName->a[0].zDatabase);
! 2095: if( noErr ) db->suppressErr--;
! 2096:
! 2097: if( pTab==0 ){
! 2098: if( noErr ) sqlite3CodeVerifyNamedSchema(pParse, pName->a[0].zDatabase);
! 2099: goto exit_drop_table;
! 2100: }
! 2101: iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
! 2102: assert( iDb>=0 && iDb<db->nDb );
! 2103:
! 2104: /* If pTab is a virtual table, call ViewGetColumnNames() to ensure
! 2105: ** it is initialized.
! 2106: */
! 2107: if( IsVirtual(pTab) && sqlite3ViewGetColumnNames(pParse, pTab) ){
! 2108: goto exit_drop_table;
! 2109: }
! 2110: #ifndef SQLITE_OMIT_AUTHORIZATION
! 2111: {
! 2112: int code;
! 2113: const char *zTab = SCHEMA_TABLE(iDb);
! 2114: const char *zDb = db->aDb[iDb].zName;
! 2115: const char *zArg2 = 0;
! 2116: if( sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb)){
! 2117: goto exit_drop_table;
! 2118: }
! 2119: if( isView ){
! 2120: if( !OMIT_TEMPDB && iDb==1 ){
! 2121: code = SQLITE_DROP_TEMP_VIEW;
! 2122: }else{
! 2123: code = SQLITE_DROP_VIEW;
! 2124: }
! 2125: #ifndef SQLITE_OMIT_VIRTUALTABLE
! 2126: }else if( IsVirtual(pTab) ){
! 2127: code = SQLITE_DROP_VTABLE;
! 2128: zArg2 = sqlite3GetVTable(db, pTab)->pMod->zName;
! 2129: #endif
! 2130: }else{
! 2131: if( !OMIT_TEMPDB && iDb==1 ){
! 2132: code = SQLITE_DROP_TEMP_TABLE;
! 2133: }else{
! 2134: code = SQLITE_DROP_TABLE;
! 2135: }
! 2136: }
! 2137: if( sqlite3AuthCheck(pParse, code, pTab->zName, zArg2, zDb) ){
! 2138: goto exit_drop_table;
! 2139: }
! 2140: if( sqlite3AuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, zDb) ){
! 2141: goto exit_drop_table;
! 2142: }
! 2143: }
! 2144: #endif
! 2145: if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0
! 2146: && sqlite3StrNICmp(pTab->zName, "sqlite_stat", 11)!=0 ){
! 2147: sqlite3ErrorMsg(pParse, "table %s may not be dropped", pTab->zName);
! 2148: goto exit_drop_table;
! 2149: }
! 2150:
! 2151: #ifndef SQLITE_OMIT_VIEW
! 2152: /* Ensure DROP TABLE is not used on a view, and DROP VIEW is not used
! 2153: ** on a table.
! 2154: */
! 2155: if( isView && pTab->pSelect==0 ){
! 2156: sqlite3ErrorMsg(pParse, "use DROP TABLE to delete table %s", pTab->zName);
! 2157: goto exit_drop_table;
! 2158: }
! 2159: if( !isView && pTab->pSelect ){
! 2160: sqlite3ErrorMsg(pParse, "use DROP VIEW to delete view %s", pTab->zName);
! 2161: goto exit_drop_table;
! 2162: }
! 2163: #endif
! 2164:
! 2165: /* Generate code to remove the table from the master table
! 2166: ** on disk.
! 2167: */
! 2168: v = sqlite3GetVdbe(pParse);
! 2169: if( v ){
! 2170: sqlite3BeginWriteOperation(pParse, 1, iDb);
! 2171: sqlite3ClearStatTables(pParse, iDb, "tbl", pTab->zName);
! 2172: sqlite3FkDropTable(pParse, pName, pTab);
! 2173: sqlite3CodeDropTable(pParse, pTab, iDb, isView);
! 2174: }
! 2175:
! 2176: exit_drop_table:
! 2177: sqlite3SrcListDelete(db, pName);
! 2178: }
! 2179:
! 2180: /*
! 2181: ** This routine is called to create a new foreign key on the table
! 2182: ** currently under construction. pFromCol determines which columns
! 2183: ** in the current table point to the foreign key. If pFromCol==0 then
! 2184: ** connect the key to the last column inserted. pTo is the name of
! 2185: ** the table referred to. pToCol is a list of tables in the other
! 2186: ** pTo table that the foreign key points to. flags contains all
! 2187: ** information about the conflict resolution algorithms specified
! 2188: ** in the ON DELETE, ON UPDATE and ON INSERT clauses.
! 2189: **
! 2190: ** An FKey structure is created and added to the table currently
! 2191: ** under construction in the pParse->pNewTable field.
! 2192: **
! 2193: ** The foreign key is set for IMMEDIATE processing. A subsequent call
! 2194: ** to sqlite3DeferForeignKey() might change this to DEFERRED.
! 2195: */
! 2196: void sqlite3CreateForeignKey(
! 2197: Parse *pParse, /* Parsing context */
! 2198: ExprList *pFromCol, /* Columns in this table that point to other table */
! 2199: Token *pTo, /* Name of the other table */
! 2200: ExprList *pToCol, /* Columns in the other table */
! 2201: int flags /* Conflict resolution algorithms. */
! 2202: ){
! 2203: sqlite3 *db = pParse->db;
! 2204: #ifndef SQLITE_OMIT_FOREIGN_KEY
! 2205: FKey *pFKey = 0;
! 2206: FKey *pNextTo;
! 2207: Table *p = pParse->pNewTable;
! 2208: int nByte;
! 2209: int i;
! 2210: int nCol;
! 2211: char *z;
! 2212:
! 2213: assert( pTo!=0 );
! 2214: if( p==0 || IN_DECLARE_VTAB ) goto fk_end;
! 2215: if( pFromCol==0 ){
! 2216: int iCol = p->nCol-1;
! 2217: if( NEVER(iCol<0) ) goto fk_end;
! 2218: if( pToCol && pToCol->nExpr!=1 ){
! 2219: sqlite3ErrorMsg(pParse, "foreign key on %s"
! 2220: " should reference only one column of table %T",
! 2221: p->aCol[iCol].zName, pTo);
! 2222: goto fk_end;
! 2223: }
! 2224: nCol = 1;
! 2225: }else if( pToCol && pToCol->nExpr!=pFromCol->nExpr ){
! 2226: sqlite3ErrorMsg(pParse,
! 2227: "number of columns in foreign key does not match the number of "
! 2228: "columns in the referenced table");
! 2229: goto fk_end;
! 2230: }else{
! 2231: nCol = pFromCol->nExpr;
! 2232: }
! 2233: nByte = sizeof(*pFKey) + (nCol-1)*sizeof(pFKey->aCol[0]) + pTo->n + 1;
! 2234: if( pToCol ){
! 2235: for(i=0; i<pToCol->nExpr; i++){
! 2236: nByte += sqlite3Strlen30(pToCol->a[i].zName) + 1;
! 2237: }
! 2238: }
! 2239: pFKey = sqlite3DbMallocZero(db, nByte );
! 2240: if( pFKey==0 ){
! 2241: goto fk_end;
! 2242: }
! 2243: pFKey->pFrom = p;
! 2244: pFKey->pNextFrom = p->pFKey;
! 2245: z = (char*)&pFKey->aCol[nCol];
! 2246: pFKey->zTo = z;
! 2247: memcpy(z, pTo->z, pTo->n);
! 2248: z[pTo->n] = 0;
! 2249: sqlite3Dequote(z);
! 2250: z += pTo->n+1;
! 2251: pFKey->nCol = nCol;
! 2252: if( pFromCol==0 ){
! 2253: pFKey->aCol[0].iFrom = p->nCol-1;
! 2254: }else{
! 2255: for(i=0; i<nCol; i++){
! 2256: int j;
! 2257: for(j=0; j<p->nCol; j++){
! 2258: if( sqlite3StrICmp(p->aCol[j].zName, pFromCol->a[i].zName)==0 ){
! 2259: pFKey->aCol[i].iFrom = j;
! 2260: break;
! 2261: }
! 2262: }
! 2263: if( j>=p->nCol ){
! 2264: sqlite3ErrorMsg(pParse,
! 2265: "unknown column \"%s\" in foreign key definition",
! 2266: pFromCol->a[i].zName);
! 2267: goto fk_end;
! 2268: }
! 2269: }
! 2270: }
! 2271: if( pToCol ){
! 2272: for(i=0; i<nCol; i++){
! 2273: int n = sqlite3Strlen30(pToCol->a[i].zName);
! 2274: pFKey->aCol[i].zCol = z;
! 2275: memcpy(z, pToCol->a[i].zName, n);
! 2276: z[n] = 0;
! 2277: z += n+1;
! 2278: }
! 2279: }
! 2280: pFKey->isDeferred = 0;
! 2281: pFKey->aAction[0] = (u8)(flags & 0xff); /* ON DELETE action */
! 2282: pFKey->aAction[1] = (u8)((flags >> 8 ) & 0xff); /* ON UPDATE action */
! 2283:
! 2284: assert( sqlite3SchemaMutexHeld(db, 0, p->pSchema) );
! 2285: pNextTo = (FKey *)sqlite3HashInsert(&p->pSchema->fkeyHash,
! 2286: pFKey->zTo, sqlite3Strlen30(pFKey->zTo), (void *)pFKey
! 2287: );
! 2288: if( pNextTo==pFKey ){
! 2289: db->mallocFailed = 1;
! 2290: goto fk_end;
! 2291: }
! 2292: if( pNextTo ){
! 2293: assert( pNextTo->pPrevTo==0 );
! 2294: pFKey->pNextTo = pNextTo;
! 2295: pNextTo->pPrevTo = pFKey;
! 2296: }
! 2297:
! 2298: /* Link the foreign key to the table as the last step.
! 2299: */
! 2300: p->pFKey = pFKey;
! 2301: pFKey = 0;
! 2302:
! 2303: fk_end:
! 2304: sqlite3DbFree(db, pFKey);
! 2305: #endif /* !defined(SQLITE_OMIT_FOREIGN_KEY) */
! 2306: sqlite3ExprListDelete(db, pFromCol);
! 2307: sqlite3ExprListDelete(db, pToCol);
! 2308: }
! 2309:
! 2310: /*
! 2311: ** This routine is called when an INITIALLY IMMEDIATE or INITIALLY DEFERRED
! 2312: ** clause is seen as part of a foreign key definition. The isDeferred
! 2313: ** parameter is 1 for INITIALLY DEFERRED and 0 for INITIALLY IMMEDIATE.
! 2314: ** The behavior of the most recently created foreign key is adjusted
! 2315: ** accordingly.
! 2316: */
! 2317: void sqlite3DeferForeignKey(Parse *pParse, int isDeferred){
! 2318: #ifndef SQLITE_OMIT_FOREIGN_KEY
! 2319: Table *pTab;
! 2320: FKey *pFKey;
! 2321: if( (pTab = pParse->pNewTable)==0 || (pFKey = pTab->pFKey)==0 ) return;
! 2322: assert( isDeferred==0 || isDeferred==1 ); /* EV: R-30323-21917 */
! 2323: pFKey->isDeferred = (u8)isDeferred;
! 2324: #endif
! 2325: }
! 2326:
! 2327: /*
! 2328: ** Generate code that will erase and refill index *pIdx. This is
! 2329: ** used to initialize a newly created index or to recompute the
! 2330: ** content of an index in response to a REINDEX command.
! 2331: **
! 2332: ** if memRootPage is not negative, it means that the index is newly
! 2333: ** created. The register specified by memRootPage contains the
! 2334: ** root page number of the index. If memRootPage is negative, then
! 2335: ** the index already exists and must be cleared before being refilled and
! 2336: ** the root page number of the index is taken from pIndex->tnum.
! 2337: */
! 2338: static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){
! 2339: Table *pTab = pIndex->pTable; /* The table that is indexed */
! 2340: int iTab = pParse->nTab++; /* Btree cursor used for pTab */
! 2341: int iIdx = pParse->nTab++; /* Btree cursor used for pIndex */
! 2342: int iSorter; /* Cursor opened by OpenSorter (if in use) */
! 2343: int addr1; /* Address of top of loop */
! 2344: int addr2; /* Address to jump to for next iteration */
! 2345: int tnum; /* Root page of index */
! 2346: Vdbe *v; /* Generate code into this virtual machine */
! 2347: KeyInfo *pKey; /* KeyInfo for index */
! 2348: #ifdef SQLITE_OMIT_MERGE_SORT
! 2349: int regIdxKey; /* Registers containing the index key */
! 2350: #endif
! 2351: int regRecord; /* Register holding assemblied index record */
! 2352: sqlite3 *db = pParse->db; /* The database connection */
! 2353: int iDb = sqlite3SchemaToIndex(db, pIndex->pSchema);
! 2354:
! 2355: #ifndef SQLITE_OMIT_AUTHORIZATION
! 2356: if( sqlite3AuthCheck(pParse, SQLITE_REINDEX, pIndex->zName, 0,
! 2357: db->aDb[iDb].zName ) ){
! 2358: return;
! 2359: }
! 2360: #endif
! 2361:
! 2362: /* Require a write-lock on the table to perform this operation */
! 2363: sqlite3TableLock(pParse, iDb, pTab->tnum, 1, pTab->zName);
! 2364:
! 2365: v = sqlite3GetVdbe(pParse);
! 2366: if( v==0 ) return;
! 2367: if( memRootPage>=0 ){
! 2368: tnum = memRootPage;
! 2369: }else{
! 2370: tnum = pIndex->tnum;
! 2371: sqlite3VdbeAddOp2(v, OP_Clear, tnum, iDb);
! 2372: }
! 2373: pKey = sqlite3IndexKeyinfo(pParse, pIndex);
! 2374: sqlite3VdbeAddOp4(v, OP_OpenWrite, iIdx, tnum, iDb,
! 2375: (char *)pKey, P4_KEYINFO_HANDOFF);
! 2376: if( memRootPage>=0 ){
! 2377: sqlite3VdbeChangeP5(v, 1);
! 2378: }
! 2379:
! 2380: #ifndef SQLITE_OMIT_MERGE_SORT
! 2381: /* Open the sorter cursor if we are to use one. */
! 2382: iSorter = pParse->nTab++;
! 2383: sqlite3VdbeAddOp4(v, OP_SorterOpen, iSorter, 0, 0, (char*)pKey, P4_KEYINFO);
! 2384: #else
! 2385: iSorter = iTab;
! 2386: #endif
! 2387:
! 2388: /* Open the table. Loop through all rows of the table, inserting index
! 2389: ** records into the sorter. */
! 2390: sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead);
! 2391: addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iTab, 0);
! 2392: regRecord = sqlite3GetTempReg(pParse);
! 2393:
! 2394: #ifndef SQLITE_OMIT_MERGE_SORT
! 2395: sqlite3GenerateIndexKey(pParse, pIndex, iTab, regRecord, 1);
! 2396: sqlite3VdbeAddOp2(v, OP_SorterInsert, iSorter, regRecord);
! 2397: sqlite3VdbeAddOp2(v, OP_Next, iTab, addr1+1);
! 2398: sqlite3VdbeJumpHere(v, addr1);
! 2399: addr1 = sqlite3VdbeAddOp2(v, OP_SorterSort, iSorter, 0);
! 2400: if( pIndex->onError!=OE_None ){
! 2401: int j2 = sqlite3VdbeCurrentAddr(v) + 3;
! 2402: sqlite3VdbeAddOp2(v, OP_Goto, 0, j2);
! 2403: addr2 = sqlite3VdbeCurrentAddr(v);
! 2404: sqlite3VdbeAddOp3(v, OP_SorterCompare, iSorter, j2, regRecord);
! 2405: sqlite3HaltConstraint(
! 2406: pParse, OE_Abort, "indexed columns are not unique", P4_STATIC
! 2407: );
! 2408: }else{
! 2409: addr2 = sqlite3VdbeCurrentAddr(v);
! 2410: }
! 2411: sqlite3VdbeAddOp2(v, OP_SorterData, iSorter, regRecord);
! 2412: sqlite3VdbeAddOp3(v, OP_IdxInsert, iIdx, regRecord, 1);
! 2413: sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT);
! 2414: #else
! 2415: regIdxKey = sqlite3GenerateIndexKey(pParse, pIndex, iTab, regRecord, 1);
! 2416: addr2 = addr1 + 1;
! 2417: if( pIndex->onError!=OE_None ){
! 2418: const int regRowid = regIdxKey + pIndex->nColumn;
! 2419: const int j2 = sqlite3VdbeCurrentAddr(v) + 2;
! 2420: void * const pRegKey = SQLITE_INT_TO_PTR(regIdxKey);
! 2421:
! 2422: /* The registers accessed by the OP_IsUnique opcode were allocated
! 2423: ** using sqlite3GetTempRange() inside of the sqlite3GenerateIndexKey()
! 2424: ** call above. Just before that function was freed they were released
! 2425: ** (made available to the compiler for reuse) using
! 2426: ** sqlite3ReleaseTempRange(). So in some ways having the OP_IsUnique
! 2427: ** opcode use the values stored within seems dangerous. However, since
! 2428: ** we can be sure that no other temp registers have been allocated
! 2429: ** since sqlite3ReleaseTempRange() was called, it is safe to do so.
! 2430: */
! 2431: sqlite3VdbeAddOp4(v, OP_IsUnique, iIdx, j2, regRowid, pRegKey, P4_INT32);
! 2432: sqlite3HaltConstraint(
! 2433: pParse, OE_Abort, "indexed columns are not unique", P4_STATIC);
! 2434: }
! 2435: sqlite3VdbeAddOp3(v, OP_IdxInsert, iIdx, regRecord, 0);
! 2436: sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT);
! 2437: #endif
! 2438: sqlite3ReleaseTempReg(pParse, regRecord);
! 2439: sqlite3VdbeAddOp2(v, OP_SorterNext, iSorter, addr2);
! 2440: sqlite3VdbeJumpHere(v, addr1);
! 2441:
! 2442: sqlite3VdbeAddOp1(v, OP_Close, iTab);
! 2443: sqlite3VdbeAddOp1(v, OP_Close, iIdx);
! 2444: sqlite3VdbeAddOp1(v, OP_Close, iSorter);
! 2445: }
! 2446:
! 2447: /*
! 2448: ** Create a new index for an SQL table. pName1.pName2 is the name of the index
! 2449: ** and pTblList is the name of the table that is to be indexed. Both will
! 2450: ** be NULL for a primary key or an index that is created to satisfy a
! 2451: ** UNIQUE constraint. If pTable and pIndex are NULL, use pParse->pNewTable
! 2452: ** as the table to be indexed. pParse->pNewTable is a table that is
! 2453: ** currently being constructed by a CREATE TABLE statement.
! 2454: **
! 2455: ** pList is a list of columns to be indexed. pList will be NULL if this
! 2456: ** is a primary key or unique-constraint on the most recent column added
! 2457: ** to the table currently under construction.
! 2458: **
! 2459: ** If the index is created successfully, return a pointer to the new Index
! 2460: ** structure. This is used by sqlite3AddPrimaryKey() to mark the index
! 2461: ** as the tables primary key (Index.autoIndex==2).
! 2462: */
! 2463: Index *sqlite3CreateIndex(
! 2464: Parse *pParse, /* All information about this parse */
! 2465: Token *pName1, /* First part of index name. May be NULL */
! 2466: Token *pName2, /* Second part of index name. May be NULL */
! 2467: SrcList *pTblName, /* Table to index. Use pParse->pNewTable if 0 */
! 2468: ExprList *pList, /* A list of columns to be indexed */
! 2469: int onError, /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */
! 2470: Token *pStart, /* The CREATE token that begins this statement */
! 2471: Token *pEnd, /* The ")" that closes the CREATE INDEX statement */
! 2472: int sortOrder, /* Sort order of primary key when pList==NULL */
! 2473: int ifNotExist /* Omit error if index already exists */
! 2474: ){
! 2475: Index *pRet = 0; /* Pointer to return */
! 2476: Table *pTab = 0; /* Table to be indexed */
! 2477: Index *pIndex = 0; /* The index to be created */
! 2478: char *zName = 0; /* Name of the index */
! 2479: int nName; /* Number of characters in zName */
! 2480: int i, j;
! 2481: Token nullId; /* Fake token for an empty ID list */
! 2482: DbFixer sFix; /* For assigning database names to pTable */
! 2483: int sortOrderMask; /* 1 to honor DESC in index. 0 to ignore. */
! 2484: sqlite3 *db = pParse->db;
! 2485: Db *pDb; /* The specific table containing the indexed database */
! 2486: int iDb; /* Index of the database that is being written */
! 2487: Token *pName = 0; /* Unqualified name of the index to create */
! 2488: struct ExprList_item *pListItem; /* For looping over pList */
! 2489: int nCol;
! 2490: int nExtra = 0;
! 2491: char *zExtra;
! 2492:
! 2493: assert( pStart==0 || pEnd!=0 ); /* pEnd must be non-NULL if pStart is */
! 2494: assert( pParse->nErr==0 ); /* Never called with prior errors */
! 2495: if( db->mallocFailed || IN_DECLARE_VTAB ){
! 2496: goto exit_create_index;
! 2497: }
! 2498: if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
! 2499: goto exit_create_index;
! 2500: }
! 2501:
! 2502: /*
! 2503: ** Find the table that is to be indexed. Return early if not found.
! 2504: */
! 2505: if( pTblName!=0 ){
! 2506:
! 2507: /* Use the two-part index name to determine the database
! 2508: ** to search for the table. 'Fix' the table name to this db
! 2509: ** before looking up the table.
! 2510: */
! 2511: assert( pName1 && pName2 );
! 2512: iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName);
! 2513: if( iDb<0 ) goto exit_create_index;
! 2514: assert( pName && pName->z );
! 2515:
! 2516: #ifndef SQLITE_OMIT_TEMPDB
! 2517: /* If the index name was unqualified, check if the the table
! 2518: ** is a temp table. If so, set the database to 1. Do not do this
! 2519: ** if initialising a database schema.
! 2520: */
! 2521: if( !db->init.busy ){
! 2522: pTab = sqlite3SrcListLookup(pParse, pTblName);
! 2523: if( pName2->n==0 && pTab && pTab->pSchema==db->aDb[1].pSchema ){
! 2524: iDb = 1;
! 2525: }
! 2526: }
! 2527: #endif
! 2528:
! 2529: if( sqlite3FixInit(&sFix, pParse, iDb, "index", pName) &&
! 2530: sqlite3FixSrcList(&sFix, pTblName)
! 2531: ){
! 2532: /* Because the parser constructs pTblName from a single identifier,
! 2533: ** sqlite3FixSrcList can never fail. */
! 2534: assert(0);
! 2535: }
! 2536: pTab = sqlite3LocateTable(pParse, 0, pTblName->a[0].zName,
! 2537: pTblName->a[0].zDatabase);
! 2538: if( !pTab || db->mallocFailed ) goto exit_create_index;
! 2539: assert( db->aDb[iDb].pSchema==pTab->pSchema );
! 2540: }else{
! 2541: assert( pName==0 );
! 2542: assert( pStart==0 );
! 2543: pTab = pParse->pNewTable;
! 2544: if( !pTab ) goto exit_create_index;
! 2545: iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
! 2546: }
! 2547: pDb = &db->aDb[iDb];
! 2548:
! 2549: assert( pTab!=0 );
! 2550: assert( pParse->nErr==0 );
! 2551: if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0
! 2552: && memcmp(&pTab->zName[7],"altertab_",9)!=0 ){
! 2553: sqlite3ErrorMsg(pParse, "table %s may not be indexed", pTab->zName);
! 2554: goto exit_create_index;
! 2555: }
! 2556: #ifndef SQLITE_OMIT_VIEW
! 2557: if( pTab->pSelect ){
! 2558: sqlite3ErrorMsg(pParse, "views may not be indexed");
! 2559: goto exit_create_index;
! 2560: }
! 2561: #endif
! 2562: #ifndef SQLITE_OMIT_VIRTUALTABLE
! 2563: if( IsVirtual(pTab) ){
! 2564: sqlite3ErrorMsg(pParse, "virtual tables may not be indexed");
! 2565: goto exit_create_index;
! 2566: }
! 2567: #endif
! 2568:
! 2569: /*
! 2570: ** Find the name of the index. Make sure there is not already another
! 2571: ** index or table with the same name.
! 2572: **
! 2573: ** Exception: If we are reading the names of permanent indices from the
! 2574: ** sqlite_master table (because some other process changed the schema) and
! 2575: ** one of the index names collides with the name of a temporary table or
! 2576: ** index, then we will continue to process this index.
! 2577: **
! 2578: ** If pName==0 it means that we are
! 2579: ** dealing with a primary key or UNIQUE constraint. We have to invent our
! 2580: ** own name.
! 2581: */
! 2582: if( pName ){
! 2583: zName = sqlite3NameFromToken(db, pName);
! 2584: if( zName==0 ) goto exit_create_index;
! 2585: assert( pName->z!=0 );
! 2586: if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){
! 2587: goto exit_create_index;
! 2588: }
! 2589: if( !db->init.busy ){
! 2590: if( sqlite3FindTable(db, zName, 0)!=0 ){
! 2591: sqlite3ErrorMsg(pParse, "there is already a table named %s", zName);
! 2592: goto exit_create_index;
! 2593: }
! 2594: }
! 2595: if( sqlite3FindIndex(db, zName, pDb->zName)!=0 ){
! 2596: if( !ifNotExist ){
! 2597: sqlite3ErrorMsg(pParse, "index %s already exists", zName);
! 2598: }else{
! 2599: assert( !db->init.busy );
! 2600: sqlite3CodeVerifySchema(pParse, iDb);
! 2601: }
! 2602: goto exit_create_index;
! 2603: }
! 2604: }else{
! 2605: int n;
! 2606: Index *pLoop;
! 2607: for(pLoop=pTab->pIndex, n=1; pLoop; pLoop=pLoop->pNext, n++){}
! 2608: zName = sqlite3MPrintf(db, "sqlite_autoindex_%s_%d", pTab->zName, n);
! 2609: if( zName==0 ){
! 2610: goto exit_create_index;
! 2611: }
! 2612: }
! 2613:
! 2614: /* Check for authorization to create an index.
! 2615: */
! 2616: #ifndef SQLITE_OMIT_AUTHORIZATION
! 2617: {
! 2618: const char *zDb = pDb->zName;
! 2619: if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(iDb), 0, zDb) ){
! 2620: goto exit_create_index;
! 2621: }
! 2622: i = SQLITE_CREATE_INDEX;
! 2623: if( !OMIT_TEMPDB && iDb==1 ) i = SQLITE_CREATE_TEMP_INDEX;
! 2624: if( sqlite3AuthCheck(pParse, i, zName, pTab->zName, zDb) ){
! 2625: goto exit_create_index;
! 2626: }
! 2627: }
! 2628: #endif
! 2629:
! 2630: /* If pList==0, it means this routine was called to make a primary
! 2631: ** key out of the last column added to the table under construction.
! 2632: ** So create a fake list to simulate this.
! 2633: */
! 2634: if( pList==0 ){
! 2635: nullId.z = pTab->aCol[pTab->nCol-1].zName;
! 2636: nullId.n = sqlite3Strlen30((char*)nullId.z);
! 2637: pList = sqlite3ExprListAppend(pParse, 0, 0);
! 2638: if( pList==0 ) goto exit_create_index;
! 2639: sqlite3ExprListSetName(pParse, pList, &nullId, 0);
! 2640: pList->a[0].sortOrder = (u8)sortOrder;
! 2641: }
! 2642:
! 2643: /* Figure out how many bytes of space are required to store explicitly
! 2644: ** specified collation sequence names.
! 2645: */
! 2646: for(i=0; i<pList->nExpr; i++){
! 2647: Expr *pExpr = pList->a[i].pExpr;
! 2648: if( pExpr ){
! 2649: CollSeq *pColl = pExpr->pColl;
! 2650: /* Either pColl!=0 or there was an OOM failure. But if an OOM
! 2651: ** failure we have quit before reaching this point. */
! 2652: if( ALWAYS(pColl) ){
! 2653: nExtra += (1 + sqlite3Strlen30(pColl->zName));
! 2654: }
! 2655: }
! 2656: }
! 2657:
! 2658: /*
! 2659: ** Allocate the index structure.
! 2660: */
! 2661: nName = sqlite3Strlen30(zName);
! 2662: nCol = pList->nExpr;
! 2663: pIndex = sqlite3DbMallocZero(db,
! 2664: ROUND8(sizeof(Index)) + /* Index structure */
! 2665: ROUND8(sizeof(tRowcnt)*(nCol+1)) + /* Index.aiRowEst */
! 2666: sizeof(char *)*nCol + /* Index.azColl */
! 2667: sizeof(int)*nCol + /* Index.aiColumn */
! 2668: sizeof(u8)*nCol + /* Index.aSortOrder */
! 2669: nName + 1 + /* Index.zName */
! 2670: nExtra /* Collation sequence names */
! 2671: );
! 2672: if( db->mallocFailed ){
! 2673: goto exit_create_index;
! 2674: }
! 2675: zExtra = (char*)pIndex;
! 2676: pIndex->aiRowEst = (tRowcnt*)&zExtra[ROUND8(sizeof(Index))];
! 2677: pIndex->azColl = (char**)
! 2678: ((char*)pIndex->aiRowEst + ROUND8(sizeof(tRowcnt)*nCol+1));
! 2679: assert( EIGHT_BYTE_ALIGNMENT(pIndex->aiRowEst) );
! 2680: assert( EIGHT_BYTE_ALIGNMENT(pIndex->azColl) );
! 2681: pIndex->aiColumn = (int *)(&pIndex->azColl[nCol]);
! 2682: pIndex->aSortOrder = (u8 *)(&pIndex->aiColumn[nCol]);
! 2683: pIndex->zName = (char *)(&pIndex->aSortOrder[nCol]);
! 2684: zExtra = (char *)(&pIndex->zName[nName+1]);
! 2685: memcpy(pIndex->zName, zName, nName+1);
! 2686: pIndex->pTable = pTab;
! 2687: pIndex->nColumn = pList->nExpr;
! 2688: pIndex->onError = (u8)onError;
! 2689: pIndex->autoIndex = (u8)(pName==0);
! 2690: pIndex->pSchema = db->aDb[iDb].pSchema;
! 2691: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
! 2692:
! 2693: /* Check to see if we should honor DESC requests on index columns
! 2694: */
! 2695: if( pDb->pSchema->file_format>=4 ){
! 2696: sortOrderMask = -1; /* Honor DESC */
! 2697: }else{
! 2698: sortOrderMask = 0; /* Ignore DESC */
! 2699: }
! 2700:
! 2701: /* Scan the names of the columns of the table to be indexed and
! 2702: ** load the column indices into the Index structure. Report an error
! 2703: ** if any column is not found.
! 2704: **
! 2705: ** TODO: Add a test to make sure that the same column is not named
! 2706: ** more than once within the same index. Only the first instance of
! 2707: ** the column will ever be used by the optimizer. Note that using the
! 2708: ** same column more than once cannot be an error because that would
! 2709: ** break backwards compatibility - it needs to be a warning.
! 2710: */
! 2711: for(i=0, pListItem=pList->a; i<pList->nExpr; i++, pListItem++){
! 2712: const char *zColName = pListItem->zName;
! 2713: Column *pTabCol;
! 2714: int requestedSortOrder;
! 2715: char *zColl; /* Collation sequence name */
! 2716:
! 2717: for(j=0, pTabCol=pTab->aCol; j<pTab->nCol; j++, pTabCol++){
! 2718: if( sqlite3StrICmp(zColName, pTabCol->zName)==0 ) break;
! 2719: }
! 2720: if( j>=pTab->nCol ){
! 2721: sqlite3ErrorMsg(pParse, "table %s has no column named %s",
! 2722: pTab->zName, zColName);
! 2723: pParse->checkSchema = 1;
! 2724: goto exit_create_index;
! 2725: }
! 2726: pIndex->aiColumn[i] = j;
! 2727: /* Justification of the ALWAYS(pListItem->pExpr->pColl): Because of
! 2728: ** the way the "idxlist" non-terminal is constructed by the parser,
! 2729: ** if pListItem->pExpr is not null then either pListItem->pExpr->pColl
! 2730: ** must exist or else there must have been an OOM error. But if there
! 2731: ** was an OOM error, we would never reach this point. */
! 2732: if( pListItem->pExpr && ALWAYS(pListItem->pExpr->pColl) ){
! 2733: int nColl;
! 2734: zColl = pListItem->pExpr->pColl->zName;
! 2735: nColl = sqlite3Strlen30(zColl) + 1;
! 2736: assert( nExtra>=nColl );
! 2737: memcpy(zExtra, zColl, nColl);
! 2738: zColl = zExtra;
! 2739: zExtra += nColl;
! 2740: nExtra -= nColl;
! 2741: }else{
! 2742: zColl = pTab->aCol[j].zColl;
! 2743: if( !zColl ){
! 2744: zColl = db->pDfltColl->zName;
! 2745: }
! 2746: }
! 2747: if( !db->init.busy && !sqlite3LocateCollSeq(pParse, zColl) ){
! 2748: goto exit_create_index;
! 2749: }
! 2750: pIndex->azColl[i] = zColl;
! 2751: requestedSortOrder = pListItem->sortOrder & sortOrderMask;
! 2752: pIndex->aSortOrder[i] = (u8)requestedSortOrder;
! 2753: }
! 2754: sqlite3DefaultRowEst(pIndex);
! 2755:
! 2756: if( pTab==pParse->pNewTable ){
! 2757: /* This routine has been called to create an automatic index as a
! 2758: ** result of a PRIMARY KEY or UNIQUE clause on a column definition, or
! 2759: ** a PRIMARY KEY or UNIQUE clause following the column definitions.
! 2760: ** i.e. one of:
! 2761: **
! 2762: ** CREATE TABLE t(x PRIMARY KEY, y);
! 2763: ** CREATE TABLE t(x, y, UNIQUE(x, y));
! 2764: **
! 2765: ** Either way, check to see if the table already has such an index. If
! 2766: ** so, don't bother creating this one. This only applies to
! 2767: ** automatically created indices. Users can do as they wish with
! 2768: ** explicit indices.
! 2769: **
! 2770: ** Two UNIQUE or PRIMARY KEY constraints are considered equivalent
! 2771: ** (and thus suppressing the second one) even if they have different
! 2772: ** sort orders.
! 2773: **
! 2774: ** If there are different collating sequences or if the columns of
! 2775: ** the constraint occur in different orders, then the constraints are
! 2776: ** considered distinct and both result in separate indices.
! 2777: */
! 2778: Index *pIdx;
! 2779: for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
! 2780: int k;
! 2781: assert( pIdx->onError!=OE_None );
! 2782: assert( pIdx->autoIndex );
! 2783: assert( pIndex->onError!=OE_None );
! 2784:
! 2785: if( pIdx->nColumn!=pIndex->nColumn ) continue;
! 2786: for(k=0; k<pIdx->nColumn; k++){
! 2787: const char *z1;
! 2788: const char *z2;
! 2789: if( pIdx->aiColumn[k]!=pIndex->aiColumn[k] ) break;
! 2790: z1 = pIdx->azColl[k];
! 2791: z2 = pIndex->azColl[k];
! 2792: if( z1!=z2 && sqlite3StrICmp(z1, z2) ) break;
! 2793: }
! 2794: if( k==pIdx->nColumn ){
! 2795: if( pIdx->onError!=pIndex->onError ){
! 2796: /* This constraint creates the same index as a previous
! 2797: ** constraint specified somewhere in the CREATE TABLE statement.
! 2798: ** However the ON CONFLICT clauses are different. If both this
! 2799: ** constraint and the previous equivalent constraint have explicit
! 2800: ** ON CONFLICT clauses this is an error. Otherwise, use the
! 2801: ** explicitly specified behaviour for the index.
! 2802: */
! 2803: if( !(pIdx->onError==OE_Default || pIndex->onError==OE_Default) ){
! 2804: sqlite3ErrorMsg(pParse,
! 2805: "conflicting ON CONFLICT clauses specified", 0);
! 2806: }
! 2807: if( pIdx->onError==OE_Default ){
! 2808: pIdx->onError = pIndex->onError;
! 2809: }
! 2810: }
! 2811: goto exit_create_index;
! 2812: }
! 2813: }
! 2814: }
! 2815:
! 2816: /* Link the new Index structure to its table and to the other
! 2817: ** in-memory database structures.
! 2818: */
! 2819: if( db->init.busy ){
! 2820: Index *p;
! 2821: assert( sqlite3SchemaMutexHeld(db, 0, pIndex->pSchema) );
! 2822: p = sqlite3HashInsert(&pIndex->pSchema->idxHash,
! 2823: pIndex->zName, sqlite3Strlen30(pIndex->zName),
! 2824: pIndex);
! 2825: if( p ){
! 2826: assert( p==pIndex ); /* Malloc must have failed */
! 2827: db->mallocFailed = 1;
! 2828: goto exit_create_index;
! 2829: }
! 2830: db->flags |= SQLITE_InternChanges;
! 2831: if( pTblName!=0 ){
! 2832: pIndex->tnum = db->init.newTnum;
! 2833: }
! 2834: }
! 2835:
! 2836: /* If the db->init.busy is 0 then create the index on disk. This
! 2837: ** involves writing the index into the master table and filling in the
! 2838: ** index with the current table contents.
! 2839: **
! 2840: ** The db->init.busy is 0 when the user first enters a CREATE INDEX
! 2841: ** command. db->init.busy is 1 when a database is opened and
! 2842: ** CREATE INDEX statements are read out of the master table. In
! 2843: ** the latter case the index already exists on disk, which is why
! 2844: ** we don't want to recreate it.
! 2845: **
! 2846: ** If pTblName==0 it means this index is generated as a primary key
! 2847: ** or UNIQUE constraint of a CREATE TABLE statement. Since the table
! 2848: ** has just been created, it contains no data and the index initialization
! 2849: ** step can be skipped.
! 2850: */
! 2851: else{ /* if( db->init.busy==0 ) */
! 2852: Vdbe *v;
! 2853: char *zStmt;
! 2854: int iMem = ++pParse->nMem;
! 2855:
! 2856: v = sqlite3GetVdbe(pParse);
! 2857: if( v==0 ) goto exit_create_index;
! 2858:
! 2859:
! 2860: /* Create the rootpage for the index
! 2861: */
! 2862: sqlite3BeginWriteOperation(pParse, 1, iDb);
! 2863: sqlite3VdbeAddOp2(v, OP_CreateIndex, iDb, iMem);
! 2864:
! 2865: /* Gather the complete text of the CREATE INDEX statement into
! 2866: ** the zStmt variable
! 2867: */
! 2868: if( pStart ){
! 2869: assert( pEnd!=0 );
! 2870: /* A named index with an explicit CREATE INDEX statement */
! 2871: zStmt = sqlite3MPrintf(db, "CREATE%s INDEX %.*s",
! 2872: onError==OE_None ? "" : " UNIQUE",
! 2873: (int)(pEnd->z - pName->z) + 1,
! 2874: pName->z);
! 2875: }else{
! 2876: /* An automatic index created by a PRIMARY KEY or UNIQUE constraint */
! 2877: /* zStmt = sqlite3MPrintf(""); */
! 2878: zStmt = 0;
! 2879: }
! 2880:
! 2881: /* Add an entry in sqlite_master for this index
! 2882: */
! 2883: sqlite3NestedParse(pParse,
! 2884: "INSERT INTO %Q.%s VALUES('index',%Q,%Q,#%d,%Q);",
! 2885: db->aDb[iDb].zName, SCHEMA_TABLE(iDb),
! 2886: pIndex->zName,
! 2887: pTab->zName,
! 2888: iMem,
! 2889: zStmt
! 2890: );
! 2891: sqlite3DbFree(db, zStmt);
! 2892:
! 2893: /* Fill the index with data and reparse the schema. Code an OP_Expire
! 2894: ** to invalidate all pre-compiled statements.
! 2895: */
! 2896: if( pTblName ){
! 2897: sqlite3RefillIndex(pParse, pIndex, iMem);
! 2898: sqlite3ChangeCookie(pParse, iDb);
! 2899: sqlite3VdbeAddParseSchemaOp(v, iDb,
! 2900: sqlite3MPrintf(db, "name='%q' AND type='index'", pIndex->zName));
! 2901: sqlite3VdbeAddOp1(v, OP_Expire, 0);
! 2902: }
! 2903: }
! 2904:
! 2905: /* When adding an index to the list of indices for a table, make
! 2906: ** sure all indices labeled OE_Replace come after all those labeled
! 2907: ** OE_Ignore. This is necessary for the correct constraint check
! 2908: ** processing (in sqlite3GenerateConstraintChecks()) as part of
! 2909: ** UPDATE and INSERT statements.
! 2910: */
! 2911: if( db->init.busy || pTblName==0 ){
! 2912: if( onError!=OE_Replace || pTab->pIndex==0
! 2913: || pTab->pIndex->onError==OE_Replace){
! 2914: pIndex->pNext = pTab->pIndex;
! 2915: pTab->pIndex = pIndex;
! 2916: }else{
! 2917: Index *pOther = pTab->pIndex;
! 2918: while( pOther->pNext && pOther->pNext->onError!=OE_Replace ){
! 2919: pOther = pOther->pNext;
! 2920: }
! 2921: pIndex->pNext = pOther->pNext;
! 2922: pOther->pNext = pIndex;
! 2923: }
! 2924: pRet = pIndex;
! 2925: pIndex = 0;
! 2926: }
! 2927:
! 2928: /* Clean up before exiting */
! 2929: exit_create_index:
! 2930: if( pIndex ){
! 2931: sqlite3DbFree(db, pIndex->zColAff);
! 2932: sqlite3DbFree(db, pIndex);
! 2933: }
! 2934: sqlite3ExprListDelete(db, pList);
! 2935: sqlite3SrcListDelete(db, pTblName);
! 2936: sqlite3DbFree(db, zName);
! 2937: return pRet;
! 2938: }
! 2939:
! 2940: /*
! 2941: ** Fill the Index.aiRowEst[] array with default information - information
! 2942: ** to be used when we have not run the ANALYZE command.
! 2943: **
! 2944: ** aiRowEst[0] is suppose to contain the number of elements in the index.
! 2945: ** Since we do not know, guess 1 million. aiRowEst[1] is an estimate of the
! 2946: ** number of rows in the table that match any particular value of the
! 2947: ** first column of the index. aiRowEst[2] is an estimate of the number
! 2948: ** of rows that match any particular combiniation of the first 2 columns
! 2949: ** of the index. And so forth. It must always be the case that
! 2950: *
! 2951: ** aiRowEst[N]<=aiRowEst[N-1]
! 2952: ** aiRowEst[N]>=1
! 2953: **
! 2954: ** Apart from that, we have little to go on besides intuition as to
! 2955: ** how aiRowEst[] should be initialized. The numbers generated here
! 2956: ** are based on typical values found in actual indices.
! 2957: */
! 2958: void sqlite3DefaultRowEst(Index *pIdx){
! 2959: tRowcnt *a = pIdx->aiRowEst;
! 2960: int i;
! 2961: tRowcnt n;
! 2962: assert( a!=0 );
! 2963: a[0] = pIdx->pTable->nRowEst;
! 2964: if( a[0]<10 ) a[0] = 10;
! 2965: n = 10;
! 2966: for(i=1; i<=pIdx->nColumn; i++){
! 2967: a[i] = n;
! 2968: if( n>5 ) n--;
! 2969: }
! 2970: if( pIdx->onError!=OE_None ){
! 2971: a[pIdx->nColumn] = 1;
! 2972: }
! 2973: }
! 2974:
! 2975: /*
! 2976: ** This routine will drop an existing named index. This routine
! 2977: ** implements the DROP INDEX statement.
! 2978: */
! 2979: void sqlite3DropIndex(Parse *pParse, SrcList *pName, int ifExists){
! 2980: Index *pIndex;
! 2981: Vdbe *v;
! 2982: sqlite3 *db = pParse->db;
! 2983: int iDb;
! 2984:
! 2985: assert( pParse->nErr==0 ); /* Never called with prior errors */
! 2986: if( db->mallocFailed ){
! 2987: goto exit_drop_index;
! 2988: }
! 2989: assert( pName->nSrc==1 );
! 2990: if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
! 2991: goto exit_drop_index;
! 2992: }
! 2993: pIndex = sqlite3FindIndex(db, pName->a[0].zName, pName->a[0].zDatabase);
! 2994: if( pIndex==0 ){
! 2995: if( !ifExists ){
! 2996: sqlite3ErrorMsg(pParse, "no such index: %S", pName, 0);
! 2997: }else{
! 2998: sqlite3CodeVerifyNamedSchema(pParse, pName->a[0].zDatabase);
! 2999: }
! 3000: pParse->checkSchema = 1;
! 3001: goto exit_drop_index;
! 3002: }
! 3003: if( pIndex->autoIndex ){
! 3004: sqlite3ErrorMsg(pParse, "index associated with UNIQUE "
! 3005: "or PRIMARY KEY constraint cannot be dropped", 0);
! 3006: goto exit_drop_index;
! 3007: }
! 3008: iDb = sqlite3SchemaToIndex(db, pIndex->pSchema);
! 3009: #ifndef SQLITE_OMIT_AUTHORIZATION
! 3010: {
! 3011: int code = SQLITE_DROP_INDEX;
! 3012: Table *pTab = pIndex->pTable;
! 3013: const char *zDb = db->aDb[iDb].zName;
! 3014: const char *zTab = SCHEMA_TABLE(iDb);
! 3015: if( sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb) ){
! 3016: goto exit_drop_index;
! 3017: }
! 3018: if( !OMIT_TEMPDB && iDb ) code = SQLITE_DROP_TEMP_INDEX;
! 3019: if( sqlite3AuthCheck(pParse, code, pIndex->zName, pTab->zName, zDb) ){
! 3020: goto exit_drop_index;
! 3021: }
! 3022: }
! 3023: #endif
! 3024:
! 3025: /* Generate code to remove the index and from the master table */
! 3026: v = sqlite3GetVdbe(pParse);
! 3027: if( v ){
! 3028: sqlite3BeginWriteOperation(pParse, 1, iDb);
! 3029: sqlite3NestedParse(pParse,
! 3030: "DELETE FROM %Q.%s WHERE name=%Q AND type='index'",
! 3031: db->aDb[iDb].zName, SCHEMA_TABLE(iDb), pIndex->zName
! 3032: );
! 3033: sqlite3ClearStatTables(pParse, iDb, "idx", pIndex->zName);
! 3034: sqlite3ChangeCookie(pParse, iDb);
! 3035: destroyRootPage(pParse, pIndex->tnum, iDb);
! 3036: sqlite3VdbeAddOp4(v, OP_DropIndex, iDb, 0, 0, pIndex->zName, 0);
! 3037: }
! 3038:
! 3039: exit_drop_index:
! 3040: sqlite3SrcListDelete(db, pName);
! 3041: }
! 3042:
! 3043: /*
! 3044: ** pArray is a pointer to an array of objects. Each object in the
! 3045: ** array is szEntry bytes in size. This routine allocates a new
! 3046: ** object on the end of the array.
! 3047: **
! 3048: ** *pnEntry is the number of entries already in use. *pnAlloc is
! 3049: ** the previously allocated size of the array. initSize is the
! 3050: ** suggested initial array size allocation.
! 3051: **
! 3052: ** The index of the new entry is returned in *pIdx.
! 3053: **
! 3054: ** This routine returns a pointer to the array of objects. This
! 3055: ** might be the same as the pArray parameter or it might be a different
! 3056: ** pointer if the array was resized.
! 3057: */
! 3058: void *sqlite3ArrayAllocate(
! 3059: sqlite3 *db, /* Connection to notify of malloc failures */
! 3060: void *pArray, /* Array of objects. Might be reallocated */
! 3061: int szEntry, /* Size of each object in the array */
! 3062: int initSize, /* Suggested initial allocation, in elements */
! 3063: int *pnEntry, /* Number of objects currently in use */
! 3064: int *pnAlloc, /* Current size of the allocation, in elements */
! 3065: int *pIdx /* Write the index of a new slot here */
! 3066: ){
! 3067: char *z;
! 3068: if( *pnEntry >= *pnAlloc ){
! 3069: void *pNew;
! 3070: int newSize;
! 3071: newSize = (*pnAlloc)*2 + initSize;
! 3072: pNew = sqlite3DbRealloc(db, pArray, newSize*szEntry);
! 3073: if( pNew==0 ){
! 3074: *pIdx = -1;
! 3075: return pArray;
! 3076: }
! 3077: *pnAlloc = sqlite3DbMallocSize(db, pNew)/szEntry;
! 3078: pArray = pNew;
! 3079: }
! 3080: z = (char*)pArray;
! 3081: memset(&z[*pnEntry * szEntry], 0, szEntry);
! 3082: *pIdx = *pnEntry;
! 3083: ++*pnEntry;
! 3084: return pArray;
! 3085: }
! 3086:
! 3087: /*
! 3088: ** Append a new element to the given IdList. Create a new IdList if
! 3089: ** need be.
! 3090: **
! 3091: ** A new IdList is returned, or NULL if malloc() fails.
! 3092: */
! 3093: IdList *sqlite3IdListAppend(sqlite3 *db, IdList *pList, Token *pToken){
! 3094: int i;
! 3095: if( pList==0 ){
! 3096: pList = sqlite3DbMallocZero(db, sizeof(IdList) );
! 3097: if( pList==0 ) return 0;
! 3098: pList->nAlloc = 0;
! 3099: }
! 3100: pList->a = sqlite3ArrayAllocate(
! 3101: db,
! 3102: pList->a,
! 3103: sizeof(pList->a[0]),
! 3104: 5,
! 3105: &pList->nId,
! 3106: &pList->nAlloc,
! 3107: &i
! 3108: );
! 3109: if( i<0 ){
! 3110: sqlite3IdListDelete(db, pList);
! 3111: return 0;
! 3112: }
! 3113: pList->a[i].zName = sqlite3NameFromToken(db, pToken);
! 3114: return pList;
! 3115: }
! 3116:
! 3117: /*
! 3118: ** Delete an IdList.
! 3119: */
! 3120: void sqlite3IdListDelete(sqlite3 *db, IdList *pList){
! 3121: int i;
! 3122: if( pList==0 ) return;
! 3123: for(i=0; i<pList->nId; i++){
! 3124: sqlite3DbFree(db, pList->a[i].zName);
! 3125: }
! 3126: sqlite3DbFree(db, pList->a);
! 3127: sqlite3DbFree(db, pList);
! 3128: }
! 3129:
! 3130: /*
! 3131: ** Return the index in pList of the identifier named zId. Return -1
! 3132: ** if not found.
! 3133: */
! 3134: int sqlite3IdListIndex(IdList *pList, const char *zName){
! 3135: int i;
! 3136: if( pList==0 ) return -1;
! 3137: for(i=0; i<pList->nId; i++){
! 3138: if( sqlite3StrICmp(pList->a[i].zName, zName)==0 ) return i;
! 3139: }
! 3140: return -1;
! 3141: }
! 3142:
! 3143: /*
! 3144: ** Expand the space allocated for the given SrcList object by
! 3145: ** creating nExtra new slots beginning at iStart. iStart is zero based.
! 3146: ** New slots are zeroed.
! 3147: **
! 3148: ** For example, suppose a SrcList initially contains two entries: A,B.
! 3149: ** To append 3 new entries onto the end, do this:
! 3150: **
! 3151: ** sqlite3SrcListEnlarge(db, pSrclist, 3, 2);
! 3152: **
! 3153: ** After the call above it would contain: A, B, nil, nil, nil.
! 3154: ** If the iStart argument had been 1 instead of 2, then the result
! 3155: ** would have been: A, nil, nil, nil, B. To prepend the new slots,
! 3156: ** the iStart value would be 0. The result then would
! 3157: ** be: nil, nil, nil, A, B.
! 3158: **
! 3159: ** If a memory allocation fails the SrcList is unchanged. The
! 3160: ** db->mallocFailed flag will be set to true.
! 3161: */
! 3162: SrcList *sqlite3SrcListEnlarge(
! 3163: sqlite3 *db, /* Database connection to notify of OOM errors */
! 3164: SrcList *pSrc, /* The SrcList to be enlarged */
! 3165: int nExtra, /* Number of new slots to add to pSrc->a[] */
! 3166: int iStart /* Index in pSrc->a[] of first new slot */
! 3167: ){
! 3168: int i;
! 3169:
! 3170: /* Sanity checking on calling parameters */
! 3171: assert( iStart>=0 );
! 3172: assert( nExtra>=1 );
! 3173: assert( pSrc!=0 );
! 3174: assert( iStart<=pSrc->nSrc );
! 3175:
! 3176: /* Allocate additional space if needed */
! 3177: if( pSrc->nSrc+nExtra>pSrc->nAlloc ){
! 3178: SrcList *pNew;
! 3179: int nAlloc = pSrc->nSrc+nExtra;
! 3180: int nGot;
! 3181: pNew = sqlite3DbRealloc(db, pSrc,
! 3182: sizeof(*pSrc) + (nAlloc-1)*sizeof(pSrc->a[0]) );
! 3183: if( pNew==0 ){
! 3184: assert( db->mallocFailed );
! 3185: return pSrc;
! 3186: }
! 3187: pSrc = pNew;
! 3188: nGot = (sqlite3DbMallocSize(db, pNew) - sizeof(*pSrc))/sizeof(pSrc->a[0])+1;
! 3189: pSrc->nAlloc = (u16)nGot;
! 3190: }
! 3191:
! 3192: /* Move existing slots that come after the newly inserted slots
! 3193: ** out of the way */
! 3194: for(i=pSrc->nSrc-1; i>=iStart; i--){
! 3195: pSrc->a[i+nExtra] = pSrc->a[i];
! 3196: }
! 3197: pSrc->nSrc += (i16)nExtra;
! 3198:
! 3199: /* Zero the newly allocated slots */
! 3200: memset(&pSrc->a[iStart], 0, sizeof(pSrc->a[0])*nExtra);
! 3201: for(i=iStart; i<iStart+nExtra; i++){
! 3202: pSrc->a[i].iCursor = -1;
! 3203: }
! 3204:
! 3205: /* Return a pointer to the enlarged SrcList */
! 3206: return pSrc;
! 3207: }
! 3208:
! 3209:
! 3210: /*
! 3211: ** Append a new table name to the given SrcList. Create a new SrcList if
! 3212: ** need be. A new entry is created in the SrcList even if pTable is NULL.
! 3213: **
! 3214: ** A SrcList is returned, or NULL if there is an OOM error. The returned
! 3215: ** SrcList might be the same as the SrcList that was input or it might be
! 3216: ** a new one. If an OOM error does occurs, then the prior value of pList
! 3217: ** that is input to this routine is automatically freed.
! 3218: **
! 3219: ** If pDatabase is not null, it means that the table has an optional
! 3220: ** database name prefix. Like this: "database.table". The pDatabase
! 3221: ** points to the table name and the pTable points to the database name.
! 3222: ** The SrcList.a[].zName field is filled with the table name which might
! 3223: ** come from pTable (if pDatabase is NULL) or from pDatabase.
! 3224: ** SrcList.a[].zDatabase is filled with the database name from pTable,
! 3225: ** or with NULL if no database is specified.
! 3226: **
! 3227: ** In other words, if call like this:
! 3228: **
! 3229: ** sqlite3SrcListAppend(D,A,B,0);
! 3230: **
! 3231: ** Then B is a table name and the database name is unspecified. If called
! 3232: ** like this:
! 3233: **
! 3234: ** sqlite3SrcListAppend(D,A,B,C);
! 3235: **
! 3236: ** Then C is the table name and B is the database name. If C is defined
! 3237: ** then so is B. In other words, we never have a case where:
! 3238: **
! 3239: ** sqlite3SrcListAppend(D,A,0,C);
! 3240: **
! 3241: ** Both pTable and pDatabase are assumed to be quoted. They are dequoted
! 3242: ** before being added to the SrcList.
! 3243: */
! 3244: SrcList *sqlite3SrcListAppend(
! 3245: sqlite3 *db, /* Connection to notify of malloc failures */
! 3246: SrcList *pList, /* Append to this SrcList. NULL creates a new SrcList */
! 3247: Token *pTable, /* Table to append */
! 3248: Token *pDatabase /* Database of the table */
! 3249: ){
! 3250: struct SrcList_item *pItem;
! 3251: assert( pDatabase==0 || pTable!=0 ); /* Cannot have C without B */
! 3252: if( pList==0 ){
! 3253: pList = sqlite3DbMallocZero(db, sizeof(SrcList) );
! 3254: if( pList==0 ) return 0;
! 3255: pList->nAlloc = 1;
! 3256: }
! 3257: pList = sqlite3SrcListEnlarge(db, pList, 1, pList->nSrc);
! 3258: if( db->mallocFailed ){
! 3259: sqlite3SrcListDelete(db, pList);
! 3260: return 0;
! 3261: }
! 3262: pItem = &pList->a[pList->nSrc-1];
! 3263: if( pDatabase && pDatabase->z==0 ){
! 3264: pDatabase = 0;
! 3265: }
! 3266: if( pDatabase ){
! 3267: Token *pTemp = pDatabase;
! 3268: pDatabase = pTable;
! 3269: pTable = pTemp;
! 3270: }
! 3271: pItem->zName = sqlite3NameFromToken(db, pTable);
! 3272: pItem->zDatabase = sqlite3NameFromToken(db, pDatabase);
! 3273: return pList;
! 3274: }
! 3275:
! 3276: /*
! 3277: ** Assign VdbeCursor index numbers to all tables in a SrcList
! 3278: */
! 3279: void sqlite3SrcListAssignCursors(Parse *pParse, SrcList *pList){
! 3280: int i;
! 3281: struct SrcList_item *pItem;
! 3282: assert(pList || pParse->db->mallocFailed );
! 3283: if( pList ){
! 3284: for(i=0, pItem=pList->a; i<pList->nSrc; i++, pItem++){
! 3285: if( pItem->iCursor>=0 ) break;
! 3286: pItem->iCursor = pParse->nTab++;
! 3287: if( pItem->pSelect ){
! 3288: sqlite3SrcListAssignCursors(pParse, pItem->pSelect->pSrc);
! 3289: }
! 3290: }
! 3291: }
! 3292: }
! 3293:
! 3294: /*
! 3295: ** Delete an entire SrcList including all its substructure.
! 3296: */
! 3297: void sqlite3SrcListDelete(sqlite3 *db, SrcList *pList){
! 3298: int i;
! 3299: struct SrcList_item *pItem;
! 3300: if( pList==0 ) return;
! 3301: for(pItem=pList->a, i=0; i<pList->nSrc; i++, pItem++){
! 3302: sqlite3DbFree(db, pItem->zDatabase);
! 3303: sqlite3DbFree(db, pItem->zName);
! 3304: sqlite3DbFree(db, pItem->zAlias);
! 3305: sqlite3DbFree(db, pItem->zIndex);
! 3306: sqlite3DeleteTable(db, pItem->pTab);
! 3307: sqlite3SelectDelete(db, pItem->pSelect);
! 3308: sqlite3ExprDelete(db, pItem->pOn);
! 3309: sqlite3IdListDelete(db, pItem->pUsing);
! 3310: }
! 3311: sqlite3DbFree(db, pList);
! 3312: }
! 3313:
! 3314: /*
! 3315: ** This routine is called by the parser to add a new term to the
! 3316: ** end of a growing FROM clause. The "p" parameter is the part of
! 3317: ** the FROM clause that has already been constructed. "p" is NULL
! 3318: ** if this is the first term of the FROM clause. pTable and pDatabase
! 3319: ** are the name of the table and database named in the FROM clause term.
! 3320: ** pDatabase is NULL if the database name qualifier is missing - the
! 3321: ** usual case. If the term has a alias, then pAlias points to the
! 3322: ** alias token. If the term is a subquery, then pSubquery is the
! 3323: ** SELECT statement that the subquery encodes. The pTable and
! 3324: ** pDatabase parameters are NULL for subqueries. The pOn and pUsing
! 3325: ** parameters are the content of the ON and USING clauses.
! 3326: **
! 3327: ** Return a new SrcList which encodes is the FROM with the new
! 3328: ** term added.
! 3329: */
! 3330: SrcList *sqlite3SrcListAppendFromTerm(
! 3331: Parse *pParse, /* Parsing context */
! 3332: SrcList *p, /* The left part of the FROM clause already seen */
! 3333: Token *pTable, /* Name of the table to add to the FROM clause */
! 3334: Token *pDatabase, /* Name of the database containing pTable */
! 3335: Token *pAlias, /* The right-hand side of the AS subexpression */
! 3336: Select *pSubquery, /* A subquery used in place of a table name */
! 3337: Expr *pOn, /* The ON clause of a join */
! 3338: IdList *pUsing /* The USING clause of a join */
! 3339: ){
! 3340: struct SrcList_item *pItem;
! 3341: sqlite3 *db = pParse->db;
! 3342: if( !p && (pOn || pUsing) ){
! 3343: sqlite3ErrorMsg(pParse, "a JOIN clause is required before %s",
! 3344: (pOn ? "ON" : "USING")
! 3345: );
! 3346: goto append_from_error;
! 3347: }
! 3348: p = sqlite3SrcListAppend(db, p, pTable, pDatabase);
! 3349: if( p==0 || NEVER(p->nSrc==0) ){
! 3350: goto append_from_error;
! 3351: }
! 3352: pItem = &p->a[p->nSrc-1];
! 3353: assert( pAlias!=0 );
! 3354: if( pAlias->n ){
! 3355: pItem->zAlias = sqlite3NameFromToken(db, pAlias);
! 3356: }
! 3357: pItem->pSelect = pSubquery;
! 3358: pItem->pOn = pOn;
! 3359: pItem->pUsing = pUsing;
! 3360: return p;
! 3361:
! 3362: append_from_error:
! 3363: assert( p==0 );
! 3364: sqlite3ExprDelete(db, pOn);
! 3365: sqlite3IdListDelete(db, pUsing);
! 3366: sqlite3SelectDelete(db, pSubquery);
! 3367: return 0;
! 3368: }
! 3369:
! 3370: /*
! 3371: ** Add an INDEXED BY or NOT INDEXED clause to the most recently added
! 3372: ** element of the source-list passed as the second argument.
! 3373: */
! 3374: void sqlite3SrcListIndexedBy(Parse *pParse, SrcList *p, Token *pIndexedBy){
! 3375: assert( pIndexedBy!=0 );
! 3376: if( p && ALWAYS(p->nSrc>0) ){
! 3377: struct SrcList_item *pItem = &p->a[p->nSrc-1];
! 3378: assert( pItem->notIndexed==0 && pItem->zIndex==0 );
! 3379: if( pIndexedBy->n==1 && !pIndexedBy->z ){
! 3380: /* A "NOT INDEXED" clause was supplied. See parse.y
! 3381: ** construct "indexed_opt" for details. */
! 3382: pItem->notIndexed = 1;
! 3383: }else{
! 3384: pItem->zIndex = sqlite3NameFromToken(pParse->db, pIndexedBy);
! 3385: }
! 3386: }
! 3387: }
! 3388:
! 3389: /*
! 3390: ** When building up a FROM clause in the parser, the join operator
! 3391: ** is initially attached to the left operand. But the code generator
! 3392: ** expects the join operator to be on the right operand. This routine
! 3393: ** Shifts all join operators from left to right for an entire FROM
! 3394: ** clause.
! 3395: **
! 3396: ** Example: Suppose the join is like this:
! 3397: **
! 3398: ** A natural cross join B
! 3399: **
! 3400: ** The operator is "natural cross join". The A and B operands are stored
! 3401: ** in p->a[0] and p->a[1], respectively. The parser initially stores the
! 3402: ** operator with A. This routine shifts that operator over to B.
! 3403: */
! 3404: void sqlite3SrcListShiftJoinType(SrcList *p){
! 3405: if( p ){
! 3406: int i;
! 3407: assert( p->a || p->nSrc==0 );
! 3408: for(i=p->nSrc-1; i>0; i--){
! 3409: p->a[i].jointype = p->a[i-1].jointype;
! 3410: }
! 3411: p->a[0].jointype = 0;
! 3412: }
! 3413: }
! 3414:
! 3415: /*
! 3416: ** Begin a transaction
! 3417: */
! 3418: void sqlite3BeginTransaction(Parse *pParse, int type){
! 3419: sqlite3 *db;
! 3420: Vdbe *v;
! 3421: int i;
! 3422:
! 3423: assert( pParse!=0 );
! 3424: db = pParse->db;
! 3425: assert( db!=0 );
! 3426: /* if( db->aDb[0].pBt==0 ) return; */
! 3427: if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "BEGIN", 0, 0) ){
! 3428: return;
! 3429: }
! 3430: v = sqlite3GetVdbe(pParse);
! 3431: if( !v ) return;
! 3432: if( type!=TK_DEFERRED ){
! 3433: for(i=0; i<db->nDb; i++){
! 3434: sqlite3VdbeAddOp2(v, OP_Transaction, i, (type==TK_EXCLUSIVE)+1);
! 3435: sqlite3VdbeUsesBtree(v, i);
! 3436: }
! 3437: }
! 3438: sqlite3VdbeAddOp2(v, OP_AutoCommit, 0, 0);
! 3439: }
! 3440:
! 3441: /*
! 3442: ** Commit a transaction
! 3443: */
! 3444: void sqlite3CommitTransaction(Parse *pParse){
! 3445: Vdbe *v;
! 3446:
! 3447: assert( pParse!=0 );
! 3448: assert( pParse->db!=0 );
! 3449: if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "COMMIT", 0, 0) ){
! 3450: return;
! 3451: }
! 3452: v = sqlite3GetVdbe(pParse);
! 3453: if( v ){
! 3454: sqlite3VdbeAddOp2(v, OP_AutoCommit, 1, 0);
! 3455: }
! 3456: }
! 3457:
! 3458: /*
! 3459: ** Rollback a transaction
! 3460: */
! 3461: void sqlite3RollbackTransaction(Parse *pParse){
! 3462: Vdbe *v;
! 3463:
! 3464: assert( pParse!=0 );
! 3465: assert( pParse->db!=0 );
! 3466: if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "ROLLBACK", 0, 0) ){
! 3467: return;
! 3468: }
! 3469: v = sqlite3GetVdbe(pParse);
! 3470: if( v ){
! 3471: sqlite3VdbeAddOp2(v, OP_AutoCommit, 1, 1);
! 3472: }
! 3473: }
! 3474:
! 3475: /*
! 3476: ** This function is called by the parser when it parses a command to create,
! 3477: ** release or rollback an SQL savepoint.
! 3478: */
! 3479: void sqlite3Savepoint(Parse *pParse, int op, Token *pName){
! 3480: char *zName = sqlite3NameFromToken(pParse->db, pName);
! 3481: if( zName ){
! 3482: Vdbe *v = sqlite3GetVdbe(pParse);
! 3483: #ifndef SQLITE_OMIT_AUTHORIZATION
! 3484: static const char * const az[] = { "BEGIN", "RELEASE", "ROLLBACK" };
! 3485: assert( !SAVEPOINT_BEGIN && SAVEPOINT_RELEASE==1 && SAVEPOINT_ROLLBACK==2 );
! 3486: #endif
! 3487: if( !v || sqlite3AuthCheck(pParse, SQLITE_SAVEPOINT, az[op], zName, 0) ){
! 3488: sqlite3DbFree(pParse->db, zName);
! 3489: return;
! 3490: }
! 3491: sqlite3VdbeAddOp4(v, OP_Savepoint, op, 0, 0, zName, P4_DYNAMIC);
! 3492: }
! 3493: }
! 3494:
! 3495: /*
! 3496: ** Make sure the TEMP database is open and available for use. Return
! 3497: ** the number of errors. Leave any error messages in the pParse structure.
! 3498: */
! 3499: int sqlite3OpenTempDatabase(Parse *pParse){
! 3500: sqlite3 *db = pParse->db;
! 3501: if( db->aDb[1].pBt==0 && !pParse->explain ){
! 3502: int rc;
! 3503: Btree *pBt;
! 3504: static const int flags =
! 3505: SQLITE_OPEN_READWRITE |
! 3506: SQLITE_OPEN_CREATE |
! 3507: SQLITE_OPEN_EXCLUSIVE |
! 3508: SQLITE_OPEN_DELETEONCLOSE |
! 3509: SQLITE_OPEN_TEMP_DB;
! 3510:
! 3511: rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pBt, 0, flags);
! 3512: if( rc!=SQLITE_OK ){
! 3513: sqlite3ErrorMsg(pParse, "unable to open a temporary database "
! 3514: "file for storing temporary tables");
! 3515: pParse->rc = rc;
! 3516: return 1;
! 3517: }
! 3518: db->aDb[1].pBt = pBt;
! 3519: assert( db->aDb[1].pSchema );
! 3520: if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize, -1, 0) ){
! 3521: db->mallocFailed = 1;
! 3522: return 1;
! 3523: }
! 3524: }
! 3525: return 0;
! 3526: }
! 3527:
! 3528: /*
! 3529: ** Generate VDBE code that will verify the schema cookie and start
! 3530: ** a read-transaction for all named database files.
! 3531: **
! 3532: ** It is important that all schema cookies be verified and all
! 3533: ** read transactions be started before anything else happens in
! 3534: ** the VDBE program. But this routine can be called after much other
! 3535: ** code has been generated. So here is what we do:
! 3536: **
! 3537: ** The first time this routine is called, we code an OP_Goto that
! 3538: ** will jump to a subroutine at the end of the program. Then we
! 3539: ** record every database that needs its schema verified in the
! 3540: ** pParse->cookieMask field. Later, after all other code has been
! 3541: ** generated, the subroutine that does the cookie verifications and
! 3542: ** starts the transactions will be coded and the OP_Goto P2 value
! 3543: ** will be made to point to that subroutine. The generation of the
! 3544: ** cookie verification subroutine code happens in sqlite3FinishCoding().
! 3545: **
! 3546: ** If iDb<0 then code the OP_Goto only - don't set flag to verify the
! 3547: ** schema on any databases. This can be used to position the OP_Goto
! 3548: ** early in the code, before we know if any database tables will be used.
! 3549: */
! 3550: void sqlite3CodeVerifySchema(Parse *pParse, int iDb){
! 3551: Parse *pToplevel = sqlite3ParseToplevel(pParse);
! 3552:
! 3553: if( pToplevel->cookieGoto==0 ){
! 3554: Vdbe *v = sqlite3GetVdbe(pToplevel);
! 3555: if( v==0 ) return; /* This only happens if there was a prior error */
! 3556: pToplevel->cookieGoto = sqlite3VdbeAddOp2(v, OP_Goto, 0, 0)+1;
! 3557: }
! 3558: if( iDb>=0 ){
! 3559: sqlite3 *db = pToplevel->db;
! 3560: yDbMask mask;
! 3561:
! 3562: assert( iDb<db->nDb );
! 3563: assert( db->aDb[iDb].pBt!=0 || iDb==1 );
! 3564: assert( iDb<SQLITE_MAX_ATTACHED+2 );
! 3565: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
! 3566: mask = ((yDbMask)1)<<iDb;
! 3567: if( (pToplevel->cookieMask & mask)==0 ){
! 3568: pToplevel->cookieMask |= mask;
! 3569: pToplevel->cookieValue[iDb] = db->aDb[iDb].pSchema->schema_cookie;
! 3570: if( !OMIT_TEMPDB && iDb==1 ){
! 3571: sqlite3OpenTempDatabase(pToplevel);
! 3572: }
! 3573: }
! 3574: }
! 3575: }
! 3576:
! 3577: /*
! 3578: ** If argument zDb is NULL, then call sqlite3CodeVerifySchema() for each
! 3579: ** attached database. Otherwise, invoke it for the database named zDb only.
! 3580: */
! 3581: void sqlite3CodeVerifyNamedSchema(Parse *pParse, const char *zDb){
! 3582: sqlite3 *db = pParse->db;
! 3583: int i;
! 3584: for(i=0; i<db->nDb; i++){
! 3585: Db *pDb = &db->aDb[i];
! 3586: if( pDb->pBt && (!zDb || 0==sqlite3StrICmp(zDb, pDb->zName)) ){
! 3587: sqlite3CodeVerifySchema(pParse, i);
! 3588: }
! 3589: }
! 3590: }
! 3591:
! 3592: /*
! 3593: ** Generate VDBE code that prepares for doing an operation that
! 3594: ** might change the database.
! 3595: **
! 3596: ** This routine starts a new transaction if we are not already within
! 3597: ** a transaction. If we are already within a transaction, then a checkpoint
! 3598: ** is set if the setStatement parameter is true. A checkpoint should
! 3599: ** be set for operations that might fail (due to a constraint) part of
! 3600: ** the way through and which will need to undo some writes without having to
! 3601: ** rollback the whole transaction. For operations where all constraints
! 3602: ** can be checked before any changes are made to the database, it is never
! 3603: ** necessary to undo a write and the checkpoint should not be set.
! 3604: */
! 3605: void sqlite3BeginWriteOperation(Parse *pParse, int setStatement, int iDb){
! 3606: Parse *pToplevel = sqlite3ParseToplevel(pParse);
! 3607: sqlite3CodeVerifySchema(pParse, iDb);
! 3608: pToplevel->writeMask |= ((yDbMask)1)<<iDb;
! 3609: pToplevel->isMultiWrite |= setStatement;
! 3610: }
! 3611:
! 3612: /*
! 3613: ** Indicate that the statement currently under construction might write
! 3614: ** more than one entry (example: deleting one row then inserting another,
! 3615: ** inserting multiple rows in a table, or inserting a row and index entries.)
! 3616: ** If an abort occurs after some of these writes have completed, then it will
! 3617: ** be necessary to undo the completed writes.
! 3618: */
! 3619: void sqlite3MultiWrite(Parse *pParse){
! 3620: Parse *pToplevel = sqlite3ParseToplevel(pParse);
! 3621: pToplevel->isMultiWrite = 1;
! 3622: }
! 3623:
! 3624: /*
! 3625: ** The code generator calls this routine if is discovers that it is
! 3626: ** possible to abort a statement prior to completion. In order to
! 3627: ** perform this abort without corrupting the database, we need to make
! 3628: ** sure that the statement is protected by a statement transaction.
! 3629: **
! 3630: ** Technically, we only need to set the mayAbort flag if the
! 3631: ** isMultiWrite flag was previously set. There is a time dependency
! 3632: ** such that the abort must occur after the multiwrite. This makes
! 3633: ** some statements involving the REPLACE conflict resolution algorithm
! 3634: ** go a little faster. But taking advantage of this time dependency
! 3635: ** makes it more difficult to prove that the code is correct (in
! 3636: ** particular, it prevents us from writing an effective
! 3637: ** implementation of sqlite3AssertMayAbort()) and so we have chosen
! 3638: ** to take the safe route and skip the optimization.
! 3639: */
! 3640: void sqlite3MayAbort(Parse *pParse){
! 3641: Parse *pToplevel = sqlite3ParseToplevel(pParse);
! 3642: pToplevel->mayAbort = 1;
! 3643: }
! 3644:
! 3645: /*
! 3646: ** Code an OP_Halt that causes the vdbe to return an SQLITE_CONSTRAINT
! 3647: ** error. The onError parameter determines which (if any) of the statement
! 3648: ** and/or current transaction is rolled back.
! 3649: */
! 3650: void sqlite3HaltConstraint(Parse *pParse, int onError, char *p4, int p4type){
! 3651: Vdbe *v = sqlite3GetVdbe(pParse);
! 3652: if( onError==OE_Abort ){
! 3653: sqlite3MayAbort(pParse);
! 3654: }
! 3655: sqlite3VdbeAddOp4(v, OP_Halt, SQLITE_CONSTRAINT, onError, 0, p4, p4type);
! 3656: }
! 3657:
! 3658: /*
! 3659: ** Check to see if pIndex uses the collating sequence pColl. Return
! 3660: ** true if it does and false if it does not.
! 3661: */
! 3662: #ifndef SQLITE_OMIT_REINDEX
! 3663: static int collationMatch(const char *zColl, Index *pIndex){
! 3664: int i;
! 3665: assert( zColl!=0 );
! 3666: for(i=0; i<pIndex->nColumn; i++){
! 3667: const char *z = pIndex->azColl[i];
! 3668: assert( z!=0 );
! 3669: if( 0==sqlite3StrICmp(z, zColl) ){
! 3670: return 1;
! 3671: }
! 3672: }
! 3673: return 0;
! 3674: }
! 3675: #endif
! 3676:
! 3677: /*
! 3678: ** Recompute all indices of pTab that use the collating sequence pColl.
! 3679: ** If pColl==0 then recompute all indices of pTab.
! 3680: */
! 3681: #ifndef SQLITE_OMIT_REINDEX
! 3682: static void reindexTable(Parse *pParse, Table *pTab, char const *zColl){
! 3683: Index *pIndex; /* An index associated with pTab */
! 3684:
! 3685: for(pIndex=pTab->pIndex; pIndex; pIndex=pIndex->pNext){
! 3686: if( zColl==0 || collationMatch(zColl, pIndex) ){
! 3687: int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
! 3688: sqlite3BeginWriteOperation(pParse, 0, iDb);
! 3689: sqlite3RefillIndex(pParse, pIndex, -1);
! 3690: }
! 3691: }
! 3692: }
! 3693: #endif
! 3694:
! 3695: /*
! 3696: ** Recompute all indices of all tables in all databases where the
! 3697: ** indices use the collating sequence pColl. If pColl==0 then recompute
! 3698: ** all indices everywhere.
! 3699: */
! 3700: #ifndef SQLITE_OMIT_REINDEX
! 3701: static void reindexDatabases(Parse *pParse, char const *zColl){
! 3702: Db *pDb; /* A single database */
! 3703: int iDb; /* The database index number */
! 3704: sqlite3 *db = pParse->db; /* The database connection */
! 3705: HashElem *k; /* For looping over tables in pDb */
! 3706: Table *pTab; /* A table in the database */
! 3707:
! 3708: assert( sqlite3BtreeHoldsAllMutexes(db) ); /* Needed for schema access */
! 3709: for(iDb=0, pDb=db->aDb; iDb<db->nDb; iDb++, pDb++){
! 3710: assert( pDb!=0 );
! 3711: for(k=sqliteHashFirst(&pDb->pSchema->tblHash); k; k=sqliteHashNext(k)){
! 3712: pTab = (Table*)sqliteHashData(k);
! 3713: reindexTable(pParse, pTab, zColl);
! 3714: }
! 3715: }
! 3716: }
! 3717: #endif
! 3718:
! 3719: /*
! 3720: ** Generate code for the REINDEX command.
! 3721: **
! 3722: ** REINDEX -- 1
! 3723: ** REINDEX <collation> -- 2
! 3724: ** REINDEX ?<database>.?<tablename> -- 3
! 3725: ** REINDEX ?<database>.?<indexname> -- 4
! 3726: **
! 3727: ** Form 1 causes all indices in all attached databases to be rebuilt.
! 3728: ** Form 2 rebuilds all indices in all databases that use the named
! 3729: ** collating function. Forms 3 and 4 rebuild the named index or all
! 3730: ** indices associated with the named table.
! 3731: */
! 3732: #ifndef SQLITE_OMIT_REINDEX
! 3733: void sqlite3Reindex(Parse *pParse, Token *pName1, Token *pName2){
! 3734: CollSeq *pColl; /* Collating sequence to be reindexed, or NULL */
! 3735: char *z; /* Name of a table or index */
! 3736: const char *zDb; /* Name of the database */
! 3737: Table *pTab; /* A table in the database */
! 3738: Index *pIndex; /* An index associated with pTab */
! 3739: int iDb; /* The database index number */
! 3740: sqlite3 *db = pParse->db; /* The database connection */
! 3741: Token *pObjName; /* Name of the table or index to be reindexed */
! 3742:
! 3743: /* Read the database schema. If an error occurs, leave an error message
! 3744: ** and code in pParse and return NULL. */
! 3745: if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
! 3746: return;
! 3747: }
! 3748:
! 3749: if( pName1==0 ){
! 3750: reindexDatabases(pParse, 0);
! 3751: return;
! 3752: }else if( NEVER(pName2==0) || pName2->z==0 ){
! 3753: char *zColl;
! 3754: assert( pName1->z );
! 3755: zColl = sqlite3NameFromToken(pParse->db, pName1);
! 3756: if( !zColl ) return;
! 3757: pColl = sqlite3FindCollSeq(db, ENC(db), zColl, 0);
! 3758: if( pColl ){
! 3759: reindexDatabases(pParse, zColl);
! 3760: sqlite3DbFree(db, zColl);
! 3761: return;
! 3762: }
! 3763: sqlite3DbFree(db, zColl);
! 3764: }
! 3765: iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pObjName);
! 3766: if( iDb<0 ) return;
! 3767: z = sqlite3NameFromToken(db, pObjName);
! 3768: if( z==0 ) return;
! 3769: zDb = db->aDb[iDb].zName;
! 3770: pTab = sqlite3FindTable(db, z, zDb);
! 3771: if( pTab ){
! 3772: reindexTable(pParse, pTab, 0);
! 3773: sqlite3DbFree(db, z);
! 3774: return;
! 3775: }
! 3776: pIndex = sqlite3FindIndex(db, z, zDb);
! 3777: sqlite3DbFree(db, z);
! 3778: if( pIndex ){
! 3779: sqlite3BeginWriteOperation(pParse, 0, iDb);
! 3780: sqlite3RefillIndex(pParse, pIndex, -1);
! 3781: return;
! 3782: }
! 3783: sqlite3ErrorMsg(pParse, "unable to identify the object to be reindexed");
! 3784: }
! 3785: #endif
! 3786:
! 3787: /*
! 3788: ** Return a dynamicly allocated KeyInfo structure that can be used
! 3789: ** with OP_OpenRead or OP_OpenWrite to access database index pIdx.
! 3790: **
! 3791: ** If successful, a pointer to the new structure is returned. In this case
! 3792: ** the caller is responsible for calling sqlite3DbFree(db, ) on the returned
! 3793: ** pointer. If an error occurs (out of memory or missing collation
! 3794: ** sequence), NULL is returned and the state of pParse updated to reflect
! 3795: ** the error.
! 3796: */
! 3797: KeyInfo *sqlite3IndexKeyinfo(Parse *pParse, Index *pIdx){
! 3798: int i;
! 3799: int nCol = pIdx->nColumn;
! 3800: int nBytes = sizeof(KeyInfo) + (nCol-1)*sizeof(CollSeq*) + nCol;
! 3801: sqlite3 *db = pParse->db;
! 3802: KeyInfo *pKey = (KeyInfo *)sqlite3DbMallocZero(db, nBytes);
! 3803:
! 3804: if( pKey ){
! 3805: pKey->db = pParse->db;
! 3806: pKey->aSortOrder = (u8 *)&(pKey->aColl[nCol]);
! 3807: assert( &pKey->aSortOrder[nCol]==&(((u8 *)pKey)[nBytes]) );
! 3808: for(i=0; i<nCol; i++){
! 3809: char *zColl = pIdx->azColl[i];
! 3810: assert( zColl );
! 3811: pKey->aColl[i] = sqlite3LocateCollSeq(pParse, zColl);
! 3812: pKey->aSortOrder[i] = pIdx->aSortOrder[i];
! 3813: }
! 3814: pKey->nField = (u16)nCol;
! 3815: }
! 3816:
! 3817: if( pParse->nErr ){
! 3818: sqlite3DbFree(db, pKey);
! 3819: pKey = 0;
! 3820: }
! 3821: return pKey;
! 3822: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>