aboutsummaryrefslogtreecommitdiff
path: root/src/expr.c
diff options
context:
space:
mode:
authordan <dan@noemail.net>2014-01-13 15:12:23 +0000
committerdan <dan@noemail.net>2014-01-13 15:12:23 +0000
commit4e9119d9e8bc3ed4c75b2c77f9ec80c6cf5f5463 (patch)
tree79d744636a391970fb3e679e1760079c5ac96706 /src/expr.c
parent7d562dbe023a06bc8b7116c5415c5cb9b6a25cfc (diff)
downloadsqlite-4e9119d9e8bc3ed4c75b2c77f9ec80c6cf5f5463.tar.gz
sqlite-4e9119d9e8bc3ed4c75b2c77f9ec80c6cf5f5463.zip
Add code to handle non-recursive CTEs in the same way as SQL views.
FossilOrigin-Name: a26f399ba485e8127c276c5f103ec6c555e11734
Diffstat (limited to 'src/expr.c')
-rw-r--r--src/expr.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/expr.c b/src/expr.c
index aad6cd1cd..d0ea28002 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -895,6 +895,24 @@ static Expr *exprDup(sqlite3 *db, Expr *p, int flags, u8 **pzBuffer){
return pNew;
}
+With *withDup(sqlite3 *db, With *p){
+ With *pRet = 0;
+ if( p ){
+ int nByte = sizeof(*p) + sizeof(p->a[0]) * (p->nCte-1);
+ pRet = sqlite3DbMallocZero(db, nByte);
+ if( pRet ){
+ int i;
+ pRet->nCte = p->nCte;
+ for(i=0; i<p->nCte; i++){
+ pRet->a[i].pSelect = sqlite3SelectDup(db, p->a[i].pSelect, 0);
+ pRet->a[i].pCols = sqlite3ExprListDup(db, p->a[i].pCols, 0);
+ pRet->a[i].zName = sqlite3DbStrDup(db, p->a[i].zName);
+ }
+ }
+ }
+ return pRet;
+}
+
/*
** The following group of routines make deep copies of expressions,
** expression lists, ID lists, and select statements. The copies can
@@ -1036,6 +1054,7 @@ Select *sqlite3SelectDup(sqlite3 *db, Select *p, int flags){
pNew->addrOpenEphm[0] = -1;
pNew->addrOpenEphm[1] = -1;
pNew->addrOpenEphm[2] = -1;
+ pNew->pWith = withDup(db, p->pWith);
return pNew;
}
#else