@@ -1992,29 +1992,52 @@ TEST_F(CastExprTest, castInTry) {
1992
1992
1993
1993
TEST_F (CastExprTest, doubleToDecimal) {
1994
1994
// Double to short decimal.
1995
- const auto input =
1996
- makeFlatVector<double >({-3333.03 , -2222.02 , -1.0 , 0.00 , 100 , 99999.99 });
1995
+ const auto input = makeFlatVector<double >(
1996
+ {-3333.03 ,
1997
+ -2222.02 ,
1998
+ -1.0 ,
1999
+ 0.00 ,
2000
+ 100 ,
2001
+ 99999.99 ,
2002
+ 10.03 ,
2003
+ 10.05 ,
2004
+ 9.95 ,
2005
+ -2.123456789 });
1997
2006
testCast (
1998
2007
input,
1999
2008
makeFlatVector<int64_t >(
2000
- {-33'330'300 , -22'220'200 , -10'000 , 0 , 1'000'000 , 999'999'900 },
2009
+ {-33'330'300 ,
2010
+ -22'220'200 ,
2011
+ -10'000 ,
2012
+ 0 ,
2013
+ 1'000'000 ,
2014
+ 999'999'900 ,
2015
+ 100'300 ,
2016
+ 100'500 ,
2017
+ 99'500 ,
2018
+ -21'235 },
2001
2019
DECIMAL (10 , 4 )));
2002
2020
2003
2021
// Double to long decimal.
2004
2022
testCast (
2005
2023
input,
2006
2024
makeFlatVector<int128_t >(
2007
- {- 33'330'300'000'000 ,
2008
- - 22'220'200'000'000 ,
2009
- -10 '000'000'000 ,
2025
+ {HugeInt::build ( 0xFFFFFFFFFFFFFF4B , 0x50EABA2657C90000 ) ,
2026
+ HugeInt::build ( 0xFFFFFFFFFFFFFF87 , 0x8B4726C43A860000 ) ,
2027
+ -1'000'000'000 '000'000'000 ,
2010
2028
0 ,
2011
- 1'000'000'000'000 ,
2012
- 999'999'900'000'000 },
2013
- DECIMAL (20 , 10 )));
2029
+ HugeInt::build (0x5 , 0x6BC75E2D63100000 ),
2030
+ HugeInt::build (0x152D , 0x02A45A5886BF0000 ),
2031
+ HugeInt::build (0 , 0x8B31B7DBD92B0000 ),
2032
+ HugeInt::build (0 , 0x8B78C5C0B8AD0000 ),
2033
+ HugeInt::build (0 , 0x8A1580485B230000 ),
2034
+ -2'123'456'789'000'000'000 },
2035
+ DECIMAL (38 , 18 )));
2014
2036
testCast (
2015
2037
input,
2016
2038
makeFlatVector<int128_t >(
2017
- {-33'330 , -22'220 , -10 , 0 , 1'000 , 1'000'000 }, DECIMAL (20 , 1 )));
2039
+ {-33'330 , -22'220 , -10 , 0 , 1'000 , 1'000'000 , 100 , 101 , 100 , -21 },
2040
+ DECIMAL (20 , 1 )));
2018
2041
testCast (
2019
2042
makeNullableFlatVector<double >(
2020
2043
{0.13456789 ,
@@ -2085,6 +2108,119 @@ TEST_F(CastExprTest, doubleToDecimal) {
2085
2108
" Cannot cast DOUBLE 'NaN' to DECIMAL(38, 2). The input value should be finite." );
2086
2109
}
2087
2110
2111
+ TEST_F (CastExprTest, realToDecimal) {
2112
+ // Real to short decimal.
2113
+ const auto input = makeFlatVector<float >(
2114
+ {-3333.03 ,
2115
+ -2222.02 ,
2116
+ -1.0 ,
2117
+ 0.00 ,
2118
+ 100 ,
2119
+ 99999.9 ,
2120
+ 10.03 ,
2121
+ 10.05 ,
2122
+ 9.95 ,
2123
+ -2.12345 });
2124
+ testCast (
2125
+ input,
2126
+ makeFlatVector<int64_t >(
2127
+ {-33'330'300 ,
2128
+ -22'220'200 ,
2129
+ -10'000 ,
2130
+ 0 ,
2131
+ 1'000'000 ,
2132
+ 999'999'000 ,
2133
+ 100'300 ,
2134
+ 100'500 ,
2135
+ 99'500 ,
2136
+ -212'35 },
2137
+ DECIMAL (10 , 4 )));
2138
+
2139
+ // Real to long decimal.
2140
+ testCast (
2141
+ input,
2142
+ makeFlatVector<int128_t >(
2143
+ {HugeInt::build (0xFFFFFFFFFFFFFF4B , 0x50EABA2657C90000 ),
2144
+ HugeInt::build (0xFFFFFFFFFFFFFF87 , 0x8B4726C43A860000 ),
2145
+ -1'000'000'000'000'000'000 ,
2146
+ 0 ,
2147
+ HugeInt::build (0x5 , 0x6BC75E2D63100000 ),
2148
+ HugeInt::build (0x152D , 0x01649BD298F60000 ),
2149
+ HugeInt::build (0 , 0x8B31B7DBD92B0000 ),
2150
+ HugeInt::build (0 , 0x8B78C5C0B8AD0000 ),
2151
+ HugeInt::build (0 , 0x8A1580485B230000 ),
2152
+ -2'123'450'000'000'000'000 },
2153
+ DECIMAL (38 , 18 )));
2154
+ testCast (
2155
+ input,
2156
+ makeFlatVector<int128_t >(
2157
+ {-33'330 , -22'220 , -10 , 0 , 1'000 , 999'999 , 100 , 101 , 100 , -21 },
2158
+ DECIMAL (20 , 1 )));
2159
+ testCast (
2160
+ makeNullableFlatVector<float >(
2161
+ {0.134567 , 0.000015 , 0.000001 , 0.999999 , 0.123456 , std::nullopt}),
2162
+ makeNullableFlatVector<int128_t >(
2163
+ {134'567'000'000'000'000 ,
2164
+ 15'000'000'000'000 ,
2165
+ 1'000'000'000'000 ,
2166
+ 999'999'000'000'000'000 ,
2167
+ 123'456'000'000'000'000 ,
2168
+ std::nullopt},
2169
+ DECIMAL (38 , 18 )));
2170
+
2171
+ testThrow<float >(
2172
+ REAL (),
2173
+ DECIMAL (10 , 2 ),
2174
+ {9999999999999999999999.99 },
2175
+ " Cannot cast REAL '9.999999778196308E21' to DECIMAL(10, 2). Result overflows." );
2176
+ testThrow<float >(
2177
+ REAL (),
2178
+ DECIMAL (10 , 2 ),
2179
+ {static_cast <float >(
2180
+ static_cast <int128_t >(std::numeric_limits<int64_t >::max ()) + 1 )},
2181
+ " Cannot cast REAL '9223372036854776000' to DECIMAL(10, 2). Result overflows." );
2182
+ testThrow<float >(
2183
+ REAL (),
2184
+ DECIMAL (10 , 2 ),
2185
+ {static_cast <float >(
2186
+ static_cast <int128_t >(std::numeric_limits<int64_t >::min ()) - 1 )},
2187
+ " Cannot cast REAL '-9223372036854776000' to DECIMAL(10, 2). Result overflows." );
2188
+ testThrow<float >(
2189
+ REAL (),
2190
+ DECIMAL (20 , 2 ),
2191
+ {static_cast <float >(DecimalUtil::kLongDecimalMax )},
2192
+ " Cannot cast REAL '9.999999680285692E37' to DECIMAL(20, 2). Result overflows." );
2193
+ testThrow<float >(
2194
+ REAL (),
2195
+ DECIMAL (20 , 2 ),
2196
+ {static_cast <float >(DecimalUtil::kLongDecimalMin )},
2197
+ " Cannot cast REAL '-9.999999680285692E37' to DECIMAL(20, 2). Result overflows." );
2198
+ testThrow<float >(
2199
+ REAL (),
2200
+ DECIMAL (38 , 2 ),
2201
+ {std::numeric_limits<float >::max ()},
2202
+ " Cannot cast REAL '3.4028234663852886E38' to DECIMAL(38, 2). Result overflows." );
2203
+ testThrow<float >(
2204
+ REAL (),
2205
+ DECIMAL (38 , 2 ),
2206
+ {std::numeric_limits<float >::lowest ()},
2207
+ " Cannot cast REAL '-3.4028234663852886E38' to DECIMAL(38, 2). Result overflows." );
2208
+ testCast (
2209
+ makeConstant<float >(std::numeric_limits<float >::min (), 1 ),
2210
+ makeConstant<int128_t >(0 , 1 , DECIMAL (38 , 2 )));
2211
+
2212
+ testThrow<float >(
2213
+ REAL (),
2214
+ DECIMAL (38 , 2 ),
2215
+ {INFINITY},
2216
+ " Cannot cast REAL 'Infinity' to DECIMAL(38, 2). The input value should be finite." );
2217
+ testThrow<float >(
2218
+ REAL (),
2219
+ DECIMAL (38 , 2 ),
2220
+ {NAN},
2221
+ " Cannot cast REAL 'NaN' to DECIMAL(38, 2). The input value should be finite." );
2222
+ }
2223
+
2088
2224
TEST_F (CastExprTest, primitiveNullConstant) {
2089
2225
// Evaluate cast(NULL::double as bigint).
2090
2226
auto cast =
0 commit comments