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 2014/02/05 01:42:43 UTC

[1/3] Fix join query does not work with case-sensitive tables; Fix column labels in wild-card select after being index-optimized; Fix BaseConnectedQueryTest.dropPriorTables() failure with case-sensitive tables

Updated Branches:
  refs/heads/master d3f2b65ce -> 47707a7a7


http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/c3bb6943/phoenix-core/src/test/java/org/apache/phoenix/query/BaseTest.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/query/BaseTest.java b/phoenix-core/src/test/java/org/apache/phoenix/query/BaseTest.java
index 2c80212..cd92569 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/query/BaseTest.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/query/BaseTest.java
@@ -322,33 +322,33 @@ public abstract class BaseTest {
         builder.put("SumDoubleTest","create table SumDoubleTest" +
                 "   (id varchar not null primary key, d DOUBLE, f FLOAT, ud UNSIGNED_DOUBLE, uf UNSIGNED_FLOAT, i integer, de decimal)");
         builder.put(JOIN_ORDER_TABLE, "create table " + JOIN_ORDER_TABLE +
-                "   (order_id char(15) not null primary key, " +
-                "    customer_id char(10) not null, " +
-                "    item_id char(10) not null, " +
+                "   (\"order_id\" char(15) not null primary key, " +
+                "    \"customer_id\" char(10) not null, " +
+                "    \"item_id\" char(10) not null, " +
                 "    price integer not null, " +
                 "    quantity integer not null, " +
                 "    date timestamp not null)");
         builder.put(JOIN_CUSTOMER_TABLE, "create table " + JOIN_CUSTOMER_TABLE +
-                "   (customer_id char(10) not null primary key, " +
+                "   (\"customer_id\" char(10) not null primary key, " +
                 "    name varchar not null, " +
                 "    phone char(12), " +
                 "    address varchar, " +
                 "    loc_id char(5), " +
                 "    date date)");
         builder.put(JOIN_ITEM_TABLE, "create table " + JOIN_ITEM_TABLE +
-                "   (item_id char(10) not null primary key, " +
+                "   (\"item_id\" char(10) not null primary key, " +
                 "    name varchar not null, " +
-                "    price integer not null, " +
-                "    discount1 integer not null, " +
-                "    discount2 integer not null, " +
-                "    supplier_id char(10) not null, " +
+                "    price integer, " +
+                "    discount1 integer, " +
+                "    discount2 integer, " +
+                "    \"supplier_id\" char(10), " +
                 "    description varchar)");
         builder.put(JOIN_SUPPLIER_TABLE, "create table " + JOIN_SUPPLIER_TABLE +
-                "   (supplier_id char(10) not null primary key, " +
+                "   (\"supplier_id\" char(10) not null primary key, " +
                 "    name varchar not null, " +
                 "    phone char(12), " +
                 "    address varchar, " +
-    			"    loc_id char(5))");
+                "    loc_id char(5))");
         tableDDLMap = builder.build();
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/c3bb6943/phoenix-core/src/test/java/org/apache/phoenix/util/TestUtil.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/util/TestUtil.java b/phoenix-core/src/test/java/org/apache/phoenix/util/TestUtil.java
index f273b70..0674b56 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/util/TestUtil.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/util/TestUtil.java
@@ -163,11 +163,15 @@ public class TestUtil {
     public static final String INDEX_DATA_SCHEMA = "INDEX_TEST";
     public static final String INDEX_DATA_TABLE = "INDEX_DATA_TABLE";
     public static final String MUTABLE_INDEX_DATA_TABLE = "MUTABLE_INDEX_DATA_TABLE";
-    public static final String JOIN_ORDER_TABLE = "JOIN_ORDER_TABLE";
-    public static final String JOIN_CUSTOMER_TABLE = "JOIN_CUSTOMER_TABLE";
-    public static final String JOIN_ITEM_TABLE = "JOIN_ITEM_TABLE";
-    public static final String JOIN_SUPPLIER_TABLE = "JOIN_SUPPLIER_TABLE";
-
+    public static final String JOIN_ORDER_TABLE_NORMALIZED = "joinOrderTable";
+    public static final String JOIN_CUSTOMER_TABLE_NORMALIZED = "joinCustomerTable";
+    public static final String JOIN_ITEM_TABLE_NORMALIZED = "joinItemTable";
+    public static final String JOIN_SUPPLIER_TABLE_NORMALIZED = "joinSupplierTable";
+    public static final String JOIN_ORDER_TABLE = '"' + JOIN_ORDER_TABLE_NORMALIZED + '"';
+    public static final String JOIN_CUSTOMER_TABLE = '"' + JOIN_CUSTOMER_TABLE_NORMALIZED + '"';
+    public static final String JOIN_ITEM_TABLE = '"' + JOIN_ITEM_TABLE_NORMALIZED + '"';
+    public static final String JOIN_SUPPLIER_TABLE = '"' + JOIN_SUPPLIER_TABLE_NORMALIZED + '"';
+ 
     public static final Properties TEST_PROPERTIES = new Properties();
 
     public static byte[][] getSplits(String tenantId) {


[2/3] git commit: Fix join query does not work with case-sensitive tables; Fix column labels in wild-card select after being index-optimized; Fix BaseConnectedQueryTest.dropPriorTables() failure with case-sensitive tables

Posted by ma...@apache.org.
Fix join query does not work with case-sensitive tables; Fix column labels in wild-card select after being index-optimized; Fix BaseConnectedQueryTest.dropPriorTables() failure with case-sensitive tables


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

Branch: refs/heads/master
Commit: c3bb6943b5e1beb2e821ebccab62e6c619f4e3d5
Parents: 334b836
Author: maryannxue <ma...@apache.org>
Authored: Tue Feb 4 19:39:27 2014 -0500
Committer: maryannxue <ma...@apache.org>
Committed: Tue Feb 4 19:39:27 2014 -0500

----------------------------------------------------------------------
 .../phoenix/compile/IndexStatementRewriter.java |  11 +-
 .../apache/phoenix/compile/JoinCompiler.java    |  75 +++--
 .../apache/phoenix/compile/QueryCompiler.java   |   9 +-
 .../phoenix/compile/StatementNormalizer.java    |   5 +-
 .../phoenix/coprocessor/ScanProjector.java      | 202 -----------
 .../org/apache/phoenix/parse/BindTableNode.java |  11 +-
 .../apache/phoenix/parse/ConcreteTableNode.java |   7 +-
 .../org/apache/phoenix/parse/JoinTableNode.java |   3 +-
 .../apache/phoenix/parse/NamedTableNode.java    |  13 +-
 .../org/apache/phoenix/parse/TableNode.java     |  11 +
 .../phoenix/compile/JoinQueryCompileTest.java   |  28 +-
 .../phoenix/end2end/BaseConnectedQueryTest.java |   4 +-
 .../apache/phoenix/end2end/HashJoinTest.java    | 331 +++++++++----------
 .../java/org/apache/phoenix/query/BaseTest.java |  22 +-
 .../java/org/apache/phoenix/util/TestUtil.java  |  14 +-
 15 files changed, 296 insertions(+), 450 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/c3bb6943/phoenix-core/src/main/java/org/apache/phoenix/compile/IndexStatementRewriter.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/IndexStatementRewriter.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/IndexStatementRewriter.java
index 99b653c..66349f7 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/compile/IndexStatementRewriter.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/IndexStatementRewriter.java
@@ -62,12 +62,10 @@ public class IndexStatementRewriter extends ParseNodeRewriter {
                 return node;
             
             if (origRef.getTableAlias() != null) {
-                tName = FACTORY.table(null, origRef.getTableAlias());
+                tName = TableName.create(null, origRef.getTableAlias());
             } else {
                 String schemaName = tableRef.getTable().getSchemaName().getString();
-                schemaName = schemaName.length() == 0 ? null : '"' + schemaName + '"';
-                String tableName = '"' + tableRef.getTable().getTableName().getString() + '"';
-                tName = FACTORY.table(schemaName, tableName);
+                tName = TableName.create(schemaName.length() == 0 ? null : schemaName, tableRef.getTable().getTableName().getString());
             }
         }
         String indexColName = IndexUtil.getIndexColumnName(dataColRef.getColumn());
@@ -92,12 +90,13 @@ public class IndexStatementRewriter extends ParseNodeRewriter {
 
     @Override
     public ParseNode visit(WildcardParseNode node) throws SQLException {
-        return WildcardParseNode.REWRITE_INSTANCE;
+        return multiTableRewriteMap != null ? node : WildcardParseNode.REWRITE_INSTANCE;
     }
 
     @Override
     public ParseNode visit(FamilyWildcardParseNode node) throws SQLException {
-        return new FamilyWildcardParseNode(node, true);
+        return multiTableRewriteMap != null ? node : new FamilyWildcardParseNode(node, true);
     }
     
 }
+

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/c3bb6943/phoenix-core/src/main/java/org/apache/phoenix/compile/JoinCompiler.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/JoinCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/JoinCompiler.java
index 91652bf..5f327e4 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/compile/JoinCompiler.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/JoinCompiler.java
@@ -84,6 +84,7 @@ import org.apache.phoenix.schema.PTable;
 import org.apache.phoenix.schema.PTableImpl;
 import org.apache.phoenix.schema.PTableType;
 import org.apache.phoenix.schema.TableRef;
+import org.apache.phoenix.util.IndexUtil;
 import org.apache.phoenix.util.SchemaUtil;
 
 import com.google.common.collect.ArrayListMultimap;
@@ -101,6 +102,7 @@ public class JoinCompiler {
     }
     
     public static class JoinSpec {
+        private TableNode mainTableNode;
         private TableRef mainTable;
         private List<AliasedNode> select; // all basic nodes related to mainTable, no aggregation.
         private List<ParseNode> preFilters;
@@ -115,7 +117,7 @@ public class JoinCompiler {
             assert (tableNodes.size() > 1);
             Iterator<TableNode> iter = tableNodes.iterator();
             Iterator<TableRef> tableRefIter = resolver.getTables().iterator();
-            iter.next();
+            this.mainTableNode = iter.next();
             this.mainTable = tableRefIter.next();
             this.select = extractFromSelect(selectList, mainTable, resolver);
             this.joinTables = new ArrayList<JoinTable>(tableNodes.size() - 1);
@@ -131,7 +133,7 @@ public class JoinCompiler {
             while (iter.hasNext()) {
                 tableNode = iter.next();
                 if (!(tableNode instanceof JoinTableNode))
-                    throw new SQLFeatureNotSupportedException("Full joins not supported.");
+                    throw new SQLFeatureNotSupportedException("Implicit joins not supported.");
                 JoinTableNode joinTableNode = (JoinTableNode) tableNode;
                 JoinTable joinTable = new JoinTable(joinTableNode, tableRefIter.next(), selectList, resolver);
                 for (ParseNode condition : joinTable.conditions) {
@@ -203,8 +205,9 @@ public class JoinCompiler {
             }            
         }
         
-        private JoinSpec(TableRef table, List<AliasedNode> select, List<ParseNode> preFilters, 
+        private JoinSpec(TableNode tableNode, TableRef table, List<AliasedNode> select, List<ParseNode> preFilters, 
                 List<ParseNode> postFilters, List<JoinTable> joinTables, Map<ColumnRef, ColumnRefType> columnRefs) {
+            this.mainTableNode = tableNode;
             this.mainTable = table;
             this.select = select;
             this.preFilters = preFilters;
@@ -213,6 +216,10 @@ public class JoinCompiler {
             this.columnRefs = columnRefs;
         }
         
+        public TableNode getMainTableNode() {
+            return mainTableNode;
+        }
+        
         public TableRef getMainTable() {
             return mainTable;
         }
@@ -274,7 +281,7 @@ public class JoinCompiler {
             }
         }
         
-        public ProjectedPTableWrapper createProjectedTable(TableRef tableRef, boolean retainPKColumns) throws SQLException {
+        public ProjectedPTableWrapper createProjectedTable(TableRef tableRef, boolean retainPKColumns, boolean isRewrite) throws SQLException {
         	List<PColumn> projectedColumns = new ArrayList<PColumn>();
         	List<Expression> sourceExpressions = new ArrayList<Expression>();
         	ListMultimap<String, String> columnNameMap = ArrayListMultimap.<String, String>create();
@@ -283,14 +290,14 @@ public class JoinCompiler {
             if (retainPKColumns) {
             	for (PColumn column : table.getPKColumns()) {
             		addProjectedColumn(projectedColumns, sourceExpressions, columnNameMap,
-            				column, tableRef, column.getFamilyName(), hasSaltingColumn);
+            				column, tableRef, column.getFamilyName(), hasSaltingColumn, isRewrite);
             	}
             }
             if (isWildCardSelect(select)) {
             	for (PColumn column : table.getColumns()) {
             		if (!retainPKColumns || !SchemaUtil.isPKColumn(column)) {
             			addProjectedColumn(projectedColumns, sourceExpressions, columnNameMap,
-            					column, tableRef, PNameFactory.newName(ScanProjector.VALUE_COLUMN_FAMILY), hasSaltingColumn);
+            					column, tableRef, PNameFactory.newName(ScanProjector.VALUE_COLUMN_FAMILY), hasSaltingColumn, isRewrite);
             		}
             	}
             } else {
@@ -301,7 +308,7 @@ public class JoinCompiler {
                             && (!retainPKColumns || !SchemaUtil.isPKColumn(columnRef.getColumn()))) {
                     	PColumn column = columnRef.getColumn();
             			addProjectedColumn(projectedColumns, sourceExpressions, columnNameMap,
-            					column, tableRef, PNameFactory.newName(ScanProjector.VALUE_COLUMN_FAMILY), hasSaltingColumn);
+            					column, tableRef, PNameFactory.newName(ScanProjector.VALUE_COLUMN_FAMILY), hasSaltingColumn, isRewrite);
                     }
                 }            	
             }
@@ -314,22 +321,33 @@ public class JoinCompiler {
         }
         
         private static void addProjectedColumn(List<PColumn> projectedColumns, List<Expression> sourceExpressions,
-        		ListMultimap<String, String> columnNameMap, PColumn sourceColumn, TableRef sourceTable, PName familyName, boolean hasSaltingColumn) 
+        		ListMultimap<String, String> columnNameMap, PColumn sourceColumn, TableRef sourceTable, PName familyName, boolean hasSaltingColumn, boolean isRewrite) 
         throws SQLException {
             if (sourceColumn == SALTING_COLUMN)
                 return;
             
         	int position = projectedColumns.size() + (hasSaltingColumn ? 1 : 0);
         	PTable table = sourceTable.getTable();
-        	PName colName = sourceColumn.getName();
-        	PName name = sourceTable.getTableAlias() == null ? null : PNameFactory.newName(getProjectedColumnName(null, sourceTable.getTableAlias(), colName.getString()));
-        	PName fullName = getProjectedColumnName(table.getSchemaName(), table.getTableName(), colName);
-        	if (name == null) {
-        	    name = fullName;
-        	} else {
-        		columnNameMap.put(fullName.getString(), name.getString());
+        	String schemaName = table.getSchemaName().getString();
+        	String tableName = table.getTableName().getString();
+        	String colName = sourceColumn.getName().getString();
+            String fullName = getProjectedColumnName(schemaName, tableName, colName);
+            String aliasedName = sourceTable.getTableAlias() == null ? fullName : getProjectedColumnName(null, sourceTable.getTableAlias(), colName);
+            String displayName = aliasedName;
+        	if (isRewrite) {
+        	    String dataColName = IndexUtil.getDataColumnName(colName);
+        	    displayName = sourceTable.getTableAlias() == null ? getProjectedColumnName(schemaName, table.getParentTableName().getString(), dataColName) : getProjectedColumnName(null, sourceTable.getTableAlias(), dataColName);
+        	}
+        	
+            columnNameMap.put(colName, displayName);
+        	if (!fullName.equals(displayName)) {
+        		columnNameMap.put(fullName, displayName);
+        	}
+        	if (!aliasedName.equals(displayName) && !aliasedName.equals(fullName)) {
+        	    columnNameMap.put(aliasedName, displayName);
         	}
-            columnNameMap.put(colName.getString(), name.getString());
+            
+        	PName name = PNameFactory.newName(displayName);
     		PColumnImpl column = new PColumnImpl(name, familyName, sourceColumn.getDataType(), 
     				sourceColumn.getMaxLength(), sourceColumn.getScale(), sourceColumn.isNullable(), 
     				position, sourceColumn.getColumnModifier(), sourceColumn.getArraySize());
@@ -465,7 +483,7 @@ public class JoinCompiler {
     }
     
     public static JoinSpec getSubJoinSpecWithoutPostFilters(JoinSpec join) {
-        return new JoinSpec(join.mainTable, join.select, join.preFilters, new ArrayList<ParseNode>(), 
+        return new JoinSpec(join.mainTableNode, join.mainTable, join.select, join.preFilters, new ArrayList<ParseNode>(), 
                 join.joinTables.subList(0, join.joinTables.size() - 1), join.columnRefs);
     }
     
@@ -898,7 +916,8 @@ public class JoinCompiler {
 
             @Override
             public void visit(BindTableNode boundTableNode) throws SQLException {
-                replaced = NODE_FACTORY.bindTable(boundTableNode.getAlias(), getReplacedTableName());
+                String alias = boundTableNode.getAlias();
+                replaced = BindTableNode.create(alias == null ? null : '"' + alias + '"', getReplacedTableName(), true);
             }
 
             @Override
@@ -910,7 +929,8 @@ public class JoinCompiler {
             @Override
             public void visit(NamedTableNode namedTableNode)
                     throws SQLException {
-                replaced = NODE_FACTORY.namedTable(namedTableNode.getAlias(), getReplacedTableName(), namedTableNode.getDynamicColumns());
+                String alias = namedTableNode.getAlias();
+                replaced = NamedTableNode.create(alias == null ? null : '"' + alias + '"', getReplacedTableName(), namedTableNode.getDynamicColumns(), true);
             }
 
             @Override
@@ -921,9 +941,7 @@ public class JoinCompiler {
             
             private TableName getReplacedTableName() {
                 String schemaName = table.getTable().getSchemaName().getString();
-                schemaName = schemaName.length() == 0 ? null : '"' + schemaName + '"';
-                String tableName = '"' + table.getTable().getTableName().getString() + '"';
-                return NODE_FACTORY.table(schemaName, tableName);
+                return TableName.create(schemaName.length() == 0 ? null : schemaName, table.getTable().getTableName().getString());
             }
         };
         
@@ -968,7 +986,8 @@ public class JoinCompiler {
     }
     
     private static SelectStatement getSubqueryForOptimizedPlan(SelectStatement select, TableRef table, Map<ColumnRef, ColumnRefType> columnRefs, ParseNode where) {
-        TableName tName = NODE_FACTORY.table(table.getTable().getSchemaName().getString(), table.getTable().getTableName().getString());
+        String schemaName = table.getTable().getSchemaName().getString();
+        TableName tName = TableName.create(schemaName.length() == 0 ? null : schemaName, table.getTable().getTableName().getString());
         List<AliasedNode> selectList = new ArrayList<AliasedNode>();
         if (isWildCardSelect(select.getSelect())) {
             selectList.add(NODE_FACTORY.aliasedNode(null, WildcardParseNode.INSTANCE));
@@ -979,7 +998,8 @@ public class JoinCompiler {
                 }
             }
         }
-        List<? extends TableNode> from = Collections.singletonList(NODE_FACTORY.namedTable(table.getTableAlias(), tName));
+        String tableAlias = table.getTableAlias();
+        List<? extends TableNode> from = Collections.singletonList(NODE_FACTORY.namedTable(tableAlias == null ? null : '"' + tableAlias + '"', tName));
 
         return NODE_FACTORY.select(from, select.getHint(), false, selectList, where, null, null, null, null, 0, false);
     }
@@ -1169,11 +1189,6 @@ public class JoinCompiler {
 			String colName) {
     	return SchemaUtil.getColumnName(SchemaUtil.getTableName(schemaName, tableName), colName);
     }
-    
-    private static PName getProjectedColumnName(PName schemaName, PName tableName,
-    		PName colName) {
-    	String name = getProjectedColumnName(schemaName.getString(), tableName.getString(), colName.getString());
-    	return PNameFactory.newName(name);
-    }
 }
 
+

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/c3bb6943/phoenix-core/src/main/java/org/apache/phoenix/compile/QueryCompiler.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/QueryCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/QueryCompiler.java
index af1e7dc..bb564d7 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/compile/QueryCompiler.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/QueryCompiler.java
@@ -143,7 +143,7 @@ public class QueryCompiler {
         byte[] emptyByteArray = new byte[0];
         List<JoinTable> joinTables = join.getJoinTables();
         if (joinTables.isEmpty()) {
-            ProjectedPTableWrapper projectedTable = join.createProjectedTable(join.getMainTable(), !asSubquery);
+            ProjectedPTableWrapper projectedTable = join.createProjectedTable(join.getMainTable(), !asSubquery, join.getMainTableNode().isRewrite());
             ScanProjector.serializeProjectorIntoScan(context.getScan(), JoinCompiler.getScanProjector(projectedTable));
             context.setCurrentTable(join.getMainTable());
             context.setResolver(JoinCompiler.getColumnResolver(projectedTable));
@@ -153,7 +153,7 @@ public class QueryCompiler {
         
         boolean[] starJoinVector = JoinCompiler.getStarJoinVector(join);
         if (starJoinVector != null) {
-            ProjectedPTableWrapper initialProjectedTable = join.createProjectedTable(join.getMainTable(), !asSubquery);
+            ProjectedPTableWrapper initialProjectedTable = join.createProjectedTable(join.getMainTable(), !asSubquery, join.getMainTableNode().isRewrite());
             PTableWrapper projectedTable = initialProjectedTable;
             int count = joinTables.size();
             ImmutableBytesPtr[] joinIds = new ImmutableBytesPtr[count];
@@ -169,7 +169,7 @@ public class QueryCompiler {
                 SelectStatement subStatement = joinTable.getAsSubquery();
                 if (subStatement.getFrom().size() > 1)
                     throw new SQLFeatureNotSupportedException("Sub queries not supported.");
-                ProjectedPTableWrapper subProjTable = join.createProjectedTable(joinTable.getTable(), false);
+                ProjectedPTableWrapper subProjTable = join.createProjectedTable(joinTable.getTable(), false, joinTable.getTableNode().isRewrite());
                 ColumnResolver resolver = JoinCompiler.getColumnResolver(subProjTable);
                 Scan subScan = ScanUtil.newScan(scanCopy);
                 ScanProjector.serializeProjectorIntoScan(subScan, JoinCompiler.getScanProjector(subProjTable));
@@ -218,7 +218,7 @@ public class QueryCompiler {
             QueryPlan lhsPlan = compileJoinQuery(lhsCtx, lhs, binds, lhsJoin, true);
             ColumnResolver lhsResolver = lhsCtx.getResolver();
             PTableWrapper lhsProjTable = ((JoinedTableColumnResolver) (lhsResolver)).getPTableWrapper();
-            ProjectedPTableWrapper rhsProjTable = join.createProjectedTable(lastJoinTable.getTable(), !asSubquery);
+            ProjectedPTableWrapper rhsProjTable = join.createProjectedTable(lastJoinTable.getTable(), !asSubquery, lastJoinTable.getTableNode().isRewrite());
             ColumnResolver rhsResolver = JoinCompiler.getColumnResolver(rhsProjTable);
             ImmutableBytesPtr[] joinIds = new ImmutableBytesPtr[] {new ImmutableBytesPtr(emptyByteArray)};
             Pair<List<Expression>, List<Expression>> joinConditions = lastJoinTable.compileJoinConditions(context, lhsResolver, rhsResolver);
@@ -287,3 +287,4 @@ public class QueryCompiler {
         }
     }
 }
+

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/c3bb6943/phoenix-core/src/main/java/org/apache/phoenix/compile/StatementNormalizer.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/StatementNormalizer.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/StatementNormalizer.java
index 3ce2e68..1b1b654 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/compile/StatementNormalizer.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/StatementNormalizer.java
@@ -23,6 +23,7 @@ import java.sql.SQLException;
 import java.util.List;
 
 import com.google.common.collect.Lists;
+
 import org.apache.phoenix.parse.BetweenParseNode;
 import org.apache.phoenix.parse.ColumnParseNode;
 import org.apache.phoenix.parse.ComparisonParseNode;
@@ -30,6 +31,7 @@ import org.apache.phoenix.parse.LessThanOrEqualParseNode;
 import org.apache.phoenix.parse.ParseNode;
 import org.apache.phoenix.parse.ParseNodeRewriter;
 import org.apache.phoenix.parse.SelectStatement;
+import org.apache.phoenix.parse.TableName;
 import org.apache.phoenix.util.SchemaUtil;
 
 
@@ -95,10 +97,11 @@ public class StatementNormalizer extends ParseNodeRewriter {
                 && node.getAlias() != null 
                 && node.getTableName() != null
                 && SchemaUtil.normalizeIdentifier(node.getAlias()).equals(node.getName())) {
-            node = NODE_FACTORY.column(NODE_FACTORY.table(node.getSchemaName(), node.getTableName()), 
+            node = NODE_FACTORY.column(TableName.create(node.getSchemaName(), node.getTableName()), 
                     node.isCaseSensitive() ? '"' + node.getName() + '"' : node.getName(), 
                     node.isCaseSensitive() ? '"' + node.getFullName() + '"' : node.getFullName());
         }
         return super.visit(node);
     }
 }
+

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/c3bb6943/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/ScanProjector.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/ScanProjector.java b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/ScanProjector.java
deleted file mode 100644
index ee9e6e2..0000000
--- a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/ScanProjector.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * 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 may not 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 applicable law 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.coprocessor;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.hadoop.hbase.KeyValue;
-import org.apache.hadoop.hbase.client.Scan;
-import org.apache.hadoop.hbase.util.Bytes;
-import org.apache.hadoop.hbase.util.Pair;
-import org.apache.hadoop.io.WritableUtils;
-
-import org.apache.hadoop.hbase.index.util.ImmutableBytesPtr;
-import org.apache.phoenix.util.ByteUtil;
-import org.apache.phoenix.util.KeyValueUtil;
-
-public class ScanProjector {
-    
-    public enum ProjectionType {TABLE, CF, CQ};
-    
-    private static final String SCAN_PROJECTOR = "scanProjector";
-    private static final byte[] SEPERATOR = Bytes.toBytes(":");
-    
-    private final ProjectionType type;
-    private final byte[] tablePrefix;
-    private final Map<ImmutableBytesPtr, byte[]> cfProjectionMap;
-    private final Map<ImmutableBytesPtr, Map<ImmutableBytesPtr, Pair<byte[], byte[]>>> cqProjectionMap;
-    
-    private ScanProjector(ProjectionType type, byte[] tablePrefix, 
-            Map<ImmutableBytesPtr, byte[]> cfProjectionMap, Map<ImmutableBytesPtr, 
-            Map<ImmutableBytesPtr, Pair<byte[], byte[]>>> cqProjectionMap) {
-        this.type = ProjectionType.TABLE;
-        this.tablePrefix = tablePrefix;
-        this.cfProjectionMap = cfProjectionMap;
-        this.cqProjectionMap = cqProjectionMap;
-    }
-    
-    public static void serializeProjectorIntoScan(Scan scan, ScanProjector projector) {
-        ByteArrayOutputStream stream = new ByteArrayOutputStream();
-        try {
-            DataOutputStream output = new DataOutputStream(stream);
-            WritableUtils.writeVInt(output, projector.type.ordinal());
-            switch (projector.type) {
-            case TABLE:
-                WritableUtils.writeCompressedByteArray(output, projector.tablePrefix);
-                break;
-            case CF:
-                WritableUtils.writeVInt(output, projector.cfProjectionMap.size());
-                for (Map.Entry<ImmutableBytesPtr, byte[]> entry : projector.cfProjectionMap.entrySet()) {
-                    WritableUtils.writeCompressedByteArray(output, entry.getKey().get());
-                    WritableUtils.writeCompressedByteArray(output, entry.getValue());
-                }
-                break;
-            case CQ:
-                WritableUtils.writeVInt(output, projector.cqProjectionMap.size());
-                for (Map.Entry<ImmutableBytesPtr, Map<ImmutableBytesPtr, Pair<byte[], byte[]>>> entry : 
-                    projector.cqProjectionMap.entrySet()) {
-                    WritableUtils.writeCompressedByteArray(output, entry.getKey().get());
-                    Map<ImmutableBytesPtr, Pair<byte[], byte[]>> map = entry.getValue();
-                    WritableUtils.writeVInt(output, map.size());
-                    for (Map.Entry<ImmutableBytesPtr, Pair<byte[], byte[]>> e : map.entrySet()) {
-                        WritableUtils.writeCompressedByteArray(output, e.getKey().get());
-                        WritableUtils.writeCompressedByteArray(output, e.getValue().getFirst());
-                        WritableUtils.writeCompressedByteArray(output, e.getValue().getSecond());
-                    }
-                }
-                break;
-            default:
-                throw new IOException("Unrecognized projection type '" + projector.type + "'");    
-            }
-            scan.setAttribute(SCAN_PROJECTOR, stream.toByteArray());
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        } finally {
-            try {
-                stream.close();
-            } catch (IOException e) {
-                throw new RuntimeException(e);
-            }
-        }
-        
-    }
-    
-    public static ScanProjector deserializeProjectorFromScan(Scan scan) {
-        byte[] proj = scan.getAttribute(SCAN_PROJECTOR);
-        if (proj == null) {
-            return null;
-        }
-        ByteArrayInputStream stream = new ByteArrayInputStream(proj);
-        try {
-            DataInputStream input = new DataInputStream(stream);
-            int t = WritableUtils.readVInt(input);
-            ProjectionType type = ProjectionType.values()[t];
-            if (type == ProjectionType.TABLE) {
-                byte[] tablePrefix = WritableUtils.readCompressedByteArray(input);
-                return new ScanProjector(type, tablePrefix, null, null);
-            }
-            if (type == ProjectionType.CF) {
-                int count = WritableUtils.readVInt(input);
-                Map<ImmutableBytesPtr, byte[]> cfMap = new HashMap<ImmutableBytesPtr, byte[]>();
-                for (int i = 0; i < count; i++) {
-                    byte[] cf = WritableUtils.readCompressedByteArray(input);
-                    byte[] renamed = WritableUtils.readCompressedByteArray(input);
-                    cfMap.put(new ImmutableBytesPtr(cf), renamed);
-                }
-                return new ScanProjector(type, null, cfMap, null);
-            }
-            
-            int count = WritableUtils.readVInt(input);
-            Map<ImmutableBytesPtr, Map<ImmutableBytesPtr, Pair<byte[], byte[]>>> cqMap = 
-                new HashMap<ImmutableBytesPtr, Map<ImmutableBytesPtr, Pair<byte[], byte[]>>>();
-            for (int i = 0; i < count; i++) {
-                byte[] cf = WritableUtils.readCompressedByteArray(input);
-                int nQuals = WritableUtils.readVInt(input);
-                Map<ImmutableBytesPtr, Pair<byte[], byte[]>> map = 
-                    new HashMap<ImmutableBytesPtr, Pair<byte[], byte[]>>();
-                for (int j = 0; j < nQuals; j++) {
-                    byte[] cq = WritableUtils.readCompressedByteArray(input);
-                    byte[] renamedCf = WritableUtils.readCompressedByteArray(input);
-                    byte[] renamedCq = WritableUtils.readCompressedByteArray(input);
-                    map.put(new ImmutableBytesPtr(cq), new Pair<byte[], byte[]>(renamedCf, renamedCq));
-                }
-                cqMap.put(new ImmutableBytesPtr(cf), map);
-            }
-            return new ScanProjector(type, null, null, cqMap);
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        } finally {
-            try {
-                stream.close();
-            } catch (IOException e) {
-                throw new RuntimeException(e);
-            }
-        }
-    }
-    
-    public ProjectionType getType() {
-        return this.type;
-    }
-    
-    public byte[] getTablePrefix() {
-        return this.tablePrefix;
-    }
-    
-    public Map<ImmutableBytesPtr, byte[]> getCfProjectionMap() {
-        return this.cfProjectionMap;
-    }
-    
-    public Map<ImmutableBytesPtr, Map<ImmutableBytesPtr, Pair<byte[], byte[]>>> getCqProjectionMap() {
-        return this.cqProjectionMap;
-    }
-    
-    public KeyValue getProjectedKeyValue(KeyValue kv) {
-        if (type == ProjectionType.TABLE) {
-            byte[] cf = ByteUtil.concat(tablePrefix, SEPERATOR, kv.getFamily());
-            return KeyValueUtil.newKeyValue(kv.getBuffer(), kv.getKeyOffset(), kv.getKeyLength(), 
-                    cf, kv.getQualifier(), kv.getTimestamp(), kv.getBuffer(), kv.getValueOffset(), kv.getValueLength());
-        }
-        
-        if (type == ProjectionType.CF) {
-            byte[] cf = cfProjectionMap.get(new ImmutableBytesPtr(kv.getFamily()));
-            if (cf == null)
-                return kv;
-            return KeyValueUtil.newKeyValue(kv.getBuffer(), kv.getKeyOffset(), kv.getKeyLength(), 
-                    cf, kv.getQualifier(), kv.getTimestamp(), kv.getBuffer(), kv.getValueOffset(), kv.getValueLength());
-        }
-        
-        Map<ImmutableBytesPtr, Pair<byte[], byte[]>> map = cqProjectionMap.get(new ImmutableBytesPtr(kv.getFamily()));
-        if (map == null)
-            return kv;
-        
-        Pair<byte[], byte[]> col = map.get(new ImmutableBytesPtr(kv.getQualifier()));
-        if (col == null)
-            return kv;
-        
-        return KeyValueUtil.newKeyValue(kv.getBuffer(), kv.getKeyOffset(), kv.getKeyLength(), 
-                col.getFirst(), col.getSecond(), kv.getTimestamp(), kv.getBuffer(), kv.getValueOffset(), kv.getValueLength());
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/c3bb6943/phoenix-core/src/main/java/org/apache/phoenix/parse/BindTableNode.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/parse/BindTableNode.java b/phoenix-core/src/main/java/org/apache/phoenix/parse/BindTableNode.java
index 7aca261..7be498d 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/parse/BindTableNode.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/parse/BindTableNode.java
@@ -31,9 +31,17 @@ import java.sql.SQLException;
  * @since 0.1
  */
 public class BindTableNode extends ConcreteTableNode {
+    
+    public static BindTableNode create(String alias, TableName name, boolean isRewrite) {
+        return new BindTableNode(alias, name, isRewrite);
+    }
 
     BindTableNode(String alias, TableName name) {
-        super(alias, name);
+        this(alias, name, false);
+    }
+    
+    BindTableNode(String alias, TableName name, boolean isRewrite) {
+        super(alias, name, isRewrite);
     }
 
     @Override
@@ -42,3 +50,4 @@ public class BindTableNode extends ConcreteTableNode {
     }
 
 }
+

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/c3bb6943/phoenix-core/src/main/java/org/apache/phoenix/parse/ConcreteTableNode.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/parse/ConcreteTableNode.java b/phoenix-core/src/main/java/org/apache/phoenix/parse/ConcreteTableNode.java
index cd00316..2daa6c5 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/parse/ConcreteTableNode.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/parse/ConcreteTableNode.java
@@ -30,9 +30,9 @@ import org.apache.phoenix.util.SchemaUtil;
  */
 public abstract class ConcreteTableNode extends TableNode {
     private final TableName name;
-
-    ConcreteTableNode(String alias, TableName name) {
-        super(SchemaUtil.normalizeIdentifier(alias));
+    
+    ConcreteTableNode(String alias, TableName name, boolean isRewrite) {
+        super(SchemaUtil.normalizeIdentifier(alias), isRewrite);
         this.name = name;
     }
 
@@ -41,3 +41,4 @@ public abstract class ConcreteTableNode extends TableNode {
     }
 
 }
+

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/c3bb6943/phoenix-core/src/main/java/org/apache/phoenix/parse/JoinTableNode.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/parse/JoinTableNode.java b/phoenix-core/src/main/java/org/apache/phoenix/parse/JoinTableNode.java
index d6f7f82..7259f64 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/parse/JoinTableNode.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/parse/JoinTableNode.java
@@ -38,7 +38,7 @@ public class JoinTableNode extends TableNode {
     private final TableNode table;
     
     JoinTableNode(JoinType type, ParseNode on, TableNode table) {
-        super(table.getAlias());
+        super(table.getAlias(), table.isRewrite());
         this.type = type;
         this.on = on;
         this.table = table;
@@ -62,3 +62,4 @@ public class JoinTableNode extends TableNode {
     }
 
 }
+

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/c3bb6943/phoenix-core/src/main/java/org/apache/phoenix/parse/NamedTableNode.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/parse/NamedTableNode.java b/phoenix-core/src/main/java/org/apache/phoenix/parse/NamedTableNode.java
index 4be546d..8dfeed7 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/parse/NamedTableNode.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/parse/NamedTableNode.java
@@ -38,14 +38,22 @@ public class NamedTableNode extends ConcreteTableNode {
     public static NamedTableNode create (String alias, TableName name, List<ColumnDef> dynColumns) {
         return new NamedTableNode(alias, name, dynColumns);
     }
+
+    public static NamedTableNode create (String alias, TableName name, List<ColumnDef> dynColumns, boolean isRewrite) {
+        return new NamedTableNode(alias, name, dynColumns, isRewrite);
+    }
     
     NamedTableNode(String alias, TableName name) {
-        super(alias, name);
+        super(alias, name, false);
         dynColumns = Collections.<ColumnDef> emptyList();
     }
 
     NamedTableNode(String alias, TableName name, List<ColumnDef> dynColumns) {
-        super(alias, name);
+        this(alias, name, dynColumns, false);
+    }
+    
+    NamedTableNode(String alias, TableName name, List<ColumnDef> dynColumns, boolean isRewrite) {
+        super(alias, name, isRewrite);
         if (dynColumns != null) {
             this.dynColumns = ImmutableList.copyOf(dynColumns);
         } else {
@@ -62,3 +70,4 @@ public class NamedTableNode extends ConcreteTableNode {
         return dynColumns;
     }
 }
+

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/c3bb6943/phoenix-core/src/main/java/org/apache/phoenix/parse/TableNode.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/parse/TableNode.java b/phoenix-core/src/main/java/org/apache/phoenix/parse/TableNode.java
index 0eaf140..c7162c4 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/parse/TableNode.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/parse/TableNode.java
@@ -32,14 +32,25 @@ import java.sql.SQLException;
  */
 public abstract class TableNode {
     private final String alias;
+    private final boolean isRewrite;
 
     TableNode(String alias) {
+        this(alias, false);
+    }
+
+    TableNode(String alias, boolean isRewrite) {
         this.alias = alias;
+        this.isRewrite = isRewrite;
     }
 
     public String getAlias() {
         return alias;
     }
+    
+    public boolean isRewrite() {
+        return isRewrite;
+    }
 
     public abstract void accept(TableNodeVisitor visitor) throws SQLException;
 }
+

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/c3bb6943/phoenix-core/src/test/java/org/apache/phoenix/compile/JoinQueryCompileTest.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/compile/JoinQueryCompileTest.java b/phoenix-core/src/test/java/org/apache/phoenix/compile/JoinQueryCompileTest.java
index b3eaa1c..1890442 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/compile/JoinQueryCompileTest.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/compile/JoinQueryCompileTest.java
@@ -20,9 +20,13 @@
 package org.apache.phoenix.compile;
 
 import static org.apache.phoenix.util.TestUtil.JOIN_CUSTOMER_TABLE;
+import static org.apache.phoenix.util.TestUtil.JOIN_CUSTOMER_TABLE_NORMALIZED;
 import static org.apache.phoenix.util.TestUtil.JOIN_ITEM_TABLE;
+import static org.apache.phoenix.util.TestUtil.JOIN_ITEM_TABLE_NORMALIZED;
 import static org.apache.phoenix.util.TestUtil.JOIN_ORDER_TABLE;
+import static org.apache.phoenix.util.TestUtil.JOIN_ORDER_TABLE_NORMALIZED;
 import static org.apache.phoenix.util.TestUtil.JOIN_SUPPLIER_TABLE;
+import static org.apache.phoenix.util.TestUtil.JOIN_SUPPLIER_TABLE_NORMALIZED;
 import static org.apache.phoenix.util.TestUtil.TEST_PROPERTIES;
 import static org.junit.Assert.assertEquals;
 
@@ -51,33 +55,33 @@ public class JoinQueryCompileTest extends BaseConnectionlessQueryTest {
     @Test
     public void testExplainPlan() throws Exception {
         Connection conn = DriverManager.getConnection(getUrl());
-        String query = "EXPLAIN SELECT s.supplier_id, order_id, c.name, i.name, quantity, o.date FROM " + JOIN_ORDER_TABLE + " o LEFT JOIN " 
-    	+ JOIN_CUSTOMER_TABLE + " c ON o.customer_id = c.customer_id AND c.name LIKE 'C%' LEFT JOIN " 
-    	+ JOIN_ITEM_TABLE + " i ON o.item_id = i.item_id RIGHT JOIN " 
-    	+ JOIN_SUPPLIER_TABLE + " s ON s.supplier_id = i.supplier_id WHERE i.name LIKE 'T%'";
+        String query = "EXPLAIN SELECT s.\"supplier_id\", \"order_id\", c.name, i.name, quantity, o.date FROM " + JOIN_ORDER_TABLE + " o LEFT JOIN " 
+    	+ JOIN_CUSTOMER_TABLE + " c ON o.\"customer_id\" = c.\"customer_id\" AND c.name LIKE 'C%' LEFT JOIN " 
+    	+ JOIN_ITEM_TABLE + " i ON o.\"item_id\" = i.\"item_id\" RIGHT JOIN " 
+    	+ JOIN_SUPPLIER_TABLE + " s ON s.\"supplier_id\" = i.\"supplier_id\" WHERE i.name LIKE 'T%'";
         ResultSet rs = conn.createStatement().executeQuery(query);
         assertEquals(
-        		"CLIENT PARALLEL 1-WAY FULL SCAN OVER JOIN_SUPPLIER_TABLE\n" +
+        		"CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_SUPPLIER_TABLE_NORMALIZED + "\n" +
         		"    SERVER FILTER BY FIRST KEY ONLY\n" +
         		"    PARALLEL EQUI-JOIN 1 HASH TABLES:\n" +
         		"    BUILD HASH TABLE 0\n" +
-        		"        CLIENT PARALLEL 1-WAY FULL SCAN OVER JOIN_ORDER_TABLE\n" +
+        		"        CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_ORDER_TABLE_NORMALIZED + "\n" +
         		"            PARALLEL EQUI-JOIN 2 HASH TABLES:\n" +
         		"            BUILD HASH TABLE 0\n" +
-        		"                CLIENT PARALLEL 1-WAY FULL SCAN OVER JOIN_CUSTOMER_TABLE\n" +
+        		"                CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_CUSTOMER_TABLE_NORMALIZED + "\n" +
         		"                    SERVER FILTER BY NAME LIKE 'C%'\n" +
         		"            BUILD HASH TABLE 1\n" +
-        		"                CLIENT PARALLEL 1-WAY FULL SCAN OVER JOIN_ITEM_TABLE\n" +
+        		"                CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_ITEM_TABLE_NORMALIZED + "\n" +
         		"    AFTER-JOIN SERVER FILTER BY I.NAME LIKE 'T%'", QueryUtil.getExplainPlan(rs));
     }
 
     @Test
     public void testWhereClauseOptimization() throws Exception {
         PhoenixConnection pconn = DriverManager.getConnection(getUrl(), TEST_PROPERTIES).unwrap(PhoenixConnection.class);
-        String queryTemplate = "SELECT t1.item_id, t2.item_id, t3.item_id FROM " + JOIN_ITEM_TABLE + " t1 " 
-                + "%s JOIN " + JOIN_ITEM_TABLE + " t2 ON t1.item_id = t2.item_id " 
-                + "%s JOIN " + JOIN_ITEM_TABLE + " t3 ON t1.item_id = t3.item_id " 
-                + "WHERE t1.item_id = '0000000001' AND t2.item_id = '0000000002' AND t3.item_id = '0000000003'";
+        String queryTemplate = "SELECT t1.\"item_id\", t2.\"item_id\", t3.\"item_id\" FROM " + JOIN_ITEM_TABLE + " t1 " 
+                + "%s JOIN " + JOIN_ITEM_TABLE + " t2 ON t1.\"item_id\" = t2.\"item_id\" " 
+                + "%s JOIN " + JOIN_ITEM_TABLE + " t3 ON t1.\"item_id\" = t3.\"item_id\" " 
+                + "WHERE t1.\"item_id\" = '0000000001' AND t2.\"item_id\" = '0000000002' AND t3.\"item_id\" = '0000000003'";
 
         String query = String.format(queryTemplate, "INNER", "INNER");
         JoinSpec joinSpec = getJoinSpec(query, pconn);

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/c3bb6943/phoenix-core/src/test/java/org/apache/phoenix/end2end/BaseConnectedQueryTest.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/end2end/BaseConnectedQueryTest.java b/phoenix-core/src/test/java/org/apache/phoenix/end2end/BaseConnectedQueryTest.java
index a891f7c..8e6e979 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/end2end/BaseConnectedQueryTest.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/end2end/BaseConnectedQueryTest.java
@@ -147,7 +147,7 @@ public abstract class BaseConnectedQueryTest extends BaseTest {
         // Drop VIEWs first, as we don't allow a TABLE with views to be dropped.
         ResultSet rs = dbmd.getTables(null, null, null, new String[] {PTableType.VIEW.toString()});
         while (rs.next()) {
-            String fullTableName = SchemaUtil.getTableName(
+            String fullTableName = SchemaUtil.getEscapedTableName(
                     rs.getString(PhoenixDatabaseMetaData.TABLE_SCHEM_NAME),
                     rs.getString(PhoenixDatabaseMetaData.TABLE_NAME_NAME));
             String ddl = "DROP " + rs.getString(PhoenixDatabaseMetaData.TABLE_TYPE_NAME) + " " + fullTableName;
@@ -155,7 +155,7 @@ public abstract class BaseConnectedQueryTest extends BaseTest {
         }
         rs = dbmd.getTables(null, null, null, new String[] {PTableType.TABLE.toString()});
         while (rs.next()) {
-            String fullTableName = SchemaUtil.getTableName(
+            String fullTableName = SchemaUtil.getEscapedTableName(
                     rs.getString(PhoenixDatabaseMetaData.TABLE_SCHEM_NAME),
                     rs.getString(PhoenixDatabaseMetaData.TABLE_NAME_NAME));
             String ddl = "DROP " + rs.getString(PhoenixDatabaseMetaData.TABLE_TYPE_NAME) + " " + fullTableName;

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/c3bb6943/phoenix-core/src/test/java/org/apache/phoenix/end2end/HashJoinTest.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/end2end/HashJoinTest.java b/phoenix-core/src/test/java/org/apache/phoenix/end2end/HashJoinTest.java
index 071b0bd..81cd682 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/end2end/HashJoinTest.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/end2end/HashJoinTest.java
@@ -21,8 +21,11 @@ package org.apache.phoenix.end2end;
 
 import static org.apache.phoenix.util.TestUtil.JOIN_CUSTOMER_TABLE;
 import static org.apache.phoenix.util.TestUtil.JOIN_ITEM_TABLE;
+import static org.apache.phoenix.util.TestUtil.JOIN_ITEM_TABLE_NORMALIZED;
 import static org.apache.phoenix.util.TestUtil.JOIN_ORDER_TABLE;
+import static org.apache.phoenix.util.TestUtil.JOIN_ORDER_TABLE_NORMALIZED;
 import static org.apache.phoenix.util.TestUtil.JOIN_SUPPLIER_TABLE;
+import static org.apache.phoenix.util.TestUtil.JOIN_SUPPLIER_TABLE_NORMALIZED;
 import static org.apache.phoenix.util.TestUtil.PHOENIX_JDBC_URL;
 import static org.apache.phoenix.util.TestUtil.TEST_PROPERTIES;
 import static org.junit.Assert.assertEquals;
@@ -87,48 +90,48 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
         List<Object> testCases = Lists.newArrayList();
         testCases.add(new String[][] {
                 {}, {
-                "CLIENT PARALLEL 1-WAY FULL SCAN OVER JOIN_ITEM_TABLE\n" +
+                "CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_ITEM_TABLE_NORMALIZED + "\n" +
                 "    SERVER FILTER BY (NAME >= 'T1' AND NAME <= 'T5')\n" +
                 "    PARALLEL EQUI-JOIN 1 HASH TABLES:\n" +
                 "    BUILD HASH TABLE 0\n" +
-                "        CLIENT PARALLEL 1-WAY FULL SCAN OVER JOIN_SUPPLIER_TABLE\n" +
+                "        CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_SUPPLIER_TABLE_NORMALIZED + "\n" +
                 "            SERVER FILTER BY (NAME >= 'S1' AND NAME <= 'S5')",
-                "CLIENT PARALLEL 1-WAY FULL SCAN OVER JOIN_ITEM_TABLE\n" +
+                "CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_ITEM_TABLE_NORMALIZED + "\n" +
                 "    SERVER FILTER BY (NAME = 'T1' OR NAME = 'T5')\n" +
                 "    PARALLEL EQUI-JOIN 1 HASH TABLES:\n" +
                 "    BUILD HASH TABLE 0\n" +
-                "        CLIENT PARALLEL 1-WAY FULL SCAN OVER JOIN_SUPPLIER_TABLE\n" +
+                "        CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_SUPPLIER_TABLE_NORMALIZED + "\n" +
                 "            SERVER FILTER BY (NAME = 'S1' OR NAME = 'S5')",
-                "CLIENT PARALLEL 1-WAY FULL SCAN OVER JOIN_ITEM_TABLE\n" +
+                "CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_ITEM_TABLE_NORMALIZED + "\n" +
                 "    PARALLEL EQUI-JOIN 2 HASH TABLES:\n" +
                 "    BUILD HASH TABLE 0 (SKIP MERGE)\n" +
-                "        CLIENT PARALLEL 1-WAY FULL SCAN OVER JOIN_ORDER_TABLE\n" +
+                "        CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_ORDER_TABLE_NORMALIZED + "\n" +
                 "            SERVER FILTER BY QUANTITY < 5000\n" +
                 "    BUILD HASH TABLE 1\n" +
-                "        CLIENT PARALLEL 1-WAY FULL SCAN OVER JOIN_SUPPLIER_TABLE"
+                "        CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_SUPPLIER_TABLE_NORMALIZED
                 }});
         testCases.add(new String[][] {
                 {
-                "CREATE INDEX INDEX_" + JOIN_CUSTOMER_TABLE + " ON " + JOIN_CUSTOMER_TABLE + " (name)",
-                "CREATE INDEX INDEX_" + JOIN_ITEM_TABLE + " ON " + JOIN_ITEM_TABLE + " (name)",
-                "CREATE INDEX INDEX_" + JOIN_SUPPLIER_TABLE + " ON " + JOIN_SUPPLIER_TABLE + " (name)"
+                "CREATE INDEX IDX_CUSTOMER ON " + JOIN_CUSTOMER_TABLE + " (name)",
+                "CREATE INDEX IDX_ITEM ON " + JOIN_ITEM_TABLE + " (name) INCLUDE (price, discount1, discount2, \"supplier_id\", description)",
+                "CREATE INDEX IDX_SUPPLIER ON " + JOIN_SUPPLIER_TABLE + " (name)"
                 }, {
-                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER INDEX_JOIN_ITEM_TABLE ['T1'] - ['T5']\n" +
+                "CLIENT PARALLEL 4-WAY RANGE SCAN OVER IDX_ITEM ['T1'] - ['T5']\n" +
+                "    SERVER FILTER BY FIRST KEY ONLY\n" +
                 "    PARALLEL EQUI-JOIN 1 HASH TABLES:\n" +
                 "    BUILD HASH TABLE 0\n" +
-                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER INDEX_JOIN_SUPPLIER_TABLE ['S1'] - ['S5']",
-                "CLIENT PARALLEL 1-WAY FULL SCAN OVER JOIN_ITEM_TABLE\n" +
-                "    SERVER FILTER BY (NAME = 'T1' OR NAME = 'T5')\n" +
+                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER IDX_SUPPLIER ['S1'] - ['S5']",
+                "CLIENT PARALLEL 4-WAY SKIP SCAN ON 2 KEYS OVER IDX_ITEM ['T1'] - ['T5']\n" +
                 "    PARALLEL EQUI-JOIN 1 HASH TABLES:\n" +
                 "    BUILD HASH TABLE 0\n" +
-                "        CLIENT PARALLEL 1-WAY SKIP SCAN ON 2 KEYS OVER INDEX_JOIN_SUPPLIER_TABLE ['S1'] - ['S5']",
-                "CLIENT PARALLEL 1-WAY FULL SCAN OVER JOIN_ITEM_TABLE\n" +
+                "        CLIENT PARALLEL 1-WAY SKIP SCAN ON 2 KEYS OVER IDX_SUPPLIER ['S1'] - ['S5']",
+                "CLIENT PARALLEL 4-WAY FULL SCAN OVER IDX_ITEM\n" +
                 "    PARALLEL EQUI-JOIN 2 HASH TABLES:\n" +
                 "    BUILD HASH TABLE 0 (SKIP MERGE)\n" +
-                "        CLIENT PARALLEL 1-WAY FULL SCAN OVER JOIN_ORDER_TABLE\n" +
+                "        CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_ORDER_TABLE_NORMALIZED + "\n" +
                 "            SERVER FILTER BY QUANTITY < 5000\n" +
                 "    BUILD HASH TABLE 1\n" +
-                "        CLIENT PARALLEL 1-WAY FULL SCAN OVER INDEX_JOIN_SUPPLIER_TABLE"
+                "        CLIENT PARALLEL 1-WAY FULL SCAN OVER IDX_SUPPLIER"
                 }});
         return testCases;
     }
@@ -148,7 +151,7 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
             // Insert into customer table
             PreparedStatement stmt = conn.prepareStatement(
                     "upsert into " + JOIN_CUSTOMER_TABLE +
-                    "   (CUSTOMER_ID, " +
+                    "   (\"customer_id\", " +
                     "    NAME, " +
                     "    PHONE, " +
                     "    ADDRESS, " +
@@ -206,12 +209,12 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
             // Insert into item table
             stmt = conn.prepareStatement(
                     "upsert into " + JOIN_ITEM_TABLE +
-                    "   (ITEM_ID, " +
+                    "   (\"item_id\", " +
                     "    NAME, " +
                     "    PRICE, " +
                     "    DISCOUNT1, " +
                     "    DISCOUNT2, " +
-                    "    SUPPLIER_ID, " +
+                    "    \"supplier_id\", " +
                     "    DESCRIPTION) " +
                     "values (?, ?, ?, ?, ?, ?, ?)");
             stmt.setString(1, "0000000001");
@@ -280,7 +283,7 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
             // Insert into supplier table
             stmt = conn.prepareStatement(
                     "upsert into " + JOIN_SUPPLIER_TABLE +
-                    "   (SUPPLIER_ID, " +
+                    "   (\"supplier_id\", " +
                     "    NAME, " +
                     "    PHONE, " +
                     "    ADDRESS, " +
@@ -331,9 +334,9 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
             // Insert into order table
             stmt = conn.prepareStatement(
                     "upsert into " + JOIN_ORDER_TABLE +
-                    "   (ORDER_ID, " +
-                    "    CUSTOMER_ID, " +
-                    "    ITEM_ID, " +
+                    "   (\"order_id\", " +
+                    "    \"customer_id\", " +
+                    "    \"item_id\", " +
                     "    PRICE, " +
                     "    QUANTITY," +
                     "    DATE) " +
@@ -386,7 +389,7 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
 
     @Test
     public void testDefaultJoin() throws Exception {
-        String query = "SELECT item.item_id, item.name, supp.supplier_id, supp.name FROM " + JOIN_ITEM_TABLE + " item JOIN " + JOIN_SUPPLIER_TABLE + " supp ON item.supplier_id = supp.supplier_id";
+        String query = "SELECT item.\"item_id\", item.name, supp.\"supplier_id\", supp.name FROM " + JOIN_ITEM_TABLE + " item JOIN " + JOIN_SUPPLIER_TABLE + " supp ON item.\"supplier_id\" = supp.\"supplier_id\"";
         Properties props = new Properties(TEST_PROPERTIES);
         Connection conn = DriverManager.getConnection(PHOENIX_JDBC_URL, props);
         try {
@@ -431,7 +434,7 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
 
     @Test
     public void testInnerJoin() throws Exception {
-        String query = "SELECT item.item_id, item.name, supp.supplier_id, supp.name, next value for my.seq FROM " + JOIN_ITEM_TABLE + " item INNER JOIN " + JOIN_SUPPLIER_TABLE + " supp ON item.supplier_id = supp.supplier_id";
+        String query = "SELECT item.\"item_id\", item.name, supp.\"supplier_id\", supp.name, next value for my.seq FROM " + JOIN_ITEM_TABLE + " item INNER JOIN " + JOIN_SUPPLIER_TABLE + " supp ON item.\"supplier_id\" = supp.\"supplier_id\"";
         Properties props = new Properties(TEST_PROPERTIES);
         Connection conn = DriverManager.getConnection(PHOENIX_JDBC_URL, props);
         try {
@@ -483,9 +486,9 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
     @Test
     public void testLeftJoin() throws Exception {
         String query[] = new String[3];
-        query[0] = "SELECT item.item_id, item.name, supp.supplier_id, supp.name, next value for my.seq FROM " + JOIN_ITEM_TABLE + " item LEFT JOIN " + JOIN_SUPPLIER_TABLE + " supp ON item.supplier_id = supp.supplier_id";
-        query[1] = "SELECT " + JOIN_ITEM_TABLE + ".item_id, " + JOIN_ITEM_TABLE + ".name, " + JOIN_SUPPLIER_TABLE + ".supplier_id, " + JOIN_SUPPLIER_TABLE + ".name, next value for my.seq FROM " + JOIN_ITEM_TABLE + " LEFT JOIN " + JOIN_SUPPLIER_TABLE + " ON " + JOIN_ITEM_TABLE + ".supplier_id = " + JOIN_SUPPLIER_TABLE + ".supplier_id";
-        query[2] = "SELECT item.item_id, " + JOIN_ITEM_TABLE + ".name, supp.supplier_id, " + JOIN_SUPPLIER_TABLE + ".name, next value for my.seq FROM " + JOIN_ITEM_TABLE + " item LEFT JOIN " + JOIN_SUPPLIER_TABLE + " supp ON " + JOIN_ITEM_TABLE + ".supplier_id = supp.supplier_id";
+        query[0] = "SELECT item.\"item_id\", item.name, supp.\"supplier_id\", supp.name, next value for my.seq FROM " + JOIN_ITEM_TABLE + " item LEFT JOIN " + JOIN_SUPPLIER_TABLE + " supp ON item.\"supplier_id\" = supp.\"supplier_id\" ORDER BY \"item_id\"";
+        query[1] = "SELECT " + JOIN_ITEM_TABLE + ".\"item_id\", " + JOIN_ITEM_TABLE + ".name, " + JOIN_SUPPLIER_TABLE + ".\"supplier_id\", " + JOIN_SUPPLIER_TABLE + ".name, next value for my.seq FROM " + JOIN_ITEM_TABLE + " LEFT JOIN " + JOIN_SUPPLIER_TABLE + " ON " + JOIN_ITEM_TABLE + ".\"supplier_id\" = " + JOIN_SUPPLIER_TABLE + ".\"supplier_id\" ORDER BY \"item_id\"";
+        query[2] = "SELECT item.\"item_id\", " + JOIN_ITEM_TABLE + ".name, supp.\"supplier_id\", " + JOIN_SUPPLIER_TABLE + ".name, next value for my.seq FROM " + JOIN_ITEM_TABLE + " item LEFT JOIN " + JOIN_SUPPLIER_TABLE + " supp ON " + JOIN_ITEM_TABLE + ".\"supplier_id\" = supp.\"supplier_id\" ORDER BY \"item_id\"";
         Properties props = new Properties(TEST_PROPERTIES);
         Connection conn = DriverManager.getConnection(PHOENIX_JDBC_URL, props);
         try {
@@ -539,7 +542,7 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
     
     @Test
     public void testRightJoin() throws Exception {
-        String query = "SELECT item.item_id, item.name, supp.supplier_id, supp.name FROM " + JOIN_SUPPLIER_TABLE + " supp RIGHT JOIN " + JOIN_ITEM_TABLE + " item ON item.supplier_id = supp.supplier_id";
+        String query = "SELECT item.\"item_id\", item.name, supp.\"supplier_id\", supp.name FROM " + JOIN_SUPPLIER_TABLE + " supp RIGHT JOIN " + JOIN_ITEM_TABLE + " item ON item.\"supplier_id\" = supp.\"supplier_id\" ORDER BY \"item_id\"";
         Properties props = new Properties(TEST_PROPERTIES);
         Connection conn = DriverManager.getConnection(PHOENIX_JDBC_URL, props);
         try {
@@ -589,8 +592,8 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
     
     @Test
     public void testInnerJoinWithPreFilters() throws Exception {
-        String query1 = "SELECT item.item_id, item.name, supp.supplier_id, supp.name FROM " + JOIN_ITEM_TABLE + " item INNER JOIN " + JOIN_SUPPLIER_TABLE + " supp ON item.supplier_id = supp.supplier_id AND supp.supplier_id BETWEEN '0000000001' AND '0000000005'";
-        String query2 = "SELECT item.item_id, item.name, supp.supplier_id, supp.name FROM " + JOIN_ITEM_TABLE + " item INNER JOIN " + JOIN_SUPPLIER_TABLE + " supp ON item.supplier_id = supp.supplier_id AND (supp.supplier_id = '0000000001' OR supp.supplier_id = '0000000005')";
+        String query1 = "SELECT item.\"item_id\", item.name, supp.\"supplier_id\", supp.name FROM " + JOIN_ITEM_TABLE + " item INNER JOIN " + JOIN_SUPPLIER_TABLE + " supp ON item.\"supplier_id\" = supp.\"supplier_id\" AND supp.\"supplier_id\" BETWEEN '0000000001' AND '0000000005'";
+        String query2 = "SELECT item.\"item_id\", item.name, supp.\"supplier_id\", supp.name FROM " + JOIN_ITEM_TABLE + " item INNER JOIN " + JOIN_SUPPLIER_TABLE + " supp ON item.\"supplier_id\" = supp.\"supplier_id\" AND (supp.\"supplier_id\" = '0000000001' OR supp.\"supplier_id\" = '0000000005')";
         Properties props = new Properties(TEST_PROPERTIES);
         Connection conn = DriverManager.getConnection(PHOENIX_JDBC_URL, props);
         try {
@@ -651,7 +654,7 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
     
     @Test
     public void testLeftJoinWithPreFilters() throws Exception {
-        String query = "SELECT item.item_id, item.name, supp.supplier_id, supp.name FROM " + JOIN_ITEM_TABLE + " item LEFT JOIN " + JOIN_SUPPLIER_TABLE + " supp ON item.supplier_id = supp.supplier_id AND (supp.supplier_id = '0000000001' OR supp.supplier_id = '0000000005')";
+        String query = "SELECT item.\"item_id\", item.name, supp.\"supplier_id\", supp.name FROM " + JOIN_ITEM_TABLE + " item LEFT JOIN " + JOIN_SUPPLIER_TABLE + " supp ON item.\"supplier_id\" = supp.\"supplier_id\" AND (supp.\"supplier_id\" = '0000000001' OR supp.\"supplier_id\" = '0000000005') ORDER BY \"item_id\"";
         Properties props = new Properties(TEST_PROPERTIES);
         Connection conn = DriverManager.getConnection(PHOENIX_JDBC_URL, props);
         try {
@@ -701,8 +704,8 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
     
     @Test
     public void testJoinWithPostFilters() throws Exception {
-        String query1 = "SELECT item.item_id, item.name, supp.supplier_id, supp.name FROM " + JOIN_SUPPLIER_TABLE + " supp RIGHT JOIN " + JOIN_ITEM_TABLE + " item ON item.supplier_id = supp.supplier_id WHERE supp.supplier_id BETWEEN '0000000001' AND '0000000005'";
-        String query2 = "SELECT item.item_id, item.name, supp.supplier_id, supp.name FROM " + JOIN_ITEM_TABLE + " item LEFT JOIN " + JOIN_SUPPLIER_TABLE + " supp ON item.supplier_id = supp.supplier_id WHERE supp.supplier_id = '0000000001' OR supp.supplier_id = '0000000005'";
+        String query1 = "SELECT item.\"item_id\", item.name, supp.\"supplier_id\", supp.name FROM " + JOIN_SUPPLIER_TABLE + " supp RIGHT JOIN " + JOIN_ITEM_TABLE + " item ON item.\"supplier_id\" = supp.\"supplier_id\" WHERE supp.\"supplier_id\" BETWEEN '0000000001' AND '0000000005'";
+        String query2 = "SELECT item.\"item_id\", item.name, supp.\"supplier_id\", supp.name FROM " + JOIN_ITEM_TABLE + " item LEFT JOIN " + JOIN_SUPPLIER_TABLE + " supp ON item.\"supplier_id\" = supp.\"supplier_id\" WHERE supp.\"supplier_id\" = '0000000001' OR supp.\"supplier_id\" = '0000000005'";
         Properties props = new Properties(TEST_PROPERTIES);
         Connection conn = DriverManager.getConnection(PHOENIX_JDBC_URL, props);
         try {
@@ -763,9 +766,9 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
     
     @Test
     public void testStarJoin() throws Exception {
-        String query = "SELECT order_id, c.name, i.name iname, quantity, o.date FROM " + JOIN_ORDER_TABLE + " o LEFT JOIN " 
-            + JOIN_CUSTOMER_TABLE + " c ON o.customer_id = c.customer_id LEFT JOIN " 
-            + JOIN_ITEM_TABLE + " i ON o.item_id = i.item_id";
+        String query = "SELECT \"order_id\", c.name, i.name iname, quantity, o.date FROM " + JOIN_ORDER_TABLE + " o LEFT JOIN " 
+            + JOIN_CUSTOMER_TABLE + " c ON o.\"customer_id\" = c.\"customer_id\" LEFT JOIN " 
+            + JOIN_ITEM_TABLE + " i ON o.\"item_id\" = i.\"item_id\"";
         Properties props = new Properties(TEST_PROPERTIES);
         Connection conn = DriverManager.getConnection(PHOENIX_JDBC_URL, props);
         try {
@@ -773,7 +776,7 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
             ResultSet rs = statement.executeQuery();
             assertTrue (rs.next());
             assertEquals(rs.getString(1), "000000000000001");
-            assertEquals(rs.getString("order_id"), "000000000000001");
+            assertEquals(rs.getString("\"order_id\""), "000000000000001");
             assertEquals(rs.getString(2), "C4");
             assertEquals(rs.getString("C.name"), "C4");
             assertEquals(rs.getString(3), "T1");
@@ -815,7 +818,7 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
     @Test
     public void testLeftJoinWithAggregation() throws Exception {
         String query = "SELECT i.name, sum(quantity) FROM " + JOIN_ORDER_TABLE + " o LEFT JOIN " 
-            + JOIN_ITEM_TABLE + " i ON o.item_id = i.item_id GROUP BY i.name ORDER BY i.name";
+            + JOIN_ITEM_TABLE + " i ON o.\"item_id\" = i.\"item_id\" GROUP BY i.name ORDER BY i.name";
         Properties props = new Properties(TEST_PROPERTIES);
         Connection conn = DriverManager.getConnection(PHOENIX_JDBC_URL, props);
         try {
@@ -843,7 +846,7 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
     @Test
     public void testRightJoinWithAggregation() throws Exception {
         String query = "SELECT i.name, sum(quantity) FROM " + JOIN_ORDER_TABLE + " o RIGHT JOIN " 
-            + JOIN_ITEM_TABLE + " i ON o.item_id = i.item_id GROUP BY i.name ORDER BY i.name";
+            + JOIN_ITEM_TABLE + " i ON o.\"item_id\" = i.\"item_id\" GROUP BY i.name ORDER BY i.name";
         Properties props = new Properties(TEST_PROPERTIES);
         Connection conn = DriverManager.getConnection(PHOENIX_JDBC_URL, props);
         try {
@@ -879,9 +882,9 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
     
     @Test
     public void testLeftRightJoin() throws Exception {
-        String query = "SELECT order_id, i.name, s.name, quantity, date FROM " + JOIN_ORDER_TABLE + " o LEFT JOIN " 
-            + JOIN_ITEM_TABLE + " i ON o.item_id = i.item_id RIGHT JOIN "
-            + JOIN_SUPPLIER_TABLE + " s ON i.supplier_id = s.supplier_id ORDER BY order_id, s.supplier_id DESC";
+        String query = "SELECT \"order_id\", i.name, s.name, quantity, date FROM " + JOIN_ORDER_TABLE + " o LEFT JOIN " 
+            + JOIN_ITEM_TABLE + " i ON o.\"item_id\" = i.\"item_id\" RIGHT JOIN "
+            + JOIN_SUPPLIER_TABLE + " s ON i.\"supplier_id\" = s.\"supplier_id\" ORDER BY \"order_id\", s.\"supplier_id\" DESC";
         Properties props = new Properties(TEST_PROPERTIES);
         Connection conn = DriverManager.getConnection(PHOENIX_JDBC_URL, props);
         try {
@@ -944,9 +947,9 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
     
     @Test
     public void testMultiLeftJoin() throws Exception {
-        String query = "SELECT order_id, i.name, s.name, quantity, date FROM " + JOIN_ORDER_TABLE + " o LEFT JOIN " 
-            + JOIN_ITEM_TABLE + " i ON o.item_id = i.item_id LEFT JOIN "
-            + JOIN_SUPPLIER_TABLE + " s ON i.supplier_id = s.supplier_id";
+        String query = "SELECT \"order_id\", i.name, s.name, quantity, date FROM " + JOIN_ORDER_TABLE + " o LEFT JOIN " 
+            + JOIN_ITEM_TABLE + " i ON o.\"item_id\" = i.\"item_id\" LEFT JOIN "
+            + JOIN_SUPPLIER_TABLE + " s ON i.\"supplier_id\" = s.\"supplier_id\"";
         Properties props = new Properties(TEST_PROPERTIES);
         Connection conn = DriverManager.getConnection(PHOENIX_JDBC_URL, props);
         try {
@@ -991,9 +994,9 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
     
     @Test
     public void testMultiRightJoin() throws Exception {
-        String query = "SELECT order_id, i.name, s.name, quantity, date FROM " + JOIN_ORDER_TABLE + " o RIGHT JOIN " 
-            + JOIN_ITEM_TABLE + " i ON o.item_id = i.item_id RIGHT JOIN "
-            + JOIN_SUPPLIER_TABLE + " s ON i.supplier_id = s.supplier_id ORDER BY order_id, s.supplier_id DESC";
+        String query = "SELECT \"order_id\", i.name, s.name, quantity, date FROM " + JOIN_ORDER_TABLE + " o RIGHT JOIN " 
+            + JOIN_ITEM_TABLE + " i ON o.\"item_id\" = i.\"item_id\" RIGHT JOIN "
+            + JOIN_SUPPLIER_TABLE + " s ON i.\"supplier_id\" = s.\"supplier_id\" ORDER BY \"order_id\", s.\"supplier_id\" DESC";
         Properties props = new Properties(TEST_PROPERTIES);
         Connection conn = DriverManager.getConnection(PHOENIX_JDBC_URL, props);
         try {
@@ -1062,115 +1065,103 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
     
     @Test
     public void testJoinWithWildcard() throws Exception {
-        String query = "SELECT * FROM " + JOIN_ITEM_TABLE + " LEFT JOIN " + JOIN_SUPPLIER_TABLE + " supp ON " + JOIN_ITEM_TABLE + ".supplier_id = supp.supplier_id";
+        String query = "SELECT * FROM " + JOIN_ITEM_TABLE + " LEFT JOIN " + JOIN_SUPPLIER_TABLE + " supp ON " + JOIN_ITEM_TABLE + ".\"supplier_id\" = supp.\"supplier_id\" ORDER BY \"item_id\"";
         Properties props = new Properties(TEST_PROPERTIES);
         Connection conn = DriverManager.getConnection(PHOENIX_JDBC_URL, props);
         try {
             PreparedStatement statement = conn.prepareStatement(query);
             ResultSet rs = statement.executeQuery();
             assertTrue (rs.next());
-            assertEquals(rs.getString(1), "0000000001");
-            assertEquals(rs.getString(JOIN_ITEM_TABLE + ".item_id"), "0000000001");
-            assertEquals(rs.getString(2), "T1");
-            assertEquals(rs.getString(JOIN_ITEM_TABLE + ".name"), "T1");
-            assertEquals(rs.getInt(3), 100);
-            assertEquals(rs.getInt(JOIN_ITEM_TABLE + ".price"), 100);
-            assertEquals(rs.getInt(4), 5);
-            assertEquals(rs.getInt(JOIN_ITEM_TABLE + ".discount1"), 5);
-            assertEquals(rs.getInt(5), 10);
-            assertEquals(rs.getInt(JOIN_ITEM_TABLE + ".discount2"), 10);
-            assertEquals(rs.getString(6), "0000000001");
-            assertEquals(rs.getString(JOIN_ITEM_TABLE + ".supplier_id"), "0000000001");
-            assertEquals(rs.getString(7), "Item T1");
-            assertEquals(rs.getString(JOIN_ITEM_TABLE + ".description"), "Item T1");
-            assertEquals(rs.getString(8), "0000000001");
-            assertEquals(rs.getString("supp.supplier_id"), "0000000001");
-            assertEquals(rs.getString(9), "S1");
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".item_id"), "0000000001");
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".NAME"), "T1");
+            assertEquals(rs.getInt(JOIN_ITEM_TABLE_NORMALIZED + ".PRICE"), 100);
+            assertEquals(rs.getInt(JOIN_ITEM_TABLE_NORMALIZED + ".DISCOUNT1"), 5);
+            assertEquals(rs.getInt(JOIN_ITEM_TABLE_NORMALIZED + ".DISCOUNT2"), 10);
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".supplier_id"), "0000000001");
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".DESCRIPTION"), "Item T1");
+            assertEquals(rs.getString("SUPP.supplier_id"), "0000000001");
             assertEquals(rs.getString("supp.name"), "S1");
-            assertEquals(rs.getString(10), "888-888-1111");
             assertEquals(rs.getString("supp.phone"), "888-888-1111");
-            assertEquals(rs.getString(11), "101 YYY Street");
             assertEquals(rs.getString("supp.address"), "101 YYY Street");
-            assertEquals(rs.getString(12), "10001");            
             assertEquals(rs.getString("supp.loc_id"), "10001");            
             assertTrue (rs.next());
-            assertEquals(rs.getString(1), "0000000002");
-            assertEquals(rs.getString(2), "T2");
-            assertEquals(rs.getInt(3), 200);
-            assertEquals(rs.getInt(4), 5);
-            assertEquals(rs.getInt(5), 8);
-            assertEquals(rs.getString(6), "0000000001");
-            assertEquals(rs.getString(7), "Item T2");
-            assertEquals(rs.getString(8), "0000000001");
-            assertEquals(rs.getString(9), "S1");
-            assertEquals(rs.getString(10), "888-888-1111");
-            assertEquals(rs.getString(11), "101 YYY Street");
-            assertEquals(rs.getString(12), "10001");            
-            assertTrue (rs.next());
-            assertEquals(rs.getString(1), "0000000003");
-            assertEquals(rs.getString(2), "T3");
-            assertEquals(rs.getInt(3), 300);
-            assertEquals(rs.getInt(4), 8);
-            assertEquals(rs.getInt(5), 12);
-            assertEquals(rs.getString(6), "0000000002");
-            assertEquals(rs.getString(7), "Item T3");
-            assertEquals(rs.getString(8), "0000000002");
-            assertEquals(rs.getString(9), "S2");
-            assertEquals(rs.getString(10), "888-888-2222");
-            assertEquals(rs.getString(11), "202 YYY Street");
-            assertEquals(rs.getString(12), "10002");            
-            assertTrue (rs.next());
-            assertEquals(rs.getString(1), "0000000004");
-            assertEquals(rs.getString(2), "T4");
-            assertEquals(rs.getInt(3), 400);
-            assertEquals(rs.getInt(4), 6);
-            assertEquals(rs.getInt(5), 10);
-            assertEquals(rs.getString(6), "0000000002");
-            assertEquals(rs.getString(7), "Item T4");
-            assertEquals(rs.getString(8), "0000000002");
-            assertEquals(rs.getString(9), "S2");
-            assertEquals(rs.getString(10), "888-888-2222");
-            assertEquals(rs.getString(11), "202 YYY Street");
-            assertEquals(rs.getString(12), "10002");            
-            assertTrue (rs.next());
-            assertEquals(rs.getString(1), "0000000005");
-            assertEquals(rs.getString(2), "T5");
-            assertEquals(rs.getInt(3), 500);
-            assertEquals(rs.getInt(4), 8);
-            assertEquals(rs.getInt(5), 15);
-            assertEquals(rs.getString(6), "0000000005");
-            assertEquals(rs.getString(7), "Item T5");
-            assertEquals(rs.getString(8), "0000000005");
-            assertEquals(rs.getString(9), "S5");
-            assertEquals(rs.getString(10), "888-888-5555");
-            assertEquals(rs.getString(11), "505 YYY Street");
-            assertEquals(rs.getString(12), "10005");            
-            assertTrue (rs.next());
-            assertEquals(rs.getString(1), "0000000006");
-            assertEquals(rs.getString(2), "T6");
-            assertEquals(rs.getInt(3), 600);
-            assertEquals(rs.getInt(4), 8);
-            assertEquals(rs.getInt(5), 15);
-            assertEquals(rs.getString(6), "0000000006");
-            assertEquals(rs.getString(7), "Item T6");
-            assertEquals(rs.getString(8), "0000000006");
-            assertEquals(rs.getString(9), "S6");
-            assertEquals(rs.getString(10), "888-888-6666");
-            assertEquals(rs.getString(11), "606 YYY Street");
-            assertEquals(rs.getString(12), "10006");            
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".item_id"), "0000000002");
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".NAME"), "T2");
+            assertEquals(rs.getInt(JOIN_ITEM_TABLE_NORMALIZED + ".PRICE"), 200);
+            assertEquals(rs.getInt(JOIN_ITEM_TABLE_NORMALIZED + ".DISCOUNT1"), 5);
+            assertEquals(rs.getInt(JOIN_ITEM_TABLE_NORMALIZED + ".DISCOUNT2"), 8);
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".supplier_id"), "0000000001");
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".DESCRIPTION"), "Item T2");
+            assertEquals(rs.getString("SUPP.supplier_id"), "0000000001");
+            assertEquals(rs.getString("supp.name"), "S1");
+            assertEquals(rs.getString("supp.phone"), "888-888-1111");
+            assertEquals(rs.getString("supp.address"), "101 YYY Street");
+            assertEquals(rs.getString("supp.loc_id"), "10001");            
             assertTrue (rs.next());
-            assertEquals(rs.getString(1), "invalid001");
-            assertEquals(rs.getString(2), "INVALID-1");
-            assertEquals(rs.getInt(3), 0);
-            assertEquals(rs.getInt(4), 0);
-            assertEquals(rs.getInt(5), 0);
-            assertEquals(rs.getString(6), "0000000000");
-            assertEquals(rs.getString(7), "Invalid item for join test");
-            assertNull(rs.getString(8));
-            assertNull(rs.getString(9));
-            assertNull(rs.getString(10));
-            assertNull(rs.getString(11));
-            assertNull(rs.getString(12));
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".item_id"), "0000000003");
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".NAME"), "T3");
+            assertEquals(rs.getInt(JOIN_ITEM_TABLE_NORMALIZED + ".PRICE"), 300);
+            assertEquals(rs.getInt(JOIN_ITEM_TABLE_NORMALIZED + ".DISCOUNT1"), 8);
+            assertEquals(rs.getInt(JOIN_ITEM_TABLE_NORMALIZED + ".DISCOUNT2"), 12);
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".supplier_id"), "0000000002");
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".DESCRIPTION"), "Item T3");
+            assertEquals(rs.getString("SUPP.supplier_id"), "0000000002");
+            assertEquals(rs.getString("supp.name"), "S2");
+            assertEquals(rs.getString("supp.phone"), "888-888-2222");
+            assertEquals(rs.getString("supp.address"), "202 YYY Street");
+            assertEquals(rs.getString("supp.loc_id"), "10002");            
+            assertTrue (rs.next());
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".item_id"), "0000000004");
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".NAME"), "T4");
+            assertEquals(rs.getInt(JOIN_ITEM_TABLE_NORMALIZED + ".PRICE"), 400);
+            assertEquals(rs.getInt(JOIN_ITEM_TABLE_NORMALIZED + ".DISCOUNT1"), 6);
+            assertEquals(rs.getInt(JOIN_ITEM_TABLE_NORMALIZED + ".DISCOUNT2"), 10);
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".supplier_id"), "0000000002");
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".DESCRIPTION"), "Item T4");
+            assertEquals(rs.getString("SUPP.supplier_id"), "0000000002");
+            assertEquals(rs.getString("supp.name"), "S2");
+            assertEquals(rs.getString("supp.phone"), "888-888-2222");
+            assertEquals(rs.getString("supp.address"), "202 YYY Street");
+            assertEquals(rs.getString("supp.loc_id"), "10002");            
+            assertTrue (rs.next());
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".item_id"), "0000000005");
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".NAME"), "T5");
+            assertEquals(rs.getInt(JOIN_ITEM_TABLE_NORMALIZED + ".PRICE"), 500);
+            assertEquals(rs.getInt(JOIN_ITEM_TABLE_NORMALIZED + ".DISCOUNT1"), 8);
+            assertEquals(rs.getInt(JOIN_ITEM_TABLE_NORMALIZED + ".DISCOUNT2"), 15);
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".supplier_id"), "0000000005");
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".DESCRIPTION"), "Item T5");
+            assertEquals(rs.getString("SUPP.supplier_id"), "0000000005");
+            assertEquals(rs.getString("supp.name"), "S5");
+            assertEquals(rs.getString("supp.phone"), "888-888-5555");
+            assertEquals(rs.getString("supp.address"), "505 YYY Street");
+            assertEquals(rs.getString("supp.loc_id"), "10005");            
+            assertTrue (rs.next());
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".item_id"), "0000000006");
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".NAME"), "T6");
+            assertEquals(rs.getInt(JOIN_ITEM_TABLE_NORMALIZED + ".PRICE"), 600);
+            assertEquals(rs.getInt(JOIN_ITEM_TABLE_NORMALIZED + ".DISCOUNT1"), 8);
+            assertEquals(rs.getInt(JOIN_ITEM_TABLE_NORMALIZED + ".DISCOUNT2"), 15);
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".supplier_id"), "0000000006");
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".DESCRIPTION"), "Item T6");
+            assertEquals(rs.getString("SUPP.supplier_id"), "0000000006");
+            assertEquals(rs.getString("supp.name"), "S6");
+            assertEquals(rs.getString("supp.phone"), "888-888-6666");
+            assertEquals(rs.getString("supp.address"), "606 YYY Street");
+            assertEquals(rs.getString("supp.loc_id"), "10006");            
+            assertTrue (rs.next());
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".item_id"), "invalid001");
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".NAME"), "INVALID-1");
+            assertEquals(rs.getInt(JOIN_ITEM_TABLE_NORMALIZED + ".PRICE"), 0);
+            assertEquals(rs.getInt(JOIN_ITEM_TABLE_NORMALIZED + ".DISCOUNT1"), 0);
+            assertEquals(rs.getInt(JOIN_ITEM_TABLE_NORMALIZED + ".DISCOUNT2"), 0);
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".supplier_id"), "0000000000");
+            assertEquals(rs.getString(JOIN_ITEM_TABLE_NORMALIZED + ".DESCRIPTION"), "Invalid item for join test");
+            assertNull(rs.getString("SUPP.supplier_id"));
+            assertNull(rs.getString("supp.name"));
+            assertNull(rs.getString("supp.phone"));
+            assertNull(rs.getString("supp.address"));
+            assertNull(rs.getString("supp.loc_id"));
 
             assertFalse(rs.next());
         } finally {
@@ -1180,7 +1171,7 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
     
     @Test
     public void testJoinMultiJoinKeys() throws Exception {
-        String query = "SELECT c.name, s.name FROM " + JOIN_CUSTOMER_TABLE + " c LEFT JOIN " + JOIN_SUPPLIER_TABLE + " s ON customer_id = supplier_id AND c.loc_id = s.loc_id AND substr(s.name, 2, 1) = substr(c.name, 2, 1)";
+        String query = "SELECT c.name, s.name FROM " + JOIN_CUSTOMER_TABLE + " c LEFT JOIN " + JOIN_SUPPLIER_TABLE + " s ON \"customer_id\" = \"supplier_id\" AND c.loc_id = s.loc_id AND substr(s.name, 2, 1) = substr(c.name, 2, 1)";
         Properties props = new Properties(TEST_PROPERTIES);
         Connection conn = DriverManager.getConnection(PHOENIX_JDBC_URL, props);
         try {
@@ -1213,8 +1204,8 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
     
     @Test
     public void testJoinWithDifferentNumericJoinKeyTypes() throws Exception {
-        String query = "SELECT order_id, i.name, i.price, discount2, quantity FROM " + JOIN_ORDER_TABLE + " o INNER JOIN " 
-            + JOIN_ITEM_TABLE + " i ON o.item_id = i.item_id AND o.price = (i.price * (100 - discount2)) / 100.0 WHERE quantity < 5000";
+        String query = "SELECT \"order_id\", i.name, i.price, discount2, quantity FROM " + JOIN_ORDER_TABLE + " o INNER JOIN " 
+            + JOIN_ITEM_TABLE + " i ON o.\"item_id\" = i.\"item_id\" AND o.price = (i.price * (100 - discount2)) / 100.0 WHERE quantity < 5000";
         Properties props = new Properties(TEST_PROPERTIES);
         Connection conn = DriverManager.getConnection(PHOENIX_JDBC_URL, props);
         try {
@@ -1235,8 +1226,8 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
     
     @Test
     public void testJoinWithDifferentDateJoinKeyTypes() throws Exception {
-        String query = "SELECT order_id, c.name, o.date FROM " + JOIN_ORDER_TABLE + " o INNER JOIN " 
-            + JOIN_CUSTOMER_TABLE + " c ON o.customer_id = c.customer_id AND o.date = c.date";
+        String query = "SELECT \"order_id\", c.name, o.date FROM " + JOIN_ORDER_TABLE + " o INNER JOIN " 
+            + JOIN_CUSTOMER_TABLE + " c ON o.\"customer_id\" = c.\"customer_id\" AND o.date = c.date";
         Properties props = new Properties(TEST_PROPERTIES);
         Connection conn = DriverManager.getConnection(PHOENIX_JDBC_URL, props);
         try {
@@ -1268,8 +1259,8 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
     
     @Test
     public void testJoinWithIncomparableJoinKeyTypes() throws Exception {
-        String query = "SELECT order_id, i.name, i.price, discount2, quantity FROM " + JOIN_ORDER_TABLE + " o INNER JOIN " 
-            + JOIN_ITEM_TABLE + " i ON o.item_id = i.item_id AND o.price / 100 = substr(i.name, 2, 1)";
+        String query = "SELECT \"order_id\", i.name, i.price, discount2, quantity FROM " + JOIN_ORDER_TABLE + " o INNER JOIN " 
+            + JOIN_ITEM_TABLE + " i ON o.\"item_id\" = i.\"item_id\" AND o.price / 100 = substr(i.name, 2, 1)";
         Properties props = new Properties(TEST_PROPERTIES);
         Connection conn = DriverManager.getConnection(PHOENIX_JDBC_URL, props);
         try {
@@ -1285,8 +1276,8 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
     
     @Test
     public void testJoinPlanWithIndex() throws Exception {
-        String query1 = "SELECT item.item_id, item.name, supp.supplier_id, supp.name FROM " + JOIN_ITEM_TABLE + " item LEFT JOIN " + JOIN_SUPPLIER_TABLE + " supp ON substr(item.name, 2, 1) = substr(supp.name, 2, 1) AND (supp.name BETWEEN 'S1' AND 'S5') WHERE item.name BETWEEN 'T1' AND 'T5'";
-        String query2 = "SELECT item.item_id, item.name, supp.supplier_id, supp.name FROM " + JOIN_ITEM_TABLE + " item INNER JOIN " + JOIN_SUPPLIER_TABLE + " supp ON item.supplier_id = supp.supplier_id WHERE (item.name = 'T1' OR item.name = 'T5') AND (supp.name = 'S1' OR supp.name = 'S5')";
+        String query1 = "SELECT item.\"item_id\", item.name, supp.\"supplier_id\", supp.name FROM " + JOIN_ITEM_TABLE + " item LEFT JOIN " + JOIN_SUPPLIER_TABLE + " supp ON substr(item.name, 2, 1) = substr(supp.name, 2, 1) AND (supp.name BETWEEN 'S1' AND 'S5') WHERE item.name BETWEEN 'T1' AND 'T5'";
+        String query2 = "SELECT item.\"item_id\", item.name, supp.\"supplier_id\", supp.name FROM " + JOIN_ITEM_TABLE + " item INNER JOIN " + JOIN_SUPPLIER_TABLE + " supp ON item.\"supplier_id\" = supp.\"supplier_id\" WHERE (item.name = 'T1' OR item.name = 'T5') AND (supp.name = 'S1' OR supp.name = 'S5')";
         Properties props = new Properties(TEST_PROPERTIES);
         Connection conn = DriverManager.getConnection(PHOENIX_JDBC_URL, props);
         try {
@@ -1349,8 +1340,8 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
     @Test
     public void testJoinWithSkipMergeOptimization() throws Exception {
         String query = "SELECT s.name FROM " + JOIN_ITEM_TABLE + " i JOIN " 
-            + JOIN_ORDER_TABLE + " o ON o.item_id = i.item_id AND quantity < 5000 JOIN "
-            + JOIN_SUPPLIER_TABLE + " s ON i.supplier_id = s.supplier_id";
+            + JOIN_ORDER_TABLE + " o ON o.\"item_id\" = i.\"item_id\" AND quantity < 5000 JOIN "
+            + JOIN_SUPPLIER_TABLE + " s ON i.\"supplier_id\" = s.\"supplier_id\"";
         Properties props = new Properties(TEST_PROPERTIES);
         Connection conn = DriverManager.getConnection(PHOENIX_JDBC_URL, props);
         try {
@@ -1376,10 +1367,10 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
     
     @Test
     public void testSelfJoin() throws Exception {
-        String query1 = "SELECT i2.item_id, i1.name FROM " + JOIN_ITEM_TABLE + " i1 JOIN " 
-            + JOIN_ITEM_TABLE + " i2 ON i1.item_id = i2.item_id ORDER BY i1.item_id";
+        String query1 = "SELECT i2.\"item_id\", i1.name FROM " + JOIN_ITEM_TABLE + " i1 JOIN " 
+            + JOIN_ITEM_TABLE + " i2 ON i1.\"item_id\" = i2.\"item_id\" ORDER BY i1.\"item_id\"";
         String query2 = "SELECT i1.name, i2.name FROM " + JOIN_ITEM_TABLE + " i1 JOIN " 
-        + JOIN_ITEM_TABLE + " i2 ON i1.item_id = i2.supplier_id ORDER BY i1.name, i2.name";
+        + JOIN_ITEM_TABLE + " i2 ON i1.\"item_id\" = i2.\"supplier_id\" ORDER BY i1.name, i2.name";
         Properties props = new Properties(TEST_PROPERTIES);
         Connection conn = DriverManager.getConnection(PHOENIX_JDBC_URL, props);
         try {
@@ -1444,23 +1435,23 @@ public class HashJoinTest extends BaseHBaseManagedTimeTest {
         conn.setAutoCommit(true);
         try {
             conn.createStatement().execute("CREATE TABLE " + tempTable 
-                    + "   (order_id varchar not null, " 
+                    + "   (\"order_id\" varchar not null, " 
                     + "    item_name varchar not null, " 
                     + "    supplier_name varchar, "
                     + "    quantity integer, "
                     + "    date timestamp " 
-                    + "    CONSTRAINT pk PRIMARY KEY (order_id, item_name))");
+                    + "    CONSTRAINT pk PRIMARY KEY (\"order_id\", item_name))");
             conn.createStatement().execute("UPSERT INTO " + tempTable 
-                    + "(order_id, item_name, supplier_name, quantity, date) " 
-                    + "SELECT order_id, i.name, s.name, quantity, date FROM " 
+                    + "(\"order_id\", item_name, supplier_name, quantity, date) " 
+                    + "SELECT \"order_id\", i.name, s.name, quantity, date FROM " 
                     + JOIN_ORDER_TABLE + " o LEFT JOIN " 
-                    + JOIN_ITEM_TABLE + " i ON o.item_id = i.item_id LEFT JOIN "
-                    + JOIN_SUPPLIER_TABLE + " s ON i.supplier_id = s.supplier_id");
+                    + JOIN_ITEM_TABLE + " i ON o.\"item_id\" = i.\"item_id\" LEFT JOIN "
+                    + JOIN_SUPPLIER_TABLE + " s ON i.\"supplier_id\" = s.\"supplier_id\"");
             conn.createStatement().execute("UPSERT INTO " + tempTable 
-                    + "(order_id, item_name, quantity) " 
+                    + "(\"order_id\", item_name, quantity) " 
                     + "SELECT 'ORDER_SUM', i.name, sum(quantity) FROM " 
                     + JOIN_ORDER_TABLE + " o LEFT JOIN " 
-                    + JOIN_ITEM_TABLE + " i ON o.item_id = i.item_id " 
+                    + JOIN_ITEM_TABLE + " i ON o.\"item_id\" = i.\"item_id\" " 
                     + "GROUP BY i.name ORDER BY i.name");
             
             String query = "SELECT * FROM " + tempTable;


[3/3] git commit: Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-phoenix

Posted by ma...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-phoenix


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

Branch: refs/heads/master
Commit: 47707a7a782da180f5b953c21d1e509957a9a877
Parents: c3bb694 d3f2b65
Author: maryannxue <ma...@apache.org>
Authored: Tue Feb 4 19:39:51 2014 -0500
Committer: maryannxue <ma...@apache.org>
Committed: Tue Feb 4 19:39:51 2014 -0500

----------------------------------------------------------------------
 .../apache/phoenix/compile/DeleteCompiler.java  |  21 +-
 .../apache/phoenix/compile/FromCompiler.java    |  25 +--
 .../apache/phoenix/compile/QueryCompiler.java   |   3 +-
 .../org/apache/phoenix/compile/ScanRanges.java  | 112 ++++++++--
 .../phoenix/compile/StatementContext.java       |  14 +-
 .../apache/phoenix/compile/WhereOptimizer.java  |  53 +++--
 .../apache/phoenix/filter/SkipScanFilter.java   |  56 +----
 .../apache/phoenix/iterate/ExplainTable.java    |  35 ++--
 .../iterate/MergeSortTopNResultIterator.java    |   3 +-
 .../apache/phoenix/optimize/QueryOptimizer.java |  53 +++--
 .../java/org/apache/phoenix/parse/HintNode.java |   4 +
 .../apache/phoenix/schema/MetaDataClient.java   |  28 ++-
 .../org/apache/phoenix/schema/SaltingUtil.java  |  78 +------
 .../java/org/apache/phoenix/util/ScanUtil.java  |  46 +----
 .../org/apache/phoenix/util/SchemaUtil.java     |  36 +++-
 .../phoenix/compile/QueryCompileTest.java       |  14 +-
 .../phoenix/compile/QueryOptimizerTest.java     |  31 ++-
 .../phoenix/compile/WhereClauseCompileTest.java | 156 +++++++++++---
 .../compile/WhereClauseOptimizerTest.java       |  16 +-
 .../apache/phoenix/end2end/QueryPlanTest.java   |   4 +-
 .../end2end/TenantSpecificTablesDMLTest.java    | 124 +++++++----
 .../phoenix/end2end/index/BaseIndexTest.java    |  31 +++
 .../end2end/index/BaseMutableIndexTest.java     |  10 +-
 .../end2end/index/ImmutableIndexTest.java       | 157 +-------------
 .../phoenix/end2end/index/MutableIndexTest.java |   8 +-
 .../end2end/index/MutableSaltedIndexTest.java   | 189 -----------------
 .../phoenix/end2end/index/SaltedIndexTest.java  | 203 +++++++++++++++++++
 27 files changed, 785 insertions(+), 725 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/47707a7a/phoenix-core/src/main/java/org/apache/phoenix/compile/QueryCompiler.java
----------------------------------------------------------------------