Index: src/alter.c ================================================================== --- src/alter.c +++ src/alter.c @@ -96,10 +96,13 @@ int nTabName; /* Number of UTF-8 characters in zTabName */ const char *zTabName; /* Original name of the table */ Vdbe *v; VTable *pVTab = 0; /* Non-zero if this is a v-tab with an xRename() */ u32 savedDbFlags; /* Saved value of db->mDbFlags */ +#ifndef SQLITE_OMIT_AUTHORIZATION + sqlite3_xauth xAuth = db->xAuth; +#endif savedDbFlags = db->mDbFlags; if( NEVER(db->mallocFailed) ) goto exit_rename_table; assert( pSrc->nSrc==1 ); assert( sqlite3BtreeHoldsAllMutexes(pParse->db) ); @@ -143,10 +146,11 @@ #ifndef SQLITE_OMIT_AUTHORIZATION /* Invoke the authorization callback. */ if( sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, 0) ){ goto exit_rename_table; } + db->xAuth = 0; #endif #ifndef SQLITE_OMIT_VIRTUALTABLE if( sqlite3ViewGetColumnNames(pParse, pTab) ){ goto exit_rename_table; @@ -242,10 +246,13 @@ renameReloadSchema(pParse, iDb); renameTestSchema(pParse, zDb, iDb==1); exit_rename_table: +#ifndef SQLITE_OMIT_AUTHORIZATION + db->xAuth = xAuth; +#endif sqlite3SrcListDelete(db, pSrc); sqlite3DbFree(db, zName); db->mDbFlags = savedDbFlags; } @@ -345,10 +352,14 @@ /* Modify the CREATE TABLE statement. */ zCol = sqlite3DbStrNDup(db, (char*)pColDef->z, pColDef->n); if( zCol ){ char *zEnd = &zCol[pColDef->n-1]; u32 savedDbFlags = db->mDbFlags; +#ifndef SQLITE_OMIT_AUTHORIZATION + sqlite3_xauth xAuth = db->xAuth; + db->xAuth = 0; +#endif while( zEnd>zCol && (*zEnd==';' || sqlite3Isspace(*zEnd)) ){ *zEnd-- = '\0'; } db->mDbFlags |= DBFLAG_PreferBuiltin; sqlite3NestedParse(pParse, @@ -358,10 +369,13 @@ zDb, MASTER_NAME, pNew->addColOffset, zCol, pNew->addColOffset+1, zTab ); sqlite3DbFree(db, zCol); db->mDbFlags = savedDbFlags; +#ifndef SQLITE_OMIT_AUTHORIZATION + db->xAuth = xAuth; +#endif } /* Make sure the schema version is at least 3. But do not upgrade ** from less than 3 to 4, as that will corrupt any preexisting DESC ** index. @@ -518,10 +532,13 @@ char *zOld = 0; /* Old column name */ char *zNew = 0; /* New column name */ const char *zDb; /* Name of schema containing the table */ int iSchema; /* Index of the schema */ int bQuote; /* True to quote the new name */ +#ifndef SQLITE_OMIT_AUTHORIZATION + sqlite3_xauth xAuth = db->xAuth; +#endif /* Locate the table to be altered */ pTab = sqlite3LocateTableItem(pParse, 0, &pSrc->a[0]); if( !pTab ) goto exit_rename_column; @@ -537,10 +554,11 @@ #ifndef SQLITE_OMIT_AUTHORIZATION /* Invoke the authorization callback. */ if( sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, 0) ){ goto exit_rename_column; } + db->xAuth = 0; #endif /* Make sure the old name really is a column name in the table to be ** altered. Set iCol to be the index of the column being renamed */ zOld = sqlite3NameFromToken(db, pOld); @@ -582,10 +600,13 @@ /* Drop and reload the database schema. */ renameReloadSchema(pParse, iSchema); renameTestSchema(pParse, zDb, iSchema==1); exit_rename_column: +#ifndef SQLITE_OMIT_AUTHORIZATION + db->xAuth = xAuth; +#endif sqlite3SrcListDelete(db, pSrc); sqlite3DbFree(db, zOld); sqlite3DbFree(db, zNew); return; } Index: test/alterauth2.test ================================================================== --- test/alterauth2.test +++ test/alterauth2.test @@ -53,46 +53,27 @@ } do_auth_test 1.1 { ALTER TABLE t1 RENAME TO t2; } { - {SQLITE_ALTER_TABLE main t1 {} {}} - {SQLITE_FUNCTION {} like {} {}} - {SQLITE_FUNCTION {} sqlite_rename_table {} {}} - {SQLITE_FUNCTION {} sqlite_rename_test {} {}} - {SQLITE_FUNCTION {} substr {} {}} - {SQLITE_READ sqlite_master name main {}} - {SQLITE_READ sqlite_master sql main {}} - {SQLITE_READ sqlite_master tbl_name main {}} - {SQLITE_READ sqlite_master type main {}} - {SQLITE_READ sqlite_temp_master name temp {}} - {SQLITE_READ sqlite_temp_master sql temp {}} - {SQLITE_READ sqlite_temp_master tbl_name temp {}} - {SQLITE_READ sqlite_temp_master type temp {}} - {SQLITE_SELECT {} {} {} {}} - {SQLITE_UPDATE sqlite_master name main {}} - {SQLITE_UPDATE sqlite_master sql main {}} - {SQLITE_UPDATE sqlite_master tbl_name main {}} - {SQLITE_UPDATE sqlite_temp_master sql temp {}} - {SQLITE_UPDATE sqlite_temp_master tbl_name temp {}} + {SQLITE_ALTER_TABLE main t1 {} {}} } do_auth_test 1.2 { ALTER TABLE t2 RENAME a TO aaa; } { {SQLITE_ALTER_TABLE main t2 {} {}} - {SQLITE_FUNCTION {} like {} {}} - {SQLITE_FUNCTION {} sqlite_rename_column {} {}} - {SQLITE_FUNCTION {} sqlite_rename_test {} {}} - {SQLITE_READ sqlite_master name main {}} - {SQLITE_READ sqlite_master sql main {}} - {SQLITE_READ sqlite_master tbl_name main {}} - {SQLITE_READ sqlite_master type main {}} - {SQLITE_READ sqlite_temp_master name temp {}} - {SQLITE_READ sqlite_temp_master sql temp {}} - {SQLITE_READ sqlite_temp_master type temp {}} - {SQLITE_SELECT {} {} {} {}} - {SQLITE_UPDATE sqlite_master sql main {}} - {SQLITE_UPDATE sqlite_temp_master sql temp {}} +} + +do_auth_test 1.3 { + ALTER TABLE t2 ADD COLUMN d; +} { + {SQLITE_ALTER_TABLE main t2 {} {}} +} + +do_auth_test 1.4 { + ALTER TABLE t2 RENAME TO t3; +} { + {SQLITE_ALTER_TABLE main t2 {} {}} } finish_test