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
----------------------------------------------------------------------