Repository: phoenix Updated Branches: refs/heads/master ca3512418 -> c81ca2791
http://git-wip-us.apache.org/repos/asf/phoenix/blob/3ada2e20/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryOptimizerTest.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryOptimizerTest.java b/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryOptimizerTest.java index 45a61a7..81f4a45 100644 --- a/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryOptimizerTest.java +++ b/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryOptimizerTest.java @@ -20,15 +20,31 @@ package org.apache.phoenix.compile; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import java.sql.Array; import java.sql.Connection; +import java.sql.Date; import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; +import org.apache.hadoop.hbase.util.Pair; import org.apache.phoenix.compile.OrderByCompiler.OrderBy; +import org.apache.phoenix.jdbc.PhoenixPreparedStatement; import org.apache.phoenix.jdbc.PhoenixStatement; import org.apache.phoenix.query.BaseConnectionlessQueryTest; +import org.apache.phoenix.query.QueryConstants; +import org.apache.phoenix.schema.PTableType; +import org.apache.phoenix.util.PhoenixRuntime; import org.apache.phoenix.util.SchemaUtil; +import org.junit.Ignore; import org.junit.Test; +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; + public class QueryOptimizerTest extends BaseConnectionlessQueryTest { public static final String SCHEMA_NAME = ""; @@ -306,4 +322,252 @@ public class QueryOptimizerTest extends BaseConnectionlessQueryTest { QueryPlan plan = stmt.optimizeQuery(query); assertEquals("T", plan.getTableRef().getTable().getTableName().getString()); } + + @Test + // Multi-tenant = false; Query uses index = false; Salted = true + public void testAssertQueryPlanDetails1() throws Exception { + testAssertQueryPlanDetails(false, false, true); + } + + @Test + // Multi-tenant = true; Query uses index = false; Salted = true + public void testAssertQueryPlanDetails2() throws Exception { + testAssertQueryPlanDetails(true, false, true); + } + + @Test + @Ignore // FIXME : https://issues.apache.org/jira/browse/PHOENIX-1302 + // Multi-tenant = true; Query uses index = true; Salted = false + public void testAssertQueryPlanDetails3() throws Exception { + testAssertQueryPlanDetails(true, true, true); + } + + @Test + // Multi-tenant = false; Query uses index = true; Salted = true + public void testAssertQueryPlanDetails4() throws Exception { + testAssertQueryPlanDetails(false, true, true); + } + + @Test + // Multi-tenant = false; Query uses index = false; Salted = false + public void testAssertQueryPlanDetails5() throws Exception { + testAssertQueryPlanDetails(false, false, false); + } + + @Test + // Multi-tenant = true; Query uses index = false; Salted = false + public void testAssertQueryPlanDetails6() throws Exception { + testAssertQueryPlanDetails(true, false, false); + } + + @Test + @Ignore // FIXME : https://issues.apache.org/jira/browse/PHOENIX-1302 + // Multi-tenant = true; Query uses index = true; Salted = false + public void testAssertQueryPlanDetails7() throws Exception { + testAssertQueryPlanDetails(true, true, false); + } + + @Test + // Multi-tenant = false; Query uses index = true; Salted = false + public void testAssertQueryPlanDetails8() throws Exception { + testAssertQueryPlanDetails(false, true, false); + } + + private void testAssertQueryPlanDetails(boolean multitenant, boolean useIndex, boolean salted) throws Exception { + String sql; + PreparedStatement stmt; + Connection conn = DriverManager.getConnection(getUrl(), new Properties()); + try { + // create table + conn.createStatement().execute("create table " + + "XYZ.ABC" + + " (organization_id char(15) not null, \n" + + " dec DECIMAL(10,2) not null,\n" + + " a_string_array varchar(100) array[] not null,\n" + + " b_string varchar(100),\n" + + " CF.a_integer integer,\n" + + " a_date date,\n" + + " CONSTRAINT pk PRIMARY KEY (organization_id, dec, a_string_array)\n" + + ")" + (salted ? "SALT_BUCKETS=4" : "") + (multitenant == true ? (salted ? ",MULTI_TENANT=true" : "MULTI_TENANT=true") : "")); + + + if (useIndex) { + // create index + conn.createStatement().execute("CREATE INDEX ABC_IDX ON XYZ.ABC (CF.a_integer) INCLUDE (a_date)"); + } + + // switch to a tenant specific connection if multi-tenant. + conn = multitenant ? DriverManager.getConnection(getUrl("tenantId")) : conn; + + // create a tenant specific view if multi-tenant + if (multitenant) { + conn.createStatement().execute("CREATE VIEW ABC_VIEW (ORGANIZATION_ID VARCHAR) AS SELECT * FROM XYZ.ABC"); + } + + String expectedColNames = multitenant ? addQuotes(null, "DEC,A_STRING_ARRAY") : addQuotes(null,"ORGANIZATION_ID,DEC,A_STRING_ARRAY"); + String expectedColumnNameDataTypes = multitenant ? "\"DEC\" DECIMAL(10,2),\"A_STRING_ARRAY\" VARCHAR(100) ARRAY" : "\"ORGANIZATION_ID\" CHAR(15),\"DEC\" DECIMAL(10,2),\"A_STRING_ARRAY\" VARCHAR(100) ARRAY"; + String tableName = multitenant ? "ABC_VIEW" : "XYZ.ABC"; + String tenantFilter = multitenant ? "" : "organization_id = ? AND "; + String orderByRowKeyClause = multitenant ? "dec" : "organization_id"; + + // Filter on row key columns of data table. No order by. No limit. + sql = "SELECT CF.a_integer FROM " + tableName + " where " + tenantFilter + " dec = ? and a_string_array = ?"; + stmt = conn.prepareStatement(sql); + int counter = 1; + if (!multitenant) { + stmt.setString(counter++, "ORGID"); + } + stmt.setDouble(counter++, 1.23); + String[] strArray = new String[2]; + strArray[0] = "AB"; + strArray[1] = "CD"; + Array array = conn.createArrayOf("VARCHAR", strArray); + stmt.setArray(counter++, array); + assertPlanDetails(stmt, expectedColNames, expectedColumnNameDataTypes, false, 0); + + counter = 1; + // Filter on row key columns of data table. Order by row key columns. Limit specified. + sql = "SELECT CF.a_integer FROM " + tableName + " where " + tenantFilter + " dec = ? and a_string_array = ? ORDER BY " + orderByRowKeyClause + " LIMIT 100"; + stmt = conn.prepareStatement(sql); + if (!multitenant) { + stmt.setString(counter++, "ORGID"); + } + stmt.setDouble(counter++, 1.23); + array = conn.createArrayOf("VARCHAR", strArray); + stmt.setArray(counter++, array); + assertPlanDetails(stmt, expectedColNames, expectedColumnNameDataTypes, false, 100); + + counter = 1; + // Filter on row key columns of data table. Order by non-row key columns. Limit specified. + sql = "SELECT CF.a_integer FROM " + tableName + " where " + tenantFilter + " dec = ? and a_string_array = ? ORDER BY a_date LIMIT 100"; + stmt = conn.prepareStatement(sql); + if (!multitenant) { + stmt.setString(counter++, "ORGID"); + } + stmt.setDouble(counter++, 1.23); + array = conn.createArrayOf("VARCHAR", strArray); + stmt.setArray(counter++, array); + assertPlanDetails(stmt, expectedColNames, expectedColumnNameDataTypes, true, 100); + + if (useIndex) { + + expectedColNames = multitenant ? ("\"CF\".\"A_INTEGER\"" + ",\"DEC\"" + ",\"A_STRING_ARRAY\"") : ("\"CF\".\"A_INTEGER\"" + ",\"ORGANIZATION_ID\"" + ",\"DEC\"" + ",\"A_STRING_ARRAY\""); + expectedColumnNameDataTypes = multitenant ? ("\"CF\".\"A_INTEGER\"" + " " + "INTEGER" + ",\"DEC\"" + " " + "DECIMAL(10,2)" + ",\"A_STRING_ARRAY\""+ " " + "VARCHAR(100) ARRAY") : ("\"CF\".\"A_INTEGER\"" + " " + "INTEGER" + ",\"ORGANIZATION_ID\"" + " " + "CHAR(15)" + ",\"DEC\"" + " " + "DECIMAL(10,2)" + ",\"A_STRING_ARRAY\""+ " " + "VARCHAR(100) ARRAY"); + + // Filter on columns that the secondary index is on. No order by. No limit. + sql = "SELECT a_date FROM " + tableName + " where CF.a_integer = ?"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, 1000); + assertPlanDetails(stmt, expectedColNames, expectedColumnNameDataTypes, false, 0); + + // Filter on columns that the secondary index is on. Order by on the indexed column. Limit specified. + sql = "SELECT a_date FROM " + tableName + " where CF.a_integer = ? ORDER BY CF.a_integer LIMIT 100"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, 1000); + assertPlanDetails(stmt, expectedColNames, expectedColumnNameDataTypes, false, 100); + + // Filter on columns that the secondary index is on. Order by on the non-indexed column. Limit specified. + sql = "SELECT a_integer FROM " + tableName + " where CF.a_integer = ? and a_date = ? ORDER BY a_date LIMIT 100"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, 1000); + stmt.setDate(2, new Date(909000)); + assertPlanDetails(stmt, expectedColNames, expectedColumnNameDataTypes, true, 100); + } + } finally { + conn.close(); + } + } + + @Test + @Ignore // FIXME : https://issues.apache.org/jira/browse/PHOENIX-1302 + public void testAssertQueryAgainstTenantSpecificViewGoesThroughIndex() throws Exception { + Connection conn = DriverManager.getConnection(getUrl(), new Properties()); + + // create table + conn.createStatement().execute("create table " + + "XYZ.ABC" + + " (organization_id char(15) not null, \n" + + " entity_id char(15) not null,\n" + + " a_string_array varchar(100) array[] not null,\n" + + " b_string varchar(100),\n" + + " a_string varchar,\n" + + " a_date date,\n" + + " CONSTRAINT pk PRIMARY KEY (organization_id, entity_id, a_string_array)\n" + + ")" + "MULTI_TENANT=true"); + + + // create index + conn.createStatement().execute("CREATE INDEX ABC_IDX ON XYZ.ABC (a_string) INCLUDE (a_date)"); + + conn.close(); + + // switch to a tenant specific connection + conn = DriverManager.getConnection(getUrl("tenantId")); + + // create a tenant specific view + conn.createStatement().execute("CREATE VIEW ABC_VIEW AS SELECT * FROM XYZ.ABC"); + + // query against the tenant specific view + String sql = "SELECT a_date FROM ABC_VIEW where a_string = ?"; + PreparedStatement stmt = conn.prepareStatement(sql); + stmt.setString(1, "1000"); + QueryPlan plan = stmt.unwrap(PhoenixPreparedStatement.class).optimizeQuery(); + assertEquals("Query should use index", PTableType.INDEX, plan.getTableRef().getTable().getType()); + + } + + private void assertPlanDetails(PreparedStatement stmt, String expectedPkCols, String expectedPkColsDataTypes, boolean expectedHasOrderBy, int expectedLimit) throws SQLException { + Connection conn = stmt.getConnection(); + QueryPlan plan = PhoenixRuntime.getOptimizedQueryPlan(stmt); + + List<Pair<String, String>> columns = new ArrayList<Pair<String, String>>(); + PhoenixRuntime.getPkColsForSql(columns, plan, conn, true); + assertEquals(expectedPkCols, Joiner.on(",").join(getColumnNames(columns))); + List<String> dataTypes = new ArrayList<String>(); + columns = new ArrayList<Pair<String,String>>(); + PhoenixRuntime.getPkColsDataTypesForSql(columns, dataTypes, plan, conn, true); + + assertEquals(expectedPkColsDataTypes, appendColNamesDataTypes(columns, dataTypes)); + assertEquals(expectedHasOrderBy, PhoenixRuntime.hasOrderBy(plan)); + assertEquals(expectedLimit, PhoenixRuntime.getLimit(plan)); + } + + private static List<String> getColumnNames(List<Pair<String, String>> columns) { + List<String> columnNames = new ArrayList<String>(columns.size()); + for (Pair<String, String> col : columns) { + String familyName = col.getFirst(); + String columnName = col.getSecond(); + if (familyName != null) { + columnName = familyName + QueryConstants.NAME_SEPARATOR + columnName; + } + columnNames.add(columnName); + } + return columnNames; + } + + private String addQuotes(String familyName, String columnNames) { + Iterable<String> columnNamesList = Splitter.on(",").split(columnNames); + List<String> quotedColumnNames = new ArrayList<String>(); + for (String columnName : columnNamesList) { + String quotedColumnName = SchemaUtil.getQuotedFullColumnName(familyName, columnName); + quotedColumnNames.add(quotedColumnName); + } + return Joiner.on(",").join(quotedColumnNames); + } + + private String appendColNamesDataTypes(List<Pair<String, String>> columns, List<String> dataTypes) { + int size = columns.size(); + assertEquals(size, dataTypes.size()); // they will be equal, but what the heck? + List<String> pkColsDataTypes = new ArrayList<String>(size); + for (int i = 0; i < size; i++) { + String familyName = columns.get(i).getFirst(); + String columnName = columns.get(i).getSecond(); + if (familyName != null) { + columnName = familyName + QueryConstants.NAME_SEPARATOR + columnName; + } + pkColsDataTypes.add(columnName + " " + dataTypes.get(i)); + } + return Joiner.on(",").join(pkColsDataTypes); + } + } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/3ada2e20/phoenix-core/src/test/java/org/apache/phoenix/schema/ValueBitSetTest.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/test/java/org/apache/phoenix/schema/ValueBitSetTest.java b/phoenix-core/src/test/java/org/apache/phoenix/schema/ValueBitSetTest.java index 9b0ebff..766917c 100644 --- a/phoenix-core/src/test/java/org/apache/phoenix/schema/ValueBitSetTest.java +++ b/phoenix-core/src/test/java/org/apache/phoenix/schema/ValueBitSetTest.java @@ -18,6 +18,7 @@ package org.apache.phoenix.schema; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; @@ -70,6 +71,48 @@ public class ValueBitSetTest { } @Test + public void testMinNullableIndex() { + final int minNullableIndex = 4; // first 4 fields are not nullable. + int numFields = 6; + KeyValueSchemaBuilder builder = new KeyValueSchemaBuilder(minNullableIndex); + for (int i = 0; i < numFields; i++) { + final int fieldIndex = i; + builder.addField(new PDatum() { + @Override + public boolean isNullable() { + // not nullable till index reaches minNullableIndex + return fieldIndex < minNullableIndex; + } + + @Override + public SortOrder getSortOrder() { + return SortOrder.getDefault(); + } + + @Override + public Integer getScale() { + return null; + } + + @Override + public Integer getMaxLength() { + return null; + } + + @Override + public PDataType getDataType() { + return PDataType.values()[fieldIndex % PDataType.values().length]; + } + }); + } + KeyValueSchema kvSchema = builder.build(); + assertFalse(kvSchema.getFields().get(0).isNullable()); + assertFalse(kvSchema.getFields().get(minNullableIndex - 1).isNullable()); + assertTrue(kvSchema.getFields().get(minNullableIndex).isNullable()); + assertTrue(kvSchema.getFields().get(minNullableIndex + 1).isNullable()); + } + + @Test public void testNullCount() { int nFields = 32; int nRepeating = 5; http://git-wip-us.apache.org/repos/asf/phoenix/blob/3ada2e20/phoenix-core/src/test/java/org/apache/phoenix/util/PhoenixEncodeDecodeTest.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/test/java/org/apache/phoenix/util/PhoenixEncodeDecodeTest.java b/phoenix-core/src/test/java/org/apache/phoenix/util/PhoenixEncodeDecodeTest.java new file mode 100644 index 0000000..7ddb235 --- /dev/null +++ b/phoenix-core/src/test/java/org/apache/phoenix/util/PhoenixEncodeDecodeTest.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 The Apache Software Foundation + * + * 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 maynot 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 applicablelaw 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.util; + +import static org.junit.Assert.assertEquals; + +import java.sql.Connection; +import java.sql.Date; +import java.sql.DriverManager; +import java.util.Arrays; + +import org.apache.hadoop.hbase.util.Pair; +import org.apache.phoenix.query.BaseConnectionlessQueryTest; +import org.junit.Test; + +import com.google.common.collect.Lists; + +public class PhoenixEncodeDecodeTest extends BaseConnectionlessQueryTest { + + @Test + public void testDecodeValues1() throws Exception { + testDecodeValues(false, false); + } + + @Test + public void testDecodeValues2() throws Exception { + testDecodeValues(true, false); + } + + @Test + public void testDecodeValues3() throws Exception { + testDecodeValues(true, true); + } + + @Test + public void testDecodeValues4() throws Exception { + testDecodeValues(false, true); + } + + @SuppressWarnings("unchecked") + private void testDecodeValues(boolean nullFixedWidth, boolean nullVariableWidth) throws Exception { + Connection conn = DriverManager.getConnection(getUrl()); + conn.createStatement().execute( + "CREATE TABLE T(pk1 CHAR(15) not null, pk2 VARCHAR not null, CF1.v1 DATE, CF2.v2 VARCHAR, CF2.v1 VARCHAR " + + "CONSTRAINT pk PRIMARY KEY (pk1, pk2)) "); + + Date d = nullFixedWidth ? null : new Date(100); + String s = nullVariableWidth ? null : "foo"; + Object[] values = new Object[] {"def", "eid", d, s, s}; + byte[] bytes = PhoenixRuntime.encodeValues(conn, "T", values, Lists.newArrayList(new Pair<String, String>(null, "pk1"), new Pair<String, String>(null, "pk2"), new Pair<String, String>("cf1", "v1"), new Pair<String, String>("cf2", "v2"), new Pair<String, String>("cf2", "v1"))); + Object[] decodedValues = PhoenixRuntime.decodeValues(conn, "T", bytes, Lists.newArrayList(new Pair<String, String>(null, "pk1"), new Pair<String, String>(null, "pk2"), new Pair<String, String>("cf1", "v1"), new Pair<String, String>("cf2", "v2"), new Pair<String, String>("cf2", "v1"))); + assertEquals(Lists.newArrayList("def", "eid", d, s, s), Arrays.asList(decodedValues)); + } + +} http://git-wip-us.apache.org/repos/asf/phoenix/blob/3ada2e20/phoenix-core/src/test/java/org/apache/phoenix/util/PhoenixRuntimeTest.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/test/java/org/apache/phoenix/util/PhoenixRuntimeTest.java b/phoenix-core/src/test/java/org/apache/phoenix/util/PhoenixRuntimeTest.java index 9a277ad..847aed9 100644 --- a/phoenix-core/src/test/java/org/apache/phoenix/util/PhoenixRuntimeTest.java +++ b/phoenix-core/src/test/java/org/apache/phoenix/util/PhoenixRuntimeTest.java @@ -22,8 +22,20 @@ 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 static org.junit.Assert.fail; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +import org.apache.commons.lang.exception.ExceptionUtils; +import org.apache.hadoop.hbase.util.Pair; +import org.apache.phoenix.compile.QueryPlan; import org.apache.phoenix.query.BaseConnectionlessQueryTest; +import org.apache.phoenix.schema.PDataType; import org.junit.Test; import com.google.common.collect.ImmutableList; @@ -80,4 +92,67 @@ public class PhoenixRuntimeTest extends BaseConnectionlessQueryTest { assertTrue(execCmd.isStrict()); assertEquals("!", execCmd.getArrayElementSeparator()); } + + @Test + public void testGetPkColsDataTypes() throws Exception { + Connection conn = DriverManager.getConnection(getUrl(), new Properties()); + int i = 0; + PDataType[] pTypes = PDataType.values(); + int size = pTypes.length; + StringBuilder sb = null; + try { + for (i = 0 ; i < size; i++) { + PDataType pType = pTypes[i]; + String sqlTypeName = pType.getSqlTypeName(); + if (sqlTypeName.equalsIgnoreCase("VARBINARY ARRAY")) { + // we don't support VARBINARY ARRAYS yet + // JIRA - https://issues.apache.org/jira/browse/PHOENIX-1329 + continue; + } + if (pType.isArrayType() && PDataType.arrayBaseType(pType).isFixedWidth() && PDataType.arrayBaseType(pType).getByteSize() == null) { + // Need to treat array type whose base type is of fixed width whose byte size is not known as a special case. + // Cannot just use the sql type name returned by PDataType.getSqlTypeName(). + String baseTypeName = PDataType.arrayBaseType(pType).getSqlTypeName(); + sqlTypeName = baseTypeName + "(15)" + " " + PDataType.ARRAY_TYPE_SUFFIX; + } else if (pType.isFixedWidth() && pType.getByteSize() == null) { + sqlTypeName = sqlTypeName + "(15)"; + } + String columnName = "col" + i; + String tableName = "t" + i; + + sb = new StringBuilder(100); + + // create a table by using the type name as returned by PDataType + sb.append("CREATE TABLE " + tableName + " ("); + sb.append(columnName + " " + sqlTypeName + " NOT NULL PRIMARY KEY, V1 VARCHAR)"); + conn.createStatement().execute(sb.toString()); + + // generate the optimized query plan by going through the pk of the table. + PreparedStatement stmt = conn.prepareStatement("SELECT * FROM " + tableName + " WHERE " + columnName + " = ?"); + Integer maxLength = pType.isFixedWidth() && pType.getByteSize() == null ? 15 : null; + stmt.setObject(1, pType.getSampleValue(maxLength)); + QueryPlan plan = PhoenixRuntime.getOptimizedQueryPlan(stmt); + + // now go through the utility method, get column name and type name and + // try creating another table with the returned info. Use the query plan generated above. + // If table can be created with the returned sql type name, then great! + // It would mean "Roundtrip" of column data type name works. + List<Pair<String, String>> pkCols = new ArrayList<Pair<String, String>>(); + List<String> dataTypes = new ArrayList<String>(); + PhoenixRuntime.getPkColsDataTypesForSql(pkCols, dataTypes, plan, conn, true); + + tableName = "newt" + i; + columnName = "newCol" + i; + String roundTripSqlTypeName = dataTypes.get(0); + + // create a table by using the type name as returned by the utility method + sb = new StringBuilder(100); + sb.append("CREATE TABLE " + tableName + " ("); + sb.append(columnName + " " + roundTripSqlTypeName + " NOT NULL PRIMARY KEY)"); + conn.createStatement().execute(sb.toString()); + } + } catch (Exception e) { + fail("Failed sql: " + sb.toString() + ExceptionUtils.getStackTrace(e)); + } + } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/3ada2e20/phoenix-pig/src/it/java/org/apache/phoenix/pig/PhoenixHBaseLoaderIT.java ---------------------------------------------------------------------- diff --git a/phoenix-pig/src/it/java/org/apache/phoenix/pig/PhoenixHBaseLoaderIT.java b/phoenix-pig/src/it/java/org/apache/phoenix/pig/PhoenixHBaseLoaderIT.java index 82a35d9..51b2478 100644 --- a/phoenix-pig/src/it/java/org/apache/phoenix/pig/PhoenixHBaseLoaderIT.java +++ b/phoenix-pig/src/it/java/org/apache/phoenix/pig/PhoenixHBaseLoaderIT.java @@ -615,7 +615,10 @@ public class PhoenixHBaseLoaderIT { @AfterClass public static void tearDownAfterClass() throws Exception { - conn.close(); - hbaseTestUtil.shutdownMiniCluster(); + try { + conn.close(); + } finally { + hbaseTestUtil.shutdownMiniCluster(); + } } } \ No newline at end of file