Skip to content

Commit

Permalink
finish range() function
Browse files Browse the repository at this point in the history
  • Loading branch information
AEsir777 committed Sep 21, 2023
1 parent 53e605e commit d99210c
Show file tree
Hide file tree
Showing 7 changed files with 39 additions and 25 deletions.
7 changes: 3 additions & 4 deletions src/common/types/types.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -650,10 +650,9 @@ std::vector<LogicalTypeID> LogicalTypeUtils::getNumericalLogicalTypeIDs() {
LogicalTypeID::SERIAL};
}

std::vector<LogicalType> LogicalTypeUtils::getIntegerLogicalTypes() {
return std::vector<LogicalType>{LogicalType{LogicalTypeID::INT64},
LogicalType{LogicalTypeID::INT32}, LogicalType{LogicalTypeID::INT16},
LogicalType{LogicalTypeID::INT8}, LogicalType{LogicalTypeID::SERIAL}};
std::vector<LogicalTypeID> LogicalTypeUtils::getIntegerLogicalTypeIDs() {
return std::vector<LogicalTypeID>{LogicalTypeID::INT64, LogicalTypeID::INT32,
LogicalTypeID::INT16, LogicalTypeID::INT8, LogicalTypeID::SERIAL};
}

std::vector<LogicalType> LogicalTypeUtils::getAllValidLogicTypes() {
Expand Down
21 changes: 10 additions & 11 deletions src/function/vector_list_functions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,18 +106,17 @@ std::unique_ptr<FunctionBindData> ListRangeVectorFunction::bindFunc(

vector_function_definitions ListRangeVectorFunction::getDefinitions() {
vector_function_definitions result;
for (auto type : LogicalTypeUtils::getIntegerLogicalTypes()) {
for (auto typeID : LogicalTypeUtils::getIntegerLogicalTypeIDs()) {
// start, end
result.push_back(std::make_unique<VectorFunctionDefinition>(LIST_RANGE_FUNC_NAME,
std::vector<LogicalTypeID>{type.getLogicalTypeID(), type.getLogicalTypeID()},
LogicalTypeID::VAR_LIST, getBinaryListExecFunc<Range, list_entry_t>(type, true),
nullptr, bindFunc, false));
std::vector<LogicalTypeID>{typeID, typeID}, LogicalTypeID::VAR_LIST,
getBinaryListExecFuncSwitchAll<Range, list_entry_t>(LogicalType{typeID}), nullptr,
bindFunc, false));
// start, end, step
result.push_back(std::make_unique<VectorFunctionDefinition>(LIST_RANGE_FUNC_NAME,
std::vector<LogicalTypeID>{
type.getLogicalTypeID(), type.getLogicalTypeID(), type.getLogicalTypeID()},
LogicalTypeID::VAR_LIST, getTernaryListExecFunc<Range, list_entry_t>(type, true),
nullptr, bindFunc, false));
std::vector<LogicalTypeID>{typeID, typeID, typeID}, LogicalTypeID::VAR_LIST,
getTernaryListExecFuncSwitchAll<Range, list_entry_t>(LogicalType{typeID}), nullptr,
bindFunc, false));
}
return result;
}
Expand Down Expand Up @@ -234,7 +233,7 @@ std::unique_ptr<FunctionBindData> ListAppendVectorFunction::bindFunc(
auto resultType = arguments[0]->getDataType();
auto vectorFunctionDefinition = reinterpret_cast<VectorFunctionDefinition*>(definition);
vectorFunctionDefinition->execFunc =
getBinaryListExecFunc<ListAppend, list_entry_t>(arguments[1]->getDataType());
getBinaryListExecFuncSwitchRight<ListAppend, list_entry_t>(arguments[1]->getDataType());
return std::make_unique<FunctionBindData>(resultType);
}

Expand Down Expand Up @@ -327,7 +326,7 @@ std::unique_ptr<FunctionBindData> ListPositionVectorFunction::bindFunc(
const binder::expression_vector& arguments, FunctionDefinition* definition) {
auto vectorFunctionDefinition = reinterpret_cast<VectorFunctionDefinition*>(definition);
vectorFunctionDefinition->execFunc =
getBinaryListExecFunc<ListPosition, int64_t>(arguments[1]->getDataType());
getBinaryListExecFuncSwitchRight<ListPosition, int64_t>(arguments[1]->getDataType());
return std::make_unique<FunctionBindData>(LogicalType{LogicalTypeID::INT64});
}

Expand All @@ -343,7 +342,7 @@ std::unique_ptr<FunctionBindData> ListContainsVectorFunction::bindFunc(
const binder::expression_vector& arguments, FunctionDefinition* definition) {
auto vectorFunctionDefinition = reinterpret_cast<VectorFunctionDefinition*>(definition);
vectorFunctionDefinition->execFunc =
getBinaryListExecFunc<ListContains, uint8_t>(arguments[1]->getDataType());
getBinaryListExecFuncSwitchRight<ListContains, uint8_t>(arguments[1]->getDataType());
return std::make_unique<FunctionBindData>(LogicalType{LogicalTypeID::BOOL});
}

Expand Down
2 changes: 1 addition & 1 deletion src/function/vector_map_functions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ std::unique_ptr<FunctionBindData> MapExtractVectorFunctions::bindFunc(
validateKeyType(arguments[0], arguments[1]);
auto vectorFunctionDefinition = reinterpret_cast<VectorFunctionDefinition*>(definition);
vectorFunctionDefinition->execFunc =
VectorListFunction::getBinaryListExecFunc<MapExtract, list_entry_t>(
VectorListFunction::getBinaryListExecFuncSwitchRight<MapExtract, list_entry_t>(
arguments[1]->getDataType());
auto returnListInfo = std::make_unique<VarListTypeInfo>(
std::make_unique<LogicalType>(*MapType::getValueType(&arguments[0]->dataType)));
Expand Down
2 changes: 1 addition & 1 deletion src/include/common/types/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -426,7 +426,7 @@ class LogicalTypeUtils {
static bool isNested(const LogicalType& dataType);
static std::vector<LogicalType> getAllValidComparableLogicalTypes();
static std::vector<LogicalTypeID> getNumericalLogicalTypeIDs();
static std::vector<LogicalType> getIntegerLogicalTypes();
static std::vector<LogicalTypeID> getIntegerLogicalTypeIDs();
static std::vector<LogicalType> getAllValidLogicTypes();

private:
Expand Down
1 change: 0 additions & 1 deletion src/include/function/list/functions/list_range_function.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ struct Range {
static inline void operation(T& start, T& end, common::list_entry_t& result,
common::ValueVector& leftVector, common::ValueVector& rightVector,
common::ValueVector& resultVector) {
// step = 1
T step = 1;
operation(start, end, step, result, leftVector, resultVector);
}
Expand Down
11 changes: 5 additions & 6 deletions src/include/function/list/vector_list_functions.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ namespace function {

struct VectorListFunction : public VectorFunction {
template<typename OPERATION, typename RESULT_TYPE>
static scalar_exec_func getBinaryListExecFunc(common::LogicalType rightType) {
static scalar_exec_func getBinaryListExecFuncSwitchRight(common::LogicalType rightType) {
scalar_exec_func execFunc;
switch (rightType.getPhysicalType()) {
case common::PhysicalTypeID::BOOL: {
Expand Down Expand Up @@ -67,9 +67,9 @@ struct VectorListFunction : public VectorFunction {
}

template<typename OPERATION, typename RESULT_TYPE>
static scalar_exec_func getBinaryListExecFunc(common::LogicalType rightType, bool noListInput) {
static scalar_exec_func getBinaryListExecFuncSwitchAll(common::LogicalType type) {
scalar_exec_func execFunc;
switch (rightType.getPhysicalType()) {
switch (type.getPhysicalType()) {
case common::PhysicalTypeID::INT64: {
execFunc = BinaryExecListStructFunction<int64_t, int64_t, RESULT_TYPE, OPERATION>;
} break;
Expand All @@ -91,10 +91,9 @@ struct VectorListFunction : public VectorFunction {
}

template<typename OPERATION, typename RESULT_TYPE>
static scalar_exec_func getTernaryListExecFunc(
common::LogicalType rightType, bool noListInput) {
static scalar_exec_func getTernaryListExecFuncSwitchAll(common::LogicalType type) {
scalar_exec_func execFunc;
switch (rightType.getPhysicalType()) {
switch (type.getPhysicalType()) {
case common::PhysicalTypeID::INT64: {
execFunc =
TernaryExecListStructFunction<int64_t, int64_t, int64_t, RESULT_TYPE, OPERATION>;
Expand Down
20 changes: 19 additions & 1 deletion test/test_files/tinysnb/function/range.test
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,18 @@ Binder exception: Cannot match a built-in function for given function RANGE(STRI
-STATEMENT RETURN range(1, 5);
---- 1
[1,2,3,4,5]
-STATEMENT RETURN range(To_INT32(-3), TO_INT32(0));
---- 1
[-3,-2,-1,0]
-STATEMENT RETURN range(To_INT16(-3), TO_INT16(0));
---- 1
[-3,-2,-1,0]
-STATEMENT RETURN range(To_INT8(-3), TO_INT16(0));
---- 1
[-3,-2,-1,0]
-STATEMENT RETURN range(To_INT8(-3), TO_INT8(0));
---- 1
[-3,-2,-1,0]
-STATEMENT RETURN range(4, 4, 2);
---- 1
[4]
Expand Down Expand Up @@ -113,6 +125,12 @@ Binder exception: Cannot match a built-in function for given function RANGE(STRI
-STATEMENT RETURN range(TO_INT32(5), 25, TO_INT32(10));
---- 1
[5,15,25]
-STATEMENT RETURN range(TO_INT32(5), TO_INT32(26), TO_INT32(10));
---- 1
[5,15,25]
-STATEMENT RETURN range(TO_INT8(-128), TO_INT8(127), TO_INT8(127));
---- 1
[-128,-1,126]
-STATEMENT RETURN range(3, 4, 0);
---- error
Runtime exception: Step of range cannot be 0.
Runtime exception: Step of range cannot be 0.

0 comments on commit d99210c

Please sign in to comment.