blob: c23cb74e047c9f570738c3eaa80b76644030e09e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013, Salesforce.com, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* Neither the name of Salesforce.com nor the names of its contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
******************************************************************************/
/**********************************
*
* Later modifications to test Trafodion instead of Phoenix were granted to ASF.
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 test.java.org.trafodion.phoenix.end2end;
import static org.junit.Assert.*;
import org.junit.*;
import java.sql.*;
import java.util.*;
import java.math.*;
public class ArithmeticQueryTest extends BaseTest {
@BeforeClass
public static void doTestSuiteSetup() throws Exception {
/* List all of the object names being used in this entire class.
* The objects are dropped with errors ignored, so it is OK if the
* object does not exist for a particular test.
*/
objDropList = new ArrayList<String>(
Arrays.asList("table testDecimalArithmetic", "table testDecimalArithmatic", "table source", "table target"));
doBaseTestSuiteSetup();
}
/* @AfterClass, @Before, @After are defined in BaseTest */
@Test
public void testDecimalUpsertValue() throws Exception {
printTestDescription();
try {
String ddl = null;
if (tgtPH()) ddl = "CREATE TABLE IF NOT EXISTS testDecimalArithmetic" +
" (pk VARCHAR NOT NULL PRIMARY KEY, " +
"col1 DECIMAL(31,0), col2 DECIMAL(5), col3 DECIMAL(5,2), col4 DECIMAL)";
else if (tgtTR()) ddl = "CREATE TABLE IF NOT EXISTS testDecimalArithmetic" +
" (pk VARCHAR(128) NOT NULL PRIMARY KEY, " +
"col1 DECIMAL(18,0), col2 DECIMAL(5), col3 DECIMAL(5,2), col4 DECIMAL)";
else if (tgtSQ()) ddl = "CREATE TABLE testDecimalArithmetic" +
" (pk VARCHAR(128) NOT NULL PRIMARY KEY, " +
"col1 DECIMAL(18,0), col2 DECIMAL(5), col3 DECIMAL(5,2), col4 DECIMAL)";
conn.createStatement().execute(ddl);
conn.setAutoCommit(false);
// Test upsert correct values
String query = null;
if (tgtPH()||tgtTR()) query = "UPSERT INTO testDecimalArithmetic(pk, col1, col2, col3, col4) VALUES(?,?,?,?,?)";
else if (tgtSQ()) query = "INSERT INTO testDecimalArithmetic(pk, col1, col2, col3, col4) VALUES(?,?,?,?,?)";
PreparedStatement stmt = conn.prepareStatement(query);
stmt.setString(1, "valueOne");
stmt.setBigDecimal(2, new BigDecimal("123456789123456789"));
stmt.setBigDecimal(3, new BigDecimal("12345"));
stmt.setBigDecimal(4, new BigDecimal("12.34"));
stmt.setBigDecimal(5, new BigDecimal("12345.6789"));
stmt.execute();
conn.commit();
query = "SELECT col1, col2, col3, col4 FROM testDecimalArithmetic WHERE pk = 'valueOne'";
stmt = conn.prepareStatement(query);
ResultSet rs = stmt.executeQuery();
assertTrue(rs.next());
assertEquals(new BigDecimal("123456789123456789"), rs.getBigDecimal(1));
assertEquals(new BigDecimal("12345"), rs.getBigDecimal(2));
assertEquals(new BigDecimal("12.34"), rs.getBigDecimal(3));
if (tgtPH()) assertEquals(new BigDecimal("12345.6789"), rs.getBigDecimal(4));
else if (tgtSQ()||tgtTR()) assertTrue(rs.getBigDecimal(4).equals(new BigDecimal("12345")) || rs.getBigDecimal(4).equals(new BigDecimal("12346")));
assertFalse(rs.next());
if (tgtPH()||tgtTR()) query = "UPSERT INTO testDecimalArithmetic(pk, col1, col2, col3) VALUES(?,?,?,?)";
else if (tgtSQ()) query = "INSERT INTO testDecimalArithmetic(pk, col1, col2, col3) VALUES(?,?,?,?)";
stmt = conn.prepareStatement(query);
stmt.setString(1, "valueTwo");
if (tgtPH()) stmt.setBigDecimal(2, new BigDecimal("1234567890123456789012345678901.12345"));
else if (tgtSQ()||tgtTR()) stmt.setBigDecimal(2, new BigDecimal("123456789012345678.12345"));
stmt.setBigDecimal(3, new BigDecimal("12345.6789"));
stmt.setBigDecimal(4, new BigDecimal("123.45678"));
stmt.execute();
conn.commit();
query = "SELECT col1, col2, col3 FROM testDecimalArithmetic WHERE pk = 'valueTwo'";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
if (tgtPH()) assertEquals(new BigDecimal("1234567890123456789012345678901"), rs.getBigDecimal(1));
else if (tgtSQ()||tgtTR()) assertEquals(new BigDecimal("123456789012345678"), rs.getBigDecimal(1));
assertTrue(rs.getBigDecimal(2).equals(new BigDecimal("12345")) || rs.getBigDecimal(2).equals(new BigDecimal("12346")));
assertTrue(rs.getBigDecimal(3).equals(new BigDecimal("123.45")) || rs.getBigDecimal(3).equals(new BigDecimal("123.46")));
assertFalse(rs.next());
// Test upsert incorrect values and confirm exceptions would be thrown.
try {
if (tgtPH()||tgtTR()) query = "UPSERT INTO testDecimalArithmetic(pk, col1, col2, col3) VALUES(?,?,?,?)";
else if (tgtSQ()) query = "INSERT INTO testDecimalArithmetic(pk, col1, col2, col3) VALUES(?,?,?,?)";
stmt = conn.prepareStatement(query);
stmt.setString(1, "badValues");
// one more than max_precision
stmt.setBigDecimal(2, new BigDecimal("12345678901234567890123456789012"));
stmt.setBigDecimal(3, new BigDecimal("12345"));
stmt.setBigDecimal(4, new BigDecimal("123.45"));
stmt.execute();
conn.commit();
fail("Should have caught bad values.");
} catch (Exception e) {
if (tgtPH()) assertTrue(e.getMessage(), e.getMessage().contains("ERROR 206 (22003): The value is outside the range for the data type. value=12345678901234567890123456789012 columnName=COL1"));
// This error message is different between T2 and T4.
// Only make sure that we get an exception now.
// else if (tgtSQ()||tgtTR()) assertTrue(e.getMessage(), e.getMessage().contains("*** ERROR[29188]"));
}
try {
if (tgtPH()||tgtTR()) query = "UPSERT INTO testDecimalArithmetic(pk, col1, col2, col3) VALUES(?,?,?,?)";
else if (tgtSQ()) query = "INSERT INTO testDecimalArithmetic(pk, col1, col2, col3) VALUES(?,?,?,?)";
stmt = conn.prepareStatement(query);
stmt.setString(1, "badValues");
stmt.setBigDecimal(2, new BigDecimal("123456"));
// Exceeds specified precision by 1
stmt.setBigDecimal(3, new BigDecimal("123456"));
stmt.setBigDecimal(4, new BigDecimal("123.45"));
stmt.execute();
conn.commit();
fail("Should have caught bad values.");
} catch (Exception e) {
if (tgtPH()) assertTrue(e.getMessage(), e.getMessage().contains("ERROR 206 (22003): The value is outside the range for the data type. value=123456 columnName=COL2"));
// This error message is different between T2 and T4.
// Only make sure that we get an exception now.
// else if (tgtSQ()||tgtTR()) assertTrue(e.getMessage(), e.getMessage().contains("*** ERROR[29188]"));
}
} finally {
}
}
@Test
public void testDecimalUpsertSelect() throws Exception {
printTestDescription();
try {
String ddl = null;
if (tgtPH()) ddl = "CREATE TABLE IF NOT EXISTS source" +
" (pk VARCHAR NOT NULL PRIMARY KEY, col1 DECIMAL(5,2), col2 DECIMAL(5,1), col3 DECIMAL(5,2), col4 DECIMAL(4,4))";
else if (tgtTR()) ddl = "CREATE TABLE IF NOT EXISTS source" +
" (pk VARCHAR(128) NOT NULL PRIMARY KEY, col1 DECIMAL(5,2), col2 DECIMAL(5,1), col3 DECIMAL(5,2), col4 DECIMAL(4,4))";
else if (tgtSQ()) ddl = "CREATE TABLE source" +
" (pk VARCHAR(128) NOT NULL PRIMARY KEY, col1 DECIMAL(5,2), col2 DECIMAL(5,1), col3 DECIMAL(5,2), col4 DECIMAL(4,4))";
conn.createStatement().execute(ddl);
if (tgtPH()) ddl = "CREATE TABLE IF NOT EXISTS target" +
" (pk VARCHAR NOT NULL PRIMARY KEY, col1 DECIMAL(5,1), col2 DECIMAL(5,2), col3 DECIMAL(4,4))";
else if (tgtTR()) ddl = "CREATE TABLE IF NOT EXISTS target" +
" (pk VARCHAR(128) NOT NULL PRIMARY KEY, col1 DECIMAL(5,1), col2 DECIMAL(5,2), col3 DECIMAL(4,4))";
else if (tgtSQ()) ddl = "CREATE TABLE target" +
" (pk VARCHAR(128) NOT NULL PRIMARY KEY, col1 DECIMAL(5,1), col2 DECIMAL(5,2), col3 DECIMAL(4,4))";
conn.createStatement().execute(ddl);
conn.setAutoCommit(false);
String query = null;
if (tgtPH()||tgtTR()) query = "UPSERT INTO source(pk, col1) VALUES(?,?)";
else if (tgtSQ()) query = "INSERT INTO source(pk, col1) VALUES(?,?)";
PreparedStatement stmt = conn.prepareStatement(query);
stmt.setString(1, "1");
stmt.setBigDecimal(2, new BigDecimal("100.12"));
stmt.execute();
conn.commit();
stmt.setString(1, "2");
stmt.setBigDecimal(2, new BigDecimal("100.34"));
stmt.execute();
conn.commit();
// Evaluated on client side.
// source and target in different tables, values scheme compatible.
if (tgtPH()||tgtTR()) query = "UPSERT INTO target(pk, col2) SELECT pk, col1 from source";
else if (tgtSQ()) query = "INSERT INTO target(pk, col2) SELECT pk, col1 from source";
stmt = conn.prepareStatement(query);
stmt.execute();
conn.commit();
if (tgtPH()) query = "SELECT col2 FROM target";
else if (tgtSQ()||tgtTR()) query = "SELECT col2 FROM target order by 1";
stmt = conn.prepareStatement(query);
ResultSet rs = stmt.executeQuery();
assertTrue(rs.next());
assertEquals(new BigDecimal("100.12"), rs.getBigDecimal(1));
assertTrue(rs.next());
assertEquals(new BigDecimal("100.34"), rs.getBigDecimal(1));
assertFalse(rs.next());
// source and target in different tables, values requires scale chopping.
if (tgtPH()||tgtTR()) query = "UPSERT INTO target(pk, col1) SELECT pk, col1 from source";
else if (tgtSQ()) query = "UPDATE target SET col1=(select col1 from source where source.pk=target.pk)";
stmt = conn.prepareStatement(query);
stmt.execute();
conn.commit();
if (tgtPH()) query = "SELECT col1 FROM target";
else if (tgtSQ()||tgtTR()) query = "SELECT col1 FROM target order by 1";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
assertEquals(new BigDecimal("100.1"), rs.getBigDecimal(1));
assertTrue(rs.next());
assertEquals(new BigDecimal("100.3"), rs.getBigDecimal(1));
assertFalse(rs.next());
// source and target in different tables, values scheme incompatible.
try {
if (tgtPH()||tgtTR()) query = "UPSERT INTO target(pk, col3) SELECT pk, col1 from source";
else if (tgtSQ()) query = "INSERT INTO target(pk, col3) SELECT pk, col1 from source";
stmt = conn.prepareStatement(query);
stmt.execute();
conn.commit();
fail("Should have caught bad upsert.");
} catch (Exception e) {
if (tgtPH()) assertTrue(e.getMessage(), e.getMessage().contains("ERROR 206 (22003): The value is outside the range for the data type. columnName=COL3"));
else if (tgtSQ()||tgtTR()) assertTrue(e.getMessage(), e.getMessage().contains("*** ERROR[8411]"));
}
if (tgtPH()) {
// Evaluate on server side.
conn.setAutoCommit(true);
// source and target in same table, values scheme compatible.
if (tgtPH()||tgtTR()) query = "UPSERT INTO source(pk, col3) SELECT pk, col1 from source";
else if (tgtSQ()) query = "UPDATE target SET col3=(select col1 from source where source.pk=target.pk)";
stmt = conn.prepareStatement(query);
stmt.execute();
if (tgtPH()) query = "SELECT col3 FROM source";
else if (tgtSQ()||tgtTR()) query = "SELECT col3 FROM source order by 1";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
assertEquals(new BigDecimal("100.12"), rs.getBigDecimal(1));
assertTrue(rs.next());
assertEquals(new BigDecimal("100.34"), rs.getBigDecimal(1));
assertFalse(rs.next());
// source and target in same table, values requires scale chopping.
if (tgtPH()||tgtTR()) query = "UPSERT INTO source(pk, col2) SELECT pk, col1 from source";
else if (tgtSQ()) query = "UPDATE target SET col2=(select col1 from source where source.pk=target.pk)";
stmt = conn.prepareStatement(query);
stmt.execute();
if (tgtPH()) query = "SELECT col2 FROM source";
else if (tgtSQ()||tgtTR()) query = "SELECT col2 FROM source order by 1";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
assertEquals(new BigDecimal("100.1"), rs.getBigDecimal(1));
assertTrue(rs.next());
assertEquals(new BigDecimal("100.3"), rs.getBigDecimal(1));
assertFalse(rs.next());
// source and target in same table, values scheme incompatible.
if (tgtPH()||tgtTR()) query = "UPSERT INTO source(pk, col4) SELECT pk, col1 from source";
else if (tgtSQ()) query = "UPDATE target SET col4=(select col1 from source where source.pk=target.pk)";
stmt = conn.prepareStatement(query);
stmt.execute();
query = "SELECT col4 FROM source";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
assertNull(rs.getBigDecimal(1));
assertTrue(rs.next());
assertNull(rs.getBigDecimal(1));
assertFalse(rs.next());
}
} finally {
}
}
@Test
public void testDecimalAveraging() throws Exception {
printTestDescription();
try {
String ddl = null;
if (tgtPH()) ddl = "CREATE TABLE IF NOT EXISTS testDecimalArithmatic" +
" (pk VARCHAR NOT NULL PRIMARY KEY, col1 DECIMAL(31, 11), col2 DECIMAL(31,1), col3 DECIMAL(38,1))";
else if (tgtTR()) ddl = "CREATE TABLE IF NOT EXISTS testDecimalArithmatic" +
" (pk VARCHAR(128) NOT NULL PRIMARY KEY, col1 DECIMAL(18, 11), col2 DECIMAL(18,1), col3 DECIMAL(18,1))";
else if (tgtSQ()) ddl = "CREATE TABLE testDecimalArithmatic" +
" (pk VARCHAR(128) NOT NULL PRIMARY KEY, col1 DECIMAL(18, 11), col2 DECIMAL(18,1), col3 DECIMAL(18,1))";
conn.createStatement().execute(ddl);
conn.setAutoCommit(false);
String query = null;
if (tgtPH()||tgtTR()) query = "UPSERT INTO testDecimalArithmatic(pk, col1, col2, col3) VALUES(?,?,?,?)";
else if (tgtSQ()) query = "INSERT INTO testDecimalArithmatic(pk, col1, col2, col3) VALUES(?,?,?,?)";
PreparedStatement stmt = conn.prepareStatement(query);
stmt.setString(1, "1");
if (tgtPH()) {
stmt.setBigDecimal(2, new BigDecimal("99999999999999999999.1"));
stmt.setBigDecimal(3, new BigDecimal("99999999999999999999.1"));
stmt.setBigDecimal(4, new BigDecimal("9999999999999999999999999999999999999.1"));
} else if (tgtSQ()||tgtTR()) {
stmt.setBigDecimal(2, new BigDecimal("9999999.11111111111"));
stmt.setBigDecimal(3, new BigDecimal("99999999999999999.1"));
stmt.setBigDecimal(4, new BigDecimal("99999999999999999.1"));
}
stmt.execute();
conn.commit();
stmt.setString(1, "2");
stmt.setBigDecimal(2, new BigDecimal("0"));
stmt.setBigDecimal(3, new BigDecimal("0"));
stmt.setBigDecimal(4, new BigDecimal("0"));
stmt.execute();
conn.commit();
stmt.setString(1, "3");
stmt.setBigDecimal(2, new BigDecimal("0"));
stmt.setBigDecimal(3, new BigDecimal("0"));
stmt.setBigDecimal(4, new BigDecimal("0"));
stmt.execute();
conn.commit();
// Averaging
// result scale should be: max(max(ls, rs), 4).
// We are not imposing restriction on precisioin.
query = "SELECT avg(col1) FROM testDecimalArithmatic";
stmt = conn.prepareStatement(query);
ResultSet rs = stmt.executeQuery();
assertTrue(rs.next());
BigDecimal result = rs.getBigDecimal(1);
if (tgtPH()) assertEquals(new BigDecimal("33333333333333333333.03333333333"), result);
else if (tgtSQ()||tgtTR()) assertEquals(new BigDecimal("3333333.03703703703"), result);
query = "SELECT avg(col2) FROM testDecimalArithmatic";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
result = rs.getBigDecimal(1);
if (tgtPH()) assertEquals(new BigDecimal("33333333333333333333.0333"), result);
else if (tgtSQ()||tgtTR()) assertEquals(new BigDecimal("33333333333333333.0"), result);
// We cap our decimal to a precision of 38.
query = "SELECT avg(col3) FROM testDecimalArithmatic";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
result = rs.getBigDecimal(1);
if (tgtPH()) assertEquals(new BigDecimal("3333333333333333333333333333333333333"), result);
else if (tgtSQ()||tgtTR()) assertEquals(new BigDecimal("33333333333333333.0"), result);
} finally {
}
}
@Test
public void testDecimalArithmeticWithIntAndLong() throws Exception {
printTestDescription();
try {
String ddl = null;
if (tgtPH()) ddl = "CREATE TABLE IF NOT EXISTS testDecimalArithmatic" +
" (pk VARCHAR NOT NULL PRIMARY KEY, " +
"col1 DECIMAL(38,0), col2 DECIMAL(5, 2), col3 INTEGER, col4 BIGINT, col5 DECIMAL)";
else if (tgtTR()) ddl = "CREATE TABLE IF NOT EXISTS testDecimalArithmatic" +
" (pk VARCHAR(128) NOT NULL PRIMARY KEY, " +
"col1 DECIMAL(18,0), col2 DECIMAL(5, 2), col3 INTEGER, col4 BIGINT, col5 DECIMAL)";
else if (tgtSQ()) ddl = "CREATE TABLE testDecimalArithmatic" +
" (pk VARCHAR(128) NOT NULL PRIMARY KEY, " +
"col1 DECIMAL(18,0), col2 DECIMAL(5, 2), col3 INTEGER, col4 BIGINT, col5 DECIMAL)";
conn.createStatement().execute(ddl);
conn.setAutoCommit(false);
String query = null;
if (tgtPH()||tgtTR()) query = "UPSERT INTO testDecimalArithmatic(pk, col1, col2, col3, col4, col5) VALUES(?,?,?,?,?,?)";
else if (tgtSQ()) query = "INSERT INTO testDecimalArithmatic(pk, col1, col2, col3, col4, col5) VALUES(?,?,?,?,?,?)";
PreparedStatement stmt = conn.prepareStatement(query);
stmt.setString(1, "testValueOne");
if (tgtPH()) stmt.setBigDecimal(2, new BigDecimal("1234567890123456789012345678901"));
else if (tgtSQ()||tgtTR()) stmt.setBigDecimal(2, new BigDecimal("123456789012345678"));
stmt.setBigDecimal(3, new BigDecimal("123.45"));
stmt.setInt(4, 10);
stmt.setLong(5, 10L);
stmt.setBigDecimal(6, new BigDecimal("111.111"));
stmt.execute();
conn.commit();
stmt.setString(1, "testValueTwo");
if (tgtPH()) stmt.setBigDecimal(2, new BigDecimal("12345678901234567890123456789012345678"));
else if (tgtSQ()||tgtTR()) stmt.setBigDecimal(2, new BigDecimal("123456789012345678"));
stmt.setBigDecimal(3, new BigDecimal("123.45"));
stmt.setInt(4, 10);
stmt.setLong(5, 10L);
stmt.setBigDecimal(6, new BigDecimal("123456789.0123456789"));
stmt.execute();
conn.commit();
// INT has a default precision and scale of (10, 0)
// LONG has a default precision and scale of (19, 0)
query = "SELECT col1 + col3 FROM testDecimalArithmatic WHERE pk='testValueOne'";
stmt = conn.prepareStatement(query);
ResultSet rs = stmt.executeQuery();
assertTrue(rs.next());
BigDecimal result = rs.getBigDecimal(1);
if (tgtPH()) assertEquals(new BigDecimal("1234567890123456789012345678911"), result);
else if (tgtSQ()||tgtTR()) assertEquals(new BigDecimal("123456789012345688"), result);
query = "SELECT col1 + col4 FROM testDecimalArithmatic WHERE pk='testValueOne'";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
result = rs.getBigDecimal(1);
if (tgtPH()) assertEquals(new BigDecimal("1234567890123456789012345678911"), result);
else if (tgtSQ()||tgtTR()) assertEquals(new BigDecimal("123456789012345688"), result);
query = "SELECT col2 + col3 FROM testDecimalArithmatic WHERE pk='testValueOne'";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
result = rs.getBigDecimal(1);
assertEquals(new BigDecimal("133.45"), result);
query = "SELECT col2 + col4 FROM testDecimalArithmatic WHERE pk='testValueOne'";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
result = rs.getBigDecimal(1);
if (tgtPH()) assertEquals(new BigDecimal("133.45"), result);
else if (tgtSQ()||tgtTR()) assertEquals(new BigDecimal("133"), result);
query = "SELECT col5 + col3 FROM testDecimalArithmatic WHERE pk='testValueOne'";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
result = rs.getBigDecimal(1);
if (tgtPH()) assertEquals(new BigDecimal("121.111"), result);
else if (tgtSQ()||tgtTR()) assertEquals(new BigDecimal("121"), result);
query = "SELECT col5 + col4 FROM testDecimalArithmatic WHERE pk='testValueOne'";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
result = rs.getBigDecimal(1);
if (tgtPH()) assertEquals(new BigDecimal("121.111"), result);
else if (tgtSQ()||tgtTR()) assertEquals(new BigDecimal("121"), result);
query = "SELECT col1 - col3 FROM testDecimalArithmatic WHERE pk='testValueOne'";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
result = rs.getBigDecimal(1);
if (tgtPH()) assertEquals(new BigDecimal("1234567890123456789012345678891"), result);
else if (tgtSQ()||tgtTR()) assertEquals(new BigDecimal("123456789012345668"), result);
query = "SELECT col1 - col4 FROM testDecimalArithmatic WHERE pk='testValueOne'";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
result = rs.getBigDecimal(1);
if (tgtPH()) assertEquals(new BigDecimal("1234567890123456789012345678891"), result);
else if (tgtSQ()||tgtTR()) assertEquals(new BigDecimal("123456789012345668"), result);
query = "SELECT col2 - col3 FROM testDecimalArithmatic WHERE pk='testValueOne'";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
result = rs.getBigDecimal(1);
assertEquals(new BigDecimal("113.45"), result);
query = "SELECT col2 - col4 FROM testDecimalArithmatic WHERE pk='testValueOne'";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
result = rs.getBigDecimal(1);
if (tgtPH()) assertEquals(new BigDecimal("113.45"), result);
else if (tgtSQ()||tgtTR()) assertEquals(new BigDecimal("113"), result);
query = "SELECT col5 - col3 FROM testDecimalArithmatic WHERE pk='testValueOne'";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
result = rs.getBigDecimal(1);
if (tgtPH()) assertEquals(new BigDecimal("101.111"), result);
else if (tgtSQ()||tgtTR()) assertEquals(new BigDecimal("101"), result);
query = "SELECT col5 - col4 FROM testDecimalArithmatic WHERE pk='testValueOne'";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
result = rs.getBigDecimal(1);
if (tgtPH()) assertEquals(new BigDecimal("101.111"), result);
else if (tgtSQ()||tgtTR()) assertEquals(new BigDecimal("101"), result);
query = "SELECT col1 * col3 FROM testDecimalArithmatic WHERE pk='testValueOne'";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
result = rs.getBigDecimal(1);
if (tgtPH()) assertEquals(new BigDecimal("1.234567890123456789012345678901E+31"), result);
else if (tgtSQ()||tgtTR()) assertEquals(new BigDecimal("1234567890123456780"), result);
query = "SELECT col1 * col4 FROM testDecimalArithmatic WHERE pk='testValueOne'";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
result = rs.getBigDecimal(1);
if (tgtPH()) assertEquals(new BigDecimal("1.234567890123456789012345678901E+31"), result);
else if (tgtSQ()||tgtTR()) assertEquals(new BigDecimal("1234567890123456780"), result);
query = "SELECT col1 * col3 FROM testDecimalArithmatic WHERE pk='testValueOne'";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
result = rs.getBigDecimal(1);
if (tgtPH()) assertEquals(new BigDecimal("1.234567890123456789012345678901E+31"), result);
else if (tgtSQ()||tgtTR()) assertEquals(new BigDecimal("1234567890123456780"), result);
if (tgtPH()) {
try {
query = "SELECT col1 * col3 FROM testDecimalArithmatic WHERE pk='testValueTwo'";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
result = rs.getBigDecimal(1);
fail("Should have caught error.");
} catch (Exception e) {
assertTrue(e.getMessage(), e.getMessage().contains("ERROR 206 (22003): The value is outside the range for the data type. DECIMAL(38,0)"));
}
try {
query = "SELECT col1 * col4 FROM testDecimalArithmatic WHERE pk='testValueTwo'";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
result = rs.getBigDecimal(1);
fail("Should have caught error.");
} catch (Exception e) {
assertTrue(e.getMessage(), e.getMessage().contains("ERROR 206 (22003): The value is outside the range for the data type. DECIMAL(38,0)"));
}
}
query = "SELECT col4 * col5 FROM testDecimalArithmatic WHERE pk='testValueOne'";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
result = rs.getBigDecimal(1);
if (tgtPH()) assertEquals(0, result.compareTo(new BigDecimal("1111.11")));
else if (tgtSQ()||tgtTR()) assertEquals(0, result.compareTo(new BigDecimal("1110")));
query = "SELECT col3 * col5 FROM testDecimalArithmatic WHERE pk='testValueOne'";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
result = rs.getBigDecimal(1);
if (tgtPH()) assertEquals(0, result.compareTo(new BigDecimal("1111.11")));
else if (tgtSQ()||tgtTR()) assertEquals(0, result.compareTo(new BigDecimal("1110")));
query = "SELECT col2 * col4 FROM testDecimalArithmatic WHERE pk='testValueOne'";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
result = rs.getBigDecimal(1);
if (tgtPH()) assertEquals(new BigDecimal("1234.5"), result);
else if (tgtSQ()||tgtTR()) assertEquals(new BigDecimal("1234"), result);
// Result scale has value of 0
query = "SELECT col1 / col3 FROM testDecimalArithmatic WHERE pk='testValueOne'";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
result = rs.getBigDecimal(1);
if (tgtPH()) assertEquals(new BigDecimal("1.2345678901234567890123456789E+29"), result);
else if (tgtSQ()||tgtTR()) assertEquals(new BigDecimal("12345678901234567"), result);
query = "SELECT col1 / col4 FROM testDecimalArithmatic WHERE pk='testValueOne'";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
result = rs.getBigDecimal(1);
if (tgtPH()) assertEquals(new BigDecimal("1.2345678901234567890123456789E+29"), result);
else if (tgtSQ()||tgtTR()) assertEquals(new BigDecimal("12345678901234567"), result);
// Result scale is 2.
query = "SELECT col2 / col3 FROM testDecimalArithmatic WHERE pk='testValueOne'";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
result = rs.getBigDecimal(1);
if (tgtPH()) assertEquals(new BigDecimal("12.34"), result);
else if (tgtSQ()||tgtTR()) assertEquals(new BigDecimal("12.345000000000"), result);
query = "SELECT col2 / col4 FROM testDecimalArithmatic WHERE pk='testValueOne'";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
result = rs.getBigDecimal(1);
if (tgtPH()) assertEquals(new BigDecimal("12.34"), result);
else if (tgtSQ()||tgtTR()) assertEquals(new BigDecimal("12.345000000000000"), result);
// col5 has NO_SCALE, so the result's scale is not expected to be truncated to col5 value's scale of 4
query = "SELECT col5 / col3 FROM testDecimalArithmatic WHERE pk='testValueOne'";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
result = rs.getBigDecimal(1);
if (tgtPH()) assertEquals(new BigDecimal("11.1111"), result);
else if (tgtSQ()||tgtTR()) assertEquals(new BigDecimal("11.100000000"), result);
query = "SELECT col5 / col4 FROM testDecimalArithmatic WHERE pk='testValueOne'";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
assertTrue(rs.next());
result = rs.getBigDecimal(1);
if (tgtPH()) assertEquals(new BigDecimal("11.1111"), result);
else if (tgtSQ()||tgtTR()) assertEquals(new BigDecimal("11.100000000"), result);
} finally {
}
}
}