00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <config.h>
00021
00022 #include <drizzled/function/additive_op.h>
00023 #include <drizzled/type/decimal.h>
00024
00025 #include <algorithm>
00026
00027 using namespace std;
00028
00029 namespace drizzled
00030 {
00031
00035 void Item_func_additive_op::result_precision()
00036 {
00037 decimals= max(args[0]->decimals, args[1]->decimals);
00038 int max_int_part= max(args[0]->decimal_precision() - args[0]->decimals,
00039 args[1]->decimal_precision() - args[1]->decimals);
00040 int precision= min(max_int_part + 1 + decimals, DECIMAL_MAX_PRECISION);
00041
00042
00043 if (result_type() == INT_RESULT)
00044 unsigned_flag= args[0]->unsigned_flag | args[1]->unsigned_flag;
00045 else
00046 unsigned_flag= args[0]->unsigned_flag & args[1]->unsigned_flag;
00047
00048 max_length= class_decimal_precision_to_length(precision, decimals,
00049 unsigned_flag);
00050 }
00051
00052 }