@@ -14,11 +14,12 @@ bool TryMultiplyOperator::Operation(double left, int64_t right, int64_t &result)
14
14
struct ToMillenniaOperator {
15
15
template <class TA , class TR >
16
16
static inline TR Operation (TA input) {
17
+ const auto iinput = Cast::Operation<TA, int32_t >(input);
17
18
interval_t result;
18
19
result.days = 0 ;
19
20
result.micros = 0 ;
20
- if (!TryMultiplyOperator::Operation<TA , int32_t , int32_t >(input , Interval::MONTHS_PER_MILLENIUM,
21
- result.months )) {
21
+ if (!TryMultiplyOperator::Operation<int32_t , int32_t , int32_t >(iinput , Interval::MONTHS_PER_MILLENIUM,
22
+ result.months )) {
22
23
throw OutOfRangeException (" Interval value %s millennia out of range" , NumericHelper::ToString (input));
23
24
}
24
25
return result;
@@ -28,10 +29,12 @@ struct ToMillenniaOperator {
28
29
struct ToCenturiesOperator {
29
30
template <class TA , class TR >
30
31
static inline TR Operation (TA input) {
32
+ const auto iinput = Cast::Operation<TA, int32_t >(input);
31
33
interval_t result;
32
34
result.days = 0 ;
33
35
result.micros = 0 ;
34
- if (!TryMultiplyOperator::Operation<TA, int32_t , int32_t >(input, Interval::MONTHS_PER_CENTURY, result.months )) {
36
+ if (!TryMultiplyOperator::Operation<int32_t , int32_t , int32_t >(iinput, Interval::MONTHS_PER_CENTURY,
37
+ result.months )) {
35
38
throw OutOfRangeException (" Interval value %s centuries out of range" , NumericHelper::ToString (input));
36
39
}
37
40
return result;
@@ -41,10 +44,12 @@ struct ToCenturiesOperator {
41
44
struct ToDecadesOperator {
42
45
template <class TA , class TR >
43
46
static inline TR Operation (TA input) {
47
+ const auto iinput = Cast::Operation<TA, int32_t >(input);
44
48
interval_t result;
45
49
result.days = 0 ;
46
50
result.micros = 0 ;
47
- if (!TryMultiplyOperator::Operation<TA, int32_t , int32_t >(input, Interval::MONTHS_PER_DECADE, result.months )) {
51
+ if (!TryMultiplyOperator::Operation<int32_t , int32_t , int32_t >(iinput, Interval::MONTHS_PER_DECADE,
52
+ result.months )) {
48
53
throw OutOfRangeException (" Interval value %s decades out of range" , NumericHelper::ToString (input));
49
54
}
50
55
return result;
@@ -54,10 +59,11 @@ struct ToDecadesOperator {
54
59
struct ToYearsOperator {
55
60
template <class TA , class TR >
56
61
static inline TR Operation (TA input) {
62
+ const auto iinput = Cast::Operation<TA, int32_t >(input);
57
63
interval_t result;
58
64
result.days = 0 ;
59
65
result.micros = 0 ;
60
- if (!TryMultiplyOperator::Operation<int32_t , int32_t , int32_t >(input , Interval::MONTHS_PER_YEAR,
66
+ if (!TryMultiplyOperator::Operation<int32_t , int32_t , int32_t >(iinput , Interval::MONTHS_PER_YEAR,
61
67
result.months )) {
62
68
throw OutOfRangeException (" Interval value %d years out of range" , input);
63
69
}
@@ -68,8 +74,9 @@ struct ToYearsOperator {
68
74
struct ToQuartersOperator {
69
75
template <class TA , class TR >
70
76
static inline TR Operation (TA input) {
77
+ const auto iinput = Cast::Operation<TA, int32_t >(input);
71
78
interval_t result;
72
- if (!TryMultiplyOperator::Operation<int32_t , int32_t , int32_t >(input , Interval::MONTHS_PER_QUARTER,
79
+ if (!TryMultiplyOperator::Operation<int32_t , int32_t , int32_t >(iinput , Interval::MONTHS_PER_QUARTER,
73
80
result.months )) {
74
81
throw OutOfRangeException (" Interval value %d quarters out of range" , input);
75
82
}
@@ -83,7 +90,8 @@ struct ToMonthsOperator {
83
90
template <class TA , class TR >
84
91
static inline TR Operation (TA input) {
85
92
interval_t result;
86
- result.months = input;
93
+ result.months = Cast::Operation<TA, int32_t >(input);
94
+ ;
87
95
result.days = 0 ;
88
96
result.micros = 0 ;
89
97
return result;
@@ -93,9 +101,10 @@ struct ToMonthsOperator {
93
101
struct ToWeeksOperator {
94
102
template <class TA , class TR >
95
103
static inline TR Operation (TA input) {
104
+ const auto iinput = Cast::Operation<TA, int32_t >(input);
96
105
interval_t result;
97
106
result.months = 0 ;
98
- if (!TryMultiplyOperator::Operation<int32_t , int32_t , int32_t >(input , Interval::DAYS_PER_WEEK, result.days )) {
107
+ if (!TryMultiplyOperator::Operation<int32_t , int32_t , int32_t >(iinput , Interval::DAYS_PER_WEEK, result.days )) {
99
108
throw OutOfRangeException (" Interval value %d weeks out of range" , input);
100
109
}
101
110
result.micros = 0 ;
@@ -108,7 +117,7 @@ struct ToDaysOperator {
108
117
static inline TR Operation (TA input) {
109
118
interval_t result;
110
119
result.months = 0 ;
111
- result.days = input;
120
+ result.days = Cast::Operation<TA, int32_t >( input) ;
112
121
result.micros = 0 ;
113
122
return result;
114
123
}
@@ -164,60 +173,49 @@ struct ToMicroSecondsOperator {
164
173
}
165
174
};
166
175
167
- ScalarFunction ToMillenniaFun::GetFunction () {
168
- ScalarFunction function ({LogicalType::INTEGER}, LogicalType::INTERVAL,
169
- ScalarFunction::UnaryFunction<int32_t , interval_t , ToMillenniaOperator>);
170
- BaseScalarFunction::SetReturnsError (function);
171
- return function;
176
+ template <typename OP>
177
+ ScalarFunctionSet GetIntegerIntervalFunctions () {
178
+ ScalarFunctionSet function_set;
179
+ function_set.AddFunction (ScalarFunction ({LogicalType::INTEGER}, LogicalType::INTERVAL,
180
+ ScalarFunction::UnaryFunction<int32_t , interval_t , OP>));
181
+ function_set.AddFunction (ScalarFunction ({LogicalType::BIGINT}, LogicalType::INTERVAL,
182
+ ScalarFunction::UnaryFunction<int64_t , interval_t , OP>));
183
+ for (auto &func : function_set.functions ) {
184
+ BaseScalarFunction::SetReturnsError (func);
185
+ }
186
+ return function_set;
172
187
}
173
188
174
- ScalarFunction ToCenturiesFun::GetFunction () {
175
- ScalarFunction function ({LogicalType::INTEGER}, LogicalType::INTERVAL,
176
- ScalarFunction::UnaryFunction<int32_t , interval_t , ToCenturiesOperator>);
177
- BaseScalarFunction::SetReturnsError (function);
178
- return function;
189
+ ScalarFunctionSet ToMillenniaFun::GetFunctions () {
190
+ return GetIntegerIntervalFunctions<ToMillenniaOperator>();
179
191
}
180
192
181
- ScalarFunction ToDecadesFun::GetFunction () {
182
- ScalarFunction function ({LogicalType::INTEGER}, LogicalType::INTERVAL,
183
- ScalarFunction::UnaryFunction<int32_t , interval_t , ToDecadesOperator>);
184
- BaseScalarFunction::SetReturnsError (function);
185
- return function;
193
+ ScalarFunctionSet ToCenturiesFun::GetFunctions () {
194
+ return GetIntegerIntervalFunctions<ToCenturiesOperator>();
186
195
}
187
196
188
- ScalarFunction ToYearsFun::GetFunction () {
189
- ScalarFunction function ({LogicalType::INTEGER}, LogicalType::INTERVAL,
190
- ScalarFunction::UnaryFunction<int32_t , interval_t , ToYearsOperator>);
191
- BaseScalarFunction::SetReturnsError (function);
192
- return function;
197
+ ScalarFunctionSet ToDecadesFun::GetFunctions () {
198
+ return GetIntegerIntervalFunctions<ToDecadesOperator>();
193
199
}
194
200
195
- ScalarFunction ToQuartersFun::GetFunction () {
196
- ScalarFunction function ({LogicalType::INTEGER}, LogicalType::INTERVAL,
197
- ScalarFunction::UnaryFunction<int32_t , interval_t , ToQuartersOperator>);
198
- BaseScalarFunction::SetReturnsError (function);
199
- return function;
201
+ ScalarFunctionSet ToYearsFun::GetFunctions () {
202
+ return GetIntegerIntervalFunctions<ToYearsOperator>();
200
203
}
201
204
202
- ScalarFunction ToMonthsFun::GetFunction () {
203
- ScalarFunction function ({LogicalType::INTEGER}, LogicalType::INTERVAL,
204
- ScalarFunction::UnaryFunction<int32_t , interval_t , ToMonthsOperator>);
205
- BaseScalarFunction::SetReturnsError (function);
206
- return function;
205
+ ScalarFunctionSet ToQuartersFun::GetFunctions () {
206
+ return GetIntegerIntervalFunctions<ToQuartersOperator>();
207
207
}
208
208
209
- ScalarFunction ToWeeksFun::GetFunction () {
210
- ScalarFunction function ({LogicalType::INTEGER}, LogicalType::INTERVAL,
211
- ScalarFunction::UnaryFunction<int32_t , interval_t , ToWeeksOperator>);
212
- BaseScalarFunction::SetReturnsError (function);
213
- return function;
209
+ ScalarFunctionSet ToMonthsFun::GetFunctions () {
210
+ return GetIntegerIntervalFunctions<ToMonthsOperator>();
214
211
}
215
212
216
- ScalarFunction ToDaysFun::GetFunction () {
217
- ScalarFunction function ({LogicalType::INTEGER}, LogicalType::INTERVAL,
218
- ScalarFunction::UnaryFunction<int32_t , interval_t , ToDaysOperator>);
219
- BaseScalarFunction::SetReturnsError (function);
220
- return function;
213
+ ScalarFunctionSet ToWeeksFun::GetFunctions () {
214
+ return GetIntegerIntervalFunctions<ToWeeksOperator>();
215
+ }
216
+
217
+ ScalarFunctionSet ToDaysFun::GetFunctions () {
218
+ return GetIntegerIntervalFunctions<ToDaysOperator>();
221
219
}
222
220
223
221
ScalarFunction ToHoursFun::GetFunction () {
0 commit comments