diff options
author | drh <drh@noemail.net> | 2019-10-16 22:01:56 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2019-10-16 22:01:56 +0000 |
commit | ab45fc041389b937cf82c20bec231905105f829d (patch) | |
tree | bb49f4b3680cd8a86afe9ca2844380222200ef27 /src/expr.c | |
parent | c27ea2ae8df4207e6b2479b46904c73d7cd1775f (diff) | |
download | sqlite-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.c | 17 |
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) ){ |