1#include "duckdb/common/limits.hpp"
2
3#include "duckdb/common/exception.hpp"
4
5using namespace std;
6
7namespace duckdb {
8
9// we offset the minimum value by 1 to account for the NULL value in the
10// hashtables
11int64_t MinimumValue(TypeId type) {
12 switch (type) {
13 case TypeId::INT8:
14 return MinimumValue<int8_t>();
15 case TypeId::INT16:
16 return MinimumValue<int16_t>();
17 case TypeId::INT32:
18 return MinimumValue<int32_t>();
19 case TypeId::INT64:
20 return MinimumValue<int64_t>();
21 case TypeId::HASH:
22 return MinimumValue<uint64_t>();
23 case TypeId::POINTER:
24 return MinimumValue<uintptr_t>();
25 default:
26 throw InvalidTypeException(type, "MinimumValue requires integral type");
27 }
28}
29
30uint64_t MaximumValue(TypeId type) {
31 switch (type) {
32 case TypeId::INT8:
33 return MaximumValue<int8_t>();
34 case TypeId::INT16:
35 return MaximumValue<int16_t>();
36 case TypeId::INT32:
37 return MaximumValue<int32_t>();
38 case TypeId::INT64:
39 return MaximumValue<int64_t>();
40 case TypeId::HASH:
41 return MaximumValue<uint64_t>();
42 case TypeId::POINTER:
43 return MaximumValue<uintptr_t>();
44 default:
45 throw InvalidTypeException(type, "MaximumValue requires integral type");
46 }
47}
48
49TypeId MinimalType(int64_t value) {
50 if (value >= MinimumValue(TypeId::INT8) && (uint64_t)value <= MaximumValue(TypeId::INT8)) {
51 return TypeId::INT8;
52 }
53 if (value >= MinimumValue(TypeId::INT16) && (uint64_t)value <= MaximumValue(TypeId::INT16)) {
54 return TypeId::INT16;
55 }
56 if (value >= MinimumValue(TypeId::INT32) && (uint64_t)value <= MaximumValue(TypeId::INT32)) {
57 return TypeId::INT32;
58 }
59 return TypeId::INT64;
60}
61
62} // namespace duckdb
63