diff options
| author | Wez Furlong <wez@php.net> | 2003-06-04 22:40:00 +0000 | 
|---|---|---|
| committer | Wez Furlong <wez@php.net> | 2003-06-04 22:40:00 +0000 | 
| commit | 80e7f7001d39add9010ba78be636245410b79c24 (patch) | |
| tree | 23ae7f9f01ea9bb1add35b1ff85efa2421d05142 /ext/sqlite/libsqlite/src/expr.c | |
| parent | 82a1818fdec3afe8e3a5cc8aa7171f4472ea1e4a (diff) | |
| download | php-git-80e7f7001d39add9010ba78be636245410b79c24.tar.gz | |
Update bundled library to version 2.8.2.
Make OnUpdateInt compatible with ZE2.
Fix the makefile fragment for non-gnu makes
Diffstat (limited to 'ext/sqlite/libsqlite/src/expr.c')
| -rw-r--r-- | ext/sqlite/libsqlite/src/expr.c | 121 | 
1 files changed, 73 insertions, 48 deletions
| diff --git a/ext/sqlite/libsqlite/src/expr.c b/ext/sqlite/libsqlite/src/expr.c index 478bfebb0a..2a380dd538 100644 --- a/ext/sqlite/libsqlite/src/expr.c +++ b/ext/sqlite/libsqlite/src/expr.c @@ -184,16 +184,17 @@ ExprList *sqliteExprListDup(ExprList *p){  SrcList *sqliteSrcListDup(SrcList *p){    SrcList *pNew;    int i; +  int nByte;    if( p==0 ) return 0; -  pNew = sqliteMalloc( sizeof(*pNew) ); +  nByte = sizeof(*p) + (p->nSrc>0 ? sizeof(p->a[0]) * (p->nSrc-1) : 0); +  pNew = sqliteMalloc( nByte );    if( pNew==0 ) return 0;    pNew->nSrc = p->nSrc; -  pNew->a = sqliteMalloc( p->nSrc*sizeof(p->a[0]) ); -  if( pNew->a==0 && p->nSrc != 0 ) return 0;    for(i=0; i<p->nSrc; i++){      pNew->a[i].zName = sqliteStrDup(p->a[i].zName);      pNew->a[i].zAlias = sqliteStrDup(p->a[i].zAlias);      pNew->a[i].jointype = p->a[i].jointype; +    pNew->a[i].iCursor = p->a[i].iCursor;      pNew->a[i].pTab = 0;      pNew->a[i].pSelect = sqliteSelectDup(p->a[i].pSelect);      pNew->a[i].pOn = sqliteExprDup(p->a[i].pOn); @@ -299,7 +300,9 @@ int sqliteExprIsConstant(Expr *p){      case TK_ID:      case TK_COLUMN:      case TK_DOT: +    case TK_FUNCTION:        return 0; +    case TK_NULL:      case TK_STRING:      case TK_INTEGER:      case TK_FLOAT: @@ -400,13 +403,16 @@ int sqliteIsRowid(const char *z){  */  int sqliteExprResolveIds(    Parse *pParse,     /* The parser context */ -  int base,          /* VDBE cursor number for first entry in pTabList */    SrcList *pTabList, /* List of tables used to resolve column names */    ExprList *pEList,  /* List of expressions used to resolve "AS" */    Expr *pExpr        /* The expression to be analyzed. */  ){ +  int i; +    if( pExpr==0 || pTabList==0 ) return 0; -  assert( base+pTabList->nSrc<=pParse->nTab ); +  for(i=0; i<pTabList->nSrc; i++){ +    assert( pTabList->a[i].iCursor>=0 && pTabList->a[i].iCursor<pParse->nTab ); +  }    switch( pExpr->op ){      /* Double-quoted strings (ex: "abc") are used as identifiers if      ** possible.  Otherwise they remain as strings.  Single-quoted @@ -428,8 +434,9 @@ int sqliteExprResolveIds(      */      case TK_ID: {        int cnt = 0;      /* Number of matches */ -      int i;            /* Loop counter */        char *z; +      int iDb = -1; +        assert( pExpr->token.z );        z = sqliteStrNDup(pExpr->token.z, pExpr->token.n);        sqliteDequote(z); @@ -438,11 +445,13 @@ int sqliteExprResolveIds(          int j;          Table *pTab = pTabList->a[i].pTab;          if( pTab==0 ) continue; +        iDb = pTab->iDb;          assert( pTab->nCol>0 );          for(j=0; j<pTab->nCol; j++){            if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){              cnt++; -            pExpr->iTable = i + base; +            pExpr->iTable = pTabList->a[i].iCursor; +            pExpr->iDb = pTab->iDb;              if( j==pTab->iPKey ){                /* Substitute the record number for the INTEGER PRIMARY KEY */                pExpr->iColumn = -1; @@ -468,41 +477,51 @@ int sqliteExprResolveIds(            }          }         } -      if( cnt==0 && sqliteIsRowid(z) ){ +      if( cnt==0 && iDb>=0 && sqliteIsRowid(z) ){          pExpr->iColumn = -1; -        pExpr->iTable = base; +        pExpr->iTable = pTabList->a[0].iCursor; +        pExpr->iDb = iDb;          cnt = 1 + (pTabList->nSrc>1);          pExpr->op = TK_COLUMN;          pExpr->dataType = SQLITE_SO_NUM;        }        sqliteFree(z);        if( cnt==0 && pExpr->token.z[0]!='"' ){ -        sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,   -          pExpr->token.z, pExpr->token.n, 0); -        pParse->nErr++; +        sqliteErrorMsg(pParse, "no such column: %T", &pExpr->token);          return 1;        }else if( cnt>1 ){ -        sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,   -          pExpr->token.z, pExpr->token.n, 0); -        pParse->nErr++; +        sqliteErrorMsg(pParse, "ambiguous column name: %T", &pExpr->token);          return 1;        }        if( pExpr->op==TK_COLUMN ){ -        sqliteAuthRead(pParse, pExpr, pTabList, base); +        sqliteAuthRead(pParse, pExpr, pTabList);        }        break;       } -    /* A table name and column name:  ID.ID */ +    /* A table name and column name:     ID.ID +    ** Or a database, table and column:  ID.ID.ID +    */      case TK_DOT: {        int cnt = 0;             /* Number of matches */        int cntTab = 0;          /* Number of matching tables */        int i;                   /* Loop counter */        Expr *pLeft, *pRight;    /* Left and right subbranches of the expr */        char *zLeft, *zRight;    /* Text of an identifier */ +      char *zDb;               /* Name of database holding table */ +      sqlite *db = pParse->db; -      pLeft = pExpr->pLeft;        pRight = pExpr->pRight; +      if( pRight->op==TK_ID ){ +        pLeft = pExpr->pLeft; +        zDb = 0; +      }else{ +        Expr *pDb = pExpr->pLeft; +        assert( pDb && pDb->op==TK_ID && pDb->token.z ); +        zDb = sqliteStrNDup(pDb->token.z, pDb->token.n); +        pLeft = pRight->pLeft; +        pRight = pRight->pRight; +      }        assert( pLeft && pLeft->op==TK_ID && pLeft->token.z );        assert( pRight && pRight->op==TK_ID && pRight->token.z );        zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n); @@ -510,8 +529,10 @@ int sqliteExprResolveIds(        if( zLeft==0 || zRight==0 ){          sqliteFree(zLeft);          sqliteFree(zRight); +        sqliteFree(zDb);          return 1;        } +      sqliteDequote(zDb);        sqliteDequote(zLeft);        sqliteDequote(zRight);        pExpr->iTable = -1; @@ -523,21 +544,25 @@ int sqliteExprResolveIds(          assert( pTab->nCol>0 );          if( pTabList->a[i].zAlias ){            zTab = pTabList->a[i].zAlias; +          if( sqliteStrICmp(zTab, zLeft)!=0 ) continue;          }else{            zTab = pTab->zName; +          if( zTab==0 || sqliteStrICmp(zTab, zLeft)!=0 ) continue; +          if( zDb!=0 && sqliteStrICmp(db->aDb[pTab->iDb].zName, zDb)!=0 ){ +            continue; +          } +        } +        if( 0==(cntTab++) ){ +          pExpr->iTable = pTabList->a[i].iCursor; +          pExpr->iDb = pTab->iDb;          } -        if( zTab==0 || sqliteStrICmp(zTab, zLeft)!=0 ) continue; -        if( 0==(cntTab++) ) pExpr->iTable = i + base;          for(j=0; j<pTab->nCol; j++){            if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){              cnt++; -            pExpr->iTable = i + base; -            if( j==pTab->iPKey ){ -              /* Substitute the record number for the INTEGER PRIMARY KEY */ -              pExpr->iColumn = -1; -            }else{ -              pExpr->iColumn = j; -            } +            pExpr->iTable = pTabList->a[i].iCursor; +            pExpr->iDb = pTab->iDb; +            /* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */ +            pExpr->iColumn = j==pTab->iPKey ? -1 : j;              pExpr->dataType = pTab->aCol[j].sortOrder & SQLITE_SO_TYPEMASK;            }          } @@ -550,11 +575,15 @@ int sqliteExprResolveIds(          int t = 0;          if( pTriggerStack->newIdx != -1 && sqliteStrICmp("new", zLeft) == 0 ){            pExpr->iTable = pTriggerStack->newIdx; +          assert( pTriggerStack->pTab ); +          pExpr->iDb = pTriggerStack->pTab->iDb;            cntTab++;            t = 1;          }          if( pTriggerStack->oldIdx != -1 && sqliteStrICmp("old", zLeft) == 0 ){            pExpr->iTable = pTriggerStack->oldIdx; +          assert( pTriggerStack->pTab ); +          pExpr->iDb = pTriggerStack->pTab->iDb;            cntTab++;            t = 1;          } @@ -565,7 +594,7 @@ int sqliteExprResolveIds(            for(j=0; j < pTab->nCol; j++) {              if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){                cnt++; -              pExpr->iColumn = j; +              pExpr->iColumn = j==pTab->iPKey ? -1 : j;                pExpr->dataType = pTab->aCol[j].sortOrder & SQLITE_SO_TYPEMASK;              }            } @@ -577,34 +606,31 @@ int sqliteExprResolveIds(          pExpr->iColumn = -1;          pExpr->dataType = SQLITE_SO_NUM;        } +      sqliteFree(zDb);        sqliteFree(zLeft);        sqliteFree(zRight);        if( cnt==0 ){ -        sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,   -          pLeft->token.z, pLeft->token.n, ".", 1,  -          pRight->token.z, pRight->token.n, 0); -        pParse->nErr++; +        sqliteErrorMsg(pParse, "no such column: %T.%T", +               &pLeft->token, &pRight->token);          return 1;        }else if( cnt>1 ){ -        sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,   -          pLeft->token.z, pLeft->token.n, ".", 1, -          pRight->token.z, pRight->token.n, 0); -        pParse->nErr++; +        sqliteErrorMsg(pParse, "ambiguous column name: %T.%T", +          &pLeft->token, &pRight->token);          return 1;        } -      sqliteExprDelete(pLeft); +      sqliteExprDelete(pExpr->pLeft);        pExpr->pLeft = 0; -      sqliteExprDelete(pRight); +      sqliteExprDelete(pExpr->pRight);        pExpr->pRight = 0;        pExpr->op = TK_COLUMN; -      sqliteAuthRead(pParse, pExpr, pTabList, base); +      sqliteAuthRead(pParse, pExpr, pTabList);        break;      }      case TK_IN: {        Vdbe *v = sqliteGetVdbe(pParse);        if( v==0 ) return 1; -      if( sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pLeft) ){ +      if( sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pLeft) ){          return 1;        }        if( pExpr->pSelect ){ @@ -627,9 +653,8 @@ int sqliteExprResolveIds(          for(i=0; i<pExpr->pList->nExpr; i++){            Expr *pE2 = pExpr->pList->a[i].pExpr;            if( !sqliteExprIsConstant(pE2) ){ -            sqliteSetString(&pParse->zErrMsg, -              "right-hand side of IN operator must be constant", 0); -            pParse->nErr++; +            sqliteErrorMsg(pParse, +              "right-hand side of IN operator must be constant");              return 1;            }            if( sqliteExprCheck(pParse, pE2, 0, 0) ){ @@ -675,11 +700,11 @@ int sqliteExprResolveIds(      /* For all else, just recursively walk the tree */      default: {        if( pExpr->pLeft -      && sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pLeft) ){ +      && sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pLeft) ){          return 1;        }        if( pExpr->pRight  -      && sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pRight) ){ +      && sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pRight) ){          return 1;        }        if( pExpr->pList ){ @@ -687,7 +712,7 @@ int sqliteExprResolveIds(          ExprList *pList = pExpr->pList;          for(i=0; i<pList->nExpr; i++){            Expr *pArg = pList->a[i].pExpr; -          if( sqliteExprResolveIds(pParse, base, pTabList, pEList, pArg) ){ +          if( sqliteExprResolveIds(pParse, pTabList, pEList, pArg) ){              return 1;            }          } @@ -1199,8 +1224,8 @@ void sqliteExprCode(Parse *pParse, Expr *pExpr){      }      case TK_RAISE: {        if( !pParse->trigStack ){ -        sqliteSetNString(&pParse->zErrMsg,  -		"RAISE() may only be used within a trigger-program", -1, 0); +        sqliteErrorMsg(pParse, +                       "RAISE() may only be used within a trigger-program");          pParse->nErr++;  	return;        } | 
