Index: src/alter.c ================================================================== --- src/alter.c +++ src/alter.c @@ -801,10 +801,11 @@ int iCol; /* Index of column being renamed */ char *zOld = 0; char *zNew = 0; const char *zDb; int iSchema; + int bQuote; pTab = sqlite3LocateTableItem(pParse, 0, &pSrc->a[0]); if( !pTab ) goto exit_rename_column; if( SQLITE_OK!=isSystemTable(pParse, pTab->zName) ) goto exit_rename_column; @@ -822,18 +823,19 @@ goto exit_rename_column; } zNew = sqlite3NameFromToken(db, pNew); if( !zNew ) goto exit_rename_column; - + assert( pNew->n>0 ); + bQuote = sqlite3Isquote(pNew->z[0]); sqlite3NestedParse(pParse, "UPDATE \"%w\".%s SET " - "sql = sqlite_rename_column(sql, %d, %Q, %Q, %Q) " + "sql = sqlite_rename_column(sql, %d, %d, %Q, %Q, %Q) " "WHERE name NOT LIKE 'sqlite_%%' AND (" " type = 'table' OR (type='index' AND tbl_name = %Q)" ")", - zDb, MASTER_NAME, iCol, zNew, pTab->zName, zOld, pTab->zName + zDb, MASTER_NAME, iCol, bQuote, zNew, pTab->zName, zOld, pTab->zName ); /* Drop and reload the database schema. */ if( pParse->pVdbe ){ sqlite3ChangeCookie(pParse, iSchema); @@ -929,11 +931,11 @@ return pBest; } /* -** sqlite_rename_table(SQL, iCol, zNew, zTable, zOld) +** sqlite_rename_column(SQL, iCol, bQuote, zNew, zTable, zOld) */ static void renameColumnFunc( sqlite3_context *context, int NotUsed, sqlite3_value **argv @@ -940,14 +942,15 @@ ){ sqlite3 *db = sqlite3_context_db_handle(context); struct RenameCtx sCtx; const char *zSql = (const char*)sqlite3_value_text(argv[0]); int nSql = sqlite3_value_bytes(argv[0]); - const char *zNew = (const char*)sqlite3_value_text(argv[2]); - int nNew = sqlite3_value_bytes(argv[2]); - const char *zTable = (const char*)sqlite3_value_text(argv[3]); - const char *zOld = (const char*)sqlite3_value_text(argv[4]); + int bQuote = sqlite3_value_int(argv[2]); + const char *zNew = (const char*)sqlite3_value_text(argv[3]); + int nNew = sqlite3_value_bytes(argv[3]); + const char *zTable = (const char*)sqlite3_value_text(argv[4]); + const char *zOld = (const char*)sqlite3_value_text(argv[5]); int rc; char *zErr = 0; Parse sParse; Walker sWalker; @@ -989,16 +992,13 @@ sqlite3DbFree(db, zErr); sqlite3_free(zQuot); return; } - for(i=0; iaColExpr); sqlite3WalkExpr(&sWalker, sParse.pNewIndex->pPartIdxWhere); } - zOut = sqlite3DbMallocZero(db, nSql + sCtx.nList*nNew + 1); + assert( nQuot>=nNew ); + zOut = sqlite3DbMallocZero(db, nSql + sCtx.nList*nQuot + 1); if( zOut ){ int nOut = nSql; memcpy(zOut, zSql, nSql); while( sCtx.pList ){ int iOff; /* Offset of token to replace in zOut */ @@ -1107,11 +1108,11 @@ ** Register built-in functions used to help implement ALTER TABLE */ void sqlite3AlterFunctions(void){ static FuncDef aAlterTableFuncs[] = { FUNCTION(sqlite_rename_table, 2, 0, 0, renameTableFunc), - FUNCTION(sqlite_rename_column, 5, 0, 0, renameColumnFunc), + FUNCTION(sqlite_rename_column, 6, 0, 0, renameColumnFunc), #ifndef SQLITE_OMIT_TRIGGER FUNCTION(sqlite_rename_trigger, 2, 0, 0, renameTriggerFunc), #endif #ifndef SQLITE_OMIT_FOREIGN_KEY FUNCTION(sqlite_rename_parent, 3, 0, 0, renameParentFunc), Index: test/altercol.test ================================================================== --- test/altercol.test +++ test/altercol.test @@ -197,8 +197,16 @@ } do_execsql_test 6.1 { ALTER TABLE "blob" RENAME COLUMN "rid" TO "a1"; } + +do_catchsql_test 6.2 { + ALTER TABLE "blob" RENAME COLUMN "a1" TO [where]; +} {0 {}} + +do_execsql_test 6.3 { + SELECT "where" FROM blob; +} {} finish_test