PHOENIX-1598 Encode column names to save space and improve performance(Samarth Jain and Thomas D'Silva)
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/dc6a6fc7 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/dc6a6fc7 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/dc6a6fc7 Branch: refs/heads/4.x-HBase-0.98 Commit: dc6a6fc75428a093414a7e801a645819805d6fcb Parents: f0e6c4a Author: Samarth <samarth.j...@salesforce.com> Authored: Sun Feb 26 19:32:25 2017 -0800 Committer: Samarth <samarth.j...@salesforce.com> Committed: Sun Feb 26 19:33:00 2017 -0800 ---------------------------------------------------------------------- .../phoenix/end2end/AggregateQueryIT.java | 74 +- .../AlterMultiTenantTableWithViewsIT.java | 25 +- .../apache/phoenix/end2end/AlterTableIT.java | 493 +- .../phoenix/end2end/AlterTableWithViewsIT.java | 133 +- .../org/apache/phoenix/end2end/ArrayIT.java | 28 + .../org/apache/phoenix/end2end/BaseJoinIT.java | 4 +- .../org/apache/phoenix/end2end/BaseQueryIT.java | 99 +- .../apache/phoenix/end2end/CaseStatementIT.java | 28 +- .../apache/phoenix/end2end/CastAndCoerceIT.java | 34 +- .../end2end/ClientTimeArithmeticQueryIT.java | 76 +- .../end2end/ColumnEncodedBytesPropIT.java | 95 + .../end2end/CountDistinctCompressionIT.java | 2 +- .../apache/phoenix/end2end/CreateTableIT.java | 57 + .../org/apache/phoenix/end2end/DateTimeIT.java | 2 +- .../phoenix/end2end/DefaultColumnValueIT.java | 1 + .../apache/phoenix/end2end/DerivedTableIT.java | 2 +- .../apache/phoenix/end2end/DistinctCountIT.java | 4 +- .../apache/phoenix/end2end/DynamicColumnIT.java | 63 + .../phoenix/end2end/ExtendedQueryExecIT.java | 8 +- .../apache/phoenix/end2end/FunkyNamesIT.java | 2 +- .../org/apache/phoenix/end2end/GroupByIT.java | 162 +- .../phoenix/end2end/ImmutableTablePropIT.java | 130 - .../end2end/ImmutableTablePropertiesIT.java | 189 + .../apache/phoenix/end2end/MutableQueryIT.java | 424 ++ .../phoenix/end2end/NativeHBaseTypesIT.java | 2 +- .../org/apache/phoenix/end2end/NotQueryIT.java | 28 +- .../org/apache/phoenix/end2end/OrderByIT.java | 2 - .../apache/phoenix/end2end/PercentileIT.java | 4 +- .../phoenix/end2end/PhoenixRuntimeIT.java | 4 +- .../phoenix/end2end/PointInTimeQueryIT.java | 78 +- .../phoenix/end2end/ProductMetricsIT.java | 2 +- .../end2end/QueryDatabaseMetaDataIT.java | 16 +- .../org/apache/phoenix/end2end/QueryIT.java | 112 +- .../phoenix/end2end/ReadIsolationLevelIT.java | 2 +- .../phoenix/end2end/RowValueConstructorIT.java | 36 +- .../org/apache/phoenix/end2end/ScanQueryIT.java | 93 +- .../phoenix/end2end/StatsCollectorIT.java | 124 +- .../apache/phoenix/end2end/StoreNullsIT.java | 310 +- .../phoenix/end2end/StoreNullsPropIT.java | 51 + ...SysTableNamespaceMappedStatsCollectorIT.java | 4 +- .../java/org/apache/phoenix/end2end/TopNIT.java | 6 +- .../apache/phoenix/end2end/UpsertSelectIT.java | 10 +- .../apache/phoenix/end2end/UpsertValuesIT.java | 51 +- .../phoenix/end2end/UserDefinedFunctionsIT.java | 3 +- .../phoenix/end2end/VariableLengthPKIT.java | 38 +- .../phoenix/end2end/index/DropMetadataIT.java | 13 +- .../phoenix/end2end/index/ImmutableIndexIT.java | 20 +- .../end2end/index/IndexExpressionIT.java | 28 +- .../apache/phoenix/end2end/index/IndexIT.java | 58 +- .../phoenix/end2end/index/IndexTestUtil.java | 11 +- .../end2end/index/MutableIndexFailureIT.java | 2 + .../phoenix/end2end/index/MutableIndexIT.java | 21 +- .../phoenix/end2end/salted/SaltedTableIT.java | 2 +- .../phoenix/tx/ParameterizedTransactionIT.java | 518 ++ .../org/apache/phoenix/tx/TransactionIT.java | 589 +- .../org/apache/phoenix/tx/TxCheckpointIT.java | 42 +- .../apache/phoenix/cache/ServerCacheClient.java | 2 + .../org/apache/phoenix/cache/TenantCache.java | 2 +- .../apache/phoenix/cache/TenantCacheImpl.java | 4 +- .../phoenix/compile/CreateTableCompiler.java | 10 +- .../apache/phoenix/compile/DeleteCompiler.java | 2 +- .../phoenix/compile/ExpressionCompiler.java | 18 +- .../apache/phoenix/compile/FromCompiler.java | 54 +- .../apache/phoenix/compile/JoinCompiler.java | 15 +- .../phoenix/compile/ListJarsQueryPlan.java | 6 +- .../apache/phoenix/compile/PostDDLCompiler.java | 11 +- .../compile/PostLocalIndexDDLCompiler.java | 9 +- .../phoenix/compile/ProjectionCompiler.java | 35 +- .../apache/phoenix/compile/TraceQueryPlan.java | 4 +- .../compile/TupleProjectionCompiler.java | 31 +- .../apache/phoenix/compile/UnionCompiler.java | 7 +- .../apache/phoenix/compile/UpsertCompiler.java | 6 +- .../apache/phoenix/compile/WhereCompiler.java | 24 +- .../coprocessor/BaseScannerRegionObserver.java | 52 +- .../coprocessor/DelegateRegionScanner.java | 5 + .../GroupedAggregateRegionObserver.java | 37 +- .../coprocessor/HashJoinRegionScanner.java | 19 +- .../coprocessor/MetaDataEndpointImpl.java | 241 +- .../phoenix/coprocessor/MetaDataProtocol.java | 4 +- .../coprocessor/MetaDataRegionObserver.java | 2 +- .../phoenix/coprocessor/ScanRegionObserver.java | 33 +- .../coprocessor/ServerCachingEndpointImpl.java | 2 +- .../coprocessor/ServerCachingProtocol.java | 2 +- .../UngroupedAggregateRegionObserver.java | 65 +- .../coprocessor/generated/PTableProtos.java | 1474 ++++- .../generated/ServerCachingProtos.java | 5125 +++++++++++++++++- .../phoenix/exception/SQLExceptionCode.java | 4 + .../apache/phoenix/execute/BaseQueryPlan.java | 27 +- .../apache/phoenix/execute/CorrelatePlan.java | 2 +- .../apache/phoenix/execute/MutationState.java | 16 +- .../phoenix/execute/SortMergeJoinPlan.java | 2 +- .../apache/phoenix/execute/TupleProjector.java | 72 +- .../apache/phoenix/execute/UnnestArrayPlan.java | 3 +- .../expression/ArrayConstructorExpression.java | 82 +- .../phoenix/expression/ExpressionType.java | 5 +- .../expression/KeyValueColumnExpression.java | 32 +- .../phoenix/expression/LiteralExpression.java | 11 +- .../expression/ProjectedColumnExpression.java | 1 + .../expression/SingleCellColumnExpression.java | 182 + .../SingleCellConstructorExpression.java | 102 + .../function/ArrayElemRefExpression.java | 4 +- .../expression/function/ArrayIndexFunction.java | 4 +- .../expression/util/regex/JONIPattern.java | 18 +- .../visitor/BaseExpressionVisitor.java | 6 + .../visitor/CloneExpressionVisitor.java | 12 + .../CloneNonDeterministicExpressionVisitor.java | 1 + .../expression/visitor/ExpressionVisitor.java | 6 + .../StatelessTraverseAllExpressionVisitor.java | 13 +- .../StatelessTraverseNoExpressionVisitor.java | 13 +- .../phoenix/filter/ColumnProjectionFilter.java | 24 +- ...EncodedQualifiersColumnProjectionFilter.java | 151 + .../MultiEncodedCQKeyValueComparisonFilter.java | 369 ++ .../filter/MultiKeyValueComparisonFilter.java | 6 +- .../SingleCQKeyValueComparisonFilter.java | 3 +- .../filter/SingleKeyValueComparisonFilter.java | 4 +- .../apache/phoenix/hbase/index/ValueGetter.java | 1 + .../example/CoveredColumnIndexCodec.java | 1 - .../hbase/index/util/KeyValueBuilder.java | 1 + .../apache/phoenix/index/IndexMaintainer.java | 530 +- .../phoenix/index/IndexMetaDataCacheClient.java | 1 + .../index/IndexMetaDataCacheFactory.java | 4 +- .../phoenix/index/PhoenixIndexBuilder.java | 2 +- .../apache/phoenix/index/PhoenixIndexCodec.java | 1 + .../index/PhoenixIndexFailurePolicy.java | 2 +- .../phoenix/index/PhoenixIndexMetaData.java | 9 +- .../index/PhoenixTransactionalIndexer.java | 16 +- .../phoenix/iterate/BaseResultIterators.java | 111 +- .../iterate/LookAheadResultIterator.java | 2 +- .../phoenix/iterate/MappedByteBufferQueue.java | 1 + .../phoenix/iterate/OrderedResultIterator.java | 3 +- .../iterate/RegionScannerResultIterator.java | 17 +- .../phoenix/jdbc/PhoenixDatabaseMetaData.java | 14 +- .../apache/phoenix/jdbc/PhoenixResultSet.java | 2 +- .../apache/phoenix/join/HashCacheFactory.java | 2 +- .../mapreduce/FormatToBytesWritableMapper.java | 21 +- .../mapreduce/FormatToKeyValueReducer.java | 30 +- .../index/PhoenixIndexPartialBuildMapper.java | 4 +- .../query/ConnectionQueryServicesImpl.java | 135 +- .../query/ConnectionlessQueryServicesImpl.java | 1 - .../apache/phoenix/query/QueryConstants.java | 59 +- .../org/apache/phoenix/query/QueryServices.java | 5 +- .../phoenix/query/QueryServicesOptions.java | 6 +- .../org/apache/phoenix/schema/ColumnRef.java | 16 +- .../phoenix/schema/ColumnValueDecoder.java | 31 + .../phoenix/schema/ColumnValueEncoder.java | 45 + .../apache/phoenix/schema/DelegateColumn.java | 4 + .../apache/phoenix/schema/DelegateTable.java | 24 +- .../apache/phoenix/schema/MetaDataClient.java | 488 +- .../java/org/apache/phoenix/schema/PColumn.java | 4 +- .../apache/phoenix/schema/PColumnFamily.java | 14 +- .../phoenix/schema/PColumnFamilyImpl.java | 49 +- .../org/apache/phoenix/schema/PColumnImpl.java | 29 +- .../apache/phoenix/schema/PMetaDataImpl.java | 4 +- .../java/org/apache/phoenix/schema/PTable.java | 435 +- .../org/apache/phoenix/schema/PTableImpl.java | 480 +- .../org/apache/phoenix/schema/PTableKey.java | 6 +- .../apache/phoenix/schema/ProjectedColumn.java | 12 +- .../org/apache/phoenix/schema/SaltingUtil.java | 2 +- .../apache/phoenix/schema/TableProperty.java | 42 + .../apache/phoenix/schema/tuple/BaseTuple.java | 39 + .../phoenix/schema/tuple/DelegateTuple.java | 7 + .../tuple/EncodedColumnQualiferCellsList.java | 581 ++ .../schema/tuple/MultiKeyValueTuple.java | 1 + .../tuple/PositionBasedMultiKeyValueTuple.java | 90 + .../schema/tuple/PositionBasedResultTuple.java | 125 + .../phoenix/schema/tuple/ResultTuple.java | 20 +- .../org/apache/phoenix/schema/tuple/Tuple.java | 4 + .../phoenix/schema/types/PArrayDataType.java | 340 +- .../schema/types/PArrayDataTypeDecoder.java | 102 + .../schema/types/PArrayDataTypeEncoder.java | 170 + .../apache/phoenix/util/EncodedColumnsUtil.java | 205 + .../java/org/apache/phoenix/util/IndexUtil.java | 78 +- .../org/apache/phoenix/util/KeyValueUtil.java | 2 - .../org/apache/phoenix/util/MetaDataUtil.java | 5 + .../org/apache/phoenix/util/PhoenixRuntime.java | 12 +- .../org/apache/phoenix/util/ResultUtil.java | 60 - .../java/org/apache/phoenix/util/ScanUtil.java | 29 +- .../org/apache/phoenix/util/SchemaUtil.java | 29 +- .../apache/phoenix/cache/TenantCacheTest.java | 6 +- .../phoenix/compile/HavingCompilerTest.java | 2 +- .../phoenix/compile/QueryCompilerTest.java | 28 +- .../phoenix/compile/QueryOptimizerTest.java | 51 + .../compile/SelectStatementRewriterTest.java | 11 +- .../phoenix/compile/WhereCompilerTest.java | 44 +- .../phoenix/execute/CorrelatePlanTest.java | 12 +- .../execute/LiteralResultIteratorPlanTest.java | 12 +- .../phoenix/execute/MutationStateTest.java | 4 +- .../phoenix/execute/UnnestArrayPlanTest.java | 8 +- .../ArrayConstructorExpressionTest.java | 20 +- .../expression/ColumnExpressionTest.java | 27 +- .../phoenix/index/IndexMaintainerTest.java | 7 +- .../iterate/AggregateResultScannerTest.java | 2 +- .../query/BaseConnectionlessQueryTest.java | 18 +- .../java/org/apache/phoenix/query/BaseTest.java | 61 +- .../phoenix/query/ConnectionlessTest.java | 22 +- .../EncodedColumnQualifierCellsListTest.java | 608 +++ .../schema/ImmutableStorageSchemeTest.java | 182 + .../schema/types/PDataTypeForArraysTest.java | 38 +- .../apache/phoenix/util/PhoenixRuntimeTest.java | 7 +- .../util/QualifierEncodingSchemeTest.java | 119 + .../java/org/apache/phoenix/util/TestUtil.java | 89 +- phoenix-protocol/src/main/PTable.proto | 9 + .../src/main/ServerCachingService.proto | 35 + pom.xml | 2 +- 204 files changed, 15807 insertions(+), 3073 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/dc6a6fc7/phoenix-core/src/it/java/org/apache/phoenix/end2end/AggregateQueryIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/AggregateQueryIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/AggregateQueryIT.java index c689373..a205814 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/AggregateQueryIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/AggregateQueryIT.java @@ -17,12 +17,10 @@ */ package org.apache.phoenix.end2end; -import static org.apache.phoenix.util.TestUtil.ATABLE_NAME; import static org.apache.phoenix.util.TestUtil.A_VALUE; import static org.apache.phoenix.util.TestUtil.B_VALUE; import static org.apache.phoenix.util.TestUtil.C_VALUE; import static org.apache.phoenix.util.TestUtil.E_VALUE; -import static org.apache.phoenix.util.TestUtil.ROW3; import static org.apache.phoenix.util.TestUtil.ROW4; import static org.apache.phoenix.util.TestUtil.TEST_PROPERTIES; import static org.junit.Assert.assertEquals; @@ -47,55 +45,13 @@ import org.junit.Test; public class AggregateQueryIT extends BaseQueryIT { - public AggregateQueryIT(String indexDDL) { - super(indexDDL); - } - - @Test - public void testSumOverNullIntegerColumn() throws Exception { - String query = "SELECT sum(a_integer) FROM aTable a"; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 20)); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(true); - conn.createStatement().execute("UPSERT INTO atable(organization_id,entity_id,a_integer) VALUES('" + getOrganizationId() + "','" + ROW3 + "',NULL)"); - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 30)); - Connection conn1 = DriverManager.getConnection(getUrl(), props); - analyzeTable(conn1, "ATABLE"); - conn1.close(); - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 50)); - conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue (rs.next()); - assertEquals(42, rs.getInt(1)); - assertFalse(rs.next()); - } finally { - conn.close(); - } - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 70)); - conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(true); - conn.createStatement().execute("UPSERT INTO atable(organization_id,entity_id,a_integer) SELECT organization_id, entity_id, CAST(null AS integer) FROM atable"); - - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 90)); - conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue (rs.next()); - assertEquals(0, rs.getInt(1)); - assertTrue(rs.wasNull()); - assertFalse(rs.next()); - } finally { - conn.close(); - } + public AggregateQueryIT(String indexDDL, boolean mutable, boolean columnEncoded) { + super(indexDDL, mutable, columnEncoded); } @Test public void testGroupByPlusOne() throws Exception { - String query = "SELECT a_integer+1 FROM aTable WHERE organization_id=? and a_integer = 5 GROUP BY a_integer+1"; + String query = "SELECT a_integer+1 FROM " + tableName + " WHERE organization_id=? and a_integer = 5 GROUP BY a_integer+1"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -114,7 +70,7 @@ public class AggregateQueryIT extends BaseQueryIT { @Test public void testSplitWithCachedMeta() throws Exception { // Tests that you don't get an ambiguous column exception when using the same alias as the column name - String query = "SELECT a_string, b_string, count(1) FROM atable WHERE organization_id=? and entity_id<=? GROUP BY a_string,b_string"; + String query = "SELECT a_string, b_string, count(1) FROM " + tableName + " WHERE organization_id=? and entity_id<=? GROUP BY a_string,b_string"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -138,12 +94,12 @@ public class AggregateQueryIT extends BaseQueryIT { assertEquals(1, rs.getLong(3)); assertFalse(rs.next()); - byte[] tableName = Bytes.toBytes(ATABLE_NAME); + byte[] tableNameBytes = Bytes.toBytes(tableName); admin = conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin(); - HTable htable = (HTable) conn.unwrap(PhoenixConnection.class).getQueryServices().getTable(tableName); + HTable htable = (HTable) conn.unwrap(PhoenixConnection.class).getQueryServices().getTable(tableNameBytes); htable.clearRegionCache(); int nRegions = htable.getRegionLocations().size(); - admin.split(tableName, ByteUtil.concat(Bytes.toBytes(tenantId), Bytes.toBytes("00A" + Character.valueOf((char) ('3' + nextRunCount())) + ts))); // vary split point with test run + admin.split(tableNameBytes, ByteUtil.concat(Bytes.toBytes(tenantId), Bytes.toBytes("00A" + Character.valueOf((char) ('3' + nextRunCount())) + ts))); // vary split point with test run int retryCount = 0; do { Thread.sleep(2000); @@ -177,7 +133,7 @@ public class AggregateQueryIT extends BaseQueryIT { @Test public void testCountIsNull() throws Exception { - String query = "SELECT count(1) FROM aTable WHERE X_DECIMAL is null"; + String query = "SELECT count(1) FROM " + tableName + " WHERE X_DECIMAL is null"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -195,7 +151,7 @@ public class AggregateQueryIT extends BaseQueryIT { @Test public void testCountWithNoScanRanges() throws Exception { - String query = "SELECT count(1) FROM aTable WHERE organization_id = 'not_existing_organization_id'"; + String query = "SELECT count(1) FROM " + tableName + " WHERE organization_id = 'not_existing_organization_id'"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -205,19 +161,19 @@ public class AggregateQueryIT extends BaseQueryIT { assertTrue(rs.next()); assertEquals(0, rs.getLong(1)); assertFalse(rs.next()); - query = "SELECT count(1) FROM aTable WHERE organization_id = 'not_existing_organization_id' having count(*)>0"; + query = "SELECT count(1) FROM " + tableName + " WHERE organization_id = 'not_existing_organization_id' having count(*)>0"; rs = conn.prepareStatement(query).executeQuery(); assertFalse(rs.next()); - query = "SELECT count(1) FROM aTable WHERE organization_id = 'not_existing_organization_id' limit 1 offset 1"; + query = "SELECT count(1) FROM " + tableName + " WHERE organization_id = 'not_existing_organization_id' limit 1 offset 1"; rs = conn.prepareStatement(query).executeQuery(); assertFalse(rs.next()); - query = "SELECT count(1),123 FROM aTable WHERE organization_id = 'not_existing_organization_id'"; + query = "SELECT count(1),123 FROM " + tableName + " WHERE organization_id = 'not_existing_organization_id'"; rs = conn.prepareStatement(query).executeQuery(); assertTrue(rs.next()); assertEquals(0, rs.getLong(1)); assertEquals("123", rs.getString(2)); assertFalse(rs.next()); - query = "SELECT count(1),sum(x_decimal) FROM aTable WHERE organization_id = 'not_existing_organization_id'"; + query = "SELECT count(1),sum(x_decimal) FROM " + tableName + " WHERE organization_id = 'not_existing_organization_id'"; rs = conn.prepareStatement(query).executeQuery(); assertTrue(rs.next()); assertEquals(0, rs.getLong(1)); @@ -230,7 +186,7 @@ public class AggregateQueryIT extends BaseQueryIT { @Test public void testCountIsNotNull() throws Exception { - String query = "SELECT count(1) FROM aTable WHERE X_DECIMAL is not null"; + String query = "SELECT count(1) FROM " + tableName + " WHERE X_DECIMAL is not null"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -250,7 +206,7 @@ public class AggregateQueryIT extends BaseQueryIT { */ @Test public void testInFilterOnKey() throws Exception { - String query = "SELECT count(entity_id) FROM ATABLE WHERE organization_id IN (?,?)"; + String query = "SELECT count(entity_id) FROM " + tableName + " WHERE organization_id IN (?,?)"; String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); Connection conn = DriverManager.getConnection(url, props); http://git-wip-us.apache.org/repos/asf/phoenix/blob/dc6a6fc7/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterMultiTenantTableWithViewsIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterMultiTenantTableWithViewsIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterMultiTenantTableWithViewsIT.java index d6f3a7f..7b4ff68 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterMultiTenantTableWithViewsIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterMultiTenantTableWithViewsIT.java @@ -476,14 +476,15 @@ public class AlterMultiTenantTableWithViewsIT extends ParallelStatsDisabledIT { // For a diverged view, only base table's pk column will be added and that too at the end. assertTableDefinition(conn, divergedView, PTableType.VIEW, baseTable, 2, 7, DIVERGED_VIEW_BASE_COLUMN_COUNT, "TENANT_ID", "PK1", "V1", "V3", "VIEW_COL1", "VIEW_COL2", "PK2"); - // Add existing column VIEW_COL2 to the base table - alterBaseTable = "ALTER TABLE " + baseTable + " ADD VIEW_COL2 CHAR(256)"; - conn.createStatement().execute(alterBaseTable); - - // For the non-diverged view, adding the column VIEW_COL2 will end up changing its ordinal position in the view. - assertTableDefinition(conn, view1, PTableType.VIEW, baseTable, 2, 9, 8, "TENANT_ID", "PK1", "V1", "V2", "V3", "KV", "PK2", "VIEW_COL2", "VIEW_COL1"); - // For the diverged view, adding the column VIEW_COL2 will not change its ordinal position in the view. It also won't change the base column count or the sequence number - assertTableDefinition(conn, divergedView, PTableType.VIEW, baseTable, 2, 7, DIVERGED_VIEW_BASE_COLUMN_COUNT, "TENANT_ID", "PK1", "V1", "V3", "VIEW_COL1", "VIEW_COL2", "PK2"); + // Adding existing column VIEW_COL2 to the base table isn't allowed. + try { + alterBaseTable = "ALTER TABLE " + baseTable + " ADD VIEW_COL2 CHAR(256)"; + conn.createStatement().execute(alterBaseTable); + fail(); + } + catch (SQLException e) { + assertEquals("Unexpected exception", SQLExceptionCode.CANNOT_MUTATE_TABLE.getErrorCode(), e.getErrorCode()); + } } } @@ -500,13 +501,13 @@ public class AlterMultiTenantTableWithViewsIT extends ParallelStatsDisabledIT { tenant1Conn.createStatement().execute(view1DDL); } - assertTableDefinition(conn, baseTable, PTableType.TABLE, null, 0, 5, BASE_TABLE_BASE_COLUMN_COUNT, "TENANT_ID", "PK1", "V1", "V2", "V3"); + assertTableDefinition(conn, baseTable, PTableType.TABLE, null, 1, 5, BASE_TABLE_BASE_COLUMN_COUNT, "TENANT_ID", "PK1", "V1", "V2", "V3"); assertTableDefinition(conn, view1, PTableType.VIEW, baseTable, 0, 7, 5, "TENANT_ID", "PK1", "V1", "V2", "V3", "VIEW_COL1", "VIEW_COL2"); String alterBaseTable = "ALTER TABLE " + baseTable + " ADD KV VARCHAR, PK2 VARCHAR PRIMARY KEY"; conn.createStatement().execute(alterBaseTable); - assertTableDefinition(conn, baseTable, PTableType.TABLE, null, 1, 7, BASE_TABLE_BASE_COLUMN_COUNT, "TENANT_ID", "PK1", "V1", "V2", "V3", "KV", "PK2"); + assertTableDefinition(conn, baseTable, PTableType.TABLE, null, 2, 7, BASE_TABLE_BASE_COLUMN_COUNT, "TENANT_ID", "PK1", "V1", "V2", "V3", "KV", "PK2"); assertTableDefinition(conn, view1, PTableType.VIEW, baseTable, 1, 9, 7, "TENANT_ID", "PK1", "V1", "V2", "V3", "KV", "PK2", "VIEW_COL1", "VIEW_COL2"); // verify that the both columns were added to view1 @@ -530,13 +531,13 @@ public class AlterMultiTenantTableWithViewsIT extends ParallelStatsDisabledIT { tenant1Conn.createStatement().execute(view1DDL); } - assertTableDefinition(conn, baseTable, PTableType.TABLE, null, 0, 5, BASE_TABLE_BASE_COLUMN_COUNT, "TENANT_ID", "PK1", "V1", "V2", "V3"); + assertTableDefinition(conn, baseTable, PTableType.TABLE, null, 1, 5, BASE_TABLE_BASE_COLUMN_COUNT, "TENANT_ID", "PK1", "V1", "V2", "V3"); assertTableDefinition(conn, view1, PTableType.VIEW, baseTable, 0, 7, 5, "TENANT_ID", "PK1", "V1", "V2", "V3", "VIEW_COL1", "VIEW_COL2"); String alterBaseTable = "ALTER TABLE " + baseTable + " DROP COLUMN V2"; conn.createStatement().execute(alterBaseTable); - assertTableDefinition(conn, baseTable, PTableType.TABLE, null, 1, 4, BASE_TABLE_BASE_COLUMN_COUNT, "TENANT_ID", "PK1", "V1", "V3"); + assertTableDefinition(conn, baseTable, PTableType.TABLE, null, 2, 4, BASE_TABLE_BASE_COLUMN_COUNT, "TENANT_ID", "PK1", "V1", "V3"); assertTableDefinition(conn, view1, PTableType.VIEW, baseTable, 1, 6, 4, "TENANT_ID", "PK1", "V1", "V3", "VIEW_COL1", "VIEW_COL2"); // verify that the dropped columns aren't visible