aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordrh <>2021-10-07 23:04:50 +0000
committerdrh <>2021-10-07 23:04:50 +0000
commitdbfbb5a0c53d19d38249d1562a0f48286d697fb1 (patch)
tree14e84c347b8f9b982e0d99df15efe3d94136b39a /src
parent477572b9f1afc0d4f377554b64ad2c2c9e3146ac (diff)
downloadsqlite-dbfbb5a0c53d19d38249d1562a0f48286d697fb1.tar.gz
sqlite-dbfbb5a0c53d19d38249d1562a0f48286d697fb1.zip
New assert() statements to protect the u1 and u2 unions of SrcList.
FossilOrigin-Name: 9b91fbcfcc14048f7d0755d47d9b7f9212fa2eaa6f3c04f417fa16c3a47943bf
Diffstat (limited to 'src')
-rw-r--r--src/build.c1
-rw-r--r--src/delete.c1
-rw-r--r--src/select.c2
-rw-r--r--src/sqliteInt.h5
-rw-r--r--src/where.c1
5 files changed, 8 insertions, 2 deletions
diff --git a/src/build.c b/src/build.c
index 58762bf37..1bf082712 100644
--- a/src/build.c
+++ b/src/build.c
@@ -4927,6 +4927,7 @@ void sqlite3SrcListIndexedBy(Parse *pParse, SrcList *p, Token *pIndexedBy){
}else{
pItem->u1.zIndexedBy = sqlite3NameFromToken(pParse->db, pIndexedBy);
pItem->fg.isIndexedBy = 1;
+ assert( pItem->fg.isCte==0 ); /* No collision on union u2 */
}
}
}
diff --git a/src/delete.c b/src/delete.c
index 0debce3cb..e2b283ea4 100644
--- a/src/delete.c
+++ b/src/delete.c
@@ -210,6 +210,7 @@ Expr *sqlite3LimitWhere(
pSelectSrc = sqlite3SrcListDup(db, pSrc, 0);
pSrc->a[0].pTab = pTab;
if( pSrc->a[0].fg.isIndexedBy ){
+ assert( pSrc->a[0].fg.isCte==0 );
pSrc->a[0].u2.pIBIndex = 0;
pSrc->a[0].fg.isIndexedBy = 0;
sqlite3DbFree(db, pSrc->a[0].u1.zIndexedBy);
diff --git a/src/select.c b/src/select.c
index e846a0220..13ed20f6c 100644
--- a/src/select.c
+++ b/src/select.c
@@ -4995,6 +4995,7 @@ int sqlite3IndexedByLookup(Parse *pParse, SrcItem *pFrom){
pParse->checkSchema = 1;
return SQLITE_ERROR;
}
+ assert( pFrom->fg.isCte==0 );
pFrom->u2.pIBIndex = pIdx;
return SQLITE_OK;
}
@@ -5252,6 +5253,7 @@ static int resolveFromTermToCte(
if( db->mallocFailed ) return 2;
pFrom->pSelect->selFlags |= SF_CopyCte;
assert( pFrom->pSelect );
+ assert( pFrom->fg.isIndexedBy==0 ); /* Prevent collision in union u2 */
pFrom->fg.isCte = 1;
pFrom->u2.pCteUse = pCteUse;
pCteUse->nUse++;
diff --git a/src/sqliteInt.h b/src/sqliteInt.h
index 009742c4d..f51743168 100644
--- a/src/sqliteInt.h
+++ b/src/sqliteInt.h
@@ -2975,11 +2975,12 @@ struct ExprList {
unsigned bSorterRef :1; /* Defer evaluation until after sorting */
unsigned bNulls: 1; /* True if explicit "NULLS FIRST/LAST" */
union {
- struct {
+ struct { /* Used by any ExprList other than Parse.pConsExpr */
u16 iOrderByCol; /* For ORDER BY, column number in result set */
u16 iAlias; /* Index into Parse.aAlias[] for zName */
} x;
- int iConstExprReg; /* Register in which Expr value is cached */
+ int iConstExprReg; /* Register in which Expr value is cached. Used only
+ ** by Parse.pConstExpr */
} u;
} a[1]; /* One slot for each expression in the list */
};
diff --git a/src/where.c b/src/where.c
index 7583f0563..4d1737660 100644
--- a/src/where.c
+++ b/src/where.c
@@ -3002,6 +3002,7 @@ static int whereLoopAddBtree(
assert( !IsVirtual(pSrc->pTab) );
if( pSrc->fg.isIndexedBy ){
+ assert( pSrc->fg.isCte==0 );
/* An INDEXED BY clause specifies a particular index to use */
pProbe = pSrc->u2.pIBIndex;
}else if( !HasRowid(pTab) ){