Files
doris/be/src/exprs/expr_value.h
Zhengguo Yang 739c0268ff [refactor] Remove decimal v1 related code from code base (#6079)
remove ALL DECIMAL V1 type code , this is a part of #6073
2021-07-07 10:26:32 +08:00

244 lines
7.0 KiB
C++

// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
#ifndef DORIS_BE_SRC_QUERY_EXPRS_EXPR_VALUE_H
#define DORIS_BE_SRC_QUERY_EXPRS_EXPR_VALUE_H
#include "runtime/datetime_value.h"
#include "runtime/decimalv2_value.h"
#include "runtime/string_value.h"
#include "runtime/string_value.hpp"
#include "runtime/types.h"
namespace doris {
// The materialized value returned by Expr::get_value().
// Some exprs may set multiple fields of this value at once
// for maintaining state across evaluations.
// For example, the rand() math function uses double_val as its return value,
// and int_val as the state for the random number generator.
struct ExprValue {
bool bool_val;
int8_t tinyint_val;
int16_t smallint_val;
int32_t int_val;
int64_t bigint_val;
__int128 large_int_val;
float float_val;
double double_val;
std::string string_data;
StringValue string_val;
DateTimeValue datetime_val;
DecimalV2Value decimalv2_val;
ExprValue()
: bool_val(false),
tinyint_val(0),
smallint_val(0),
int_val(0),
bigint_val(0),
large_int_val(0),
float_val(0.0),
double_val(0.0),
string_data(),
string_val(NULL, 0),
datetime_val(),
decimalv2_val(0) {}
ExprValue(bool v) : bool_val(v) {}
ExprValue(int8_t v) : tinyint_val(v) {}
ExprValue(int16_t v) : smallint_val(v) {}
ExprValue(int32_t v) : int_val(v) {}
ExprValue(int64_t v) : bigint_val(v) {}
ExprValue(__int128 value) : large_int_val(value) {}
ExprValue(float v) : float_val(v) {}
ExprValue(double v) : double_val(v) {}
ExprValue(int64_t i, int32_t f) : decimalv2_val(i, f) {}
// c'tor for string values
ExprValue(const std::string& str)
: string_data(str),
string_val(const_cast<char*>(string_data.data()), string_data.size()) {}
// Set string value to copy of str
void set_string_val(const StringValue& str) {
string_data = std::string(str.ptr, str.len);
sync_string_val();
}
void set_string_val(const std::string& str) {
string_data = str;
sync_string_val();
}
// Updates string_val ptr / len pair to reflect any changes in
// string_data. If not called after mutating string_data,
// string_val->ptr may point at garbage.
void sync_string_val() {
string_val.ptr = const_cast<char*>(string_data.data());
string_val.len = string_data.size();
}
// Sets the value for type to '0' and returns a pointer to the data
void* set_to_zero(const TypeDescriptor& type) {
switch (type.type) {
case TYPE_NULL:
return NULL;
case TYPE_BOOLEAN:
bool_val = false;
return &bool_val;
case TYPE_TINYINT:
tinyint_val = 0;
return &tinyint_val;
case TYPE_SMALLINT:
smallint_val = 0;
return &smallint_val;
case TYPE_INT:
int_val = 0;
return &int_val;
case TYPE_BIGINT:
bigint_val = 0;
return &bigint_val;
case TYPE_LARGEINT:
large_int_val = 0;
return &large_int_val;
case TYPE_FLOAT:
float_val = 0;
return &float_val;
case TYPE_DOUBLE:
double_val = 0;
return &double_val;
case TYPE_DECIMALV2:
decimalv2_val.set_to_zero();
return &decimalv2_val;
default:
DCHECK(false);
return NULL;
}
}
// Sets the value for type to min and returns a pointer to the data
void* set_to_min(const TypeDescriptor& type) {
switch (type.type) {
case TYPE_NULL:
return NULL;
case TYPE_BOOLEAN:
bool_val = false;
return &bool_val;
case TYPE_TINYINT:
tinyint_val = std::numeric_limits<int8_t>::min();
return &tinyint_val;
case TYPE_SMALLINT:
smallint_val = std::numeric_limits<int16_t>::min();
return &smallint_val;
case TYPE_INT:
int_val = std::numeric_limits<int32_t>::min();
return &int_val;
case TYPE_BIGINT:
bigint_val = std::numeric_limits<int64_t>::min();
return &bigint_val;
case TYPE_LARGEINT:
large_int_val = std::numeric_limits<int128_t>::min();
return &large_int_val;
case TYPE_FLOAT:
float_val = std::numeric_limits<float>::min();
return &float_val;
case TYPE_DOUBLE:
double_val = std::numeric_limits<double>::min();
return &double_val;
case TYPE_DECIMALV2:
decimalv2_val = DecimalV2Value::get_min_decimal();
return &decimalv2_val;
default:
DCHECK(false);
return NULL;
}
}
// Sets the value for type to max and returns a pointer to the data
void* set_to_max(const TypeDescriptor& type) {
switch (type.type) {
case TYPE_NULL:
return NULL;
case TYPE_BOOLEAN:
bool_val = true;
return &bool_val;
case TYPE_TINYINT:
tinyint_val = std::numeric_limits<int8_t>::max();
return &tinyint_val;
case TYPE_SMALLINT:
smallint_val = std::numeric_limits<int16_t>::max();
return &smallint_val;
case TYPE_INT:
int_val = std::numeric_limits<int32_t>::max();
return &int_val;
case TYPE_BIGINT:
bigint_val = std::numeric_limits<int64_t>::max();
return &bigint_val;
case TYPE_LARGEINT:
large_int_val = std::numeric_limits<int128_t>::max();
return &large_int_val;
case TYPE_FLOAT:
float_val = std::numeric_limits<float>::max();
return &float_val;
case TYPE_DOUBLE:
double_val = std::numeric_limits<double>::max();
return &double_val;
case TYPE_DECIMALV2:
decimalv2_val = DecimalV2Value::get_max_decimal();
return &decimalv2_val;
default:
DCHECK(false);
return NULL;
}
}
};
} // namespace doris
#endif