You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ma...@apache.org on 2016/05/20 17:19:25 UTC
[1/2] phoenix git commit: PHOENIX-2894 Sort-merge join works
incorrectly with DESC columns
Repository: phoenix
Updated Branches:
refs/heads/master 8445d0206 -> 01405d5d6
PHOENIX-2894 Sort-merge join works incorrectly with DESC columns
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/2f329e0a
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/2f329e0a
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/2f329e0a
Branch: refs/heads/master
Commit: 2f329e0ad62aaeb80b3d8eae6fc48c96010d5cf6
Parents: 4ee0989
Author: maryannxue <ma...@gmail.com>
Authored: Fri May 20 12:24:16 2016 -0400
Committer: maryannxue <ma...@gmail.com>
Committed: Fri May 20 12:24:16 2016 -0400
----------------------------------------------------------------------
.../apache/phoenix/end2end/HashJoinMoreIT.java | 185 +++++++++++++++++
.../phoenix/end2end/SortMergeJoinMoreIT.java | 199 +++++++++++++++++++
.../apache/phoenix/compile/JoinCompiler.java | 9 +-
3 files changed, 389 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/phoenix/blob/2f329e0a/phoenix-core/src/it/java/org/apache/phoenix/end2end/HashJoinMoreIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/HashJoinMoreIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/HashJoinMoreIT.java
index 98264f0..128baf3 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/HashJoinMoreIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/HashJoinMoreIT.java
@@ -690,4 +690,189 @@ public class HashJoinMoreIT extends BaseHBaseManagedTimeIT {
conn.close();
}
}
+
+ @Test
+ public void testBug2894() throws Exception {
+ Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+ Connection conn = DriverManager.getConnection(getUrl(), props);
+ conn.setAutoCommit(true);
+ try {
+ conn.createStatement().execute(
+ "CREATE TABLE IF NOT EXISTS EVENT_COUNT (\n" +
+ " BUCKET VARCHAR,\n" +
+ " TIMESTAMP_DATE TIMESTAMP,\n" +
+ " TIMESTAMP UNSIGNED_LONG NOT NULL,\n" +
+ " LOCATION VARCHAR,\n" +
+ " A VARCHAR,\n" +
+ " B VARCHAR,\n" +
+ " C VARCHAR,\n" +
+ " D UNSIGNED_LONG,\n" +
+ " E FLOAT\n" +
+ " CONSTRAINT pk PRIMARY KEY (BUCKET, TIMESTAMP DESC, LOCATION, A, B, C)\n" +
+ ") SALT_BUCKETS=2, COMPRESSION='GZ', TTL=31622400");
+ PreparedStatement stmt = conn.prepareStatement("UPSERT INTO EVENT_COUNT(BUCKET, TIMESTAMP, LOCATION, A, B, C) VALUES(?,?,?,?,?,?)");
+ stmt.setString(1, "5SEC");
+ stmt.setString(3, "Tr/Bal");
+ stmt.setString(4, "A1");
+ stmt.setString(5, "B1");
+ stmt.setString(6, "C1");
+ stmt.setLong(2, 1462993520000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993515000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993510000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993505000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993500000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993495000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993490000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993485000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993480000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993475000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993470000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993465000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993460000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993455000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993450000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993445000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993440000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993430000000000L);
+ stmt.execute();
+
+ // We'll test the original version of the user table as well as a slightly modified
+ // version, in order to verify that hash join works for columns both having DESC
+ // sort order as well as one having ASC order and the other having DESC order.
+ String[] t = new String[] {"EVENT_LATENCY", "EVENT_LATENCY_2"};
+ for (int i = 0; i < 2; i++) {
+ conn.createStatement().execute(
+ "CREATE TABLE IF NOT EXISTS " + t[i] + " (\n" +
+ " BUCKET VARCHAR,\n" +
+ " TIMESTAMP_DATE TIMESTAMP,\n" +
+ " TIMESTAMP UNSIGNED_LONG NOT NULL,\n" +
+ " SRC_LOCATION VARCHAR,\n" +
+ " DST_LOCATION VARCHAR,\n" +
+ " B VARCHAR,\n" +
+ " C VARCHAR,\n" +
+ " F UNSIGNED_LONG,\n" +
+ " G UNSIGNED_LONG,\n" +
+ " H UNSIGNED_LONG,\n" +
+ " I UNSIGNED_LONG\n" +
+ " CONSTRAINT pk PRIMARY KEY (BUCKET, TIMESTAMP" + (i == 0 ? " DESC" : "") + ", SRC_LOCATION, DST_LOCATION, B, C)\n" +
+ ") SALT_BUCKETS=2, COMPRESSION='GZ', TTL=31622400");
+ stmt = conn.prepareStatement("UPSERT INTO " + t[i] + "(BUCKET, TIMESTAMP, SRC_LOCATION, DST_LOCATION, B, C) VALUES(?,?,?,?,?,?)");
+ stmt.setString(1, "5SEC");
+ stmt.setString(3, "Tr/Bal");
+ stmt.setString(4, "Tr/Bal");
+ stmt.setString(5, "B1");
+ stmt.setString(6, "C1");
+ stmt.setLong(2, 1462993520000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993515000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993510000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993505000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993490000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993485000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993480000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993475000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993470000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993430000000000L);
+ stmt.execute();
+
+ String q =
+ "SELECT C.BUCKET, C.TIMESTAMP FROM (\n" +
+ " SELECT E.BUCKET as BUCKET, L.BUCKET as LBUCKET, E.TIMESTAMP as TIMESTAMP, L.TIMESTAMP as LTIMESTAMP FROM\n" +
+ " (SELECT BUCKET, TIMESTAMP FROM EVENT_COUNT\n" +
+ " WHERE BUCKET = '5SEC' AND LOCATION = 'Tr/Bal'\n" +
+ " AND TIMESTAMP <= 1462993520000000000 AND TIMESTAMP > 1462993420000000000\n" +
+ " ) E\n" +
+ " JOIN\n" +
+ " (SELECT BUCKET, TIMESTAMP FROM "+ t[i] +"\n" +
+ " WHERE BUCKET = '5SEC' AND SRC_LOCATION = 'Tr/Bal' AND SRC_LOCATION = DST_LOCATION\n" +
+ " AND TIMESTAMP <= 1462993520000000000 AND TIMESTAMP > 1462993420000000000\n" +
+ " ) L\n" +
+ " ON L.BUCKET = E.BUCKET AND L.TIMESTAMP = E.TIMESTAMP\n" +
+ " ) C\n" +
+ " GROUP BY C.BUCKET, C.TIMESTAMP";
+
+ String p = i == 0 ?
+ "CLIENT PARALLEL 2-WAY SKIP SCAN ON 2 RANGES OVER EVENT_COUNT [0,'5SEC',~1462993520000000000,'Tr/Bal'] - [1,'5SEC',~1462993420000000000,'Tr/Bal']\n" +
+ " SERVER FILTER BY FIRST KEY ONLY\n" +
+ " SERVER AGGREGATE INTO DISTINCT ROWS BY [E.BUCKET, E.TIMESTAMP]\n" +
+ "CLIENT MERGE SORT\n" +
+ " PARALLEL INNER-JOIN TABLE 0 (SKIP MERGE)\n" +
+ " CLIENT PARALLEL 2-WAY SKIP SCAN ON 2 RANGES OVER " + t[i] + " [0,'5SEC',~1462993520000000000,'Tr/Bal'] - [1,'5SEC',~1462993420000000000,'Tr/Bal']\n" +
+ " SERVER FILTER BY FIRST KEY ONLY AND SRC_LOCATION = DST_LOCATION\n" +
+ " CLIENT MERGE SORT"
+ :
+ "CLIENT PARALLEL 2-WAY SKIP SCAN ON 2 RANGES OVER EVENT_COUNT [0,'5SEC',~1462993520000000000,'Tr/Bal'] - [1,'5SEC',~1462993420000000000,'Tr/Bal']\n" +
+ " SERVER FILTER BY FIRST KEY ONLY\n" +
+ " SERVER AGGREGATE INTO DISTINCT ROWS BY [E.BUCKET, E.TIMESTAMP]\n" +
+ "CLIENT MERGE SORT\n" +
+ " PARALLEL INNER-JOIN TABLE 0 (SKIP MERGE)\n" +
+ " CLIENT PARALLEL 2-WAY SKIP SCAN ON 2 RANGES OVER " + t[i] + " [0,'5SEC',1462993420000000001,'Tr/Bal'] - [1,'5SEC',1462993520000000000,'Tr/Bal']\n" +
+ " SERVER FILTER BY FIRST KEY ONLY AND SRC_LOCATION = DST_LOCATION\n" +
+ " CLIENT MERGE SORT";
+
+ ResultSet rs = conn.createStatement().executeQuery("explain " + q);
+ assertEquals(p, QueryUtil.getExplainPlan(rs));
+
+ rs = conn.createStatement().executeQuery(q);
+ assertTrue(rs.next());
+ assertEquals("5SEC", rs.getString(1));
+ assertEquals(1462993520000000000L, rs.getLong(2));
+ assertTrue(rs.next());
+ assertEquals("5SEC", rs.getString(1));
+ assertEquals(1462993515000000000L, rs.getLong(2));
+ assertTrue(rs.next());
+ assertEquals("5SEC", rs.getString(1));
+ assertEquals(1462993510000000000L, rs.getLong(2));
+ assertTrue(rs.next());
+ assertEquals("5SEC", rs.getString(1));
+ assertEquals(1462993505000000000L, rs.getLong(2));
+ assertTrue(rs.next());
+ assertEquals("5SEC", rs.getString(1));
+ assertEquals(1462993490000000000L, rs.getLong(2));
+ assertTrue(rs.next());
+ assertEquals("5SEC", rs.getString(1));
+ assertEquals(1462993485000000000L, rs.getLong(2));
+ assertTrue(rs.next());
+ assertEquals("5SEC", rs.getString(1));
+ assertEquals(1462993480000000000L, rs.getLong(2));
+ assertTrue(rs.next());
+ assertEquals("5SEC", rs.getString(1));
+ assertEquals(1462993475000000000L, rs.getLong(2));
+ assertTrue(rs.next());
+ assertEquals("5SEC", rs.getString(1));
+ assertEquals(1462993470000000000L, rs.getLong(2));
+ assertTrue(rs.next());
+ assertEquals("5SEC", rs.getString(1));
+ assertEquals(1462993430000000000L, rs.getLong(2));
+ assertFalse(rs.next());
+ }
+ } finally {
+ conn.close();
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/phoenix/blob/2f329e0a/phoenix-core/src/it/java/org/apache/phoenix/end2end/SortMergeJoinMoreIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/SortMergeJoinMoreIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/SortMergeJoinMoreIT.java
index d9016d0..c36b24d 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/SortMergeJoinMoreIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/SortMergeJoinMoreIT.java
@@ -32,6 +32,7 @@ import java.util.Properties;
import org.apache.phoenix.query.QueryServices;
import org.apache.phoenix.util.PropertiesUtil;
+import org.apache.phoenix.util.QueryUtil;
import org.apache.phoenix.util.ReadOnlyProps;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -311,4 +312,202 @@ public class SortMergeJoinMoreIT extends BaseHBaseManagedTimeIT {
conn.close();
}
}
+
+ @Test
+ public void testBug2894() throws Exception {
+ Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+ Connection conn = DriverManager.getConnection(getUrl(), props);
+ conn.setAutoCommit(true);
+ try {
+ conn.createStatement().execute(
+ "CREATE TABLE IF NOT EXISTS EVENT_COUNT (\n" +
+ " BUCKET VARCHAR,\n" +
+ " TIMESTAMP_DATE TIMESTAMP,\n" +
+ " TIMESTAMP UNSIGNED_LONG NOT NULL,\n" +
+ " LOCATION VARCHAR,\n" +
+ " A VARCHAR,\n" +
+ " B VARCHAR,\n" +
+ " C VARCHAR,\n" +
+ " D UNSIGNED_LONG,\n" +
+ " E FLOAT\n" +
+ " CONSTRAINT pk PRIMARY KEY (BUCKET, TIMESTAMP DESC, LOCATION, A, B, C)\n" +
+ ") SALT_BUCKETS=2, COMPRESSION='GZ', TTL=31622400");
+ PreparedStatement stmt = conn.prepareStatement("UPSERT INTO EVENT_COUNT(BUCKET, TIMESTAMP, LOCATION, A, B, C) VALUES(?,?,?,?,?,?)");
+ stmt.setString(1, "5SEC");
+ stmt.setString(3, "Tr/Bal");
+ stmt.setString(4, "A1");
+ stmt.setString(5, "B1");
+ stmt.setString(6, "C1");
+ stmt.setLong(2, 1462993520000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993515000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993510000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993505000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993500000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993495000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993490000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993485000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993480000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993475000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993470000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993465000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993460000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993455000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993450000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993445000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993440000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993430000000000L);
+ stmt.execute();
+
+ // We'll test the original version of the user table as well as a slightly modified
+ // version, in order to verify that sort-merge join works for columns both having
+ // DESC sort order as well as one having ASC order and the other having DESC order.
+ String[] t = new String[] {"EVENT_LATENCY", "EVENT_LATENCY_2"};
+ for (int i = 0; i < 2; i++) {
+ conn.createStatement().execute(
+ "CREATE TABLE IF NOT EXISTS " + t[i] + " (\n" +
+ " BUCKET VARCHAR,\n" +
+ " TIMESTAMP_DATE TIMESTAMP,\n" +
+ " TIMESTAMP UNSIGNED_LONG NOT NULL,\n" +
+ " SRC_LOCATION VARCHAR,\n" +
+ " DST_LOCATION VARCHAR,\n" +
+ " B VARCHAR,\n" +
+ " C VARCHAR,\n" +
+ " F UNSIGNED_LONG,\n" +
+ " G UNSIGNED_LONG,\n" +
+ " H UNSIGNED_LONG,\n" +
+ " I UNSIGNED_LONG\n" +
+ " CONSTRAINT pk PRIMARY KEY (BUCKET, TIMESTAMP" + (i == 0 ? " DESC" : "") + ", SRC_LOCATION, DST_LOCATION, B, C)\n" +
+ ") SALT_BUCKETS=2, COMPRESSION='GZ', TTL=31622400");
+ stmt = conn.prepareStatement("UPSERT INTO " + t[i] + "(BUCKET, TIMESTAMP, SRC_LOCATION, DST_LOCATION, B, C) VALUES(?,?,?,?,?,?)");
+ stmt.setString(1, "5SEC");
+ stmt.setString(3, "Tr/Bal");
+ stmt.setString(4, "Tr/Bal");
+ stmt.setString(5, "B1");
+ stmt.setString(6, "C1");
+ stmt.setLong(2, 1462993520000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993515000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993510000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993505000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993490000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993485000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993480000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993475000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993470000000000L);
+ stmt.execute();
+ stmt.setLong(2, 1462993430000000000L);
+ stmt.execute();
+
+ String q =
+ "SELECT C.BUCKET, C.TIMESTAMP FROM (\n" +
+ " SELECT E.BUCKET as BUCKET, L.BUCKET as LBUCKET, E.TIMESTAMP as TIMESTAMP, L.TIMESTAMP as LTIMESTAMP FROM\n" +
+ " (SELECT BUCKET, TIMESTAMP FROM EVENT_COUNT\n" +
+ " WHERE BUCKET = '5SEC' AND LOCATION = 'Tr/Bal'\n" +
+ " AND TIMESTAMP <= 1462993520000000000 AND TIMESTAMP > 1462993420000000000\n" +
+ " GROUP BY BUCKET, TIMESTAMP, LOCATION\n" +
+ " ) E\n" +
+ " JOIN\n" +
+ " (SELECT BUCKET, TIMESTAMP FROM "+ t[i] +"\n" +
+ " WHERE BUCKET = '5SEC' AND SRC_LOCATION = 'Tr/Bal' AND SRC_LOCATION = DST_LOCATION\n" +
+ " AND TIMESTAMP <= 1462993520000000000 AND TIMESTAMP > 1462993420000000000\n" +
+ " GROUP BY BUCKET, TIMESTAMP, SRC_LOCATION, DST_LOCATION\n" +
+ " ) L\n" +
+ " ON L.BUCKET = E.BUCKET AND L.TIMESTAMP = E.TIMESTAMP\n" +
+ " ) C\n" +
+ " GROUP BY C.BUCKET, C.TIMESTAMP";
+
+ String p = i == 0 ?
+ "SORT-MERGE-JOIN (INNER) TABLES\n" +
+ " CLIENT PARALLEL 2-WAY SKIP SCAN ON 2 RANGES OVER EVENT_COUNT [0,'5SEC',~1462993520000000000,'Tr/Bal'] - [1,'5SEC',~1462993420000000000,'Tr/Bal']\n" +
+ " SERVER FILTER BY FIRST KEY ONLY\n" +
+ " SERVER AGGREGATE INTO ORDERED DISTINCT ROWS BY [BUCKET, TIMESTAMP, LOCATION]\n" +
+ " CLIENT MERGE SORT\n" +
+ " CLIENT SORTED BY [BUCKET, TIMESTAMP]\n" +
+ "AND (SKIP MERGE)\n" +
+ " CLIENT PARALLEL 2-WAY SKIP SCAN ON 2 RANGES OVER " + t[i] + " [0,'5SEC',~1462993520000000000,'Tr/Bal'] - [1,'5SEC',~1462993420000000000,'Tr/Bal']\n" +
+ " SERVER FILTER BY FIRST KEY ONLY AND SRC_LOCATION = DST_LOCATION\n" +
+ " SERVER AGGREGATE INTO ORDERED DISTINCT ROWS BY [BUCKET, TIMESTAMP, SRC_LOCATION, DST_LOCATION]\n" +
+ " CLIENT MERGE SORT\n" +
+ " CLIENT SORTED BY [BUCKET, TIMESTAMP]\n" +
+ "CLIENT SORTED BY [E.BUCKET, E.TIMESTAMP]\n" +
+ "CLIENT AGGREGATE INTO DISTINCT ROWS BY [E.BUCKET, E.TIMESTAMP]"
+ :
+ "SORT-MERGE-JOIN (INNER) TABLES\n" +
+ " CLIENT PARALLEL 2-WAY SKIP SCAN ON 2 RANGES OVER EVENT_COUNT [0,'5SEC',~1462993520000000000,'Tr/Bal'] - [1,'5SEC',~1462993420000000000,'Tr/Bal']\n" +
+ " SERVER FILTER BY FIRST KEY ONLY\n" +
+ " SERVER AGGREGATE INTO ORDERED DISTINCT ROWS BY [BUCKET, TIMESTAMP, LOCATION]\n" +
+ " CLIENT MERGE SORT\n" +
+ " CLIENT SORTED BY [BUCKET, TIMESTAMP]\n" +
+ "AND (SKIP MERGE)\n" +
+ " CLIENT PARALLEL 2-WAY SKIP SCAN ON 2 RANGES OVER " + t[i] + " [0,'5SEC',1462993420000000001,'Tr/Bal'] - [1,'5SEC',1462993520000000000,'Tr/Bal']\n" +
+ " SERVER FILTER BY FIRST KEY ONLY AND SRC_LOCATION = DST_LOCATION\n" +
+ " SERVER AGGREGATE INTO ORDERED DISTINCT ROWS BY [BUCKET, TIMESTAMP, SRC_LOCATION, DST_LOCATION]\n" +
+ " CLIENT MERGE SORT\n" +
+ "CLIENT SORTED BY [E.BUCKET, E.TIMESTAMP]\n" +
+ "CLIENT AGGREGATE INTO DISTINCT ROWS BY [E.BUCKET, E.TIMESTAMP]";
+
+ ResultSet rs = conn.createStatement().executeQuery("explain " + q);
+ assertEquals(p, QueryUtil.getExplainPlan(rs));
+
+ rs = conn.createStatement().executeQuery(q);
+ assertTrue(rs.next());
+ assertEquals("5SEC", rs.getString(1));
+ assertEquals(1462993520000000000L, rs.getLong(2));
+ assertTrue(rs.next());
+ assertEquals("5SEC", rs.getString(1));
+ assertEquals(1462993515000000000L, rs.getLong(2));
+ assertTrue(rs.next());
+ assertEquals("5SEC", rs.getString(1));
+ assertEquals(1462993510000000000L, rs.getLong(2));
+ assertTrue(rs.next());
+ assertEquals("5SEC", rs.getString(1));
+ assertEquals(1462993505000000000L, rs.getLong(2));
+ assertTrue(rs.next());
+ assertEquals("5SEC", rs.getString(1));
+ assertEquals(1462993490000000000L, rs.getLong(2));
+ assertTrue(rs.next());
+ assertEquals("5SEC", rs.getString(1));
+ assertEquals(1462993485000000000L, rs.getLong(2));
+ assertTrue(rs.next());
+ assertEquals("5SEC", rs.getString(1));
+ assertEquals(1462993480000000000L, rs.getLong(2));
+ assertTrue(rs.next());
+ assertEquals("5SEC", rs.getString(1));
+ assertEquals(1462993475000000000L, rs.getLong(2));
+ assertTrue(rs.next());
+ assertEquals("5SEC", rs.getString(1));
+ assertEquals(1462993470000000000L, rs.getLong(2));
+ assertTrue(rs.next());
+ assertEquals("5SEC", rs.getString(1));
+ assertEquals(1462993430000000000L, rs.getLong(2));
+ assertFalse(rs.next());
+ }
+ } finally {
+ conn.close();
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/phoenix/blob/2f329e0a/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 4c18bf8..6fab728 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
@@ -77,6 +77,7 @@ import org.apache.phoenix.schema.PTable.IndexType;
import org.apache.phoenix.schema.PTableImpl;
import org.apache.phoenix.schema.PTableType;
import org.apache.phoenix.schema.ProjectedColumn;
+import org.apache.phoenix.schema.SortOrder;
import org.apache.phoenix.schema.TableRef;
import org.apache.phoenix.schema.types.PBoolean;
import org.apache.phoenix.schema.types.PDataType;
@@ -500,11 +501,11 @@ public class JoinCompiler {
rhsCompiler.reset();
Expression right = condition.getRHS().accept(rhsCompiler);
PDataType toType = getCommonType(left.getDataType(), right.getDataType());
- if (left.getDataType() != toType) {
- left = CoerceExpression.create(left, toType);
+ if (left.getDataType() != toType || left.getSortOrder() == SortOrder.DESC) {
+ left = CoerceExpression.create(left, toType, SortOrder.ASC, left.getMaxLength());
}
- if (right.getDataType() != toType) {
- right = CoerceExpression.create(right, toType);
+ if (right.getDataType() != toType || right.getSortOrder() == SortOrder.DESC) {
+ right = CoerceExpression.create(right, toType, SortOrder.ASC, right.getMaxLength());
}
compiled.add(new Pair<Expression, Expression>(left, right));
}
[2/2] phoenix git commit: Merge branch 'master' of
https://git-wip-us.apache.org/repos/asf/phoenix
Posted by ma...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/phoenix
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/01405d5d
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/01405d5d
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/01405d5d
Branch: refs/heads/master
Commit: 01405d5d6cbf52ac9e3e9ab6229ffc8fb6ba68a2
Parents: 2f329e0 8445d02
Author: maryannxue <ma...@gmail.com>
Authored: Fri May 20 12:24:32 2016 -0400
Committer: maryannxue <ma...@gmail.com>
Committed: Fri May 20 12:24:32 2016 -0400
----------------------------------------------------------------------
bin/sqlline.py | 2 +-
bin/tephra | 2 +-
phoenix-assembly/src/build/client-spark.xml | 2 +-
phoenix-assembly/src/build/client.xml | 2 +-
.../components/all-common-dependencies.xml | 1 -
phoenix-assembly/src/build/server.xml | 3 +--
phoenix-core/pom.xml | 12 ++++------
.../phoenix/end2end/AutoPartitionViewsIT.java | 8 +++----
.../org/apache/phoenix/tx/TransactionIT.java | 8 +++----
.../org/apache/phoenix/tx/TxCheckpointIT.java | 2 +-
.../phoenix/cache/IndexMetaDataCache.java | 2 +-
.../coprocessor/BaseScannerRegionObserver.java | 2 +-
.../coprocessor/MetaDataEndpointImpl.java | 4 ++--
.../phoenix/coprocessor/MetaDataProtocol.java | 2 +-
.../PhoenixTransactionalProcessor.java | 2 +-
.../phoenix/coprocessor/ScanRegionObserver.java | 2 +-
.../UngroupedAggregateRegionObserver.java | 2 +-
.../apache/phoenix/execute/MutationState.java | 23 ++++++++++----------
.../apache/phoenix/index/IndexMaintainer.java | 2 +-
.../index/IndexMetaDataCacheFactory.java | 2 +-
.../phoenix/index/PhoenixIndexMetaData.java | 2 +-
.../index/PhoenixTransactionalIndexer.java | 9 ++++----
.../apache/phoenix/jdbc/PhoenixConnection.java | 2 +-
.../phoenix/query/ConnectionQueryServices.java | 2 +-
.../query/ConnectionQueryServicesImpl.java | 23 +++++++++++++++-----
.../query/ConnectionlessQueryServicesImpl.java | 6 ++---
.../query/DelegateConnectionQueryServices.java | 2 +-
.../apache/phoenix/schema/MetaDataClient.java | 2 +-
.../org/apache/phoenix/schema/PTableImpl.java | 2 +-
.../apache/phoenix/schema/TableProperty.java | 8 ++++++-
.../java/org/apache/phoenix/util/IndexUtil.java | 2 +-
.../org/apache/phoenix/util/PhoenixRuntime.java | 2 +-
.../apache/phoenix/util/TransactionUtil.java | 9 ++++----
.../java/org/apache/phoenix/query/BaseTest.java | 10 ++++-----
phoenix-flume/pom.xml | 2 +-
phoenix-pherf/pom.xml | 2 +-
phoenix-pig/pom.xml | 2 +-
phoenix-server/pom.xml | 2 +-
phoenix-spark/pom.xml | 2 +-
pom.xml | 19 ++++++++--------
40 files changed, 101 insertions(+), 94 deletions(-)
----------------------------------------------------------------------