diff options
author | dan <Dan Kennedy> | 2021-04-06 21:20:39 +0000 |
---|---|---|
committer | dan <Dan Kennedy> | 2021-04-06 21:20:39 +0000 |
commit | cc26301ec37d106ea6dcf64f61a8ef0bafbfcedb (patch) | |
tree | 9502c1edc2b8525ba74543ebe5ead88dca9fcdf1 /src/alter.c | |
parent | 5a9fd231eabc51b95ab6896d6f8268f643bf8efd (diff) | |
download | sqlite-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.c | 10 |
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); |