blob: 8fb2ee5cb348e3938be51e658c26c126bf9c864d [file] [log] [blame]
/*
* 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 org.apache.phoenix.end2end;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import org.apache.phoenix.compile.QueryPlan;
import org.apache.phoenix.jdbc.PhoenixStatement;
import org.junit.Assert;
import org.junit.Test;
import org.junit.experimental.categories.Category;
@Category(ParallelStatsDisabledTest.class)
public class DescOrderKeysIT extends ParallelStatsDisabledIT {
@Test
public void testVarCharDescOrderPKs() throws Exception {
final String tableName = generateUniqueName();
try (Connection conn = DriverManager.getConnection(getUrl())) {
conn.setAutoCommit(true);
final Statement stmt = conn.createStatement();
stmt.execute("CREATE TABLE " + tableName +
" (COL1 VARCHAR, COL2 VARCHAR CONSTRAINT PK PRIMARY KEY (COL1 DESC, COL2)) ");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2) VALUES ('h1uniq1', 'val1')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2) VALUES ('41efh', 'val2')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2) VALUES ('c49ghd', 'val3')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2) VALUES ('4232jfjg', 'val4')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2) VALUES ('zsw4tg', 'val5')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2) VALUES ('93hgwef', 'val6')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2) VALUES ('3jfytw', 'val7')");
final String sql = "select COL1, COL2 from " + tableName;
ResultSet rs = stmt.executeQuery(sql);
Assert.assertTrue(rs.next());
QueryPlan plan = stmt.unwrap(PhoenixStatement.class).getQueryPlan();
Assert.assertEquals("Expected a single scan ", 1, plan.getScans().size());
Assert.assertEquals("Expected a single scan ", 1, plan.getScans().get(0).size());
Assert.assertEquals("zsw4tg", rs.getString(1));
Assert.assertEquals("val5", rs.getString(2));
Assert.assertTrue(rs.next());
Assert.assertEquals("h1uniq1", rs.getString(1));
Assert.assertEquals("val1", rs.getString(2));
Assert.assertTrue(rs.next());
Assert.assertEquals("c49ghd", rs.getString(1));
Assert.assertEquals("val3", rs.getString(2));
Assert.assertTrue(rs.next());
Assert.assertEquals("93hgwef", rs.getString(1));
Assert.assertEquals("val6", rs.getString(2));
Assert.assertTrue(rs.next());
Assert.assertEquals("4232jfjg", rs.getString(1));
Assert.assertEquals("val4", rs.getString(2));
Assert.assertTrue(rs.next());
Assert.assertEquals("41efh", rs.getString(1));
Assert.assertEquals("val2", rs.getString(2));
Assert.assertTrue(rs.next());
Assert.assertEquals("3jfytw", rs.getString(1));
Assert.assertEquals("val7", rs.getString(2));
Assert.assertFalse(rs.next());
}
}
@Test
public void testVarCharDescOrderMultiplePKs() throws Exception {
final String tableName = generateUniqueName();
try (Connection conn = DriverManager.getConnection(getUrl())) {
conn.setAutoCommit(true);
final Statement stmt = conn.createStatement();
stmt.execute("CREATE TABLE " + tableName +
" (COL1 VARCHAR, COL2 VARCHAR, COL3 VARCHAR CONSTRAINT " +
"PK PRIMARY KEY (COL1 DESC, COL2 DESC, COL3)) ");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"('h1uniq1', 'key1', 'val1')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"('41efh', 'key2', 'val2')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"('c49ghd', 'key3', 'val3')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"('zsw4tg', 'key5', 'val5')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"('zsw4tg', 'key4', 'val4')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"('h1uniq1', 'key6', 'val6')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"('93hgwef', 'key7', 'val7')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"('3jfytw', 'key8', 'val8')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"('4232jfjg', 'key9', 'val9')");
final String sql = "select COL1, COL2, COL3 from " + tableName;
ResultSet rs = stmt.executeQuery(sql);
Assert.assertTrue(rs.next());
QueryPlan plan = stmt.unwrap(PhoenixStatement.class).getQueryPlan();
Assert.assertEquals("Expected a single scan ", 1, plan.getScans().size());
Assert.assertEquals("Expected a single scan ", 1, plan.getScans().get(0).size());
Assert.assertEquals("zsw4tg", rs.getString(1));
Assert.assertEquals("key5", rs.getString(2));
Assert.assertEquals("val5", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals("zsw4tg", rs.getString(1));
Assert.assertEquals("key4", rs.getString(2));
Assert.assertEquals("val4", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals("h1uniq1", rs.getString(1));
Assert.assertEquals("key6", rs.getString(2));
Assert.assertEquals("val6", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals("h1uniq1", rs.getString(1));
Assert.assertEquals("key1", rs.getString(2));
Assert.assertEquals("val1", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals("c49ghd", rs.getString(1));
Assert.assertEquals("key3", rs.getString(2));
Assert.assertEquals("val3", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals("93hgwef", rs.getString(1));
Assert.assertEquals("key7", rs.getString(2));
Assert.assertEquals("val7", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals("4232jfjg", rs.getString(1));
Assert.assertEquals("key9", rs.getString(2));
Assert.assertEquals("val9", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals("41efh", rs.getString(1));
Assert.assertEquals("key2", rs.getString(2));
Assert.assertEquals("val2", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals("3jfytw", rs.getString(1));
Assert.assertEquals("key8", rs.getString(2));
Assert.assertEquals("val8", rs.getString(3));
Assert.assertFalse(rs.next());
}
}
@Test
public void testIntDescOrderMultiplePKs() throws Exception {
final String tableName = generateUniqueName();
try (Connection conn = DriverManager.getConnection(getUrl())) {
conn.setAutoCommit(true);
final Statement stmt = conn.createStatement();
stmt.execute("CREATE TABLE " + tableName +
" (COL1 INTEGER NOT NULL, COL2 INTEGER NOT NULL, COL3 VARCHAR NOT NULL CONSTRAINT " +
"PK PRIMARY KEY (COL1 DESC, COL2 DESC, COL3)) ");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"(1234, 3957, 'val1')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"(2453, 234, 'val2')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"(3463, 345561, 'val3')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"(34534, 345657, 'val4')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"(2453, 92374, 'val5')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"(9375, 11037, 'val6')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"(9375, 455, 'val7')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"(9375, 7712, 'val8')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"(1234, 3956, 'val9')");
final String sql = "select COL1, COL2, COL3 from " + tableName;
ResultSet rs = stmt.executeQuery(sql);
Assert.assertTrue(rs.next());
QueryPlan plan = stmt.unwrap(PhoenixStatement.class).getQueryPlan();
Assert.assertEquals("Expected a single scan ", 1, plan.getScans().size());
Assert.assertEquals("Expected a single scan ", 1, plan.getScans().get(0).size());
Assert.assertEquals(34534, rs.getInt(1));
Assert.assertEquals(345657, rs.getInt(2));
Assert.assertEquals("val4", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals(9375, rs.getInt(1));
Assert.assertEquals(11037, rs.getInt(2));
Assert.assertEquals("val6", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals(9375, rs.getInt(1));
Assert.assertEquals(7712, rs.getInt(2));
Assert.assertEquals("val8", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals(9375, rs.getInt(1));
Assert.assertEquals(455, rs.getInt(2));
Assert.assertEquals("val7", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals(3463, rs.getInt(1));
Assert.assertEquals(345561, rs.getInt(2));
Assert.assertEquals("val3", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals(2453, rs.getInt(1));
Assert.assertEquals(92374, rs.getInt(2));
Assert.assertEquals("val5", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals(2453, rs.getInt(1));
Assert.assertEquals(234, rs.getInt(2));
Assert.assertEquals("val2", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals(1234, rs.getInt(1));
Assert.assertEquals(3957, rs.getInt(2));
Assert.assertEquals("val1", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals(1234, rs.getInt(1));
Assert.assertEquals(3956, rs.getInt(2));
Assert.assertEquals("val9", rs.getString(3));
Assert.assertFalse(rs.next());
}
}
@Test
public void testDoubleDescOrderMultiplePKs() throws Exception {
final String tableName = generateUniqueName();
try (Connection conn = DriverManager.getConnection(getUrl())) {
conn.setAutoCommit(true);
final Statement stmt = conn.createStatement();
stmt.execute("CREATE TABLE " + tableName +
" (COL1 DOUBLE NOT NULL, COL2 DOUBLE NOT NULL, COL3 VARCHAR NOT NULL CONSTRAINT " +
"PK PRIMARY KEY (COL1 DESC, COL2 DESC, COL3)) ");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"(1234.39, 3957.124, 'val1')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"(2453.97, 234.112, 'val2')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"(3463.384, 345561.124, 'val3')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"(34534.9191, 345657.913, 'val4')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"(2453.89, 92374.11, 'val5')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"(9375.23, 11037.729, 'val6')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"(9375.23, 11037.8, 'val7')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"(9375.23, 11037.72888, 'val8')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"(1234.39, 3957.123999, 'val9')");
final String sql = "select COL1, COL2, COL3 from " + tableName;
ResultSet rs = stmt.executeQuery(sql);
Assert.assertTrue(rs.next());
QueryPlan plan = stmt.unwrap(PhoenixStatement.class).getQueryPlan();
Assert.assertEquals("Expected a single scan ", 1, plan.getScans().size());
Assert.assertEquals("Expected a single scan ", 1, plan.getScans().get(0).size());
Assert.assertEquals(34534.9191, rs.getDouble(1), 0.0);
Assert.assertEquals(345657.913, rs.getDouble(2), 0.0);
Assert.assertEquals("val4", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals(9375.23, rs.getDouble(1), 0.0);
Assert.assertEquals(11037.8, rs.getDouble(2), 0.0);
Assert.assertEquals("val7", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals(9375.23, rs.getDouble(1), 0.0);
Assert.assertEquals(11037.729, rs.getDouble(2), 0.0);
Assert.assertEquals("val6", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals(9375.23, rs.getDouble(1), 0.0);
Assert.assertEquals(11037.72888, rs.getDouble(2), 0.0);
Assert.assertEquals("val8", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals(3463.384, rs.getDouble(1), 0.0);
Assert.assertEquals(345561.124, rs.getDouble(2), 0.0);
Assert.assertEquals("val3", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals(2453.97, rs.getDouble(1), 0.0);
Assert.assertEquals(234.112, rs.getDouble(2), 0.0);
Assert.assertEquals("val2", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals(2453.89, rs.getDouble(1), 0.0);
Assert.assertEquals(92374.11, rs.getDouble(2), 0.0);
Assert.assertEquals("val5", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals(1234.39, rs.getDouble(1), 0.0);
Assert.assertEquals(3957.124, rs.getDouble(2), 0.0);
Assert.assertEquals("val1", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals(1234.39, rs.getDouble(1), 0.0);
Assert.assertEquals(3957.123999, rs.getDouble(2), 0.0);
Assert.assertEquals("val9", rs.getString(3));
Assert.assertFalse(rs.next());
}
}
@Test
public void testDecimalDescOrderMultiplePKs() throws Exception {
final String tableName = generateUniqueName();
try (Connection conn = DriverManager.getConnection(getUrl())) {
conn.setAutoCommit(true);
final Statement stmt = conn.createStatement();
stmt.execute("CREATE TABLE " + tableName +
" (COL1 DECIMAL NOT NULL, COL2 DECIMAL NOT NULL, COL3 VARCHAR NOT NULL CONSTRAINT " +
"PK PRIMARY KEY (COL1 DESC, COL2 DESC, COL3)) ");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"(1234.39, 3957.124, 'val1')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"(2453.97, 234.112, 'val2')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"(3463.384, 345561.124, 'val3')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"(34534.9191, 345657.913, 'val4')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"(2453.89, 92374.11, 'val5')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"(9375.23, 11037.729, 'val6')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"(9375.23, 11037.8, 'val7')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"(9375.23, 11037.72888, 'val8')");
stmt.execute("UPSERT INTO " + tableName + " (COL1, COL2, COL3) VALUES " +
"(1234.39, 3957.123999, 'val9')");
final String sql = "select COL1, COL2, COL3 from " + tableName;
ResultSet rs = stmt.executeQuery(sql);
Assert.assertTrue(rs.next());
QueryPlan plan = stmt.unwrap(PhoenixStatement.class).getQueryPlan();
Assert.assertEquals("Expected a single scan ", 1, plan.getScans().size());
Assert.assertEquals("Expected a single scan ", 1, plan.getScans().get(0).size());
Assert.assertEquals(BigDecimal.valueOf(34534.9191), rs.getBigDecimal(1));
Assert.assertEquals(BigDecimal.valueOf(345657.913), rs.getBigDecimal(2));
Assert.assertEquals("val4", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals(BigDecimal.valueOf(9375.23), rs.getBigDecimal(1));
Assert.assertEquals(BigDecimal.valueOf(11037.8), rs.getBigDecimal(2));
Assert.assertEquals("val7", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals(BigDecimal.valueOf(9375.23), rs.getBigDecimal(1));
Assert.assertEquals(BigDecimal.valueOf(11037.729), rs.getBigDecimal(2));
Assert.assertEquals("val6", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals(BigDecimal.valueOf(9375.23), rs.getBigDecimal(1));
Assert.assertEquals(BigDecimal.valueOf(11037.72888), rs.getBigDecimal(2));
Assert.assertEquals("val8", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals(BigDecimal.valueOf(3463.384), rs.getBigDecimal(1));
Assert.assertEquals(BigDecimal.valueOf(345561.124), rs.getBigDecimal(2));
Assert.assertEquals("val3", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals(BigDecimal.valueOf(2453.97), rs.getBigDecimal(1));
Assert.assertEquals(BigDecimal.valueOf(234.112), rs.getBigDecimal(2));
Assert.assertEquals("val2", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals(BigDecimal.valueOf(2453.89), rs.getBigDecimal(1));
Assert.assertEquals(BigDecimal.valueOf(92374.11), rs.getBigDecimal(2));
Assert.assertEquals("val5", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals(BigDecimal.valueOf(1234.39), rs.getBigDecimal(1));
Assert.assertEquals(BigDecimal.valueOf(3957.124), rs.getBigDecimal(2));
Assert.assertEquals("val1", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals(BigDecimal.valueOf(1234.39), rs.getBigDecimal(1));
Assert.assertEquals(BigDecimal.valueOf(3957.123999), rs.getBigDecimal(2));
Assert.assertEquals("val9", rs.getString(3));
Assert.assertFalse(rs.next());
}
}
@Test
public void testViewWithIntDescPkColumn() throws Exception {
final String tableName = generateUniqueName();
final String view01 = "v01_" + tableName;
final String view02 = "v02_" + tableName;
try (Connection conn = DriverManager.getConnection(getUrl())) {
final Statement stmt = conn.createStatement();
stmt.execute("CREATE TABLE " + tableName
+ " (COL1 VARCHAR(10) NOT NULL, COL2 CHAR(5) NOT NULL, COL3 VARCHAR,"
+ " COL4 VARCHAR CONSTRAINT pk PRIMARY KEY(COL1, COL2))");
stmt.execute("CREATE VIEW " + view01
+ " (VCOL1 INTEGER NOT NULL, COL5 VARCHAR CONSTRAINT pk PRIMARY KEY(VCOL1 DESC))"
+ " AS SELECT * FROM " + tableName + " WHERE COL1 = 'col1'");
stmt.execute("CREATE VIEW " + view02
+ " (VCOL2 CHAR(10) NOT NULL, COL6 VARCHAR CONSTRAINT pk PRIMARY KEY(VCOL2))"
+ " AS SELECT * FROM " + view01 + " WHERE VCOL1 = 1");
stmt.execute("UPSERT INTO " + view02
+ " (col2, vcol2, col5, col6) values ('0001', 'vcol2_01', 'col5_01', 'col6_01')");
stmt.execute("UPSERT INTO " + view02
+ " (col2, vcol2, col5, col6) values ('0002', 'vcol2_02', 'col5_02', 'col6_02')");
stmt.execute("UPSERT INTO " + view02
+ " (col2, vcol2, col5, col6) values ('0003', 'vcol2_03', 'col5_03', 'col6_03')");
stmt.execute("UPSERT INTO " + view01 + " (col2, vcol1, col3, col4, col5) values "
+ "('0004', 2, 'col3_04', 'col4_04', 'col5_04')");
stmt.execute("UPSERT INTO " + view01 + " (col2, vcol1, col3, col4, col5) values "
+ "('0005', -2, 'col3_05', 'col4_05', 'col5_05')");
stmt.execute("UPSERT INTO " + view01 + " (col2, vcol1, col3, col4, col5) values "
+ "('0006', -1, 'col3_06', 'col4_06', 'col5_06')");
stmt.execute("UPSERT INTO " + view01 + " (col2, vcol1, col3, col4, col5) values "
+ "('0007', 1, 'col3_07', 'col4_07', 'col5_07')");
conn.commit();
ResultSet rs = stmt.executeQuery("SELECT COL1, COL2, VCOL1 FROM " + view01);
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0001", rs.getString(2));
Assert.assertEquals(1, rs.getInt(3));
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0002", rs.getString(2));
Assert.assertEquals(1, rs.getInt(3));
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0003", rs.getString(2));
Assert.assertEquals(1, rs.getInt(3));
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0004", rs.getString(2));
Assert.assertEquals(2, rs.getInt(3));
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0005", rs.getString(2));
Assert.assertEquals(-2, rs.getInt(3));
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0006", rs.getString(2));
Assert.assertEquals(-1, rs.getInt(3));
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0007", rs.getString(2));
Assert.assertEquals(1, rs.getInt(3));
Assert.assertFalse(rs.next());
rs = stmt.executeQuery("SELECT COL2, VCOL1, VCOL2, COL5, COL6 FROM " + view02);
Assert.assertTrue(rs.next());
Assert.assertEquals("0001", rs.getString(1));
Assert.assertEquals(1, rs.getInt(2));
Assert.assertEquals("vcol2_01", rs.getString(3));
Assert.assertEquals("col5_01", rs.getString(4));
Assert.assertEquals("col6_01", rs.getString(5));
Assert.assertTrue(rs.next());
Assert.assertEquals("0002", rs.getString(1));
Assert.assertEquals(1, rs.getInt(2));
Assert.assertEquals("vcol2_02", rs.getString(3));
Assert.assertEquals("col5_02", rs.getString(4));
Assert.assertEquals("col6_02", rs.getString(5));
Assert.assertTrue(rs.next());
Assert.assertEquals("0003", rs.getString(1));
Assert.assertEquals(1, rs.getInt(2));
Assert.assertEquals("vcol2_03", rs.getString(3));
Assert.assertEquals("col5_03", rs.getString(4));
Assert.assertEquals("col6_03", rs.getString(5));
Assert.assertTrue(rs.next());
Assert.assertEquals("0007", rs.getString(1));
Assert.assertEquals(1, rs.getInt(2));
Assert.assertNull(rs.getString(3));
Assert.assertEquals("col5_07", rs.getString(4));
Assert.assertNull(rs.getString(5));
Assert.assertFalse(rs.next());
}
}
@Test
public void testViewWithCharDescPkColumn() throws Exception {
final String tableName = generateUniqueName();
final String view01 = "v01_" + tableName;
final String view02 = "v02_" + tableName;
try (Connection conn = DriverManager.getConnection(getUrl())) {
final Statement stmt = conn.createStatement();
stmt.execute("CREATE TABLE " + tableName
+ " (COL1 VARCHAR(10) NOT NULL, COL2 CHAR(5) NOT NULL, COL3 VARCHAR,"
+ " COL4 VARCHAR CONSTRAINT pk PRIMARY KEY(COL1, COL2))");
stmt.execute("CREATE VIEW " + view01
+ " (VCOL1 CHAR(8) NOT NULL, COL5 VARCHAR CONSTRAINT pk PRIMARY KEY(VCOL1 DESC))"
+ " AS SELECT * FROM " + tableName + " WHERE COL1 = 'col1'");
stmt.execute("CREATE VIEW " + view02
+ " (VCOL2 CHAR(10) NOT NULL, COL6 VARCHAR CONSTRAINT pk PRIMARY KEY(VCOL2))"
+ " AS SELECT * FROM " + view01 + " WHERE VCOL1 = 'vcol1'");
stmt.execute("UPSERT INTO " + view02
+ " (col2, vcol2, col5, col6) values ('0001', 'vcol2_01', 'col5_01', 'col6_01')");
stmt.execute("UPSERT INTO " + view02
+ " (col2, vcol2, col5, col6) values ('0002', 'vcol2_02', 'col5_02', 'col6_02')");
stmt.execute("UPSERT INTO " + view02
+ " (col2, vcol2, col5, col6) values ('0003', 'vcol2_03', 'col5_03', 'col6_03')");
stmt.execute("UPSERT INTO " + view01 + " (col2, vcol1, col3, col4, col5) values "
+ "('0004', 'vcol2', 'col3_04', 'col4_04', 'col5_04')");
stmt.execute("UPSERT INTO " + view01 + " (col2, vcol1, col3, col4, col5) values "
+ "('0005', 'vcol-2', 'col3_05', 'col4_05', 'col5_05')");
stmt.execute("UPSERT INTO " + view01 + " (col2, vcol1, col3, col4, col5) values "
+ "('0006', 'vcol-1', 'col3_06', 'col4_06', 'col5_06')");
stmt.execute("UPSERT INTO " + view01 + " (col2, vcol1, col3, col4, col5) values "
+ "('0007', 'vcol1', 'col3_07', 'col4_07', 'col5_07')");
conn.commit();
ResultSet rs = stmt.executeQuery("SELECT COL1, COL2, VCOL1 FROM " + view01);
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0001", rs.getString(2));
Assert.assertEquals("vcol1", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0002", rs.getString(2));
Assert.assertEquals("vcol1", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0003", rs.getString(2));
Assert.assertEquals("vcol1", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0004", rs.getString(2));
Assert.assertEquals("vcol2", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0005", rs.getString(2));
Assert.assertEquals("vcol-2", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0006", rs.getString(2));
Assert.assertEquals("vcol-1", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0007", rs.getString(2));
Assert.assertEquals("vcol1", rs.getString(3));
Assert.assertFalse(rs.next());
rs = stmt.executeQuery("SELECT COL2, VCOL1, VCOL2, COL5, COL6 FROM " + view02);
Assert.assertTrue(rs.next());
Assert.assertEquals("0001", rs.getString(1));
Assert.assertEquals("vcol1", rs.getString(2));
Assert.assertEquals("vcol2_01", rs.getString(3));
Assert.assertEquals("col5_01", rs.getString(4));
Assert.assertEquals("col6_01", rs.getString(5));
Assert.assertTrue(rs.next());
Assert.assertEquals("0002", rs.getString(1));
Assert.assertEquals("vcol1", rs.getString(2));
Assert.assertEquals("vcol2_02", rs.getString(3));
Assert.assertEquals("col5_02", rs.getString(4));
Assert.assertEquals("col6_02", rs.getString(5));
Assert.assertTrue(rs.next());
Assert.assertEquals("0003", rs.getString(1));
Assert.assertEquals("vcol1", rs.getString(2));
Assert.assertEquals("vcol2_03", rs.getString(3));
Assert.assertEquals("col5_03", rs.getString(4));
Assert.assertEquals("col6_03", rs.getString(5));
Assert.assertTrue(rs.next());
Assert.assertEquals("0007", rs.getString(1));
Assert.assertEquals("vcol1", rs.getString(2));
Assert.assertNull(rs.getString(3));
Assert.assertEquals("col5_07", rs.getString(4));
Assert.assertNull(rs.getString(5));
Assert.assertFalse(rs.next());
rs = stmt.executeQuery("SELECT COL1, COL2, VCOL1 FROM " + view01 + " ORDER BY "
+ "VCOL1 DESC, COL2 ASC");
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0004", rs.getString(2));
Assert.assertEquals("vcol2", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0001", rs.getString(2));
Assert.assertEquals("vcol1", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0002", rs.getString(2));
Assert.assertEquals("vcol1", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0003", rs.getString(2));
Assert.assertEquals("vcol1", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0007", rs.getString(2));
Assert.assertEquals("vcol1", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0005", rs.getString(2));
Assert.assertEquals("vcol-2", rs.getString(3));
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0006", rs.getString(2));
Assert.assertEquals("vcol-1", rs.getString(3));
Assert.assertFalse(rs.next());
rs = stmt.executeQuery("SELECT COL2, VCOL1, VCOL2, COL5, COL6 FROM " + view02
+ " ORDER BY VCOL2 DESC, VCOL1 DESC");
Assert.assertTrue(rs.next());
Assert.assertEquals("0007", rs.getString(1));
Assert.assertEquals("vcol1", rs.getString(2));
Assert.assertNull(rs.getString(3));
Assert.assertEquals("col5_07", rs.getString(4));
Assert.assertNull(rs.getString(5));
Assert.assertTrue(rs.next());
Assert.assertEquals("0003", rs.getString(1));
Assert.assertEquals("vcol1", rs.getString(2));
Assert.assertEquals("vcol2_03", rs.getString(3));
Assert.assertEquals("col5_03", rs.getString(4));
Assert.assertEquals("col6_03", rs.getString(5));
Assert.assertTrue(rs.next());
Assert.assertEquals("0002", rs.getString(1));
Assert.assertEquals("vcol1", rs.getString(2));
Assert.assertEquals("vcol2_02", rs.getString(3));
Assert.assertEquals("col5_02", rs.getString(4));
Assert.assertEquals("col6_02", rs.getString(5));
Assert.assertTrue(rs.next());
Assert.assertEquals("0001", rs.getString(1));
Assert.assertEquals("vcol1", rs.getString(2));
Assert.assertEquals("vcol2_01", rs.getString(3));
Assert.assertEquals("col5_01", rs.getString(4));
Assert.assertEquals("col6_01", rs.getString(5));
Assert.assertFalse(rs.next());
}
}
@Test
public void testViewWithDoubleDescPkColumn() throws Exception {
final String tableName = generateUniqueName();
final String view01 = "v01_" + tableName;
final String view02 = "v02_" + tableName;
try (Connection conn = DriverManager.getConnection(getUrl())) {
final Statement stmt = conn.createStatement();
stmt.execute("CREATE TABLE " + tableName
+ " (COL1 VARCHAR(10) NOT NULL, COL2 CHAR(5) NOT NULL, COL3 VARCHAR,"
+ " COL4 VARCHAR CONSTRAINT pk PRIMARY KEY(COL1, COL2))");
stmt.execute("CREATE VIEW " + view01
+ " (VCOL1 DOUBLE NOT NULL, COL5 VARCHAR CONSTRAINT pk PRIMARY KEY(VCOL1 DESC))"
+ " AS SELECT * FROM " + tableName + " WHERE COL1 = 'col1'");
stmt.execute("CREATE VIEW " + view02
+ " (VCOL2 CHAR(10) NOT NULL, COL6 VARCHAR CONSTRAINT pk PRIMARY KEY(VCOL2))"
+ " AS SELECT * FROM " + view01 + " WHERE VCOL1 = 234.75");
stmt.execute("UPSERT INTO " + view02
+ " (col2, vcol2, col5, col6) values ('0001', 'vcol2_01', 'col5_01', 'col6_01')");
stmt.execute("UPSERT INTO " + view02
+ " (col2, vcol2, col5, col6) values ('0002', 'vcol2_02', 'col5_02', 'col6_02')");
stmt.execute("UPSERT INTO " + view02
+ " (col2, vcol2, col5, col6) values ('0003', 'vcol2_03', 'col5_03', 'col6_03')");
stmt.execute("UPSERT INTO " + view01 + " (col2, vcol1, col3, col4, col5) values "
+ "('0004', 236.49, 'col3_04', 'col4_04', 'col5_04')");
stmt.execute("UPSERT INTO " + view01 + " (col2, vcol1, col3, col4, col5) values "
+ "('0005', 17.053, 'col3_05', 'col4_05', 'col5_05')");
stmt.execute("UPSERT INTO " + view01 + " (col2, vcol1, col3, col4, col5) values "
+ "('0006', 98.8452, 'col3_06', 'col4_06', 'col5_06')");
stmt.execute("UPSERT INTO " + view01 + " (col2, vcol1, col3, col4, col5) values "
+ "('0007', 234.75, 'col3_07', 'col4_07', 'col5_07')");
conn.commit();
ResultSet rs = stmt.executeQuery("SELECT COL1, COL2, VCOL1 FROM " + view01);
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0001", rs.getString(2));
Assert.assertEquals(234.75, rs.getDouble(3), 0);
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0002", rs.getString(2));
Assert.assertEquals(234.75, rs.getDouble(3), 0);
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0003", rs.getString(2));
Assert.assertEquals(234.75, rs.getDouble(3), 0);
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0004", rs.getString(2));
Assert.assertEquals(236.49, rs.getDouble(3), 0);
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0005", rs.getString(2));
Assert.assertEquals(17.053, rs.getDouble(3), 0);
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0006", rs.getString(2));
Assert.assertEquals(98.8452, rs.getDouble(3), 0);
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0007", rs.getString(2));
Assert.assertEquals(234.75, rs.getDouble(3), 0);
Assert.assertFalse(rs.next());
rs = stmt.executeQuery("SELECT COL2, VCOL1, VCOL2, COL5, COL6 FROM " + view02);
Assert.assertTrue(rs.next());
Assert.assertEquals("0001", rs.getString(1));
Assert.assertEquals(234.75, rs.getDouble(2), 0);
Assert.assertEquals("vcol2_01", rs.getString(3));
Assert.assertEquals("col5_01", rs.getString(4));
Assert.assertEquals("col6_01", rs.getString(5));
Assert.assertTrue(rs.next());
Assert.assertEquals("0002", rs.getString(1));
Assert.assertEquals(234.75, rs.getDouble(2), 0);
Assert.assertEquals("vcol2_02", rs.getString(3));
Assert.assertEquals("col5_02", rs.getString(4));
Assert.assertEquals("col6_02", rs.getString(5));
Assert.assertTrue(rs.next());
Assert.assertEquals("0003", rs.getString(1));
Assert.assertEquals(234.75, rs.getDouble(2), 0);
Assert.assertEquals("vcol2_03", rs.getString(3));
Assert.assertEquals("col5_03", rs.getString(4));
Assert.assertEquals("col6_03", rs.getString(5));
Assert.assertTrue(rs.next());
Assert.assertEquals("0007", rs.getString(1));
Assert.assertEquals(234.75, rs.getDouble(2), 0);
Assert.assertNull(rs.getString(3));
Assert.assertEquals("col5_07", rs.getString(4));
Assert.assertNull(rs.getString(5));
Assert.assertFalse(rs.next());
rs = stmt.executeQuery("SELECT COL1, COL2, VCOL1 FROM " + view01 + " ORDER BY "
+ "VCOL1 DESC, COL2 ASC");
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0004", rs.getString(2));
Assert.assertEquals(236.49, rs.getDouble(3), 0);
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0001", rs.getString(2));
Assert.assertEquals(234.75, rs.getDouble(3), 0);
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0002", rs.getString(2));
Assert.assertEquals(234.75, rs.getDouble(3), 0);
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0003", rs.getString(2));
Assert.assertEquals(234.75, rs.getDouble(3), 0);
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0007", rs.getString(2));
Assert.assertEquals(234.75, rs.getDouble(3), 0);
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0006", rs.getString(2));
Assert.assertEquals(98.8452, rs.getDouble(3), 0);
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0005", rs.getString(2));
Assert.assertEquals(17.053, rs.getDouble(3), 0);
Assert.assertFalse(rs.next());
rs = stmt.executeQuery("SELECT COL2, VCOL1, VCOL2, COL5, COL6 FROM " + view02
+ " ORDER BY VCOL2 DESC, VCOL1 DESC");
Assert.assertTrue(rs.next());
Assert.assertEquals("0007", rs.getString(1));
Assert.assertEquals(234.75, rs.getDouble(2), 0);
Assert.assertNull(rs.getString(3));
Assert.assertEquals("col5_07", rs.getString(4));
Assert.assertNull(rs.getString(5));
Assert.assertTrue(rs.next());
Assert.assertEquals("0003", rs.getString(1));
Assert.assertEquals(234.75, rs.getDouble(2), 0);
Assert.assertEquals("vcol2_03", rs.getString(3));
Assert.assertEquals("col5_03", rs.getString(4));
Assert.assertEquals("col6_03", rs.getString(5));
Assert.assertTrue(rs.next());
Assert.assertEquals("0002", rs.getString(1));
Assert.assertEquals(234.75, rs.getDouble(2), 0);
Assert.assertEquals("vcol2_02", rs.getString(3));
Assert.assertEquals("col5_02", rs.getString(4));
Assert.assertEquals("col6_02", rs.getString(5));
Assert.assertTrue(rs.next());
Assert.assertEquals("0001", rs.getString(1));
Assert.assertEquals(234.75, rs.getDouble(2), 0);
Assert.assertEquals("vcol2_01", rs.getString(3));
Assert.assertEquals("col5_01", rs.getString(4));
Assert.assertEquals("col6_01", rs.getString(5));
Assert.assertFalse(rs.next());
}
}
@Test
public void testViewWithCharDescPkColumnAndViewIndex() throws Exception {
final String tableName = generateUniqueName();
final String view01 = "v01_" + tableName;
final String view02 = "v02_" + tableName;
final String index_view01 = "idx_v01_" + tableName;
final String index_view02 = "idx_v02_" + tableName;
try (Connection conn = DriverManager.getConnection(getUrl())) {
final Statement stmt = conn.createStatement();
stmt.execute("CREATE TABLE " + tableName
+ " (COL1 CHAR(10) NOT NULL, COL2 CHAR(5) NOT NULL, COL3 VARCHAR,"
+ " COL4 VARCHAR CONSTRAINT pk PRIMARY KEY(COL1 ASC, COL2 DESC))");
stmt.execute("CREATE VIEW " + view01
+ " (VCOL1 CHAR(8), COL5 VARCHAR) AS SELECT * FROM " + tableName
+ " WHERE COL1 = 'col1'");
stmt.execute("CREATE VIEW " + view02 + " (VCOL2 CHAR(10), COL6 VARCHAR)"
+ " AS SELECT * FROM " + view01 + " WHERE VCOL1 = 'vcol1'");
stmt.execute("CREATE INDEX " + index_view01 + " ON " + view01 + " (COL5) INCLUDE "
+ "(COL1, COL2, COL3)");
stmt.execute("CREATE INDEX " + index_view02 + " ON " + view02 + " (COL6) INCLUDE "
+ "(COL1, COL2, COL3)");
stmt.execute("UPSERT INTO " + view02
+ " (col2, vcol2, col5, col6) values ('0001', 'vcol2_01', 'col5_01', 'col6_01')");
stmt.execute("UPSERT INTO " + view02
+ " (col2, vcol2, col5, col6) values ('0002', 'vcol2_02', 'col5_02', 'col6_02')");
stmt.execute("UPSERT INTO " + view02
+ " (col2, vcol2, col5, col6) values ('0003', 'vcol2_03', 'col5_03', 'col6_03')");
stmt.execute("UPSERT INTO " + view01 + " (col2, vcol1, col3, col4, col5) values "
+ "('0004', 'vcol2', 'col3_04', 'col4_04', 'col5_04')");
stmt.execute("UPSERT INTO " + view01 + " (col2, vcol1, col3, col4, col5) values "
+ "('0005', 'vcol-2', 'col3_05', 'col4_05', 'col5_05')");
stmt.execute("UPSERT INTO " + view01 + " (col2, vcol1, col3, col4, col5) values "
+ "('0006', 'vcol-1', 'col3_06', 'col4_06', 'col5_06')");
stmt.execute("UPSERT INTO " + view01 + " (col2, vcol1, col3, col4, col5) values "
+ "('0007', 'vcol1', 'col3_07', 'col4_07', 'col5_07')");
stmt.execute("UPSERT INTO " + view02
+ " (col2, vcol2, col5, col6) values ('0008', 'vcol2_08', 'col5_08', 'col6_02')");
conn.commit();
ResultSet rs = stmt.executeQuery("SELECT COL2, VCOL1, VCOL2, COL5, COL6 FROM " + view02);
Assert.assertTrue(rs.next());
Assert.assertEquals("0008", rs.getString(1));
Assert.assertEquals("vcol1", rs.getString(2));
Assert.assertEquals("vcol2_08", rs.getString(3));
Assert.assertEquals("col5_08", rs.getString(4));
Assert.assertEquals("col6_02", rs.getString(5));
Assert.assertTrue(rs.next());
Assert.assertEquals("0007", rs.getString(1));
Assert.assertEquals("vcol1", rs.getString(2));
Assert.assertNull(rs.getString(3));
Assert.assertEquals("col5_07", rs.getString(4));
Assert.assertNull(rs.getString(5));
Assert.assertTrue(rs.next());
Assert.assertEquals("0003", rs.getString(1));
Assert.assertEquals("vcol1", rs.getString(2));
Assert.assertEquals("vcol2_03", rs.getString(3));
Assert.assertEquals("col5_03", rs.getString(4));
Assert.assertEquals("col6_03", rs.getString(5));
Assert.assertTrue(rs.next());
Assert.assertEquals("0002", rs.getString(1));
Assert.assertEquals("vcol1", rs.getString(2));
Assert.assertEquals("vcol2_02", rs.getString(3));
Assert.assertEquals("col5_02", rs.getString(4));
Assert.assertEquals("col6_02", rs.getString(5));
Assert.assertTrue(rs.next());
Assert.assertEquals("0001", rs.getString(1));
Assert.assertEquals("vcol1", rs.getString(2));
Assert.assertEquals("vcol2_01", rs.getString(3));
Assert.assertEquals("col5_01", rs.getString(4));
Assert.assertEquals("col6_01", rs.getString(5));
Assert.assertFalse(rs.next());
rs = stmt.executeQuery("SELECT * FROM " + view02);
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0008", rs.getString(2));
Assert.assertNull(rs.getString(3));
Assert.assertNull(rs.getString(4));
Assert.assertEquals("vcol1", rs.getString(5));
Assert.assertEquals("col5_08", rs.getString(6));
Assert.assertEquals("vcol2_08", rs.getString(7));
Assert.assertEquals("col6_02", rs.getString(8));
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0007", rs.getString(2));
Assert.assertEquals("col3_07", rs.getString(3));
Assert.assertEquals("col4_07", rs.getString(4));
Assert.assertEquals("vcol1", rs.getString(5));
Assert.assertEquals("col5_07", rs.getString(6));
Assert.assertNull(rs.getString(7));
Assert.assertNull(rs.getString(8));
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0003", rs.getString(2));
Assert.assertNull(rs.getString(3));
Assert.assertNull(rs.getString(4));
Assert.assertEquals("vcol1", rs.getString(5));
Assert.assertEquals("col5_03", rs.getString(6));
Assert.assertEquals("vcol2_03", rs.getString(7));
Assert.assertEquals("col6_03", rs.getString(8));
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0002", rs.getString(2));
Assert.assertNull(rs.getString(3));
Assert.assertNull(rs.getString(4));
Assert.assertEquals("vcol1", rs.getString(5));
Assert.assertEquals("col5_02", rs.getString(6));
Assert.assertEquals("vcol2_02", rs.getString(7));
Assert.assertEquals("col6_02", rs.getString(8));
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0001", rs.getString(2));
Assert.assertNull(rs.getString(3));
Assert.assertNull(rs.getString(4));
Assert.assertEquals("vcol1", rs.getString(5));
Assert.assertEquals("col5_01", rs.getString(6));
Assert.assertEquals("vcol2_01", rs.getString(7));
Assert.assertEquals("col6_01", rs.getString(8));
Assert.assertFalse(rs.next());
rs = stmt.executeQuery(
"SELECT * FROM " + view02 + " WHERE COL6 = 'col6_02'");
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0008", rs.getString(2));
Assert.assertNull(rs.getString(3));
Assert.assertNull(rs.getString(4));
Assert.assertEquals("vcol1", rs.getString(5));
Assert.assertEquals("col5_08", rs.getString(6));
Assert.assertEquals("vcol2_08", rs.getString(7));
Assert.assertEquals("col6_02", rs.getString(8));
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0002", rs.getString(2));
Assert.assertNull(rs.getString(3));
Assert.assertNull(rs.getString(4));
Assert.assertEquals("vcol1", rs.getString(5));
Assert.assertEquals("col5_02", rs.getString(6));
Assert.assertEquals("vcol2_02", rs.getString(7));
Assert.assertEquals("col6_02", rs.getString(8));
Assert.assertFalse(rs.next());
rs = stmt.executeQuery(
"SELECT COL1, COL2, VCOL1, COL6 FROM " + view02 + " WHERE COL6 = 'col6_02'");
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0008", rs.getString(2));
Assert.assertEquals("vcol1", rs.getString(3));
Assert.assertEquals("col6_02", rs.getString(4));
Assert.assertTrue(rs.next());
Assert.assertEquals("col1", rs.getString(1));
Assert.assertEquals("0002", rs.getString(2));
Assert.assertEquals("vcol1", rs.getString(3));
Assert.assertEquals("col6_02", rs.getString(4));
Assert.assertFalse(rs.next());
}
}
@Test
public void testViewWithTimestampDescPkColumnAndViewIndex() throws Exception {
final String tableName = generateUniqueName();
final String view01 = "v01_" + tableName;
final String view02 = "v02_" + tableName;
final String index_view01 = "idx_v01_" + tableName;
final String index_view02 = "idx_v02_" + tableName;
try (Connection conn = DriverManager.getConnection(getUrl())) {
final Statement stmt = conn.createStatement();
stmt.execute("CREATE TABLE " + tableName
+ " (COL1 TIMESTAMP NOT NULL, COL2 CHAR(5) NOT NULL, COL3 VARCHAR,"
+ " COL4 VARCHAR CONSTRAINT pk PRIMARY KEY(COL1 ASC, COL2 DESC))");
stmt.execute("CREATE VIEW " + view01
+ " (VCOL1 CHAR(8), COL5 VARCHAR) AS SELECT * FROM " + tableName
+ " WHERE COL1 = TO_TIMESTAMP('2023-01-20 00:10:00')");
stmt.execute("CREATE VIEW " + view02 + " (VCOL2 CHAR(10), COL6 VARCHAR)"
+ " AS SELECT * FROM " + view01 + " WHERE VCOL1 = 'vcol1'");
stmt.execute("CREATE INDEX " + index_view01 + " ON " + view01 + " (COL5) INCLUDE "
+ "(COL1, COL2, COL3)");
stmt.execute("CREATE INDEX " + index_view02 + " ON " + view02 + " (COL6) INCLUDE "
+ "(COL1, COL2, COL3)");
stmt.execute("UPSERT INTO " + view02
+ " (col2, vcol2, col5, col6) values ('0001', 'vcol2_01', 'col5_01', 'col6_01')");
stmt.execute("UPSERT INTO " + view02
+ " (col2, vcol2, col5, col6) values ('0002', 'vcol2_02', 'col5_02', 'col6_02')");
stmt.execute("UPSERT INTO " + view02
+ " (col2, vcol2, col5, col6) values ('0003', 'vcol2_03', 'col5_03', 'col6_03')");
stmt.execute("UPSERT INTO " + view01 + " (col2, vcol1, col3, col4, col5) values "
+ "('0004', 'vcol2', 'col3_04', 'col4_04', 'col5_04')");
stmt.execute("UPSERT INTO " + view01 + " (col2, vcol1, col3, col4, col5) values "
+ "('0005', 'vcol-2', 'col3_05', 'col4_05', 'col5_05')");
stmt.execute("UPSERT INTO " + view01 + " (col2, vcol1, col3, col4, col5) values "
+ "('0006', 'vcol-1', 'col3_06', 'col4_06', 'col5_06')");
stmt.execute("UPSERT INTO " + view01 + " (col2, vcol1, col3, col4, col5) values "
+ "('0007', 'vcol1', 'col3_07', 'col4_07', 'col5_07')");
stmt.execute("UPSERT INTO " + view02
+ " (col2, vcol2, col5, col6) values ('0008', 'vcol2_08', 'col5_08', 'col6_02')");
conn.commit();
ResultSet rs = stmt.executeQuery("SELECT COL2, VCOL1, VCOL2, COL5, COL6 FROM " + view02);
Assert.assertTrue(rs.next());
Assert.assertEquals("0008", rs.getString(1));
Assert.assertEquals("vcol1", rs.getString(2));
Assert.assertEquals("vcol2_08", rs.getString(3));
Assert.assertEquals("col5_08", rs.getString(4));
Assert.assertEquals("col6_02", rs.getString(5));
Assert.assertTrue(rs.next());
Assert.assertEquals("0007", rs.getString(1));
Assert.assertEquals("vcol1", rs.getString(2));
Assert.assertNull(rs.getString(3));
Assert.assertEquals("col5_07", rs.getString(4));
Assert.assertNull(rs.getString(5));
Assert.assertTrue(rs.next());
Assert.assertEquals("0003", rs.getString(1));
Assert.assertEquals("vcol1", rs.getString(2));
Assert.assertEquals("vcol2_03", rs.getString(3));
Assert.assertEquals("col5_03", rs.getString(4));
Assert.assertEquals("col6_03", rs.getString(5));
Assert.assertTrue(rs.next());
Assert.assertEquals("0002", rs.getString(1));
Assert.assertEquals("vcol1", rs.getString(2));
Assert.assertEquals("vcol2_02", rs.getString(3));
Assert.assertEquals("col5_02", rs.getString(4));
Assert.assertEquals("col6_02", rs.getString(5));
Assert.assertTrue(rs.next());
Assert.assertEquals("0001", rs.getString(1));
Assert.assertEquals("vcol1", rs.getString(2));
Assert.assertEquals("vcol2_01", rs.getString(3));
Assert.assertEquals("col5_01", rs.getString(4));
Assert.assertEquals("col6_01", rs.getString(5));
Assert.assertFalse(rs.next());
rs = stmt.executeQuery("SELECT * FROM " + view02);
Assert.assertTrue(rs.next());
Assert.assertEquals("2023-01-20T00:10:00Z", rs.getTimestamp(1).toInstant().toString());
Assert.assertEquals("0008", rs.getString(2));
Assert.assertNull(rs.getString(3));
Assert.assertNull(rs.getString(4));
Assert.assertEquals("vcol1", rs.getString(5));
Assert.assertEquals("col5_08", rs.getString(6));
Assert.assertEquals("vcol2_08", rs.getString(7));
Assert.assertEquals("col6_02", rs.getString(8));
Assert.assertTrue(rs.next());
Assert.assertEquals("2023-01-20T00:10:00Z", rs.getTimestamp(1).toInstant().toString());
Assert.assertEquals("0007", rs.getString(2));
Assert.assertEquals("col3_07", rs.getString(3));
Assert.assertEquals("col4_07", rs.getString(4));
Assert.assertEquals("vcol1", rs.getString(5));
Assert.assertEquals("col5_07", rs.getString(6));
Assert.assertNull(rs.getString(7));
Assert.assertNull(rs.getString(8));
Assert.assertTrue(rs.next());
Assert.assertEquals("2023-01-20T00:10:00Z", rs.getTimestamp(1).toInstant().toString());
Assert.assertEquals("0003", rs.getString(2));
Assert.assertNull(rs.getString(3));
Assert.assertNull(rs.getString(4));
Assert.assertEquals("vcol1", rs.getString(5));
Assert.assertEquals("col5_03", rs.getString(6));
Assert.assertEquals("vcol2_03", rs.getString(7));
Assert.assertEquals("col6_03", rs.getString(8));
Assert.assertTrue(rs.next());
Assert.assertEquals("2023-01-20T00:10:00Z", rs.getTimestamp(1).toInstant().toString());
Assert.assertEquals("0002", rs.getString(2));
Assert.assertNull(rs.getString(3));
Assert.assertNull(rs.getString(4));
Assert.assertEquals("vcol1", rs.getString(5));
Assert.assertEquals("col5_02", rs.getString(6));
Assert.assertEquals("vcol2_02", rs.getString(7));
Assert.assertEquals("col6_02", rs.getString(8));
Assert.assertTrue(rs.next());
Assert.assertEquals("2023-01-20T00:10:00Z", rs.getTimestamp(1).toInstant().toString());
Assert.assertEquals("0001", rs.getString(2));
Assert.assertNull(rs.getString(3));
Assert.assertNull(rs.getString(4));
Assert.assertEquals("vcol1", rs.getString(5));
Assert.assertEquals("col5_01", rs.getString(6));
Assert.assertEquals("vcol2_01", rs.getString(7));
Assert.assertEquals("col6_01", rs.getString(8));
Assert.assertFalse(rs.next());
rs = stmt.executeQuery(
"SELECT * FROM " + view02 + " WHERE COL6 = 'col6_02'");
Assert.assertTrue(rs.next());
Assert.assertEquals("2023-01-20T00:10:00Z", rs.getTimestamp(1).toInstant().toString());
Assert.assertEquals("0008", rs.getString(2));
Assert.assertNull(rs.getString(3));
Assert.assertNull(rs.getString(4));
Assert.assertEquals("vcol1", rs.getString(5));
Assert.assertEquals("col5_08", rs.getString(6));
Assert.assertEquals("vcol2_08", rs.getString(7));
Assert.assertEquals("col6_02", rs.getString(8));
Assert.assertTrue(rs.next());
Assert.assertEquals("2023-01-20T00:10:00Z", rs.getTimestamp(1).toInstant().toString());
Assert.assertEquals("0002", rs.getString(2));
Assert.assertNull(rs.getString(3));
Assert.assertNull(rs.getString(4));
Assert.assertEquals("vcol1", rs.getString(5));
Assert.assertEquals("col5_02", rs.getString(6));
Assert.assertEquals("vcol2_02", rs.getString(7));
Assert.assertEquals("col6_02", rs.getString(8));
Assert.assertFalse(rs.next());
rs = stmt.executeQuery(
"SELECT COL1, COL2, VCOL1, COL6 FROM " + view02 + " WHERE COL6 = 'col6_02'");
Assert.assertTrue(rs.next());
Assert.assertEquals("2023-01-20T00:10:00Z", rs.getTimestamp(1).toInstant().toString());
Assert.assertEquals("0008", rs.getString(2));
Assert.assertEquals("vcol1", rs.getString(3));
Assert.assertEquals("col6_02", rs.getString(4));
Assert.assertTrue(rs.next());
Assert.assertEquals("2023-01-20T00:10:00Z", rs.getTimestamp(1).toInstant().toString());
Assert.assertEquals("0002", rs.getString(2));
Assert.assertEquals("vcol1", rs.getString(3));
Assert.assertEquals("col6_02", rs.getString(4));
Assert.assertFalse(rs.next());
}
}
}