1#include "duckdb/function/cast/default_casts.hpp"
2#include "duckdb/function/cast/vector_cast_helpers.hpp"
3#include "duckdb/common/operator/string_cast.hpp"
4#include "duckdb/common/operator/numeric_cast.hpp"
5
6namespace duckdb {
7
8template <class SRC>
9static BoundCastInfo InternalNumericCastSwitch(const LogicalType &source, const LogicalType &target) {
10 // now switch on the result type
11 switch (target.id()) {
12 case LogicalTypeId::BOOLEAN:
13 return BoundCastInfo(&VectorCastHelpers::TryCastLoop<SRC, bool, duckdb::NumericTryCast>);
14 case LogicalTypeId::TINYINT:
15 return BoundCastInfo(&VectorCastHelpers::TryCastLoop<SRC, int8_t, duckdb::NumericTryCast>);
16 case LogicalTypeId::SMALLINT:
17 return BoundCastInfo(&VectorCastHelpers::TryCastLoop<SRC, int16_t, duckdb::NumericTryCast>);
18 case LogicalTypeId::INTEGER:
19 return BoundCastInfo(&VectorCastHelpers::TryCastLoop<SRC, int32_t, duckdb::NumericTryCast>);
20 case LogicalTypeId::BIGINT:
21 return BoundCastInfo(&VectorCastHelpers::TryCastLoop<SRC, int64_t, duckdb::NumericTryCast>);
22 case LogicalTypeId::UTINYINT:
23 return BoundCastInfo(&VectorCastHelpers::TryCastLoop<SRC, uint8_t, duckdb::NumericTryCast>);
24 case LogicalTypeId::USMALLINT:
25 return BoundCastInfo(&VectorCastHelpers::TryCastLoop<SRC, uint16_t, duckdb::NumericTryCast>);
26 case LogicalTypeId::UINTEGER:
27 return BoundCastInfo(&VectorCastHelpers::TryCastLoop<SRC, uint32_t, duckdb::NumericTryCast>);
28 case LogicalTypeId::UBIGINT:
29 return BoundCastInfo(&VectorCastHelpers::TryCastLoop<SRC, uint64_t, duckdb::NumericTryCast>);
30 case LogicalTypeId::HUGEINT:
31 return BoundCastInfo(&VectorCastHelpers::TryCastLoop<SRC, hugeint_t, duckdb::NumericTryCast>);
32 case LogicalTypeId::FLOAT:
33 return BoundCastInfo(&VectorCastHelpers::TryCastLoop<SRC, float, duckdb::NumericTryCast>);
34 case LogicalTypeId::DOUBLE:
35 return BoundCastInfo(&VectorCastHelpers::TryCastLoop<SRC, double, duckdb::NumericTryCast>);
36 case LogicalTypeId::DECIMAL:
37 return BoundCastInfo(&VectorCastHelpers::ToDecimalCast<SRC>);
38 case LogicalTypeId::VARCHAR:
39 return BoundCastInfo(&VectorCastHelpers::StringCast<SRC, duckdb::StringCast>);
40 default:
41 return DefaultCasts::TryVectorNullCast;
42 }
43}
44
45BoundCastInfo DefaultCasts::NumericCastSwitch(BindCastInput &input, const LogicalType &source,
46 const LogicalType &target) {
47 switch (source.id()) {
48 case LogicalTypeId::BOOLEAN:
49 return InternalNumericCastSwitch<bool>(source, target);
50 case LogicalTypeId::TINYINT:
51 return InternalNumericCastSwitch<int8_t>(source, target);
52 case LogicalTypeId::SMALLINT:
53 return InternalNumericCastSwitch<int16_t>(source, target);
54 case LogicalTypeId::INTEGER:
55 return InternalNumericCastSwitch<int32_t>(source, target);
56 case LogicalTypeId::BIGINT:
57 return InternalNumericCastSwitch<int64_t>(source, target);
58 case LogicalTypeId::UTINYINT:
59 return InternalNumericCastSwitch<uint8_t>(source, target);
60 case LogicalTypeId::USMALLINT:
61 return InternalNumericCastSwitch<uint16_t>(source, target);
62 case LogicalTypeId::UINTEGER:
63 return InternalNumericCastSwitch<uint32_t>(source, target);
64 case LogicalTypeId::UBIGINT:
65 return InternalNumericCastSwitch<uint64_t>(source, target);
66 case LogicalTypeId::HUGEINT:
67 return InternalNumericCastSwitch<hugeint_t>(source, target);
68 case LogicalTypeId::FLOAT:
69 return InternalNumericCastSwitch<float>(source, target);
70 case LogicalTypeId::DOUBLE:
71 return InternalNumericCastSwitch<double>(source, target);
72 default:
73 throw InternalException("NumericCastSwitch called with non-numeric argument");
74 }
75}
76
77} // namespace duckdb
78