Merge remote-tracking branch 'upstream/master' into PHOENIX-3534
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/cb47eaec Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/cb47eaec Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/cb47eaec Branch: refs/heads/system-catalog Commit: cb47eaecfd098e22c903ae8b3125b9e3f2508593 Parents: 7b4ccaf f714287 Author: Thomas D'Silva <tdsi...@apache.org> Authored: Thu Dec 28 23:30:35 2017 -0800 Committer: Thomas D'Silva <tdsi...@apache.org> Committed: Thu Dec 28 23:30:35 2017 -0800 ---------------------------------------------------------------------- NOTICE | 2 + bin/argparse-1.4.0/argparse.py | 2392 ++++++++++++++++++ bin/daemon.py | 16 +- bin/queryserver.py | 2 +- bin/sqlline-thin.py | 9 +- bin/sqlline.py | 14 +- phoenix-core/pom.xml | 1 + ...ReplayWithIndexWritesAndCompressedWALIT.java | 2 + .../apache/phoenix/end2end/AlterTableIT.java | 2 +- .../phoenix/end2end/BasePermissionsIT.java | 754 ++++++ .../phoenix/end2end/ChangePermissionsIT.java | 270 ++ .../phoenix/end2end/CostBasedDecisionIT.java | 466 ++++ .../apache/phoenix/end2end/CreateSchemaIT.java | 64 +- .../phoenix/end2end/DefaultColumnValueIT.java | 9 +- .../end2end/ExplainPlanWithStatsEnabledIT.java | 38 +- .../org/apache/phoenix/end2end/IndexToolIT.java | 40 + .../MigrateSystemTablesToSystemNamespaceIT.java | 8 + .../apache/phoenix/end2end/MutationStateIT.java | 161 ++ .../apache/phoenix/end2end/PhoenixDriverIT.java | 160 ++ .../org/apache/phoenix/end2end/QueryMoreIT.java | 42 - .../org/apache/phoenix/end2end/SequenceIT.java | 29 - .../org/apache/phoenix/end2end/SortOrderIT.java | 11 +- .../apache/phoenix/end2end/StoreNullsIT.java | 6 +- .../apache/phoenix/end2end/SystemCatalogIT.java | 96 + .../end2end/SystemTablePermissionsIT.java | 226 +- .../phoenix/end2end/TableDDLPermissionsIT.java | 583 +---- .../org/apache/phoenix/end2end/UpgradeIT.java | 73 + .../phoenix/end2end/UpsertBigValuesIT.java | 64 +- .../phoenix/end2end/index/DropColumnIT.java | 19 +- .../phoenix/end2end/index/IndexMetadataIT.java | 55 + .../phoenix/end2end/join/HashJoinMoreIT.java | 5 + .../apache/phoenix/execute/PartialCommitIT.java | 5 +- phoenix-core/src/main/antlr3/PhoenixSQL.g | 37 +- .../phoenix/compile/BaseMutationPlan.java | 5 + .../phoenix/compile/DelegateMutationPlan.java | 5 + .../apache/phoenix/compile/DeleteCompiler.java | 558 ++-- .../apache/phoenix/compile/JoinCompiler.java | 19 +- .../phoenix/compile/ListJarsQueryPlan.java | 6 + .../apache/phoenix/compile/MutationPlan.java | 5 +- .../phoenix/compile/ProjectionCompiler.java | 6 +- .../apache/phoenix/compile/QueryCompiler.java | 6 +- .../org/apache/phoenix/compile/QueryPlan.java | 5 +- .../org/apache/phoenix/compile/ScanRanges.java | 11 +- .../apache/phoenix/compile/TraceQueryPlan.java | 6 + .../apache/phoenix/compile/UpsertCompiler.java | 687 ++--- .../apache/phoenix/compile/WhereOptimizer.java | 5 - .../coprocessor/BaseScannerRegionObserver.java | 5 +- .../coprocessor/MetaDataEndpointImpl.java | 30 +- .../coprocessor/PhoenixAccessController.java | 29 +- .../phoenix/exception/SQLExceptionCode.java | 1 + .../apache/phoenix/execute/AggregatePlan.java | 30 +- .../apache/phoenix/execute/BaseQueryPlan.java | 38 +- .../phoenix/execute/ClientAggregatePlan.java | 28 + .../apache/phoenix/execute/ClientScanPlan.java | 25 + .../apache/phoenix/execute/CorrelatePlan.java | 25 + .../phoenix/execute/DelegateQueryPlan.java | 6 + .../apache/phoenix/execute/HashJoinPlan.java | 88 +- .../execute/LiteralResultIterationPlan.java | 6 + .../apache/phoenix/execute/MutationState.java | 154 +- .../org/apache/phoenix/execute/ScanPlan.java | 25 + .../phoenix/execute/SortMergeJoinPlan.java | 81 +- .../org/apache/phoenix/execute/UnionPlan.java | 63 +- .../RowValueConstructorExpression.java | 4 +- .../expression/SingleCellColumnExpression.java | 35 +- .../phoenix/hbase/index/write/IndexWriter.java | 3 +- .../apache/phoenix/index/IndexMaintainer.java | 2 +- .../phoenix/index/PhoenixIndexBuilder.java | 5 - .../phoenix/iterate/BaseResultIterators.java | 6 +- .../NonAggregateRegionScannerFactory.java | 2 +- .../apache/phoenix/jdbc/PhoenixStatement.java | 74 +- .../phoenix/mapreduce/PhoenixOutputFormat.java | 13 +- .../phoenix/mapreduce/PhoenixRecordWriter.java | 8 +- .../phoenix/mapreduce/util/ConnectionUtil.java | 23 +- .../java/org/apache/phoenix/optimize/Cost.java | 123 + .../apache/phoenix/optimize/QueryOptimizer.java | 30 +- .../phoenix/parse/AddColumnStatement.java | 2 +- .../phoenix/parse/AlterIndexStatement.java | 14 + .../phoenix/parse/ChangePermsStatement.java | 102 + .../phoenix/parse/CreateSchemaStatement.java | 2 +- .../apache/phoenix/parse/ParseNodeFactory.java | 13 +- .../phoenix/query/ConnectionQueryServices.java | 2 + .../query/ConnectionQueryServicesImpl.java | 78 +- .../query/ConnectionlessQueryServicesImpl.java | 7 + .../query/DelegateConnectionQueryServices.java | 8 +- .../org/apache/phoenix/query/QueryServices.java | 5 +- .../phoenix/query/QueryServicesOptions.java | 12 +- .../org/apache/phoenix/schema/ColumnRef.java | 4 +- .../apache/phoenix/schema/MetaDataClient.java | 714 ++++-- .../phoenix/schema/MetaDataSplitPolicy.java | 23 +- .../java/org/apache/phoenix/schema/PTable.java | 21 +- .../schema/TablesNotInSyncException.java | 22 + .../phoenix/schema/types/PArrayDataType.java | 18 +- .../schema/types/PArrayDataTypeDecoder.java | 79 +- .../schema/types/PArrayDataTypeEncoder.java | 10 +- .../java/org/apache/phoenix/util/CostUtil.java | 90 + .../java/org/apache/phoenix/util/IndexUtil.java | 7 +- .../org/apache/phoenix/util/KeyValueUtil.java | 55 +- .../org/apache/phoenix/util/PhoenixRuntime.java | 32 +- .../org/apache/phoenix/util/PropertiesUtil.java | 9 +- .../org/apache/phoenix/util/SchemaUtil.java | 30 +- .../org/apache/phoenix/util/UpgradeUtil.java | 1 + .../apache/phoenix/parse/QueryParserTest.java | 59 +- .../query/ParallelIteratorsSplitTest.java | 6 + .../schema/ImmutableStorageSchemeTest.java | 241 +- .../java/org/apache/phoenix/pig/BasePigIT.java | 4 + .../apache/phoenix/pig/PhoenixHBaseStorage.java | 12 +- phoenix-queryserver-client/pom.xml | 16 +- phoenix-server/pom.xml | 3 + pom.xml | 3 +- 109 files changed, 7730 insertions(+), 1921 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/cb47eaec/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableIT.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/cb47eaec/phoenix-core/src/it/java/org/apache/phoenix/end2end/ExplainPlanWithStatsEnabledIT.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/cb47eaec/phoenix-core/src/it/java/org/apache/phoenix/end2end/MigrateSystemTablesToSystemNamespaceIT.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/cb47eaec/phoenix-core/src/it/java/org/apache/phoenix/end2end/TableDDLPermissionsIT.java ---------------------------------------------------------------------- diff --cc phoenix-core/src/it/java/org/apache/phoenix/end2end/TableDDLPermissionsIT.java index 0130f35,8666bb8..dc55400 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/TableDDLPermissionsIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/TableDDLPermissionsIT.java @@@ -353,23 -201,21 +201,23 @@@ public class TableDDLPermissionsIT exte verifyAllowed(readTable(phoenixTableName, indexName1), unprivilegedUser); verifyAllowed(readTable(phoenixTableName, indexName2), unprivilegedUser); verifyAllowed(rebuildIndex(indexName2, phoenixTableName), unprivilegedUser); + verifyAllowed(dropView(viewName3), regularUser); + verifyAllowed(dropView(viewName4), regularUser); // data table user should be able to read new index - verifyAllowed(rebuildIndex(indexName2, phoenixTableName), regularUser); - verifyAllowed(readTable(phoenixTableName, indexName2), regularUser); - - verifyAllowed(readTable(phoenixTableName), regularUser); - verifyAllowed(rebuildIndex(indexName1, phoenixTableName), regularUser); - verifyAllowed(addColumn(phoenixTableName, "val1"), regularUser); - verifyAllowed(addProperties(phoenixTableName, "GUIDE_POSTS_WIDTH", "100"), regularUser); - verifyAllowed(dropView(viewName1), regularUser); - verifyAllowed(dropView(viewName2), regularUser); - verifyAllowed(dropColumn(phoenixTableName, "val1"), regularUser); - verifyAllowed(dropIndex(indexName2, phoenixTableName), regularUser); - verifyAllowed(dropIndex(indexName1, phoenixTableName), regularUser); - verifyAllowed(dropTable(phoenixTableName), regularUser); + verifyAllowed(rebuildIndex(indexName2, phoenixTableName), regularUser1); + verifyAllowed(readTable(phoenixTableName, indexName2), regularUser1); + + verifyAllowed(readTable(phoenixTableName), regularUser1); + verifyAllowed(rebuildIndex(indexName1, phoenixTableName), regularUser1); + verifyAllowed(addColumn(phoenixTableName, "val1"), regularUser1); + verifyAllowed(addProperties(phoenixTableName, "GUIDE_POSTS_WIDTH", "100"), regularUser1); + verifyAllowed(dropView(viewName1), regularUser1); + verifyAllowed(dropView(viewName2), regularUser1); + verifyAllowed(dropColumn(phoenixTableName, "val1"), regularUser1); + verifyAllowed(dropIndex(indexName2, phoenixTableName), regularUser1); + verifyAllowed(dropIndex(indexName1, phoenixTableName), regularUser1); + verifyAllowed(dropTable(phoenixTableName), regularUser1); // check again with super users verifyAllowed(createTable(phoenixTableName), superUser2); http://git-wip-us.apache.org/repos/asf/phoenix/blob/cb47eaec/phoenix-core/src/it/java/org/apache/phoenix/end2end/UpgradeIT.java ---------------------------------------------------------------------- diff --cc phoenix-core/src/it/java/org/apache/phoenix/end2end/UpgradeIT.java index bf5bd94,b71dd7c..ac0cbd3 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/UpgradeIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/UpgradeIT.java @@@ -33,7 -36,10 +33,8 @@@ import java.sql.DriverManager import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.Arrays; -import java.util.Collections; import java.util.Properties; + import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.CountDownLatch; import java.util.concurrent.FutureTask; http://git-wip-us.apache.org/repos/asf/phoenix/blob/cb47eaec/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/DropColumnIT.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/cb47eaec/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexMetadataIT.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/cb47eaec/phoenix-core/src/it/java/org/apache/phoenix/execute/PartialCommitIT.java ---------------------------------------------------------------------- diff --cc phoenix-core/src/it/java/org/apache/phoenix/execute/PartialCommitIT.java index 2199b93,e5b57e3..938ffe6 --- a/phoenix-core/src/it/java/org/apache/phoenix/execute/PartialCommitIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/execute/PartialCommitIT.java @@@ -285,9 -284,9 +284,9 @@@ public class PartialCommitIT extends Ba private PhoenixConnection getConnectionWithTableOrderPreservingMutationState() throws SQLException { Connection con = driver.connect(url, new Properties()); PhoenixConnection phxCon = new PhoenixConnection(con.unwrap(PhoenixConnection.class)); - final Map<TableRef,Map<ImmutableBytesPtr,MutationState.RowMutationState>> mutations = Maps.newTreeMap(new TableRefComparator()); + final Map<TableRef, MultiRowMutationState> mutations = Maps.newTreeMap(new TableRefComparator()); // passing a null mutation state forces the connection.newMutationState() to be used to create the MutationState - return new PhoenixConnection(phxCon, null) { + return new PhoenixConnection(phxCon, (MutationState)null) { @Override protected MutationState newMutationState(int maxSize, int maxSizeBytes) { return new MutationState(maxSize, maxSizeBytes, this, mutations, false, null); http://git-wip-us.apache.org/repos/asf/phoenix/blob/cb47eaec/phoenix-core/src/main/java/org/apache/phoenix/compile/ListJarsQueryPlan.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/cb47eaec/phoenix-core/src/main/java/org/apache/phoenix/compile/TraceQueryPlan.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/cb47eaec/phoenix-core/src/main/java/org/apache/phoenix/compile/UpsertCompiler.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/cb47eaec/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java ---------------------------------------------------------------------- diff --cc phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java index cb08b2f,47ad7cf..6277b78 --- a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java @@@ -238,9 -242,7 +238,8 @@@ import org.apache.phoenix.util.UpgradeU import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import com.google.common.annotations.VisibleForTesting; import com.google.common.cache.Cache; +import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.protobuf.ByteString; @@@ -2045,30 -1767,93 +2054,27 @@@ public class MetaDataEndpointImpl exten } } - @VisibleForTesting - static boolean execeededIndexQuota(PTableType tableType, PTable parentTable, Configuration configuration) { - return PTableType.INDEX == tableType && parentTable.getIndexes().size() >= configuration - .getInt(QueryServices.MAX_INDEXES_PER_TABLE, - QueryServicesOptions.DEFAULT_MAX_INDEXES_PER_TABLE); + private boolean execeededIndexQuota(PTableType tableType, PTable parentTable) { + return PTableType.INDEX == tableType && parentTable.getIndexes().size() >= maxIndexesPerTable; } - private static final byte[] CHILD_TABLE_BYTES = new byte[] {PTable.LinkType.CHILD_TABLE.getSerializedValue()}; - - - private void findAllChildViews(Region region, byte[] tenantId, PTable table, - TableViewFinder result, long clientTimeStamp, int clientVersion) throws IOException, SQLException { - TableViewFinder currResult = findChildViews(region, tenantId, table, clientVersion); - result.addResult(currResult); - for (ViewInfo viewInfo : currResult.getViewInfoList()) { - byte[] viewtenantId = viewInfo.getTenantId(); - byte[] viewSchema = viewInfo.getSchemaName(); - byte[] viewTable = viewInfo.getViewName(); - byte[] tableKey = SchemaUtil.getTableKey(viewtenantId, viewSchema, viewTable); - ImmutableBytesPtr cacheKey = new ImmutableBytesPtr(tableKey); - PTable view = loadTable(env, tableKey, cacheKey, clientTimeStamp, clientTimeStamp, clientVersion); - findAllChildViews(region, viewtenantId, view, result, clientTimeStamp, clientVersion); - } - } - - // TODO remove this in 4.13 release - @Deprecated - private TableViewFinder findChildViews_deprecated(Region region, byte[] tenantId, PTable table, byte[] linkTypeBytes) throws IOException { - byte[] schemaName = table.getSchemaName().getBytes(); - byte[] tableName = table.getTableName().getBytes(); - boolean isMultiTenant = table.isMultiTenant(); - Scan scan = new Scan(); - // If the table is multi-tenant, we need to check across all tenant_ids, - // so we can't constrain the row key. Otherwise, any views would have - // the same tenantId. - if (!isMultiTenant) { - byte[] startRow = ByteUtil.concat(tenantId, QueryConstants.SEPARATOR_BYTE_ARRAY); - byte[] stopRow = ByteUtil.nextKey(startRow); - scan.setStartRow(startRow); - scan.setStopRow(stopRow); - } - SingleColumnValueFilter linkFilter = new SingleColumnValueFilter(TABLE_FAMILY_BYTES, LINK_TYPE_BYTES, CompareOp.EQUAL, linkTypeBytes); - SingleColumnValueFilter tableTypeFilter = new SingleColumnValueFilter(TABLE_FAMILY_BYTES, TABLE_TYPE_BYTES, - CompareOp.EQUAL, PTableType.VIEW.getSerializedValue().getBytes()); - tableTypeFilter.setFilterIfMissing(false); - linkFilter.setFilterIfMissing(true); - byte[] suffix = ByteUtil.concat(QueryConstants.SEPARATOR_BYTE_ARRAY, SchemaUtil - .getPhysicalHBaseTableName(schemaName, tableName, table.isNamespaceMapped()) - .getBytes()); - SuffixFilter rowFilter = new SuffixFilter(suffix); - FilterList filter = new FilterList(linkFilter,tableTypeFilter,rowFilter); - scan.setFilter(filter); - scan.addColumn(TABLE_FAMILY_BYTES, LINK_TYPE_BYTES); - scan.addColumn(TABLE_FAMILY_BYTES, TABLE_TYPE_BYTES); - scan.addColumn(TABLE_FAMILY_BYTES, TABLE_SEQ_NUM_BYTES); - - // Original region-only scanner modified due to PHOENIX-1208 - // RegionScanner scanner = region.getScanner(scan); - // The following *should* work, but doesn't due to HBASE-11837 - // TableName systemCatalogTableName = region.getTableDesc().getTableName(); - // HTableInterface hTable = env.getTable(systemCatalogTableName); - // These deprecated calls work around the issue - try (HTableInterface hTable = ServerUtil.getHTableForCoprocessorScan(env, - region.getTableDesc().getTableName().getName())) { - boolean allViewsInCurrentRegion = true; - int numOfChildViews = 0; - List<ViewInfo> viewInfoList = Lists.newArrayList(); - try (ResultScanner scanner = hTable.getScanner(scan)) { - for (Result result = scanner.next(); (result != null); result = scanner.next()) { - numOfChildViews++; - ImmutableBytesWritable ptr = new ImmutableBytesWritable(); - ResultTuple resultTuple = new ResultTuple(result); - resultTuple.getKey(ptr); - byte[] key = ptr.copyBytes(); - if (checkTableKeyInRegion(key, region) != null) { - allViewsInCurrentRegion = false; - } - byte[][] rowKeyMetaData = new byte[3][]; - getVarChars(result.getRow(), 3, rowKeyMetaData); - byte[] viewTenantId = rowKeyMetaData[PhoenixDatabaseMetaData.TENANT_ID_INDEX]; - byte[] viewSchemaName = rowKeyMetaData[PhoenixDatabaseMetaData.SCHEMA_NAME_INDEX]; - byte[] viewName = rowKeyMetaData[PhoenixDatabaseMetaData.TABLE_NAME_INDEX]; - viewInfoList.add(new ViewInfo(viewTenantId, viewSchemaName, viewName)); - } - TableViewFinder tableViewFinderResult = new TableViewFinder(viewInfoList); - if (numOfChildViews > 0 && !allViewsInCurrentRegion) { - tableViewFinderResult.setAllViewsNotInSingleRegion(); - } - return tableViewFinderResult; - } + private void findAncestorViewsOfIndex(byte[] tenantId, byte[] schemaName, byte[] indexName, TableViewFinderResult result) throws IOException { + HTableInterface hTable = env.getTable(SchemaUtil + .getPhysicalTableName(PhoenixDatabaseMetaData.SYSTEM_CATALOG_NAME_BYTES, env.getConfiguration())); + try { + TableViewFinderResult currentResult = ViewFinder.findParentViewofIndex(hTable, tenantId, schemaName, indexName); +// currentResult.addResult(ViewFinder.findBaseTable(hTable, tenantId, schemaName, indexName)); +// if ( currentResult.getResults().size()!=1 ) { +// throw new RuntimeException("View index should have exactly one parent"); +// } + if (currentResult.getResults().size()==1) { + result.addResult(currentResult); + TableInfo tableInfo = currentResult.getResults().get(0); + findAncestorViews(tableInfo.getTenantId(), tableInfo.getSchemaName(), tableInfo.getTableName(), result); + } + // else this is an index on a regular table and so we don't need to combine columns + } finally { + hTable.close(); } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/cb47eaec/phoenix-core/src/main/java/org/apache/phoenix/exception/SQLExceptionCode.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/cb47eaec/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixStatement.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/cb47eaec/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/cb47eaec/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionlessQueryServicesImpl.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/cb47eaec/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/cb47eaec/phoenix-core/src/main/java/org/apache/phoenix/schema/PTable.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/cb47eaec/phoenix-core/src/main/java/org/apache/phoenix/util/IndexUtil.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/cb47eaec/phoenix-core/src/main/java/org/apache/phoenix/util/SchemaUtil.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/cb47eaec/phoenix-core/src/main/java/org/apache/phoenix/util/UpgradeUtil.java ----------------------------------------------------------------------