You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ma...@apache.org on 2016/05/06 14:36:28 UTC

phoenix git commit: Fix QueryPlan.getSourceRefs()

Repository: phoenix
Updated Branches:
  refs/heads/calcite d3b227a18 -> d561370b3


Fix QueryPlan.getSourceRefs()


Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/d561370b
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/d561370b
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/d561370b

Branch: refs/heads/calcite
Commit: d561370b309c95cdd6423fa39784b86152b7baa3
Parents: d3b227a
Author: maryannxue <ma...@gmail.com>
Authored: Fri May 6 10:36:05 2016 -0400
Committer: maryannxue <ma...@gmail.com>
Committed: Fri May 6 10:36:05 2016 -0400

----------------------------------------------------------------------
 .../apache/phoenix/calcite/PhoenixSchema.java   | 50 +++++++-----
 .../apache/phoenix/calcite/PhoenixTable.java    | 14 ++--
 .../apache/phoenix/calcite/TableMapping.java    | 83 +++++++++++---------
 .../calcite/rel/PhoenixServerAggregate.java     |  2 +-
 .../phoenix/calcite/rel/PhoenixTableScan.java   |  6 +-
 .../apache/phoenix/execute/AggregatePlan.java   | 10 +--
 .../apache/phoenix/execute/BaseQueryPlan.java   |  4 +-
 .../phoenix/execute/DegenerateQueryPlan.java    |  2 +-
 .../execute/LiteralResultIterationPlan.java     |  2 +-
 .../org/apache/phoenix/execute/ScanPlan.java    | 10 +--
 .../phoenix/calcite/ToExpressionTest.java       |  4 +-
 11 files changed, 108 insertions(+), 79 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/phoenix/blob/d561370b/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixSchema.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixSchema.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixSchema.java
index 683a16b..46bcaa0 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixSchema.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixSchema.java
@@ -60,7 +60,7 @@ public class PhoenixSchema implements Schema {
     protected final Map<String, Schema> subSchemas;
     protected final Map<String, Table> tables;
     protected final Map<String, Function> views;
-    protected final Set<PTable> viewTables;
+    protected final Set<TableRef> viewTables;
     
     protected PhoenixSchema(String name, String schemaName,
             SchemaPlus parentSchema, PhoenixConnection pc) {
@@ -111,10 +111,10 @@ public class PhoenixSchema implements Schema {
                             ImmutableList.<ColumnDef>of()), pc);
             final List<TableRef> tables = x.getTables();
             assert tables.size() == 1;
-            PTable pTable = tables.get(0).getTable();
-            if (!isView(pTable)) {
-                pTable = fixTableMultiTenancy(pTable);
-                table = new PhoenixTable(pc, pTable);
+            TableRef tableRef = tables.get(0);
+            if (!isView(tableRef.getTable())) {
+                tableRef = fixTableMultiTenancy(tableRef);
+                table = new PhoenixTable(pc, tableRef);
             }
         } catch (TableNotFoundException e) {
         } catch (SQLException e) {
@@ -151,7 +151,8 @@ public class PhoenixSchema implements Schema {
                             ImmutableList.<ColumnDef>of()), pc);
             final List<TableRef> tables = x.getTables();
             assert tables.size() == 1;
-            PTable pTable = tables.get(0).getTable();
+            final TableRef tableRef = tables.get(0);
+            final PTable pTable = tableRef.getTable();
             if (isView(pTable)) {
                 String viewSql = pTable.getViewStatement();
                 if (viewSql == null) {
@@ -166,7 +167,7 @@ public class PhoenixSchema implements Schema {
                         CalciteSchema.from(viewSqlSchema).path(null),
                         pTable.getViewType() == ViewType.UPDATABLE);
                 views.put(name, func);
-                viewTables.add(pTable);
+                viewTables.add(tableRef);
             }
         } catch (TableNotFoundException e) {
         } catch (SQLException e) {
@@ -226,16 +227,23 @@ public class PhoenixSchema implements Schema {
         try {
             for (Table table : tables.values()) {
                 if (table instanceof PhoenixTable) {
-                    PTable pTable = ((PhoenixTable) table).tableMapping.getPTable();
-                    for (PTable index : pTable.getIndexes()) {
-                        addMaterialization(index, path, calciteSchema);
+                    TableRef tableRef = ((PhoenixTable) table).tableMapping.getTableRef();
+                    for (PTable index : tableRef.getTable().getIndexes()) {
+                        TableRef indexTableRef = new TableRef(null, index,
+                                tableRef.getTimeStamp(), tableRef.getLowerBoundTimeStamp(),
+                                false);
+                        addMaterialization(indexTableRef, path, calciteSchema);
                     }
                 }
             }
-            for (PTable pTable : viewTables) {
+            for (TableRef tableRef : viewTables) {
+                final PTable pTable = tableRef.getTable();
                 for (PTable index : pTable.getIndexes()) {
                     if (index.getParentName().equals(pTable.getName())) {
-                        addMaterialization(index, path, calciteSchema);
+                        TableRef indexTableRef = new TableRef(null, index,
+                                tableRef.getTimeStamp(), tableRef.getLowerBoundTimeStamp(),
+                                false);
+                        addMaterialization(indexTableRef, path, calciteSchema);
                     }
                 }                
             }
@@ -244,10 +252,11 @@ public class PhoenixSchema implements Schema {
         }
     }
     
-    private void addMaterialization(PTable index, List<String> path,
+    private void addMaterialization(TableRef indexTableRef, List<String> path,
             CalciteSchema calciteSchema) throws SQLException {
-        index = fixTableMultiTenancy(index);
-        PhoenixTable table = new PhoenixTable(pc, index);
+        indexTableRef = fixTableMultiTenancy(indexTableRef);
+        final PhoenixTable table = new PhoenixTable(pc, indexTableRef);
+        final PTable index = indexTableRef.getTable();
         tables.put(index.getTableName().getString(), table);
         StringBuffer sb = new StringBuffer();
         sb.append("SELECT");
@@ -268,16 +277,19 @@ public class PhoenixSchema implements Schema {
                 && table.getViewType() != ViewType.MAPPED;
     }
     
-    private PTable fixTableMultiTenancy(PTable table) throws SQLException {
-        if (pc.getTenantId() != null || !table.isMultiTenant()) {
-            return table;
+    private TableRef fixTableMultiTenancy(TableRef tableRef) throws SQLException {
+        if (pc.getTenantId() != null || !tableRef.getTable().isMultiTenant()) {
+            return tableRef;
         }
-        return PTableImpl.makePTable(
+        PTable table = tableRef.getTable();
+        table = PTableImpl.makePTable(
                 table.getTenantId(), table.getSchemaName(), table.getTableName(), table.getType(), table.getIndexState(), table.getTimeStamp(),
                 table.getSequenceNumber(), table.getPKName(), table.getBucketNum(), PTableImpl.getColumnsToClone(table), table.getParentSchemaName(), table.getParentTableName(),
                 table.getIndexes(), table.isImmutableRows(), table.getPhysicalNames(), table.getDefaultFamilyName(), table.getViewStatement(),
                 table.isWALDisabled(), false, table.getStoreNulls(), table.getViewType(), table.getViewIndexId(), table.getIndexType(),
                 table.rowKeyOrderOptimizable(), table.isTransactional(), table.getUpdateCacheFrequency(), table.getTableStats(), table.getBaseColumnCount(), table.getIndexDisableTimestamp());
+        return new TableRef(null, table, tableRef.getTimeStamp(),
+                tableRef.getLowerBoundTimeStamp(), tableRef.hasDynamicCols());
     }
     
     private PhoenixSequence resolveSequence(String name) {

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d561370b/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixTable.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixTable.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixTable.java
index 7b5d287..905441f 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixTable.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixTable.java
@@ -20,7 +20,6 @@ import org.apache.calcite.schema.TranslatableTable;
 import org.apache.calcite.schema.impl.AbstractTable;
 import org.apache.calcite.sql.type.SqlTypeName;
 import org.apache.calcite.util.ImmutableBitSet;
-import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.client.Scan;
 import org.apache.hadoop.hbase.util.Pair;
@@ -42,6 +41,7 @@ import org.apache.phoenix.schema.PTable;
 import org.apache.phoenix.schema.SortOrder;
 import org.apache.phoenix.schema.TableRef;
 import org.apache.phoenix.schema.PTable.IndexType;
+import org.apache.phoenix.schema.PTableType;
 import org.apache.phoenix.schema.stats.StatisticsUtil;
 import org.apache.phoenix.schema.types.PDataType;
 import org.apache.phoenix.util.SchemaUtil;
@@ -61,10 +61,11 @@ public class PhoenixTable extends AbstractTable implements TranslatableTable {
   public final long rowCount;
   public final PhoenixConnection pc;
 
-  public PhoenixTable(PhoenixConnection pc, PTable pTable) throws SQLException {
+  public PhoenixTable(PhoenixConnection pc, TableRef tableRef) throws SQLException {
       this.pc = Preconditions.checkNotNull(pc);
-      PTable extendedTable = null;
-      if (pTable.getIndexType() == IndexType.LOCAL) {
+      PTable pTable = tableRef.getTable();
+      TableRef dataTable = null;
+      if (pTable.getType() == PTableType.INDEX) {
           ColumnResolver x = FromCompiler.getResolver(
                   NamedTableNode.create(null,
                           TableName.create(pTable.getParentSchemaName().getString(),
@@ -72,9 +73,9 @@ public class PhoenixTable extends AbstractTable implements TranslatableTable {
                           ImmutableList.<ColumnDef>of()), pc);
           final List<TableRef> tables = x.getTables();
           assert tables.size() == 1;
-          extendedTable = tables.get(0).getTable();          
+          dataTable = tables.get(0);          
       }
-      this.tableMapping = extendedTable == null ? new TableMapping(pTable) : new TableMapping(pTable, extendedTable);
+      this.tableMapping = new TableMapping(tableRef, dataTable, pTable.getIndexType() == IndexType.LOCAL);
       List<Integer> pkPositions = Lists.<Integer> newArrayList();
       List<RelFieldCollation> fieldCollations = Lists.<RelFieldCollation> newArrayList();
       final List<PColumn> columns = tableMapping.getMappedColumns();
@@ -90,7 +91,6 @@ public class PhoenixTable extends AbstractTable implements TranslatableTable {
       this.collation = RelCollationTraitDef.INSTANCE.canonize(RelCollations.of(fieldCollations));
       try {
           PhoenixStatement stmt = new PhoenixStatement(pc);
-          TableRef tableRef = new TableRef(CalciteUtils.createTempAlias(), pTable, HConstants.LATEST_TIMESTAMP, false);
           ColumnResolver resolver = FromCompiler.getResolver(tableRef);
           StatementContext context = new StatementContext(stmt, resolver, new Scan(), new SequenceManager(stmt));
           Pair<Long, Long> estimatedCount = BaseResultIterators.getEstimatedCount(context, pTable);

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d561370b/phoenix-core/src/main/java/org/apache/phoenix/calcite/TableMapping.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/TableMapping.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/TableMapping.java
index 839370d..ccf460f 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/TableMapping.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/TableMapping.java
@@ -50,53 +50,62 @@ import com.google.common.collect.Sets;
 
 public class TableMapping {
     private final TableRef tableRef;
+    private final TableRef dataTableRef;
     private final List<PColumn> mappedColumns;
     private final int extendedColumnsOffset;
     private final TableRef extendedTableRef;
 
     public TableMapping(PTable table) {
         this.tableRef = new TableRef(table);
+        this.dataTableRef = null;
         this.mappedColumns = getMappedColumns(table);
         this.extendedColumnsOffset = mappedColumns.size();
         this.extendedTableRef = null;
     }
 
-    public TableMapping(PTable table, PTable dataTable) throws SQLException {
-        this.tableRef = new TableRef(table);
-        this.mappedColumns = Lists.newArrayList();
-        this.mappedColumns.addAll(getMappedColumns(table));
-        this.extendedColumnsOffset = mappedColumns.size();
-        Set<String> names = Sets.newHashSet();
-        for (PColumn column : this.mappedColumns) {
-            names.add(column.getName().getString());
-        }
-        TableRef dataTableRef = new TableRef(dataTable);
-        List<PColumn> projectedColumns = new ArrayList<PColumn>();
-        for (PColumn sourceColumn : dataTable.getColumns()) {
-            if (!SchemaUtil.isPKColumn(sourceColumn)) {
-                String colName = IndexUtil.getIndexColumnName(sourceColumn);
-                if (!names.contains(colName)) {
-                    ColumnRef sourceColumnRef =
-                            new ColumnRef(dataTableRef, sourceColumn.getPosition());
-                    PColumn column = new ProjectedColumn(PNameFactory.newName(colName),
-                            sourceColumn.getFamilyName(), projectedColumns.size(),
-                            sourceColumn.isNullable(), sourceColumnRef);
-                    projectedColumns.add(column);
-                }
-            }            
+    public TableMapping(TableRef tableRef, TableRef dataTableRef, boolean extend) throws SQLException {
+        this.tableRef = tableRef;
+        this.dataTableRef = dataTableRef;
+        if (!extend) {
+            this.mappedColumns = getMappedColumns(tableRef.getTable());
+            this.extendedColumnsOffset = mappedColumns.size();
+            this.extendedTableRef = null;            
+        } else {
+            this.mappedColumns = Lists.newArrayList();
+            this.mappedColumns.addAll(getMappedColumns(tableRef.getTable()));
+            this.extendedColumnsOffset = mappedColumns.size();
+            Set<String> names = Sets.newHashSet();
+            for (PColumn column : this.mappedColumns) {
+                names.add(column.getName().getString());
+            }
+            PTable dataTable = dataTableRef.getTable();
+            List<PColumn> projectedColumns = new ArrayList<PColumn>();
+            for (PColumn sourceColumn : dataTable.getColumns()) {
+                if (!SchemaUtil.isPKColumn(sourceColumn)) {
+                    String colName = IndexUtil.getIndexColumnName(sourceColumn);
+                    if (!names.contains(colName)) {
+                        ColumnRef sourceColumnRef =
+                                new ColumnRef(dataTableRef, sourceColumn.getPosition());
+                        PColumn column = new ProjectedColumn(PNameFactory.newName(colName),
+                                sourceColumn.getFamilyName(), projectedColumns.size(),
+                                sourceColumn.isNullable(), sourceColumnRef);
+                        projectedColumns.add(column);
+                    }
+                }            
+            }
+            this.mappedColumns.addAll(projectedColumns);
+            PTable extendedTable = PTableImpl.makePTable(dataTable.getTenantId(),
+                    TupleProjectionCompiler.PROJECTED_TABLE_SCHEMA, dataTable.getName(),
+                    PTableType.PROJECTED, null, dataTable.getTimeStamp(),
+                    dataTable.getSequenceNumber(), dataTable.getPKName(), null,
+                    projectedColumns, null, null, Collections.<PTable>emptyList(),
+                    dataTable.isImmutableRows(), Collections.<PName>emptyList(), null, null,
+                    dataTable.isWALDisabled(), false, dataTable.getStoreNulls(),
+                    dataTable.getViewType(), null, null, dataTable.rowKeyOrderOptimizable(),
+                    dataTable.isTransactional(), dataTable.getUpdateCacheFrequency(),
+                    dataTable.getIndexDisableTimestamp());
+            this.extendedTableRef = new TableRef(extendedTable);
         }
-        this.mappedColumns.addAll(projectedColumns);
-        PTable extendedTable = PTableImpl.makePTable(dataTable.getTenantId(),
-                TupleProjectionCompiler.PROJECTED_TABLE_SCHEMA, dataTable.getName(),
-                PTableType.PROJECTED, null, dataTable.getTimeStamp(),
-                dataTable.getSequenceNumber(), dataTable.getPKName(), null,
-                projectedColumns, null, null, Collections.<PTable>emptyList(),
-                dataTable.isImmutableRows(), Collections.<PName>emptyList(), null, null,
-                dataTable.isWALDisabled(), false, dataTable.getStoreNulls(),
-                dataTable.getViewType(), null, null, dataTable.rowKeyOrderOptimizable(),
-                dataTable.isTransactional(), dataTable.getUpdateCacheFrequency(),
-                dataTable.getIndexDisableTimestamp());
-        this.extendedTableRef = new TableRef(extendedTable);
     }
     
     public TableRef getTableRef() {
@@ -107,6 +116,10 @@ public class TableMapping {
         return tableRef.getTable();
     }
     
+    public TableRef getDataTableRef() {
+        return dataTableRef;
+    }
+    
     public List<PColumn> getMappedColumns() {
         return mappedColumns;
     }

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d561370b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixServerAggregate.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixServerAggregate.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixServerAggregate.java
index 65cca2e..4177764 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixServerAggregate.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixServerAggregate.java
@@ -78,7 +78,7 @@ public class PhoenixServerAggregate extends PhoenixAbstractAggregate {
         GroupBy groupBy = super.getGroupBy(implementor);       
         super.serializeAggregators(implementor, context, groupBy.isEmpty());
         
-        QueryPlan aggPlan = new AggregatePlan(context, basePlan.getStatement(), basePlan.getTableRef(), RowProjector.EMPTY_PROJECTOR, null, null, OrderBy.EMPTY_ORDER_BY, null, groupBy, null, basePlan.getDynamicFilter());
+        QueryPlan aggPlan = new AggregatePlan(context, basePlan.getStatement(), basePlan.getTableRef(), basePlan.getSourceRefs().iterator().next(), RowProjector.EMPTY_PROJECTOR, null, null, OrderBy.EMPTY_ORDER_BY, null, groupBy, null, basePlan.getDynamicFilter());
         if (hashJoinPlan != null) {        
             aggPlan = HashJoinPlan.create(hashJoinPlan.getStatement(), aggPlan, hashJoinPlan.getJoinInfo(), hashJoinPlan.getSubPlans());
         }

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d561370b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixTableScan.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixTableScan.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixTableScan.java
index b4d64b1..76e9a4d 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixTableScan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixTableScan.java
@@ -46,6 +46,7 @@ import org.apache.phoenix.query.QueryServicesOptions;
 import org.apache.phoenix.schema.PColumn;
 import org.apache.phoenix.schema.PName;
 import org.apache.phoenix.schema.PTable;
+import org.apache.phoenix.schema.TableRef;
 import org.apache.phoenix.schema.types.PDataType;
 import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableList;
@@ -285,7 +286,10 @@ public class PhoenixTableScan extends TableScan implements PhoenixQueryRel {
                               OrderBy.FWD_ROW_KEY_ORDER_BY
                             : OrderBy.REV_ROW_KEY_ORDER_BY);
             ParallelIteratorFactory iteratorFactory = null;
-            return new ScanPlan(context, select, tableMapping.getTableRef(), RowProjector.EMPTY_PROJECTOR, null, null, orderBy, iteratorFactory, true, dynamicFilter);
+            TableRef tableRef = tableMapping.getTableRef();
+            TableRef srcRef = tableMapping.getDataTableRef() == null ?
+                    tableRef : tableMapping.getDataTableRef();
+            return new ScanPlan(context, select, tableRef, srcRef, RowProjector.EMPTY_PROJECTOR, null, null, orderBy, iteratorFactory, true, dynamicFilter);
         } catch (SQLException e) {
             throw new RuntimeException(e);
         }

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d561370b/phoenix-core/src/main/java/org/apache/phoenix/execute/AggregatePlan.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/AggregatePlan.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/AggregatePlan.java
index e5ea255..5ab8e3a 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/execute/AggregatePlan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/AggregatePlan.java
@@ -79,21 +79,21 @@ public class AggregatePlan extends BaseQueryPlan {
     private List<List<Scan>> scans;
     
     public static AggregatePlan create(AggregatePlan plan, OrderBy newOrderBy) {
-        return new AggregatePlan(plan.getContext(), plan.getStatement(), plan.getTableRef(), plan.getProjector(), null, null, newOrderBy, plan.parallelIteratorFactory, plan.getGroupBy(), plan.getHaving(), plan.dynamicFilter);
+        return new AggregatePlan(plan.getContext(), plan.getStatement(), plan.getTableRef(), plan.getSourceRefs().iterator().next(), plan.getProjector(), null, null, newOrderBy, plan.parallelIteratorFactory, plan.getGroupBy(), plan.getHaving(), plan.dynamicFilter);
     }
 
     public AggregatePlan(StatementContext context, FilterableStatement statement, TableRef table,
             RowProjector projector, Integer limit, Integer offset, OrderBy orderBy,
             ParallelIteratorFactory parallelIteratorFactory, GroupBy groupBy, Expression having) {
-        this(context, statement, table, projector, limit, offset, orderBy, parallelIteratorFactory, groupBy, having,
+        this(context, statement, table, table, projector, limit, offset, orderBy, parallelIteratorFactory, groupBy, having,
                 null);
     }
 
     public AggregatePlan(StatementContext context, FilterableStatement statement, TableRef table,
-            RowProjector projector, Integer limit, Integer offset, OrderBy orderBy,
+            TableRef srcRef, RowProjector projector, Integer limit, Integer offset, OrderBy orderBy,
             ParallelIteratorFactory parallelIteratorFactory, GroupBy groupBy, Expression having,
             Expression dynamicFilter) {
-        super(context, statement, table, projector, context.getBindManager().getParameterMetaData(), limit, offset,
+        super(context, statement, table, srcRef, projector, context.getBindManager().getParameterMetaData(), limit, offset,
                 orderBy, groupBy, parallelIteratorFactory, dynamicFilter);
         this.having = having;
         this.aggregators = context.getAggregationManager().getAggregators();
@@ -260,7 +260,7 @@ public class AggregatePlan extends BaseQueryPlan {
         if (limit == this.limit || (limit != null && limit.equals(this.limit)))
             return this;
         
-        return new AggregatePlan(this.context, this.statement, this.tableRef, this.projection,
+        return new AggregatePlan(this.context, this.statement, this.tableRef, this.tableRefs.iterator().next(), this.projection,
             limit, this.offset, this.orderBy, this.parallelIteratorFactory, this.groupBy, this.having, this.dynamicFilter);
     }
 }

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d561370b/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java
index c5c9a0e..206a11f 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java
@@ -112,14 +112,14 @@ public abstract class BaseQueryPlan implements QueryPlan {
     
 
     protected BaseQueryPlan(
-            StatementContext context, FilterableStatement statement, TableRef table,
+            StatementContext context, FilterableStatement statement, TableRef table, TableRef srcRef,
             RowProjector projection, ParameterMetaData paramMetaData, Integer limit, Integer offset, OrderBy orderBy,
             GroupBy groupBy, ParallelIteratorFactory parallelIteratorFactory,
             Expression dynamicFilter) {
         this.context = context;
         this.statement = statement;
         this.tableRef = table;
-        this.tableRefs = ImmutableSet.of(table);
+        this.tableRefs = ImmutableSet.of(srcRef);
         this.projection = projection;
         this.paramMetaData = paramMetaData;
         this.limit = limit;

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d561370b/phoenix-core/src/main/java/org/apache/phoenix/execute/DegenerateQueryPlan.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/DegenerateQueryPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/DegenerateQueryPlan.java
index dbda84a..8f4711c 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/execute/DegenerateQueryPlan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/DegenerateQueryPlan.java
@@ -38,7 +38,7 @@ import org.apache.phoenix.schema.TableRef;
 public class DegenerateQueryPlan extends BaseQueryPlan {
 
     public DegenerateQueryPlan(StatementContext context, FilterableStatement statement, TableRef table) {
-        super(context, statement, table, RowProjector.EMPTY_PROJECTOR, PhoenixParameterMetaData.EMPTY_PARAMETER_META_DATA, null,null, OrderBy.EMPTY_ORDER_BY, GroupBy.EMPTY_GROUP_BY, null, null);
+        super(context, statement, table, table, RowProjector.EMPTY_PROJECTOR, PhoenixParameterMetaData.EMPTY_PARAMETER_META_DATA, null,null, OrderBy.EMPTY_ORDER_BY, GroupBy.EMPTY_GROUP_BY, null, null);
         context.setScanRanges(ScanRanges.NOTHING);
     }
 

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d561370b/phoenix-core/src/main/java/org/apache/phoenix/execute/LiteralResultIterationPlan.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/LiteralResultIterationPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/LiteralResultIterationPlan.java
index 055c802..63acaff 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/execute/LiteralResultIterationPlan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/LiteralResultIterationPlan.java
@@ -52,7 +52,7 @@ public class LiteralResultIterationPlan extends BaseQueryPlan {
     public LiteralResultIterationPlan(Iterable<Tuple> tuples, StatementContext context, 
             FilterableStatement statement, TableRef tableRef, RowProjector projection, 
             Integer limit, Integer offset, OrderBy orderBy, ParallelIteratorFactory parallelIteratorFactory) {
-        super(context, statement, tableRef, projection, context.getBindManager().getParameterMetaData(), limit, offset, orderBy, GroupBy.EMPTY_GROUP_BY, parallelIteratorFactory, null);
+        super(context, statement, tableRef, tableRef, projection, context.getBindManager().getParameterMetaData(), limit, offset, orderBy, GroupBy.EMPTY_GROUP_BY, parallelIteratorFactory, null);
         this.tuples = tuples;
     }
 

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d561370b/phoenix-core/src/main/java/org/apache/phoenix/execute/ScanPlan.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/ScanPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/ScanPlan.java
index 581dc05..b085f08 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/execute/ScanPlan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/ScanPlan.java
@@ -83,15 +83,15 @@ public class ScanPlan extends BaseQueryPlan {
     private boolean allowPageFilter;
 
     public static ScanPlan create(ScanPlan plan, OrderBy newOrderBy) throws SQLException {
-        return new ScanPlan(plan.getContext(), plan.getStatement(), plan.getTableRef(), plan.getProjector(), null, null, newOrderBy, plan.parallelIteratorFactory, plan.allowPageFilter, plan.dynamicFilter);
+        return new ScanPlan(plan.getContext(), plan.getStatement(), plan.getTableRef(), plan.getSourceRefs().iterator().next(), plan.getProjector(), null, null, newOrderBy, plan.parallelIteratorFactory, plan.allowPageFilter, plan.dynamicFilter);
     }
     
     public ScanPlan(StatementContext context, FilterableStatement statement, TableRef table, RowProjector projector, Integer limit, Integer offset, OrderBy orderBy, ParallelIteratorFactory parallelIteratorFactory, boolean allowPageFilter) throws SQLException {
-        this(context, statement, table, projector, limit, offset, orderBy, parallelIteratorFactory, allowPageFilter, null);
+        this(context, statement, table, table, projector, limit, offset, orderBy, parallelIteratorFactory, allowPageFilter, null);
     }
     
-    public ScanPlan(StatementContext context, FilterableStatement statement, TableRef table, RowProjector projector, Integer limit, Integer offset, OrderBy orderBy, ParallelIteratorFactory parallelIteratorFactory, boolean allowPageFilter, Expression dynamicFilter) throws SQLException {
-        super(context, statement, table, projector, context.getBindManager().getParameterMetaData(), limit,offset, orderBy, GroupBy.EMPTY_GROUP_BY,
+    public ScanPlan(StatementContext context, FilterableStatement statement, TableRef table, TableRef srcRef, RowProjector projector, Integer limit, Integer offset, OrderBy orderBy, ParallelIteratorFactory parallelIteratorFactory, boolean allowPageFilter, Expression dynamicFilter) throws SQLException {
+        super(context, statement, table, srcRef, projector, context.getBindManager().getParameterMetaData(), limit,offset, orderBy, GroupBy.EMPTY_GROUP_BY,
                 parallelIteratorFactory != null ? parallelIteratorFactory :
                         buildResultIteratorFactory(context, statement, table, orderBy, limit, offset, allowPageFilter), dynamicFilter);
         this.allowPageFilter = allowPageFilter;
@@ -271,7 +271,7 @@ public class ScanPlan extends BaseQueryPlan {
             return this;
         
         try {
-            return new ScanPlan(this.context, this.statement, this.tableRef, this.projection, 
+            return new ScanPlan(this.context, this.statement, this.tableRef, this.tableRefs.iterator().next(), this.projection, 
                     limit, this.offset, this.orderBy, this.parallelIteratorFactory, this.allowPageFilter, this.dynamicFilter);
         } catch (SQLException e) {
             throw new RuntimeException(e);

http://git-wip-us.apache.org/repos/asf/phoenix/blob/d561370b/phoenix-core/src/test/java/org/apache/phoenix/calcite/ToExpressionTest.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/calcite/ToExpressionTest.java b/phoenix-core/src/test/java/org/apache/phoenix/calcite/ToExpressionTest.java
index e49df4a..5917617 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/calcite/ToExpressionTest.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/calcite/ToExpressionTest.java
@@ -40,7 +40,7 @@ import org.apache.phoenix.query.BaseConnectionlessQueryTest;
 import org.apache.phoenix.schema.PName;
 import org.apache.phoenix.schema.PTable;
 import org.apache.phoenix.schema.PTableKey;
-
+import org.apache.phoenix.schema.TableRef;
 import org.junit.Test;
 
 
@@ -167,7 +167,7 @@ public class ToExpressionTest extends BaseConnectionlessQueryTest {
             
             PTable table = rootTables.get(name);
             try {
-                return new PhoenixTable(pc, table);
+                return new PhoenixTable(pc, new TableRef(table));
             } catch (SQLException e) {
                 throw new RuntimeException(e);
             }