This doesn't look right.
---------- Forwarded message ---------- From: <[email protected]> Date: Tue, Dec 16, 2014 at 8:58 PM Subject: [1/6] phoenix git commit: PHOENIX-1537 Set reuseForks to false for integration tests To: [email protected] Repository: phoenix Updated Branches: refs/heads/master cc479e57b -> 002097012 http://git-wip-us.apache.org/repos/asf/phoenix/blob/8f289e63/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexIT.java deleted file mode 100644 index d3d8322..0000000 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexIT.java +++ /dev/null @@ -1,1344 +0,0 @@ -/* - * 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.index; - -import static org.apache.phoenix.util.TestUtil.TEST_PROPERTIES; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import java.math.BigDecimal; -import java.sql.Connection; -import java.sql.Date; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.Statement; -import java.util.Map; -import java.util.Properties; - -import org.apache.hadoop.hbase.HTableDescriptor; -import org.apache.phoenix.compile.ColumnResolver; -import org.apache.phoenix.compile.FromCompiler; -import org.apache.phoenix.end2end.BaseHBaseManagedTimeIT; -import org.apache.phoenix.end2end.Shadower; -import org.apache.phoenix.jdbc.PhoenixConnection; -import org.apache.phoenix.parse.NamedTableNode; -import org.apache.phoenix.parse.TableName; -import org.apache.phoenix.query.QueryServices; -import org.apache.phoenix.schema.PTable; -import org.apache.phoenix.util.MetaDataUtil; -import org.apache.phoenix.util.PropertiesUtil; -import org.apache.phoenix.util.QueryUtil; -import org.apache.phoenix.util.ReadOnlyProps; -import org.apache.phoenix.util.TestUtil; -import org.junit.BeforeClass; -import org.junit.Test; - -import com.google.common.collect.Maps; -import com.google.common.primitives.Doubles; - - -public class MutableIndexIT extends BaseMutableIndexIT { - - @BeforeClass - @Shadower(classBeingShadowed = BaseHBaseManagedTimeIT.class) - public static void doSetup() throws Exception { - Map<String,String> props = Maps.newHashMapWithExpectedSize(3); - // Don't split intra region so we can more easily know that the n-way parallelization is for the explain plan - // Forces server cache to be used - props.put(QueryServices.INDEX_MUTATE_BATCH_SIZE_THRESHOLD_ATTRIB, Integer.toString(2)); - props.put(QueryServices.DROP_METADATA_ATTRIB, Boolean.toString(true)); - setUpTestDriver(new ReadOnlyProps(props.entrySet().iterator())); - } - - @Test - public void testIndexCreateWithoutOptions() throws Exception { - createIndexOnTableWithSpecifiedDefaultCF(false); - } - - @Test - public void testIndexCreateWithOptions() throws Exception { - createIndexOnTableWithSpecifiedDefaultCF(true); - } - - private void createIndexOnTableWithSpecifiedDefaultCF(boolean hasOptions) throws Exception { - String query; - ResultSet rs; - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.createStatement().execute( - "CREATE TABLE " + DATA_TABLE_FULL_NAME + " (k VARCHAR NOT NULL PRIMARY KEY, v1 VARCHAR, v2 VARCHAR) DEFAULT_COLUMN_FAMILY='A'"); - query = "SELECT * FROM " + DATA_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery(query); - assertFalse(rs.next()); - - String options = hasOptions ? "SALT_BUCKETS=10, MULTI_TENANT=true, IMMUTABLE_ROWS=true, DISABLE_WAL=true" : ""; - conn.createStatement().execute( - "CREATE INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME + " (v1) INCLUDE (v2) " + options); - query = "SELECT * FROM " + INDEX_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery(query); - assertFalse(rs.next()); - - //check options set correctly on index - TableName indexName = TableName.create(SCHEMA_NAME, INDEX_TABLE_NAME); - NamedTableNode indexNode = NamedTableNode.create(null, indexName, null); - ColumnResolver resolver = FromCompiler.getResolver(indexNode, conn.unwrap(PhoenixConnection.class)); - PTable indexTable = resolver.getTables().get(0).getTable(); - // Can't set IMMUTABLE_ROWS, MULTI_TENANT or DEFAULT_COLUMN_FAMILY_NAME on an index - assertNull(indexTable.getDefaultFamilyName()); - assertFalse(indexTable.isMultiTenant()); - assertFalse(indexTable.isImmutableRows()); - if(hasOptions) { - assertEquals(10, indexTable.getBucketNum().intValue()); - assertTrue(indexTable.isWALDisabled()); - } - } - - @Test - public void testIndexWithNullableFixedWithCols() throws Exception { - testIndexWithNullableFixedWithCols(false); - } - - @Test - public void testLocalIndexWithNullableFixedWithCols() throws Exception { - testIndexWithNullableFixedWithCols(true); - } - - private void testIndexWithNullableFixedWithCols(boolean localIndex) throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - try { - createTestTable(); - populateTestTable(); - String ddl = null; - if(localIndex){ - ddl = "CREATE LOCAL INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME - + " (char_col1 ASC, int_col1 ASC)" - + " INCLUDE (long_col1, long_col2)"; - } else { - ddl = "CREATE INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME - + " (char_col1 ASC, int_col1 ASC)" - + " INCLUDE (long_col1, long_col2)"; - } - PreparedStatement stmt = conn.prepareStatement(ddl); - stmt.execute(); - - String query = "SELECT d.char_col1, int_col1 from " + DATA_TABLE_FULL_NAME + " as d"; - ResultSet rs = conn.createStatement().executeQuery("EXPLAIN " + query); - if (localIndex) { - assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + MetaDataUtil.getLocalIndexTableName(DATA_TABLE_FULL_NAME)+" [-32768]\nCLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); - } else { - assertEquals("CLIENT PARALLEL 1-WAY FULL SCAN OVER " + INDEX_TABLE_FULL_NAME, QueryUtil.getExplainPlan(rs)); - } - - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("chara", rs.getString(1)); - assertEquals("chara", rs.getString("char_col1")); - assertEquals(2, rs.getInt(2)); - assertTrue(rs.next()); - assertEquals("chara", rs.getString(1)); - assertEquals(3, rs.getInt(2)); - assertTrue(rs.next()); - assertEquals("chara", rs.getString(1)); - assertEquals(4, rs.getInt(2)); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testIndexWithNullableDateCol() throws Exception { - testIndexWithNullableDateCol(false); - } - - @Test - public void testLocalIndexWithNullableDateCol() throws Exception { - testIndexWithNullableDateCol(true); - } - - private void testIndexWithNullableDateCol(boolean localIndex) throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - try { - Date date = new Date(System.currentTimeMillis()); - - createTestTable(); - populateTestTable(date); - String ddl = null; - if (localIndex) { - ddl = "CREATE LOCAL INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME + " (date_col)"; - } else { - ddl = "CREATE INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME + " (date_col)"; - } - PreparedStatement stmt = conn.prepareStatement(ddl); - stmt.execute(); - - String query = "SELECT int_pk from " + DATA_TABLE_FULL_NAME ; - ResultSet rs = conn.createStatement().executeQuery("EXPLAIN " + query); - if (localIndex) { - assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER _LOCAL_IDX_" + DATA_TABLE_FULL_NAME +" [-32768]\nCLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); - } else { - assertEquals("CLIENT PARALLEL 1-WAY FULL SCAN OVER " + INDEX_TABLE_FULL_NAME, QueryUtil.getExplainPlan(rs)); - } - - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals(2, rs.getInt(1)); - assertTrue(rs.next()); - assertEquals(1, rs.getInt(1)); - assertTrue(rs.next()); - assertEquals(3, rs.getInt(1)); - assertFalse(rs.next()); - - query = "SELECT date_col from " + DATA_TABLE_FULL_NAME + " order by date_col" ; - rs = conn.createStatement().executeQuery("EXPLAIN " + query); - if (localIndex) { - assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER _LOCAL_IDX_" + DATA_TABLE_FULL_NAME + " [-32768]\nCLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); - } else { - assertEquals("CLIENT PARALLEL 1-WAY FULL SCAN OVER " + INDEX_TABLE_FULL_NAME, QueryUtil.getExplainPlan(rs)); - } - - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals(date, rs.getDate(1)); - assertTrue(rs.next()); - assertEquals(new Date(date.getTime() + TestUtil.MILLIS_IN_DAY), rs.getDate(1)); - assertTrue(rs.next()); - assertEquals(new Date(date.getTime() + 2 * TestUtil.MILLIS_IN_DAY), rs.getDate(1)); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testCoveredColumnUpdates() throws Exception { - testCoveredColumnUpdates(false); - } - - @Test - public void testCoveredColumnUpdatesWithLocalIndex() throws Exception { - testCoveredColumnUpdates(true); - } - - private void testCoveredColumnUpdates(boolean localIndex) throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - try { - createTestTable(); - populateTestTable(); - String ddl = null; - if(localIndex) { - ddl = "CREATE LOCAL INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME - + " (char_col1 ASC, int_col1 ASC)" - + " INCLUDE (long_col1, long_col2)"; - } else { - ddl = "CREATE INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME - + " (char_col1 ASC, int_col1 ASC)" - + " INCLUDE (long_col1, long_col2)"; - } - - PreparedStatement stmt = conn.prepareStatement(ddl); - stmt.execute(); - - String query = "SELECT char_col1, int_col1, long_col2 from " + DATA_TABLE_FULL_NAME; - ResultSet rs = conn.createStatement().executeQuery("EXPLAIN " + query); - if (localIndex) { - assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER _LOCAL_IDX_" + DATA_TABLE_FULL_NAME +" [-32768]\nCLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); - } else { - assertEquals("CLIENT PARALLEL 1-WAY FULL SCAN OVER " + INDEX_TABLE_FULL_NAME, QueryUtil.getExplainPlan(rs)); - } - - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("chara", rs.getString(1)); - assertEquals(2, rs.getInt(2)); - assertEquals(3L, rs.getLong(3)); - assertTrue(rs.next()); - assertEquals("chara", rs.getString(1)); - assertEquals(3, rs.getInt(2)); - assertEquals(4L, rs.getLong(3)); - assertTrue(rs.next()); - assertEquals("chara", rs.getString(1)); - assertEquals(4, rs.getInt(2)); - assertEquals(5L, rs.getLong(3)); - assertFalse(rs.next()); - - stmt = conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME - + "(varchar_pk, char_pk, int_pk, long_pk , decimal_pk, long_col2) SELECT varchar_pk, char_pk, int_pk, long_pk , decimal_pk, long_col2*2 FROM " - + DATA_TABLE_FULL_NAME + " WHERE long_col2=?"); - stmt.setLong(1,4L); - assertEquals(1,stmt.executeUpdate()); - conn.commit(); - - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("chara", rs.getString(1)); - assertEquals(2, rs.getInt(2)); - assertEquals(3L, rs.getLong(3)); - assertTrue(rs.next()); - assertEquals("chara", rs.getString(1)); - assertEquals(3, rs.getInt(2)); - assertEquals(8L, rs.getLong(3)); - assertTrue(rs.next()); - assertEquals("chara", rs.getString(1)); - assertEquals(4, rs.getInt(2)); - assertEquals(5L, rs.getLong(3)); - assertFalse(rs.next()); - - stmt = conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME - + "(varchar_pk, char_pk, int_pk, long_pk , decimal_pk, long_col2) SELECT varchar_pk, char_pk, int_pk, long_pk , decimal_pk, null FROM " - + DATA_TABLE_FULL_NAME + " WHERE long_col2=?"); - stmt.setLong(1,3L); - assertEquals(1,stmt.executeUpdate()); - conn.commit(); - - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("chara", rs.getString(1)); - assertEquals(2, rs.getInt(2)); - assertEquals(0, rs.getLong(3)); - assertTrue(rs.wasNull()); - assertTrue(rs.next()); - assertEquals("chara", rs.getString(1)); - assertEquals(3, rs.getInt(2)); - assertEquals(8L, rs.getLong(3)); - assertTrue(rs.next()); - assertEquals("chara", rs.getString(1)); - assertEquals(4, rs.getInt(2)); - assertEquals(5L, rs.getLong(3)); - assertFalse(rs.next()); - if(localIndex) { - query = "SELECT b.* from " + DATA_TABLE_FULL_NAME + " where int_col1 = 4"; - rs = conn.createStatement().executeQuery("EXPLAIN " + query); - assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER _LOCAL_IDX_" + DATA_TABLE_FULL_NAME +" [-32768]\n" + - " SERVER FILTER BY TO_INTEGER(INT_COL1) = 4\nCLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("varchar_b", rs.getString(1)); - assertEquals("charb", rs.getString(2)); - assertEquals(5, rs.getInt(3)); - assertEquals(5, rs.getLong(4)); - assertFalse(rs.next()); - - } - } finally { - conn.close(); - } - } - - @Test - public void testSelectAllAndAliasWithIndex() throws Exception { - testSelectAllAndAliasWithIndex(false); - } - - @Test - public void testSelectAllAndAliasWithLocalIndex() throws Exception { - testSelectAllAndAliasWithIndex(true); - } - - private void testSelectAllAndAliasWithIndex(boolean localIndex) throws Exception { - String query; - ResultSet rs; - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - conn.createStatement().execute("CREATE TABLE " + DATA_TABLE_FULL_NAME + " (k VARCHAR NOT NULL PRIMARY KEY, v1 VARCHAR, v2 VARCHAR)"); - query = "SELECT * FROM " + DATA_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery(query); - assertFalse(rs.next()); - - if (localIndex) { - conn.createStatement().execute("CREATE LOCAL INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME + " (v2 DESC) INCLUDE (v1)"); - } else { - conn.createStatement().execute("CREATE INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME + " (v2 DESC) INCLUDE (v1)"); - } - query = "SELECT * FROM " + INDEX_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery(query); - assertFalse(rs.next()); - - PreparedStatement stmt = conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME + " VALUES(?,?,?)"); - stmt.setString(1,"a"); - stmt.setString(2, "x"); - stmt.setString(3, "1"); - stmt.execute(); - stmt.setString(1,"b"); - stmt.setString(2, "y"); - stmt.setString(3, "2"); - stmt.execute(); - conn.commit(); - - query = "SELECT * FROM " + DATA_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery("EXPLAIN " + query); - if(localIndex){ - assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER _LOCAL_IDX_" + DATA_TABLE_FULL_NAME+" [-32768]\nCLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); - } else { - assertEquals("CLIENT PARALLEL 1-WAY FULL SCAN OVER " + INDEX_TABLE_FULL_NAME, QueryUtil.getExplainPlan(rs)); - } - - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("b",rs.getString(1)); - assertEquals("y",rs.getString(2)); - assertEquals("2",rs.getString(3)); - assertEquals("b",rs.getString("k")); - assertEquals("y",rs.getString("v1")); - assertEquals("2",rs.getString("v2")); - assertTrue(rs.next()); - assertEquals("a",rs.getString(1)); - assertEquals("x",rs.getString(2)); - assertEquals("1",rs.getString(3)); - assertEquals("a",rs.getString("k")); - assertEquals("x",rs.getString("v1")); - assertEquals("1",rs.getString("v2")); - assertFalse(rs.next()); - - query = "SELECT v1 as foo FROM " + DATA_TABLE_FULL_NAME + " WHERE v2 = '1' ORDER BY foo"; - rs = conn.createStatement().executeQuery("EXPLAIN " + query); - if(localIndex){ - assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER _LOCAL_IDX_" +DATA_TABLE_FULL_NAME + " [-32768,~'1']\n" + - " SERVER SORTED BY [V1]\n" + - "CLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); - } else { - assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER " +INDEX_TABLE_FULL_NAME + " [~'1']\n" + - " SERVER SORTED BY [V1]\n" + - "CLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); - } - - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("x",rs.getString(1)); - assertEquals("x",rs.getString("foo")); - assertFalse(rs.next()); - } - - @Test - public void testSelectCF() throws Exception { - testSelectCF(false); - } - - @Test - public void testSelectCFWithLocalIndex() throws Exception { - testSelectCF(true); - } - - private void testSelectCF(boolean localIndex) throws Exception { - String query; - ResultSet rs; - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - conn.createStatement().execute("CREATE TABLE " + DATA_TABLE_FULL_NAME + " (k VARCHAR NOT NULL PRIMARY KEY, a.v1 VARCHAR, a.v2 VARCHAR, b.v1 VARCHAR) "); - query = "SELECT * FROM " + DATA_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery(query); - assertFalse(rs.next()); - if(localIndex) { - conn.createStatement().execute("CREATE LOCAL INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME + " (v2 DESC) INCLUDE (a.v1)"); - } else { - conn.createStatement().execute("CREATE INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME + " (v2 DESC) INCLUDE (a.v1)"); - } - query = "SELECT * FROM " + INDEX_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery(query); - assertFalse(rs.next()); - - PreparedStatement stmt = conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME + " VALUES(?,?,?,?)"); - stmt.setString(1,"a"); - stmt.setString(2, "x"); - stmt.setString(3, "1"); - stmt.setString(4, "A"); - stmt.execute(); - stmt.setString(1,"b"); - stmt.setString(2, "y"); - stmt.setString(3, "2"); - stmt.setString(4, "B"); - stmt.execute(); - conn.commit(); - - query = "SELECT * FROM " + DATA_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery("EXPLAIN " + query); - assertEquals("CLIENT PARALLEL 1-WAY FULL SCAN OVER " + DATA_TABLE_FULL_NAME, QueryUtil.getExplainPlan(rs)); - - query = "SELECT a.* FROM " + DATA_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery("EXPLAIN " + query); - if(localIndex) { - assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER _LOCAL_IDX_" + DATA_TABLE_FULL_NAME+" [-32768]\nCLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); - } else { - assertEquals("CLIENT PARALLEL 1-WAY FULL SCAN OVER " + INDEX_TABLE_FULL_NAME, QueryUtil.getExplainPlan(rs)); - } - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("y",rs.getString(1)); - assertEquals("2",rs.getString(2)); - assertEquals("y",rs.getString("v1")); - assertEquals("2",rs.getString("v2")); - assertTrue(rs.next()); - assertEquals("x",rs.getString(1)); - assertEquals("1",rs.getString(2)); - assertEquals("x",rs.getString("v1")); - assertEquals("1",rs.getString("v2")); - assertFalse(rs.next()); - } - - @Test - public void testCoveredColumns() throws Exception { - testCoveredColumns(false); - } - - @Test - public void testCoveredColumnsWithLocalIndex() throws Exception { - testCoveredColumns(true); - } - - private void testCoveredColumns(boolean localIndex) throws Exception { - String query; - ResultSet rs; - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - conn.createStatement().execute("CREATE TABLE " + DATA_TABLE_FULL_NAME + " (k VARCHAR NOT NULL PRIMARY KEY, v1 VARCHAR, v2 VARCHAR)"); - query = "SELECT * FROM " + DATA_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery(query); - assertFalse(rs.next()); - - if(localIndex) { - conn.createStatement().execute("CREATE LOCAL INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME + " (v1) INCLUDE (v2)"); - } else { - conn.createStatement().execute("CREATE INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME + " (v1) INCLUDE (v2)"); - } - query = "SELECT * FROM " + INDEX_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery(query); - assertFalse(rs.next()); - - PreparedStatement stmt = conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME + " VALUES(?,?,?)"); - stmt.setString(1,"a"); - stmt.setString(2, "x"); - stmt.setString(3, "1"); - stmt.execute(); - conn.commit(); - - query = "SELECT * FROM " + INDEX_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("x",rs.getString(1)); - assertEquals("a",rs.getString(2)); - assertEquals("1",rs.getString(3)); - assertFalse(rs.next()); - - stmt = conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME + "(k,v2) VALUES(?,?)"); - stmt.setString(1,"a"); - stmt.setString(2, null); - stmt.execute(); - conn.commit(); - - query = "SELECT * FROM " + INDEX_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("x",rs.getString(1)); - assertEquals("a",rs.getString(2)); - assertNull(rs.getString(3)); - assertFalse(rs.next()); - - query = "SELECT * FROM " + DATA_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery("EXPLAIN " + query); - if(localIndex) { - assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER _LOCAL_IDX_" + DATA_TABLE_FULL_NAME+" [-32768]\nCLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); - } else { - assertEquals("CLIENT PARALLEL 1-WAY FULL SCAN OVER " + INDEX_TABLE_FULL_NAME, QueryUtil.getExplainPlan(rs)); - } - - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("a",rs.getString(1)); - assertEquals("x",rs.getString(2)); - assertNull(rs.getString(3)); - assertFalse(rs.next()); - - stmt = conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME + "(k,v2) VALUES(?,?)"); - stmt.setString(1,"a"); - stmt.setString(2,"3"); - stmt.execute(); - conn.commit(); - - query = "SELECT * FROM " + DATA_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery("EXPLAIN " + query); - if(localIndex) { - assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER _LOCAL_IDX_" + DATA_TABLE_FULL_NAME + " [-32768]\nCLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); - } else { - assertEquals("CLIENT PARALLEL 1-WAY FULL SCAN OVER " + INDEX_TABLE_FULL_NAME, QueryUtil.getExplainPlan(rs)); - } - - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("a",rs.getString(1)); - assertEquals("x",rs.getString(2)); - assertEquals("3",rs.getString(3)); - assertFalse(rs.next()); - - stmt = conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME + "(k,v2) VALUES(?,?)"); - stmt.setString(1,"a"); - stmt.setString(2,"4"); - stmt.execute(); - conn.commit(); - - query = "SELECT * FROM " + DATA_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery("EXPLAIN " + query); - if(localIndex) { - assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER _LOCAL_IDX_" + DATA_TABLE_FULL_NAME+" [-32768]\nCLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); - } else { - assertEquals("CLIENT PARALLEL 1-WAY FULL SCAN OVER " + INDEX_TABLE_FULL_NAME, QueryUtil.getExplainPlan(rs)); - } - - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("a",rs.getString(1)); - assertEquals("x",rs.getString(2)); - assertEquals("4",rs.getString(3)); - assertFalse(rs.next()); - } - - @Test - public void testCompoundIndexKey() throws Exception { - testCompoundIndexKey(false); - } - - @Test - public void testCompoundIndexKeyWithLocalIndex() throws Exception { - testCompoundIndexKey(true); - } - - private void testCompoundIndexKey(boolean localIndex) throws Exception { - String query; - ResultSet rs; - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - - // make sure that the tables are empty, but reachable - conn.createStatement().execute("CREATE TABLE " + DATA_TABLE_FULL_NAME + " (k VARCHAR NOT NULL PRIMARY KEY, v1 VARCHAR, v2 VARCHAR)"); - query = "SELECT * FROM " + DATA_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery(query); - assertFalse(rs.next()); - if(localIndex) { - conn.createStatement().execute("CREATE LOCAL INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME + " (v1, v2)"); - } else { - conn.createStatement().execute("CREATE INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME + " (v1, v2)"); - } - query = "SELECT * FROM " + INDEX_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery(query); - assertFalse(rs.next()); - - // load some data into the table - PreparedStatement stmt = conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME + " VALUES(?,?,?)"); - stmt.setString(1,"a"); - stmt.setString(2, "x"); - stmt.setString(3, "1"); - stmt.execute(); - conn.commit(); - - query = "SELECT * FROM " + INDEX_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("x",rs.getString(1)); - assertEquals("1",rs.getString(2)); - assertEquals("a",rs.getString(3)); - assertFalse(rs.next()); - - stmt = conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME + " VALUES(?,?,?)"); - stmt.setString(1,"a"); - stmt.setString(2, "y"); - stmt.setString(3, null); - stmt.execute(); - conn.commit(); - - query = "SELECT * FROM " + INDEX_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("y",rs.getString(1)); - assertNull(rs.getString(2)); - assertEquals("a",rs.getString(3)); - assertFalse(rs.next()); - - query = "SELECT * FROM " + DATA_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery("EXPLAIN " + query); - if (localIndex) { - assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER _LOCAL_IDX_" + DATA_TABLE_FULL_NAME+" [-32768]\nCLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); - } else { - assertEquals("CLIENT PARALLEL 1-WAY FULL SCAN OVER " + INDEX_TABLE_FULL_NAME, QueryUtil.getExplainPlan(rs)); - } - //make sure the data table looks like what we expect - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("a",rs.getString(1)); - assertEquals("y",rs.getString(2)); - assertNull(rs.getString(3)); - assertFalse(rs.next()); - - // Upsert new row with null leading index column - stmt.setString(1,"b"); - stmt.setString(2, null); - stmt.setString(3, "3"); - stmt.execute(); - conn.commit(); - - query = "SELECT * FROM " + INDEX_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals(null,rs.getString(1)); - assertEquals("3",rs.getString(2)); - assertEquals("b",rs.getString(3)); - assertTrue(rs.next()); - assertEquals("y",rs.getString(1)); - assertNull(rs.getString(2)); - assertEquals("a",rs.getString(3)); - assertFalse(rs.next()); - - // Update row with null leading index column to have a value - stmt = conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME + " VALUES(?,?)"); - stmt.setString(1,"b"); - stmt.setString(2, "z"); - stmt.execute(); - conn.commit(); - - query = "SELECT * FROM " + INDEX_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("y",rs.getString(1)); - assertNull(rs.getString(2)); - assertEquals("a",rs.getString(3)); - assertTrue(rs.next()); - assertEquals("z",rs.getString(1)); - assertEquals("3",rs.getString(2)); - assertEquals("b",rs.getString(3)); - assertFalse(rs.next()); - - } - - @Test - public void testMultipleUpdatesToSingleRow() throws Exception { - testMultipleUpdatesToSingleRow(false); - } - - @Test - public void testMultipleUpdatesToSingleRowWithLocalIndex() throws Exception { - testMultipleUpdatesToSingleRow(true); - } - - /** - * There was a case where if there were multiple updates to a single row in the same batch, the - * index wouldn't be updated correctly as each element of the batch was evaluated with the state - * previous to the batch, rather than with the rest of the batch. This meant you could do a put - * and a delete on a row in the same batch and the index result would contain the current + put - * and current + delete, but not current + put + delete. - * @throws Exception on failure - */ - private void testMultipleUpdatesToSingleRow(boolean localIndex) throws Exception { - String query; - ResultSet rs; - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - - // make sure that the tables are empty, but reachable - conn.createStatement().execute( - "CREATE TABLE " + DATA_TABLE_FULL_NAME - + " (k VARCHAR NOT NULL PRIMARY KEY, v1 VARCHAR, v2 VARCHAR)"); - query = "SELECT * FROM " + DATA_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery(query); - assertFalse(rs.next()); - - if(localIndex) { - conn.createStatement().execute( - "CREATE LOCAL INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME + " (v1, v2)"); - } else { - conn.createStatement().execute( - "CREATE INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME + " (v1, v2)"); - } - query = "SELECT * FROM " + INDEX_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery(query); - assertFalse(rs.next()); - - // load some data into the table - PreparedStatement stmt = - conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME + " VALUES(?,?,?)"); - stmt.setString(1, "a"); - stmt.setString(2, "x"); - stmt.setString(3, "1"); - stmt.execute(); - conn.commit(); - - // make sure the index is working as expected - query = "SELECT * FROM " + INDEX_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("x", rs.getString(1)); - assertEquals("1", rs.getString(2)); - assertEquals("a", rs.getString(3)); - assertFalse(rs.next()); - - // do multiple updates to the same row, in the same batch - stmt = conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME + "(k, v1) VALUES(?,?)"); - stmt.setString(1, "a"); - stmt.setString(2, "y"); - stmt.execute(); - stmt = conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME + "(k,v2) VALUES(?,?)"); - stmt.setString(1, "a"); - stmt.setString(2, null); - stmt.execute(); - conn.commit(); - - query = "SELECT * FROM " + INDEX_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("y", rs.getString(1)); - assertNull(rs.getString(2)); - assertEquals("a", rs.getString(3)); - assertFalse(rs.next()); - - query = "SELECT * FROM " + DATA_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery("EXPLAIN " + query); - if(localIndex) { - assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER _LOCAL_IDX_" + DATA_TABLE_FULL_NAME+" [-32768]\nCLIENT MERGE SORT", - QueryUtil.getExplainPlan(rs)); - } else { - assertEquals("CLIENT PARALLEL 1-WAY FULL SCAN OVER " + INDEX_TABLE_FULL_NAME, - QueryUtil.getExplainPlan(rs)); - } - - // check that the data table matches as expected - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("a", rs.getString(1)); - assertEquals("y", rs.getString(2)); - assertNull(rs.getString(3)); - assertFalse(rs.next()); - } - - @Test - public void testUpsertAfterIndexDrop() throws Exception { - String query; - ResultSet rs; - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - - // make sure that the tables are empty, but reachable - conn.createStatement().execute( - "CREATE TABLE " + DATA_TABLE_FULL_NAME - + " (k VARCHAR NOT NULL PRIMARY KEY, v1 VARCHAR, v2 VARCHAR)"); - query = "SELECT * FROM " + DATA_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery(query); - assertFalse(rs.next()); - - conn.createStatement().execute( - "CREATE INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME + " (v1, v2)"); - query = "SELECT * FROM " + INDEX_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery(query); - assertFalse(rs.next()); - - // load some data into the table - PreparedStatement stmt = - conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME + " VALUES(?,?,?)"); - stmt.setString(1, "a"); - stmt.setString(2, "x"); - stmt.setString(3, "1"); - stmt.execute(); - conn.commit(); - - // make sure the index is working as expected - query = "SELECT * FROM " + INDEX_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("x", rs.getString(1)); - assertEquals("1", rs.getString(2)); - assertEquals("a", rs.getString(3)); - assertFalse(rs.next()); - - String ddl = "DROP INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME; - stmt = conn.prepareStatement(ddl); - stmt.execute(); - - stmt = conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME + "(k, v1) VALUES(?,?)"); - stmt.setString(1, "a"); - stmt.setString(2, "y"); - stmt.execute(); - conn.commit(); - - query = "SELECT * FROM " + DATA_TABLE_FULL_NAME; - - // check that the data table matches as expected - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("a", rs.getString(1)); - assertEquals("y", rs.getString(2)); - assertFalse(rs.next()); - } - - @Test - public void testMultipleUpdatesAcrossRegions() throws Exception { - testMultipleUpdatesAcrossRegions(false); - } - - @Test - public void testMultipleUpdatesAcrossRegionsWithLocalIndex() throws Exception { - testMultipleUpdatesAcrossRegions(true); - } - - private void testMultipleUpdatesAcrossRegions(boolean localIndex) throws Exception { - String query; - ResultSet rs; - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - - // make sure that the tables are empty, but reachable - conn.createStatement().execute( - "CREATE TABLE " + DATA_TABLE_FULL_NAME - + " (k VARCHAR NOT NULL PRIMARY KEY, v1 VARCHAR, v2 VARCHAR) " + HTableDescriptor.MAX_FILESIZE + "=1, " + HTableDescriptor.MEMSTORE_FLUSHSIZE + "=1 " + - "SPLIT ON ('b')"); - query = "SELECT * FROM " + DATA_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery(query); - assertFalse(rs.next()); - - if(localIndex) { - conn.createStatement().execute( - "CREATE LOCAL INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME + " (v1, v2)"); - } else { - conn.createStatement().execute( - "CREATE INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME + " (v1, v2)"); - } - query = "SELECT * FROM " + INDEX_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery(query); - assertFalse(rs.next()); - - // load some data into the table - PreparedStatement stmt = - conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME + " VALUES(?,?,?)"); - stmt.setString(1, "a"); - stmt.setString(2, "x"); - stmt.setString(3, "1"); - stmt.execute(); - stmt.setString(1, "b"); - stmt.setString(2, "y"); - stmt.setString(3, "2"); - stmt.execute(); - stmt.setString(1, "c"); - stmt.setString(2, "z"); - stmt.setString(3, "3"); - stmt.execute(); - conn.commit(); - - // make sure the index is working as expected - query = "SELECT * FROM " + INDEX_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("x", rs.getString(1)); - assertEquals("1", rs.getString(2)); - assertEquals("a", rs.getString(3)); - assertTrue(rs.next()); - assertEquals("y", rs.getString(1)); - assertEquals("2", rs.getString(2)); - assertEquals("b", rs.getString(3)); - assertTrue(rs.next()); - assertEquals("z", rs.getString(1)); - assertEquals("3", rs.getString(2)); - assertEquals("c", rs.getString(3)); - assertFalse(rs.next()); - - query = "SELECT * FROM " + DATA_TABLE_FULL_NAME; - rs = conn.createStatement().executeQuery("EXPLAIN " + query); - if (localIndex) { - assertEquals("CLIENT PARALLEL 2-WAY RANGE SCAN OVER _LOCAL_IDX_" + DATA_TABLE_FULL_NAME+" [-32768]\nCLIENT MERGE SORT", - QueryUtil.getExplainPlan(rs)); - } else { - assertEquals("CLIENT PARALLEL 1-WAY FULL SCAN OVER " + INDEX_TABLE_FULL_NAME, - QueryUtil.getExplainPlan(rs)); - } - - // check that the data table matches as expected - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("a", rs.getString(1)); - assertEquals("x", rs.getString(2)); - assertEquals("1", rs.getString(3)); - assertTrue(rs.next()); - assertEquals("b", rs.getString(1)); - assertEquals("y", rs.getString(2)); - assertEquals("2", rs.getString(3)); - assertTrue(rs.next()); - assertEquals("c", rs.getString(1)); - assertEquals("z", rs.getString(2)); - assertEquals("3", rs.getString(3)); - assertFalse(rs.next()); - } - - @Test - public void testIndexWithCaseSensitiveCols() throws Exception { - testIndexWithCaseSensitiveCols(false); - } - - @Test - public void testLocalIndexWithCaseSensitiveCols() throws Exception { - testIndexWithCaseSensitiveCols(true); - } - - private void testIndexWithCaseSensitiveCols(boolean localIndex) throws Exception { - String query; - ResultSet rs; - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - try { - conn.createStatement().execute("CREATE TABLE cs (k VARCHAR NOT NULL PRIMARY KEY, \"V1\" VARCHAR, \"v2\" VARCHAR)"); - query = "SELECT * FROM cs"; - rs = conn.createStatement().executeQuery(query); - assertFalse(rs.next()); - if (localIndex) { - conn.createStatement().execute("CREATE LOCAL INDEX ics ON cs (\"v2\") INCLUDE (\"V1\")"); - } else { - conn.createStatement().execute("CREATE INDEX ics ON cs (\"v2\") INCLUDE (\"V1\")"); - } - query = "SELECT * FROM ics"; - rs = conn.createStatement().executeQuery(query); - assertFalse(rs.next()); - - PreparedStatement stmt = conn.prepareStatement("UPSERT INTO cs VALUES(?,?,?)"); - stmt.setString(1,"a"); - stmt.setString(2, "x"); - stmt.setString(3, "1"); - stmt.execute(); - stmt.setString(1,"b"); - stmt.setString(2, "y"); - stmt.setString(3, "2"); - stmt.execute(); - conn.commit(); - - query = "SELECT * FROM cs WHERE \"v2\" = '1'"; - rs = conn.createStatement().executeQuery("EXPLAIN " + query); - if(localIndex){ - assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER _LOCAL_IDX_CS [-32768,'1']\nCLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); - } else { - assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER ICS ['1']", QueryUtil.getExplainPlan(rs)); - } - - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("a",rs.getString(1)); - assertEquals("x",rs.getString(2)); - assertEquals("1",rs.getString(3)); - assertEquals("a",rs.getString("k")); - assertEquals("x",rs.getString("V1")); - assertEquals("1",rs.getString("v2")); - assertFalse(rs.next()); - - query = "SELECT \"V1\", \"V1\" as foo1, \"v2\" as foo, \"v2\" as \"Foo1\", \"v2\" FROM cs ORDER BY foo"; - rs = conn.createStatement().executeQuery("EXPLAIN " + query); - if(localIndex){ - assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER _LOCAL_IDX_CS [-32768]\nCLIENT MERGE SORT", - QueryUtil.getExplainPlan(rs)); - } else { - assertEquals("CLIENT PARALLEL 1-WAY FULL SCAN OVER ICS", QueryUtil.getExplainPlan(rs)); - } - - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("x",rs.getString(1)); - assertEquals("x",rs.getString("V1")); - assertEquals("x",rs.getString(2)); - assertEquals("x",rs.getString("foo1")); - assertEquals("1",rs.getString(3)); - assertEquals("1",rs.getString("Foo")); - assertEquals("1",rs.getString(4)); - assertEquals("1",rs.getString("Foo1")); - assertEquals("1",rs.getString(5)); - assertEquals("1",rs.getString("v2")); - assertTrue(rs.next()); - assertEquals("y",rs.getString(1)); - assertEquals("y",rs.getString("V1")); - assertEquals("y",rs.getString(2)); - assertEquals("y",rs.getString("foo1")); - assertEquals("2",rs.getString(3)); - assertEquals("2",rs.getString("Foo")); - assertEquals("2",rs.getString(4)); - assertEquals("2",rs.getString("Foo1")); - assertEquals("2",rs.getString(5)); - assertEquals("2",rs.getString("v2")); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testInFilterOnIndexedTable() throws Exception { - testInFilterOnIndexedTable(false); - } - - @Test - public void testInFilterOnLocalIndexedTable() throws Exception { - testInFilterOnIndexedTable(true); - } - - private void testInFilterOnIndexedTable(boolean localIndex) throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - try { - String ddl = "CREATE TABLE TEST (PK1 CHAR(2) NOT NULL PRIMARY KEY, CF1.COL1 BIGINT)"; - conn.createStatement().execute(ddl); - if(localIndex) { - ddl = "CREATE LOCAL INDEX IDX1 ON TEST (COL1)"; - } else { - ddl = "CREATE INDEX IDX1 ON TEST (COL1)"; - } - conn.createStatement().execute(ddl); - - String query = "SELECT COUNT(COL1) FROM TEST WHERE COL1 IN (1,25,50,75,100)"; - ResultSet rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testIndexWithDecimalCol() throws Exception { - testIndexWithDecimalCol(false); - } - - @Test - public void testLocalIndexWithDecimalCol() throws Exception { - testIndexWithDecimalCol(true); - } - - private void testIndexWithDecimalCol(boolean localIndex) throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - try { - Date date = new Date(System.currentTimeMillis()); - - createTestTable(); - populateTestTable(date); - String ddl = null; - if (localIndex) { - ddl = "CREATE LOCAL INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME + " (decimal_pk) INCLUDE (decimal_col1, decimal_col2)"; - } else { - ddl = "CREATE INDEX " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME + " (decimal_pk) INCLUDE (decimal_col1, decimal_col2)"; - } - PreparedStatement stmt = conn.prepareStatement(ddl); - stmt.execute(); - - String query = "SELECT decimal_pk, decimal_col1, decimal_col2 from " + DATA_TABLE_FULL_NAME ; - ResultSet rs = conn.createStatement().executeQuery("EXPLAIN " + query); - if(localIndex) { - assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER _LOCAL_IDX_" + DATA_TABLE_FULL_NAME+" [-32768]\nCLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); - } else { - assertEquals("CLIENT PARALLEL 1-WAY FULL SCAN OVER " + INDEX_TABLE_FULL_NAME, QueryUtil.getExplainPlan(rs)); - } - - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals(new BigDecimal("1.1"), rs.getBigDecimal(1)); - assertEquals(new BigDecimal("2.1"), rs.getBigDecimal(2)); - assertEquals(new BigDecimal("3.1"), rs.getBigDecimal(3)); - assertTrue(rs.next()); - assertEquals(new BigDecimal("2.2"), rs.getBigDecimal(1)); - assertEquals(new BigDecimal("3.2"), rs.getBigDecimal(2)); - assertEquals(new BigDecimal("4.2"), rs.getBigDecimal(3)); - assertTrue(rs.next()); - assertEquals(new BigDecimal("3.3"), rs.getBigDecimal(1)); - assertEquals(new BigDecimal("4.3"), rs.getBigDecimal(2)); - assertEquals(new BigDecimal("5.3"), rs.getBigDecimal(3)); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testUpsertingNullForIndexedColumns() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - try { - Statement stmt = conn.createStatement(); - stmt.execute("CREATE TABLE DEMO(v1 VARCHAR PRIMARY KEY, v2 DOUBLE, v3 VARCHAR)"); - stmt.execute("CREATE INDEX DEMO_idx ON DEMO (v2) INCLUDE(v3)"); - - //create a row with value null for indexed column v2 - stmt.executeUpdate("upsert into DEMO values('cc1', null, 'abc')"); - conn.commit(); - - //assert values in index table - ResultSet rs = stmt.executeQuery("select * from DEMO_IDX"); - assertTrue(rs.next()); - assertEquals(0, Doubles.compare(0, rs.getDouble(1))); - assertEquals("cc1", rs.getString(2)); - assertEquals("abc", rs.getString(3)); - assertFalse(rs.next()); - - //assert values in data table - rs = stmt.executeQuery("select v1, v2, v3 from DEMO"); - assertTrue(rs.next()); - assertEquals("cc1", rs.getString(1)); - assertEquals(0, Doubles.compare(0, rs.getDouble(2))); - assertEquals("abc", rs.getString(3)); - assertFalse(rs.next()); - - //update the previously null value for indexed column v2 to a non-null value 1.23 - stmt.executeUpdate("upsert into DEMO values('cc1', 1.23, 'abc')"); - conn.commit(); - - //assert values in index table - rs = stmt.executeQuery("select * from DEMO_IDX"); - assertTrue(rs.next()); - assertEquals(0, Doubles.compare(1.23, rs.getDouble(1))); - assertEquals("cc1", rs.getString(2)); - assertEquals("abc", rs.getString(3)); - assertFalse(rs.next()); - - //assert values in data table - rs = stmt.executeQuery("select v1, v2, v3 from DEMO"); - assertTrue(rs.next()); - assertEquals("cc1", rs.getString(1)); - assertEquals(0, Doubles.compare(1.23, rs.getDouble(2))); - assertEquals("abc", rs.getString(3)); - assertFalse(rs.next()); - - //update the value for indexed column v2 back to null - stmt.executeUpdate("upsert into DEMO values('cc1', null, 'abc')"); - conn.commit(); - - //assert values in index table - rs = stmt.executeQuery("select * from DEMO_IDX"); - assertTrue(rs.next()); - assertEquals(0, Doubles.compare(0, rs.getDouble(1))); - assertEquals("cc1", rs.getString(2)); - assertEquals("abc", rs.getString(3)); - assertFalse(rs.next()); - - //assert values in data table - rs = stmt.executeQuery("select v1, v2, v3 from DEMO"); - assertTrue(rs.next()); - assertEquals("cc1", rs.getString(1)); - assertEquals(0, Doubles.compare(0, rs.getDouble(2))); - assertEquals("abc", rs.getString(3)); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testSkipScanFilterWhenTableHasMultipleColumnFamilies() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - try { - createTestTable(); - populateTestTable(); - String upsert = "UPSERT INTO " + DATA_TABLE_FULL_NAME - + " VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; - PreparedStatement stmt = conn.prepareStatement(upsert); - stmt.setString(1, "varchar4"); - stmt.setString(2, "char1"); - stmt.setInt(3, 1); - stmt.setLong(4, 1L); - stmt.setBigDecimal(5, new BigDecimal("1.1")); - stmt.setString(6, "varchar_a"); - stmt.setString(7, "chara"); - stmt.setInt(8, 2); - stmt.setLong(9, 2L); - stmt.setBigDecimal(10, new BigDecimal("2.1")); - stmt.setString(11, "varchar_b"); - stmt.setString(12, "charb"); - stmt.setInt(13, 3); - stmt.setLong(14, 3L); - stmt.setBigDecimal(15, new BigDecimal("3.1")); - stmt.setDate(16, null); - stmt.executeUpdate(); - - stmt.setString(1, "varchar5"); - stmt.setString(2, "char2"); - stmt.setInt(3, 2); - stmt.setLong(4, 2L); - stmt.setBigDecimal(5, new BigDecimal("2.2")); - stmt.setString(6, "varchar_a"); - stmt.setString(7, "chara"); - stmt.setInt(8, 3); - stmt.setLong(9, 3L); - stmt.setBigDecimal(10, new BigDecimal("3.2")); - stmt.setString(11, "varchar_b"); - stmt.setString(12, "charb"); - stmt.setInt(13, 4); - stmt.setLong(14, 4L); - stmt.setBigDecimal(15, new BigDecimal("4.2")); - stmt.setDate(16, null); - stmt.executeUpdate(); - - stmt.setString(1, "varchar6"); - stmt.setString(2, "char3"); - stmt.setInt(3, 3); - stmt.setLong(4, 3L); - stmt.setBigDecimal(5, new BigDecimal("3.3")); - stmt.setString(6, "varchar_a"); - stmt.setString(7, "chara"); - stmt.setInt(8, 4); - stmt.setLong(9, 4L); - stmt.setBigDecimal(10, new BigDecimal("4.3")); - stmt.setString(11, "varchar_b"); - stmt.setString(12, "charb"); - stmt.setInt(13, 5); - stmt.setLong(14, 5L); - stmt.setBigDecimal(15, new BigDecimal("5.3")); - stmt.setDate(16, null); - stmt.executeUpdate(); - conn.commit(); - String query = "SELECT char_col1, int_col1, long_col2 from " + DATA_TABLE_FULL_NAME + " where varchar_pk in ('varchar3','varchar6')"; - ResultSet rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("chara", rs.getString(1)); - assertEquals(4, rs.getInt(2)); - assertEquals(5L, rs.getLong(3)); - assertTrue(rs.next()); - assertEquals("chara", rs.getString(1)); - assertEquals(4, rs.getInt(2)); - assertEquals(5L, rs.getLong(3)); - assertFalse(rs.next()); - - } finally { - conn.close(); - } - } -} http://git-wip-us.apache.org/repos/asf/phoenix/blob/8f289e63/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/SaltedIndexIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/SaltedIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/SaltedIndexIT.java index 112e4d3..cfde92a 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/SaltedIndexIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/SaltedIndexIT.java @@ -37,13 +37,14 @@ import org.apache.phoenix.schema.PTableKey; import org.apache.phoenix.util.PropertiesUtil; import org.apache.phoenix.util.QueryUtil; import org.apache.phoenix.util.ReadOnlyProps; +import org.apache.phoenix.util.TestUtil; import org.junit.BeforeClass; import org.junit.Test; import com.google.common.collect.Maps; -public class SaltedIndexIT extends BaseIndexIT { +public class SaltedIndexIT extends BaseHBaseManagedTimeIT { private static final int TABLE_SPLITS = 3; private static final int INDEX_SPLITS = 4; @@ -63,11 +64,11 @@ public class SaltedIndexIT extends BaseIndexIT { Connection conn = DriverManager.getConnection(getUrl(), PropertiesUtil.deepCopy(TEST_PROPERTIES)); try { conn.setAutoCommit(true); - conn.createStatement().execute("DELETE FROM " + DATA_TABLE_FULL_NAME); - conn.createStatement().execute("ALTER TABLE " + DATA_TABLE_FULL_NAME + " SET IMMUTABLE_ROWS=true"); - conn.createStatement().executeQuery("SELECT COUNT(*) FROM " + DATA_TABLE_FULL_NAME).next(); + conn.createStatement().execute("DELETE FROM " + TestUtil.DEFAULT_DATA_TABLE_FULL_NAME); + conn.createStatement().execute("ALTER TABLE " + TestUtil.DEFAULT_DATA_TABLE_FULL_NAME + " SET IMMUTABLE_ROWS=true"); + conn.createStatement().executeQuery("SELECT COUNT(*) FROM " + TestUtil.DEFAULT_DATA_TABLE_FULL_NAME).next(); PhoenixConnection pconn = conn.unwrap(PhoenixConnection.class); - assertTrue(pconn.getMetaDataCache().getTable(new PTableKey(pconn.getTenantId(), DATA_TABLE_FULL_NAME)).isImmutableRows()); + assertTrue(pconn.getMetaDataCache().getTable(new PTableKey(pconn.getTenantId(), TestUtil.DEFAULT_DATA_TABLE_FULL_NAME)).isImmutableRows()); } finally { conn.close(); } @@ -101,17 +102,17 @@ public class SaltedIndexIT extends BaseIndexIT { Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); Connection conn = DriverManager.getConnection(getUrl(), props); conn.setAutoCommit(false); - conn.createStatement().execute("CREATE TABLE IF NOT EXISTS " + DATA_TABLE_FULL_NAME + " (k VARCHAR NOT NULL PRIMARY KEY, v VARCHAR) " + (tableSaltBuckets == null ? "" : " SALT_BUCKETS=" + tableSaltBuckets)); - query = "SELECT * FROM " + DATA_TABLE_FULL_NAME; + conn.createStatement().execute("CREATE TABLE IF NOT EXISTS " + TestUtil.DEFAULT_DATA_TABLE_FULL_NAME + " (k VARCHAR NOT NULL PRIMARY KEY, v VARCHAR) " + (tableSaltBuckets == null ? "" : " SALT_BUCKETS=" + tableSaltBuckets)); + query = "SELECT * FROM " + TestUtil.DEFAULT_DATA_TABLE_FULL_NAME; rs = conn.createStatement().executeQuery(query); assertFalse(rs.next()); - conn.createStatement().execute("CREATE INDEX IF NOT EXISTS " + INDEX_TABLE_NAME + " ON " + DATA_TABLE_FULL_NAME + " (v DESC)" + (indexSaltBuckets == null ? "" : " SALT_BUCKETS=" + indexSaltBuckets)); - query = "SELECT * FROM " + INDEX_TABLE_FULL_NAME; + conn.createStatement().execute("CREATE INDEX IF NOT EXISTS " + TestUtil.DEFAULT_INDEX_TABLE_NAME + " ON " + TestUtil.DEFAULT_DATA_TABLE_FULL_NAME + " (v DESC)" + (indexSaltBuckets == null ? "" : " SALT_BUCKETS=" + indexSaltBuckets)); + query = "SELECT * FROM " + TestUtil.DEFAULT_INDEX_TABLE_FULL_NAME; rs = conn.createStatement().executeQuery(query); assertFalse(rs.next()); - PreparedStatement stmt = conn.prepareStatement("UPSERT INTO " + DATA_TABLE_FULL_NAME + " VALUES(?,?)"); + PreparedStatement stmt = conn.prepareStatement("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_FULL_NAME + " VALUES(?,?)"); stmt.setString(1,"a"); stmt.setString(2, "x"); stmt.execute(); @@ -120,7 +121,7 @@ public class SaltedIndexIT extends BaseIndexIT { stmt.execute(); conn.commit(); - query = "SELECT * FROM " + INDEX_TABLE_FULL_NAME; + query = "SELECT * FROM " + TestUtil.DEFAULT_INDEX_TABLE_FULL_NAME; rs = conn.createStatement().executeQuery(query); assertTrue(rs.next()); assertEquals("y",rs.getString(1)); @@ -130,7 +131,7 @@ public class SaltedIndexIT extends BaseIndexIT { assertEquals("a",rs.getString(2)); assertFalse(rs.next()); - query = "SELECT k,v FROM " + DATA_TABLE_FULL_NAME + " WHERE v = 'y'"; + query = "SELECT k,v FROM " + TestUtil.DEFAULT_DATA_TABLE_FULL_NAME + " WHERE v = 'y'"; rs = conn.createStatement().executeQuery(query); assertTrue(rs.next()); assertEquals("b",rs.getString(1)); @@ -140,15 +141,15 @@ public class SaltedIndexIT extends BaseIndexIT { String expectedPlan; rs = conn.createStatement().executeQuery("EXPLAIN " + query); expectedPlan = indexSaltBuckets == null ? - "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + INDEX_TABLE_FULL_NAME + " [~'y']" : - ("CLIENT PARALLEL 4-WAY RANGE SCAN OVER " + INDEX_TABLE_FULL_NAME + " [0,~'y']\n" + + "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + TestUtil.DEFAULT_INDEX_TABLE_FULL_NAME + " [~'y']" : + ("CLIENT PARALLEL 4-WAY RANGE SCAN OVER " + TestUtil.DEFAULT_INDEX_TABLE_FULL_NAME + " [0,~'y']\n" + "CLIENT MERGE SORT"); assertEquals(expectedPlan,QueryUtil.getExplainPlan(rs)); // Will use index, so rows returned in DESC order. // This is not a bug, though, because we can // return in any order. - query = "SELECT k,v FROM " + DATA_TABLE_FULL_NAME + " WHERE v >= 'x'"; + query = "SELECT k,v FROM " + TestUtil.DEFAULT_DATA_TABLE_FULL_NAME + " WHERE v >= 'x'"; rs = conn.createStatement().executeQuery(query); assertTrue(rs.next()); assertEquals("b",rs.getString(1)); @@ -159,13 +160,13 @@ public class SaltedIndexIT extends BaseIndexIT { assertFalse(rs.next()); rs = conn.createStatement().executeQuery("EXPLAIN " + query); expectedPlan = indexSaltBuckets == null ? - "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + INDEX_TABLE_FULL_NAME + " [*] - [~'x']" : - ("CLIENT PARALLEL 4-WAY RANGE SCAN OVER " + INDEX_TABLE_FULL_NAME + " [0,*] - [0,~'x']\n" + + "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + TestUtil.DEFAULT_INDEX_TABLE_FULL_NAME + " [*] - [~'x']" : + ("CLIENT PARALLEL 4-WAY RANGE SCAN OVER " + TestUtil.DEFAULT_INDEX_TABLE_FULL_NAME + " [0,*] - [0,~'x']\n" + "CLIENT MERGE SORT"); assertEquals(expectedPlan,QueryUtil.getExplainPlan(rs)); // Use data table, since point lookup trumps order by - query = "SELECT k,v FROM " + DATA_TABLE_FULL_NAME + " WHERE k = 'a' ORDER BY v"; + query = "SELECT k,v FROM " + TestUtil.DEFAULT_DATA_TABLE_FULL_NAME + " WHERE k = 'a' ORDER BY v"; rs = conn.createStatement().executeQuery(query); assertTrue(rs.next()); assertEquals("a",rs.getString(1)); @@ -173,10 +174,10 @@ public class SaltedIndexIT extends BaseIndexIT { assertFalse(rs.next()); rs = conn.createStatement().executeQuery("EXPLAIN " + query); expectedPlan = tableSaltBuckets == null ? - "CLIENT PARALLEL 1-WAY POINT LOOKUP ON 1 KEY OVER " + DATA_TABLE_FULL_NAME + "\n" + + "CLIENT PARALLEL 1-WAY POINT LOOKUP ON 1 KEY OVER " + TestUtil.DEFAULT_DATA_TABLE_FULL_NAME + "\n" + " SERVER SORTED BY [V]\n" + "CLIENT MERGE SORT" : - "CLIENT PARALLEL 1-WAY POINT LOOKUP ON 1 KEY OVER " + DATA_TABLE_FULL_NAME + "\n" + + "CLIENT PARALLEL 1-WAY POINT LOOKUP ON 1 KEY OVER " + TestUtil.DEFAULT_DATA_TABLE_FULL_NAME + "\n" + " SERVER SORTED BY [V]\n" + "CLIENT MERGE SORT"; String explainPlan2 = QueryUtil.getExplainPlan(rs); @@ -185,7 +186,7 @@ public class SaltedIndexIT extends BaseIndexIT { // Will use data table now, since there's a LIMIT clause and // we're able to optimize out the ORDER BY, unless the data // table is salted. - query = "SELECT k,v FROM " + DATA_TABLE_FULL_NAME + " WHERE v >= 'x' ORDER BY k LIMIT 2"; + query = "SELECT k,v FROM " + TestUtil.DEFAULT_DATA_TABLE_FULL_NAME + " WHERE v >= 'x' ORDER BY k LIMIT 2"; rs = conn.createStatement().executeQuery(query); assertTrue(rs.next()); assertEquals("a",rs.getString(1)); @@ -196,11 +197,11 @@ public class SaltedIndexIT extends BaseIndexIT { assertFalse(rs.next()); rs = conn.createStatement().executeQuery("EXPLAIN " + query); expectedPlan = tableSaltBuckets == null ? - "CLIENT PARALLEL 1-WAY FULL SCAN OVER " + DATA_TABLE_FULL_NAME + "\n" + + "CLIENT PARALLEL 1-WAY FULL SCAN OVER " + TestUtil.DEFAULT_DATA_TABLE_FULL_NAME + "\n" + " SERVER FILTER BY V >= 'x'\n" + " SERVER 2 ROW LIMIT\n" + "CLIENT 2 ROW LIMIT" : - "CLIENT PARALLEL 3-WAY FULL SCAN OVER " + DATA_TABLE_FULL_NAME + "\n" + + "CLIENT PARALLEL 3-WAY FULL SCAN OVER " + TestUtil.DEFAULT_DATA_TABLE_FULL_NAME + "\n" + " SERVER FILTER BY V >= 'x'\n" + " SERVER 2 ROW LIMIT\n" + "CLIENT MERGE SORT\n" + http://git-wip-us.apache.org/repos/asf/phoenix/blob/8f289e63/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java index da6eb16..fe8ea77 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java @@ -27,6 +27,8 @@ import java.util.Map; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.HBaseAdmin; +import org.apache.phoenix.end2end.BaseHBaseManagedTimeIT; +import org.apache.phoenix.end2end.Shadower; import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData; import org.apache.phoenix.query.QueryServices; import org.apache.phoenix.util.MetaDataUtil; @@ -38,11 +40,12 @@ import org.junit.Test; import com.google.common.collect.Maps; -public class ViewIndexIT extends BaseIndexIT { +public class ViewIndexIT extends BaseHBaseManagedTimeIT { private String VIEW_NAME = "MY_VIEW"; @BeforeClass + @Shadower(classBeingShadowed = BaseHBaseManagedTimeIT.class) public static void doSetup() throws Exception { Map<String,String> props = Maps.newHashMapWithExpectedSize(3); // Drop the HBase table metadata for this test to confirm that view index table dropped @@ -66,17 +69,17 @@ public class ViewIndexIT extends BaseIndexIT { @Test public void testDeleteViewIndexSequences() throws Exception { - createBaseTable(DATA_TABLE_NAME, null, null); + createBaseTable(TestUtil.DEFAULT_DATA_TABLE_NAME, null, null); Connection conn1 = DriverManager.getConnection(getUrl()); Connection conn2 = DriverManager.getConnection(getUrl()); - conn1.createStatement().execute("CREATE VIEW " + VIEW_NAME + " AS SELECT * FROM " + DATA_TABLE_NAME); - conn1.createStatement().execute("CREATE INDEX " + INDEX_TABLE_NAME + " ON " + VIEW_NAME + " (v1)"); - conn2.createStatement().executeQuery("SELECT * FROM " + DATA_TABLE_FULL_NAME).next(); + conn1.createStatement().execute("CREATE VIEW " + VIEW_NAME + " AS SELECT * FROM " + TestUtil.DEFAULT_DATA_TABLE_NAME); + conn1.createStatement().execute("CREATE INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + " ON " + VIEW_NAME + " (v1)"); + conn2.createStatement().executeQuery("SELECT * FROM " + TestUtil.DEFAULT_DATA_TABLE_FULL_NAME).next(); HBaseAdmin admin = driver.getConnectionQueryServices(getUrl(), TestUtil.TEST_PROPERTIES).getAdmin(); conn1.createStatement().execute("DROP VIEW " + VIEW_NAME); - conn1.createStatement().execute("DROP TABLE "+ DATA_TABLE_NAME); + conn1.createStatement().execute("DROP TABLE "+ TestUtil.DEFAULT_DATA_TABLE_NAME); admin = driver.getConnectionQueryServices(getUrl(), TestUtil.TEST_PROPERTIES).getAdmin(); - assertFalse("View index table should be deleted.", admin.tableExists(TableName.valueOf(MetaDataUtil.getViewIndexTableName(DATA_TABLE_NAME)))); + assertFalse("View index table should be deleted.", admin.tableExists(TableName.valueOf(MetaDataUtil.getViewIndexTableName(TestUtil.DEFAULT_DATA_TABLE_NAME)))); ResultSet rs = conn2.createStatement().executeQuery("SELECT " + PhoenixDatabaseMetaData.SEQUENCE_SCHEMA + "," + PhoenixDatabaseMetaData.SEQUENCE_NAME http://git-wip-us.apache.org/repos/asf/phoenix/blob/8f289e63/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/write/IndexWriterUtils.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/write/IndexWriterUtils.java b/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/write/IndexWriterUtils.java index db95970..b8b0079 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/write/IndexWriterUtils.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/write/IndexWriterUtils.java @@ -21,7 +21,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.CoprocessorEnvironment; - import org.apache.phoenix.hbase.index.table.CoprocessorHTableFactory; import org.apache.phoenix.hbase.index.table.HTableFactory; import org.apache.phoenix.hbase.index.util.IndexManagementUtil; http://git-wip-us.apache.org/repos/asf/phoenix/blob/8f289e63/phoenix-core/src/test/java/org/apache/phoenix/query/BaseTest.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/test/java/org/apache/phoenix/query/BaseTest.java b/phoenix-core/src/test/java/org/apache/phoenix/query/BaseTest.java index 449abd6..313fc46 100644 --- a/phoenix-core/src/test/java/org/apache/phoenix/query/BaseTest.java +++ b/phoenix-core/src/test/java/org/apache/phoenix/query/BaseTest.java @@ -131,6 +131,7 @@ import org.apache.phoenix.util.PropertiesUtil; import org.apache.phoenix.util.QueryUtil; import org.apache.phoenix.util.ReadOnlyProps; import org.apache.phoenix.util.SchemaUtil; +import org.apache.phoenix.util.TestUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -1389,4 +1390,102 @@ public abstract class BaseTest { public HBaseTestingUtility getUtility() { return utility; } + + protected static void createMultiCFTestTable(String tableName) throws SQLException { + String ddl = "create table if not exists " + tableName + "(" + + " varchar_pk VARCHAR NOT NULL, " + + " char_pk CHAR(5) NOT NULL, " + + " int_pk INTEGER NOT NULL, "+ + " long_pk BIGINT NOT NULL, " + + " decimal_pk DECIMAL(31, 10) NOT NULL, " + + " a.varchar_col1 VARCHAR, " + + " a.char_col1 CHAR(5), " + + " a.int_col1 INTEGER, " + + " a.long_col1 BIGINT, " + + " a.decimal_col1 DECIMAL(31, 10), " + + " b.varchar_col2 VARCHAR, " + + " b.char_col2 CHAR(5), " + + " b.int_col2 INTEGER, " + + " b.long_col2 BIGINT, " + + " b.decimal_col2 DECIMAL, " + + " b.date_col DATE " + + " CONSTRAINT pk PRIMARY KEY (varchar_pk, char_pk, int_pk, long_pk DESC, decimal_pk))"; + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + Connection conn = DriverManager.getConnection(getUrl(), props); + conn.createStatement().execute(ddl); + conn.close(); + } + + // Populate the test table with data. + protected static void populateMultiCFTestTable(String tableName) throws SQLException { + populateMultiCFTestTable(tableName, null); + } + + // Populate the test table with data. + protected static void populateMultiCFTestTable(String tableName, Date date) throws SQLException { + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + Connection conn = DriverManager.getConnection(getUrl(), props); + try { + String upsert = "UPSERT INTO " + tableName + + " VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + PreparedStatement stmt = conn.prepareStatement(upsert); + stmt.setString(1, "varchar1"); + stmt.setString(2, "char1"); + stmt.setInt(3, 1); + stmt.setLong(4, 1L); + stmt.setBigDecimal(5, new BigDecimal("1.1")); + stmt.setString(6, "varchar_a"); + stmt.setString(7, "chara"); + stmt.setInt(8, 2); + stmt.setLong(9, 2L); + stmt.setBigDecimal(10, new BigDecimal("2.1")); + stmt.setString(11, "varchar_b"); + stmt.setString(12, "charb"); + stmt.setInt(13, 3); + stmt.setLong(14, 3L); + stmt.setBigDecimal(15, new BigDecimal("3.1")); + stmt.setDate(16, date == null ? null : new Date(date.getTime() + TestUtil.MILLIS_IN_DAY)); + stmt.executeUpdate(); + + stmt.setString(1, "varchar2"); + stmt.setString(2, "char2"); + stmt.setInt(3, 2); + stmt.setLong(4, 2L); + stmt.setBigDecimal(5, new BigDecimal("2.2")); + stmt.setString(6, "varchar_a"); + stmt.setString(7, "chara"); + stmt.setInt(8, 3); + stmt.setLong(9, 3L); + stmt.setBigDecimal(10, new BigDecimal("3.2")); + stmt.setString(11, "varchar_b"); + stmt.setString(12, "charb"); + stmt.setInt(13, 4); + stmt.setLong(14, 4L); + stmt.setBigDecimal(15, new BigDecimal("4.2")); + stmt.setDate(16, date); + stmt.executeUpdate(); + + stmt.setString(1, "varchar3"); + stmt.setString(2, "char3"); + stmt.setInt(3, 3); + stmt.setLong(4, 3L); + stmt.setBigDecimal(5, new BigDecimal("3.3")); + stmt.setString(6, "varchar_a"); + stmt.setString(7, "chara"); + stmt.setInt(8, 4); + stmt.setLong(9, 4L); + stmt.setBigDecimal(10, new BigDecimal("4.3")); + stmt.setString(11, "varchar_b"); + stmt.setString(12, "charb"); + stmt.setInt(13, 5); + stmt.setLong(14, 5L); + stmt.setBigDecimal(15, new BigDecimal("5.3")); + stmt.setDate(16, date == null ? null : new Date(date.getTime() + 2 * TestUtil.MILLIS_IN_DAY)); + stmt.executeUpdate(); + + conn.commit(); + } finally { + conn.close(); + } + } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/8f289e63/phoenix-core/src/test/java/org/apache/phoenix/util/TestUtil.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/test/java/org/apache/phoenix/util/TestUtil.java b/phoenix-core/src/test/java/org/apache/phoenix/util/TestUtil.java index cb0a287..f1e98f8 100644 --- a/phoenix-core/src/test/java/org/apache/phoenix/util/TestUtil.java +++ b/phoenix-core/src/test/java/org/apache/phoenix/util/TestUtil.java @@ -86,6 +86,12 @@ import com.google.common.collect.Lists; public class TestUtil { + public static final String DEFAULT_SCHEMA_NAME = ""; + public static final String DEFAULT_DATA_TABLE_NAME = "T"; + public static final String DEFAULT_INDEX_TABLE_NAME = "I"; + public static final String DEFAULT_DATA_TABLE_FULL_NAME = SchemaUtil.getTableName(DEFAULT_SCHEMA_NAME, "T"); + public static final String DEFAULT_INDEX_TABLE_FULL_NAME = SchemaUtil.getTableName(DEFAULT_SCHEMA_NAME, "I"); + private TestUtil() { } http://git-wip-us.apache.org/repos/asf/phoenix/blob/8f289e63/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index a8d1f10..72ef4f9 100644 --- a/pom.xml +++ b/pom.xml @@ -254,7 +254,7 @@ <configuration> <encoding>UTF-8</encoding> <forkCount>${numForkedIT}</forkCount> - <reuseForks>true</reuseForks> + <reuseForks>false</reuseForks> <argLine>-enableassertions -Xmx2000m -XX:MaxPermSize=128m -Djava.security.egd=file:/dev/./urandom</argLine> <redirectTestOutputToFile>${test.output.tofile}</redirectTestOutputToFile> <testSourceDirectory>${basedir}/src/it/java</testSourceDirectory> @@ -270,7 +270,7 @@ <configuration> <encoding>UTF-8</encoding> <forkCount>${numForkedIT}</forkCount> - <reuseForks>true</reuseForks> + <reuseForks>false</reuseForks> <argLine>-enableassertions -Xmx2000m -XX:MaxPermSize=128m -Djava.security.egd=file:/dev/./urandom</argLine> <redirectTestOutputToFile>${test.output.tofile}</redirectTestOutputToFile> <testSourceDirectory>${basedir}/src/it/java</testSourceDirectory> @@ -286,7 +286,7 @@ <configuration> <encoding>UTF-8</encoding> <forkCount>${numForkedIT}</forkCount> - <reuseForks>true</reuseForks> + <reuseForks>false</reuseForks> <argLine>-enableassertions -Xmx2000m -XX:MaxPermSize=128m -Djava.security.egd=file:/dev/./urandom</argLine> <redirectTestOutputToFile>${test.output.tofile}</redirectTestOutputToFile> <testSourceDirectory>${basedir}/src/it/java</testSourceDirectory> -- Best regards, - Andy Problems worthy of attack prove their worth by hitting back. - Piet Hein (via Tom White)
