@@ -1969,29 +1969,52 @@ TEST_F(CastExprTest, castInTry) {
19691969
19701970TEST_F (CastExprTest, doubleToDecimal) {
19711971 // Double to short decimal.
1972- const auto input =
1973- makeFlatVector<double >({-3333.03 , -2222.02 , -1.0 , 0.00 , 100 , 99999.99 });
1972+ const auto input = makeFlatVector<double >(
1973+ {-3333.03 ,
1974+ -2222.02 ,
1975+ -1.0 ,
1976+ 0.00 ,
1977+ 100 ,
1978+ 99999.99 ,
1979+ 10.03 ,
1980+ 10.05 ,
1981+ 9.95 ,
1982+ -2.123456789 });
19741983 testCast (
19751984 input,
19761985 makeFlatVector<int64_t >(
1977- {-33'330'300 , -22'220'200 , -10'000 , 0 , 1'000'000 , 999'999'900 },
1986+ {-33'330'300 ,
1987+ -22'220'200 ,
1988+ -10'000 ,
1989+ 0 ,
1990+ 1'000'000 ,
1991+ 999'999'900 ,
1992+ 100'300 ,
1993+ 100'500 ,
1994+ 99'500 ,
1995+ -21'235 },
19781996 DECIMAL (10 , 4 )));
19791997
19801998 // Double to long decimal.
19811999 testCast (
19822000 input,
19832001 makeFlatVector<int128_t >(
1984- {- 33'330'300'000'000 ,
1985- - 22'220'200'000'000 ,
1986- -10 '000'000'000 ,
2002+ {HugeInt::build ( 0xFFFFFFFFFFFFFF4B , 0x50EABA2657C90000 ) ,
2003+ HugeInt::build ( 0xFFFFFFFFFFFFFF87 , 0x8B4726C43A860000 ) ,
2004+ -1'000'000'000 '000'000'000 ,
19872005 0 ,
1988- 1'000'000'000'000 ,
1989- 999'999'900'000'000 },
1990- DECIMAL (20 , 10 )));
2006+ HugeInt::build (0x5 , 0x6BC75E2D63100000 ),
2007+ HugeInt::build (0x152D , 0x02A45A5886BF0000 ),
2008+ HugeInt::build (0 , 0x8B31B7DBD92B0000 ),
2009+ HugeInt::build (0 , 0x8B78C5C0B8AD0000 ),
2010+ HugeInt::build (0 , 0x8A1580485B230000 ),
2011+ -2'123'456'789'000'000'000 },
2012+ DECIMAL (38 , 18 )));
19912013 testCast (
19922014 input,
19932015 makeFlatVector<int128_t >(
1994- {-33'330 , -22'220 , -10 , 0 , 1'000 , 1'000'000 }, DECIMAL (20 , 1 )));
2016+ {-33'330 , -22'220 , -10 , 0 , 1'000 , 1'000'000 , 100 , 101 , 100 , -21 },
2017+ DECIMAL (20 , 1 )));
19952018 testCast (
19962019 makeNullableFlatVector<double >(
19972020 {0.13456789 ,
@@ -2062,6 +2085,119 @@ TEST_F(CastExprTest, doubleToDecimal) {
20622085 " Cannot cast DOUBLE 'NaN' to DECIMAL(38, 2). The input value should be finite." );
20632086}
20642087
2088+ TEST_F (CastExprTest, realToDecimal) {
2089+ // Real to short decimal.
2090+ const auto input = makeFlatVector<float >(
2091+ {-3333.03 ,
2092+ -2222.02 ,
2093+ -1.0 ,
2094+ 0.00 ,
2095+ 100 ,
2096+ 99999.9 ,
2097+ 10.03 ,
2098+ 10.05 ,
2099+ 9.95 ,
2100+ -2.12345 });
2101+ testCast (
2102+ input,
2103+ makeFlatVector<int64_t >(
2104+ {-33'330'300 ,
2105+ -22'220'200 ,
2106+ -10'000 ,
2107+ 0 ,
2108+ 1'000'000 ,
2109+ 999'999'000 ,
2110+ 100'300 ,
2111+ 100'500 ,
2112+ 99'500 ,
2113+ -212'35 },
2114+ DECIMAL (10 , 4 )));
2115+
2116+ // Real to long decimal.
2117+ testCast (
2118+ input,
2119+ makeFlatVector<int128_t >(
2120+ {HugeInt::build (0xFFFFFFFFFFFFFF4B , 0x50EABA2657C90000 ),
2121+ HugeInt::build (0xFFFFFFFFFFFFFF87 , 0x8B4726C43A860000 ),
2122+ -1'000'000'000'000'000'000 ,
2123+ 0 ,
2124+ HugeInt::build (0x5 , 0x6BC75E2D63100000 ),
2125+ HugeInt::build (0x152D , 0x01649BD298F60000 ),
2126+ HugeInt::build (0 , 0x8B31B7DBD92B0000 ),
2127+ HugeInt::build (0 , 0x8B78C5C0B8AD0000 ),
2128+ HugeInt::build (0 , 0x8A1580485B230000 ),
2129+ -2'123'450'000'000'000'000 },
2130+ DECIMAL (38 , 18 )));
2131+ testCast (
2132+ input,
2133+ makeFlatVector<int128_t >(
2134+ {-33'330 , -22'220 , -10 , 0 , 1'000 , 999'999 , 100 , 101 , 100 , -21 },
2135+ DECIMAL (20 , 1 )));
2136+ testCast (
2137+ makeNullableFlatVector<float >(
2138+ {0.134567 , 0.000015 , 0.000001 , 0.999999 , 0.123456 , std::nullopt }),
2139+ makeNullableFlatVector<int128_t >(
2140+ {134'567'000'000'000'000 ,
2141+ 15'000'000'000'000 ,
2142+ 1'000'000'000'000 ,
2143+ 999'999'000'000'000'000 ,
2144+ 123'456'000'000'000'000 ,
2145+ std::nullopt },
2146+ DECIMAL (38 , 18 )));
2147+
2148+ testThrow<float >(
2149+ REAL (),
2150+ DECIMAL (10 , 2 ),
2151+ {9999999999999999999999.99 },
2152+ " Cannot cast REAL '9.999999778196308E21' to DECIMAL(10, 2). Result overflows." );
2153+ testThrow<float >(
2154+ REAL (),
2155+ DECIMAL (10 , 2 ),
2156+ {static_cast <float >(
2157+ static_cast <int128_t >(std::numeric_limits<int64_t >::max ()) + 1 )},
2158+ " Cannot cast REAL '9223372036854776000' to DECIMAL(10, 2). Result overflows." );
2159+ testThrow<float >(
2160+ REAL (),
2161+ DECIMAL (10 , 2 ),
2162+ {static_cast <float >(
2163+ static_cast <int128_t >(std::numeric_limits<int64_t >::min ()) - 1 )},
2164+ " Cannot cast REAL '-9223372036854776000' to DECIMAL(10, 2). Result overflows." );
2165+ testThrow<float >(
2166+ REAL (),
2167+ DECIMAL (20 , 2 ),
2168+ {static_cast <float >(DecimalUtil::kLongDecimalMax )},
2169+ " Cannot cast REAL '9.999999680285692E37' to DECIMAL(20, 2). Result overflows." );
2170+ testThrow<float >(
2171+ REAL (),
2172+ DECIMAL (20 , 2 ),
2173+ {static_cast <float >(DecimalUtil::kLongDecimalMin )},
2174+ " Cannot cast REAL '-9.999999680285692E37' to DECIMAL(20, 2). Result overflows." );
2175+ testThrow<float >(
2176+ REAL (),
2177+ DECIMAL (38 , 2 ),
2178+ {std::numeric_limits<float >::max ()},
2179+ " Cannot cast REAL '3.4028234663852886E38' to DECIMAL(38, 2). Result overflows." );
2180+ testThrow<float >(
2181+ REAL (),
2182+ DECIMAL (38 , 2 ),
2183+ {std::numeric_limits<float >::lowest ()},
2184+ " Cannot cast REAL '-3.4028234663852886E38' to DECIMAL(38, 2). Result overflows." );
2185+ testCast (
2186+ makeConstant<float >(std::numeric_limits<float >::min (), 1 ),
2187+ makeConstant<int128_t >(0 , 1 , DECIMAL (38 , 2 )));
2188+
2189+ testThrow<float >(
2190+ REAL (),
2191+ DECIMAL (38 , 2 ),
2192+ {INFINITY},
2193+ " Cannot cast REAL 'Infinity' to DECIMAL(38, 2). The input value should be finite." );
2194+ testThrow<float >(
2195+ REAL (),
2196+ DECIMAL (38 , 2 ),
2197+ {NAN},
2198+ " Cannot cast REAL 'NaN' to DECIMAL(38, 2). The input value should be finite." );
2199+ }
2200+
20652201TEST_F (CastExprTest, primitiveNullConstant) {
20662202 // Evaluate cast(NULL::double as bigint).
20672203 auto cast =
0 commit comments