@@ -1992,29 +1992,52 @@ TEST_F(CastExprTest, castInTry) {
19921992
19931993TEST_F (CastExprTest, doubleToDecimal) {
19941994 // 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 });
19972006 testCast (
19982007 input,
19992008 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 },
20012019 DECIMAL (10 , 4 )));
20022020
20032021 // Double to long decimal.
20042022 testCast (
20052023 input,
20062024 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 ,
20102028 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 )));
20142036 testCast (
20152037 input,
20162038 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 )));
20182041 testCast (
20192042 makeNullableFlatVector<double >(
20202043 {0.13456789 ,
@@ -2085,6 +2108,119 @@ TEST_F(CastExprTest, doubleToDecimal) {
20852108 " Cannot cast DOUBLE 'NaN' to DECIMAL(38, 2). The input value should be finite." );
20862109}
20872110
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+
20882224TEST_F (CastExprTest, primitiveNullConstant) {
20892225 // Evaluate cast(NULL::double as bigint).
20902226 auto cast =
0 commit comments