Fixing bugs in aggregate and join
[csql.git] / src / storage / Expression.cxx
blob6938bde5388628fd47dcf13daedb3af1f8edbed7
1 /***************************************************************************
2 * Copyright (C) 2007 by www.databasecache.com *
3 * Contact: praba_tuty@databasecache.com *
4 * *
5 * *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 2 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * ***************************************************************************/
17 #include<Expression.h>
18 #include<Table.h>
19 #include<TableImpl.h>
21 void Expression::setTable(Table *tbl )
23 if(NULL!=lhs)
24 lhs->setTable(tbl);
25 if(NULL!=rhs)
26 rhs->setTable(tbl);
28 table=(TableImpl*) tbl;
31 void Expression::setTuple(void *tpl)
33 if(NULL!=lhs)
34 lhs->setTuple(tpl);
35 if(NULL!=rhs)
36 rhs->setTuple(tpl);
38 tuple = tpl;
41 void Expression::setExpr(void *cVal,bool flag)
43 arOp=unKnownOperator;
44 constVal=cVal;
45 lhs = rhs = NULL;
48 void Expression::setExpr(char const *name,ArithOperator op,void *cVal)
50 strcpy(fldName, name);
51 arOp = op;
52 constVal = cVal;
53 lhs = rhs = NULL;
56 void Expression::setExpr(char const *name)
58 strcpy(fldName, name);
59 arOp=unKnownOperator;
60 constVal=NULL;
61 lhs = rhs = NULL;
64 void Expression::setExpr(Expression *exp1, ArithOperator op, Expression *exp2)
66 lhs = exp1;
67 rhs = exp2;
68 arOp = op;
71 void *Expression::evaluate(DataType type)
73 calVal=AllDataType::alloc(type,IDENTIFIER_LENGTH);
74 char *rhsResult = NULL , *lhsResult = NULL;
75 if (NULL != lhs)
77 lhsResult =(char *) lhs->evaluate(type);
78 if (NULL == lhsResult) return lhsResult;
80 if (NULL != rhs)
82 rhsResult = (char *)rhs->evaluate(type);
83 if (NULL == rhsResult) return rhsResult;
85 int offset;
86 char *val=NULL;
87 if(NULL==lhs && NULL == rhs)
89 if(strcmp(fldName,"\0")!=0)
91 DataType srcType = table->getFieldType(fldName);
92 if(srcType > 12) return NULL;
93 else
95 offset=table->getFieldOffset(fldName);
96 val= ((char*) tuple) + offset;
99 if(constVal!= NULL && strcmp(fldName,"\0")!=0)
101 os::memcpy(calVal,val,table->getFieldLength(fldName));
102 solve(calVal, constVal, type, arOp);
104 else if(constVal!= NULL && 0==strcmp(fldName,"\0"))
106 AllDataType::copyVal(calVal, constVal, type, IDENTIFIER_LENGTH);
108 else if( NULL==constVal && strcmp(fldName,"\0")!=0)
110 os::memcpy(calVal,val,table->getFieldLength(fldName));
112 return calVal;
114 if(NULL!=lhsResult && NULL!=rhsResult)
116 solve(lhsResult, rhsResult, type, arOp);
117 return lhsResult;
122 void Expression::solve(void *opand1, void *opand2, DataType type, ArithOperator arOp)
124 switch(arOp)
126 case addition:
127 AllDataType::addVal(opand1, opand2, type );
128 break;
129 case subtraction:
130 AllDataType::subVal(opand1, opand2, type);
131 break;
132 case multiplication:
133 AllDataType::mulVal(opand1, opand2, type);
134 break;
135 case division:
136 AllDataType::divVal(opand1, opand2, type);
137 break;
138 case modulus:
139 AllDataType::mudVal(opand1, opand2, type);
140 break;
141 default:
142 break;
144 return;
147 bool Expression::isSingleTerm()
149 if (NULL==lhs && NULL==rhs ) return true;
150 else false;
152 void Expression::memFree()
154 if(lhs!=NULL)
155 lhs->memFree();
156 if(rhs!=NULL)
157 rhs->memFree();
158 free(calVal);
161 void Expression::convertStrToVal(DataType type)
163 if(lhs!=NULL)
164 lhs->convertStrToVal(type);
165 if(rhs!=NULL)
166 rhs->convertStrToVal(type);
167 if(constVal !=NULL)
169 void *parseString=constVal;
170 constVal=AllDataType::alloc(type);
171 AllDataType::strToValue(constVal,(char*)parseString, type);
172 free(parseString);
176 void Expression::freeVal()
178 if(lhs!=NULL)
179 lhs->freeVal();
180 if(rhs!=NULL)
181 rhs->freeVal();
182 if(constVal !=NULL)
183 free(constVal);