diff options
author | drh <drh@noemail.net> | 2017-08-10 15:19:39 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2017-08-10 15:19:39 +0000 |
commit | e3740f272bf8fc7439d64e211c3093ff55a8c21c (patch) | |
tree | 74afd5b05b99cdc8f7d784fc277fe453e471c360 /src/update.c | |
parent | 6fa9375c019c66b237a33ede0dfafedde1d2f3ba (diff) | |
download | sqlite-e3740f272bf8fc7439d64e211c3093ff55a8c21c.tar.gz sqlite-e3740f272bf8fc7439d64e211c3093ff55a8c21c.zip |
Experimental changes that allow a WITHOUT ROWID virtual table to be writable
as long as it has only a single-column PRIMARY KEY.
FossilOrigin-Name: ab9ee4c1e64c09c7130e385a23d043d78bad95dff5509c7adc9b992350a4a537
Diffstat (limited to 'src/update.c')
-rw-r--r-- | src/update.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/src/update.c b/src/update.c index fa8885be6..e69efdb6b 100644 --- a/src/update.c +++ b/src/update.c @@ -803,12 +803,6 @@ static void updateVirtualTable( if( pWInfo==0 ) return; /* Populate the argument registers. */ - sqlite3VdbeAddOp2(v, OP_Rowid, iCsr, regArg); - if( pRowid ){ - sqlite3ExprCode(pParse, pRowid, regArg+1); - }else{ - sqlite3VdbeAddOp2(v, OP_Rowid, iCsr, regArg+1); - } for(i=0; i<pTab->nCol; i++){ if( aXRef[i]>=0 ){ sqlite3ExprCode(pParse, pChanges->a[aXRef[i]].pExpr, regArg+2+i); @@ -816,6 +810,23 @@ static void updateVirtualTable( sqlite3VdbeAddOp3(v, OP_VColumn, iCsr, i, regArg+2+i); } } + if( HasRowid(pTab) ){ + sqlite3VdbeAddOp2(v, OP_Rowid, iCsr, regArg); + if( pRowid ){ + sqlite3ExprCode(pParse, pRowid, regArg+1); + }else{ + sqlite3VdbeAddOp2(v, OP_Rowid, iCsr, regArg+1); + } + }else{ + Index *pPk; /* PRIMARY KEY index */ + i16 iPk; /* PRIMARY KEY column */ + pPk = sqlite3PrimaryKeyIndex(pTab); + assert( pPk!=0 ); + assert( pPk->nKeyCol==1 ); + iPk = pPk->aiColumn[0]; + sqlite3VdbeAddOp3(v, OP_VColumn, iCsr, iPk, regArg); + sqlite3VdbeAddOp2(v, OP_SCopy, regArg+2+iPk, regArg+1); + } bOnePass = sqlite3WhereOkOnePass(pWInfo, aDummy); |