Index: src/alter.c ================================================================== --- src/alter.c +++ src/alter.c @@ -829,13 +829,16 @@ "sql = sqlite_rename_column(sql, %d, %Q, %Q, %Q) " "WHERE type = 'table' OR (type='index' AND tbl_name = %Q AND sql!='')", zDb, MASTER_NAME, iCol, zNew, pTab->zName, zOld, pTab->zName ); - /* Drop and reload the internal table schema. */ - sqlite3ChangeCookie(pParse, iSchema); - reloadTableSchema(pParse, pTab, pTab->zName); + /* Drop and reload the database schema. */ + if( db->mallocFailed==0 ){ + assert( pParse->pVdbe ); + sqlite3ChangeCookie(pParse, iSchema); + sqlite3VdbeAddParseSchemaOp(pParse->pVdbe, iSchema, 0); + } exit_rename_column: sqlite3SrcListDelete(db, pSrc); sqlite3DbFree(db, zOld); sqlite3DbFree(db, zNew); Index: src/prepare.c ================================================================== --- src/prepare.c +++ src/prepare.c @@ -130,11 +130,11 @@ ** database file is given by iDb. iDb==0 is used for the main ** database. iDb==1 should never be used. iDb>=2 is used for ** auxiliary databases. Return one of the SQLITE_ error codes to ** indicate success or failure. */ -static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){ +int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){ int rc; int i; #ifndef SQLITE_OMIT_DEPRECATED int size; #endif Index: src/sqliteInt.h ================================================================== --- src/sqliteInt.h +++ src/sqliteInt.h @@ -3797,10 +3797,11 @@ void sqlite3ExprListSetSpan(Parse*,ExprList*,const char*,const char*); void sqlite3ExprListDelete(sqlite3*, ExprList*); u32 sqlite3ExprListFlags(const ExprList*); int sqlite3Init(sqlite3*, char**); int sqlite3InitCallback(void*, int, char**, char**); +int sqlite3InitOne(sqlite3*, int, char**); void sqlite3Pragma(Parse*,Token*,Token*,Token*,int); #ifndef SQLITE_OMIT_VIRTUALTABLE Module *sqlite3PragmaVtabRegister(sqlite3*,const char *zName); #endif void sqlite3ResetAllSchemasOfConnection(sqlite3*); Index: src/vdbe.c ================================================================== --- src/vdbe.c +++ src/vdbe.c @@ -5744,10 +5744,18 @@ #endif iDb = pOp->p1; assert( iDb>=0 && iDbnDb ); assert( DbHasProperty(db, iDb, DB_SchemaLoaded) ); + +#ifndef SQLITE_OMIT_ALTERTABLE + if( pOp->p4.z==0 ){ + sqlite3SchemaClear(db->aDb[iDb].pSchema); + rc = sqlite3InitOne(db, iDb, &p->zErrMsg); + db->mDbFlags |= DBFLAG_SchemaChange; + }else +#endif /* Used to be a conditional */ { zMaster = MASTER_NAME; initData.db = db; initData.iDb = pOp->p1; initData.pzErrMsg = &p->zErrMsg; Index: test/altercol.test ================================================================== --- test/altercol.test +++ test/altercol.test @@ -148,11 +148,11 @@ } { {CREATE TABLE c1(a, b, FOREIGN KEY (a, b) REFERENCES p1(c, "silly name"))} {CREATE TABLE p1(c, "silly name", PRIMARY KEY(c, "silly name"))} } -# do_execsql_test 4.2 { INSERT INTO c1 VALUES(1, 2); } +do_execsql_test 4.2 { INSERT INTO c1 VALUES(1, 2); } do_execsql_test 4.3 { CREATE TABLE c2(a, b, FOREIGN KEY (a, b) REFERENCES p1); }