aboutsummaryrefslogtreecommitdiff
path: root/src/alter.c
diff options
context:
space:
mode:
authordan <Dan Kennedy>2021-04-06 21:20:39 +0000
committerdan <Dan Kennedy>2021-04-06 21:20:39 +0000
commitcc26301ec37d106ea6dcf64f61a8ef0bafbfcedb (patch)
tree9502c1edc2b8525ba74543ebe5ead88dca9fcdf1 /src/alter.c
parent5a9fd231eabc51b95ab6896d6f8268f643bf8efd (diff)
downloadsqlite-cc26301ec37d106ea6dcf64f61a8ef0bafbfcedb.tar.gz
sqlite-cc26301ec37d106ea6dcf64f61a8ef0bafbfcedb.zip
Modify the drop column code to handle WITHOUT ROWID tables for which a single column appears more than once in the primary key.
FossilOrigin-Name: e0d2507021c5a04016c442f954b542c0920678737ae7c710eb8ac50d6337db1c
Diffstat (limited to 'src/alter.c')
-rw-r--r--src/alter.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/alter.c b/src/alter.c
index ae1eb6bec..043b47f6d 100644
--- a/src/alter.c
+++ b/src/alter.c
@@ -2096,18 +2096,25 @@ void sqlite3AlterDropColumn(Parse *pParse, SrcList *pSrc, Token *pName){
sqlite3OpenTable(pParse, iCur, iDb, pTab, OP_OpenWrite);
addr = sqlite3VdbeAddOp1(v, OP_Rewind, iCur); VdbeCoverage(v);
reg = ++pParse->nMem;
- pParse->nMem += pTab->nCol;
if( HasRowid(pTab) ){
sqlite3VdbeAddOp2(v, OP_Rowid, iCur, reg);
+ pParse->nMem += pTab->nCol;
}else{
pPk = sqlite3PrimaryKeyIndex(pTab);
+ pParse->nMem += pPk->nColumn;
+ for(i=0; i<pPk->nKeyCol; i++){
+ sqlite3VdbeAddOp3(v, OP_Column, iCur, i, reg+i+1);
+ }
+ nField = pPk->nKeyCol;
}
+ regRec = ++pParse->nMem;
for(i=0; i<pTab->nCol; i++){
if( i!=iCol && (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL)==0 ){
int regOut;
if( pPk ){
int iPos = sqlite3TableColumnToIndex(pPk, i);
int iColPos = sqlite3TableColumnToIndex(pPk, iCol);
+ if( iPos<pPk->nKeyCol ) continue;
regOut = reg+1+iPos-(iPos>iColPos);
}else{
regOut = reg+1+nField;
@@ -2116,7 +2123,6 @@ void sqlite3AlterDropColumn(Parse *pParse, SrcList *pSrc, Token *pName){
nField++;
}
}
- regRec = reg + pTab->nCol;
sqlite3VdbeAddOp3(v, OP_MakeRecord, reg+1, nField, regRec);
if( pPk ){
sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iCur, regRec, reg+1, pPk->nKeyCol);