Repository: phoenix Updated Branches: refs/heads/4.0 4d58ef05a -> 73d7275c3
PHOENIX-1588 Fix for TableNotFoundException when optimizing SELECT * FROM a tenant-specific table Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/73d7275c Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/73d7275c Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/73d7275c Branch: refs/heads/4.0 Commit: 73d7275c36a924dac54b660cb0bb33d108fcae2b Parents: 4d58ef0 Author: Thomas D'Silva <twdsi...@gmail.com> Authored: Tue Feb 10 21:06:43 2015 -0800 Committer: Thomas <tdsi...@salesforce.com> Committed: Thu Feb 12 14:39:50 2015 -0800 ---------------------------------------------------------------------- .../index/GlobalIndexOptimizationIT.java | 2 +- .../phoenix/compile/ProjectionCompiler.java | 28 ++++++++++++++------ 2 files changed, 21 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/73d7275c/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalIndexOptimizationIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalIndexOptimizationIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalIndexOptimizationIT.java index e4ba2c6..7fb879e 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalIndexOptimizationIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalIndexOptimizationIT.java @@ -105,7 +105,7 @@ public class GlobalIndexOptimizationIT extends BaseHBaseManagedTimeIT { conn1.commit(); createIndex(TestUtil.DEFAULT_INDEX_TABLE_NAME, TestUtil.DEFAULT_DATA_TABLE_NAME, "v1"); - String query = "SELECT /*+ INDEX(" + TestUtil.DEFAULT_DATA_TABLE_NAME + " " + TestUtil.DEFAULT_INDEX_TABLE_NAME + ")*/ t_id, k1, k2, k3, V1 FROM " + TestUtil.DEFAULT_DATA_TABLE_NAME +" where v1='a'"; + String query = "SELECT /*+ INDEX(" + TestUtil.DEFAULT_DATA_TABLE_NAME + " " + TestUtil.DEFAULT_INDEX_TABLE_NAME + ")*/ * FROM " + TestUtil.DEFAULT_DATA_TABLE_NAME +" where v1='a'"; ResultSet rs = conn1.createStatement().executeQuery("EXPLAIN "+ query); String expected = http://git-wip-us.apache.org/repos/asf/phoenix/blob/73d7275c/phoenix-core/src/main/java/org/apache/phoenix/compile/ProjectionCompiler.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/ProjectionCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/ProjectionCompiler.java index 6b518b9..27fe0f9 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/ProjectionCompiler.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/ProjectionCompiler.java @@ -74,6 +74,7 @@ import org.apache.phoenix.schema.PColumnFamily; import org.apache.phoenix.schema.PDatum; import org.apache.phoenix.schema.PName; import org.apache.phoenix.schema.PTable; +import org.apache.phoenix.schema.TableNotFoundException; import org.apache.phoenix.schema.PTable.IndexType; import org.apache.phoenix.schema.PTable.ViewType; import org.apache.phoenix.schema.PTableKey; @@ -170,24 +171,35 @@ public class ProjectionCompiler { PhoenixConnection conn = context.getConnection(); PName tenantId = conn.getTenantId(); String tableName = index.getParentName().getString(); - PTable table = conn.getMetaDataCache().getTable(new PTableKey(tenantId, tableName)); - int tableOffset = table.getBucketNum() == null ? 0 : 1; - int minTablePKOffset = getMinPKOffset(table, tenantId); + PTable dataTable = null; + try { + dataTable = conn.getMetaDataCache().getTable(new PTableKey(tenantId, tableName)); + } catch (TableNotFoundException e) { + if (tenantId != null) { + // Check with null tenantId + dataTable = conn.getMetaDataCache().getTable(new PTableKey(null, tableName)); + } + else { + throw e; + } + } + int tableOffset = dataTable.getBucketNum() == null ? 0 : 1; + int minTablePKOffset = getMinPKOffset(dataTable, tenantId); int minIndexPKOffset = getMinPKOffset(index, tenantId); if (index.getIndexType() != IndexType.LOCAL) { - if (index.getColumns().size()-minIndexPKOffset != table.getColumns().size()-minTablePKOffset) { + if (index.getColumns().size()-minIndexPKOffset != dataTable.getColumns().size()-minTablePKOffset) { // We'll end up not using this by the optimizer, so just throw throw new ColumnNotFoundException(WildcardParseNode.INSTANCE.toString()); } } - for (int i = tableOffset, j = tableOffset; i < table.getColumns().size(); i++) { - PColumn column = table.getColumns().get(i); + for (int i = tableOffset, j = tableOffset; i < dataTable.getColumns().size(); i++) { + PColumn column = dataTable.getColumns().get(i); // Skip tenant ID column (which may not be the first column, but is the first PK column) if (SchemaUtil.isPKColumn(column) && j++ < minTablePKOffset) { tableOffset++; continue; } - PColumn tableColumn = table.getColumns().get(i); + PColumn tableColumn = dataTable.getColumns().get(i); String indexColName = IndexUtil.getIndexColumnName(tableColumn); PColumn indexColumn = null; ColumnRef ref = null; @@ -221,7 +233,7 @@ public class ProjectionCompiler { // appear as a column in an index projectedExpressions.add(expression); boolean isCaseSensitive = !SchemaUtil.normalizeIdentifier(colName).equals(colName); - ExpressionProjector projector = new ExpressionProjector(colName, tableRef.getTableAlias() == null ? table.getName().getString() : tableRef.getTableAlias(), expression, isCaseSensitive); + ExpressionProjector projector = new ExpressionProjector(colName, tableRef.getTableAlias() == null ? dataTable.getName().getString() : tableRef.getTableAlias(), expression, isCaseSensitive); projectedColumns.add(projector); } }