aboutsummaryrefslogtreecommitdiff
path: root/src/expr.c
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2019-10-16 22:01:56 +0000
committerdrh <drh@noemail.net>2019-10-16 22:01:56 +0000
commitab45fc041389b937cf82c20bec231905105f829d (patch)
treebb49f4b3680cd8a86afe9ca2844380222200ef27 /src/expr.c
parentc27ea2ae8df4207e6b2479b46904c73d7cd1775f (diff)
downloadsqlite-ab45fc041389b937cf82c20bec231905105f829d.tar.gz
sqlite-ab45fc041389b937cf82c20bec231905105f829d.zip
INSERT with named columns for a table with generated columns.
FossilOrigin-Name: 64db39f92d68d1b9f23e48af35e16b969c38b58041fbe900066eeb3ddb291cef
Diffstat (limited to 'src/expr.c')
-rw-r--r--src/expr.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/src/expr.c b/src/expr.c
index e02e14658..c21006b11 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -3381,6 +3381,7 @@ void sqlite3ExprCodeGetColumnOfTable(
int regOut /* Extract the value into this register */
){
Vdbe *v = pParse->pVdbe;
+ Column *pCol;
assert( v!=0 );
if( pTab==0 ){
sqlite3VdbeAddOp3(v, OP_Column, iTabCur, iCol, regOut);
@@ -3395,11 +3396,17 @@ void sqlite3ExprCodeGetColumnOfTable(
op = OP_VColumn;
x = iCol;
#ifndef SQLITE_OMIT_GENERATED_COLUMNS
- }else if( pTab->aCol[iCol].colFlags & COLFLAG_VIRTUAL ){
- int savedSelfTab = pParse->iSelfTab;
- pParse->iSelfTab = iTabCur+1;
- sqlite3ExprCode(pParse, pTab->aCol[iCol].pDflt, regOut);
- pParse->iSelfTab = savedSelfTab;
+ }else if( (pCol = &pTab->aCol[iCol])->colFlags & COLFLAG_VIRTUAL ){
+ if( pCol->colFlags & COLFLAG_BUSY ){
+ sqlite3ErrorMsg(pParse, "generated column loop on \"%s\"", pCol->zName);
+ }else{
+ int savedSelfTab = pParse->iSelfTab;
+ pCol->colFlags |= COLFLAG_BUSY;
+ pParse->iSelfTab = iTabCur+1;
+ sqlite3ExprCode(pParse, pTab->aCol[iCol].pDflt, regOut);
+ pParse->iSelfTab = savedSelfTab;
+ pCol->colFlags &= ~COLFLAG_BUSY;
+ }
return;
#endif
}else if( !HasRowid(pTab) ){