1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-11-08 03:22:21 +03:00

Fix many problems with manifest types and column affinity. Most things are

working now. (CVS 1393)

FossilOrigin-Name: ad4a964158ba9ca9d221cf7ea0439577f3894890
This commit is contained in:
danielk1977
2004-05-18 10:06:24 +00:00
parent 84ac9d02dd
commit bf3b721fab
12 changed files with 60 additions and 44 deletions

View File

@@ -12,7 +12,7 @@
** This file contains routines used for analyzing expressions and
** for generating VDBE code that evaluates expressions in SQLite.
**
** $Id: expr.c,v 1.121 2004/05/17 10:48:58 danielk1977 Exp $
** $Id: expr.c,v 1.122 2004/05/18 10:06:25 danielk1977 Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>
@@ -45,18 +45,18 @@ char const *sqlite3AffinityString(char affinity){
** SELECT a AS b FROM t1 WHERE b;
** SELECT * FROM t1 WHERE (select a from t1);
*/
static char exprAffinity(Expr *pExpr){
char sqlite3ExprAffinity(Expr *pExpr){
if( pExpr->op==TK_AS ){
return exprAffinity(pExpr->pLeft);
return sqlite3ExprAffinity(pExpr->pLeft);
}
if( pExpr->op==TK_SELECT ){
return exprAffinity(pExpr->pSelect->pEList->a[0].pExpr);
return sqlite3ExprAffinity(pExpr->pSelect->pEList->a[0].pExpr);
}
return pExpr->affinity;
}
char sqlite3CompareAffinity(Expr *pExpr, char aff2){
char aff1 = exprAffinity(pExpr);
char aff1 = sqlite3ExprAffinity(pExpr);
if( aff1 && aff2 ){
/* Both sides of the comparison are columns. If one has numeric or
** integer affinity, use that. Otherwise use no affinity.
@@ -85,7 +85,7 @@ static char comparisonAffinity(Expr *pExpr){
pExpr->op==TK_GT || pExpr->op==TK_GE || pExpr->op==TK_LE ||
pExpr->op==TK_NE );
assert( pExpr->pLeft );
aff = exprAffinity(pExpr->pLeft);
aff = sqlite3ExprAffinity(pExpr->pLeft);
if( pExpr->pRight ){
aff = sqlite3CompareAffinity(pExpr->pRight, aff);
}
@@ -121,7 +121,7 @@ int sqlite3IndexAffinityOk(Expr *pExpr, char idx_affinity){
** evaluates to NULL.
*/
static int binaryCompareP1(Expr *pExpr1, Expr *pExpr2, int jumpIfNull){
char aff = exprAffinity(pExpr2);
char aff = sqlite3ExprAffinity(pExpr2);
return (((int)sqlite3CompareAffinity(pExpr1, aff))<<8)+(jumpIfNull?1:0);
}
@@ -802,7 +802,7 @@ int sqlite3ExprResolveIds(
if( sqlite3ExprResolveIds(pParse, pSrcList, pEList, pExpr->pLeft) ){
return 1;
}
affinity = exprAffinity(pExpr->pLeft);
affinity = sqlite3ExprAffinity(pExpr->pLeft);
/* Whether this is an 'x IN(SELECT...)' or an 'x IN(<exprlist>)'
** expression it is handled the same way. A temporary table is
@@ -828,7 +828,7 @@ int sqlite3ExprResolveIds(
*/
int iParm = pExpr->iTable + (((int)affinity)<<16);
assert( (pExpr->iTable&0x0000FFFF)==pExpr->iTable );
sqlite3Select(pParse, pExpr->pSelect, SRT_Set, iParm, 0, 0, 0);
sqlite3Select(pParse, pExpr->pSelect, SRT_Set, iParm, 0, 0, 0, 0);
}else if( pExpr->pList ){
/* Case 2: expr IN (exprlist)
**
@@ -874,7 +874,7 @@ int sqlite3ExprResolveIds(
** of the memory cell in iColumn.
*/
pExpr->iColumn = pParse->nMem++;
if( sqlite3Select(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn,0,0,0) ){
if(sqlite3Select(pParse, pExpr->pSelect, SRT_Mem,pExpr->iColumn,0,0,0,0)){
return 1;
}
break;