1 /***************************************************************************
3 * Copyright (C) Lakshya Solutions Ltd. All rights reserved. *
5 ***************************************************************************/
10 long AllDataType::size(DataType type
, int length
)
12 if (type
== typeInt
) return sizeof(int);
13 else if (type
== typeString
) return length
;
25 size
= sizeof(long long);
34 size
= sizeof(double);
41 //fldDef.length_ = sizeof(long double);
50 size
= sizeof(TimeStamp
);
64 void AllDataType::cachecopyVal(void* dest
, void *src
, DataType type
, int length
,int dbFlag
)
68 *(int*)dest
= *(int*)src
;
70 }else if (typeString
== type
|| typeVarchar
== type
)
72 Util::trimRight((char*)src
);
73 strncpy((char*)dest
, (char*)src
, length
);
77 }else if (typeShort
== type
) {
78 *(short*)dest
= *(short*)src
;
79 }else if (typeDouble
== type
) {
80 *(double*)dest
= *(double*)src
;
81 }else if (typeTimeStamp
== type
) {
82 *(TimeStamp
*)dest
= *(TimeStamp
*)src
;
83 }else if (typeDate
== type
) {
84 *(Date
*)dest
= *(Date
*)src
;
85 }else if (typeFloat
== type
) {
86 *(float*)dest
= *(float*)src
;
87 }else if (typeTime
== type
) {
88 *(Time
*)dest
= *(Time
*)src
;
89 }else if (typeLong
== type
) {
90 *(long*)dest
= *(long*)src
;
91 }else if (typeLongLong
== type
) {
93 convertToLongLong(dest
, src
,typeString
);
95 *(long long*)dest
= *(long long*)src
;
96 }else if (typeByteInt
== type
) {
97 *(char*)dest
= *(char*)src
;
98 }else if (typeBinary
== type
) {
99 os::memcpy(dest
, src
, length
);
100 }else if (typeComposite
== type
) {
101 os::memcpy(dest
, src
, length
);
106 void AllDataType::copyVal(void* dest
, void *src
, DataType type
, int length
,int dbFlag
)
108 //Performance optimization. putting likely case first
109 if (typeInt
== type
)
111 *(int*)dest
= *(int*)src
;
113 }else if (typeString
== type
|| typeVarchar
== type
)
115 strncpy((char*)dest
, (char*)src
, length
);
116 char *d
=(char*)dest
;
119 }else if (typeShort
== type
) {
120 *(short*)dest
= *(short*)src
;
121 }else if (typeDouble
== type
) {
122 *(double*)dest
= *(double*)src
;
123 }else if (typeTimeStamp
== type
) {
124 *(TimeStamp
*)dest
= *(TimeStamp
*)src
;
125 }else if (typeDate
== type
) {
126 *(Date
*)dest
= *(Date
*)src
;
127 }else if (typeFloat
== type
) {
128 *(float*)dest
= *(float*)src
;
129 }else if (typeTime
== type
) {
130 *(Time
*)dest
= *(Time
*)src
;
131 }else if (typeLong
== type
) {
132 *(long*)dest
= *(long*)src
;
133 }else if (typeLongLong
== type
) {
134 *(long long*)dest
= *(long long*)src
;
135 }else if (typeByteInt
== type
) {
136 *(char*)dest
= *(char*)src
;
137 }else if (typeBinary
== type
) {
138 os::memcpy(dest
, src
, length
);
139 }else if (typeComposite
== type
) {
140 os::memcpy(dest
, src
, length
);
144 void AllDataType::copyZeroVal(void *dest
, DataType type
, int length
)
146 if (typeInt
== type
)
149 }else if (typeString
== type
|| typeVarchar
== type
)
151 char *d
=(char*)dest
;
153 }else if (typeShort
== type
) {
155 }else if (typeDouble
== type
) {
157 }else if (typeTimeStamp
== type
) {
158 ((TimeStamp
*)dest
)->setDate(0,0,0);
159 ((TimeStamp
*)dest
)->setTime(0,0,0);
160 }else if (typeDate
== type
) {
161 ((Date
*)dest
)->set(0,0,0);
162 }else if (typeFloat
== type
) {
164 }else if (typeTime
== type
) {
165 ((Time
*)dest
)->set(0,0,0);
166 }else if (typeLong
== type
) {
168 }else if (typeLongLong
== type
) {
169 *(long long*)dest
= 0;
170 }else if (typeByteInt
== type
) {
172 }else if (typeBinary
== type
) {
173 os::memset(dest
, 0, length
);
174 }else if (typeComposite
== type
) {
175 os::memset(dest
, 0, length
);
181 void AllDataType::addVal(void* dest
, void *src
, DataType type
)
185 *(int*)dest
= *(int*)dest
+ *(int*)src
;
191 *(int*)dest
= *(int*)dest
+ *(int*)src
;
194 *(long*)dest
= *(long*)dest
+ *(long*)src
;
197 *(long long*)dest
= *(long long*)dest
+ *(long long*)src
;
200 *(short*)dest
= *(short*)dest
+ *(short*)src
;
203 *(char*)dest
= *(char*)dest
+ *(char*)src
;
206 *(double*)dest
= *(double*)dest
+ *(double*)src
;
209 *(float*)dest
= *(float*)dest
+ *(float*)src
;
223 bool AllDataType::compareVal(void *val1
, void *val2
, ComparisionOp op
,
224 DataType type
, long length
)
226 //Performance optimization.
227 //do not convert compareXXXVal to virtual functions. it takes more time
230 //as int is the heavily used type, hardcoding the compare here itself
231 if (OpEquals
== op
) {
232 if (*(int*)val1
== *(int*)val2
) return true;
234 }else if (OpLessThan
== op
) {
235 if (*(int*)val1
< *(int*)val2
) return true;
237 }else if (OpGreaterThan
== op
) {
238 if (*(int*)val1
> *(int*)val2
) return true;
240 }else if (OpLessThanEquals
== op
) {
241 if (*(int*)val1
<= *(int*)val2
) return true;
243 }else if (OpGreaterThanEquals
== op
) {
244 if (*(int*)val1
>= *(int*)val2
) return true;
246 }else if (OpNotEquals
== op
) {
247 if (*(int*)val1
!= *(int*)val2
) return true;
251 }else if(typeString
== type
|| typeVarchar
== type
) {
252 return AllDataType::compareStringVal(val1
, val2
, op
);
253 } else if (typeShort
== type
) {
254 return AllDataType::compareShortVal(val1
, val2
, op
);
255 } else if (typeDouble
== type
) {
256 return AllDataType::compareDoubleVal(val1
, val2
, op
);
257 } else if (typeFloat
== type
) {
258 return AllDataType::compareFloatVal(val1
, val2
, op
);
259 } else if (typeLong
== type
) {
260 return AllDataType::compareLongVal(val1
, val2
, op
);
261 } else if (typeLongLong
== type
) {
262 return AllDataType::compareLongLongVal(val1
, val2
, op
);
263 } else if (typeByteInt
== type
) {
264 return AllDataType::compareByteIntVal(val1
, val2
, op
);
265 } else if (typeTimeStamp
== type
) {
266 return AllDataType::compareTimeStampVal(val1
, val2
, op
);
267 } else if (typeDate
== type
) {
268 return AllDataType::compareDateVal(val1
, val2
, op
);
269 } else if (typeTime
== type
) {
270 return AllDataType::compareTimeVal(val1
, val2
, op
);
271 } else if (typeBinary
== type
) {
272 return AllDataType::compareBinaryVal(val1
, val2
, op
, length
);
273 } else if (typeComposite
== type
) {
274 return AllDataType::compareBinaryVal(val1
, val2
, op
, length
);
277 ComparisionOp
AllDataType::getComparisionOperator(char *str
)
280 if (strcmp(str
, "<=") == 0)
281 op
= OpLessThanEquals
;
282 else if (strcmp(str
, ">=") == 0)
283 op
= OpGreaterThanEquals
;
284 else if (strcmp(str
, "<") == 0)
286 else if (strcmp(str
, ">") == 0)
288 else if (strcmp(str
, "=") == 0)
290 else if (strcmp(str
, "!=") == 0 || strcmp(str
, "<>") == 0 )
292 else if (strcasecmp(str
, "LIKE") == 0 )
295 op
= OpInvalidComparisionOp
;
299 bool AllDataType::isValidFieldForAvg(DataType type
)
302 case typeInt
: case typeLong
: case typeLongLong
: case typeShort
:
303 case typeByteInt
: case typeDouble
: case typeFloat
: case typeDecimal
: