Annotation of embedaddon/php/ext/sqlite/libsqlite/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: ** PRAGMA
! 25: **
! 26: ** $Id: build.c 195361 2005-09-07 15:11:33Z iliaa $
! 27: */
! 28: #include "sqliteInt.h"
! 29: #include <ctype.h>
! 30:
! 31: /*
! 32: ** This routine is called when a new SQL statement is beginning to
! 33: ** be parsed. Check to see if the schema for the database needs
! 34: ** to be read from the SQLITE_MASTER and SQLITE_TEMP_MASTER tables.
! 35: ** If it does, then read it.
! 36: */
! 37: void sqliteBeginParse(Parse *pParse, int explainFlag){
! 38: sqlite *db = pParse->db;
! 39: int i;
! 40: pParse->explain = explainFlag;
! 41: if((db->flags & SQLITE_Initialized)==0 && db->init.busy==0 ){
! 42: int rc = sqliteInit(db, &pParse->zErrMsg);
! 43: if( rc!=SQLITE_OK ){
! 44: pParse->rc = rc;
! 45: pParse->nErr++;
! 46: }
! 47: }
! 48: for(i=0; i<db->nDb; i++){
! 49: DbClearProperty(db, i, DB_Locked);
! 50: if( !db->aDb[i].inTrans ){
! 51: DbClearProperty(db, i, DB_Cookie);
! 52: }
! 53: }
! 54: pParse->nVar = 0;
! 55: }
! 56:
! 57: /*
! 58: ** This routine is called after a single SQL statement has been
! 59: ** parsed and we want to execute the VDBE code to implement
! 60: ** that statement. Prior action routines should have already
! 61: ** constructed VDBE code to do the work of the SQL statement.
! 62: ** This routine just has to execute the VDBE code.
! 63: **
! 64: ** Note that if an error occurred, it might be the case that
! 65: ** no VDBE code was generated.
! 66: */
! 67: void sqliteExec(Parse *pParse){
! 68: sqlite *db = pParse->db;
! 69: Vdbe *v = pParse->pVdbe;
! 70:
! 71: if( v==0 && (v = sqliteGetVdbe(pParse))!=0 ){
! 72: sqliteVdbeAddOp(v, OP_Halt, 0, 0);
! 73: }
! 74: if( sqlite_malloc_failed ) return;
! 75: if( v && pParse->nErr==0 ){
! 76: FILE *trace = (db->flags & SQLITE_VdbeTrace)!=0 ? stdout : 0;
! 77: sqliteVdbeTrace(v, trace);
! 78: sqliteVdbeMakeReady(v, pParse->nVar, pParse->explain);
! 79: pParse->rc = pParse->nErr ? SQLITE_ERROR : SQLITE_DONE;
! 80: pParse->colNamesSet = 0;
! 81: }else if( pParse->rc==SQLITE_OK ){
! 82: pParse->rc = SQLITE_ERROR;
! 83: }
! 84: pParse->nTab = 0;
! 85: pParse->nMem = 0;
! 86: pParse->nSet = 0;
! 87: pParse->nAgg = 0;
! 88: pParse->nVar = 0;
! 89: }
! 90:
! 91: /*
! 92: ** Locate the in-memory structure that describes
! 93: ** a particular database table given the name
! 94: ** of that table and (optionally) the name of the database
! 95: ** containing the table. Return NULL if not found.
! 96: **
! 97: ** If zDatabase is 0, all databases are searched for the
! 98: ** table and the first matching table is returned. (No checking
! 99: ** for duplicate table names is done.) The search order is
! 100: ** TEMP first, then MAIN, then any auxiliary databases added
! 101: ** using the ATTACH command.
! 102: **
! 103: ** See also sqliteLocateTable().
! 104: */
! 105: Table *sqliteFindTable(sqlite *db, const char *zName, const char *zDatabase){
! 106: Table *p = 0;
! 107: int i;
! 108: for(i=0; i<db->nDb; i++){
! 109: int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */
! 110: if( zDatabase!=0 && sqliteStrICmp(zDatabase, db->aDb[j].zName) ) continue;
! 111: p = sqliteHashFind(&db->aDb[j].tblHash, zName, strlen(zName)+1);
! 112: if( p ) break;
! 113: }
! 114: return p;
! 115: }
! 116:
! 117: /*
! 118: ** Locate the in-memory structure that describes
! 119: ** a particular database table given the name
! 120: ** of that table and (optionally) the name of the database
! 121: ** containing the table. Return NULL if not found.
! 122: ** Also leave an error message in pParse->zErrMsg.
! 123: **
! 124: ** The difference between this routine and sqliteFindTable()
! 125: ** is that this routine leaves an error message in pParse->zErrMsg
! 126: ** where sqliteFindTable() does not.
! 127: */
! 128: Table *sqliteLocateTable(Parse *pParse, const char *zName, const char *zDbase){
! 129: Table *p;
! 130:
! 131: p = sqliteFindTable(pParse->db, zName, zDbase);
! 132: if( p==0 ){
! 133: if( zDbase ){
! 134: sqliteErrorMsg(pParse, "no such table: %s.%s", zDbase, zName);
! 135: }else if( sqliteFindTable(pParse->db, zName, 0)!=0 ){
! 136: sqliteErrorMsg(pParse, "table \"%s\" is not in database \"%s\"",
! 137: zName, zDbase);
! 138: }else{
! 139: sqliteErrorMsg(pParse, "no such table: %s", zName);
! 140: }
! 141: }
! 142: return p;
! 143: }
! 144:
! 145: /*
! 146: ** Locate the in-memory structure that describes
! 147: ** a particular index given the name of that index
! 148: ** and the name of the database that contains the index.
! 149: ** Return NULL if not found.
! 150: **
! 151: ** If zDatabase is 0, all databases are searched for the
! 152: ** table and the first matching index is returned. (No checking
! 153: ** for duplicate index names is done.) The search order is
! 154: ** TEMP first, then MAIN, then any auxiliary databases added
! 155: ** using the ATTACH command.
! 156: */
! 157: Index *sqliteFindIndex(sqlite *db, const char *zName, const char *zDb){
! 158: Index *p = 0;
! 159: int i;
! 160: for(i=0; i<db->nDb; i++){
! 161: int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */
! 162: if( zDb && sqliteStrICmp(zDb, db->aDb[j].zName) ) continue;
! 163: p = sqliteHashFind(&db->aDb[j].idxHash, zName, strlen(zName)+1);
! 164: if( p ) break;
! 165: }
! 166: return p;
! 167: }
! 168:
! 169: /*
! 170: ** Remove the given index from the index hash table, and free
! 171: ** its memory structures.
! 172: **
! 173: ** The index is removed from the database hash tables but
! 174: ** it is not unlinked from the Table that it indexes.
! 175: ** Unlinking from the Table must be done by the calling function.
! 176: */
! 177: static void sqliteDeleteIndex(sqlite *db, Index *p){
! 178: Index *pOld;
! 179:
! 180: assert( db!=0 && p->zName!=0 );
! 181: pOld = sqliteHashInsert(&db->aDb[p->iDb].idxHash, p->zName,
! 182: strlen(p->zName)+1, 0);
! 183: if( pOld!=0 && pOld!=p ){
! 184: sqliteHashInsert(&db->aDb[p->iDb].idxHash, pOld->zName,
! 185: strlen(pOld->zName)+1, pOld);
! 186: }
! 187: sqliteFree(p);
! 188: }
! 189:
! 190: /*
! 191: ** Unlink the given index from its table, then remove
! 192: ** the index from the index hash table and free its memory
! 193: ** structures.
! 194: */
! 195: void sqliteUnlinkAndDeleteIndex(sqlite *db, Index *pIndex){
! 196: if( pIndex->pTable->pIndex==pIndex ){
! 197: pIndex->pTable->pIndex = pIndex->pNext;
! 198: }else{
! 199: Index *p;
! 200: for(p=pIndex->pTable->pIndex; p && p->pNext!=pIndex; p=p->pNext){}
! 201: if( p && p->pNext==pIndex ){
! 202: p->pNext = pIndex->pNext;
! 203: }
! 204: }
! 205: sqliteDeleteIndex(db, pIndex);
! 206: }
! 207:
! 208: /*
! 209: ** Erase all schema information from the in-memory hash tables of
! 210: ** database connection. This routine is called to reclaim memory
! 211: ** before the connection closes. It is also called during a rollback
! 212: ** if there were schema changes during the transaction.
! 213: **
! 214: ** If iDb<=0 then reset the internal schema tables for all database
! 215: ** files. If iDb>=2 then reset the internal schema for only the
! 216: ** single file indicated.
! 217: */
! 218: void sqliteResetInternalSchema(sqlite *db, int iDb){
! 219: HashElem *pElem;
! 220: Hash temp1;
! 221: Hash temp2;
! 222: int i, j;
! 223:
! 224: assert( iDb>=0 && iDb<db->nDb );
! 225: db->flags &= ~SQLITE_Initialized;
! 226: for(i=iDb; i<db->nDb; i++){
! 227: Db *pDb = &db->aDb[i];
! 228: temp1 = pDb->tblHash;
! 229: temp2 = pDb->trigHash;
! 230: sqliteHashInit(&pDb->trigHash, SQLITE_HASH_STRING, 0);
! 231: sqliteHashClear(&pDb->aFKey);
! 232: sqliteHashClear(&pDb->idxHash);
! 233: for(pElem=sqliteHashFirst(&temp2); pElem; pElem=sqliteHashNext(pElem)){
! 234: Trigger *pTrigger = sqliteHashData(pElem);
! 235: sqliteDeleteTrigger(pTrigger);
! 236: }
! 237: sqliteHashClear(&temp2);
! 238: sqliteHashInit(&pDb->tblHash, SQLITE_HASH_STRING, 0);
! 239: for(pElem=sqliteHashFirst(&temp1); pElem; pElem=sqliteHashNext(pElem)){
! 240: Table *pTab = sqliteHashData(pElem);
! 241: sqliteDeleteTable(db, pTab);
! 242: }
! 243: sqliteHashClear(&temp1);
! 244: DbClearProperty(db, i, DB_SchemaLoaded);
! 245: if( iDb>0 ) return;
! 246: }
! 247: assert( iDb==0 );
! 248: db->flags &= ~SQLITE_InternChanges;
! 249:
! 250: /* If one or more of the auxiliary database files has been closed,
! 251: ** then remove then from the auxiliary database list. We take the
! 252: ** opportunity to do this here since we have just deleted all of the
! 253: ** schema hash tables and therefore do not have to make any changes
! 254: ** to any of those tables.
! 255: */
! 256: for(i=0; i<db->nDb; i++){
! 257: struct Db *pDb = &db->aDb[i];
! 258: if( pDb->pBt==0 ){
! 259: if( pDb->pAux && pDb->xFreeAux ) pDb->xFreeAux(pDb->pAux);
! 260: pDb->pAux = 0;
! 261: }
! 262: }
! 263: for(i=j=2; i<db->nDb; i++){
! 264: struct Db *pDb = &db->aDb[i];
! 265: if( pDb->pBt==0 ){
! 266: sqliteFree(pDb->zName);
! 267: pDb->zName = 0;
! 268: continue;
! 269: }
! 270: if( j<i ){
! 271: db->aDb[j] = db->aDb[i];
! 272: }
! 273: j++;
! 274: }
! 275: memset(&db->aDb[j], 0, (db->nDb-j)*sizeof(db->aDb[j]));
! 276: db->nDb = j;
! 277: if( db->nDb<=2 && db->aDb!=db->aDbStatic ){
! 278: memcpy(db->aDbStatic, db->aDb, 2*sizeof(db->aDb[0]));
! 279: sqliteFree(db->aDb);
! 280: db->aDb = db->aDbStatic;
! 281: }
! 282: }
! 283:
! 284: /*
! 285: ** This routine is called whenever a rollback occurs. If there were
! 286: ** schema changes during the transaction, then we have to reset the
! 287: ** internal hash tables and reload them from disk.
! 288: */
! 289: void sqliteRollbackInternalChanges(sqlite *db){
! 290: if( db->flags & SQLITE_InternChanges ){
! 291: sqliteResetInternalSchema(db, 0);
! 292: }
! 293: }
! 294:
! 295: /*
! 296: ** This routine is called when a commit occurs.
! 297: */
! 298: void sqliteCommitInternalChanges(sqlite *db){
! 299: db->aDb[0].schema_cookie = db->next_cookie;
! 300: db->flags &= ~SQLITE_InternChanges;
! 301: }
! 302:
! 303: /*
! 304: ** Remove the memory data structures associated with the given
! 305: ** Table. No changes are made to disk by this routine.
! 306: **
! 307: ** This routine just deletes the data structure. It does not unlink
! 308: ** the table data structure from the hash table. Nor does it remove
! 309: ** foreign keys from the sqlite.aFKey hash table. But it does destroy
! 310: ** memory structures of the indices and foreign keys associated with
! 311: ** the table.
! 312: **
! 313: ** Indices associated with the table are unlinked from the "db"
! 314: ** data structure if db!=NULL. If db==NULL, indices attached to
! 315: ** the table are deleted, but it is assumed they have already been
! 316: ** unlinked.
! 317: */
! 318: void sqliteDeleteTable(sqlite *db, Table *pTable){
! 319: int i;
! 320: Index *pIndex, *pNext;
! 321: FKey *pFKey, *pNextFKey;
! 322:
! 323: if( pTable==0 ) return;
! 324:
! 325: /* Delete all indices associated with this table
! 326: */
! 327: for(pIndex = pTable->pIndex; pIndex; pIndex=pNext){
! 328: pNext = pIndex->pNext;
! 329: assert( pIndex->iDb==pTable->iDb || (pTable->iDb==0 && pIndex->iDb==1) );
! 330: sqliteDeleteIndex(db, pIndex);
! 331: }
! 332:
! 333: /* Delete all foreign keys associated with this table. The keys
! 334: ** should have already been unlinked from the db->aFKey hash table
! 335: */
! 336: for(pFKey=pTable->pFKey; pFKey; pFKey=pNextFKey){
! 337: pNextFKey = pFKey->pNextFrom;
! 338: assert( pTable->iDb<db->nDb );
! 339: assert( sqliteHashFind(&db->aDb[pTable->iDb].aFKey,
! 340: pFKey->zTo, strlen(pFKey->zTo)+1)!=pFKey );
! 341: sqliteFree(pFKey);
! 342: }
! 343:
! 344: /* Delete the Table structure itself.
! 345: */
! 346: for(i=0; i<pTable->nCol; i++){
! 347: sqliteFree(pTable->aCol[i].zName);
! 348: sqliteFree(pTable->aCol[i].zDflt);
! 349: sqliteFree(pTable->aCol[i].zType);
! 350: }
! 351: sqliteFree(pTable->zName);
! 352: sqliteFree(pTable->aCol);
! 353: sqliteSelectDelete(pTable->pSelect);
! 354: sqliteFree(pTable);
! 355: }
! 356:
! 357: /*
! 358: ** Unlink the given table from the hash tables and the delete the
! 359: ** table structure with all its indices and foreign keys.
! 360: */
! 361: static void sqliteUnlinkAndDeleteTable(sqlite *db, Table *p){
! 362: Table *pOld;
! 363: FKey *pF1, *pF2;
! 364: int i = p->iDb;
! 365: assert( db!=0 );
! 366: pOld = sqliteHashInsert(&db->aDb[i].tblHash, p->zName, strlen(p->zName)+1, 0);
! 367: assert( pOld==0 || pOld==p );
! 368: for(pF1=p->pFKey; pF1; pF1=pF1->pNextFrom){
! 369: int nTo = strlen(pF1->zTo) + 1;
! 370: pF2 = sqliteHashFind(&db->aDb[i].aFKey, pF1->zTo, nTo);
! 371: if( pF2==pF1 ){
! 372: sqliteHashInsert(&db->aDb[i].aFKey, pF1->zTo, nTo, pF1->pNextTo);
! 373: }else{
! 374: while( pF2 && pF2->pNextTo!=pF1 ){ pF2=pF2->pNextTo; }
! 375: if( pF2 ){
! 376: pF2->pNextTo = pF1->pNextTo;
! 377: }
! 378: }
! 379: }
! 380: sqliteDeleteTable(db, p);
! 381: }
! 382:
! 383: /*
! 384: ** Construct the name of a user table or index from a token.
! 385: **
! 386: ** Space to hold the name is obtained from sqliteMalloc() and must
! 387: ** be freed by the calling function.
! 388: */
! 389: char *sqliteTableNameFromToken(Token *pName){
! 390: char *zName = sqliteStrNDup(pName->z, pName->n);
! 391: sqliteDequote(zName);
! 392: return zName;
! 393: }
! 394:
! 395: /*
! 396: ** Generate code to open the appropriate master table. The table
! 397: ** opened will be SQLITE_MASTER for persistent tables and
! 398: ** SQLITE_TEMP_MASTER for temporary tables. The table is opened
! 399: ** on cursor 0.
! 400: */
! 401: void sqliteOpenMasterTable(Vdbe *v, int isTemp){
! 402: sqliteVdbeAddOp(v, OP_Integer, isTemp, 0);
! 403: sqliteVdbeAddOp(v, OP_OpenWrite, 0, 2);
! 404: }
! 405:
! 406: /*
! 407: ** Begin constructing a new table representation in memory. This is
! 408: ** the first of several action routines that get called in response
! 409: ** to a CREATE TABLE statement. In particular, this routine is called
! 410: ** after seeing tokens "CREATE" and "TABLE" and the table name. The
! 411: ** pStart token is the CREATE and pName is the table name. The isTemp
! 412: ** flag is true if the table should be stored in the auxiliary database
! 413: ** file instead of in the main database file. This is normally the case
! 414: ** when the "TEMP" or "TEMPORARY" keyword occurs in between
! 415: ** CREATE and TABLE.
! 416: **
! 417: ** The new table record is initialized and put in pParse->pNewTable.
! 418: ** As more of the CREATE TABLE statement is parsed, additional action
! 419: ** routines will be called to add more information to this record.
! 420: ** At the end of the CREATE TABLE statement, the sqliteEndTable() routine
! 421: ** is called to complete the construction of the new table record.
! 422: */
! 423: void sqliteStartTable(
! 424: Parse *pParse, /* Parser context */
! 425: Token *pStart, /* The "CREATE" token */
! 426: Token *pName, /* Name of table or view to create */
! 427: int isTemp, /* True if this is a TEMP table */
! 428: int isView /* True if this is a VIEW */
! 429: ){
! 430: Table *pTable;
! 431: Index *pIdx;
! 432: char *zName;
! 433: sqlite *db = pParse->db;
! 434: Vdbe *v;
! 435: int iDb;
! 436:
! 437: pParse->sFirstToken = *pStart;
! 438: zName = sqliteTableNameFromToken(pName);
! 439: if( zName==0 ) return;
! 440: if( db->init.iDb==1 ) isTemp = 1;
! 441: #ifndef SQLITE_OMIT_AUTHORIZATION
! 442: assert( (isTemp & 1)==isTemp );
! 443: {
! 444: int code;
! 445: char *zDb = isTemp ? "temp" : "main";
! 446: if( sqliteAuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(isTemp), 0, zDb) ){
! 447: sqliteFree(zName);
! 448: return;
! 449: }
! 450: if( isView ){
! 451: if( isTemp ){
! 452: code = SQLITE_CREATE_TEMP_VIEW;
! 453: }else{
! 454: code = SQLITE_CREATE_VIEW;
! 455: }
! 456: }else{
! 457: if( isTemp ){
! 458: code = SQLITE_CREATE_TEMP_TABLE;
! 459: }else{
! 460: code = SQLITE_CREATE_TABLE;
! 461: }
! 462: }
! 463: if( sqliteAuthCheck(pParse, code, zName, 0, zDb) ){
! 464: sqliteFree(zName);
! 465: return;
! 466: }
! 467: }
! 468: #endif
! 469:
! 470:
! 471: /* Before trying to create a temporary table, make sure the Btree for
! 472: ** holding temporary tables is open.
! 473: */
! 474: if( isTemp && db->aDb[1].pBt==0 && !pParse->explain ){
! 475: int rc = sqliteBtreeFactory(db, 0, 0, MAX_PAGES, &db->aDb[1].pBt);
! 476: if( rc!=SQLITE_OK ){
! 477: sqliteErrorMsg(pParse, "unable to open a temporary database "
! 478: "file for storing temporary tables");
! 479: pParse->nErr++;
! 480: return;
! 481: }
! 482: if( db->flags & SQLITE_InTrans ){
! 483: rc = sqliteBtreeBeginTrans(db->aDb[1].pBt);
! 484: if( rc!=SQLITE_OK ){
! 485: sqliteErrorMsg(pParse, "unable to get a write lock on "
! 486: "the temporary database file");
! 487: return;
! 488: }
! 489: }
! 490: }
! 491:
! 492: /* Make sure the new table name does not collide with an existing
! 493: ** index or table name. Issue an error message if it does.
! 494: **
! 495: ** If we are re-reading the sqlite_master table because of a schema
! 496: ** change and a new permanent table is found whose name collides with
! 497: ** an existing temporary table, that is not an error.
! 498: */
! 499: pTable = sqliteFindTable(db, zName, 0);
! 500: iDb = isTemp ? 1 : db->init.iDb;
! 501: if( pTable!=0 && (pTable->iDb==iDb || !db->init.busy) ){
! 502: sqliteErrorMsg(pParse, "table %T already exists", pName);
! 503: sqliteFree(zName);
! 504: return;
! 505: }
! 506: if( (pIdx = sqliteFindIndex(db, zName, 0))!=0 &&
! 507: (pIdx->iDb==0 || !db->init.busy) ){
! 508: sqliteErrorMsg(pParse, "there is already an index named %s", zName);
! 509: sqliteFree(zName);
! 510: return;
! 511: }
! 512: pTable = sqliteMalloc( sizeof(Table) );
! 513: if( pTable==0 ){
! 514: sqliteFree(zName);
! 515: return;
! 516: }
! 517: pTable->zName = zName;
! 518: pTable->nCol = 0;
! 519: pTable->aCol = 0;
! 520: pTable->iPKey = -1;
! 521: pTable->pIndex = 0;
! 522: pTable->iDb = iDb;
! 523: if( pParse->pNewTable ) sqliteDeleteTable(db, pParse->pNewTable);
! 524: pParse->pNewTable = pTable;
! 525:
! 526: /* Begin generating the code that will insert the table record into
! 527: ** the SQLITE_MASTER table. Note in particular that we must go ahead
! 528: ** and allocate the record number for the table entry now. Before any
! 529: ** PRIMARY KEY or UNIQUE keywords are parsed. Those keywords will cause
! 530: ** indices to be created and the table record must come before the
! 531: ** indices. Hence, the record number for the table must be allocated
! 532: ** now.
! 533: */
! 534: if( !db->init.busy && (v = sqliteGetVdbe(pParse))!=0 ){
! 535: sqliteBeginWriteOperation(pParse, 0, isTemp);
! 536: if( !isTemp ){
! 537: sqliteVdbeAddOp(v, OP_Integer, db->file_format, 0);
! 538: sqliteVdbeAddOp(v, OP_SetCookie, 0, 1);
! 539: }
! 540: sqliteOpenMasterTable(v, isTemp);
! 541: sqliteVdbeAddOp(v, OP_NewRecno, 0, 0);
! 542: sqliteVdbeAddOp(v, OP_Dup, 0, 0);
! 543: sqliteVdbeAddOp(v, OP_String, 0, 0);
! 544: sqliteVdbeAddOp(v, OP_PutIntKey, 0, 0);
! 545: }
! 546: }
! 547:
! 548: /*
! 549: ** Add a new column to the table currently being constructed.
! 550: **
! 551: ** The parser calls this routine once for each column declaration
! 552: ** in a CREATE TABLE statement. sqliteStartTable() gets called
! 553: ** first to get things going. Then this routine is called for each
! 554: ** column.
! 555: */
! 556: void sqliteAddColumn(Parse *pParse, Token *pName){
! 557: Table *p;
! 558: int i;
! 559: char *z = 0;
! 560: Column *pCol;
! 561: if( (p = pParse->pNewTable)==0 ) return;
! 562: sqliteSetNString(&z, pName->z, pName->n, 0);
! 563: if( z==0 ) return;
! 564: sqliteDequote(z);
! 565: for(i=0; i<p->nCol; i++){
! 566: if( sqliteStrICmp(z, p->aCol[i].zName)==0 ){
! 567: sqliteErrorMsg(pParse, "duplicate column name: %s", z);
! 568: sqliteFree(z);
! 569: return;
! 570: }
! 571: }
! 572: if( (p->nCol & 0x7)==0 ){
! 573: Column *aNew;
! 574: aNew = sqliteRealloc( p->aCol, (p->nCol+8)*sizeof(p->aCol[0]));
! 575: if( aNew==0 ) return;
! 576: p->aCol = aNew;
! 577: }
! 578: pCol = &p->aCol[p->nCol];
! 579: memset(pCol, 0, sizeof(p->aCol[0]));
! 580: pCol->zName = z;
! 581: pCol->sortOrder = SQLITE_SO_NUM;
! 582: p->nCol++;
! 583: }
! 584:
! 585: /*
! 586: ** This routine is called by the parser while in the middle of
! 587: ** parsing a CREATE TABLE statement. A "NOT NULL" constraint has
! 588: ** been seen on a column. This routine sets the notNull flag on
! 589: ** the column currently under construction.
! 590: */
! 591: void sqliteAddNotNull(Parse *pParse, int onError){
! 592: Table *p;
! 593: int i;
! 594: if( (p = pParse->pNewTable)==0 ) return;
! 595: i = p->nCol-1;
! 596: if( i>=0 ) p->aCol[i].notNull = onError;
! 597: }
! 598:
! 599: /*
! 600: ** This routine is called by the parser while in the middle of
! 601: ** parsing a CREATE TABLE statement. The pFirst token is the first
! 602: ** token in the sequence of tokens that describe the type of the
! 603: ** column currently under construction. pLast is the last token
! 604: ** in the sequence. Use this information to construct a string
! 605: ** that contains the typename of the column and store that string
! 606: ** in zType.
! 607: */
! 608: void sqliteAddColumnType(Parse *pParse, Token *pFirst, Token *pLast){
! 609: Table *p;
! 610: int i, j;
! 611: int n;
! 612: char *z, **pz;
! 613: Column *pCol;
! 614: if( (p = pParse->pNewTable)==0 ) return;
! 615: i = p->nCol-1;
! 616: if( i<0 ) return;
! 617: pCol = &p->aCol[i];
! 618: pz = &pCol->zType;
! 619: n = pLast->n + Addr(pLast->z) - Addr(pFirst->z);
! 620: sqliteSetNString(pz, pFirst->z, n, 0);
! 621: z = *pz;
! 622: if( z==0 ) return;
! 623: for(i=j=0; z[i]; i++){
! 624: int c = z[i];
! 625: if( isspace(c) ) continue;
! 626: z[j++] = c;
! 627: }
! 628: z[j] = 0;
! 629: if( pParse->db->file_format>=4 ){
! 630: pCol->sortOrder = sqliteCollateType(z, n);
! 631: }else{
! 632: pCol->sortOrder = SQLITE_SO_NUM;
! 633: }
! 634: }
! 635:
! 636: /*
! 637: ** The given token is the default value for the last column added to
! 638: ** the table currently under construction. If "minusFlag" is true, it
! 639: ** means the value token was preceded by a minus sign.
! 640: **
! 641: ** This routine is called by the parser while in the middle of
! 642: ** parsing a CREATE TABLE statement.
! 643: */
! 644: void sqliteAddDefaultValue(Parse *pParse, Token *pVal, int minusFlag){
! 645: Table *p;
! 646: int i;
! 647: char **pz;
! 648: if( (p = pParse->pNewTable)==0 ) return;
! 649: i = p->nCol-1;
! 650: if( i<0 ) return;
! 651: pz = &p->aCol[i].zDflt;
! 652: if( minusFlag ){
! 653: sqliteSetNString(pz, "-", 1, pVal->z, pVal->n, 0);
! 654: }else{
! 655: sqliteSetNString(pz, pVal->z, pVal->n, 0);
! 656: }
! 657: sqliteDequote(*pz);
! 658: }
! 659:
! 660: /*
! 661: ** Designate the PRIMARY KEY for the table. pList is a list of names
! 662: ** of columns that form the primary key. If pList is NULL, then the
! 663: ** most recently added column of the table is the primary key.
! 664: **
! 665: ** A table can have at most one primary key. If the table already has
! 666: ** a primary key (and this is the second primary key) then create an
! 667: ** error.
! 668: **
! 669: ** If the PRIMARY KEY is on a single column whose datatype is INTEGER,
! 670: ** then we will try to use that column as the row id. (Exception:
! 671: ** For backwards compatibility with older databases, do not do this
! 672: ** if the file format version number is less than 1.) Set the Table.iPKey
! 673: ** field of the table under construction to be the index of the
! 674: ** INTEGER PRIMARY KEY column. Table.iPKey is set to -1 if there is
! 675: ** no INTEGER PRIMARY KEY.
! 676: **
! 677: ** If the key is not an INTEGER PRIMARY KEY, then create a unique
! 678: ** index for the key. No index is created for INTEGER PRIMARY KEYs.
! 679: */
! 680: void sqliteAddPrimaryKey(Parse *pParse, IdList *pList, int onError){
! 681: Table *pTab = pParse->pNewTable;
! 682: char *zType = 0;
! 683: int iCol = -1, i;
! 684: if( pTab==0 ) goto primary_key_exit;
! 685: if( pTab->hasPrimKey ){
! 686: sqliteErrorMsg(pParse,
! 687: "table \"%s\" has more than one primary key", pTab->zName);
! 688: goto primary_key_exit;
! 689: }
! 690: pTab->hasPrimKey = 1;
! 691: if( pList==0 ){
! 692: iCol = pTab->nCol - 1;
! 693: pTab->aCol[iCol].isPrimKey = 1;
! 694: }else{
! 695: for(i=0; i<pList->nId; i++){
! 696: for(iCol=0; iCol<pTab->nCol; iCol++){
! 697: if( sqliteStrICmp(pList->a[i].zName, pTab->aCol[iCol].zName)==0 ) break;
! 698: }
! 699: if( iCol<pTab->nCol ) pTab->aCol[iCol].isPrimKey = 1;
! 700: }
! 701: if( pList->nId>1 ) iCol = -1;
! 702: }
! 703: if( iCol>=0 && iCol<pTab->nCol ){
! 704: zType = pTab->aCol[iCol].zType;
! 705: }
! 706: if( pParse->db->file_format>=1 &&
! 707: zType && sqliteStrICmp(zType, "INTEGER")==0 ){
! 708: pTab->iPKey = iCol;
! 709: pTab->keyConf = onError;
! 710: }else{
! 711: sqliteCreateIndex(pParse, 0, 0, pList, onError, 0, 0);
! 712: pList = 0;
! 713: }
! 714:
! 715: primary_key_exit:
! 716: sqliteIdListDelete(pList);
! 717: return;
! 718: }
! 719:
! 720: /*
! 721: ** Return the appropriate collating type given a type name.
! 722: **
! 723: ** The collation type is text (SQLITE_SO_TEXT) if the type
! 724: ** name contains the character stream "text" or "blob" or
! 725: ** "clob". Any other type name is collated as numeric
! 726: ** (SQLITE_SO_NUM).
! 727: */
! 728: int sqliteCollateType(const char *zType, int nType){
! 729: int i;
! 730: for(i=0; i<nType-3; i++){
! 731: int c = *(zType++) | 0x60;
! 732: if( (c=='b' || c=='c') && sqliteStrNICmp(zType, "lob", 3)==0 ){
! 733: return SQLITE_SO_TEXT;
! 734: }
! 735: if( c=='c' && sqliteStrNICmp(zType, "har", 3)==0 ){
! 736: return SQLITE_SO_TEXT;
! 737: }
! 738: if( c=='t' && sqliteStrNICmp(zType, "ext", 3)==0 ){
! 739: return SQLITE_SO_TEXT;
! 740: }
! 741: }
! 742: return SQLITE_SO_NUM;
! 743: }
! 744:
! 745: /*
! 746: ** This routine is called by the parser while in the middle of
! 747: ** parsing a CREATE TABLE statement. A "COLLATE" clause has
! 748: ** been seen on a column. This routine sets the Column.sortOrder on
! 749: ** the column currently under construction.
! 750: */
! 751: void sqliteAddCollateType(Parse *pParse, int collType){
! 752: Table *p;
! 753: int i;
! 754: if( (p = pParse->pNewTable)==0 ) return;
! 755: i = p->nCol-1;
! 756: if( i>=0 ) p->aCol[i].sortOrder = collType;
! 757: }
! 758:
! 759: /*
! 760: ** Come up with a new random value for the schema cookie. Make sure
! 761: ** the new value is different from the old.
! 762: **
! 763: ** The schema cookie is used to determine when the schema for the
! 764: ** database changes. After each schema change, the cookie value
! 765: ** changes. When a process first reads the schema it records the
! 766: ** cookie. Thereafter, whenever it goes to access the database,
! 767: ** it checks the cookie to make sure the schema has not changed
! 768: ** since it was last read.
! 769: **
! 770: ** This plan is not completely bullet-proof. It is possible for
! 771: ** the schema to change multiple times and for the cookie to be
! 772: ** set back to prior value. But schema changes are infrequent
! 773: ** and the probability of hitting the same cookie value is only
! 774: ** 1 chance in 2^32. So we're safe enough.
! 775: */
! 776: void sqliteChangeCookie(sqlite *db, Vdbe *v){
! 777: if( db->next_cookie==db->aDb[0].schema_cookie ){
! 778: unsigned char r;
! 779: sqliteRandomness(1, &r);
! 780: db->next_cookie = db->aDb[0].schema_cookie + r + 1;
! 781: db->flags |= SQLITE_InternChanges;
! 782: sqliteVdbeAddOp(v, OP_Integer, db->next_cookie, 0);
! 783: sqliteVdbeAddOp(v, OP_SetCookie, 0, 0);
! 784: }
! 785: }
! 786:
! 787: /*
! 788: ** Measure the number of characters needed to output the given
! 789: ** identifier. The number returned includes any quotes used
! 790: ** but does not include the null terminator.
! 791: */
! 792: static int identLength(const char *z){
! 793: int n;
! 794: int needQuote = 0;
! 795: for(n=0; *z; n++, z++){
! 796: if( *z=='\'' ){ n++; needQuote=1; }
! 797: }
! 798: return n + needQuote*2;
! 799: }
! 800:
! 801: /*
! 802: ** Write an identifier onto the end of the given string. Add
! 803: ** quote characters as needed.
! 804: */
! 805: static void identPut(char *z, int *pIdx, char *zIdent){
! 806: int i, j, needQuote;
! 807: i = *pIdx;
! 808: for(j=0; zIdent[j]; j++){
! 809: if( !isalnum(zIdent[j]) && zIdent[j]!='_' ) break;
! 810: }
! 811: needQuote = zIdent[j]!=0 || isdigit(zIdent[0])
! 812: || sqliteKeywordCode(zIdent, j)!=TK_ID;
! 813: if( needQuote ) z[i++] = '\'';
! 814: for(j=0; zIdent[j]; j++){
! 815: z[i++] = zIdent[j];
! 816: if( zIdent[j]=='\'' ) z[i++] = '\'';
! 817: }
! 818: if( needQuote ) z[i++] = '\'';
! 819: z[i] = 0;
! 820: *pIdx = i;
! 821: }
! 822:
! 823: /*
! 824: ** Generate a CREATE TABLE statement appropriate for the given
! 825: ** table. Memory to hold the text of the statement is obtained
! 826: ** from sqliteMalloc() and must be freed by the calling function.
! 827: */
! 828: static char *createTableStmt(Table *p){
! 829: int i, k, n;
! 830: char *zStmt;
! 831: char *zSep, *zSep2, *zEnd;
! 832: n = 0;
! 833: for(i=0; i<p->nCol; i++){
! 834: n += identLength(p->aCol[i].zName);
! 835: }
! 836: n += identLength(p->zName);
! 837: if( n<40 ){
! 838: zSep = "";
! 839: zSep2 = ",";
! 840: zEnd = ")";
! 841: }else{
! 842: zSep = "\n ";
! 843: zSep2 = ",\n ";
! 844: zEnd = "\n)";
! 845: }
! 846: n += 35 + 6*p->nCol;
! 847: zStmt = sqliteMallocRaw( n );
! 848: if( zStmt==0 ) return 0;
! 849: strcpy(zStmt, p->iDb==1 ? "CREATE TEMP TABLE " : "CREATE TABLE ");
! 850: k = strlen(zStmt);
! 851: identPut(zStmt, &k, p->zName);
! 852: zStmt[k++] = '(';
! 853: for(i=0; i<p->nCol; i++){
! 854: strcpy(&zStmt[k], zSep);
! 855: k += strlen(&zStmt[k]);
! 856: zSep = zSep2;
! 857: identPut(zStmt, &k, p->aCol[i].zName);
! 858: }
! 859: strcpy(&zStmt[k], zEnd);
! 860: return zStmt;
! 861: }
! 862:
! 863: /*
! 864: ** This routine is called to report the final ")" that terminates
! 865: ** a CREATE TABLE statement.
! 866: **
! 867: ** The table structure that other action routines have been building
! 868: ** is added to the internal hash tables, assuming no errors have
! 869: ** occurred.
! 870: **
! 871: ** An entry for the table is made in the master table on disk, unless
! 872: ** this is a temporary table or db->init.busy==1. When db->init.busy==1
! 873: ** it means we are reading the sqlite_master table because we just
! 874: ** connected to the database or because the sqlite_master table has
! 875: ** recently changes, so the entry for this table already exists in
! 876: ** the sqlite_master table. We do not want to create it again.
! 877: **
! 878: ** If the pSelect argument is not NULL, it means that this routine
! 879: ** was called to create a table generated from a
! 880: ** "CREATE TABLE ... AS SELECT ..." statement. The column names of
! 881: ** the new table will match the result set of the SELECT.
! 882: */
! 883: void sqliteEndTable(Parse *pParse, Token *pEnd, Select *pSelect){
! 884: Table *p;
! 885: sqlite *db = pParse->db;
! 886:
! 887: if( (pEnd==0 && pSelect==0) || pParse->nErr || sqlite_malloc_failed ) return;
! 888: p = pParse->pNewTable;
! 889: if( p==0 ) return;
! 890:
! 891: /* If the table is generated from a SELECT, then construct the
! 892: ** list of columns and the text of the table.
! 893: */
! 894: if( pSelect ){
! 895: Table *pSelTab = sqliteResultSetOfSelect(pParse, 0, pSelect);
! 896: if( pSelTab==0 ) return;
! 897: assert( p->aCol==0 );
! 898: p->nCol = pSelTab->nCol;
! 899: p->aCol = pSelTab->aCol;
! 900: pSelTab->nCol = 0;
! 901: pSelTab->aCol = 0;
! 902: sqliteDeleteTable(0, pSelTab);
! 903: }
! 904:
! 905: /* If the db->init.busy is 1 it means we are reading the SQL off the
! 906: ** "sqlite_master" or "sqlite_temp_master" table on the disk.
! 907: ** So do not write to the disk again. Extract the root page number
! 908: ** for the table from the db->init.newTnum field. (The page number
! 909: ** should have been put there by the sqliteOpenCb routine.)
! 910: */
! 911: if( db->init.busy ){
! 912: p->tnum = db->init.newTnum;
! 913: }
! 914:
! 915: /* If not initializing, then create a record for the new table
! 916: ** in the SQLITE_MASTER table of the database. The record number
! 917: ** for the new table entry should already be on the stack.
! 918: **
! 919: ** If this is a TEMPORARY table, write the entry into the auxiliary
! 920: ** file instead of into the main database file.
! 921: */
! 922: if( !db->init.busy ){
! 923: int n;
! 924: Vdbe *v;
! 925:
! 926: v = sqliteGetVdbe(pParse);
! 927: if( v==0 ) return;
! 928: if( p->pSelect==0 ){
! 929: /* A regular table */
! 930: sqliteVdbeOp3(v, OP_CreateTable, 0, p->iDb, (char*)&p->tnum, P3_POINTER);
! 931: }else{
! 932: /* A view */
! 933: sqliteVdbeAddOp(v, OP_Integer, 0, 0);
! 934: }
! 935: p->tnum = 0;
! 936: sqliteVdbeAddOp(v, OP_Pull, 1, 0);
! 937: sqliteVdbeOp3(v, OP_String, 0, 0, p->pSelect==0?"table":"view", P3_STATIC);
! 938: sqliteVdbeOp3(v, OP_String, 0, 0, p->zName, 0);
! 939: sqliteVdbeOp3(v, OP_String, 0, 0, p->zName, 0);
! 940: sqliteVdbeAddOp(v, OP_Dup, 4, 0);
! 941: sqliteVdbeAddOp(v, OP_String, 0, 0);
! 942: if( pSelect ){
! 943: char *z = createTableStmt(p);
! 944: n = z ? strlen(z) : 0;
! 945: sqliteVdbeChangeP3(v, -1, z, n);
! 946: sqliteFree(z);
! 947: }else{
! 948: assert( pEnd!=0 );
! 949: n = Addr(pEnd->z) - Addr(pParse->sFirstToken.z) + 1;
! 950: sqliteVdbeChangeP3(v, -1, pParse->sFirstToken.z, n);
! 951: }
! 952: sqliteVdbeAddOp(v, OP_MakeRecord, 5, 0);
! 953: sqliteVdbeAddOp(v, OP_PutIntKey, 0, 0);
! 954: if( !p->iDb ){
! 955: sqliteChangeCookie(db, v);
! 956: }
! 957: sqliteVdbeAddOp(v, OP_Close, 0, 0);
! 958: if( pSelect ){
! 959: sqliteVdbeAddOp(v, OP_Integer, p->iDb, 0);
! 960: sqliteVdbeAddOp(v, OP_OpenWrite, 1, 0);
! 961: pParse->nTab = 2;
! 962: sqliteSelect(pParse, pSelect, SRT_Table, 1, 0, 0, 0);
! 963: }
! 964: sqliteEndWriteOperation(pParse);
! 965: }
! 966:
! 967: /* Add the table to the in-memory representation of the database.
! 968: */
! 969: if( pParse->explain==0 && pParse->nErr==0 ){
! 970: Table *pOld;
! 971: FKey *pFKey;
! 972: pOld = sqliteHashInsert(&db->aDb[p->iDb].tblHash,
! 973: p->zName, strlen(p->zName)+1, p);
! 974: if( pOld ){
! 975: assert( p==pOld ); /* Malloc must have failed inside HashInsert() */
! 976: return;
! 977: }
! 978: for(pFKey=p->pFKey; pFKey; pFKey=pFKey->pNextFrom){
! 979: int nTo = strlen(pFKey->zTo) + 1;
! 980: pFKey->pNextTo = sqliteHashFind(&db->aDb[p->iDb].aFKey, pFKey->zTo, nTo);
! 981: sqliteHashInsert(&db->aDb[p->iDb].aFKey, pFKey->zTo, nTo, pFKey);
! 982: }
! 983: pParse->pNewTable = 0;
! 984: db->nTable++;
! 985: db->flags |= SQLITE_InternChanges;
! 986: }
! 987: }
! 988:
! 989: /*
! 990: ** The parser calls this routine in order to create a new VIEW
! 991: */
! 992: void sqliteCreateView(
! 993: Parse *pParse, /* The parsing context */
! 994: Token *pBegin, /* The CREATE token that begins the statement */
! 995: Token *pName, /* The token that holds the name of the view */
! 996: Select *pSelect, /* A SELECT statement that will become the new view */
! 997: int isTemp /* TRUE for a TEMPORARY view */
! 998: ){
! 999: Table *p;
! 1000: int n;
! 1001: const char *z;
! 1002: Token sEnd;
! 1003: DbFixer sFix;
! 1004:
! 1005: sqliteStartTable(pParse, pBegin, pName, isTemp, 1);
! 1006: p = pParse->pNewTable;
! 1007: if( p==0 || pParse->nErr ){
! 1008: sqliteSelectDelete(pSelect);
! 1009: return;
! 1010: }
! 1011: if( sqliteFixInit(&sFix, pParse, p->iDb, "view", pName)
! 1012: && sqliteFixSelect(&sFix, pSelect)
! 1013: ){
! 1014: sqliteSelectDelete(pSelect);
! 1015: return;
! 1016: }
! 1017:
! 1018: /* Make a copy of the entire SELECT statement that defines the view.
! 1019: ** This will force all the Expr.token.z values to be dynamically
! 1020: ** allocated rather than point to the input string - which means that
! 1021: ** they will persist after the current sqlite_exec() call returns.
! 1022: */
! 1023: p->pSelect = sqliteSelectDup(pSelect);
! 1024: sqliteSelectDelete(pSelect);
! 1025: if( !pParse->db->init.busy ){
! 1026: sqliteViewGetColumnNames(pParse, p);
! 1027: }
! 1028:
! 1029: /* Locate the end of the CREATE VIEW statement. Make sEnd point to
! 1030: ** the end.
! 1031: */
! 1032: sEnd = pParse->sLastToken;
! 1033: if( sEnd.z[0]!=0 && sEnd.z[0]!=';' ){
! 1034: sEnd.z += sEnd.n;
! 1035: }
! 1036: sEnd.n = 0;
! 1037: n = sEnd.z - pBegin->z;
! 1038: z = pBegin->z;
! 1039: while( n>0 && (z[n-1]==';' || isspace(z[n-1])) ){ n--; }
! 1040: sEnd.z = &z[n-1];
! 1041: sEnd.n = 1;
! 1042:
! 1043: /* Use sqliteEndTable() to add the view to the SQLITE_MASTER table */
! 1044: sqliteEndTable(pParse, &sEnd, 0);
! 1045: return;
! 1046: }
! 1047:
! 1048: /*
! 1049: ** The Table structure pTable is really a VIEW. Fill in the names of
! 1050: ** the columns of the view in the pTable structure. Return the number
! 1051: ** of errors. If an error is seen leave an error message in pParse->zErrMsg.
! 1052: */
! 1053: int sqliteViewGetColumnNames(Parse *pParse, Table *pTable){
! 1054: ExprList *pEList;
! 1055: Select *pSel;
! 1056: Table *pSelTab;
! 1057: int nErr = 0;
! 1058:
! 1059: assert( pTable );
! 1060:
! 1061: /* A positive nCol means the columns names for this view are
! 1062: ** already known.
! 1063: */
! 1064: if( pTable->nCol>0 ) return 0;
! 1065:
! 1066: /* A negative nCol is a special marker meaning that we are currently
! 1067: ** trying to compute the column names. If we enter this routine with
! 1068: ** a negative nCol, it means two or more views form a loop, like this:
! 1069: **
! 1070: ** CREATE VIEW one AS SELECT * FROM two;
! 1071: ** CREATE VIEW two AS SELECT * FROM one;
! 1072: **
! 1073: ** Actually, this error is caught previously and so the following test
! 1074: ** should always fail. But we will leave it in place just to be safe.
! 1075: */
! 1076: if( pTable->nCol<0 ){
! 1077: sqliteErrorMsg(pParse, "view %s is circularly defined", pTable->zName);
! 1078: return 1;
! 1079: }
! 1080:
! 1081: /* If we get this far, it means we need to compute the table names.
! 1082: */
! 1083: assert( pTable->pSelect ); /* If nCol==0, then pTable must be a VIEW */
! 1084: pSel = pTable->pSelect;
! 1085:
! 1086: /* Note that the call to sqliteResultSetOfSelect() will expand any
! 1087: ** "*" elements in this list. But we will need to restore the list
! 1088: ** back to its original configuration afterwards, so we save a copy of
! 1089: ** the original in pEList.
! 1090: */
! 1091: pEList = pSel->pEList;
! 1092: pSel->pEList = sqliteExprListDup(pEList);
! 1093: if( pSel->pEList==0 ){
! 1094: pSel->pEList = pEList;
! 1095: return 1; /* Malloc failed */
! 1096: }
! 1097: pTable->nCol = -1;
! 1098: pSelTab = sqliteResultSetOfSelect(pParse, 0, pSel);
! 1099: if( pSelTab ){
! 1100: assert( pTable->aCol==0 );
! 1101: pTable->nCol = pSelTab->nCol;
! 1102: pTable->aCol = pSelTab->aCol;
! 1103: pSelTab->nCol = 0;
! 1104: pSelTab->aCol = 0;
! 1105: sqliteDeleteTable(0, pSelTab);
! 1106: DbSetProperty(pParse->db, pTable->iDb, DB_UnresetViews);
! 1107: }else{
! 1108: pTable->nCol = 0;
! 1109: nErr++;
! 1110: }
! 1111: sqliteSelectUnbind(pSel);
! 1112: sqliteExprListDelete(pSel->pEList);
! 1113: pSel->pEList = pEList;
! 1114: return nErr;
! 1115: }
! 1116:
! 1117: /*
! 1118: ** Clear the column names from the VIEW pTable.
! 1119: **
! 1120: ** This routine is called whenever any other table or view is modified.
! 1121: ** The view passed into this routine might depend directly or indirectly
! 1122: ** on the modified or deleted table so we need to clear the old column
! 1123: ** names so that they will be recomputed.
! 1124: */
! 1125: static void sqliteViewResetColumnNames(Table *pTable){
! 1126: int i;
! 1127: Column *pCol;
! 1128: assert( pTable!=0 && pTable->pSelect!=0 );
! 1129: for(i=0, pCol=pTable->aCol; i<pTable->nCol; i++, pCol++){
! 1130: sqliteFree(pCol->zName);
! 1131: sqliteFree(pCol->zDflt);
! 1132: sqliteFree(pCol->zType);
! 1133: }
! 1134: sqliteFree(pTable->aCol);
! 1135: pTable->aCol = 0;
! 1136: pTable->nCol = 0;
! 1137: }
! 1138:
! 1139: /*
! 1140: ** Clear the column names from every VIEW in database idx.
! 1141: */
! 1142: static void sqliteViewResetAll(sqlite *db, int idx){
! 1143: HashElem *i;
! 1144: if( !DbHasProperty(db, idx, DB_UnresetViews) ) return;
! 1145: for(i=sqliteHashFirst(&db->aDb[idx].tblHash); i; i=sqliteHashNext(i)){
! 1146: Table *pTab = sqliteHashData(i);
! 1147: if( pTab->pSelect ){
! 1148: sqliteViewResetColumnNames(pTab);
! 1149: }
! 1150: }
! 1151: DbClearProperty(db, idx, DB_UnresetViews);
! 1152: }
! 1153:
! 1154: /*
! 1155: ** Given a token, look up a table with that name. If not found, leave
! 1156: ** an error for the parser to find and return NULL.
! 1157: */
! 1158: Table *sqliteTableFromToken(Parse *pParse, Token *pTok){
! 1159: char *zName;
! 1160: Table *pTab;
! 1161: zName = sqliteTableNameFromToken(pTok);
! 1162: if( zName==0 ) return 0;
! 1163: pTab = sqliteFindTable(pParse->db, zName, 0);
! 1164: sqliteFree(zName);
! 1165: if( pTab==0 ){
! 1166: sqliteErrorMsg(pParse, "no such table: %T", pTok);
! 1167: }
! 1168: return pTab;
! 1169: }
! 1170:
! 1171: /*
! 1172: ** This routine is called to do the work of a DROP TABLE statement.
! 1173: ** pName is the name of the table to be dropped.
! 1174: */
! 1175: void sqliteDropTable(Parse *pParse, Token *pName, int isView){
! 1176: Table *pTable;
! 1177: Vdbe *v;
! 1178: int base;
! 1179: sqlite *db = pParse->db;
! 1180: int iDb;
! 1181:
! 1182: if( pParse->nErr || sqlite_malloc_failed ) return;
! 1183: pTable = sqliteTableFromToken(pParse, pName);
! 1184: if( pTable==0 ) return;
! 1185: iDb = pTable->iDb;
! 1186: assert( iDb>=0 && iDb<db->nDb );
! 1187: #ifndef SQLITE_OMIT_AUTHORIZATION
! 1188: {
! 1189: int code;
! 1190: const char *zTab = SCHEMA_TABLE(pTable->iDb);
! 1191: const char *zDb = db->aDb[pTable->iDb].zName;
! 1192: if( sqliteAuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb)){
! 1193: return;
! 1194: }
! 1195: if( isView ){
! 1196: if( iDb==1 ){
! 1197: code = SQLITE_DROP_TEMP_VIEW;
! 1198: }else{
! 1199: code = SQLITE_DROP_VIEW;
! 1200: }
! 1201: }else{
! 1202: if( iDb==1 ){
! 1203: code = SQLITE_DROP_TEMP_TABLE;
! 1204: }else{
! 1205: code = SQLITE_DROP_TABLE;
! 1206: }
! 1207: }
! 1208: if( sqliteAuthCheck(pParse, code, pTable->zName, 0, zDb) ){
! 1209: return;
! 1210: }
! 1211: if( sqliteAuthCheck(pParse, SQLITE_DELETE, pTable->zName, 0, zDb) ){
! 1212: return;
! 1213: }
! 1214: }
! 1215: #endif
! 1216: if( pTable->readOnly ){
! 1217: sqliteErrorMsg(pParse, "table %s may not be dropped", pTable->zName);
! 1218: pParse->nErr++;
! 1219: return;
! 1220: }
! 1221: if( isView && pTable->pSelect==0 ){
! 1222: sqliteErrorMsg(pParse, "use DROP TABLE to delete table %s", pTable->zName);
! 1223: return;
! 1224: }
! 1225: if( !isView && pTable->pSelect ){
! 1226: sqliteErrorMsg(pParse, "use DROP VIEW to delete view %s", pTable->zName);
! 1227: return;
! 1228: }
! 1229:
! 1230: /* Generate code to remove the table from the master table
! 1231: ** on disk.
! 1232: */
! 1233: v = sqliteGetVdbe(pParse);
! 1234: if( v ){
! 1235: static VdbeOpList dropTable[] = {
! 1236: { OP_Rewind, 0, ADDR(8), 0},
! 1237: { OP_String, 0, 0, 0}, /* 1 */
! 1238: { OP_MemStore, 1, 1, 0},
! 1239: { OP_MemLoad, 1, 0, 0}, /* 3 */
! 1240: { OP_Column, 0, 2, 0},
! 1241: { OP_Ne, 0, ADDR(7), 0},
! 1242: { OP_Delete, 0, 0, 0},
! 1243: { OP_Next, 0, ADDR(3), 0}, /* 7 */
! 1244: };
! 1245: Index *pIdx;
! 1246: Trigger *pTrigger;
! 1247: sqliteBeginWriteOperation(pParse, 0, pTable->iDb);
! 1248:
! 1249: /* Drop all triggers associated with the table being dropped */
! 1250: pTrigger = pTable->pTrigger;
! 1251: while( pTrigger ){
! 1252: assert( pTrigger->iDb==pTable->iDb || pTrigger->iDb==1 );
! 1253: sqliteDropTriggerPtr(pParse, pTrigger, 1);
! 1254: if( pParse->explain ){
! 1255: pTrigger = pTrigger->pNext;
! 1256: }else{
! 1257: pTrigger = pTable->pTrigger;
! 1258: }
! 1259: }
! 1260:
! 1261: /* Drop all SQLITE_MASTER entries that refer to the table */
! 1262: sqliteOpenMasterTable(v, pTable->iDb);
! 1263: base = sqliteVdbeAddOpList(v, ArraySize(dropTable), dropTable);
! 1264: sqliteVdbeChangeP3(v, base+1, pTable->zName, 0);
! 1265:
! 1266: /* Drop all SQLITE_TEMP_MASTER entries that refer to the table */
! 1267: if( pTable->iDb!=1 ){
! 1268: sqliteOpenMasterTable(v, 1);
! 1269: base = sqliteVdbeAddOpList(v, ArraySize(dropTable), dropTable);
! 1270: sqliteVdbeChangeP3(v, base+1, pTable->zName, 0);
! 1271: }
! 1272:
! 1273: if( pTable->iDb==0 ){
! 1274: sqliteChangeCookie(db, v);
! 1275: }
! 1276: sqliteVdbeAddOp(v, OP_Close, 0, 0);
! 1277: if( !isView ){
! 1278: sqliteVdbeAddOp(v, OP_Destroy, pTable->tnum, pTable->iDb);
! 1279: for(pIdx=pTable->pIndex; pIdx; pIdx=pIdx->pNext){
! 1280: sqliteVdbeAddOp(v, OP_Destroy, pIdx->tnum, pIdx->iDb);
! 1281: }
! 1282: }
! 1283: sqliteEndWriteOperation(pParse);
! 1284: }
! 1285:
! 1286: /* Delete the in-memory description of the table.
! 1287: **
! 1288: ** Exception: if the SQL statement began with the EXPLAIN keyword,
! 1289: ** then no changes should be made.
! 1290: */
! 1291: if( !pParse->explain ){
! 1292: sqliteUnlinkAndDeleteTable(db, pTable);
! 1293: db->flags |= SQLITE_InternChanges;
! 1294: }
! 1295: sqliteViewResetAll(db, iDb);
! 1296: }
! 1297:
! 1298: /*
! 1299: ** This routine constructs a P3 string suitable for an OP_MakeIdxKey
! 1300: ** opcode and adds that P3 string to the most recently inserted instruction
! 1301: ** in the virtual machine. The P3 string consists of a single character
! 1302: ** for each column in the index pIdx of table pTab. If the column uses
! 1303: ** a numeric sort order, then the P3 string character corresponding to
! 1304: ** that column is 'n'. If the column uses a text sort order, then the
! 1305: ** P3 string is 't'. See the OP_MakeIdxKey opcode documentation for
! 1306: ** additional information. See also the sqliteAddKeyType() routine.
! 1307: */
! 1308: void sqliteAddIdxKeyType(Vdbe *v, Index *pIdx){
! 1309: char *zType;
! 1310: Table *pTab;
! 1311: int i, n;
! 1312: assert( pIdx!=0 && pIdx->pTable!=0 );
! 1313: pTab = pIdx->pTable;
! 1314: n = pIdx->nColumn;
! 1315: zType = sqliteMallocRaw( n+1 );
! 1316: if( zType==0 ) return;
! 1317: for(i=0; i<n; i++){
! 1318: int iCol = pIdx->aiColumn[i];
! 1319: assert( iCol>=0 && iCol<pTab->nCol );
! 1320: if( (pTab->aCol[iCol].sortOrder & SQLITE_SO_TYPEMASK)==SQLITE_SO_TEXT ){
! 1321: zType[i] = 't';
! 1322: }else{
! 1323: zType[i] = 'n';
! 1324: }
! 1325: }
! 1326: zType[n] = 0;
! 1327: sqliteVdbeChangeP3(v, -1, zType, n);
! 1328: sqliteFree(zType);
! 1329: }
! 1330:
! 1331: /*
! 1332: ** This routine is called to create a new foreign key on the table
! 1333: ** currently under construction. pFromCol determines which columns
! 1334: ** in the current table point to the foreign key. If pFromCol==0 then
! 1335: ** connect the key to the last column inserted. pTo is the name of
! 1336: ** the table referred to. pToCol is a list of tables in the other
! 1337: ** pTo table that the foreign key points to. flags contains all
! 1338: ** information about the conflict resolution algorithms specified
! 1339: ** in the ON DELETE, ON UPDATE and ON INSERT clauses.
! 1340: **
! 1341: ** An FKey structure is created and added to the table currently
! 1342: ** under construction in the pParse->pNewTable field. The new FKey
! 1343: ** is not linked into db->aFKey at this point - that does not happen
! 1344: ** until sqliteEndTable().
! 1345: **
! 1346: ** The foreign key is set for IMMEDIATE processing. A subsequent call
! 1347: ** to sqliteDeferForeignKey() might change this to DEFERRED.
! 1348: */
! 1349: void sqliteCreateForeignKey(
! 1350: Parse *pParse, /* Parsing context */
! 1351: IdList *pFromCol, /* Columns in this table that point to other table */
! 1352: Token *pTo, /* Name of the other table */
! 1353: IdList *pToCol, /* Columns in the other table */
! 1354: int flags /* Conflict resolution algorithms. */
! 1355: ){
! 1356: Table *p = pParse->pNewTable;
! 1357: int nByte;
! 1358: int i;
! 1359: int nCol;
! 1360: char *z;
! 1361: FKey *pFKey = 0;
! 1362:
! 1363: assert( pTo!=0 );
! 1364: if( p==0 || pParse->nErr ) goto fk_end;
! 1365: if( pFromCol==0 ){
! 1366: int iCol = p->nCol-1;
! 1367: if( iCol<0 ) goto fk_end;
! 1368: if( pToCol && pToCol->nId!=1 ){
! 1369: sqliteErrorMsg(pParse, "foreign key on %s"
! 1370: " should reference only one column of table %T",
! 1371: p->aCol[iCol].zName, pTo);
! 1372: goto fk_end;
! 1373: }
! 1374: nCol = 1;
! 1375: }else if( pToCol && pToCol->nId!=pFromCol->nId ){
! 1376: sqliteErrorMsg(pParse,
! 1377: "number of columns in foreign key does not match the number of "
! 1378: "columns in the referenced table");
! 1379: goto fk_end;
! 1380: }else{
! 1381: nCol = pFromCol->nId;
! 1382: }
! 1383: nByte = sizeof(*pFKey) + nCol*sizeof(pFKey->aCol[0]) + pTo->n + 1;
! 1384: if( pToCol ){
! 1385: for(i=0; i<pToCol->nId; i++){
! 1386: nByte += strlen(pToCol->a[i].zName) + 1;
! 1387: }
! 1388: }
! 1389: pFKey = sqliteMalloc( nByte );
! 1390: if( pFKey==0 ) goto fk_end;
! 1391: pFKey->pFrom = p;
! 1392: pFKey->pNextFrom = p->pFKey;
! 1393: z = (char*)&pFKey[1];
! 1394: pFKey->aCol = (struct sColMap*)z;
! 1395: z += sizeof(struct sColMap)*nCol;
! 1396: pFKey->zTo = z;
! 1397: memcpy(z, pTo->z, pTo->n);
! 1398: z[pTo->n] = 0;
! 1399: z += pTo->n+1;
! 1400: pFKey->pNextTo = 0;
! 1401: pFKey->nCol = nCol;
! 1402: if( pFromCol==0 ){
! 1403: pFKey->aCol[0].iFrom = p->nCol-1;
! 1404: }else{
! 1405: for(i=0; i<nCol; i++){
! 1406: int j;
! 1407: for(j=0; j<p->nCol; j++){
! 1408: if( sqliteStrICmp(p->aCol[j].zName, pFromCol->a[i].zName)==0 ){
! 1409: pFKey->aCol[i].iFrom = j;
! 1410: break;
! 1411: }
! 1412: }
! 1413: if( j>=p->nCol ){
! 1414: sqliteErrorMsg(pParse,
! 1415: "unknown column \"%s\" in foreign key definition",
! 1416: pFromCol->a[i].zName);
! 1417: goto fk_end;
! 1418: }
! 1419: }
! 1420: }
! 1421: if( pToCol ){
! 1422: for(i=0; i<nCol; i++){
! 1423: int n = strlen(pToCol->a[i].zName);
! 1424: pFKey->aCol[i].zCol = z;
! 1425: memcpy(z, pToCol->a[i].zName, n);
! 1426: z[n] = 0;
! 1427: z += n+1;
! 1428: }
! 1429: }
! 1430: pFKey->isDeferred = 0;
! 1431: pFKey->deleteConf = flags & 0xff;
! 1432: pFKey->updateConf = (flags >> 8 ) & 0xff;
! 1433: pFKey->insertConf = (flags >> 16 ) & 0xff;
! 1434:
! 1435: /* Link the foreign key to the table as the last step.
! 1436: */
! 1437: p->pFKey = pFKey;
! 1438: pFKey = 0;
! 1439:
! 1440: fk_end:
! 1441: sqliteFree(pFKey);
! 1442: sqliteIdListDelete(pFromCol);
! 1443: sqliteIdListDelete(pToCol);
! 1444: }
! 1445:
! 1446: /*
! 1447: ** This routine is called when an INITIALLY IMMEDIATE or INITIALLY DEFERRED
! 1448: ** clause is seen as part of a foreign key definition. The isDeferred
! 1449: ** parameter is 1 for INITIALLY DEFERRED and 0 for INITIALLY IMMEDIATE.
! 1450: ** The behavior of the most recently created foreign key is adjusted
! 1451: ** accordingly.
! 1452: */
! 1453: void sqliteDeferForeignKey(Parse *pParse, int isDeferred){
! 1454: Table *pTab;
! 1455: FKey *pFKey;
! 1456: if( (pTab = pParse->pNewTable)==0 || (pFKey = pTab->pFKey)==0 ) return;
! 1457: pFKey->isDeferred = isDeferred;
! 1458: }
! 1459:
! 1460: /*
! 1461: ** Create a new index for an SQL table. pIndex is the name of the index
! 1462: ** and pTable is the name of the table that is to be indexed. Both will
! 1463: ** be NULL for a primary key or an index that is created to satisfy a
! 1464: ** UNIQUE constraint. If pTable and pIndex are NULL, use pParse->pNewTable
! 1465: ** as the table to be indexed. pParse->pNewTable is a table that is
! 1466: ** currently being constructed by a CREATE TABLE statement.
! 1467: **
! 1468: ** pList is a list of columns to be indexed. pList will be NULL if this
! 1469: ** is a primary key or unique-constraint on the most recent column added
! 1470: ** to the table currently under construction.
! 1471: */
! 1472: void sqliteCreateIndex(
! 1473: Parse *pParse, /* All information about this parse */
! 1474: Token *pName, /* Name of the index. May be NULL */
! 1475: SrcList *pTable, /* Name of the table to index. Use pParse->pNewTable if 0 */
! 1476: IdList *pList, /* A list of columns to be indexed */
! 1477: int onError, /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */
! 1478: Token *pStart, /* The CREATE token that begins a CREATE TABLE statement */
! 1479: Token *pEnd /* The ")" that closes the CREATE INDEX statement */
! 1480: ){
! 1481: Table *pTab; /* Table to be indexed */
! 1482: Index *pIndex; /* The index to be created */
! 1483: char *zName = 0;
! 1484: int i, j;
! 1485: Token nullId; /* Fake token for an empty ID list */
! 1486: DbFixer sFix; /* For assigning database names to pTable */
! 1487: int isTemp; /* True for a temporary index */
! 1488: sqlite *db = pParse->db;
! 1489:
! 1490: if( pParse->nErr || sqlite_malloc_failed ) goto exit_create_index;
! 1491: if( db->init.busy
! 1492: && sqliteFixInit(&sFix, pParse, db->init.iDb, "index", pName)
! 1493: && sqliteFixSrcList(&sFix, pTable)
! 1494: ){
! 1495: goto exit_create_index;
! 1496: }
! 1497:
! 1498: /*
! 1499: ** Find the table that is to be indexed. Return early if not found.
! 1500: */
! 1501: if( pTable!=0 ){
! 1502: assert( pName!=0 );
! 1503: assert( pTable->nSrc==1 );
! 1504: pTab = sqliteSrcListLookup(pParse, pTable);
! 1505: }else{
! 1506: assert( pName==0 );
! 1507: pTab = pParse->pNewTable;
! 1508: }
! 1509: if( pTab==0 || pParse->nErr ) goto exit_create_index;
! 1510: if( pTab->readOnly ){
! 1511: sqliteErrorMsg(pParse, "table %s may not be indexed", pTab->zName);
! 1512: goto exit_create_index;
! 1513: }
! 1514: if( pTab->iDb>=2 && db->init.busy==0 ){
! 1515: sqliteErrorMsg(pParse, "table %s may not have indices added", pTab->zName);
! 1516: goto exit_create_index;
! 1517: }
! 1518: if( pTab->pSelect ){
! 1519: sqliteErrorMsg(pParse, "views may not be indexed");
! 1520: goto exit_create_index;
! 1521: }
! 1522: isTemp = pTab->iDb==1;
! 1523:
! 1524: /*
! 1525: ** Find the name of the index. Make sure there is not already another
! 1526: ** index or table with the same name.
! 1527: **
! 1528: ** Exception: If we are reading the names of permanent indices from the
! 1529: ** sqlite_master table (because some other process changed the schema) and
! 1530: ** one of the index names collides with the name of a temporary table or
! 1531: ** index, then we will continue to process this index.
! 1532: **
! 1533: ** If pName==0 it means that we are
! 1534: ** dealing with a primary key or UNIQUE constraint. We have to invent our
! 1535: ** own name.
! 1536: */
! 1537: if( pName && !db->init.busy ){
! 1538: Index *pISameName; /* Another index with the same name */
! 1539: Table *pTSameName; /* A table with same name as the index */
! 1540: zName = sqliteTableNameFromToken(pName);
! 1541: if( zName==0 ) goto exit_create_index;
! 1542: if( (pISameName = sqliteFindIndex(db, zName, 0))!=0 ){
! 1543: sqliteErrorMsg(pParse, "index %s already exists", zName);
! 1544: goto exit_create_index;
! 1545: }
! 1546: if( (pTSameName = sqliteFindTable(db, zName, 0))!=0 ){
! 1547: sqliteErrorMsg(pParse, "there is already a table named %s", zName);
! 1548: goto exit_create_index;
! 1549: }
! 1550: }else if( pName==0 ){
! 1551: char zBuf[30];
! 1552: int n;
! 1553: Index *pLoop;
! 1554: for(pLoop=pTab->pIndex, n=1; pLoop; pLoop=pLoop->pNext, n++){}
! 1555: sprintf(zBuf,"%d)",n);
! 1556: zName = 0;
! 1557: sqliteSetString(&zName, "(", pTab->zName, " autoindex ", zBuf, (char*)0);
! 1558: if( zName==0 ) goto exit_create_index;
! 1559: }else{
! 1560: zName = sqliteTableNameFromToken(pName);
! 1561: }
! 1562:
! 1563: /* Check for authorization to create an index.
! 1564: */
! 1565: #ifndef SQLITE_OMIT_AUTHORIZATION
! 1566: {
! 1567: const char *zDb = db->aDb[pTab->iDb].zName;
! 1568:
! 1569: assert( pTab->iDb==db->init.iDb || isTemp );
! 1570: if( sqliteAuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(isTemp), 0, zDb) ){
! 1571: goto exit_create_index;
! 1572: }
! 1573: i = SQLITE_CREATE_INDEX;
! 1574: if( isTemp ) i = SQLITE_CREATE_TEMP_INDEX;
! 1575: if( sqliteAuthCheck(pParse, i, zName, pTab->zName, zDb) ){
! 1576: goto exit_create_index;
! 1577: }
! 1578: }
! 1579: #endif
! 1580:
! 1581: /* If pList==0, it means this routine was called to make a primary
! 1582: ** key out of the last column added to the table under construction.
! 1583: ** So create a fake list to simulate this.
! 1584: */
! 1585: if( pList==0 ){
! 1586: nullId.z = pTab->aCol[pTab->nCol-1].zName;
! 1587: nullId.n = strlen(nullId.z);
! 1588: pList = sqliteIdListAppend(0, &nullId);
! 1589: if( pList==0 ) goto exit_create_index;
! 1590: }
! 1591:
! 1592: /*
! 1593: ** Allocate the index structure.
! 1594: */
! 1595: pIndex = sqliteMalloc( sizeof(Index) + strlen(zName) + 1 +
! 1596: sizeof(int)*pList->nId );
! 1597: if( pIndex==0 ) goto exit_create_index;
! 1598: pIndex->aiColumn = (int*)&pIndex[1];
! 1599: pIndex->zName = (char*)&pIndex->aiColumn[pList->nId];
! 1600: strcpy(pIndex->zName, zName);
! 1601: pIndex->pTable = pTab;
! 1602: pIndex->nColumn = pList->nId;
! 1603: pIndex->onError = onError;
! 1604: pIndex->autoIndex = pName==0;
! 1605: pIndex->iDb = isTemp ? 1 : db->init.iDb;
! 1606:
! 1607: /* Scan the names of the columns of the table to be indexed and
! 1608: ** load the column indices into the Index structure. Report an error
! 1609: ** if any column is not found.
! 1610: */
! 1611: for(i=0; i<pList->nId; i++){
! 1612: for(j=0; j<pTab->nCol; j++){
! 1613: if( sqliteStrICmp(pList->a[i].zName, pTab->aCol[j].zName)==0 ) break;
! 1614: }
! 1615: if( j>=pTab->nCol ){
! 1616: sqliteErrorMsg(pParse, "table %s has no column named %s",
! 1617: pTab->zName, pList->a[i].zName);
! 1618: sqliteFree(pIndex);
! 1619: goto exit_create_index;
! 1620: }
! 1621: pIndex->aiColumn[i] = j;
! 1622: }
! 1623:
! 1624: /* Link the new Index structure to its table and to the other
! 1625: ** in-memory database structures.
! 1626: */
! 1627: if( !pParse->explain ){
! 1628: Index *p;
! 1629: p = sqliteHashInsert(&db->aDb[pIndex->iDb].idxHash,
! 1630: pIndex->zName, strlen(pIndex->zName)+1, pIndex);
! 1631: if( p ){
! 1632: assert( p==pIndex ); /* Malloc must have failed */
! 1633: sqliteFree(pIndex);
! 1634: goto exit_create_index;
! 1635: }
! 1636: db->flags |= SQLITE_InternChanges;
! 1637: }
! 1638:
! 1639: /* When adding an index to the list of indices for a table, make
! 1640: ** sure all indices labeled OE_Replace come after all those labeled
! 1641: ** OE_Ignore. This is necessary for the correct operation of UPDATE
! 1642: ** and INSERT.
! 1643: */
! 1644: if( onError!=OE_Replace || pTab->pIndex==0
! 1645: || pTab->pIndex->onError==OE_Replace){
! 1646: pIndex->pNext = pTab->pIndex;
! 1647: pTab->pIndex = pIndex;
! 1648: }else{
! 1649: Index *pOther = pTab->pIndex;
! 1650: while( pOther->pNext && pOther->pNext->onError!=OE_Replace ){
! 1651: pOther = pOther->pNext;
! 1652: }
! 1653: pIndex->pNext = pOther->pNext;
! 1654: pOther->pNext = pIndex;
! 1655: }
! 1656:
! 1657: /* If the db->init.busy is 1 it means we are reading the SQL off the
! 1658: ** "sqlite_master" table on the disk. So do not write to the disk
! 1659: ** again. Extract the table number from the db->init.newTnum field.
! 1660: */
! 1661: if( db->init.busy && pTable!=0 ){
! 1662: pIndex->tnum = db->init.newTnum;
! 1663: }
! 1664:
! 1665: /* If the db->init.busy is 0 then create the index on disk. This
! 1666: ** involves writing the index into the master table and filling in the
! 1667: ** index with the current table contents.
! 1668: **
! 1669: ** The db->init.busy is 0 when the user first enters a CREATE INDEX
! 1670: ** command. db->init.busy is 1 when a database is opened and
! 1671: ** CREATE INDEX statements are read out of the master table. In
! 1672: ** the latter case the index already exists on disk, which is why
! 1673: ** we don't want to recreate it.
! 1674: **
! 1675: ** If pTable==0 it means this index is generated as a primary key
! 1676: ** or UNIQUE constraint of a CREATE TABLE statement. Since the table
! 1677: ** has just been created, it contains no data and the index initialization
! 1678: ** step can be skipped.
! 1679: */
! 1680: else if( db->init.busy==0 ){
! 1681: int n;
! 1682: Vdbe *v;
! 1683: int lbl1, lbl2;
! 1684: int i;
! 1685: int addr;
! 1686:
! 1687: v = sqliteGetVdbe(pParse);
! 1688: if( v==0 ) goto exit_create_index;
! 1689: if( pTable!=0 ){
! 1690: sqliteBeginWriteOperation(pParse, 0, isTemp);
! 1691: sqliteOpenMasterTable(v, isTemp);
! 1692: }
! 1693: sqliteVdbeAddOp(v, OP_NewRecno, 0, 0);
! 1694: sqliteVdbeOp3(v, OP_String, 0, 0, "index", P3_STATIC);
! 1695: sqliteVdbeOp3(v, OP_String, 0, 0, pIndex->zName, 0);
! 1696: sqliteVdbeOp3(v, OP_String, 0, 0, pTab->zName, 0);
! 1697: sqliteVdbeOp3(v, OP_CreateIndex, 0, isTemp,(char*)&pIndex->tnum,P3_POINTER);
! 1698: pIndex->tnum = 0;
! 1699: if( pTable ){
! 1700: sqliteVdbeCode(v,
! 1701: OP_Dup, 0, 0,
! 1702: OP_Integer, isTemp, 0,
! 1703: OP_OpenWrite, 1, 0,
! 1704: 0);
! 1705: }
! 1706: addr = sqliteVdbeAddOp(v, OP_String, 0, 0);
! 1707: if( pStart && pEnd ){
! 1708: n = Addr(pEnd->z) - Addr(pStart->z) + 1;
! 1709: sqliteVdbeChangeP3(v, addr, pStart->z, n);
! 1710: }
! 1711: sqliteVdbeAddOp(v, OP_MakeRecord, 5, 0);
! 1712: sqliteVdbeAddOp(v, OP_PutIntKey, 0, 0);
! 1713: if( pTable ){
! 1714: sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0);
! 1715: sqliteVdbeOp3(v, OP_OpenRead, 2, pTab->tnum, pTab->zName, 0);
! 1716: lbl2 = sqliteVdbeMakeLabel(v);
! 1717: sqliteVdbeAddOp(v, OP_Rewind, 2, lbl2);
! 1718: lbl1 = sqliteVdbeAddOp(v, OP_Recno, 2, 0);
! 1719: for(i=0; i<pIndex->nColumn; i++){
! 1720: int iCol = pIndex->aiColumn[i];
! 1721: if( pTab->iPKey==iCol ){
! 1722: sqliteVdbeAddOp(v, OP_Dup, i, 0);
! 1723: }else{
! 1724: sqliteVdbeAddOp(v, OP_Column, 2, iCol);
! 1725: }
! 1726: }
! 1727: sqliteVdbeAddOp(v, OP_MakeIdxKey, pIndex->nColumn, 0);
! 1728: if( db->file_format>=4 ) sqliteAddIdxKeyType(v, pIndex);
! 1729: sqliteVdbeOp3(v, OP_IdxPut, 1, pIndex->onError!=OE_None,
! 1730: "indexed columns are not unique", P3_STATIC);
! 1731: sqliteVdbeAddOp(v, OP_Next, 2, lbl1);
! 1732: sqliteVdbeResolveLabel(v, lbl2);
! 1733: sqliteVdbeAddOp(v, OP_Close, 2, 0);
! 1734: sqliteVdbeAddOp(v, OP_Close, 1, 0);
! 1735: }
! 1736: if( pTable!=0 ){
! 1737: if( !isTemp ){
! 1738: sqliteChangeCookie(db, v);
! 1739: }
! 1740: sqliteVdbeAddOp(v, OP_Close, 0, 0);
! 1741: sqliteEndWriteOperation(pParse);
! 1742: }
! 1743: }
! 1744:
! 1745: /* Clean up before exiting */
! 1746: exit_create_index:
! 1747: sqliteIdListDelete(pList);
! 1748: sqliteSrcListDelete(pTable);
! 1749: sqliteFree(zName);
! 1750: return;
! 1751: }
! 1752:
! 1753: /*
! 1754: ** This routine will drop an existing named index. This routine
! 1755: ** implements the DROP INDEX statement.
! 1756: */
! 1757: void sqliteDropIndex(Parse *pParse, SrcList *pName){
! 1758: Index *pIndex;
! 1759: Vdbe *v;
! 1760: sqlite *db = pParse->db;
! 1761:
! 1762: if( pParse->nErr || sqlite_malloc_failed ) return;
! 1763: assert( pName->nSrc==1 );
! 1764: pIndex = sqliteFindIndex(db, pName->a[0].zName, pName->a[0].zDatabase);
! 1765: if( pIndex==0 ){
! 1766: sqliteErrorMsg(pParse, "no such index: %S", pName, 0);
! 1767: goto exit_drop_index;
! 1768: }
! 1769: if( pIndex->autoIndex ){
! 1770: sqliteErrorMsg(pParse, "index associated with UNIQUE "
! 1771: "or PRIMARY KEY constraint cannot be dropped", 0);
! 1772: goto exit_drop_index;
! 1773: }
! 1774: if( pIndex->iDb>1 ){
! 1775: sqliteErrorMsg(pParse, "cannot alter schema of attached "
! 1776: "databases", 0);
! 1777: goto exit_drop_index;
! 1778: }
! 1779: #ifndef SQLITE_OMIT_AUTHORIZATION
! 1780: {
! 1781: int code = SQLITE_DROP_INDEX;
! 1782: Table *pTab = pIndex->pTable;
! 1783: const char *zDb = db->aDb[pIndex->iDb].zName;
! 1784: const char *zTab = SCHEMA_TABLE(pIndex->iDb);
! 1785: if( sqliteAuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb) ){
! 1786: goto exit_drop_index;
! 1787: }
! 1788: if( pIndex->iDb ) code = SQLITE_DROP_TEMP_INDEX;
! 1789: if( sqliteAuthCheck(pParse, code, pIndex->zName, pTab->zName, zDb) ){
! 1790: goto exit_drop_index;
! 1791: }
! 1792: }
! 1793: #endif
! 1794:
! 1795: /* Generate code to remove the index and from the master table */
! 1796: v = sqliteGetVdbe(pParse);
! 1797: if( v ){
! 1798: static VdbeOpList dropIndex[] = {
! 1799: { OP_Rewind, 0, ADDR(9), 0},
! 1800: { OP_String, 0, 0, 0}, /* 1 */
! 1801: { OP_MemStore, 1, 1, 0},
! 1802: { OP_MemLoad, 1, 0, 0}, /* 3 */
! 1803: { OP_Column, 0, 1, 0},
! 1804: { OP_Eq, 0, ADDR(8), 0},
! 1805: { OP_Next, 0, ADDR(3), 0},
! 1806: { OP_Goto, 0, ADDR(9), 0},
! 1807: { OP_Delete, 0, 0, 0}, /* 8 */
! 1808: };
! 1809: int base;
! 1810:
! 1811: sqliteBeginWriteOperation(pParse, 0, pIndex->iDb);
! 1812: sqliteOpenMasterTable(v, pIndex->iDb);
! 1813: base = sqliteVdbeAddOpList(v, ArraySize(dropIndex), dropIndex);
! 1814: sqliteVdbeChangeP3(v, base+1, pIndex->zName, 0);
! 1815: if( pIndex->iDb==0 ){
! 1816: sqliteChangeCookie(db, v);
! 1817: }
! 1818: sqliteVdbeAddOp(v, OP_Close, 0, 0);
! 1819: sqliteVdbeAddOp(v, OP_Destroy, pIndex->tnum, pIndex->iDb);
! 1820: sqliteEndWriteOperation(pParse);
! 1821: }
! 1822:
! 1823: /* Delete the in-memory description of this index.
! 1824: */
! 1825: if( !pParse->explain ){
! 1826: sqliteUnlinkAndDeleteIndex(db, pIndex);
! 1827: db->flags |= SQLITE_InternChanges;
! 1828: }
! 1829:
! 1830: exit_drop_index:
! 1831: sqliteSrcListDelete(pName);
! 1832: }
! 1833:
! 1834: /*
! 1835: ** Append a new element to the given IdList. Create a new IdList if
! 1836: ** need be.
! 1837: **
! 1838: ** A new IdList is returned, or NULL if malloc() fails.
! 1839: */
! 1840: IdList *sqliteIdListAppend(IdList *pList, Token *pToken){
! 1841: if( pList==0 ){
! 1842: pList = sqliteMalloc( sizeof(IdList) );
! 1843: if( pList==0 ) return 0;
! 1844: pList->nAlloc = 0;
! 1845: }
! 1846: if( pList->nId>=pList->nAlloc ){
! 1847: struct IdList_item *a;
! 1848: pList->nAlloc = pList->nAlloc*2 + 5;
! 1849: a = sqliteRealloc(pList->a, pList->nAlloc*sizeof(pList->a[0]) );
! 1850: if( a==0 ){
! 1851: sqliteIdListDelete(pList);
! 1852: return 0;
! 1853: }
! 1854: pList->a = a;
! 1855: }
! 1856: memset(&pList->a[pList->nId], 0, sizeof(pList->a[0]));
! 1857: if( pToken ){
! 1858: char **pz = &pList->a[pList->nId].zName;
! 1859: sqliteSetNString(pz, pToken->z, pToken->n, 0);
! 1860: if( *pz==0 ){
! 1861: sqliteIdListDelete(pList);
! 1862: return 0;
! 1863: }else{
! 1864: sqliteDequote(*pz);
! 1865: }
! 1866: }
! 1867: pList->nId++;
! 1868: return pList;
! 1869: }
! 1870:
! 1871: /*
! 1872: ** Append a new table name to the given SrcList. Create a new SrcList if
! 1873: ** need be. A new entry is created in the SrcList even if pToken is NULL.
! 1874: **
! 1875: ** A new SrcList is returned, or NULL if malloc() fails.
! 1876: **
! 1877: ** If pDatabase is not null, it means that the table has an optional
! 1878: ** database name prefix. Like this: "database.table". The pDatabase
! 1879: ** points to the table name and the pTable points to the database name.
! 1880: ** The SrcList.a[].zName field is filled with the table name which might
! 1881: ** come from pTable (if pDatabase is NULL) or from pDatabase.
! 1882: ** SrcList.a[].zDatabase is filled with the database name from pTable,
! 1883: ** or with NULL if no database is specified.
! 1884: **
! 1885: ** In other words, if call like this:
! 1886: **
! 1887: ** sqliteSrcListAppend(A,B,0);
! 1888: **
! 1889: ** Then B is a table name and the database name is unspecified. If called
! 1890: ** like this:
! 1891: **
! 1892: ** sqliteSrcListAppend(A,B,C);
! 1893: **
! 1894: ** Then C is the table name and B is the database name.
! 1895: */
! 1896: SrcList *sqliteSrcListAppend(SrcList *pList, Token *pTable, Token *pDatabase){
! 1897: if( pList==0 ){
! 1898: pList = sqliteMalloc( sizeof(SrcList) );
! 1899: if( pList==0 ) return 0;
! 1900: pList->nAlloc = 1;
! 1901: }
! 1902: if( pList->nSrc>=pList->nAlloc ){
! 1903: SrcList *pNew;
! 1904: pList->nAlloc *= 2;
! 1905: pNew = sqliteRealloc(pList,
! 1906: sizeof(*pList) + (pList->nAlloc-1)*sizeof(pList->a[0]) );
! 1907: if( pNew==0 ){
! 1908: sqliteSrcListDelete(pList);
! 1909: return 0;
! 1910: }
! 1911: pList = pNew;
! 1912: }
! 1913: memset(&pList->a[pList->nSrc], 0, sizeof(pList->a[0]));
! 1914: if( pDatabase && pDatabase->z==0 ){
! 1915: pDatabase = 0;
! 1916: }
! 1917: if( pDatabase && pTable ){
! 1918: Token *pTemp = pDatabase;
! 1919: pDatabase = pTable;
! 1920: pTable = pTemp;
! 1921: }
! 1922: if( pTable ){
! 1923: char **pz = &pList->a[pList->nSrc].zName;
! 1924: sqliteSetNString(pz, pTable->z, pTable->n, 0);
! 1925: if( *pz==0 ){
! 1926: sqliteSrcListDelete(pList);
! 1927: return 0;
! 1928: }else{
! 1929: sqliteDequote(*pz);
! 1930: }
! 1931: }
! 1932: if( pDatabase ){
! 1933: char **pz = &pList->a[pList->nSrc].zDatabase;
! 1934: sqliteSetNString(pz, pDatabase->z, pDatabase->n, 0);
! 1935: if( *pz==0 ){
! 1936: sqliteSrcListDelete(pList);
! 1937: return 0;
! 1938: }else{
! 1939: sqliteDequote(*pz);
! 1940: }
! 1941: }
! 1942: pList->a[pList->nSrc].iCursor = -1;
! 1943: pList->nSrc++;
! 1944: return pList;
! 1945: }
! 1946:
! 1947: /*
! 1948: ** Assign cursors to all tables in a SrcList
! 1949: */
! 1950: void sqliteSrcListAssignCursors(Parse *pParse, SrcList *pList){
! 1951: int i;
! 1952: for(i=0; i<pList->nSrc; i++){
! 1953: if( pList->a[i].iCursor<0 ){
! 1954: pList->a[i].iCursor = pParse->nTab++;
! 1955: }
! 1956: }
! 1957: }
! 1958:
! 1959: /*
! 1960: ** Add an alias to the last identifier on the given identifier list.
! 1961: */
! 1962: void sqliteSrcListAddAlias(SrcList *pList, Token *pToken){
! 1963: if( pList && pList->nSrc>0 ){
! 1964: int i = pList->nSrc - 1;
! 1965: sqliteSetNString(&pList->a[i].zAlias, pToken->z, pToken->n, 0);
! 1966: sqliteDequote(pList->a[i].zAlias);
! 1967: }
! 1968: }
! 1969:
! 1970: /*
! 1971: ** Delete an IdList.
! 1972: */
! 1973: void sqliteIdListDelete(IdList *pList){
! 1974: int i;
! 1975: if( pList==0 ) return;
! 1976: for(i=0; i<pList->nId; i++){
! 1977: sqliteFree(pList->a[i].zName);
! 1978: }
! 1979: sqliteFree(pList->a);
! 1980: sqliteFree(pList);
! 1981: }
! 1982:
! 1983: /*
! 1984: ** Return the index in pList of the identifier named zId. Return -1
! 1985: ** if not found.
! 1986: */
! 1987: int sqliteIdListIndex(IdList *pList, const char *zName){
! 1988: int i;
! 1989: if( pList==0 ) return -1;
! 1990: for(i=0; i<pList->nId; i++){
! 1991: if( sqliteStrICmp(pList->a[i].zName, zName)==0 ) return i;
! 1992: }
! 1993: return -1;
! 1994: }
! 1995:
! 1996: /*
! 1997: ** Delete an entire SrcList including all its substructure.
! 1998: */
! 1999: void sqliteSrcListDelete(SrcList *pList){
! 2000: int i;
! 2001: if( pList==0 ) return;
! 2002: for(i=0; i<pList->nSrc; i++){
! 2003: sqliteFree(pList->a[i].zDatabase);
! 2004: sqliteFree(pList->a[i].zName);
! 2005: sqliteFree(pList->a[i].zAlias);
! 2006: if( pList->a[i].pTab && pList->a[i].pTab->isTransient ){
! 2007: sqliteDeleteTable(0, pList->a[i].pTab);
! 2008: }
! 2009: sqliteSelectDelete(pList->a[i].pSelect);
! 2010: sqliteExprDelete(pList->a[i].pOn);
! 2011: sqliteIdListDelete(pList->a[i].pUsing);
! 2012: }
! 2013: sqliteFree(pList);
! 2014: }
! 2015:
! 2016: /*
! 2017: ** Begin a transaction
! 2018: */
! 2019: void sqliteBeginTransaction(Parse *pParse, int onError){
! 2020: sqlite *db;
! 2021:
! 2022: if( pParse==0 || (db=pParse->db)==0 || db->aDb[0].pBt==0 ) return;
! 2023: if( pParse->nErr || sqlite_malloc_failed ) return;
! 2024: if( sqliteAuthCheck(pParse, SQLITE_TRANSACTION, "BEGIN", 0, 0) ) return;
! 2025: if( db->flags & SQLITE_InTrans ){
! 2026: sqliteErrorMsg(pParse, "cannot start a transaction within a transaction");
! 2027: return;
! 2028: }
! 2029: sqliteBeginWriteOperation(pParse, 0, 0);
! 2030: if( !pParse->explain ){
! 2031: db->flags |= SQLITE_InTrans;
! 2032: db->onError = onError;
! 2033: }
! 2034: }
! 2035:
! 2036: /*
! 2037: ** Commit a transaction
! 2038: */
! 2039: void sqliteCommitTransaction(Parse *pParse){
! 2040: sqlite *db;
! 2041:
! 2042: if( pParse==0 || (db=pParse->db)==0 || db->aDb[0].pBt==0 ) return;
! 2043: if( pParse->nErr || sqlite_malloc_failed ) return;
! 2044: if( sqliteAuthCheck(pParse, SQLITE_TRANSACTION, "COMMIT", 0, 0) ) return;
! 2045: if( (db->flags & SQLITE_InTrans)==0 ){
! 2046: sqliteErrorMsg(pParse, "cannot commit - no transaction is active");
! 2047: return;
! 2048: }
! 2049: if( !pParse->explain ){
! 2050: db->flags &= ~SQLITE_InTrans;
! 2051: }
! 2052: sqliteEndWriteOperation(pParse);
! 2053: if( !pParse->explain ){
! 2054: db->onError = OE_Default;
! 2055: }
! 2056: }
! 2057:
! 2058: /*
! 2059: ** Rollback a transaction
! 2060: */
! 2061: void sqliteRollbackTransaction(Parse *pParse){
! 2062: sqlite *db;
! 2063: Vdbe *v;
! 2064:
! 2065: if( pParse==0 || (db=pParse->db)==0 || db->aDb[0].pBt==0 ) return;
! 2066: if( pParse->nErr || sqlite_malloc_failed ) return;
! 2067: if( sqliteAuthCheck(pParse, SQLITE_TRANSACTION, "ROLLBACK", 0, 0) ) return;
! 2068: if( (db->flags & SQLITE_InTrans)==0 ){
! 2069: sqliteErrorMsg(pParse, "cannot rollback - no transaction is active");
! 2070: return;
! 2071: }
! 2072: v = sqliteGetVdbe(pParse);
! 2073: if( v ){
! 2074: sqliteVdbeAddOp(v, OP_Rollback, 0, 0);
! 2075: }
! 2076: if( !pParse->explain ){
! 2077: db->flags &= ~SQLITE_InTrans;
! 2078: db->onError = OE_Default;
! 2079: }
! 2080: }
! 2081:
! 2082: /*
! 2083: ** Generate VDBE code that will verify the schema cookie for all
! 2084: ** named database files.
! 2085: */
! 2086: void sqliteCodeVerifySchema(Parse *pParse, int iDb){
! 2087: sqlite *db = pParse->db;
! 2088: Vdbe *v = sqliteGetVdbe(pParse);
! 2089: assert( iDb>=0 && iDb<db->nDb );
! 2090: assert( db->aDb[iDb].pBt!=0 );
! 2091: if( iDb!=1 && !DbHasProperty(db, iDb, DB_Cookie) ){
! 2092: sqliteVdbeAddOp(v, OP_VerifyCookie, iDb, db->aDb[iDb].schema_cookie);
! 2093: DbSetProperty(db, iDb, DB_Cookie);
! 2094: }
! 2095: }
! 2096:
! 2097: /*
! 2098: ** Generate VDBE code that prepares for doing an operation that
! 2099: ** might change the database.
! 2100: **
! 2101: ** This routine starts a new transaction if we are not already within
! 2102: ** a transaction. If we are already within a transaction, then a checkpoint
! 2103: ** is set if the setCheckpoint parameter is true. A checkpoint should
! 2104: ** be set for operations that might fail (due to a constraint) part of
! 2105: ** the way through and which will need to undo some writes without having to
! 2106: ** rollback the whole transaction. For operations where all constraints
! 2107: ** can be checked before any changes are made to the database, it is never
! 2108: ** necessary to undo a write and the checkpoint should not be set.
! 2109: **
! 2110: ** Only database iDb and the temp database are made writable by this call.
! 2111: ** If iDb==0, then the main and temp databases are made writable. If
! 2112: ** iDb==1 then only the temp database is made writable. If iDb>1 then the
! 2113: ** specified auxiliary database and the temp database are made writable.
! 2114: */
! 2115: void sqliteBeginWriteOperation(Parse *pParse, int setCheckpoint, int iDb){
! 2116: Vdbe *v;
! 2117: sqlite *db = pParse->db;
! 2118: if( DbHasProperty(db, iDb, DB_Locked) ) return;
! 2119: v = sqliteGetVdbe(pParse);
! 2120: if( v==0 ) return;
! 2121: if( !db->aDb[iDb].inTrans ){
! 2122: sqliteVdbeAddOp(v, OP_Transaction, iDb, 0);
! 2123: DbSetProperty(db, iDb, DB_Locked);
! 2124: sqliteCodeVerifySchema(pParse, iDb);
! 2125: if( iDb!=1 ){
! 2126: sqliteBeginWriteOperation(pParse, setCheckpoint, 1);
! 2127: }
! 2128: }else if( setCheckpoint ){
! 2129: sqliteVdbeAddOp(v, OP_Checkpoint, iDb, 0);
! 2130: DbSetProperty(db, iDb, DB_Locked);
! 2131: }
! 2132: }
! 2133:
! 2134: /*
! 2135: ** Generate code that concludes an operation that may have changed
! 2136: ** the database. If a statement transaction was started, then emit
! 2137: ** an OP_Commit that will cause the changes to be committed to disk.
! 2138: **
! 2139: ** Note that checkpoints are automatically committed at the end of
! 2140: ** a statement. Note also that there can be multiple calls to
! 2141: ** sqliteBeginWriteOperation() but there should only be a single
! 2142: ** call to sqliteEndWriteOperation() at the conclusion of the statement.
! 2143: */
! 2144: void sqliteEndWriteOperation(Parse *pParse){
! 2145: Vdbe *v;
! 2146: sqlite *db = pParse->db;
! 2147: if( pParse->trigStack ) return; /* if this is in a trigger */
! 2148: v = sqliteGetVdbe(pParse);
! 2149: if( v==0 ) return;
! 2150: if( db->flags & SQLITE_InTrans ){
! 2151: /* A BEGIN has executed. Do not commit until we see an explicit
! 2152: ** COMMIT statement. */
! 2153: }else{
! 2154: sqliteVdbeAddOp(v, OP_Commit, 0, 0);
! 2155: }
! 2156: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>