You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by sa...@apache.org on 2017/02/14 23:42:21 UTC
[32/50] [abbrv] phoenix git commit: PHOENIX-3453 Secondary index and
query using distinct: Outer query results in ERROR 201 (22000): Illegal data.
CHAR types may only contain single byte characters (chenglei)
PHOENIX-3453 Secondary index and query using distinct: Outer query results in ERROR 201 (22000): Illegal data. CHAR types may only contain single byte characters (chenglei)
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/96b3ceed
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/96b3ceed
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/96b3ceed
Branch: refs/heads/encodecolumns2
Commit: 96b3ceedb8ecf8dc9a46fea2a2752b742a8e0e61
Parents: f6dfb6d
Author: James Taylor <ja...@apache.org>
Authored: Tue Feb 14 12:19:17 2017 -0800
Committer: James Taylor <ja...@apache.org>
Committed: Tue Feb 14 12:20:19 2017 -0800
----------------------------------------------------------------------
.../apache/phoenix/end2end/GroupByCaseIT.java | 66 +++++++++++++++++++-
.../phoenix/expression/CoerceExpression.java | 2 +-
.../phoenix/compile/QueryCompilerTest.java | 42 +++++++++++++
3 files changed, 106 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/phoenix/blob/96b3ceed/phoenix-core/src/it/java/org/apache/phoenix/end2end/GroupByCaseIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/GroupByCaseIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/GroupByCaseIT.java
index ca54502..629e9ae 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/GroupByCaseIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/GroupByCaseIT.java
@@ -866,12 +866,72 @@ public class GroupByCaseIT extends ParallelStatsDisabledIT {
}
}
- private void assertResultSet(ResultSet rs,String[][] rows) throws Exception {
+ @Test
+ public void testGroupByCoerceExpressionBug3453() throws Exception {
+ final Connection conn = DriverManager.getConnection(getUrl());
+ try {
+ //Type is INT
+ String intTableName=generateUniqueName();
+ String sql="CREATE TABLE "+ intTableName +"("+
+ "ENTITY_ID INTEGER NOT NULL,"+
+ "CONTAINER_ID INTEGER NOT NULL,"+
+ "SCORE INTEGER NOT NULL,"+
+ "CONSTRAINT TEST_PK PRIMARY KEY (ENTITY_ID DESC,CONTAINER_ID DESC,SCORE DESC))";
+
+ conn.createStatement().execute(sql);
+ conn.createStatement().execute("UPSERT INTO "+intTableName+" VALUES (1,1,1)");
+ conn.commit();
+
+ sql="select DISTINCT entity_id, score from ( select entity_id, score from "+intTableName+" limit 1)";
+ ResultSet rs=conn.prepareStatement(sql).executeQuery();
+ assertResultSet(rs, new Object[][]{{1,1}});
+
+ conn.createStatement().execute("UPSERT INTO "+intTableName+" VALUES (2,2,2)");
+ conn.createStatement().execute("UPSERT INTO "+intTableName+" VALUES (3,3,3)");
+ conn.commit();
+
+ sql="select DISTINCT entity_id, score from ( select entity_id, score from "+intTableName+" limit 3) order by entity_id";
+ rs=conn.prepareStatement(sql).executeQuery();
+ assertResultSet(rs, new Object[][]{{1,1},{2,2},{3,3}});
+
+ sql="select DISTINCT entity_id, score from ( select entity_id, score from "+intTableName+" limit 3) order by entity_id desc";
+ rs=conn.prepareStatement(sql).executeQuery();
+ assertResultSet(rs, new Object[][]{{3,3},{2,2},{1,1}});
+
+ //Type is CHAR
+ String charTableName=generateUniqueName();
+ sql="CREATE TABLE "+ charTableName +"("+
+ "ENTITY_ID CHAR(15) NOT NULL,"+
+ "CONTAINER_ID INTEGER NOT NULL,"+
+ "SCORE INTEGER NOT NULL,"+
+ "CONSTRAINT TEST_PK PRIMARY KEY (ENTITY_ID DESC,CONTAINER_ID DESC,SCORE DESC))";
+
+ conn.createStatement().execute(sql);
+ conn.createStatement().execute("UPSERT INTO "+charTableName+" VALUES ('entity1',1,1)");
+ conn.createStatement().execute("UPSERT INTO "+charTableName+" VALUES ('entity2',2,2)");
+ conn.createStatement().execute("UPSERT INTO "+charTableName+" VALUES ('entity3',3,3)");
+ conn.commit();
+
+ sql="select DISTINCT entity_id, score from ( select entity_id, score from "+charTableName+" limit 3) order by entity_id";
+ rs=conn.prepareStatement(sql).executeQuery();
+ assertResultSet(rs, new Object[][]{{"entity1",1},{"entity2",2},{"entity3",3}});
+
+ sql="select DISTINCT entity_id, score from ( select entity_id, score from "+charTableName+" limit 3) order by entity_id desc";
+ rs=conn.prepareStatement(sql).executeQuery();
+ assertResultSet(rs, new Object[][]{{"entity3",3},{"entity2",2},{"entity1",1}});
+ } finally {
+ if(conn!=null) {
+ conn.close();
+ }
+ }
+ }
+
+ private void assertResultSet(ResultSet rs,Object[][] rows) throws Exception {
for(int rowIndex=0;rowIndex<rows.length;rowIndex++) {
assertTrue(rs.next());
for(int columnIndex=1;columnIndex<= rows[rowIndex].length;columnIndex++) {
- String realValue=rs.getString(columnIndex);
- String expectedValue=rows[rowIndex][columnIndex-1];
+ Object realValue=rs.getObject(columnIndex);
+ Object expectedValue=rows[rowIndex][columnIndex-1];
if(realValue==null) {
assertTrue(expectedValue==null);
}
http://git-wip-us.apache.org/repos/asf/phoenix/blob/96b3ceed/phoenix-core/src/main/java/org/apache/phoenix/expression/CoerceExpression.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/expression/CoerceExpression.java b/phoenix-core/src/main/java/org/apache/phoenix/expression/CoerceExpression.java
index c31cb0a..19404f0 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/expression/CoerceExpression.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/expression/CoerceExpression.java
@@ -65,7 +65,7 @@ public class CoerceExpression extends BaseSingleExpression {
//Package protected for tests
CoerceExpression(Expression expression, PDataType toType) {
- this(expression, toType, SortOrder.getDefault(), null, true);
+ this(expression, toType, expression.getSortOrder(), null, true);
}
CoerceExpression(Expression expression, PDataType toType, SortOrder toSortOrder, Integer maxLength, boolean rowKeyOrderOptimizable) {
http://git-wip-us.apache.org/repos/asf/phoenix/blob/96b3ceed/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java b/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java
index 8336f81..2c4eccc 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java
@@ -72,6 +72,7 @@ import org.apache.phoenix.schema.ColumnNotFoundException;
import org.apache.phoenix.schema.PColumn;
import org.apache.phoenix.schema.PTable;
import org.apache.phoenix.schema.PTableKey;
+import org.apache.phoenix.schema.SortOrder;
import org.apache.phoenix.schema.types.PChar;
import org.apache.phoenix.schema.types.PDecimal;
import org.apache.phoenix.schema.types.PInteger;
@@ -3879,6 +3880,47 @@ public class QueryCompilerTest extends BaseConnectionlessQueryTest {
}
}
+ @Test
+ public void testGroupByCoerceExpressionBug3453() throws Exception {
+ Connection conn = null;
+ try {
+ conn= DriverManager.getConnection(getUrl());
+ String tableName="GROUPBY3453_INT";
+ String sql="CREATE TABLE "+ tableName +"("+
+ "ENTITY_ID INTEGER NOT NULL,"+
+ "CONTAINER_ID INTEGER NOT NULL,"+
+ "SCORE INTEGER NOT NULL,"+
+ "CONSTRAINT TEST_PK PRIMARY KEY (ENTITY_ID DESC,CONTAINER_ID DESC,SCORE DESC))";
+ conn.createStatement().execute(sql);
+ sql="select DISTINCT entity_id, score from ( select entity_id, score from "+tableName+" limit 1)";
+ QueryPlan queryPlan=getQueryPlan(conn, sql);
+ assertTrue(queryPlan.getGroupBy().getExpressions().get(0).getSortOrder()==SortOrder.DESC);
+ assertTrue(queryPlan.getGroupBy().getExpressions().get(1).getSortOrder()==SortOrder.DESC);
+ assertTrue(queryPlan.getGroupBy().getKeyExpressions().get(0).getSortOrder()==SortOrder.DESC);
+ assertTrue(queryPlan.getGroupBy().getKeyExpressions().get(1).getSortOrder()==SortOrder.DESC);
+
+ sql="select DISTINCT entity_id, score from ( select entity_id, score from "+tableName+" limit 3) order by entity_id";
+ queryPlan=getQueryPlan(conn, sql);
+ assertTrue(queryPlan.getGroupBy().getExpressions().get(0).getSortOrder()==SortOrder.DESC);
+ assertTrue(queryPlan.getGroupBy().getExpressions().get(1).getSortOrder()==SortOrder.DESC);
+ assertTrue(queryPlan.getGroupBy().getKeyExpressions().get(0).getSortOrder()==SortOrder.DESC);
+ assertTrue(queryPlan.getGroupBy().getKeyExpressions().get(1).getSortOrder()==SortOrder.DESC);
+ assertTrue(queryPlan.getOrderBy().getOrderByExpressions().get(0).getExpression().getSortOrder()==SortOrder.DESC);
+
+ sql="select DISTINCT entity_id, score from ( select entity_id, score from "+tableName+" limit 3) order by entity_id desc";
+ queryPlan=getQueryPlan(conn, sql);
+ assertTrue(queryPlan.getGroupBy().getExpressions().get(0).getSortOrder()==SortOrder.DESC);
+ assertTrue(queryPlan.getGroupBy().getExpressions().get(1).getSortOrder()==SortOrder.DESC);
+ assertTrue(queryPlan.getGroupBy().getKeyExpressions().get(0).getSortOrder()==SortOrder.DESC);
+ assertTrue(queryPlan.getGroupBy().getKeyExpressions().get(1).getSortOrder()==SortOrder.DESC);
+ assertTrue(queryPlan.getOrderBy()==OrderBy.FWD_ROW_KEY_ORDER_BY);
+ } finally {
+ if(conn!=null) {
+ conn.close();
+ }
+ }
+ }
+
private static QueryPlan getQueryPlan(Connection conn,String sql) throws SQLException {
PhoenixPreparedStatement statement = conn.prepareStatement(sql).unwrap(PhoenixPreparedStatement.class);
QueryPlan queryPlan = statement.optimizeQuery(sql);