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