forked from alibaba/AliSQL
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnumeric_casts.cpp
More file actions
86 lines (82 loc) · 3.94 KB
/
numeric_casts.cpp
File metadata and controls
86 lines (82 loc) · 3.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include "duckdb/function/cast/default_casts.hpp"
#include "duckdb/function/cast/vector_cast_helpers.hpp"
#include "duckdb/common/operator/string_cast.hpp"
#include "duckdb/common/operator/numeric_cast.hpp"
#include "duckdb/common/types/varint.hpp"
namespace duckdb {
template <class SRC>
static BoundCastInfo InternalNumericCastSwitch(const LogicalType &source, const LogicalType &target) {
// now switch on the result type
switch (target.id()) {
case LogicalTypeId::BOOLEAN:
return BoundCastInfo(&VectorCastHelpers::TryCastLoop<SRC, bool, duckdb::NumericTryCast>);
case LogicalTypeId::TINYINT:
return BoundCastInfo(&VectorCastHelpers::TryCastLoop<SRC, int8_t, duckdb::NumericTryCast>);
case LogicalTypeId::SMALLINT:
return BoundCastInfo(&VectorCastHelpers::TryCastLoop<SRC, int16_t, duckdb::NumericTryCast>);
case LogicalTypeId::INTEGER:
return BoundCastInfo(&VectorCastHelpers::TryCastLoop<SRC, int32_t, duckdb::NumericTryCast>);
case LogicalTypeId::BIGINT:
return BoundCastInfo(&VectorCastHelpers::TryCastLoop<SRC, int64_t, duckdb::NumericTryCast>);
case LogicalTypeId::UTINYINT:
return BoundCastInfo(&VectorCastHelpers::TryCastLoop<SRC, uint8_t, duckdb::NumericTryCast>);
case LogicalTypeId::USMALLINT:
return BoundCastInfo(&VectorCastHelpers::TryCastLoop<SRC, uint16_t, duckdb::NumericTryCast>);
case LogicalTypeId::UINTEGER:
return BoundCastInfo(&VectorCastHelpers::TryCastLoop<SRC, uint32_t, duckdb::NumericTryCast>);
case LogicalTypeId::UBIGINT:
return BoundCastInfo(&VectorCastHelpers::TryCastLoop<SRC, uint64_t, duckdb::NumericTryCast>);
case LogicalTypeId::HUGEINT:
return BoundCastInfo(&VectorCastHelpers::TryCastLoop<SRC, hugeint_t, duckdb::NumericTryCast>);
case LogicalTypeId::UHUGEINT:
return BoundCastInfo(&VectorCastHelpers::TryCastLoop<SRC, uhugeint_t, duckdb::NumericTryCast>);
case LogicalTypeId::FLOAT:
return BoundCastInfo(&VectorCastHelpers::TryCastLoop<SRC, float, duckdb::NumericTryCast>);
case LogicalTypeId::DOUBLE:
return BoundCastInfo(&VectorCastHelpers::TryCastLoop<SRC, double, duckdb::NumericTryCast>);
case LogicalTypeId::DECIMAL:
return BoundCastInfo(&VectorCastHelpers::ToDecimalCast<SRC>);
case LogicalTypeId::VARCHAR:
return BoundCastInfo(&VectorCastHelpers::StringCast<SRC, duckdb::StringCast>);
case LogicalTypeId::BIT:
return BoundCastInfo(&VectorCastHelpers::StringCast<SRC, duckdb::NumericTryCastToBit>);
case LogicalTypeId::VARINT:
return Varint::NumericToVarintCastSwitch(source);
default:
return DefaultCasts::TryVectorNullCast;
}
}
BoundCastInfo DefaultCasts::NumericCastSwitch(BindCastInput &input, const LogicalType &source,
const LogicalType &target) {
switch (source.id()) {
case LogicalTypeId::BOOLEAN:
return InternalNumericCastSwitch<bool>(source, target);
case LogicalTypeId::TINYINT:
return InternalNumericCastSwitch<int8_t>(source, target);
case LogicalTypeId::SMALLINT:
return InternalNumericCastSwitch<int16_t>(source, target);
case LogicalTypeId::INTEGER:
return InternalNumericCastSwitch<int32_t>(source, target);
case LogicalTypeId::BIGINT:
return InternalNumericCastSwitch<int64_t>(source, target);
case LogicalTypeId::UTINYINT:
return InternalNumericCastSwitch<uint8_t>(source, target);
case LogicalTypeId::USMALLINT:
return InternalNumericCastSwitch<uint16_t>(source, target);
case LogicalTypeId::UINTEGER:
return InternalNumericCastSwitch<uint32_t>(source, target);
case LogicalTypeId::UBIGINT:
return InternalNumericCastSwitch<uint64_t>(source, target);
case LogicalTypeId::HUGEINT:
return InternalNumericCastSwitch<hugeint_t>(source, target);
case LogicalTypeId::UHUGEINT:
return InternalNumericCastSwitch<uhugeint_t>(source, target);
case LogicalTypeId::FLOAT:
return InternalNumericCastSwitch<float>(source, target);
case LogicalTypeId::DOUBLE:
return InternalNumericCastSwitch<double>(source, target);
default:
throw InternalException("NumericCastSwitch called with non-numeric argument");
}
}
} // namespace duckdb