modernc.org/cc@v1.0.1/v2/testdata/_sqlite/src/alter.c (about)

     1  /*
     2  ** 2005 February 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 used to generate VDBE code
    13  ** that implements the ALTER TABLE command.
    14  */
    15  #include "sqliteInt.h"
    16  
    17  /*
    18  ** The code in this file only exists if we are not omitting the
    19  ** ALTER TABLE logic from the build.
    20  */
    21  #ifndef SQLITE_OMIT_ALTERTABLE
    22  
    23  
    24  /*
    25  ** This function is used by SQL generated to implement the 
    26  ** ALTER TABLE command. The first argument is the text of a CREATE TABLE or
    27  ** CREATE INDEX command. The second is a table name. The table name in 
    28  ** the CREATE TABLE or CREATE INDEX statement is replaced with the third
    29  ** argument and the result returned. Examples:
    30  **
    31  ** sqlite_rename_table('CREATE TABLE abc(a, b, c)', 'def')
    32  **     -> 'CREATE TABLE def(a, b, c)'
    33  **
    34  ** sqlite_rename_table('CREATE INDEX i ON abc(a)', 'def')
    35  **     -> 'CREATE INDEX i ON def(a, b, c)'
    36  */
    37  static void renameTableFunc(
    38    sqlite3_context *context,
    39    int NotUsed,
    40    sqlite3_value **argv
    41  ){
    42    unsigned char const *zSql = sqlite3_value_text(argv[0]);
    43    unsigned char const *zTableName = sqlite3_value_text(argv[1]);
    44  
    45    int token;
    46    Token tname;
    47    unsigned char const *zCsr = zSql;
    48    int len = 0;
    49    char *zRet;
    50  
    51    sqlite3 *db = sqlite3_context_db_handle(context);
    52  
    53    UNUSED_PARAMETER(NotUsed);
    54  
    55    /* The principle used to locate the table name in the CREATE TABLE 
    56    ** statement is that the table name is the first non-space token that
    57    ** is immediately followed by a TK_LP or TK_USING token.
    58    */
    59    if( zSql ){
    60      do {
    61        if( !*zCsr ){
    62          /* Ran out of input before finding an opening bracket. Return NULL. */
    63          return;
    64        }
    65  
    66        /* Store the token that zCsr points to in tname. */
    67        tname.z = (char*)zCsr;
    68        tname.n = len;
    69  
    70        /* Advance zCsr to the next token. Store that token type in 'token',
    71        ** and its length in 'len' (to be used next iteration of this loop).
    72        */
    73        do {
    74          zCsr += len;
    75          len = sqlite3GetToken(zCsr, &token);
    76        } while( token==TK_SPACE );
    77        assert( len>0 );
    78      } while( token!=TK_LP && token!=TK_USING );
    79  
    80      zRet = sqlite3MPrintf(db, "%.*s\"%w\"%s", (int)(((u8*)tname.z) - zSql),
    81         zSql, zTableName, tname.z+tname.n);
    82      sqlite3_result_text(context, zRet, -1, SQLITE_DYNAMIC);
    83    }
    84  }
    85  
    86  /*
    87  ** This C function implements an SQL user function that is used by SQL code
    88  ** generated by the ALTER TABLE ... RENAME command to modify the definition
    89  ** of any foreign key constraints that use the table being renamed as the 
    90  ** parent table. It is passed three arguments:
    91  **
    92  **   1) The complete text of the CREATE TABLE statement being modified,
    93  **   2) The old name of the table being renamed, and
    94  **   3) The new name of the table being renamed.
    95  **
    96  ** It returns the new CREATE TABLE statement. For example:
    97  **
    98  **   sqlite_rename_parent('CREATE TABLE t1(a REFERENCES t2)', 't2', 't3')
    99  **       -> 'CREATE TABLE t1(a REFERENCES t3)'
   100  */
   101  #ifndef SQLITE_OMIT_FOREIGN_KEY
   102  static void renameParentFunc(
   103    sqlite3_context *context,
   104    int NotUsed,
   105    sqlite3_value **argv
   106  ){
   107    sqlite3 *db = sqlite3_context_db_handle(context);
   108    char *zOutput = 0;
   109    char *zResult;
   110    unsigned char const *zInput = sqlite3_value_text(argv[0]);
   111    unsigned char const *zOld = sqlite3_value_text(argv[1]);
   112    unsigned char const *zNew = sqlite3_value_text(argv[2]);
   113  
   114    unsigned const char *z;         /* Pointer to token */
   115    int n;                          /* Length of token z */
   116    int token;                      /* Type of token */
   117  
   118    UNUSED_PARAMETER(NotUsed);
   119    if( zInput==0 || zOld==0 ) return;
   120    for(z=zInput; *z; z=z+n){
   121      n = sqlite3GetToken(z, &token);
   122      if( token==TK_REFERENCES ){
   123        char *zParent;
   124        do {
   125          z += n;
   126          n = sqlite3GetToken(z, &token);
   127        }while( token==TK_SPACE );
   128  
   129        if( token==TK_ILLEGAL ) break;
   130        zParent = sqlite3DbStrNDup(db, (const char *)z, n);
   131        if( zParent==0 ) break;
   132        sqlite3Dequote(zParent);
   133        if( 0==sqlite3StrICmp((const char *)zOld, zParent) ){
   134          char *zOut = sqlite3MPrintf(db, "%s%.*s\"%w\"", 
   135              (zOutput?zOutput:""), (int)(z-zInput), zInput, (const char *)zNew
   136          );
   137          sqlite3DbFree(db, zOutput);
   138          zOutput = zOut;
   139          zInput = &z[n];
   140        }
   141        sqlite3DbFree(db, zParent);
   142      }
   143    }
   144  
   145    zResult = sqlite3MPrintf(db, "%s%s", (zOutput?zOutput:""), zInput), 
   146    sqlite3_result_text(context, zResult, -1, SQLITE_DYNAMIC);
   147    sqlite3DbFree(db, zOutput);
   148  }
   149  #endif
   150  
   151  #ifndef SQLITE_OMIT_TRIGGER
   152  /* This function is used by SQL generated to implement the
   153  ** ALTER TABLE command. The first argument is the text of a CREATE TRIGGER 
   154  ** statement. The second is a table name. The table name in the CREATE 
   155  ** TRIGGER statement is replaced with the third argument and the result 
   156  ** returned. This is analagous to renameTableFunc() above, except for CREATE
   157  ** TRIGGER, not CREATE INDEX and CREATE TABLE.
   158  */
   159  static void renameTriggerFunc(
   160    sqlite3_context *context,
   161    int NotUsed,
   162    sqlite3_value **argv
   163  ){
   164    unsigned char const *zSql = sqlite3_value_text(argv[0]);
   165    unsigned char const *zTableName = sqlite3_value_text(argv[1]);
   166  
   167    int token;
   168    Token tname;
   169    int dist = 3;
   170    unsigned char const *zCsr = zSql;
   171    int len = 0;
   172    char *zRet;
   173    sqlite3 *db = sqlite3_context_db_handle(context);
   174  
   175    UNUSED_PARAMETER(NotUsed);
   176  
   177    /* The principle used to locate the table name in the CREATE TRIGGER 
   178    ** statement is that the table name is the first token that is immediately
   179    ** preceded by either TK_ON or TK_DOT and immediately followed by one
   180    ** of TK_WHEN, TK_BEGIN or TK_FOR.
   181    */
   182    if( zSql ){
   183      do {
   184  
   185        if( !*zCsr ){
   186          /* Ran out of input before finding the table name. Return NULL. */
   187          return;
   188        }
   189  
   190        /* Store the token that zCsr points to in tname. */
   191        tname.z = (char*)zCsr;
   192        tname.n = len;
   193  
   194        /* Advance zCsr to the next token. Store that token type in 'token',
   195        ** and its length in 'len' (to be used next iteration of this loop).
   196        */
   197        do {
   198          zCsr += len;
   199          len = sqlite3GetToken(zCsr, &token);
   200        }while( token==TK_SPACE );
   201        assert( len>0 );
   202  
   203        /* Variable 'dist' stores the number of tokens read since the most
   204        ** recent TK_DOT or TK_ON. This means that when a WHEN, FOR or BEGIN 
   205        ** token is read and 'dist' equals 2, the condition stated above
   206        ** to be met.
   207        **
   208        ** Note that ON cannot be a database, table or column name, so
   209        ** there is no need to worry about syntax like 
   210        ** "CREATE TRIGGER ... ON ON.ON BEGIN ..." etc.
   211        */
   212        dist++;
   213        if( token==TK_DOT || token==TK_ON ){
   214          dist = 0;
   215        }
   216      } while( dist!=2 || (token!=TK_WHEN && token!=TK_FOR && token!=TK_BEGIN) );
   217  
   218      /* Variable tname now contains the token that is the old table-name
   219      ** in the CREATE TRIGGER statement.
   220      */
   221      zRet = sqlite3MPrintf(db, "%.*s\"%w\"%s", (int)(((u8*)tname.z) - zSql),
   222         zSql, zTableName, tname.z+tname.n);
   223      sqlite3_result_text(context, zRet, -1, SQLITE_DYNAMIC);
   224    }
   225  }
   226  #endif   /* !SQLITE_OMIT_TRIGGER */
   227  
   228  /*
   229  ** Register built-in functions used to help implement ALTER TABLE
   230  */
   231  void sqlite3AlterFunctions(void){
   232    static FuncDef aAlterTableFuncs[] = {
   233      FUNCTION(sqlite_rename_table,   2, 0, 0, renameTableFunc),
   234  #ifndef SQLITE_OMIT_TRIGGER
   235      FUNCTION(sqlite_rename_trigger, 2, 0, 0, renameTriggerFunc),
   236  #endif
   237  #ifndef SQLITE_OMIT_FOREIGN_KEY
   238      FUNCTION(sqlite_rename_parent,  3, 0, 0, renameParentFunc),
   239  #endif
   240    };
   241    sqlite3InsertBuiltinFuncs(aAlterTableFuncs, ArraySize(aAlterTableFuncs));
   242  }
   243  
   244  /*
   245  ** This function is used to create the text of expressions of the form:
   246  **
   247  **   name=<constant1> OR name=<constant2> OR ...
   248  **
   249  ** If argument zWhere is NULL, then a pointer string containing the text 
   250  ** "name=<constant>" is returned, where <constant> is the quoted version
   251  ** of the string passed as argument zConstant. The returned buffer is
   252  ** allocated using sqlite3DbMalloc(). It is the responsibility of the
   253  ** caller to ensure that it is eventually freed.
   254  **
   255  ** If argument zWhere is not NULL, then the string returned is 
   256  ** "<where> OR name=<constant>", where <where> is the contents of zWhere.
   257  ** In this case zWhere is passed to sqlite3DbFree() before returning.
   258  ** 
   259  */
   260  static char *whereOrName(sqlite3 *db, char *zWhere, char *zConstant){
   261    char *zNew;
   262    if( !zWhere ){
   263      zNew = sqlite3MPrintf(db, "name=%Q", zConstant);
   264    }else{
   265      zNew = sqlite3MPrintf(db, "%s OR name=%Q", zWhere, zConstant);
   266      sqlite3DbFree(db, zWhere);
   267    }
   268    return zNew;
   269  }
   270  
   271  #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
   272  /*
   273  ** Generate the text of a WHERE expression which can be used to select all
   274  ** tables that have foreign key constraints that refer to table pTab (i.e.
   275  ** constraints for which pTab is the parent table) from the sqlite_master
   276  ** table.
   277  */
   278  static char *whereForeignKeys(Parse *pParse, Table *pTab){
   279    FKey *p;
   280    char *zWhere = 0;
   281    for(p=sqlite3FkReferences(pTab); p; p=p->pNextTo){
   282      zWhere = whereOrName(pParse->db, zWhere, p->pFrom->zName);
   283    }
   284    return zWhere;
   285  }
   286  #endif
   287  
   288  /*
   289  ** Generate the text of a WHERE expression which can be used to select all
   290  ** temporary triggers on table pTab from the sqlite_temp_master table. If
   291  ** table pTab has no temporary triggers, or is itself stored in the 
   292  ** temporary database, NULL is returned.
   293  */
   294  static char *whereTempTriggers(Parse *pParse, Table *pTab){
   295    Trigger *pTrig;
   296    char *zWhere = 0;
   297    const Schema *pTempSchema = pParse->db->aDb[1].pSchema; /* Temp db schema */
   298  
   299    /* If the table is not located in the temp-db (in which case NULL is 
   300    ** returned, loop through the tables list of triggers. For each trigger
   301    ** that is not part of the temp-db schema, add a clause to the WHERE 
   302    ** expression being built up in zWhere.
   303    */
   304    if( pTab->pSchema!=pTempSchema ){
   305      sqlite3 *db = pParse->db;
   306      for(pTrig=sqlite3TriggerList(pParse, pTab); pTrig; pTrig=pTrig->pNext){
   307        if( pTrig->pSchema==pTempSchema ){
   308          zWhere = whereOrName(db, zWhere, pTrig->zName);
   309        }
   310      }
   311    }
   312    if( zWhere ){
   313      char *zNew = sqlite3MPrintf(pParse->db, "type='trigger' AND (%s)", zWhere);
   314      sqlite3DbFree(pParse->db, zWhere);
   315      zWhere = zNew;
   316    }
   317    return zWhere;
   318  }
   319  
   320  /*
   321  ** Generate code to drop and reload the internal representation of table
   322  ** pTab from the database, including triggers and temporary triggers.
   323  ** Argument zName is the name of the table in the database schema at
   324  ** the time the generated code is executed. This can be different from
   325  ** pTab->zName if this function is being called to code part of an 
   326  ** "ALTER TABLE RENAME TO" statement.
   327  */
   328  static void reloadTableSchema(Parse *pParse, Table *pTab, const char *zName){
   329    Vdbe *v;
   330    char *zWhere;
   331    int iDb;                   /* Index of database containing pTab */
   332  #ifndef SQLITE_OMIT_TRIGGER
   333    Trigger *pTrig;
   334  #endif
   335  
   336    v = sqlite3GetVdbe(pParse);
   337    if( NEVER(v==0) ) return;
   338    assert( sqlite3BtreeHoldsAllMutexes(pParse->db) );
   339    iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
   340    assert( iDb>=0 );
   341  
   342  #ifndef SQLITE_OMIT_TRIGGER
   343    /* Drop any table triggers from the internal schema. */
   344    for(pTrig=sqlite3TriggerList(pParse, pTab); pTrig; pTrig=pTrig->pNext){
   345      int iTrigDb = sqlite3SchemaToIndex(pParse->db, pTrig->pSchema);
   346      assert( iTrigDb==iDb || iTrigDb==1 );
   347      sqlite3VdbeAddOp4(v, OP_DropTrigger, iTrigDb, 0, 0, pTrig->zName, 0);
   348    }
   349  #endif
   350  
   351    /* Drop the table and index from the internal schema.  */
   352    sqlite3VdbeAddOp4(v, OP_DropTable, iDb, 0, 0, pTab->zName, 0);
   353  
   354    /* Reload the table, index and permanent trigger schemas. */
   355    zWhere = sqlite3MPrintf(pParse->db, "tbl_name=%Q", zName);
   356    if( !zWhere ) return;
   357    sqlite3VdbeAddParseSchemaOp(v, iDb, zWhere);
   358  
   359  #ifndef SQLITE_OMIT_TRIGGER
   360    /* Now, if the table is not stored in the temp database, reload any temp 
   361    ** triggers. Don't use IN(...) in case SQLITE_OMIT_SUBQUERY is defined. 
   362    */
   363    if( (zWhere=whereTempTriggers(pParse, pTab))!=0 ){
   364      sqlite3VdbeAddParseSchemaOp(v, 1, zWhere);
   365    }
   366  #endif
   367  }
   368  
   369  /*
   370  ** Parameter zName is the name of a table that is about to be altered
   371  ** (either with ALTER TABLE ... RENAME TO or ALTER TABLE ... ADD COLUMN).
   372  ** If the table is a system table, this function leaves an error message
   373  ** in pParse->zErr (system tables may not be altered) and returns non-zero.
   374  **
   375  ** Or, if zName is not a system table, zero is returned.
   376  */
   377  static int isSystemTable(Parse *pParse, const char *zName){
   378    if( 0==sqlite3StrNICmp(zName, "sqlite_", 7) ){
   379      sqlite3ErrorMsg(pParse, "table %s may not be altered", zName);
   380      return 1;
   381    }
   382    return 0;
   383  }
   384  
   385  /*
   386  ** Generate code to implement the "ALTER TABLE xxx RENAME TO yyy" 
   387  ** command. 
   388  */
   389  void sqlite3AlterRenameTable(
   390    Parse *pParse,            /* Parser context. */
   391    SrcList *pSrc,            /* The table to rename. */
   392    Token *pName              /* The new table name. */
   393  ){
   394    int iDb;                  /* Database that contains the table */
   395    char *zDb;                /* Name of database iDb */
   396    Table *pTab;              /* Table being renamed */
   397    char *zName = 0;          /* NULL-terminated version of pName */ 
   398    sqlite3 *db = pParse->db; /* Database connection */
   399    int nTabName;             /* Number of UTF-8 characters in zTabName */
   400    const char *zTabName;     /* Original name of the table */
   401    Vdbe *v;
   402  #ifndef SQLITE_OMIT_TRIGGER
   403    char *zWhere = 0;         /* Where clause to locate temp triggers */
   404  #endif
   405    VTable *pVTab = 0;        /* Non-zero if this is a v-tab with an xRename() */
   406    u32 savedDbFlags;         /* Saved value of db->mDbFlags */
   407  
   408    savedDbFlags = db->mDbFlags;  
   409    if( NEVER(db->mallocFailed) ) goto exit_rename_table;
   410    assert( pSrc->nSrc==1 );
   411    assert( sqlite3BtreeHoldsAllMutexes(pParse->db) );
   412  
   413    pTab = sqlite3LocateTableItem(pParse, 0, &pSrc->a[0]);
   414    if( !pTab ) goto exit_rename_table;
   415    iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
   416    zDb = db->aDb[iDb].zDbSName;
   417    db->mDbFlags |= DBFLAG_PreferBuiltin;
   418  
   419    /* Get a NULL terminated version of the new table name. */
   420    zName = sqlite3NameFromToken(db, pName);
   421    if( !zName ) goto exit_rename_table;
   422  
   423    /* Check that a table or index named 'zName' does not already exist
   424    ** in database iDb. If so, this is an error.
   425    */
   426    if( sqlite3FindTable(db, zName, zDb) || sqlite3FindIndex(db, zName, zDb) ){
   427      sqlite3ErrorMsg(pParse, 
   428          "there is already another table or index with this name: %s", zName);
   429      goto exit_rename_table;
   430    }
   431  
   432    /* Make sure it is not a system table being altered, or a reserved name
   433    ** that the table is being renamed to.
   434    */
   435    if( SQLITE_OK!=isSystemTable(pParse, pTab->zName) ){
   436      goto exit_rename_table;
   437    }
   438    if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ goto
   439      exit_rename_table;
   440    }
   441  
   442  #ifndef SQLITE_OMIT_VIEW
   443    if( pTab->pSelect ){
   444      sqlite3ErrorMsg(pParse, "view %s may not be altered", pTab->zName);
   445      goto exit_rename_table;
   446    }
   447  #endif
   448  
   449  #ifndef SQLITE_OMIT_AUTHORIZATION
   450    /* Invoke the authorization callback. */
   451    if( sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, 0) ){
   452      goto exit_rename_table;
   453    }
   454  #endif
   455  
   456  #ifndef SQLITE_OMIT_VIRTUALTABLE
   457    if( sqlite3ViewGetColumnNames(pParse, pTab) ){
   458      goto exit_rename_table;
   459    }
   460    if( IsVirtual(pTab) ){
   461      pVTab = sqlite3GetVTable(db, pTab);
   462      if( pVTab->pVtab->pModule->xRename==0 ){
   463        pVTab = 0;
   464      }
   465    }
   466  #endif
   467  
   468    /* Begin a transaction for database iDb. 
   469    ** Then modify the schema cookie (since the ALTER TABLE modifies the
   470    ** schema). Open a statement transaction if the table is a virtual
   471    ** table.
   472    */
   473    v = sqlite3GetVdbe(pParse);
   474    if( v==0 ){
   475      goto exit_rename_table;
   476    }
   477    sqlite3BeginWriteOperation(pParse, pVTab!=0, iDb);
   478    sqlite3ChangeCookie(pParse, iDb);
   479  
   480    /* If this is a virtual table, invoke the xRename() function if
   481    ** one is defined. The xRename() callback will modify the names
   482    ** of any resources used by the v-table implementation (including other
   483    ** SQLite tables) that are identified by the name of the virtual table.
   484    */
   485  #ifndef SQLITE_OMIT_VIRTUALTABLE
   486    if( pVTab ){
   487      int i = ++pParse->nMem;
   488      sqlite3VdbeLoadString(v, i, zName);
   489      sqlite3VdbeAddOp4(v, OP_VRename, i, 0, 0,(const char*)pVTab, P4_VTAB);
   490      sqlite3MayAbort(pParse);
   491    }
   492  #endif
   493  
   494    /* figure out how many UTF-8 characters are in zName */
   495    zTabName = pTab->zName;
   496    nTabName = sqlite3Utf8CharLen(zTabName, -1);
   497  
   498  #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
   499    if( db->flags&SQLITE_ForeignKeys ){
   500      /* If foreign-key support is enabled, rewrite the CREATE TABLE 
   501      ** statements corresponding to all child tables of foreign key constraints
   502      ** for which the renamed table is the parent table.  */
   503      if( (zWhere=whereForeignKeys(pParse, pTab))!=0 ){
   504        sqlite3NestedParse(pParse, 
   505            "UPDATE \"%w\".%s SET "
   506                "sql = sqlite_rename_parent(sql, %Q, %Q) "
   507                "WHERE %s;", zDb, MASTER_NAME, zTabName, zName, zWhere);
   508        sqlite3DbFree(db, zWhere);
   509      }
   510    }
   511  #endif
   512  
   513    /* Modify the sqlite_master table to use the new table name. */
   514    sqlite3NestedParse(pParse,
   515        "UPDATE %Q.%s SET "
   516  #ifdef SQLITE_OMIT_TRIGGER
   517            "sql = sqlite_rename_table(sql, %Q), "
   518  #else
   519            "sql = CASE "
   520              "WHEN type = 'trigger' THEN sqlite_rename_trigger(sql, %Q)"
   521              "ELSE sqlite_rename_table(sql, %Q) END, "
   522  #endif
   523            "tbl_name = %Q, "
   524            "name = CASE "
   525              "WHEN type='table' THEN %Q "
   526              "WHEN name LIKE 'sqlite_autoindex%%' AND type='index' THEN "
   527               "'sqlite_autoindex_' || %Q || substr(name,%d+18) "
   528              "ELSE name END "
   529        "WHERE tbl_name=%Q COLLATE nocase AND "
   530            "(type='table' OR type='index' OR type='trigger');", 
   531        zDb, MASTER_NAME, zName, zName, zName, 
   532  #ifndef SQLITE_OMIT_TRIGGER
   533        zName,
   534  #endif
   535        zName, nTabName, zTabName
   536    );
   537  
   538  #ifndef SQLITE_OMIT_AUTOINCREMENT
   539    /* If the sqlite_sequence table exists in this database, then update 
   540    ** it with the new table name.
   541    */
   542    if( sqlite3FindTable(db, "sqlite_sequence", zDb) ){
   543      sqlite3NestedParse(pParse,
   544          "UPDATE \"%w\".sqlite_sequence set name = %Q WHERE name = %Q",
   545          zDb, zName, pTab->zName);
   546    }
   547  #endif
   548  
   549  #ifndef SQLITE_OMIT_TRIGGER
   550    /* If there are TEMP triggers on this table, modify the sqlite_temp_master
   551    ** table. Don't do this if the table being ALTERed is itself located in
   552    ** the temp database.
   553    */
   554    if( (zWhere=whereTempTriggers(pParse, pTab))!=0 ){
   555      sqlite3NestedParse(pParse, 
   556          "UPDATE sqlite_temp_master SET "
   557              "sql = sqlite_rename_trigger(sql, %Q), "
   558              "tbl_name = %Q "
   559              "WHERE %s;", zName, zName, zWhere);
   560      sqlite3DbFree(db, zWhere);
   561    }
   562  #endif
   563  
   564  #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
   565    if( db->flags&SQLITE_ForeignKeys ){
   566      FKey *p;
   567      for(p=sqlite3FkReferences(pTab); p; p=p->pNextTo){
   568        Table *pFrom = p->pFrom;
   569        if( pFrom!=pTab ){
   570          reloadTableSchema(pParse, p->pFrom, pFrom->zName);
   571        }
   572      }
   573    }
   574  #endif
   575  
   576    /* Drop and reload the internal table schema. */
   577    reloadTableSchema(pParse, pTab, zName);
   578  
   579  exit_rename_table:
   580    sqlite3SrcListDelete(db, pSrc);
   581    sqlite3DbFree(db, zName);
   582    db->mDbFlags = savedDbFlags;
   583  }
   584  
   585  /*
   586  ** This function is called after an "ALTER TABLE ... ADD" statement
   587  ** has been parsed. Argument pColDef contains the text of the new
   588  ** column definition.
   589  **
   590  ** The Table structure pParse->pNewTable was extended to include
   591  ** the new column during parsing.
   592  */
   593  void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){
   594    Table *pNew;              /* Copy of pParse->pNewTable */
   595    Table *pTab;              /* Table being altered */
   596    int iDb;                  /* Database number */
   597    const char *zDb;          /* Database name */
   598    const char *zTab;         /* Table name */
   599    char *zCol;               /* Null-terminated column definition */
   600    Column *pCol;             /* The new column */
   601    Expr *pDflt;              /* Default value for the new column */
   602    sqlite3 *db;              /* The database connection; */
   603    Vdbe *v = pParse->pVdbe;  /* The prepared statement under construction */
   604    int r1;                   /* Temporary registers */
   605  
   606    db = pParse->db;
   607    if( pParse->nErr || db->mallocFailed ) return;
   608    assert( v!=0 );
   609    pNew = pParse->pNewTable;
   610    assert( pNew );
   611  
   612    assert( sqlite3BtreeHoldsAllMutexes(db) );
   613    iDb = sqlite3SchemaToIndex(db, pNew->pSchema);
   614    zDb = db->aDb[iDb].zDbSName;
   615    zTab = &pNew->zName[16];  /* Skip the "sqlite_altertab_" prefix on the name */
   616    pCol = &pNew->aCol[pNew->nCol-1];
   617    pDflt = pCol->pDflt;
   618    pTab = sqlite3FindTable(db, zTab, zDb);
   619    assert( pTab );
   620  
   621  #ifndef SQLITE_OMIT_AUTHORIZATION
   622    /* Invoke the authorization callback. */
   623    if( sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, 0) ){
   624      return;
   625    }
   626  #endif
   627  
   628    /* If the default value for the new column was specified with a 
   629    ** literal NULL, then set pDflt to 0. This simplifies checking
   630    ** for an SQL NULL default below.
   631    */
   632    assert( pDflt==0 || pDflt->op==TK_SPAN );
   633    if( pDflt && pDflt->pLeft->op==TK_NULL ){
   634      pDflt = 0;
   635    }
   636  
   637    /* Check that the new column is not specified as PRIMARY KEY or UNIQUE.
   638    ** If there is a NOT NULL constraint, then the default value for the
   639    ** column must not be NULL.
   640    */
   641    if( pCol->colFlags & COLFLAG_PRIMKEY ){
   642      sqlite3ErrorMsg(pParse, "Cannot add a PRIMARY KEY column");
   643      return;
   644    }
   645    if( pNew->pIndex ){
   646      sqlite3ErrorMsg(pParse, "Cannot add a UNIQUE column");
   647      return;
   648    }
   649    if( (db->flags&SQLITE_ForeignKeys) && pNew->pFKey && pDflt ){
   650      sqlite3ErrorMsg(pParse, 
   651          "Cannot add a REFERENCES column with non-NULL default value");
   652      return;
   653    }
   654    if( pCol->notNull && !pDflt ){
   655      sqlite3ErrorMsg(pParse, 
   656          "Cannot add a NOT NULL column with default value NULL");
   657      return;
   658    }
   659  
   660    /* Ensure the default expression is something that sqlite3ValueFromExpr()
   661    ** can handle (i.e. not CURRENT_TIME etc.)
   662    */
   663    if( pDflt ){
   664      sqlite3_value *pVal = 0;
   665      int rc;
   666      rc = sqlite3ValueFromExpr(db, pDflt, SQLITE_UTF8, SQLITE_AFF_BLOB, &pVal);
   667      assert( rc==SQLITE_OK || rc==SQLITE_NOMEM );
   668      if( rc!=SQLITE_OK ){
   669        assert( db->mallocFailed == 1 );
   670        return;
   671      }
   672      if( !pVal ){
   673        sqlite3ErrorMsg(pParse, "Cannot add a column with non-constant default");
   674        return;
   675      }
   676      sqlite3ValueFree(pVal);
   677    }
   678  
   679    /* Modify the CREATE TABLE statement. */
   680    zCol = sqlite3DbStrNDup(db, (char*)pColDef->z, pColDef->n);
   681    if( zCol ){
   682      char *zEnd = &zCol[pColDef->n-1];
   683      u32 savedDbFlags = db->mDbFlags;
   684      while( zEnd>zCol && (*zEnd==';' || sqlite3Isspace(*zEnd)) ){
   685        *zEnd-- = '\0';
   686      }
   687      db->mDbFlags |= DBFLAG_PreferBuiltin;
   688      sqlite3NestedParse(pParse, 
   689          "UPDATE \"%w\".%s SET "
   690            "sql = substr(sql,1,%d) || ', ' || %Q || substr(sql,%d) "
   691          "WHERE type = 'table' AND name = %Q", 
   692        zDb, MASTER_NAME, pNew->addColOffset, zCol, pNew->addColOffset+1,
   693        zTab
   694      );
   695      sqlite3DbFree(db, zCol);
   696      db->mDbFlags = savedDbFlags;
   697    }
   698  
   699    /* Make sure the schema version is at least 3.  But do not upgrade
   700    ** from less than 3 to 4, as that will corrupt any preexisting DESC
   701    ** index.
   702    */
   703    r1 = sqlite3GetTempReg(pParse);
   704    sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, r1, BTREE_FILE_FORMAT);
   705    sqlite3VdbeUsesBtree(v, iDb);
   706    sqlite3VdbeAddOp2(v, OP_AddImm, r1, -2);
   707    sqlite3VdbeAddOp2(v, OP_IfPos, r1, sqlite3VdbeCurrentAddr(v)+2);
   708    VdbeCoverage(v);
   709    sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, 3);
   710    sqlite3ReleaseTempReg(pParse, r1);
   711  
   712    /* Reload the schema of the modified table. */
   713    reloadTableSchema(pParse, pTab, pTab->zName);
   714  }
   715  
   716  /*
   717  ** This function is called by the parser after the table-name in
   718  ** an "ALTER TABLE <table-name> ADD" statement is parsed. Argument 
   719  ** pSrc is the full-name of the table being altered.
   720  **
   721  ** This routine makes a (partial) copy of the Table structure
   722  ** for the table being altered and sets Parse.pNewTable to point
   723  ** to it. Routines called by the parser as the column definition
   724  ** is parsed (i.e. sqlite3AddColumn()) add the new Column data to 
   725  ** the copy. The copy of the Table structure is deleted by tokenize.c 
   726  ** after parsing is finished.
   727  **
   728  ** Routine sqlite3AlterFinishAddColumn() will be called to complete
   729  ** coding the "ALTER TABLE ... ADD" statement.
   730  */
   731  void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){
   732    Table *pNew;
   733    Table *pTab;
   734    Vdbe *v;
   735    int iDb;
   736    int i;
   737    int nAlloc;
   738    sqlite3 *db = pParse->db;
   739  
   740    /* Look up the table being altered. */
   741    assert( pParse->pNewTable==0 );
   742    assert( sqlite3BtreeHoldsAllMutexes(db) );
   743    if( db->mallocFailed ) goto exit_begin_add_column;
   744    pTab = sqlite3LocateTableItem(pParse, 0, &pSrc->a[0]);
   745    if( !pTab ) goto exit_begin_add_column;
   746  
   747  #ifndef SQLITE_OMIT_VIRTUALTABLE
   748    if( IsVirtual(pTab) ){
   749      sqlite3ErrorMsg(pParse, "virtual tables may not be altered");
   750      goto exit_begin_add_column;
   751    }
   752  #endif
   753  
   754    /* Make sure this is not an attempt to ALTER a view. */
   755    if( pTab->pSelect ){
   756      sqlite3ErrorMsg(pParse, "Cannot add a column to a view");
   757      goto exit_begin_add_column;
   758    }
   759    if( SQLITE_OK!=isSystemTable(pParse, pTab->zName) ){
   760      goto exit_begin_add_column;
   761    }
   762  
   763    assert( pTab->addColOffset>0 );
   764    iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
   765  
   766    /* Put a copy of the Table struct in Parse.pNewTable for the
   767    ** sqlite3AddColumn() function and friends to modify.  But modify
   768    ** the name by adding an "sqlite_altertab_" prefix.  By adding this
   769    ** prefix, we insure that the name will not collide with an existing
   770    ** table because user table are not allowed to have the "sqlite_"
   771    ** prefix on their name.
   772    */
   773    pNew = (Table*)sqlite3DbMallocZero(db, sizeof(Table));
   774    if( !pNew ) goto exit_begin_add_column;
   775    pParse->pNewTable = pNew;
   776    pNew->nTabRef = 1;
   777    pNew->nCol = pTab->nCol;
   778    assert( pNew->nCol>0 );
   779    nAlloc = (((pNew->nCol-1)/8)*8)+8;
   780    assert( nAlloc>=pNew->nCol && nAlloc%8==0 && nAlloc-pNew->nCol<8 );
   781    pNew->aCol = (Column*)sqlite3DbMallocZero(db, sizeof(Column)*nAlloc);
   782    pNew->zName = sqlite3MPrintf(db, "sqlite_altertab_%s", pTab->zName);
   783    if( !pNew->aCol || !pNew->zName ){
   784      assert( db->mallocFailed );
   785      goto exit_begin_add_column;
   786    }
   787    memcpy(pNew->aCol, pTab->aCol, sizeof(Column)*pNew->nCol);
   788    for(i=0; i<pNew->nCol; i++){
   789      Column *pCol = &pNew->aCol[i];
   790      pCol->zName = sqlite3DbStrDup(db, pCol->zName);
   791      pCol->zColl = 0;
   792      pCol->pDflt = 0;
   793    }
   794    pNew->pSchema = db->aDb[iDb].pSchema;
   795    pNew->addColOffset = pTab->addColOffset;
   796    pNew->nTabRef = 1;
   797  
   798    /* Begin a transaction and increment the schema cookie.  */
   799    sqlite3BeginWriteOperation(pParse, 0, iDb);
   800    v = sqlite3GetVdbe(pParse);
   801    if( !v ) goto exit_begin_add_column;
   802    sqlite3ChangeCookie(pParse, iDb);
   803  
   804  exit_begin_add_column:
   805    sqlite3SrcListDelete(db, pSrc);
   806    return;
   807  }
   808  #endif  /* SQLITE_ALTER_TABLE */