alter.c.svn-base
上传用户:sunhongbo
上传日期:2022-01-25
资源大小:3010k
文件大小:20k
源码类别:

数据库系统

开发平台:

C/C++

  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. ** $Id: alter.c,v 1.43 2008/03/19 21:45:51 drh Exp $
  16. */
  17. #include "sqliteInt.h"
  18. #include <ctype.h>
  19. /*
  20. ** The code in this file only exists if we are not omitting the
  21. ** ALTER TABLE logic from the build.
  22. */
  23. #ifndef SQLITE_OMIT_ALTERTABLE
  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 argc,
  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.   int token;
  45.   Token tname;
  46.   unsigned char const *zCsr = zSql;
  47.   int len = 0;
  48.   char *zRet;
  49.   sqlite3 *db = sqlite3_context_db_handle(context);
  50.   /* The principle used to locate the table name in the CREATE TABLE 
  51.   ** statement is that the table name is the first token that is immediatedly
  52.   ** followed by a left parenthesis - TK_LP - or "USING" TK_USING.
  53.   */
  54.   if( zSql ){
  55.     do {
  56.       if( !*zCsr ){
  57.         /* Ran out of input before finding an opening bracket. Return NULL. */
  58.         return;
  59.       }
  60.       /* Store the token that zCsr points to in tname. */
  61.       tname.z = zCsr;
  62.       tname.n = len;
  63.       /* Advance zCsr to the next token. Store that token type in 'token',
  64.       ** and its length in 'len' (to be used next iteration of this loop).
  65.       */
  66.       do {
  67.         zCsr += len;
  68.         len = sqlite3GetToken(zCsr, &token);
  69.       } while( token==TK_SPACE );
  70.       assert( len>0 );
  71.     } while( token!=TK_LP && token!=TK_USING );
  72.     zRet = sqlite3MPrintf(db, "%.*s"%w"%s", tname.z - zSql, zSql, 
  73.        zTableName, tname.z+tname.n);
  74.     sqlite3_result_text(context, zRet, -1, sqlite3_free);
  75.   }
  76. }
  77. #ifndef SQLITE_OMIT_TRIGGER
  78. /* This function is used by SQL generated to implement the
  79. ** ALTER TABLE command. The first argument is the text of a CREATE TRIGGER 
  80. ** statement. The second is a table name. The table name in the CREATE 
  81. ** TRIGGER statement is replaced with the third argument and the result 
  82. ** returned. This is analagous to renameTableFunc() above, except for CREATE
  83. ** TRIGGER, not CREATE INDEX and CREATE TABLE.
  84. */
  85. static void renameTriggerFunc(
  86.   sqlite3_context *context,
  87.   int argc,
  88.   sqlite3_value **argv
  89. ){
  90.   unsigned char const *zSql = sqlite3_value_text(argv[0]);
  91.   unsigned char const *zTableName = sqlite3_value_text(argv[1]);
  92.   int token;
  93.   Token tname;
  94.   int dist = 3;
  95.   unsigned char const *zCsr = zSql;
  96.   int len = 0;
  97.   char *zRet;
  98.   sqlite3 *db = sqlite3_context_db_handle(context);
  99.   /* The principle used to locate the table name in the CREATE TRIGGER 
  100.   ** statement is that the table name is the first token that is immediatedly
  101.   ** preceded by either TK_ON or TK_DOT and immediatedly followed by one
  102.   ** of TK_WHEN, TK_BEGIN or TK_FOR.
  103.   */
  104.   if( zSql ){
  105.     do {
  106.       if( !*zCsr ){
  107.         /* Ran out of input before finding the table name. Return NULL. */
  108.         return;
  109.       }
  110.       /* Store the token that zCsr points to in tname. */
  111.       tname.z = zCsr;
  112.       tname.n = len;
  113.       /* Advance zCsr to the next token. Store that token type in 'token',
  114.       ** and its length in 'len' (to be used next iteration of this loop).
  115.       */
  116.       do {
  117.         zCsr += len;
  118.         len = sqlite3GetToken(zCsr, &token);
  119.       }while( token==TK_SPACE );
  120.       assert( len>0 );
  121.       /* Variable 'dist' stores the number of tokens read since the most
  122.       ** recent TK_DOT or TK_ON. This means that when a WHEN, FOR or BEGIN 
  123.       ** token is read and 'dist' equals 2, the condition stated above
  124.       ** to be met.
  125.       **
  126.       ** Note that ON cannot be a database, table or column name, so
  127.       ** there is no need to worry about syntax like 
  128.       ** "CREATE TRIGGER ... ON ON.ON BEGIN ..." etc.
  129.       */
  130.       dist++;
  131.       if( token==TK_DOT || token==TK_ON ){
  132.         dist = 0;
  133.       }
  134.     } while( dist!=2 || (token!=TK_WHEN && token!=TK_FOR && token!=TK_BEGIN) );
  135.     /* Variable tname now contains the token that is the old table-name
  136.     ** in the CREATE TRIGGER statement.
  137.     */
  138.     zRet = sqlite3MPrintf(db, "%.*s"%w"%s", tname.z - zSql, zSql, 
  139.        zTableName, tname.z+tname.n);
  140.     sqlite3_result_text(context, zRet, -1, sqlite3_free);
  141.   }
  142. }
  143. #endif   /* !SQLITE_OMIT_TRIGGER */
  144. /*
  145. ** Register built-in functions used to help implement ALTER TABLE
  146. */
  147. void sqlite3AlterFunctions(sqlite3 *db){
  148.   static const struct {
  149.      char *zName;
  150.      signed char nArg;
  151.      void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
  152.   } aFuncs[] = {
  153.     { "sqlite_rename_table",    2, renameTableFunc},
  154. #ifndef SQLITE_OMIT_TRIGGER
  155.     { "sqlite_rename_trigger",  2, renameTriggerFunc},
  156. #endif
  157.   };
  158.   int i;
  159.   for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
  160.     sqlite3CreateFunc(db, aFuncs[i].zName, aFuncs[i].nArg,
  161.         SQLITE_UTF8, 0, aFuncs[i].xFunc, 0, 0);
  162.   }
  163. }
  164. /*
  165. ** Generate the text of a WHERE expression which can be used to select all
  166. ** temporary triggers on table pTab from the sqlite_temp_master table. If
  167. ** table pTab has no temporary triggers, or is itself stored in the 
  168. ** temporary database, NULL is returned.
  169. */
  170. static char *whereTempTriggers(Parse *pParse, Table *pTab){
  171.   Trigger *pTrig;
  172.   char *zWhere = 0;
  173.   char *tmp = 0;
  174.   const Schema *pTempSchema = pParse->db->aDb[1].pSchema; /* Temp db schema */
  175.   /* If the table is not located in the temp-db (in which case NULL is 
  176.   ** returned, loop through the tables list of triggers. For each trigger
  177.   ** that is not part of the temp-db schema, add a clause to the WHERE 
  178.   ** expression being built up in zWhere.
  179.   */
  180.   if( pTab->pSchema!=pTempSchema ){
  181.     sqlite3 *db = pParse->db;
  182.     for( pTrig=pTab->pTrigger; pTrig; pTrig=pTrig->pNext ){
  183.       if( pTrig->pSchema==pTempSchema ){
  184.         if( !zWhere ){
  185.           zWhere = sqlite3MPrintf(db, "name=%Q", pTrig->name);
  186.         }else{
  187.           tmp = zWhere;
  188.           zWhere = sqlite3MPrintf(db, "%s OR name=%Q", zWhere, pTrig->name);
  189.           sqlite3_free(tmp);
  190.         }
  191.       }
  192.     }
  193.   }
  194.   return zWhere;
  195. }
  196. /*
  197. ** Generate code to drop and reload the internal representation of table
  198. ** pTab from the database, including triggers and temporary triggers.
  199. ** Argument zName is the name of the table in the database schema at
  200. ** the time the generated code is executed. This can be different from
  201. ** pTab->zName if this function is being called to code part of an 
  202. ** "ALTER TABLE RENAME TO" statement.
  203. */
  204. static void reloadTableSchema(Parse *pParse, Table *pTab, const char *zName){
  205.   Vdbe *v;
  206.   char *zWhere;
  207.   int iDb;                   /* Index of database containing pTab */
  208. #ifndef SQLITE_OMIT_TRIGGER
  209.   Trigger *pTrig;
  210. #endif
  211.   v = sqlite3GetVdbe(pParse);
  212.   if( !v ) return;
  213.   assert( sqlite3BtreeHoldsAllMutexes(pParse->db) );
  214.   iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
  215.   assert( iDb>=0 );
  216. #ifndef SQLITE_OMIT_TRIGGER
  217.   /* Drop any table triggers from the internal schema. */
  218.   for(pTrig=pTab->pTrigger; pTrig; pTrig=pTrig->pNext){
  219.     int iTrigDb = sqlite3SchemaToIndex(pParse->db, pTrig->pSchema);
  220.     assert( iTrigDb==iDb || iTrigDb==1 );
  221.     sqlite3VdbeAddOp4(v, OP_DropTrigger, iTrigDb, 0, 0, pTrig->name, 0);
  222.   }
  223. #endif
  224.   /* Drop the table and index from the internal schema */
  225.   sqlite3VdbeAddOp4(v, OP_DropTable, iDb, 0, 0, pTab->zName, 0);
  226.   /* Reload the table, index and permanent trigger schemas. */
  227.   zWhere = sqlite3MPrintf(pParse->db, "tbl_name=%Q", zName);
  228.   if( !zWhere ) return;
  229.   sqlite3VdbeAddOp4(v, OP_ParseSchema, iDb, 0, 0, zWhere, P4_DYNAMIC);
  230. #ifndef SQLITE_OMIT_TRIGGER
  231.   /* Now, if the table is not stored in the temp database, reload any temp 
  232.   ** triggers. Don't use IN(...) in case SQLITE_OMIT_SUBQUERY is defined. 
  233.   */
  234.   if( (zWhere=whereTempTriggers(pParse, pTab))!=0 ){
  235.     sqlite3VdbeAddOp4(v, OP_ParseSchema, 1, 0, 0, zWhere, P4_DYNAMIC);
  236.   }
  237. #endif
  238. }
  239. /*
  240. ** Generate code to implement the "ALTER TABLE xxx RENAME TO yyy" 
  241. ** command. 
  242. */
  243. void sqlite3AlterRenameTable(
  244.   Parse *pParse,            /* Parser context. */
  245.   SrcList *pSrc,            /* The table to rename. */
  246.   Token *pName              /* The new table name. */
  247. ){
  248.   int iDb;                  /* Database that contains the table */
  249.   char *zDb;                /* Name of database iDb */
  250.   Table *pTab;              /* Table being renamed */
  251.   char *zName = 0;          /* NULL-terminated version of pName */ 
  252.   sqlite3 *db = pParse->db; /* Database connection */
  253.   int nTabName;             /* Number of UTF-8 characters in zTabName */
  254.   const char *zTabName;     /* Original name of the table */
  255.   Vdbe *v;
  256. #ifndef SQLITE_OMIT_TRIGGER
  257.   char *zWhere = 0;         /* Where clause to locate temp triggers */
  258. #endif
  259.   int isVirtualRename = 0;  /* True if this is a v-table with an xRename() */
  260.   
  261.   if( db->mallocFailed ) goto exit_rename_table;
  262.   assert( pSrc->nSrc==1 );
  263.   assert( sqlite3BtreeHoldsAllMutexes(pParse->db) );
  264.   pTab = sqlite3LocateTable(pParse, 0, pSrc->a[0].zName, pSrc->a[0].zDatabase);
  265.   if( !pTab ) goto exit_rename_table;
  266.   iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
  267.   zDb = db->aDb[iDb].zName;
  268.   /* Get a NULL terminated version of the new table name. */
  269.   zName = sqlite3NameFromToken(db, pName);
  270.   if( !zName ) goto exit_rename_table;
  271.   /* Check that a table or index named 'zName' does not already exist
  272.   ** in database iDb. If so, this is an error.
  273.   */
  274.   if( sqlite3FindTable(db, zName, zDb) || sqlite3FindIndex(db, zName, zDb) ){
  275.     sqlite3ErrorMsg(pParse, 
  276.         "there is already another table or index with this name: %s", zName);
  277.     goto exit_rename_table;
  278.   }
  279.   /* Make sure it is not a system table being altered, or a reserved name
  280.   ** that the table is being renamed to.
  281.   */
  282.   if( strlen(pTab->zName)>6 && 0==sqlite3StrNICmp(pTab->zName, "sqlite_", 7) ){
  283.     sqlite3ErrorMsg(pParse, "table %s may not be altered", pTab->zName);
  284.     goto exit_rename_table;
  285.   }
  286.   if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){
  287.     goto exit_rename_table;
  288.   }
  289. #ifndef SQLITE_OMIT_VIEW
  290.   if( pTab->pSelect ){
  291.     sqlite3ErrorMsg(pParse, "view %s may not be altered", pTab->zName);
  292.     goto exit_rename_table;
  293.   }
  294. #endif
  295. #ifndef SQLITE_OMIT_AUTHORIZATION
  296.   /* Invoke the authorization callback. */
  297.   if( sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, 0) ){
  298.     goto exit_rename_table;
  299.   }
  300. #endif
  301. #ifndef SQLITE_OMIT_VIRTUALTABLE
  302.   if( sqlite3ViewGetColumnNames(pParse, pTab) ){
  303.     goto exit_rename_table;
  304.   }
  305.   if( IsVirtual(pTab) && pTab->pMod->pModule->xRename ){
  306.     isVirtualRename = 1;
  307.   }
  308. #endif
  309.   /* Begin a transaction and code the VerifyCookie for database iDb. 
  310.   ** Then modify the schema cookie (since the ALTER TABLE modifies the
  311.   ** schema). Open a statement transaction if the table is a virtual
  312.   ** table.
  313.   */
  314.   v = sqlite3GetVdbe(pParse);
  315.   if( v==0 ){
  316.     goto exit_rename_table;
  317.   }
  318.   sqlite3BeginWriteOperation(pParse, isVirtualRename, iDb);
  319.   sqlite3ChangeCookie(pParse, iDb);
  320.   /* If this is a virtual table, invoke the xRename() function if
  321.   ** one is defined. The xRename() callback will modify the names
  322.   ** of any resources used by the v-table implementation (including other
  323.   ** SQLite tables) that are identified by the name of the virtual table.
  324.   */
  325. #ifndef SQLITE_OMIT_VIRTUALTABLE
  326.   if( isVirtualRename ){
  327.     int i = ++pParse->nMem;
  328.     sqlite3VdbeAddOp4(v, OP_String8, 0, i, 0, zName, 0);
  329.     sqlite3VdbeAddOp4(v, OP_VRename, i, 0, 0,(const char*)pTab->pVtab, P4_VTAB);
  330.   }
  331. #endif
  332.   /* figure out how many UTF-8 characters are in zName */
  333.   zTabName = pTab->zName;
  334.   nTabName = sqlite3Utf8CharLen(zTabName, -1);
  335.   /* Modify the sqlite_master table to use the new table name. */
  336.   sqlite3NestedParse(pParse,
  337.       "UPDATE %Q.%s SET "
  338. #ifdef SQLITE_OMIT_TRIGGER
  339.           "sql = sqlite_rename_table(sql, %Q), "
  340. #else
  341.           "sql = CASE "
  342.             "WHEN type = 'trigger' THEN sqlite_rename_trigger(sql, %Q)"
  343.             "ELSE sqlite_rename_table(sql, %Q) END, "
  344. #endif
  345.           "tbl_name = %Q, "
  346.           "name = CASE "
  347.             "WHEN type='table' THEN %Q "
  348.             "WHEN name LIKE 'sqlite_autoindex%%' AND type='index' THEN "
  349.              "'sqlite_autoindex_' || %Q || substr(name,%d+18) "
  350.             "ELSE name END "
  351.       "WHERE tbl_name=%Q AND "
  352.           "(type='table' OR type='index' OR type='trigger');", 
  353.       zDb, SCHEMA_TABLE(iDb), zName, zName, zName, 
  354. #ifndef SQLITE_OMIT_TRIGGER
  355.       zName,
  356. #endif
  357.       zName, nTabName, zTabName
  358.   );
  359. #ifndef SQLITE_OMIT_AUTOINCREMENT
  360.   /* If the sqlite_sequence table exists in this database, then update 
  361.   ** it with the new table name.
  362.   */
  363.   if( sqlite3FindTable(db, "sqlite_sequence", zDb) ){
  364.     sqlite3NestedParse(pParse,
  365.         "UPDATE "%w".sqlite_sequence set name = %Q WHERE name = %Q",
  366.         zDb, zName, pTab->zName);
  367.   }
  368. #endif
  369. #ifndef SQLITE_OMIT_TRIGGER
  370.   /* If there are TEMP triggers on this table, modify the sqlite_temp_master
  371.   ** table. Don't do this if the table being ALTERed is itself located in
  372.   ** the temp database.
  373.   */
  374.   if( (zWhere=whereTempTriggers(pParse, pTab))!=0 ){
  375.     sqlite3NestedParse(pParse, 
  376.         "UPDATE sqlite_temp_master SET "
  377.             "sql = sqlite_rename_trigger(sql, %Q), "
  378.             "tbl_name = %Q "
  379.             "WHERE %s;", zName, zName, zWhere);
  380.     sqlite3_free(zWhere);
  381.   }
  382. #endif
  383.   /* Drop and reload the internal table schema. */
  384.   reloadTableSchema(pParse, pTab, zName);
  385. exit_rename_table:
  386.   sqlite3SrcListDelete(pSrc);
  387.   sqlite3_free(zName);
  388. }
  389. /*
  390. ** This function is called after an "ALTER TABLE ... ADD" statement
  391. ** has been parsed. Argument pColDef contains the text of the new
  392. ** column definition.
  393. **
  394. ** The Table structure pParse->pNewTable was extended to include
  395. ** the new column during parsing.
  396. */
  397. void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){
  398.   Table *pNew;              /* Copy of pParse->pNewTable */
  399.   Table *pTab;              /* Table being altered */
  400.   int iDb;                  /* Database number */
  401.   const char *zDb;          /* Database name */
  402.   const char *zTab;         /* Table name */
  403.   char *zCol;               /* Null-terminated column definition */
  404.   Column *pCol;             /* The new column */
  405.   Expr *pDflt;              /* Default value for the new column */
  406.   sqlite3 *db;              /* The database connection; */
  407.   if( pParse->nErr ) return;
  408.   pNew = pParse->pNewTable;
  409.   assert( pNew );
  410.   db = pParse->db;
  411.   assert( sqlite3BtreeHoldsAllMutexes(db) );
  412.   iDb = sqlite3SchemaToIndex(db, pNew->pSchema);
  413.   zDb = db->aDb[iDb].zName;
  414.   zTab = pNew->zName;
  415.   pCol = &pNew->aCol[pNew->nCol-1];
  416.   pDflt = pCol->pDflt;
  417.   pTab = sqlite3FindTable(db, zTab, zDb);
  418.   assert( pTab );
  419. #ifndef SQLITE_OMIT_AUTHORIZATION
  420.   /* Invoke the authorization callback. */
  421.   if( sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, 0) ){
  422.     return;
  423.   }
  424. #endif
  425.   /* If the default value for the new column was specified with a 
  426.   ** literal NULL, then set pDflt to 0. This simplifies checking
  427.   ** for an SQL NULL default below.
  428.   */
  429.   if( pDflt && pDflt->op==TK_NULL ){
  430.     pDflt = 0;
  431.   }
  432.   /* Check that the new column is not specified as PRIMARY KEY or UNIQUE.
  433.   ** If there is a NOT NULL constraint, then the default value for the
  434.   ** column must not be NULL.
  435.   */
  436.   if( pCol->isPrimKey ){
  437.     sqlite3ErrorMsg(pParse, "Cannot add a PRIMARY KEY column");
  438.     return;
  439.   }
  440.   if( pNew->pIndex ){
  441.     sqlite3ErrorMsg(pParse, "Cannot add a UNIQUE column");
  442.     return;
  443.   }
  444.   if( pCol->notNull && !pDflt ){
  445.     sqlite3ErrorMsg(pParse, 
  446.         "Cannot add a NOT NULL column with default value NULL");
  447.     return;
  448.   }
  449.   /* Ensure the default expression is something that sqlite3ValueFromExpr()
  450.   ** can handle (i.e. not CURRENT_TIME etc.)
  451.   */
  452.   if( pDflt ){
  453.     sqlite3_value *pVal;
  454.     if( sqlite3ValueFromExpr(db, pDflt, SQLITE_UTF8, SQLITE_AFF_NONE, &pVal) ){
  455.       db->mallocFailed = 1;
  456.       return;
  457.     }
  458.     if( !pVal ){
  459.       sqlite3ErrorMsg(pParse, "Cannot add a column with non-constant default");
  460.       return;
  461.     }
  462.     sqlite3ValueFree(pVal);
  463.   }
  464.   /* Modify the CREATE TABLE statement. */
  465.   zCol = sqlite3DbStrNDup(db, (char*)pColDef->z, pColDef->n);
  466.   if( zCol ){
  467.     char *zEnd = &zCol[pColDef->n-1];
  468.     while( (zEnd>zCol && *zEnd==';') || isspace(*(unsigned char *)zEnd) ){
  469.       *zEnd-- = '';
  470.     }
  471.     sqlite3NestedParse(pParse, 
  472.         "UPDATE "%w".%s SET "
  473.           "sql = substr(sql,1,%d) || ', ' || %Q || substr(sql,%d) "
  474.         "WHERE type = 'table' AND name = %Q", 
  475.       zDb, SCHEMA_TABLE(iDb), pNew->addColOffset, zCol, pNew->addColOffset+1,
  476.       zTab
  477.     );
  478.     sqlite3_free(zCol);
  479.   }
  480.   /* If the default value of the new column is NULL, then set the file
  481.   ** format to 2. If the default value of the new column is not NULL,
  482.   ** the file format becomes 3.
  483.   */
  484.   sqlite3MinimumFileFormat(pParse, iDb, pDflt ? 3 : 2);
  485.   /* Reload the schema of the modified table. */
  486.   reloadTableSchema(pParse, pTab, pTab->zName);
  487. }
  488. /*
  489. ** This function is called by the parser after the table-name in
  490. ** an "ALTER TABLE <table-name> ADD" statement is parsed. Argument 
  491. ** pSrc is the full-name of the table being altered.
  492. **
  493. ** This routine makes a (partial) copy of the Table structure
  494. ** for the table being altered and sets Parse.pNewTable to point
  495. ** to it. Routines called by the parser as the column definition
  496. ** is parsed (i.e. sqlite3AddColumn()) add the new Column data to 
  497. ** the copy. The copy of the Table structure is deleted by tokenize.c 
  498. ** after parsing is finished.
  499. **
  500. ** Routine sqlite3AlterFinishAddColumn() will be called to complete
  501. ** coding the "ALTER TABLE ... ADD" statement.
  502. */
  503. void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){
  504.   Table *pNew;
  505.   Table *pTab;
  506.   Vdbe *v;
  507.   int iDb;
  508.   int i;
  509.   int nAlloc;
  510.   sqlite3 *db = pParse->db;
  511.   /* Look up the table being altered. */
  512.   assert( pParse->pNewTable==0 );
  513.   assert( sqlite3BtreeHoldsAllMutexes(db) );
  514.   if( db->mallocFailed ) goto exit_begin_add_column;
  515.   pTab = sqlite3LocateTable(pParse, 0, pSrc->a[0].zName, pSrc->a[0].zDatabase);
  516.   if( !pTab ) goto exit_begin_add_column;
  517. #ifndef SQLITE_OMIT_VIRTUALTABLE
  518.   if( IsVirtual(pTab) ){
  519.     sqlite3ErrorMsg(pParse, "virtual tables may not be altered");
  520.     goto exit_begin_add_column;
  521.   }
  522. #endif
  523.   /* Make sure this is not an attempt to ALTER a view. */
  524.   if( pTab->pSelect ){
  525.     sqlite3ErrorMsg(pParse, "Cannot add a column to a view");
  526.     goto exit_begin_add_column;
  527.   }
  528.   assert( pTab->addColOffset>0 );
  529.   iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
  530.   /* Put a copy of the Table struct in Parse.pNewTable for the
  531.   ** sqlite3AddColumn() function and friends to modify.
  532.   */
  533.   pNew = (Table*)sqlite3DbMallocZero(db, sizeof(Table));
  534.   if( !pNew ) goto exit_begin_add_column;
  535.   pParse->pNewTable = pNew;
  536.   pNew->nRef = 1;
  537.   pNew->nCol = pTab->nCol;
  538.   assert( pNew->nCol>0 );
  539.   nAlloc = (((pNew->nCol-1)/8)*8)+8;
  540.   assert( nAlloc>=pNew->nCol && nAlloc%8==0 && nAlloc-pNew->nCol<8 );
  541.   pNew->aCol = (Column*)sqlite3DbMallocZero(db, sizeof(Column)*nAlloc);
  542.   pNew->zName = sqlite3DbStrDup(db, pTab->zName);
  543.   if( !pNew->aCol || !pNew->zName ){
  544.     db->mallocFailed = 1;
  545.     goto exit_begin_add_column;
  546.   }
  547.   memcpy(pNew->aCol, pTab->aCol, sizeof(Column)*pNew->nCol);
  548.   for(i=0; i<pNew->nCol; i++){
  549.     Column *pCol = &pNew->aCol[i];
  550.     pCol->zName = sqlite3DbStrDup(db, pCol->zName);
  551.     pCol->zColl = 0;
  552.     pCol->zType = 0;
  553.     pCol->pDflt = 0;
  554.   }
  555.   pNew->pSchema = db->aDb[iDb].pSchema;
  556.   pNew->addColOffset = pTab->addColOffset;
  557.   pNew->nRef = 1;
  558.   /* Begin a transaction and increment the schema cookie.  */
  559.   sqlite3BeginWriteOperation(pParse, 0, iDb);
  560.   v = sqlite3GetVdbe(pParse);
  561.   if( !v ) goto exit_begin_add_column;
  562.   sqlite3ChangeCookie(pParse, iDb);
  563. exit_begin_add_column:
  564.   sqlite3SrcListDelete(pSrc);
  565.   return;
  566. }
  567. #endif  /* SQLITE_ALTER_TABLE */