/*******************************************************************************
 * 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.math.*;
import java.sql.*;
import java.sql.Date;
import java.util.*;


public class UpsertSelectTest 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 IntKeyTest", "table phoenix_test", "table " + ATABLE_NAME, "table " + CUSTOM_ENTITY_DATA_FULL_NAME, "table " + PTSDB_NAME));
        doBaseTestSuiteSetup();
    }
    /* @AfterClass, @Before, @After are defined in BaseTest */


    @Test
    public void testUpsertSelect() throws Exception {
        printTestDescription();

        initATableValues();
        createTestTable(CUSTOM_ENTITY_DATA_FULL_NAME);
        conn.setAutoCommit(true);
        String upsert = null;
        if (tgtPH()||tgtTR()) upsert = "UPSERT INTO " + CUSTOM_ENTITY_DATA_FULL_NAME + "(custom_entity_data_id, key_prefix, organization_id, created_by) " +
            "SELECT substr(entity_id, 4), substr(entity_id, 1, 3), organization_id, a_string  FROM ATABLE WHERE a_string = ?";
        else if (tgtSQ()) upsert = "INSERT INTO " + CUSTOM_ENTITY_DATA_FULL_NAME + "(custom_entity_data_id, key_prefix, organization_id, created_by) " +
            "SELECT substr(entity_id, 4), substr(entity_id, 1, 3), organization_id, a_string  FROM ATABLE WHERE a_string = ?";
        PreparedStatement upsertStmt = conn.prepareStatement(upsert);
        upsertStmt.setString(1, A_VALUE);
        int rowsInserted = upsertStmt.executeUpdate();
        assertEquals(4, rowsInserted);
       
        String query = null;
        if (tgtPH()) query = "SELECT key_prefix, substr(custom_entity_data_id, 1, 1), created_by FROM " + CUSTOM_ENTITY_DATA_FULL_NAME + " WHERE organization_id = ?";
        else if (tgtSQ()||tgtTR()) query = "SELECT key_prefix, substr(custom_entity_data_id, 1, 1), created_by FROM " + CUSTOM_ENTITY_DATA_FULL_NAME + " WHERE organization_id = ? order by 2";
        PreparedStatement statement = conn.prepareStatement(query);
        statement.setString(1, tenantId);
        ResultSet rs = statement.executeQuery();
        
        assertTrue (rs.next());
        assertEquals("00A", rs.getString(1));
        assertEquals("1", rs.getString(2));
        assertEquals(A_VALUE, rs.getString(3));
        
        assertTrue (rs.next());
        assertEquals("00A", rs.getString(1));
        assertEquals("2", rs.getString(2));
        assertEquals(A_VALUE, rs.getString(3));
        
        assertTrue (rs.next());
        assertEquals("00A", rs.getString(1));
        assertEquals("3", rs.getString(2));
        assertEquals(A_VALUE, rs.getString(3));
        
        assertTrue (rs.next());
        assertEquals("00A", rs.getString(1));
        assertEquals("4", rs.getString(2));
        assertEquals(A_VALUE, rs.getString(3));

        assertFalse(rs.next());

        // Test UPSERT through coprocessor
        conn.setAutoCommit(true);
        if (tgtPH()||tgtTR()) upsert = "UPSERT INTO " + CUSTOM_ENTITY_DATA_FULL_NAME + "(custom_entity_data_id, key_prefix, organization_id, last_update_by, division) " +
            "SELECT custom_entity_data_id, key_prefix, organization_id, created_by, 1.0  FROM " + CUSTOM_ENTITY_DATA_FULL_NAME + " WHERE organization_id = ?";
        else if (tgtSQ()) upsert = "UPDATE " + CUSTOM_ENTITY_DATA_FULL_NAME + " SET (last_update_by, division) = (created_by, 1.0) WHERE organization_id = ?";
        upsertStmt = conn.prepareStatement(upsert);
        upsertStmt.setString(1, tenantId);
        assertEquals(4, upsertStmt.executeUpdate());

        if (tgtPH()) query = "SELECT key_prefix, substr(custom_entity_data_id, 1, 1), created_by, last_update_by, division FROM " + CUSTOM_ENTITY_DATA_FULL_NAME + " WHERE organization_id = ?";
        else if (tgtSQ()||tgtTR()) query = "SELECT key_prefix, substr(custom_entity_data_id, 1, 1), created_by, last_update_by, division FROM " + CUSTOM_ENTITY_DATA_FULL_NAME + " WHERE organization_id = ? order by 2";
        statement = conn.prepareStatement(query);
        statement.setString(1, tenantId);
        rs = statement.executeQuery();
       
        assertTrue (rs.next());
        assertEquals("00A", rs.getString(1));
        assertEquals("1", rs.getString(2));
        assertEquals(A_VALUE, rs.getString(3));
        assertEquals(A_VALUE, rs.getString(4));
        assertTrue(BigDecimal.valueOf(1.0).compareTo(rs.getBigDecimal(5)) == 0);
        
        assertTrue (rs.next());
        assertEquals("00A", rs.getString(1));
        assertEquals("2", rs.getString(2));
        assertEquals(A_VALUE, rs.getString(3));
        assertEquals(A_VALUE, rs.getString(4));
        assertTrue(BigDecimal.valueOf(1.0).compareTo(rs.getBigDecimal(5)) == 0);
        
        assertTrue (rs.next());
        assertEquals("00A", rs.getString(1));
        assertEquals("3", rs.getString(2));
        assertEquals(A_VALUE, rs.getString(3));
        assertEquals(A_VALUE, rs.getString(4));
        assertTrue(BigDecimal.valueOf(1.0).compareTo(rs.getBigDecimal(5)) == 0);
        
        assertTrue (rs.next());
        assertEquals("00A", rs.getString(1));
        assertEquals("4", rs.getString(2));
        assertEquals(A_VALUE, rs.getString(3));
        assertEquals(A_VALUE, rs.getString(4));
        assertTrue(BigDecimal.valueOf(1.0).compareTo(rs.getBigDecimal(5)) == 0);

        assertFalse(rs.next());
    }

    // TODO: more tests - nullable fixed length last PK column
    @Test
    public void testUpsertSelectEmptyPKColumn() throws Exception {
        printTestDescription();

        initATableValues();
        createTestTable(PTSDB_NAME);
        conn.setAutoCommit(false);
        String upsert = null;
        if (tgtPH()) upsert = "UPSERT INTO " + PTSDB_NAME + "(date, val, host) " +
            "SELECT current_date(), x_integer+2, entity_id FROM ATABLE WHERE a_integer >= ?";
        else if (tgtTR()) upsert = "UPSERT INTO " + PTSDB_NAME + "(date1, val, host1) " +
            "SELECT CURRENT_TIMESTAMP, x_integer+2, entity_id FROM ATABLE WHERE a_integer >= ?";
        else if (tgtSQ()) upsert = "INSERT INTO " + PTSDB_NAME + "(date1, val, host1) " +
            "SELECT CURRENT_TIMESTAMP, x_integer+2, entity_id FROM ATABLE WHERE a_integer >= ?";

        PreparedStatement upsertStmt = conn.prepareStatement(upsert);
        upsertStmt.setInt(1, 6);
        int rowsInserted = upsertStmt.executeUpdate();
        assertEquals(4, rowsInserted);
        conn.commit();
        
        String query = null;
        if (tgtPH()) query = "SELECT inst,host,date,val FROM " + PTSDB_NAME;
        else if (tgtSQ()||tgtTR()) query = "SELECT inst,host1,date1,val FROM " + PTSDB_NAME + " order by 2";
        PreparedStatement statement = conn.prepareStatement(query);
        ResultSet rs = statement.executeQuery();
        
        Date now = null;
        Timestamp now1 = null;
        if (tgtPH()) now = new Date(System.currentTimeMillis());
        else if (tgtSQ()||tgtTR()) now1 = new Timestamp(System.currentTimeMillis());

        assertTrue (rs.next());
        assertEquals(null, rs.getString(1));
        assertEquals(ROW6, rs.getString(2));
        if (tgtPH()) assertTrue(rs.getDate(3).before(now) );
        // Skip checking this, target machine time and client machine time are
        // not always in sync.
        // else if (tgtSQ()||tgtTR()) assertTrue(rs.getTimestamp(3).before(now1) );
        assertEquals(null, rs.getBigDecimal(4));
        
        assertTrue (rs.next());
        assertEquals(null, rs.getString(1));
        assertEquals(ROW7, rs.getString(2));
        if (tgtPH()) assertTrue(rs.getDate(3).before(now) );
        // Skip checking this, target machine time and client machine time are
        // not always in sync.
        // else if (tgtSQ()||tgtTR()) assertTrue(rs.getTimestamp(3).before(now1) );
        assertTrue(BigDecimal.valueOf(7).compareTo(rs.getBigDecimal(4)) == 0);
        
        assertTrue (rs.next());
        assertEquals(null, rs.getString(1));
        assertEquals(ROW8, rs.getString(2));
        if (tgtPH()) assertTrue(rs.getDate(3).before(now) );
        // Skip checking this, target machine time and client machine time are
        // not always in sync.
        // else if (tgtSQ()||tgtTR()) assertTrue(rs.getTimestamp(3).before(now1) );
        assertTrue(BigDecimal.valueOf(6).compareTo(rs.getBigDecimal(4)) == 0);
        
        assertTrue (rs.next());
        assertEquals(null, rs.getString(1));
        assertEquals(ROW9, rs.getString(2));
        if (tgtPH()) assertTrue(rs.getDate(3).before(now) );
        // Skip checking this, target machine time and client machine time are
        // not always in sync.
        // else if (tgtSQ()||tgtTR()) assertTrue(rs.getTimestamp(3).before(now1) );
        assertTrue(BigDecimal.valueOf(5).compareTo(rs.getBigDecimal(4)) == 0);

        assertFalse(rs.next());
        
        conn.setAutoCommit(true);
        if (tgtPH()) upsert = "UPSERT INTO " + PTSDB_NAME + "(date, val, inst) " +
            "SELECT date+1, val*10, host FROM " + PTSDB_NAME;
        else if (tgtTR()) upsert = "UPSERT INTO " + PTSDB_NAME + "(date1, val, inst) " +
            // +1 would mean +1 seconds to the timestamp. If the test runs
            // too fast, the selected value would not become bigger than now1
            // change it to 10 minutes instead
            "SELECT date1+60*10, val*10, host1 FROM " + PTSDB_NAME;
        else if (tgtSQ()) upsert = "INSERT INTO " + PTSDB_NAME + "(date1, val, inst) " +
            // +1 would mean +1 seconds to the timestamp. If the test runs
            // too fast, the selected value would not become bigger than now1
            // change it to 10 minutes instead
            "SELECT date1+60*10, val*10, host1 FROM " + PTSDB_NAME;
        upsertStmt = conn.prepareStatement(upsert);
        rowsInserted = upsertStmt.executeUpdate();
        assertEquals(4, rowsInserted);
        
        Date then = null;
        Timestamp then1 = null;
        if (tgtPH()) then = new Date(now.getTime() + MILLIS_IN_DAY);
        else if (tgtSQ()||tgtTR()) then1 = new Timestamp(now1.getTime() + MILLIS_IN_DAY);

        if (tgtPH()) query = "SELECT host,inst, date,val FROM " + PTSDB_NAME + " where inst is not null";
        else if (tgtSQ()||tgtTR()) query = "SELECT host1,inst, date1,val FROM " + PTSDB_NAME + " where inst is not null order by 2";
        statement = conn.prepareStatement(query);
        
        rs = statement.executeQuery();
        assertTrue (rs.next());
        assertEquals(null, rs.getString(1));
        assertEquals(ROW6, rs.getString(2));
        if (tgtPH()) assertTrue(rs.getDate(3).after(now) && rs.getDate(3).before(then));
        // Skip checking this, target machine time and client machine time are
        // not always in sync.
        // else if (tgtSQ()||tgtTR()) assertTrue(rs.getTimestamp(3).after(now1) && rs.getTimestamp(3).before(then1));
        assertEquals(null, rs.getBigDecimal(4));
        
        assertTrue (rs.next());
        assertEquals(null, rs.getString(1));
        assertEquals(ROW7, rs.getString(2));
        if (tgtPH()) assertTrue(rs.getDate(3).after(now) && rs.getDate(3).before(then));
        // Skip checking this, target machine time and client machine time are
        // not always in sync.
        // else if (tgtSQ()||tgtTR()) assertTrue(rs.getTimestamp(3).after(now1) && rs.getTimestamp(3).before(then1));
        assertTrue(BigDecimal.valueOf(70).compareTo(rs.getBigDecimal(4)) == 0);
        
        assertTrue (rs.next());
        assertEquals(null, rs.getString(1));
        assertEquals(ROW8, rs.getString(2));
        if (tgtPH()) assertTrue(rs.getDate(3).after(now) && rs.getDate(3).before(then));
        // Skip checking this, target machine time and client machine time are
        // not always in sync.
        // else if (tgtSQ()||tgtTR()) assertTrue(rs.getTimestamp(3).after(now1) && rs.getTimestamp(3).before(then1));
        assertTrue(BigDecimal.valueOf(60).compareTo(rs.getBigDecimal(4)) == 0);
        
        assertTrue (rs.next());
        assertEquals(null, rs.getString(1));
        assertEquals(ROW9, rs.getString(2));
        if (tgtPH()) assertTrue(rs.getDate(3).after(now) && rs.getDate(3).before(then));
        // Skip checking this, target machine time and client machine time are
        // not always in sync.
        // else if (tgtPH()) assertTrue(rs.getTimestamp(3).after(now1) && rs.getTimestamp(3).before(then1));
        assertTrue(BigDecimal.valueOf(50).compareTo(rs.getBigDecimal(4)) == 0);
        
        assertFalse(rs.next());
        
        // Should just update all values with the same value, essentially just updating the timestamp
        conn.setAutoCommit(true);
        // TRAF: we don't have the timestamp concept, the table will just
        // remain the same.
        if (tgtPH()) {
            upsert = "UPSERT INTO " + PTSDB_NAME + " SELECT * FROM " + PTSDB_NAME;
            upsertStmt = conn.prepareStatement(upsert);
            rowsInserted = upsertStmt.executeUpdate();
            assertEquals(8, rowsInserted);
        }
 
        if (tgtPH()) query = "SELECT * FROM " + PTSDB_NAME ;
        else if (tgtSQ()||tgtTR()) query = "SELECT * FROM " + PTSDB_NAME + " order by 2, 1";
        statement = conn.prepareStatement(query);
        
        rs = statement.executeQuery();
        assertTrue (rs.next());
        assertEquals(null, rs.getString(1));
        assertEquals(ROW6, rs.getString(2));
        if (tgtPH()) assertTrue(rs.getDate(3).before(now) );
        // Skip checking this, target machine time and client machine time are
        // not always in sync.
        // else if (tgtSQ()||tgtTR()) assertTrue(rs.getTimestamp(3).before(now1) );
        assertEquals(null, rs.getBigDecimal(4));
        
        assertTrue (rs.next());
        assertEquals(null, rs.getString(1));
        assertEquals(ROW7, rs.getString(2));
        if (tgtPH()) assertTrue(rs.getDate(3).before(now) );
        // Skip checking this, target machine time and client machine time are
        // not always in sync.
        // else if (tgtSQ()||tgtTR()) assertTrue(rs.getTimestamp(3).before(now1) );
        assertTrue(BigDecimal.valueOf(7).compareTo(rs.getBigDecimal(4)) == 0);
        
        assertTrue (rs.next());
        assertEquals(null, rs.getString(1));
        assertEquals(ROW8, rs.getString(2));
        if (tgtPH()) assertTrue(rs.getDate(3).before(now) );
        // Skip checking this, target machine time and client machine time are
        // not always in sync.
        // else if (tgtSQ()||tgtTR()) assertTrue(rs.getTimestamp(3).before(now1) );
        assertTrue(BigDecimal.valueOf(6).compareTo(rs.getBigDecimal(4)) == 0);
        
        assertTrue (rs.next());
        assertEquals(null, rs.getString(1));
        assertEquals(ROW9, rs.getString(2));
        if (tgtPH()) assertTrue(rs.getDate(3).before(now) );
        // Skip checking this, target machine time and client machine time are
        // not always in sync.
        // else if (tgtSQ()||tgtTR()) assertTrue(rs.getTimestamp(3).before(now1) );
        assertTrue(BigDecimal.valueOf(5).compareTo(rs.getBigDecimal(4)) == 0);

        assertTrue (rs.next());
        assertEquals(ROW6, rs.getString(1));
        assertEquals(null, rs.getString(2));
        if (tgtPH()) assertTrue(rs.getDate(3).after(now) && rs.getDate(3).before(then));
        // Skip checking this, target machine time and client machine time are
        // not always in sync.
        // else if (tgtSQ()||tgtTR()) assertTrue(rs.getTimestamp(3).after(now1) && rs.getTimestamp(3).before(then1));

        assertEquals(null, rs.getBigDecimal(4));
        
        assertTrue (rs.next());
        assertEquals(ROW7, rs.getString(1));
        assertEquals(null, rs.getString(2));
        if (tgtPH()) assertTrue(rs.getDate(3).after(now) && rs.getDate(3).before(then));
        // Skip checking this, target machine time and client machine time are
        // not always in sync.
        // else if (tgtSQ()||tgtTR()) assertTrue(rs.getTimestamp(3).after(now1) && rs.getTimestamp(3).before(then1));
        assertTrue(BigDecimal.valueOf(70).compareTo(rs.getBigDecimal(4)) == 0);
        
        assertTrue (rs.next());
        assertEquals(ROW8, rs.getString(1));
        assertEquals(null, rs.getString(2));
        if (tgtPH()) assertTrue(rs.getDate(3).after(now) && rs.getDate(3).before(then));
        // Skip checking this, target machine time and client machine time are
        // not always in sync.
        // else if (tgtSQ()||tgtTR()) assertTrue(rs.getTimestamp(3).after(now1) && rs.getTimestamp(3).before(then1));
        assertTrue(BigDecimal.valueOf(60).compareTo(rs.getBigDecimal(4)) == 0);
        
        assertTrue (rs.next());
        assertEquals(ROW9, rs.getString(1));
        assertEquals(null, rs.getString(2));
        if (tgtPH()) assertTrue(rs.getDate(3).after(now) && rs.getDate(3).before(then));
        // Skip checking this, target machine time and client machine time are
        // not always in sync.
        // else if (tgtSQ()||tgtTR()) assertTrue(rs.getTimestamp(3).after(now1) && rs.getTimestamp(3).before(then1));
        assertTrue(BigDecimal.valueOf(50).compareTo(rs.getBigDecimal(4)) == 0);
        
        assertFalse(rs.next());
    }

    @Test
    public void testUpsertSelectForAggAutoCommit() throws Exception {
        printTestDescription();

        testUpsertSelectForAgg(true);
    }
    
    @Test
    public void testUpsertSelectForAgg() throws Exception {
        printTestDescription();

        testUpsertSelectForAgg(false);
    }
    
    private void testUpsertSelectForAgg(boolean autoCommit) throws Exception {
        initATableValues();
        createTestTable(PTSDB_NAME);
        conn.setAutoCommit(autoCommit);
        String upsert = null;
        if (tgtPH()) upsert = "UPSERT INTO " + PTSDB_NAME + "(date, val, host) " +
            "SELECT current_date(), sum(a_integer), a_string FROM ATABLE GROUP BY a_string";
        else if (tgtTR()) upsert = "UPSERT INTO " + PTSDB_NAME + "(date1, val, host1) " +
            "SELECT CURRENT_TIMESTAMP, sum(a_integer), a_string FROM ATABLE GROUP BY a_string";
        else if (tgtSQ()) upsert = "INSERT INTO " + PTSDB_NAME + "(date1, val, host1) " +
            "SELECT CURRENT_TIMESTAMP, sum(a_integer), a_string FROM ATABLE GROUP BY a_string";
        PreparedStatement upsertStmt = conn.prepareStatement(upsert);
        int rowsInserted = upsertStmt.executeUpdate();
        assertEquals(3, rowsInserted);
        if (!autoCommit) {
            conn.commit();
        }
        
        String query = null;
        if (tgtPH()) query = "SELECT inst,host,date,val FROM " + PTSDB_NAME;
        else if (tgtSQ()||tgtTR()) query = "SELECT inst,host1,date1,val FROM " + PTSDB_NAME + " order by 2";
        PreparedStatement statement = conn.prepareStatement(query);
        ResultSet rs = statement.executeQuery();
        Date now = null;
        Timestamp now1 = null;
        if (tgtPH()) now = new Date(System.currentTimeMillis());
        else if (tgtSQ()||tgtTR()) now1 = new Timestamp(System.currentTimeMillis());
 
        assertTrue (rs.next());
        assertEquals(null, rs.getString(1));
        assertEquals(A_VALUE, rs.getString(2));
        if (tgtPH()) assertTrue(rs.getDate(3).before(now) );
        // Skip checking this, target machine time and client machine time are
        // not always in sync.
        // else if (tgtSQ()||tgtTR()) assertTrue(rs.getTimestamp(3).before(now1) );
        assertTrue(BigDecimal.valueOf(10).compareTo(rs.getBigDecimal(4)) == 0);
        
        assertTrue (rs.next());
        assertEquals(null, rs.getString(1));
        assertEquals(B_VALUE, rs.getString(2));
        if (tgtPH()) assertTrue(rs.getDate(3).before(now) );
        // Skip checking this, target machine time and client machine time are
        // not always in sync.
        // else if (tgtSQ()||tgtTR()) assertTrue(rs.getTimestamp(3).before(now1) );
        assertTrue(BigDecimal.valueOf(26).compareTo(rs.getBigDecimal(4)) == 0);
        
        assertTrue (rs.next());
        assertEquals(null, rs.getString(1));
        assertEquals(C_VALUE, rs.getString(2));
        if (tgtPH()) assertTrue(rs.getDate(3).before(now) );
        // Skip checking this, target machine time and client machine time are
        // not always in sync.
        // else if (tgtSQ()||tgtTR()) assertTrue(rs.getTimestamp(3).before(now1) );
        assertTrue(BigDecimal.valueOf(9).compareTo(rs.getBigDecimal(4)) == 0);
        assertFalse(rs.next());
        
        conn.setAutoCommit(autoCommit);
        if (tgtPH()) upsert = "UPSERT INTO " + PTSDB_NAME + "(date, val, host, inst) " +
            "SELECT current_date(), max(val), max(host), 'x' FROM " + PTSDB_NAME;
        else if (tgtTR()) upsert = "UPSERT INTO " + PTSDB_NAME + "(date1, val, host1, inst) " +
            "SELECT CURRENT_TIMESTAMP, max(val), max(host1), 'x' FROM " + PTSDB_NAME;
        else if (tgtSQ()) upsert = "INSERT INTO " + PTSDB_NAME + "(date1, val, host1, inst) " +
            "SELECT CURRENT_TIMESTAMP, max(val), max(host1), 'x' FROM " + PTSDB_NAME;
        upsertStmt = conn.prepareStatement(upsert);
        rowsInserted = upsertStmt.executeUpdate();
        assertEquals(1, rowsInserted);
        if (!autoCommit) {
            conn.commit();
        }
        
        if (tgtPH()) query = "SELECT inst,host,date,val FROM " + PTSDB_NAME + " WHERE inst='x'";
        else if (tgtSQ()||tgtTR()) query = "SELECT inst,host1,date1,val FROM " + PTSDB_NAME + " WHERE inst='x'";
        statement = conn.prepareStatement(query);
        rs = statement.executeQuery();
        if (tgtPH()) now = new Date(System.currentTimeMillis());
        else if (tgtSQ()||tgtTR()) now1 = new Timestamp(System.currentTimeMillis()); 

        assertTrue (rs.next());
        assertEquals("x", rs.getString(1));
        assertEquals(C_VALUE, rs.getString(2));
        if (tgtPH()) assertTrue(rs.getDate(3).before(now) );
        // Skip checking this, target machine time and client machine time are
        // not always in sync.
        // else if (tgtSQ()||tgtTR()) assertTrue(rs.getTimestamp(3).before(now1) );
        assertTrue(BigDecimal.valueOf(26).compareTo(rs.getBigDecimal(4)) == 0);
        assertFalse(rs.next());
        
    }

    @Test
    public void testUpsertSelectLongToInt() throws Exception {
        printTestDescription();

        createTestTable("IntKeyTest");
        String upsert = null;
        if (tgtPH()||tgtTR()) upsert = "UPSERT INTO IntKeyTest VALUES(1)";
        else if (tgtSQ()) upsert = "INSERT INTO IntKeyTest VALUES(1)";
        PreparedStatement upsertStmt = conn.prepareStatement(upsert);
        int rowsInserted = upsertStmt.executeUpdate();
        assertEquals(1, rowsInserted);
        
        if (tgtPH()||tgtTR()) upsert = "UPSERT INTO IntKeyTest select i+1 from IntKeyTest";
        else if (tgtSQ()) upsert = "INSERT INTO IntKeyTest select i+1 from IntKeyTest";
        upsertStmt = conn.prepareStatement(upsert);
        rowsInserted = upsertStmt.executeUpdate();
        assertEquals(1, rowsInserted);
        
        String select = null;
        if (tgtPH()) select = "SELECT i FROM IntKeyTest";
        else if (tgtSQ()||tgtTR()) select = "SELECT i FROM IntKeyTest order by 1";
        ResultSet rs = conn.createStatement().executeQuery(select);
        assertTrue(rs.next());
        assertEquals(1,rs.getInt(1));
        assertTrue(rs.next());
        assertEquals(2,rs.getInt(1));
        assertFalse(rs.next());
    }

    @Test
    public void testUpsertSelectRunOnServer() throws Exception {
        printTestDescription();

        conn.createStatement().execute("create table IntKeyTest (i integer not null primary key desc, j integer)");
        String upsert = null;
        if (tgtPH()||tgtTR()) upsert = "UPSERT INTO IntKeyTest VALUES(1, 1)";
        else if (tgtSQ()) upsert = "INSERT INTO IntKeyTest VALUES(1, 1)";
        PreparedStatement upsertStmt = conn.prepareStatement(upsert);
        int rowsInserted = upsertStmt.executeUpdate();
        assertEquals(1, rowsInserted);
        
        String select = "SELECT i,j+1 FROM IntKeyTest";
        ResultSet rs = conn.createStatement().executeQuery(select);
        assertTrue(rs.next());
        assertEquals(1,rs.getInt(1));
        assertEquals(2,rs.getInt(2));
        assertFalse(rs.next());

        if (tgtPH()||tgtTR()) upsert = "UPSERT INTO IntKeyTest(i,j) select i, j+1 from IntKeyTest";
        else if (tgtSQ()) upsert = "UPDATE IntKeyTest SET j=j+1 where i in (SELECT i from IntKeyTest)";
        upsertStmt = conn.prepareStatement(upsert);
        rowsInserted = upsertStmt.executeUpdate();
        assertEquals(1, rowsInserted);
        
        select = "SELECT j FROM IntKeyTest";
        rs = conn.createStatement().executeQuery(select);
        assertTrue(rs.next());
        assertEquals(2,rs.getInt(1));
        assertFalse(rs.next());
        
        if (tgtPH()||tgtTR()) upsert = "UPSERT INTO IntKeyTest(i,j) select i, i from IntKeyTest";
        else if (tgtSQ())  upsert = "UPDATE IntKeyTest SET j=i where i in (SELECT i from IntKeyTest)";
        upsertStmt = conn.prepareStatement(upsert);
        rowsInserted = upsertStmt.executeUpdate();
        assertEquals(1, rowsInserted);
        
        select = "SELECT j FROM IntKeyTest";
        rs = conn.createStatement().executeQuery(select);
        assertTrue(rs.next());
        assertEquals(1,rs.getInt(1));
        assertFalse(rs.next());
    }

    @Test
    public void testUpsertSelectOnDescToAsc() throws Exception {
        printTestDescription();

        conn.createStatement().execute("create table IntKeyTest (i integer not null primary key desc, j integer)");
        String upsert = null;
        if (tgtPH()||tgtTR()) upsert = "UPSERT INTO IntKeyTest VALUES(1, 1)";
        else if (tgtSQ()) upsert = "INSERT INTO IntKeyTest VALUES(1, 1)";
        PreparedStatement upsertStmt = conn.prepareStatement(upsert);
        int rowsInserted = upsertStmt.executeUpdate();
        assertEquals(1, rowsInserted);
        
        if (tgtPH()||tgtTR()) upsert = "UPSERT INTO IntKeyTest(i,j) select i+1, j+1 from IntKeyTest";
        else if (tgtSQ()) upsert = "INSERT INTO IntKeyTest(i,j) select i+1, j+1 from IntKeyTest";
        upsertStmt = conn.prepareStatement(upsert);
        rowsInserted = upsertStmt.executeUpdate();
        assertEquals(1, rowsInserted);
        
        String select = null;
        if (tgtPH()) select = "SELECT i,j FROM IntKeyTest";
        else if (tgtSQ()||tgtTR()) select = "SELECT i,j FROM IntKeyTest order by 1 desc";
        ResultSet rs = conn.createStatement().executeQuery(select);
        assertTrue(rs.next());
        assertEquals(2,rs.getInt(1));
        assertEquals(2,rs.getInt(2));
        assertTrue(rs.next());
        assertEquals(1,rs.getInt(1));
        assertEquals(1,rs.getInt(2));
        assertFalse(rs.next());
    }

    @Test
    public void testUpsertSelectRowKeyMutationOnSplitedTable() throws Exception {
        printTestDescription();

        createTestTable("IntKeyTest");
        String upsert = null;
        if (tgtPH()||tgtTR()) upsert = "UPSERT INTO IntKeyTest VALUES(?)";
        else if (tgtSQ()) upsert = "INSERT INTO IntKeyTest VALUES(?)";
        PreparedStatement upsertStmt = conn.prepareStatement(upsert);
        upsertStmt.setInt(1, 1);
        upsertStmt.executeUpdate();
        upsertStmt.setInt(1, 3);
        upsertStmt.executeUpdate();
        
        // Normally this would force a server side update. But since this changes the PK column, it would
        // for to run on the client side.
        if (tgtPH()||tgtTR()) upsert = "UPSERT INTO IntKeyTest(i) SELECT i+1 from IntKeyTest";
        else if (tgtSQ()) upsert = "INSERT INTO IntKeyTest(i) SELECT i+1 from IntKeyTest";
        upsertStmt = conn.prepareStatement(upsert);
        int rowsInserted = upsertStmt.executeUpdate();
        assertEquals(2, rowsInserted);
        
        String select = null;
        if (tgtPH()) select = "SELECT i FROM IntKeyTest";
        else if (tgtSQ()||tgtTR()) select = "SELECT i FROM IntKeyTest order by 1";
        ResultSet rs = conn.createStatement().executeQuery(select);
        assertTrue(rs.next());
        assertEquals(1,rs.getInt(1));
        assertTrue(rs.next());
        assertTrue(rs.next());
        assertTrue(rs.next());
        assertEquals(4,rs.getInt(1));
        assertFalse(rs.next());
    }
    
    @Test
    public void testUpsertSelectWithLimit() throws Exception {
        printTestDescription();

        conn.createStatement().execute("create table phoenix_test (id varchar(10) not null primary key, val varchar(10), ts timestamp)");

        if (tgtPH()) {
            conn.createStatement().execute("upsert into phoenix_test values ('aaa', 'abc', current_date())");
            conn.createStatement().execute("upsert into phoenix_test values ('bbb', 'bcd', current_date())");
            conn.createStatement().execute("upsert into phoenix_test values ('ccc', 'cde', current_date())");
        }  else if (tgtTR()) {
            conn.createStatement().execute("upsert into phoenix_test values ('aaa', 'abc', CURRENT_TIMESTAMP)");
            conn.createStatement().execute("upsert into phoenix_test values ('bbb', 'bcd', CURRENT_TIMESTAMP)");
            conn.createStatement().execute("upsert into phoenix_test values ('ccc', 'cde', CURRENT_TIMESTAMP)");
        } else if (tgtSQ()) {
            conn.createStatement().execute("insert into phoenix_test values ('aaa', 'abc', CURRENT_TIMESTAMP)");
            conn.createStatement().execute("insert into phoenix_test values ('bbb', 'bcd', CURRENT_TIMESTAMP)");
            conn.createStatement().execute("insert into phoenix_test values ('ccc', 'cde', CURRENT_TIMESTAMP)");
        }

        ResultSet rs = null;
        if (tgtPH()) rs = conn.createStatement().executeQuery("select * from phoenix_test");
        else if (tgtSQ()||tgtTR()) rs = conn.createStatement().executeQuery("select * from phoenix_test order by 1");

        assertTrue(rs.next());
        assertEquals("aaa",rs.getString(1));
        assertEquals("abc",rs.getString(2));
        assertNotNull(rs.getDate(3));

        assertTrue(rs.next());
        assertEquals("bbb",rs.getString(1));
        assertEquals("bcd",rs.getString(2));
        assertNotNull(rs.getDate(3));

        assertTrue(rs.next());
        assertEquals("ccc",rs.getString(1));
        assertEquals("cde",rs.getString(2));
        assertNotNull(rs.getDate(3));

        if (tgtPH()) conn.createStatement().execute("upsert into phoenix_test (id, ts) select id, null from phoenix_test where id <= 'bbb' limit 1");
        else if (tgtTR()) conn.createStatement().execute("upsert into phoenix_test (id, ts) select id, null from phoenix_test where id < 'bbb'"); // TRAF: subquery does not support [first 1] or limit 1. Changed id <= 'bbb' to id < 'bbb'
        else if (tgtSQ()) conn.createStatement().execute("update phoenix_test set ts = null where id in (select id from phoenix_test where id < 'bbb')"); // TRAF: subquery does not support [first 1].  Changed id <= 'bbb' to id < 'bbb'

        if (tgtPH()) rs = conn.createStatement().executeQuery("select * from phoenix_test");
        else if (tgtSQ()||tgtTR()) rs = conn.createStatement().executeQuery("select * from phoenix_test order by 1");
 
        assertTrue(rs.next());
        assertEquals("aaa",rs.getString(1));
        assertEquals("abc",rs.getString(2));
        assertNull(rs.getDate(3));
        
        assertTrue(rs.next());
        assertEquals("bbb",rs.getString(1));
        assertEquals("bcd",rs.getString(2));
        assertNotNull(rs.getDate(3));
        
        assertTrue(rs.next());
        assertEquals("ccc",rs.getString(1));
        assertEquals("cde",rs.getString(2));
        assertNotNull(rs.getDate(3));
        
        assertFalse(rs.next());

    }
}
