Current section
Files
Jump to
Current section
Files
c_src/duckdb/src/common/vector_operations/generators.cpp
//===--------------------------------------------------------------------===//
// generators.cpp
// Description: This file contains the implementation of different generators
//===--------------------------------------------------------------------===//
#include "duckdb/common/exception.hpp"
#include "duckdb/common/vector_operations/vector_operations.hpp"
#include "duckdb/common/limits.hpp"
namespace duckdb {
template <class T>
void TemplatedGenerateSequence(Vector &result, idx_t count, int64_t start, int64_t increment) {
D_ASSERT(result.GetType().IsNumeric());
if (start > NumericLimits<T>::Maximum() || increment > NumericLimits<T>::Maximum()) {
throw Exception("Sequence start or increment out of type range");
}
result.SetVectorType(VectorType::FLAT_VECTOR);
auto result_data = FlatVector::GetData<T>(result);
auto value = (T)start;
for (idx_t i = 0; i < count; i++) {
if (i > 0) {
value += increment;
}
result_data[i] = value;
}
}
void VectorOperations::GenerateSequence(Vector &result, idx_t count, int64_t start, int64_t increment) {
if (!result.GetType().IsNumeric()) {
throw InvalidTypeException(result.GetType(), "Can only generate sequences for numeric values!");
}
switch (result.GetType().InternalType()) {
case PhysicalType::INT8:
TemplatedGenerateSequence<int8_t>(result, count, start, increment);
break;
case PhysicalType::INT16:
TemplatedGenerateSequence<int16_t>(result, count, start, increment);
break;
case PhysicalType::INT32:
TemplatedGenerateSequence<int32_t>(result, count, start, increment);
break;
case PhysicalType::INT64:
TemplatedGenerateSequence<int64_t>(result, count, start, increment);
break;
case PhysicalType::FLOAT:
TemplatedGenerateSequence<float>(result, count, start, increment);
break;
case PhysicalType::DOUBLE:
TemplatedGenerateSequence<double>(result, count, start, increment);
break;
default:
throw NotImplementedException("Unimplemented type for generate sequence");
}
}
template <class T>
void TemplatedGenerateSequence(Vector &result, idx_t count, const SelectionVector &sel, int64_t start,
int64_t increment) {
D_ASSERT(result.GetType().IsNumeric());
if (start > NumericLimits<T>::Maximum() || increment > NumericLimits<T>::Maximum()) {
throw Exception("Sequence start or increment out of type range");
}
result.SetVectorType(VectorType::FLAT_VECTOR);
auto result_data = FlatVector::GetData<T>(result);
auto value = (T)start;
for (idx_t i = 0; i < count; i++) {
auto idx = sel.get_index(i);
result_data[idx] = value + increment * idx;
}
}
void VectorOperations::GenerateSequence(Vector &result, idx_t count, const SelectionVector &sel, int64_t start,
int64_t increment) {
if (!result.GetType().IsNumeric()) {
throw InvalidTypeException(result.GetType(), "Can only generate sequences for numeric values!");
}
switch (result.GetType().InternalType()) {
case PhysicalType::INT8:
TemplatedGenerateSequence<int8_t>(result, count, sel, start, increment);
break;
case PhysicalType::INT16:
TemplatedGenerateSequence<int16_t>(result, count, sel, start, increment);
break;
case PhysicalType::INT32:
TemplatedGenerateSequence<int32_t>(result, count, sel, start, increment);
break;
case PhysicalType::INT64:
TemplatedGenerateSequence<int64_t>(result, count, sel, start, increment);
break;
case PhysicalType::FLOAT:
TemplatedGenerateSequence<float>(result, count, sel, start, increment);
break;
case PhysicalType::DOUBLE:
TemplatedGenerateSequence<double>(result, count, sel, start, increment);
break;
default:
throw NotImplementedException("Unimplemented type for generate sequence");
}
}
} // namespace duckdb