diff options
Diffstat (limited to 'src/insert.c')
-rw-r--r-- | src/insert.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/src/insert.c b/src/insert.c index d9078b89d..f2ed9d9a3 100644 --- a/src/insert.c +++ b/src/insert.c @@ -37,7 +37,8 @@ void sqlite3OpenTable( sqlite3TableLock(pParse, iDb, pTab->tnum, (opcode==OP_OpenWrite)?1:0, pTab->zName); if( HasRowid(pTab) ){ - sqlite3VdbeAddOp4Int(v, opcode, iCur, pTab->tnum, iDb, pTab->nCol); + sqlite3VdbeAddOp4Int(v, opcode, iCur, pTab->tnum, iDb, + pTab->nCol - pTab->nVCol); VdbeComment((v, "%s", pTab->zName)); }else{ Index *pPk = sqlite3PrimaryKeyIndex(pTab); @@ -673,6 +674,14 @@ void sqlite3Insert( if( j==pTab->iPKey ){ ipkColumn = i; assert( !withoutRowid ); } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( pTab->aCol[j].colFlags & (COLFLAG_STORED|COLFLAG_VIRTUAL) ){ + sqlite3ErrorMsg(pParse, + "cannot INSERT into generated column \"%s\"", + pTab->aCol[j].zName); + goto insert_cleanup; + } +#endif break; } } @@ -788,7 +797,7 @@ void sqlite3Insert( ** of columns to be inserted into the table. */ for(i=0; i<pTab->nCol; i++){ - nHidden += (IsHiddenColumn(&pTab->aCol[i]) ? 1 : 0); + if( pTab->aCol[i].colFlags & COLFLAG_NOINSERT ) nHidden++; } if( pColumn==0 && nColumn && nColumn!=(pTab->nCol-nHidden) ){ sqlite3ErrorMsg(pParse, @@ -1006,9 +1015,12 @@ void sqlite3Insert( continue; } if( pColumn==0 ){ - if( IsHiddenColumn(&pTab->aCol[i]) ){ + if( pTab->aCol[i].colFlags & COLFLAG_NOINSERT ){ j = -1; nHidden++; + if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ){ + continue; + } }else{ j = i - nHidden; } @@ -1862,7 +1874,8 @@ void sqlite3GenerateConstraintChecks( /* Generate the table record */ if( HasRowid(pTab) ){ int regRec = aRegIdx[ix]; - sqlite3VdbeAddOp3(v, OP_MakeRecord, regNewData+1, pTab->nCol, regRec); + sqlite3VdbeAddOp3(v, OP_MakeRecord, regNewData+1, + pTab->nCol-pTab->nVCol, regRec); sqlite3SetMakeRecordP5(v, pTab); if( !bAffinityDone ){ sqlite3TableAffinity(v, pTab, 0); |