mirror of
https://github.com/sqlite/sqlite.git
synced 2025-09-09 21:09:38 +03:00
Updates to resolve.c to facilitate full coverage testing. (CVS 6762)
FossilOrigin-Name: c50f0f28df1dfdccf1d159c983b616cd9b823955
This commit is contained in:
@@ -14,7 +14,7 @@
|
||||
** resolve all identifiers by associating them with a particular
|
||||
** table and column.
|
||||
**
|
||||
** $Id: resolve.c,v 1.28 2009/06/01 16:53:10 shane Exp $
|
||||
** $Id: resolve.c,v 1.29 2009/06/15 18:32:36 drh Exp $
|
||||
*/
|
||||
#include "sqliteInt.h"
|
||||
#include <stdlib.h>
|
||||
@@ -76,15 +76,14 @@ static void resolveAlias(
|
||||
if( pDup==0 ) return;
|
||||
}else{
|
||||
char *zToken = pOrig->u.zToken;
|
||||
assert( zToken!=0 );
|
||||
pOrig->u.zToken = 0;
|
||||
pDup = sqlite3ExprDup(db, pOrig, 0);
|
||||
pOrig->u.zToken = zToken;
|
||||
if( pDup==0 ) return;
|
||||
if( zToken ){
|
||||
assert( (pDup->flags & (EP_Reduced|EP_TokenOnly))==0 );
|
||||
pDup->flags2 |= EP2_MallocedToken;
|
||||
pDup->u.zToken = sqlite3DbStrDup(db, zToken);
|
||||
}
|
||||
assert( (pDup->flags & (EP_Reduced|EP_TokenOnly))==0 );
|
||||
pDup->flags2 |= EP2_MallocedToken;
|
||||
pDup->u.zToken = sqlite3DbStrDup(db, zToken);
|
||||
}
|
||||
if( pExpr->flags & EP_ExpCollate ){
|
||||
pDup->pColl = pExpr->pColl;
|
||||
@@ -169,7 +168,9 @@ static int lookupName(
|
||||
if( sqlite3StrICmp(zTabName, zTab)!=0 ) continue;
|
||||
}else{
|
||||
char *zTabName = pTab->zName;
|
||||
if( zTabName==0 || sqlite3StrICmp(zTabName, zTab)!=0 ) continue;
|
||||
if( NEVER(zTabName==0) || sqlite3StrICmp(zTabName, zTab)!=0 ){
|
||||
continue;
|
||||
}
|
||||
if( zDb!=0 && sqlite3StrICmp(db->aDb[iDb].zName, zDb)!=0 ){
|
||||
continue;
|
||||
}
|
||||
@@ -248,14 +249,12 @@ static int lookupName(
|
||||
cnt++;
|
||||
pExpr->iColumn = iCol==pTab->iPKey ? -1 : (i16)iCol;
|
||||
pExpr->pTab = pTab;
|
||||
if( iCol>=0 ){
|
||||
testcase( iCol==31 );
|
||||
testcase( iCol==32 );
|
||||
if( iCol>=32 ){
|
||||
*piColMask = 0xffffffff;
|
||||
}else{
|
||||
*piColMask |= ((u32)1)<<iCol;
|
||||
}
|
||||
testcase( iCol==31 );
|
||||
testcase( iCol==32 );
|
||||
if( iCol>=32 ){
|
||||
*piColMask = 0xffffffff;
|
||||
}else{
|
||||
*piColMask |= ((u32)1)<<iCol;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -488,6 +487,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
|
||||
FuncDef *pDef; /* Information about the function */
|
||||
u8 enc = ENC(pParse->db); /* The database encoding */
|
||||
|
||||
testcase( pExpr->op==TK_CONST_FUNC );
|
||||
assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
|
||||
zId = pExpr->u.zToken;
|
||||
nId = sqlite3Strlen30(zId);
|
||||
@@ -542,9 +542,10 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
|
||||
}
|
||||
#ifndef SQLITE_OMIT_SUBQUERY
|
||||
case TK_SELECT:
|
||||
case TK_EXISTS:
|
||||
case TK_EXISTS: testcase( pExpr->op==TK_EXISTS );
|
||||
#endif
|
||||
case TK_IN: {
|
||||
testcase( pExpr->op==TK_IN );
|
||||
if( ExprHasProperty(pExpr, EP_xIsSelect) ){
|
||||
int nRef = pNC->nRef;
|
||||
#ifndef SQLITE_OMIT_CHECK
|
||||
@@ -593,7 +594,7 @@ static int resolveAsName(
|
||||
|
||||
UNUSED_PARAMETER(pParse);
|
||||
|
||||
if( pE->op==TK_ID || (pE->op==TK_STRING && pE->u.zToken[0]!='\'') ){
|
||||
if( pE->op==TK_ID ){
|
||||
char *zCol = pE->u.zToken;
|
||||
for(i=0; i<pEList->nExpr; i++){
|
||||
char *zAs = pEList->a[i].zName;
|
||||
@@ -729,7 +730,7 @@ static int resolveCompoundOrderBy(
|
||||
if( pItem->done ) continue;
|
||||
pE = pItem->pExpr;
|
||||
if( sqlite3ExprIsInteger(pE, &iCol) ){
|
||||
if( iCol<0 || iCol>pEList->nExpr ){
|
||||
if( iCol<=0 || iCol>pEList->nExpr ){
|
||||
resolveOutOfRangeError(pParse, "ORDER", i+1, pEList->nExpr);
|
||||
return 1;
|
||||
}
|
||||
@@ -743,9 +744,6 @@ static int resolveCompoundOrderBy(
|
||||
}
|
||||
sqlite3ExprDelete(db, pDup);
|
||||
}
|
||||
if( iCol<0 ){
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
if( iCol>0 ){
|
||||
CollSeq *pColl = pE->pColl;
|
||||
@@ -852,9 +850,6 @@ static int resolveOrderGroupBy(
|
||||
for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){
|
||||
Expr *pE = pItem->pExpr;
|
||||
iCol = resolveAsName(pParse, pSelect->pEList, pE);
|
||||
if( iCol<0 ){
|
||||
return 1; /* OOM error */
|
||||
}
|
||||
if( iCol>0 ){
|
||||
/* If an AS-name match is found, mark this ORDER BY column as being
|
||||
** a copy of the iCol-th result-set column. The subsequent call to
|
||||
|
Reference in New Issue
Block a user