diff options
author | dan <dan@noemail.net> | 2018-08-11 20:38:33 +0000 |
---|---|---|
committer | dan <dan@noemail.net> | 2018-08-11 20:38:33 +0000 |
commit | 404c3ba0d6f646b616ae084bf2dc3cf6f16ef5c8 (patch) | |
tree | 84bea649bcfa6d6be7b449649298be1896e8f786 /src | |
parent | b0c7920d8642ef757c26a09e882ae3608f5b7bd5 (diff) | |
download | sqlite-404c3ba0d6f646b616ae084bf2dc3cf6f16ef5c8.tar.gz sqlite-404c3ba0d6f646b616ae084bf2dc3cf6f16ef5c8.zip |
If the new column name in an ALTER TABLE RENAME COLUMN statement is quoted,
then also use quotes for the column name in the edited SQL statements.
FossilOrigin-Name: ca5184a25f9150540a3e401ef67df0606efa7a294d70e3fa5edad9854003eb36
Diffstat (limited to 'src')
-rw-r--r-- | src/alter.c | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/src/alter.c b/src/alter.c index 887da39dd..6b0400598 100644 --- a/src/alter.c +++ b/src/alter.c @@ -803,6 +803,7 @@ void sqlite3AlterRenameColumn( char *zNew = 0; const char *zDb; int iSchema; + int bQuote; pTab = sqlite3LocateTableItem(pParse, 0, &pSrc->a[0]); if( !pTab ) goto exit_rename_column; @@ -824,14 +825,15 @@ void sqlite3AlterRenameColumn( 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. */ @@ -931,7 +933,7 @@ static RenameToken *renameColumnTokenNext(struct RenameCtx *pCtx){ } /* -** sqlite_rename_table(SQL, iCol, zNew, zTable, zOld) +** sqlite_rename_column(SQL, iCol, bQuote, zNew, zTable, zOld) */ static void renameColumnFunc( sqlite3_context *context, @@ -942,10 +944,11 @@ static void renameColumnFunc( 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; @@ -991,12 +994,9 @@ static void renameColumnFunc( return; } - for(i=0; i<nNew; i++){ - if( sqlite3IsIdChar(zNew[i])==0 ){ - zNew = zQuot; - nNew = nQuot; - break; - } + if( bQuote ){ + zNew = zQuot; + nNew = nQuot; } #ifdef SQLITE_DEBUG @@ -1059,7 +1059,8 @@ static void renameColumnFunc( 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); @@ -1109,7 +1110,7 @@ static void renameColumnFunc( 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 |