/* This file is part of VoltDB. * Copyright (C) 2008-2017 VoltDB Inc. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ package org.voltdb.utils; import junit.framework.TestCase; import org.voltdb.VoltType; import org.voltdb.VoltTypeException; public class TestVoltTypeUtil extends TestCase { public void testDetermineImplicitCastingExceptions() { // either INVALID results in VoltTypeException validateVoltTypeCastingException(VoltType.INVALID, VoltType.INTEGER); validateVoltTypeCastingException(VoltType.INTEGER, VoltType.INVALID); // String and non-string throw VoltTypeException validateVoltTypeCastingException(VoltType.STRING, VoltType.INTEGER); validateVoltTypeCastingException(VoltType.INTEGER, VoltType.STRING); } public void testDecimalMixedTypes() { validateVoltTypeCastingException(VoltType.DECIMAL, VoltType.STRING); validateVoltTypeCastingException(VoltType.STRING, VoltType.DECIMAL); validateVoltTypeCastingException(VoltType.DECIMAL, VoltType.TIMESTAMP); // Check that DECIMAL + FLOAT -> FLOAT assertEquals(VoltType.FLOAT, VoltTypeUtil.determineImplicitCasting(VoltType.DECIMAL,VoltType.FLOAT)); // Check that FLOAT + DECIMAL -> FLOAT assertEquals(VoltType.FLOAT, VoltTypeUtil.determineImplicitCasting(VoltType.FLOAT,VoltType.DECIMAL)); // Check that DECIMAL + DECIMAL -> DECIMAL assertEquals(VoltType.DECIMAL, VoltTypeUtil.determineImplicitCasting(VoltType.DECIMAL,VoltType.DECIMAL)); // D + SMALLINT = D assertEquals(VoltType.DECIMAL, VoltTypeUtil.determineImplicitCasting(VoltType.DECIMAL,VoltType.SMALLINT)); } private void validateVoltTypeCastingException(VoltType t1, VoltType t2) { try { VoltTypeUtil.determineImplicitCasting(t1,t2); fail(); } catch (VoltTypeException e) { assertTrue(e.getMessage().contains(String.format(VoltTypeUtil.VoltTypeCastErrorMessage, t1, t2))); } } public void testDetermineImplicitCastingNullWins() { VoltType[] types = { VoltType.BIGINT, VoltType.DECIMAL, VoltType.FLOAT, VoltType.INTEGER, VoltType.SMALLINT, VoltType.STRING, VoltType.TIMESTAMP, VoltType.TINYINT }; for (VoltType right : types) { assertEquals(VoltType.NULL, VoltTypeUtil.determineImplicitCasting(VoltType.NULL,right)); } } public void testDetermineImplicitCastingOrder() { // Check that STRING + STRING -> STRING assertEquals(VoltType.STRING, VoltTypeUtil.determineImplicitCasting(VoltType.STRING,VoltType.STRING)); // Check the easy non-coerced order VoltType[] winning_types = { VoltType.FLOAT, VoltType.BIGINT }; VoltType[] losing_types = { VoltType.FLOAT, VoltType.BIGINT, VoltType.INTEGER, VoltType.SMALLINT, VoltType.TINYINT }; for (int i = 0; i < winning_types.length; ++i) { for (int j = i; j < losing_types.length; ++j) { assertEquals(winning_types[i], VoltTypeUtil.determineImplicitCasting(winning_types[i],losing_types[j])); } } // Finally, check the promotion of INT types if none of the winning types // was present VoltType[] promoted_types = { VoltType.INTEGER, VoltType.SMALLINT, VoltType.TINYINT }; for (int i = 0; i < promoted_types.length; ++i) { for (int j = i; j < promoted_types.length; ++j) { assertEquals(VoltType.BIGINT, VoltTypeUtil.determineImplicitCasting(promoted_types[i],promoted_types[j])); } } assertEquals(VoltType.TIMESTAMP, VoltTypeUtil.determineImplicitCasting(VoltType.TIMESTAMP,VoltType.TIMESTAMP)); // check the invalid timestamp type operation for (int i = 0; i < losing_types.length; ++i) { validateVoltTypeCastingException(VoltType.TIMESTAMP, losing_types[i]); validateVoltTypeCastingException(losing_types[i], VoltType.TIMESTAMP); } } }