aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordan <dan@noemail.net>2018-08-11 20:38:33 +0000
committerdan <dan@noemail.net>2018-08-11 20:38:33 +0000
commit404c3ba0d6f646b616ae084bf2dc3cf6f16ef5c8 (patch)
tree84bea649bcfa6d6be7b449649298be1896e8f786 /src
parentb0c7920d8642ef757c26a09e882ae3608f5b7bd5 (diff)
downloadsqlite-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.c33
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