/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.facebook.presto.type;
import com.facebook.presto.operator.scalar.AbstractTestFunctions;
import org.testng.annotations.Test;
import static com.facebook.presto.spi.type.BigintType.BIGINT;
import static com.facebook.presto.spi.type.BooleanType.BOOLEAN;
import static com.facebook.presto.spi.type.DoubleType.DOUBLE;
import static com.facebook.presto.spi.type.IntegerType.INTEGER;
import static com.facebook.presto.spi.type.RealType.REAL;
import static com.facebook.presto.spi.type.SmallintType.SMALLINT;
import static com.facebook.presto.spi.type.TinyintType.TINYINT;
import static com.facebook.presto.spi.type.VarcharType.VARCHAR;
public class TestDecimalCasts
extends AbstractTestFunctions
{
@Test
public void testBooleanToDecimalCasts()
{
assertDecimalFunction("CAST(true AS DECIMAL(2, 0))", decimal("01"));
assertDecimalFunction("CAST(true AS DECIMAL(3, 1))", decimal("01.0"));
assertDecimalFunction("CAST(true AS DECIMAL)", maxPrecisionDecimal(1));
assertDecimalFunction("CAST(true AS DECIMAL(2))", decimal("01"));
assertDecimalFunction("CAST(false AS DECIMAL(2, 0))", decimal("00"));
assertDecimalFunction("CAST(false AS DECIMAL(2))", decimal("00"));
assertDecimalFunction("CAST(false AS DECIMAL)", maxPrecisionDecimal(0));
assertDecimalFunction("CAST(true AS DECIMAL(18, 0))", decimal("000000000000000001"));
assertDecimalFunction("CAST(false AS DECIMAL(18, 2))", decimal("0000000000000000.00"));
assertDecimalFunction("CAST(true AS DECIMAL(20, 10))", decimal("0000000001.0000000000"));
assertDecimalFunction("CAST(false AS DECIMAL(20, 10))", decimal("0000000000.0000000000"));
assertDecimalFunction("CAST(true as DECIMAL(30, 20))", decimal("0000000001.00000000000000000000"));
assertDecimalFunction("CAST(false as DECIMAL(30, 20))", decimal("0000000000.00000000000000000000"));
}
@Test
public void testDecimalToBooleanCasts()
{
assertFunction("CAST(DECIMAL '1.1' AS BOOLEAN)", BOOLEAN, true);
assertFunction("CAST(DECIMAL '-1.1' AS BOOLEAN)", BOOLEAN, true);
assertFunction("CAST(DECIMAL '0.0' AS BOOLEAN)", BOOLEAN, false);
assertFunction("CAST(DECIMAL '1234567890.1234567890' AS BOOLEAN)", BOOLEAN, true);
assertFunction("CAST(DECIMAL '-1234567890.1234567890' AS BOOLEAN)", BOOLEAN, true);
assertFunction("CAST(DECIMAL '0.0000000000000000000' AS BOOLEAN)", BOOLEAN, false);
assertFunction("CAST(DECIMAL '00000000000000001.0' AS BOOLEAN)", BOOLEAN, true);
assertFunction("CAST(DECIMAL '000000000000000.000' AS BOOLEAN)", BOOLEAN, false);
assertFunction("CAST(DECIMAL '0000000001.00000000000000000000' as BOOLEAN)", BOOLEAN, true);
assertFunction("CAST(DECIMAL '0000000000.00000000000000000000' as BOOLEAN)", BOOLEAN, false);
}
@Test
public void testBigintToDecimalCasts()
{
assertDecimalFunction("CAST(BIGINT '234' AS DECIMAL(4,1))", decimal("234.0"));
assertDecimalFunction("CAST(BIGINT '234' AS DECIMAL(5,2))", decimal("234.00"));
assertDecimalFunction("CAST(BIGINT '234' AS DECIMAL(4,0))", decimal("0234"));
assertDecimalFunction("CAST(BIGINT '-234' AS DECIMAL(4,1))", decimal("-234.0"));
assertDecimalFunction("CAST(BIGINT '0' AS DECIMAL(4,2))", decimal("00.00"));
assertDecimalFunction("CAST(BIGINT '12345678901234567' AS DECIMAL(17, 0))", decimal("12345678901234567"));
assertDecimalFunction("CAST(BIGINT '123456789012345679' AS DECIMAL(18, 0))", decimal("123456789012345679"));
assertDecimalFunction("CAST(BIGINT '1234567890' AS DECIMAL(20, 10))", decimal("1234567890.0000000000"));
assertDecimalFunction("CAST(BIGINT '-1234567890' AS DECIMAL(20, 10))", decimal("-1234567890.0000000000"));
assertDecimalFunction("CAST(BIGINT '1234567890' AS DECIMAL(30, 20))", decimal("1234567890.00000000000000000000"));
assertDecimalFunction("CAST(BIGINT '-1234567890' AS DECIMAL(30, 20))", decimal("-1234567890.00000000000000000000"));
assertDecimalFunction("CAST(BIGINT '-1234567' AS DECIMAL(17, 10))", decimal("-1234567.0000000000"));
assertInvalidCast("CAST(BIGINT '10' AS DECIMAL(38,37))", "Cannot cast BIGINT '10' to DECIMAL(38, 37)");
assertInvalidCast("CAST(BIGINT '1234567890' AS DECIMAL(17,10))", "Cannot cast BIGINT '1234567890' to DECIMAL(17, 10)");
assertInvalidCast("CAST(BIGINT '123' AS DECIMAL(2,1))", "Cannot cast BIGINT '123' to DECIMAL(2, 1)");
assertInvalidCast("CAST(BIGINT '-123' AS DECIMAL(2,1))", "Cannot cast BIGINT '-123' to DECIMAL(2, 1)");
assertInvalidCast("CAST(BIGINT '123456789012345678' AS DECIMAL(17,1))", "Cannot cast BIGINT '123456789012345678' to DECIMAL(17, 1)");
assertInvalidCast("CAST(BIGINT '12345678901' AS DECIMAL(20, 10))", "Cannot cast BIGINT '12345678901' to DECIMAL(20, 10)");
}
@Test
public void testIntegerToDecimalCasts()
{
assertDecimalFunction("CAST(INTEGER '234' AS DECIMAL(4,1))", decimal("234.0"));
assertDecimalFunction("CAST(INTEGER '234' AS DECIMAL(5,2))", decimal("234.00"));
assertDecimalFunction("CAST(INTEGER '234' AS DECIMAL(4,0))", decimal("0234"));
assertDecimalFunction("CAST(INTEGER '-234' AS DECIMAL(4,1))", decimal("-234.0"));
assertDecimalFunction("CAST(INTEGER '0' AS DECIMAL(4,2))", decimal("00.00"));
assertDecimalFunction("CAST(INTEGER '1345678901' AS DECIMAL(18,8))", decimal("1345678901.00000000"));
assertDecimalFunction("CAST(INTEGER '1234567890' AS DECIMAL(20, 10))", decimal("1234567890.0000000000"));
assertDecimalFunction("CAST(INTEGER '-1234567890' AS DECIMAL(20, 10))", decimal("-1234567890.0000000000"));
assertDecimalFunction("CAST(INTEGER '1234567890' AS DECIMAL(30, 20))", decimal("1234567890.00000000000000000000"));
assertDecimalFunction("CAST(INTEGER '-1234567890' AS DECIMAL(30, 20))", decimal("-1234567890.00000000000000000000"));
assertInvalidCast("CAST(INTEGER '10' AS DECIMAL(38,37))", "Cannot cast INTEGER '10' to DECIMAL(38, 37)");
assertInvalidCast("CAST(INTEGER '1234567890' AS DECIMAL(17,10))", "Cannot cast INTEGER '1234567890' to DECIMAL(17, 10)");
assertInvalidCast("CAST(INTEGER '123' AS DECIMAL(2,1))", "Cannot cast INTEGER '123' to DECIMAL(2, 1)");
assertInvalidCast("CAST(INTEGER '-123' AS DECIMAL(2,1))", "Cannot cast INTEGER '-123' to DECIMAL(2, 1)");
}
@Test
public void testSmallintToDecimalCasts()
{
assertDecimalFunction("CAST(SMALLINT '234' AS DECIMAL(4,1))", decimal("234.0"));
assertDecimalFunction("CAST(SMALLINT '234' AS DECIMAL(5,2))", decimal("234.00"));
assertDecimalFunction("CAST(SMALLINT '234' AS DECIMAL(4,0))", decimal("0234"));
assertDecimalFunction("CAST(SMALLINT '-234' AS DECIMAL(4,1))", decimal("-234.0"));
assertDecimalFunction("CAST(SMALLINT '0' AS DECIMAL(4,2))", decimal("00.00"));
assertDecimalFunction("CAST(SMALLINT '1234' AS DECIMAL(20, 10))", decimal("0000001234.0000000000"));
assertDecimalFunction("CAST(SMALLINT '-1234' AS DECIMAL(20, 10))", decimal("-0000001234.0000000000"));
assertDecimalFunction("CAST(SMALLINT '1234' AS DECIMAL(30, 20))", decimal("0000001234.00000000000000000000"));
assertDecimalFunction("CAST(SMALLINT '-1234' AS DECIMAL(30, 20))", decimal("-0000001234.00000000000000000000"));
assertDecimalFunction("CAST(SMALLINT '12345' AS DECIMAL(18,13))", decimal("12345.0000000000000"));
assertInvalidCast("CAST(SMALLINT '10' AS DECIMAL(38,37))", "Cannot cast SMALLINT '10' to DECIMAL(38, 37)");
assertInvalidCast("CAST(SMALLINT '1234' AS DECIMAL(17,14))", "Cannot cast SMALLINT '1234' to DECIMAL(17, 14)");
assertInvalidCast("CAST(SMALLINT '123' AS DECIMAL(2,1))", "Cannot cast SMALLINT '123' to DECIMAL(2, 1)");
assertInvalidCast("CAST(SMALLINT '-123' AS DECIMAL(2,1))", "Cannot cast SMALLINT '-123' to DECIMAL(2, 1)");
}
@Test
public void testTinyintToDecimalCasts()
{
assertDecimalFunction("CAST(TINYINT '23' AS DECIMAL(4,1))", decimal("023.0"));
assertDecimalFunction("CAST(TINYINT '23' AS DECIMAL(5,2))", decimal("023.00"));
assertDecimalFunction("CAST(TINYINT '23' AS DECIMAL(4,0))", decimal("0023"));
assertDecimalFunction("CAST(TINYINT '-23' AS DECIMAL(4,1))", decimal("-023.0"));
assertDecimalFunction("CAST(TINYINT '0' AS DECIMAL(4,2))", decimal("00.00"));
assertDecimalFunction("CAST(TINYINT '123' AS DECIMAL(20, 10))", decimal("0000000123.0000000000"));
assertDecimalFunction("CAST(TINYINT '-123' AS DECIMAL(20, 10))", decimal("-0000000123.0000000000"));
assertDecimalFunction("CAST(TINYINT '123' AS DECIMAL(30, 20))", decimal("0000000123.00000000000000000000"));
assertDecimalFunction("CAST(TINYINT '-123' AS DECIMAL(30, 20))", decimal("-0000000123.00000000000000000000"));
assertDecimalFunction("CAST(TINYINT '123' AS DECIMAL(18,15))", decimal("123.000000000000000"));
assertInvalidCast("CAST(TINYINT '10' AS DECIMAL(38,37))", "Cannot cast TINYINT '10' to DECIMAL(38, 37)");
assertInvalidCast("CAST(TINYINT '123' AS DECIMAL(17,15))", "Cannot cast TINYINT '123' to DECIMAL(17, 15)");
assertInvalidCast("CAST(TINYINT '123' AS DECIMAL(2,1))", "Cannot cast TINYINT '123' to DECIMAL(2, 1)");
assertInvalidCast("CAST(TINYINT '-123' AS DECIMAL(2,1))", "Cannot cast TINYINT '-123' to DECIMAL(2, 1)");
}
@Test
public void testDecimalToBigintCasts()
{
assertFunction("CAST(DECIMAL '2.34' AS BIGINT)", BIGINT, 2L);
assertFunction("CAST(DECIMAL '2.5' AS BIGINT)", BIGINT, 3L);
assertFunction("CAST(DECIMAL '2.49' AS BIGINT)", BIGINT, 2L);
assertFunction("CAST(DECIMAL '20' AS BIGINT)", BIGINT, 20L);
assertFunction("CAST(DECIMAL '1' AS BIGINT)", BIGINT, 1L);
assertFunction("CAST(DECIMAL '0' AS BIGINT)", BIGINT, 0L);
assertFunction("CAST(DECIMAL '-20' AS BIGINT)", BIGINT, -20L);
assertFunction("CAST(DECIMAL '-1' AS BIGINT)", BIGINT, -1L);
assertFunction("CAST(DECIMAL '-2.49' AS BIGINT)", BIGINT, -2L);
assertFunction("CAST(DECIMAL '-2.5' AS BIGINT)", BIGINT, -3L);
assertFunction("CAST(DECIMAL '0.1234567890123456' AS BIGINT)", BIGINT, 0L);
assertFunction("CAST(DECIMAL '0.9999999999999999' AS BIGINT)", BIGINT, 1L);
assertFunction("CAST(DECIMAL '0.00000000000000000000' AS BIGINT)", BIGINT, 0L);
assertFunction("CAST(DECIMAL '0.99999999999999999999' AS BIGINT)", BIGINT, 1L);
assertFunction("CAST(DECIMAL '123.999999999999999' AS BIGINT)", BIGINT, 124L);
assertFunction("CAST(DECIMAL '999999999999999999' AS BIGINT)", BIGINT, 999999999999999999L);
assertFunction("CAST(DECIMAL '1234567890.1234567890' AS BIGINT)", BIGINT, 1234567890L);
assertFunction("CAST(DECIMAL '-1234567890.1234567890' AS BIGINT)", BIGINT, -1234567890L);
assertInvalidCast("CAST(DECIMAL '12345678901234567890' AS BIGINT)", "Cannot cast '12345678901234567890' to BIGINT");
}
@Test
public void testDecimalToIntegerCasts()
{
assertFunction("CAST(DECIMAL '2.34' AS INTEGER)", INTEGER, 2);
assertFunction("CAST(DECIMAL '2.5' AS INTEGER)", INTEGER, 3);
assertFunction("CAST(DECIMAL '2.49' AS INTEGER)", INTEGER, 2);
assertFunction("CAST(DECIMAL '20' AS INTEGER)", INTEGER, 20);
assertFunction("CAST(DECIMAL '1' AS INTEGER)", INTEGER, 1);
assertFunction("CAST(DECIMAL '0' AS INTEGER)", INTEGER, 0);
assertFunction("CAST(DECIMAL '-20' AS INTEGER)", INTEGER, -20);
assertFunction("CAST(DECIMAL '-1' AS INTEGER)", INTEGER, -1);
assertFunction("CAST(DECIMAL '-2.49' AS INTEGER)", INTEGER, -2);
assertFunction("CAST(DECIMAL '-2.5' AS INTEGER)", INTEGER, -3);
assertFunction("CAST(DECIMAL '0.1234567890123456' AS INTEGER)", INTEGER, 0);
assertFunction("CAST(DECIMAL '0.9999999999999999' AS INTEGER)", INTEGER, 1);
assertFunction("CAST(DECIMAL '0.00000000000000000000' AS INTEGER)", INTEGER, 0);
assertFunction("CAST(DECIMAL '0.99999999999999999999' AS INTEGER)", INTEGER, 1);
assertFunction("CAST(DECIMAL '123.999999999999999' AS INTEGER)", INTEGER, 124);
assertFunction("CAST(DECIMAL '1234567890.1234567890' AS INTEGER)", INTEGER, 1234567890);
assertFunction("CAST(DECIMAL '-1234567890.1234567890' AS INTEGER)", INTEGER, -1234567890);
assertInvalidCast("CAST(DECIMAL '12345678901234567890' AS INTEGER)", "Cannot cast '12345678901234567890' to INTEGER");
}
@Test
public void testDecimalToSmallintCasts()
{
assertFunction("CAST(DECIMAL '2.34' AS SMALLINT)", SMALLINT, (short) 2);
assertFunction("CAST(DECIMAL '2.5' AS SMALLINT)", SMALLINT, (short) 3);
assertFunction("CAST(DECIMAL '2.49' AS SMALLINT)", SMALLINT, (short) 2);
assertFunction("CAST(DECIMAL '20' AS SMALLINT)", SMALLINT, (short) 20);
assertFunction("CAST(DECIMAL '1' AS SMALLINT)", SMALLINT, (short) 1);
assertFunction("CAST(DECIMAL '0' AS SMALLINT)", SMALLINT, (short) 0);
assertFunction("CAST(DECIMAL '-20' AS SMALLINT)", SMALLINT, (short) -20);
assertFunction("CAST(DECIMAL '-1' AS SMALLINT)", SMALLINT, (short) -1);
assertFunction("CAST(DECIMAL '-2.49' AS SMALLINT)", SMALLINT, (short) -2);
assertFunction("CAST(DECIMAL '-2.5' AS SMALLINT)", SMALLINT, (short) -3);
assertFunction("CAST(DECIMAL '0.1234567890123456' AS SMALLINT)", SMALLINT, (short) 0);
assertFunction("CAST(DECIMAL '0.9999999999999999' AS SMALLINT)", SMALLINT, (short) 1);
assertFunction("CAST(DECIMAL '0.00000000000000000000' AS SMALLINT)", SMALLINT, (short) 0);
assertFunction("CAST(DECIMAL '0.99999999999999999999' AS SMALLINT)", SMALLINT, (short) 1);
assertFunction("CAST(DECIMAL '123.999999999999999' AS SMALLINT)", SMALLINT, (short) 124);
assertFunction("CAST(DECIMAL '1234.1234567890' AS SMALLINT)", SMALLINT, (short) 1234);
assertFunction("CAST(DECIMAL '-1234.1234567890' AS SMALLINT)", SMALLINT, (short) -1234);
assertInvalidCast("CAST(DECIMAL '12345678901234567890' AS SMALLINT)", "Cannot cast '12345678901234567890' to SMALLINT");
}
@Test
public void testDecimalToTinyintCasts()
{
assertFunction("CAST(DECIMAL '2.34' AS TINYINT)", TINYINT, (byte) 2);
assertFunction("CAST(DECIMAL '2.5' AS TINYINT)", TINYINT, (byte) 3);
assertFunction("CAST(DECIMAL '2.49' AS TINYINT)", TINYINT, (byte) 2);
assertFunction("CAST(DECIMAL '20' AS TINYINT)", TINYINT, (byte) 20);
assertFunction("CAST(DECIMAL '1' AS TINYINT)", TINYINT, (byte) 1);
assertFunction("CAST(DECIMAL '0' AS TINYINT)", TINYINT, (byte) 0);
assertFunction("CAST(DECIMAL '-20' AS TINYINT)", TINYINT, (byte) -20);
assertFunction("CAST(DECIMAL '-1' AS TINYINT)", TINYINT, (byte) -1);
assertFunction("CAST(DECIMAL '-2.49' AS TINYINT)", TINYINT, (byte) -2);
assertFunction("CAST(DECIMAL '-2.5' AS TINYINT)", TINYINT, (byte) -3);
assertFunction("CAST(DECIMAL '0.1234567890123456' AS TINYINT)", TINYINT, (byte) 0);
assertFunction("CAST(DECIMAL '0.9999999999999999' AS TINYINT)", TINYINT, (byte) 1);
assertFunction("CAST(DECIMAL '0.00000000000000000000' AS TINYINT)", TINYINT, (byte) 0);
assertFunction("CAST(DECIMAL '0.99999999999999999999' AS TINYINT)", TINYINT, (byte) 1);
assertFunction("CAST(DECIMAL '123.999999999999999' AS TINYINT)", TINYINT, (byte) 124);
assertFunction("CAST(DECIMAL '12.1234567890' AS TINYINT)", TINYINT, (byte) 12);
assertFunction("CAST(DECIMAL '-12.1234567890' AS TINYINT)", TINYINT, (byte) -12);
assertInvalidCast("CAST(DECIMAL '12345678901234567890' AS TINYINT)", "Cannot cast '12345678901234567890' to TINYINT");
}
@Test
public void testDoubleToShortDecimalCasts()
{
assertDecimalFunction("CAST(DOUBLE '234.0' AS DECIMAL(4,1))", decimal("234.0"));
assertDecimalFunction("CAST(DOUBLE '.01' AS DECIMAL(3,3))", decimal(".010"));
assertDecimalFunction("CAST(DOUBLE '.0' AS DECIMAL(3,3))", decimal(".000"));
assertDecimalFunction("CAST(DOUBLE '0.0' AS DECIMAL(1,0))", decimal("0"));
assertDecimalFunction("CAST(DOUBLE '0.0' AS DECIMAL(4,0))", decimal("0000"));
assertDecimalFunction("CAST(DOUBLE '1000.0' AS DECIMAL(4,0))", decimal("1000"));
assertDecimalFunction("CAST(DOUBLE '1000.01' AS DECIMAL(7,2))", decimal("01000.01"));
assertDecimalFunction("CAST(DOUBLE '-234.0' AS DECIMAL(3,0))", decimal("-234"));
assertDecimalFunction("CAST(DOUBLE '1234567890123456.0' AS DECIMAL(16,0))", decimal("1234567890123456"));
assertDecimalFunction("CAST(DOUBLE '-1234567890123456.0' AS DECIMAL(16,0))", decimal("-1234567890123456"));
assertDecimalFunction("CAST(DOUBLE '1234567890123456.0' AS DECIMAL(17,0))", decimal("01234567890123456"));
assertDecimalFunction("CAST(DOUBLE '-1234567890123456.0' AS DECIMAL(17,0))", decimal("-01234567890123456"));
assertDecimalFunction("CAST(DOUBLE '1234567890.0' AS DECIMAL(20,10))", decimal("1234567890.0000000000"));
assertDecimalFunction("CAST(DOUBLE '-1234567890.0' AS DECIMAL(20,10))", decimal("-1234567890.0000000000"));
assertDecimalFunction("CAST(DOUBLE '1234567890.0' AS DECIMAL(30,20))", decimal("1234567890.00000000000000000000"));
assertDecimalFunction("CAST(DOUBLE '-1234567890.0' AS DECIMAL(30,20))", decimal("-1234567890.00000000000000000000"));
assertDecimalFunction("CAST(DOUBLE '123456789123456784' AS DECIMAL(18,0))", decimal("123456789123456784"));
assertDecimalFunction("CAST(DOUBLE '123456789.123456791' AS DECIMAL(18,9))", decimal("123456789.123456791"));
// test rounding
assertDecimalFunction("CAST(DOUBLE '1234567890.49' AS DECIMAL(16,0))", decimal("0000001234567890"));
assertDecimalFunction("CAST(DOUBLE '1234567890.51' AS DECIMAL(16,0))", decimal("0000001234567891"));
assertDecimalFunction("CAST(DOUBLE '-1234567890.49' AS DECIMAL(16,0))", decimal("-0000001234567890"));
assertDecimalFunction("CAST(DOUBLE '-1234567890.51' AS DECIMAL(16,0))", decimal("-0000001234567891"));
assertInvalidCast("CAST(DOUBLE '100.02' AS DECIMAL(17,16))", "Cannot cast DOUBLE '100.02' to DECIMAL(17, 16)");
assertInvalidCast("CAST(DOUBLE '234.0' AS DECIMAL(2,0))", "Cannot cast DOUBLE '234.0' to DECIMAL(2, 0)");
assertInvalidCast("CAST(DOUBLE '1000.01' AS DECIMAL(5,2))", "Cannot cast DOUBLE '1000.01' to DECIMAL(5, 2)");
assertInvalidCast("CAST(DOUBLE '-234.0' AS DECIMAL(2,0))", "Cannot cast DOUBLE '-234.0' to DECIMAL(2, 0)");
assertInvalidCast("CAST(infinity() AS DECIMAL(17,16))", "Cannot cast DOUBLE 'Infinity' to DECIMAL(17, 16)");
assertInvalidCast("CAST(nan() AS DECIMAL(10,5))", "Cannot cast DOUBLE 'NaN' to DECIMAL(10, 5)");
assertInvalidCast("CAST(infinity() AS DECIMAL(10,1))", "Cannot cast DOUBLE 'Infinity' to DECIMAL(10, 1)");
assertInvalidCast("CAST(-infinity() AS DECIMAL(1,1))", "Cannot cast DOUBLE '-Infinity' to DECIMAL(1, 1)");
}
@Test
public void testDoubleToLongDecimalCasts()
{
assertDecimalFunction("CAST(DOUBLE '234.0' AS DECIMAL(20,1))", decimal("0000000000000000234.0"));
assertDecimalFunction("CAST(DOUBLE '.25' AS DECIMAL(20,5))", decimal("000000000000000.25000"));
assertDecimalFunction("CAST(DOUBLE '.01' AS DECIMAL(20,3))", decimal("00000000000000000.010"));
assertDecimalFunction("CAST(DOUBLE '.0' AS DECIMAL(20,3))", decimal("00000000000000000.000"));
assertDecimalFunction("CAST(DOUBLE '0.0' AS DECIMAL(20,0))", decimal("00000000000000000000"));
assertDecimalFunction("CAST(DOUBLE '1000.01' AS DECIMAL(20,2))", decimal("000000000000001000.01"));
assertDecimalFunction("CAST(DOUBLE '-234.0' AS DECIMAL(20,0))", decimal("-00000000000000000234"));
assertDecimalFunction("CAST(DOUBLE '12345678901234567.0' AS DECIMAL(20,0))", decimal("00012345678901234568"));
assertDecimalFunction("CAST(DOUBLE '-12345678901234567.0' AS DECIMAL(20,0))", decimal("-00012345678901234568"));
assertDecimalFunction("CAST(DOUBLE '1234567890.0' AS DECIMAL(20,10))", decimal("1234567890.0000000000"));
assertDecimalFunction("CAST(DOUBLE '-1234567890.0' AS DECIMAL(20,10))", decimal("-1234567890.0000000000"));
assertDecimalFunction("CAST(DOUBLE '1234567890123456.9' AS DECIMAL(16,0))", decimal("1234567890123457"));
assertDecimalFunction("CAST(DOUBLE '-1234567890123456.9' AS DECIMAL(16,0))", decimal("-1234567890123457"));
// test rounding
assertDecimalFunction("CAST(DOUBLE '1234567890.49' AS DECIMAL(20,0))", decimal("00000000001234567890"));
assertDecimalFunction("CAST(DOUBLE '1234567890.51' AS DECIMAL(20,0))", decimal("00000000001234567891"));
assertDecimalFunction("CAST(DOUBLE '-1234567890.49' AS DECIMAL(20,0))", decimal("-00000000001234567890"));
assertDecimalFunction("CAST(DOUBLE '-1234567890.51' AS DECIMAL(20,0))", decimal("-00000000001234567891"));
assertInvalidCast("CAST(DOUBLE '100.02' AS DECIMAL(38,37))", "Cannot cast DOUBLE '100.02' to DECIMAL(38, 37)");
assertInvalidCast("CAST(DOUBLE '234000000000000000000.0' AS DECIMAL(20,0))", "Cannot cast DOUBLE '2.34E20' to DECIMAL(20, 0)");
assertInvalidCast("CAST(DOUBLE '1000000000000000000.01' AS DECIMAL(20,2))", "Cannot cast DOUBLE '1.0E18' to DECIMAL(20, 2)");
assertInvalidCast("CAST(DOUBLE '-234000000000000000000.0' AS DECIMAL(20,0))", "Cannot cast DOUBLE '-2.34E20' to DECIMAL(20, 0)");
assertInvalidCast("CAST(DOUBLE '12345678901.1' AS DECIMAL(20, 10))", "Cannot cast DOUBLE '1.23456789011E10' to DECIMAL(20, 10)");
assertInvalidCast("CAST(infinity() AS DECIMAL(38,37))", "Cannot cast DOUBLE 'Infinity' to DECIMAL(38, 37)");
assertInvalidCast("CAST(nan() AS DECIMAL(38,10))", "Cannot cast DOUBLE 'NaN' to DECIMAL(38, 10)");
assertInvalidCast("CAST(infinity() AS DECIMAL(38,2))", "Cannot cast DOUBLE 'Infinity' to DECIMAL(38, 2)");
assertInvalidCast("CAST(-infinity() AS DECIMAL(38,1))", "Cannot cast DOUBLE '-Infinity' to DECIMAL(38, 1)");
assertInvalidCast("CAST(nan() AS DECIMAL(10,5))", "Cannot cast DOUBLE 'NaN' to DECIMAL(10, 5)");
assertInvalidCast("CAST(infinity() AS DECIMAL(10,1))", "Cannot cast DOUBLE 'Infinity' to DECIMAL(10, 1)");
assertInvalidCast("CAST(-infinity() AS DECIMAL(1,1))", "Cannot cast DOUBLE '-Infinity' to DECIMAL(1, 1)");
}
@Test
public void testDecimalToDoubleCasts()
{
assertFunction("CAST(DECIMAL '2.34' AS DOUBLE)", DOUBLE, 2.34);
assertFunction("CAST(DECIMAL '0' AS DOUBLE)", DOUBLE, 0.0);
assertFunction("CAST(DECIMAL '1' AS DOUBLE)", DOUBLE, 1.0);
assertFunction("CAST(DECIMAL '-2.49' AS DOUBLE)", DOUBLE, -2.49);
assertFunction("CAST(DECIMAL '123456789123456784' AS DOUBLE)", DOUBLE, 123456789123456784d);
assertFunction("CAST(DECIMAL '123456789.123456791' AS DOUBLE)", DOUBLE, 123456789.123456791d);
assertFunction("CAST(CAST(DECIMAL '0' AS DECIMAL(20, 2)) AS DOUBLE)", DOUBLE, 0.0);
assertFunction("CAST(CAST(DECIMAL '12.12' AS DECIMAL(20, 2)) AS DOUBLE)", DOUBLE, 12.12);
assertFunction("CAST(DECIMAL '1234567890.1234567890' AS DOUBLE)", DOUBLE, 1234567890.1234567890);
assertFunction("CAST(DECIMAL '-1234567890.1234567890' AS DOUBLE)", DOUBLE, -1234567890.1234567890);
assertFunction("CAST(DECIMAL '1234567890.12345678900000000000' AS DOUBLE)", DOUBLE, 1234567890.1234567890);
assertFunction("CAST(DECIMAL '-1234567890.12345678900000000000' AS DOUBLE)", DOUBLE, -1234567890.1234567890);
assertFunction("CAST(DECIMAL '-1234567890123456789012345678' AS DOUBLE)", DOUBLE, -1.2345678901234569E27);
assertFunction("CAST(DECIMAL '99999999999999999999999999999999999999' AS DOUBLE)", DOUBLE, 1.0E38);
}
@Test
public void testFloatToDecimalCasts()
{
assertDecimalFunction("CAST(REAL '234.0' AS DECIMAL(4,1))", decimal("234.0"));
assertDecimalFunction("CAST(REAL '.01' AS DECIMAL(3,3))", decimal(".010"));
assertDecimalFunction("CAST(REAL '.0' AS DECIMAL(3,3))", decimal(".000"));
assertDecimalFunction("CAST(REAL '0' AS DECIMAL(1,0))", decimal("0"));
assertDecimalFunction("CAST(REAL '0' AS DECIMAL(4,0))", decimal("0000"));
assertDecimalFunction("CAST(REAL '1000' AS DECIMAL(4,0))", decimal("1000"));
assertDecimalFunction("CAST(REAL '1000.01' AS DECIMAL(7,2))", decimal("01000.01"));
assertDecimalFunction("CAST(REAL '-234.0' AS DECIMAL(3,0))", decimal("-234"));
assertDecimalFunction("CAST(REAL '12345678407663616' AS DECIMAL(17,0))", decimal("12345678407663616"));
assertDecimalFunction("CAST(REAL '-12345678407663616' AS DECIMAL(17,0))", decimal("-12345678407663616"));
assertDecimalFunction("CAST(REAL '1234567936' AS DECIMAL(20,10))", decimal("1234567936.0000000000"));
assertDecimalFunction("CAST(REAL '-1234567936' AS DECIMAL(20,10))", decimal("-1234567936.0000000000"));
assertDecimalFunction("CAST(REAL '1234567936' AS DECIMAL(30,20))", decimal("1234567936.00000000000000000000"));
assertDecimalFunction("CAST(REAL '-1234567936' AS DECIMAL(30,20))", decimal("-1234567936.00000000000000000000"));
assertDecimalFunction("CAST(REAL '123456790519087104' AS DECIMAL(18,0))", decimal("123456790519087104"));
assertDecimalFunction("CAST(REAL '1456213.432632456' AS DECIMAL(18,9))", decimal("001456213.375000000"));
assertInvalidCast("CAST(REAL '100.02' AS DECIMAL(38,37))", "Cannot cast REAL '100.02' to DECIMAL(38, 37)");
assertInvalidCast("CAST(REAL '100.02' AS DECIMAL(17,16))", "Cannot cast REAL '100.02' to DECIMAL(17, 16)");
assertInvalidCast("CAST(REAL '234.0' AS DECIMAL(2,0))", "Cannot cast REAL '234.0' to DECIMAL(2, 0)");
assertInvalidCast("CAST(REAL '1000.01' AS DECIMAL(5,2))", "Cannot cast REAL '1000.01' to DECIMAL(5, 2)");
assertInvalidCast("CAST(REAL '-234.0' AS DECIMAL(2,0))", "Cannot cast REAL '-234.0' to DECIMAL(2, 0)");
assertInvalidCast("CAST(REAL '98765430784.0' AS DECIMAL(20, 10))", "Cannot cast REAL '9.8765431E10' to DECIMAL(20, 10)");
assertInvalidCast("CAST(CAST(nan() as REAL) AS DECIMAL(10,5))", "Cannot cast REAL 'NaN' to DECIMAL(10, 5)");
assertInvalidCast("CAST(CAST(infinity() as REAL) AS DECIMAL(10,1))", "Cannot cast REAL 'Infinity' to DECIMAL(10, 1)");
assertInvalidCast("CAST(CAST(-infinity() as REAL) AS DECIMAL(1,1))", "Cannot cast REAL '-Infinity' to DECIMAL(1, 1)");
assertInvalidCast("CAST(CAST(nan() as REAL) AS DECIMAL(38,10))", "Cannot cast REAL 'NaN' to DECIMAL(38, 10)");
assertInvalidCast("CAST(CAST(infinity() as REAL) AS DECIMAL(38,2))", "Cannot cast REAL 'Infinity' to DECIMAL(38, 2)");
assertInvalidCast("CAST(CAST(-infinity() as REAL) AS DECIMAL(38,1))", "Cannot cast REAL '-Infinity' to DECIMAL(38, 1)");
}
@Test
public void testDecimalToFloatCasts()
{
assertFunction("CAST(DECIMAL '2.34' AS REAL)", REAL, 2.34f);
assertFunction("CAST(DECIMAL '0' AS REAL)", REAL, 0.0f);
assertFunction("CAST(DECIMAL '-0' AS REAL)", REAL, 0.0f);
assertFunction("CAST(DECIMAL '1' AS REAL)", REAL, 1.0f);
assertFunction("CAST(DECIMAL '-2.49' AS REAL)", REAL, -2.49f);
assertFunction("CAST(DECIMAL '123456790519087104' AS REAL)", REAL, 123456790519087104f);
assertFunction("CAST(DECIMAL '121456.213432632456' AS REAL)", REAL, 121456.21f);
assertFunction("CAST(CAST(DECIMAL '0' AS DECIMAL(20, 2)) AS REAL)", REAL, 0.0f);
assertFunction("CAST(CAST(DECIMAL '12.12' AS DECIMAL(20, 2)) AS REAL)", REAL, 12.12f);
assertFunction("CAST(DECIMAL '1234567890.1234567890' AS REAL)", REAL, 1234567890.1234567890f);
assertFunction("CAST(DECIMAL '-1234567890.1234567890' AS REAL)", REAL, -1234567890.1234567890f);
assertFunction("CAST(DECIMAL '1234567890.12345678900000000000' AS REAL)", REAL, 1234567890.1234567890f);
assertFunction("CAST(DECIMAL '-1234567890.12345678900000000000' AS REAL)", REAL, -1234567890.1234567890f);
assertFunction("CAST(DECIMAL '-1234567890123456789012345678' AS REAL)", REAL, -1.2345678901234569E27f);
assertFunction("CAST(DECIMAL '99999999999999999999999999999999999999' AS REAL)", REAL, 1.0E38f);
}
@Test
public void testVarcharToDecimalCasts()
{
assertDecimalFunction("CAST('234.0' AS DECIMAL(4,1))", decimal("234.0"));
assertDecimalFunction("CAST('.01' AS DECIMAL(3,3))", decimal(".010"));
assertDecimalFunction("CAST('.0' AS DECIMAL(3,3))", decimal(".000"));
assertDecimalFunction("CAST('0' AS DECIMAL(1,0))", decimal("0"));
assertDecimalFunction("CAST('0' AS DECIMAL(4,0))", decimal("0000"));
assertDecimalFunction("CAST('1000' AS DECIMAL(4,0))", decimal("1000"));
assertDecimalFunction("CAST('1000.01' AS DECIMAL(7,2))", decimal("01000.01"));
assertDecimalFunction("CAST('-234.0' AS DECIMAL(3,0))", decimal("-234"));
assertDecimalFunction("CAST('12345678901234567' AS DECIMAL(17,0))", decimal("12345678901234567"));
assertDecimalFunction("CAST('123456789012345679' AS DECIMAL(18,0))", decimal("123456789012345679"));
assertDecimalFunction("CAST('1234567890.12345679' AS DECIMAL(18,8))", decimal("1234567890.12345679"));
assertDecimalFunction("CAST('-12345678901234567' AS DECIMAL(17,0))", decimal("-12345678901234567"));
assertDecimalFunction("CAST('1234567890' AS DECIMAL(20,10))", decimal("1234567890.0000000000"));
assertDecimalFunction("CAST('-1234567890' AS DECIMAL(20,10))", decimal("-1234567890.0000000000"));
assertDecimalFunction("CAST('1234567890' AS DECIMAL(30,20))", decimal("1234567890.00000000000000000000"));
assertDecimalFunction("CAST('-1234567890' AS DECIMAL(30,20))", decimal("-1234567890.00000000000000000000"));
assertInvalidCast("CAST('234.0' AS DECIMAL(2,0))", "Cannot cast VARCHAR '234.0' to DECIMAL(2, 0)");
assertInvalidCast("CAST('1000.01' AS DECIMAL(5,2))", "Cannot cast VARCHAR '1000.01' to DECIMAL(5, 2)");
assertInvalidCast("CAST('-234.0' AS DECIMAL(2,0))", "Cannot cast VARCHAR '-234.0' to DECIMAL(2, 0)");
assertInvalidCast("CAST('12345678901' AS DECIMAL(20, 10))", "Cannot cast VARCHAR '12345678901' to DECIMAL(20, 10)");
}
@Test
public void testDecimalToVarcharCasts()
{
assertFunction("CAST(DECIMAL '2.34' AS VARCHAR)", VARCHAR, "2.34");
assertFunction("CAST(DECIMAL '23400' AS VARCHAR)", VARCHAR, "23400");
assertFunction("CAST(DECIMAL '0.0034' AS VARCHAR)", VARCHAR, "0.0034");
assertFunction("CAST(DECIMAL '0' AS VARCHAR)", VARCHAR, "0");
assertFunction("CAST(DECIMAL '0.1234567890123456' AS VARCHAR)", VARCHAR, "0.1234567890123456");
assertFunction("CAST(DECIMAL '0.12345678901234567' AS VARCHAR)", VARCHAR, "0.12345678901234567");
assertFunction("CAST(DECIMAL '-10' AS VARCHAR)", VARCHAR, "-10");
assertFunction("CAST(DECIMAL '-1.0' AS VARCHAR)", VARCHAR, "-1.0");
assertFunction("CAST(DECIMAL '-1.00' AS VARCHAR)", VARCHAR, "-1.00");
assertFunction("CAST(DECIMAL '-1.00000' AS VARCHAR)", VARCHAR, "-1.00000");
assertFunction("CAST(DECIMAL '-0.1' AS VARCHAR)", VARCHAR, "-0.1");
assertFunction("CAST(DECIMAL '-.001' AS VARCHAR)", VARCHAR, "-0.001");
assertFunction("CAST(DECIMAL '-1234567890.1234567' AS VARCHAR)", VARCHAR, "-1234567890.1234567");
assertFunction("CAST(DECIMAL '1234567890.1234567890' AS VARCHAR)", VARCHAR, "1234567890.1234567890");
assertFunction("CAST(DECIMAL '-1234567890.1234567890' AS VARCHAR)", VARCHAR, "-1234567890.1234567890");
assertFunction("CAST(DECIMAL '1234567890.12345678900000000000' AS VARCHAR)", VARCHAR, "1234567890.12345678900000000000");
assertFunction("CAST(DECIMAL '-1234567890.12345678900000000000' AS VARCHAR)", VARCHAR, "-1234567890.12345678900000000000");
}
}