IMPALA-3644 Make predicate order deterministic

This adds a tie-break to make sure that we sort predicates in a
deterministic order on Java 7 and 8. This was suggested by Alex in
IMPALA-3644.

There are still three broken tests when run in Java 8, but it seems best
to address them in a subsequent change.

Change-Id: Id11010bfeaff368869e6d430eeb4773ddf41faff
Reviewed-on: http://gerrit.cloudera.org:8080/4671
Reviewed-by: Jim Apple <jbap...@cloudera.com>
Reviewed-by: Matthew Jacobs <m...@cloudera.com>
Tested-by: Internal Jenkins


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

Branch: refs/heads/hadoop-next
Commit: 1a5c43ef5e1f66a3b64fe2e2c382605337aaaab9
Parents: db5de41
Author: Lars Volker <l...@cloudera.com>
Authored: Wed Oct 5 10:39:00 2016 -0700
Committer: Internal Jenkins <cloudera-hud...@gerrit.cloudera.org>
Committed: Fri Oct 14 22:04:30 2016 +0000

----------------------------------------------------------------------
 .../org/apache/impala/planner/PlanNode.java     |   6 +
 .../queries/PlannerTest/analytic-fns.test       |   8 +-
 .../queries/PlannerTest/conjunct-ordering.test  |   2 +-
 .../queries/PlannerTest/data-source-tables.test |   6 +-
 .../queries/PlannerTest/hbase.test              |   8 +-
 .../queries/PlannerTest/inline-view-limit.test  |  10 +-
 .../queries/PlannerTest/inline-view.test        |   4 +-
 .../queries/PlannerTest/join-order.test         |  28 +--
 .../queries/PlannerTest/joins.test              |  60 +++----
 .../queries/PlannerTest/kudu-update.test        |   4 +-
 .../queries/PlannerTest/kudu.test               |  10 +-
 .../queries/PlannerTest/lineage.test            |   2 +-
 .../queries/PlannerTest/nested-collections.test |   4 +-
 .../queries/PlannerTest/outer-joins.test        |  10 +-
 .../PlannerTest/predicate-propagation.test      | 160 ++++++++---------
 .../PlannerTest/runtime-filter-propagation.test |  42 ++---
 .../queries/PlannerTest/subquery-rewrite.test   |  38 ++--
 .../queries/PlannerTest/tpcds-all.test          |  60 +++----
 .../queries/PlannerTest/tpch-all.test           | 172 +++++++++----------
 .../queries/PlannerTest/tpch-kudu.test          |  28 +--
 .../queries/PlannerTest/tpch-nested.test        |  64 +++----
 .../queries/PlannerTest/tpch-views.test         |  52 +++---
 .../queries/PlannerTest/union.test              |   4 +-
 23 files changed, 394 insertions(+), 388 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/1a5c43ef/fe/src/main/java/org/apache/impala/planner/PlanNode.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/planner/PlanNode.java 
b/fe/src/main/java/org/apache/impala/planner/PlanNode.java
index 3350364..4686e2c 100644
--- a/fe/src/main/java/org/apache/impala/planner/PlanNode.java
+++ b/fe/src/main/java/org/apache/impala/planner/PlanNode.java
@@ -702,6 +702,12 @@ abstract public class PlanNode extends TreeNode<PlanNode> {
         if (cost < smallestCost) {
           smallestCost = cost;
           bestConjunct = e;
+        } else if (cost == smallestCost) {
+          // Break ties based on toSql() to get a consistent display in 
explain plans.
+          if (e.toSql().compareTo(bestConjunct.toSql()) < 0) {
+            smallestCost = cost;
+            bestConjunct = e;
+          }
         }
       }
 

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/1a5c43ef/testdata/workloads/functional-planner/queries/PlannerTest/analytic-fns.test
----------------------------------------------------------------------
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/analytic-fns.test 
b/testdata/workloads/functional-planner/queries/PlannerTest/analytic-fns.test
index a62e21d..0ef95b0 100644
--- 
a/testdata/workloads/functional-planner/queries/PlannerTest/analytic-fns.test
+++ 
b/testdata/workloads/functional-planner/queries/PlannerTest/analytic-fns.test
@@ -1248,7 +1248,7 @@ where
   v.b != v.c
 ---- PLAN
 07:SELECT
-|  predicates: bigint_col > 10, min(int_col) < 1, max(int_col) < 2, 
count(int_col) < 3, sum(int_col) < 4, avg(int_col) < 5, min(int_col) != 
count(int_col), min(int_col) != avg(int_col), max(int_col) != count(int_col), 
count(int_col) < bigint_col + 3, sum(int_col) < bigint_col + 4, min(int_col) < 
bigint_col + 1, max(int_col) < bigint_col + 2, avg(int_col) < bigint_col + 5
+|  predicates: min(int_col) < 1, max(int_col) < 2, bigint_col > 10, 
count(int_col) < 3, sum(int_col) < 4, avg(int_col) < 5, min(int_col) != 
count(int_col), min(int_col) != avg(int_col), max(int_col) != count(int_col), 
count(int_col) < bigint_col + 3, sum(int_col) < bigint_col + 4, min(int_col) < 
bigint_col + 1, max(int_col) < bigint_col + 2, avg(int_col) < bigint_col + 5
 |
 06:ANALYTIC
 |  functions: min(int_col)
@@ -1277,10 +1277,10 @@ where
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
-   predicates: int_col >= 5, int_col <= 10
+   predicates: int_col <= 10, int_col >= 5
 ---- DISTRIBUTEDPLAN
 07:SELECT
-|  predicates: bigint_col > 10, min(int_col) < 1, max(int_col) < 2, 
count(int_col) < 3, sum(int_col) < 4, avg(int_col) < 5, min(int_col) != 
count(int_col), min(int_col) != avg(int_col), max(int_col) != count(int_col), 
count(int_col) < bigint_col + 3, sum(int_col) < bigint_col + 4, min(int_col) < 
bigint_col + 1, max(int_col) < bigint_col + 2, avg(int_col) < bigint_col + 5
+|  predicates: min(int_col) < 1, max(int_col) < 2, bigint_col > 10, 
count(int_col) < 3, sum(int_col) < 4, avg(int_col) < 5, min(int_col) != 
count(int_col), min(int_col) != avg(int_col), max(int_col) != count(int_col), 
count(int_col) < bigint_col + 3, sum(int_col) < bigint_col + 4, min(int_col) < 
bigint_col + 1, max(int_col) < bigint_col + 2, avg(int_col) < bigint_col + 5
 |
 06:ANALYTIC
 |  functions: min(int_col)
@@ -1315,7 +1315,7 @@ where
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
-   predicates: int_col >= 5, int_col <= 10
+   predicates: int_col <= 10, int_col >= 5
 ====
 # test predicate propagation onto and through analytic nodes
 # TODO: allow AnalyticEvalNode to apply a < 20

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/1a5c43ef/testdata/workloads/functional-planner/queries/PlannerTest/conjunct-ordering.test
----------------------------------------------------------------------
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/conjunct-ordering.test
 
b/testdata/workloads/functional-planner/queries/PlannerTest/conjunct-ordering.test
index 1dc6a3e..29e1864 100644
--- 
a/testdata/workloads/functional-planner/queries/PlannerTest/conjunct-ordering.test
+++ 
b/testdata/workloads/functional-planner/queries/PlannerTest/conjunct-ordering.test
@@ -45,7 +45,7 @@ where a.int_col = a.tinyint_col and
 ---- PLAN
 00:SCAN HDFS [functional.alltypes a]
    partitions=24/24 files=24 size=478.45KB
-   predicates: a.int_col = a.tinyint_col, (CASE a.tinyint_col WHEN 0 THEN TRUE 
WHEN 1 THEN TRUE WHEN 2 THEN TRUE ELSE FALSE END), (CASE a.int_col WHEN 0 THEN 
TRUE WHEN 1 THEN TRUE WHEN 2 THEN TRUE ELSE FALSE END)
+   predicates: a.int_col = a.tinyint_col, (CASE a.int_col WHEN 0 THEN TRUE 
WHEN 1 THEN TRUE WHEN 2 THEN TRUE ELSE FALSE END), (CASE a.tinyint_col WHEN 0 
THEN TRUE WHEN 1 THEN TRUE WHEN 2 THEN TRUE ELSE FALSE END)
 ====
 # Check that a LIKE with only leading/trailing wildcards costs less then LIKE 
with
 # non-leading/trailing wildcards.

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/1a5c43ef/testdata/workloads/functional-planner/queries/PlannerTest/data-source-tables.test
----------------------------------------------------------------------
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/data-source-tables.test
 
b/testdata/workloads/functional-planner/queries/PlannerTest/data-source-tables.test
index a7bdf36..5662f5d 100644
--- 
a/testdata/workloads/functional-planner/queries/PlannerTest/data-source-tables.test
+++ 
b/testdata/workloads/functional-planner/queries/PlannerTest/data-source-tables.test
@@ -24,7 +24,7 @@ where 10 > int_col and
 ---- PLAN
 00:SCAN DATA SOURCE [functional.alltypes_datasource]
 data source predicates: 10 > int_col, string_col != 'Foo'
-predicates: 5 > double_col, NOT TRUE = bool_col, NOT 5.0 = double_col, 
string_col != 'Bar'
+predicates: 5 > double_col, NOT 5.0 = double_col, NOT TRUE = bool_col, 
string_col != 'Bar'
 ====
 # The 3rd predicate is not in a form that can be offered to the data source so
 # the 4th will be offered and accepted instead.
@@ -57,7 +57,7 @@ where a.tinyint_col = a.smallint_col and a.int_col = 
a.bigint_col
 |--predicates: b.id = b.int_col, b.id = b.bigint_col
 |
 00:SCAN DATA SOURCE [functional.alltypes_datasource a]
-predicates: a.id = a.int_col, a.tinyint_col = a.smallint_col, a.int_col = 
a.bigint_col, a.id = a.tinyint_col
+predicates: a.id = a.int_col, a.id = a.tinyint_col, a.int_col = a.bigint_col, 
a.tinyint_col = a.smallint_col
 ====
 # Tests that <=>, IS DISTINCT FROM, and IS NOT DISTINCT FROM all can be 
offered to the
 # data source.
@@ -71,5 +71,5 @@ and bigint_col is not distinct from 5
 ---- PLAN
 00:SCAN DATA SOURCE [functional.alltypes_datasource]
 data source predicates: id IS NOT DISTINCT FROM 1, tinyint_col IS DISTINCT 
FROM 2, int_col IS NOT DISTINCT FROM 4
-predicates: bool_col IS NOT DISTINCT FROM TRUE, smallint_col IS DISTINCT FROM 
3, bigint_col IS NOT DISTINCT FROM 5
+predicates: bigint_col IS NOT DISTINCT FROM 5, bool_col IS NOT DISTINCT FROM 
TRUE, smallint_col IS DISTINCT FROM 3
 ====

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/1a5c43ef/testdata/workloads/functional-planner/queries/PlannerTest/hbase.test
----------------------------------------------------------------------
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/hbase.test 
b/testdata/workloads/functional-planner/queries/PlannerTest/hbase.test
index a8841be..57b2cce 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/hbase.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/hbase.test
@@ -287,19 +287,19 @@ where string_col >= '4' and string_col != '2' and 
date_string_col = '04/03/09'
 ---- PLAN
 00:SCAN HBASE [functional_hbase.alltypessmall]
    hbase filters:
-  d:string_col GREATER_OR_EQUAL '4'
   d:string_col NOT_EQUAL '2'
+  d:string_col GREATER_OR_EQUAL '4'
   d:date_string_col EQUAL '04/03/09'
-   predicates: string_col >= '4', string_col != '2', date_string_col = 
'04/03/09'
+   predicates: string_col != '2', string_col >= '4', date_string_col = 
'04/03/09'
 ---- DISTRIBUTEDPLAN
 01:EXCHANGE [UNPARTITIONED]
 |
 00:SCAN HBASE [functional_hbase.alltypessmall]
    hbase filters:
-  d:string_col GREATER_OR_EQUAL '4'
   d:string_col NOT_EQUAL '2'
+  d:string_col GREATER_OR_EQUAL '4'
   d:date_string_col EQUAL '04/03/09'
-   predicates: string_col >= '4', string_col != '2', date_string_col = 
'04/03/09'
+   predicates: string_col != '2', string_col >= '4', date_string_col = 
'04/03/09'
 ====
 # mix of predicates and functional_hbase. filters
 select * from functional_hbase.alltypessmall where string_col = '4' and 
tinyint_col = 5

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/1a5c43ef/testdata/workloads/functional-planner/queries/PlannerTest/inline-view-limit.test
----------------------------------------------------------------------
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/inline-view-limit.test
 
b/testdata/workloads/functional-planner/queries/PlannerTest/inline-view-limit.test
index 8d3a816..79f75b6 100644
--- 
a/testdata/workloads/functional-planner/queries/PlannerTest/inline-view-limit.test
+++ 
b/testdata/workloads/functional-planner/queries/PlannerTest/inline-view-limit.test
@@ -530,7 +530,7 @@ where a.id > 10 and b.id > 20
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
-   predicates: id != 1, functional.alltypes.id > 10
+   predicates: functional.alltypes.id > 10, id != 1
 ====
 # Test value transfers for outer-joined inline views with a limit.
 # Value transfer a.id->b.id is legal.
@@ -557,7 +557,7 @@ where a.id > 10 and b.id > 20
 |
 02:SCAN HDFS [functional.alltypessmall]
    partitions=4/4 files=4 size=6.32KB
-   predicates: functional.alltypessmall.id != 1, id != 2, 
functional.alltypessmall.id > 10, functional.alltypessmall.id > 20
+   predicates: functional.alltypessmall.id != 1, functional.alltypessmall.id > 
10, functional.alltypessmall.id > 20, id != 2
    runtime filters: RF000 -> id
 ====
 # Test value transfers for outer-joined inline views with a limit.
@@ -577,7 +577,7 @@ where a.id > 10 and b.id > 20
 |
 |--01:SCAN HDFS [functional.alltypessmall]
 |     partitions=4/4 files=4 size=6.32KB
-|     predicates: id != 2, functional.alltypessmall.id > 20
+|     predicates: functional.alltypessmall.id > 20, id != 2
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
@@ -610,7 +610,7 @@ where a.id > 10 and b.id > 20
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
-   predicates: id != 1, functional.alltypes.id != 2, functional.alltypes.id > 
10, functional.alltypes.id > 20
+   predicates: functional.alltypes.id != 2, functional.alltypes.id > 10, 
functional.alltypes.id > 20, id != 1
    runtime filters: RF000 -> id
 ====
 # IMPALA-3450: limits on select nodes are reflected in cardinality estimates. 
The test for
@@ -625,4 +625,4 @@ select * from (select * from functional.alltypes limit 100) 
v where id < 10 limi
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
    limit: 100
-====
\ No newline at end of file
+====

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/1a5c43ef/testdata/workloads/functional-planner/queries/PlannerTest/inline-view.test
----------------------------------------------------------------------
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/inline-view.test 
b/testdata/workloads/functional-planner/queries/PlannerTest/inline-view.test
index 9eb32d4..fe6ade8 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/inline-view.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/inline-view.test
@@ -195,7 +195,7 @@ and b.id + 15 = 27
 |
 |--01:SCAN HDFS [functional.alltypessmall]
 |     partitions=2/4 files=2 size=3.17KB
-|     predicates: functional.alltypessmall.string_col = '15', 
functional.alltypessmall.id + 15 = 27
+|     predicates: functional.alltypessmall.id + 15 = 27, 
functional.alltypessmall.string_col = '15'
 |
 00:SCAN HDFS [functional.alltypesagg]
    partitions=5/11 files=5 size=372.38KB
@@ -213,7 +213,7 @@ and b.id + 15 = 27
 |  |
 |  01:SCAN HDFS [functional.alltypessmall]
 |     partitions=2/4 files=2 size=3.17KB
-|     predicates: functional.alltypessmall.string_col = '15', 
functional.alltypessmall.id + 15 = 27
+|     predicates: functional.alltypessmall.id + 15 = 27, 
functional.alltypessmall.string_col = '15'
 |
 03:EXCHANGE [HASH(id,int_col)]
 |

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/1a5c43ef/testdata/workloads/functional-planner/queries/PlannerTest/join-order.test
----------------------------------------------------------------------
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/join-order.test 
b/testdata/workloads/functional-planner/queries/PlannerTest/join-order.test
index 44c2c24..e1951e0 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/join-order.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/join-order.test
@@ -243,8 +243,8 @@ limit 100
 |     runtime filters: RF000 -> n_regionkey
 |
 08:HASH JOIN [INNER JOIN]
-|  hash predicates: l_suppkey = s_suppkey, c_nationkey = s_nationkey
-|  runtime filters: RF002 <- s_suppkey, RF003 <- s_nationkey
+|  hash predicates: c_nationkey = s_nationkey, l_suppkey = s_suppkey
+|  runtime filters: RF002 <- s_nationkey, RF003 <- s_suppkey
 |
 |--03:SCAN HDFS [tpch.supplier s]
 |     partitions=1/1 files=1 size=1.33MB
@@ -256,7 +256,7 @@ limit 100
 |
 |--00:SCAN HDFS [tpch.customer]
 |     partitions=1/1 files=1 size=23.08MB
-|     runtime filters: RF001 -> tpch.customer.c_nationkey, RF003 -> c_nationkey
+|     runtime filters: RF001 -> tpch.customer.c_nationkey, RF002 -> c_nationkey
 |
 06:HASH JOIN [INNER JOIN]
 |  hash predicates: l_orderkey = o_orderkey
@@ -264,12 +264,12 @@ limit 100
 |
 |--01:SCAN HDFS [tpch.orders o]
 |     partitions=1/1 files=1 size=162.56MB
-|     predicates: o_orderdate >= '1994-01-01', o_orderdate < '1995-01-01'
+|     predicates: o_orderdate < '1995-01-01', o_orderdate >= '1994-01-01'
 |     runtime filters: RF004 -> o_custkey
 |
 02:SCAN HDFS [tpch.lineitem l]
    partitions=1/1 files=1 size=718.94MB
-   runtime filters: RF002 -> l_suppkey, RF005 -> l_orderkey
+   runtime filters: RF003 -> l_suppkey, RF005 -> l_orderkey
 ---- DISTRIBUTEDPLAN
 20:MERGING-EXCHANGE [UNPARTITIONED]
 |  order by: round(sum(l_extendedprice * (1 - l_discount)), 5) DESC
@@ -309,8 +309,8 @@ limit 100
 |     runtime filters: RF000 -> n_regionkey
 |
 08:HASH JOIN [INNER JOIN, BROADCAST]
-|  hash predicates: l_suppkey = s_suppkey, c_nationkey = s_nationkey
-|  runtime filters: RF002 <- s_suppkey, RF003 <- s_nationkey
+|  hash predicates: c_nationkey = s_nationkey, l_suppkey = s_suppkey
+|  runtime filters: RF002 <- s_nationkey, RF003 <- s_suppkey
 |
 |--15:EXCHANGE [BROADCAST]
 |  |
@@ -326,7 +326,7 @@ limit 100
 |  |
 |  00:SCAN HDFS [tpch.customer]
 |     partitions=1/1 files=1 size=23.08MB
-|     runtime filters: RF001 -> tpch.customer.c_nationkey, RF003 -> c_nationkey
+|     runtime filters: RF001 -> tpch.customer.c_nationkey, RF002 -> c_nationkey
 |
 06:HASH JOIN [INNER JOIN, BROADCAST]
 |  hash predicates: l_orderkey = o_orderkey
@@ -336,12 +336,12 @@ limit 100
 |  |
 |  01:SCAN HDFS [tpch.orders o]
 |     partitions=1/1 files=1 size=162.56MB
-|     predicates: o_orderdate >= '1994-01-01', o_orderdate < '1995-01-01'
+|     predicates: o_orderdate < '1995-01-01', o_orderdate >= '1994-01-01'
 |     runtime filters: RF004 -> o_custkey
 |
 02:SCAN HDFS [tpch.lineitem l]
    partitions=1/1 files=1 size=718.94MB
-   runtime filters: RF002 -> l_suppkey, RF005 -> l_orderkey
+   runtime filters: RF003 -> l_suppkey, RF005 -> l_orderkey
 ====
 # Q2 - Minimum Cost Supplier Query
 select
@@ -482,7 +482,7 @@ limit 10
 |
 |--00:SCAN HDFS [tpch.orders]
 |     partitions=1/1 files=1 size=162.56MB
-|     predicates: o_orderdate >= '1993-07-01', o_orderdate < '1993-10-01'
+|     predicates: o_orderdate < '1993-10-01', o_orderdate >= '1993-07-01'
 |
 01:SCAN HDFS [tpch.lineitem]
    partitions=1/1 files=1 size=718.94MB
@@ -514,7 +514,7 @@ limit 10
 |  |
 |  00:SCAN HDFS [tpch.orders]
 |     partitions=1/1 files=1 size=162.56MB
-|     predicates: o_orderdate >= '1993-07-01', o_orderdate < '1993-10-01'
+|     predicates: o_orderdate < '1993-10-01', o_orderdate >= '1993-07-01'
 |
 05:EXCHANGE [HASH(l_orderkey)]
 |
@@ -1335,7 +1335,7 @@ where a.int_col = b.int_col and b.bigint_col < 
a.tinyint_col
 ---- PLAN
 04:HASH JOIN [LEFT OUTER JOIN]
 |  hash predicates: c.id = b.id
-|  other predicates: a.int_col = b.int_col, b.tinyint_col = c.tinyint_col, 
b.bool_col != c.bool_col, b.bigint_col < a.tinyint_col
+|  other predicates: a.int_col = b.int_col, b.bool_col != c.bool_col, 
b.tinyint_col = c.tinyint_col, b.bigint_col < a.tinyint_col
 |  runtime filters: RF000 <- b.tinyint_col
 |
 |--03:HASH JOIN [RIGHT OUTER JOIN]
@@ -1365,7 +1365,7 @@ where b.tinyint_col = c.tinyint_col and b.bool_col != 
c.bool_col
 ---- PLAN
 04:HASH JOIN [LEFT OUTER JOIN]
 |  hash predicates: c.id = b.id
-|  other predicates: b.tinyint_col = c.tinyint_col, b.bool_col != c.bool_col
+|  other predicates: b.bool_col != c.bool_col, b.tinyint_col = c.tinyint_col
 |  runtime filters: RF000 <- b.tinyint_col
 |
 |--03:HASH JOIN [INNER JOIN]

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/1a5c43ef/testdata/workloads/functional-planner/queries/PlannerTest/joins.test
----------------------------------------------------------------------
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/joins.test 
b/testdata/workloads/functional-planner/queries/PlannerTest/joins.test
index b5b36a0..260ba21 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/joins.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/joins.test
@@ -173,7 +173,7 @@ and (b.double_col * c.tinyint_col > 1000 or c.tinyint_col < 
1000)
 ---- PLAN
 04:HASH JOIN [LEFT OUTER JOIN]
 |  hash predicates: c.id = a.id, c.string_col = b.string_col
-|  other predicates: a.tinyint_col = 15, b.string_col = '15', a.day >= 6, 
b.month > 2, a.tinyint_col + b.tinyint_col < 15, a.float_col - c.double_col < 
0, (b.double_col * c.tinyint_col > 1000 OR c.tinyint_col < 1000)
+|  other predicates: a.tinyint_col = 15, b.string_col = '15', a.day >= 6, 
b.month > 2, a.float_col - c.double_col < 0, a.tinyint_col + b.tinyint_col < 
15, (b.double_col * c.tinyint_col > 1000 OR c.tinyint_col < 1000)
 |
 |--03:HASH JOIN [FULL OUTER JOIN]
 |  |  hash predicates: a.id = b.id, a.int_col = b.int_col
@@ -193,7 +193,7 @@ and (b.double_col * c.tinyint_col > 1000 or c.tinyint_col < 
1000)
 |
 04:HASH JOIN [LEFT OUTER JOIN, PARTITIONED]
 |  hash predicates: c.id = a.id, c.string_col = b.string_col
-|  other predicates: a.tinyint_col = 15, b.string_col = '15', a.day >= 6, 
b.month > 2, a.tinyint_col + b.tinyint_col < 15, a.float_col - c.double_col < 
0, (b.double_col * c.tinyint_col > 1000 OR c.tinyint_col < 1000)
+|  other predicates: a.tinyint_col = 15, b.string_col = '15', a.day >= 6, 
b.month > 2, a.float_col - c.double_col < 0, a.tinyint_col + b.tinyint_col < 
15, (b.double_col * c.tinyint_col > 1000 OR c.tinyint_col < 1000)
 |
 |--08:EXCHANGE [HASH(a.id,b.string_col)]
 |  |
@@ -681,8 +681,8 @@ inner join [shuffle]
 on (a.int_col = b.int_col and b.bool_col = a.bool_col)
 ---- PLAN
 03:HASH JOIN [INNER JOIN]
-|  hash predicates: a.int_col = int_col, a.bool_col = bool_col
-|  runtime filters: RF000 <- int_col, RF001 <- bool_col
+|  hash predicates: a.bool_col = bool_col, a.int_col = int_col
+|  runtime filters: RF000 <- bool_col, RF001 <- int_col
 |
 |--02:AGGREGATE [FINALIZE]
 |  |  output: count(*)
@@ -693,13 +693,13 @@ on (a.int_col = b.int_col and b.bool_col = a.bool_col)
 |
 00:SCAN HDFS [functional.alltypes a]
    partitions=24/24 files=24 size=478.45KB
-   runtime filters: RF000 -> a.int_col, RF001 -> a.bool_col
+   runtime filters: RF000 -> a.bool_col, RF001 -> a.int_col
 ---- DISTRIBUTEDPLAN
 07:EXCHANGE [UNPARTITIONED]
 |
 03:HASH JOIN [INNER JOIN, PARTITIONED]
-|  hash predicates: a.int_col = int_col, a.bool_col = bool_col
-|  runtime filters: RF000 <- int_col, RF001 <- bool_col
+|  hash predicates: a.bool_col = bool_col, a.int_col = int_col
+|  runtime filters: RF000 <- bool_col, RF001 <- int_col
 |
 |--05:AGGREGATE [FINALIZE]
 |  |  output: count:merge(*)
@@ -718,7 +718,7 @@ on (a.int_col = b.int_col and b.bool_col = a.bool_col)
 |
 00:SCAN HDFS [functional.alltypes a]
    partitions=24/24 files=24 size=478.45KB
-   runtime filters: RF000 -> a.int_col, RF001 -> a.bool_col
+   runtime filters: RF000 -> a.bool_col, RF001 -> a.int_col
 ====
 # Tests that the partitioned join between b and c exploits the existing
 # data partition of its lhs and rhs inputs.
@@ -731,12 +731,12 @@ inner join [shuffle]
 on (b.int_col = c.int_col and c.bool_col = b.bool_col)
 ---- PLAN
 05:HASH JOIN [INNER JOIN]
-|  hash predicates: b.int_col = a.int_col, b.bool_col = a.bool_col
-|  runtime filters: RF000 <- a.int_col, RF001 <- a.bool_col
+|  hash predicates: b.bool_col = a.bool_col, b.int_col = a.int_col
+|  runtime filters: RF000 <- a.bool_col, RF001 <- a.int_col
 |
 |--04:HASH JOIN [INNER JOIN]
-|  |  hash predicates: a.int_col = int_col, a.bool_col = bool_col
-|  |  runtime filters: RF002 <- int_col, RF003 <- bool_col
+|  |  hash predicates: a.bool_col = bool_col, a.int_col = int_col
+|  |  runtime filters: RF002 <- bool_col, RF003 <- int_col
 |  |
 |  |--03:AGGREGATE [FINALIZE]
 |  |  |  output: count(*)
@@ -747,21 +747,21 @@ on (b.int_col = c.int_col and c.bool_col = b.bool_col)
 |  |
 |  00:SCAN HDFS [functional.alltypes a]
 |     partitions=24/24 files=24 size=478.45KB
-|     runtime filters: RF002 -> a.int_col, RF003 -> a.bool_col
+|     runtime filters: RF002 -> a.bool_col, RF003 -> a.int_col
 |
 01:SCAN HDFS [functional.alltypes b]
    partitions=24/24 files=24 size=478.45KB
-   runtime filters: RF000 -> b.int_col, RF001 -> b.bool_col
+   runtime filters: RF000 -> b.bool_col, RF001 -> b.int_col
 ---- DISTRIBUTEDPLAN
 10:EXCHANGE [UNPARTITIONED]
 |
 05:HASH JOIN [INNER JOIN, PARTITIONED]
-|  hash predicates: b.int_col = a.int_col, b.bool_col = a.bool_col
-|  runtime filters: RF000 <- a.int_col, RF001 <- a.bool_col
+|  hash predicates: b.bool_col = a.bool_col, b.int_col = a.int_col
+|  runtime filters: RF000 <- a.bool_col, RF001 <- a.int_col
 |
 |--04:HASH JOIN [INNER JOIN, PARTITIONED]
-|  |  hash predicates: a.int_col = int_col, a.bool_col = bool_col
-|  |  runtime filters: RF002 <- int_col, RF003 <- bool_col
+|  |  hash predicates: a.bool_col = bool_col, a.int_col = int_col
+|  |  runtime filters: RF002 <- bool_col, RF003 <- int_col
 |  |
 |  |--07:AGGREGATE [FINALIZE]
 |  |  |  output: count:merge(*)
@@ -780,13 +780,13 @@ on (b.int_col = c.int_col and c.bool_col = b.bool_col)
 |  |
 |  00:SCAN HDFS [functional.alltypes a]
 |     partitions=24/24 files=24 size=478.45KB
-|     runtime filters: RF002 -> a.int_col, RF003 -> a.bool_col
+|     runtime filters: RF002 -> a.bool_col, RF003 -> a.int_col
 |
 09:EXCHANGE [HASH(b.int_col,b.bool_col)]
 |
 01:SCAN HDFS [functional.alltypes b]
    partitions=24/24 files=24 size=478.45KB
-   runtime filters: RF000 -> b.int_col, RF001 -> b.bool_col
+   runtime filters: RF000 -> b.bool_col, RF001 -> b.int_col
 ====
 # Tests that all predicates from the On-clause are applied (IMPALA-805)
 # and that slot equivalences are enforced at lowest possible plan node.
@@ -807,7 +807,7 @@ where a.tinyint_col = a.smallint_col and a.int_col = 
a.bigint_col
 |
 |--00:SCAN HDFS [functional.alltypes a]
 |     partitions=24/24 files=24 size=478.45KB
-|     predicates: a.id = a.int_col, a.tinyint_col = a.smallint_col, a.int_col 
= a.bigint_col, a.id = a.tinyint_col
+|     predicates: a.id = a.int_col, a.id = a.tinyint_col, a.int_col = 
a.bigint_col, a.tinyint_col = a.smallint_col
 |
 01:SCAN HDFS [functional.alltypes b]
    partitions=24/24 files=24 size=478.45KB
@@ -827,16 +827,16 @@ and b.string_col = a.string_col and b.date_string_col = 
a.string_col
 where a.tinyint_col = a.smallint_col and a.int_col = a.bigint_col
 ---- PLAN
 02:HASH JOIN [RIGHT OUTER JOIN]
-|  hash predicates: b.id = a.id, b.int_col = a.id, b.id = a.int_col, 
b.bigint_col = a.id, b.id = a.tinyint_col, b.id = a.smallint_col, b.id = 
a.bigint_col, b.string_col = a.string_col, b.date_string_col = a.string_col
-|  runtime filters: RF000 <- a.id, RF001 <- a.id, RF002 <- a.int_col, RF003 <- 
a.id, RF004 <- a.tinyint_col, RF005 <- a.smallint_col, RF006 <- a.bigint_col, 
RF007 <- a.string_col, RF008 <- a.string_col
+|  hash predicates: b.id = a.id, b.int_col = a.id, b.id = a.int_col, b.id = 
a.bigint_col, b.bigint_col = a.id, b.id = a.smallint_col, b.string_col = 
a.string_col, b.id = a.tinyint_col, b.date_string_col = a.string_col
+|  runtime filters: RF000 <- a.id, RF001 <- a.id, RF002 <- a.int_col, RF003 <- 
a.bigint_col, RF004 <- a.id, RF005 <- a.smallint_col, RF006 <- a.string_col, 
RF007 <- a.tinyint_col, RF008 <- a.string_col
 |
 |--00:SCAN HDFS [functional.alltypes a]
 |     partitions=24/24 files=24 size=478.45KB
-|     predicates: a.tinyint_col = a.smallint_col, a.int_col = a.bigint_col
+|     predicates: a.int_col = a.bigint_col, a.tinyint_col = a.smallint_col
 |
 01:SCAN HDFS [functional.alltypes b]
    partitions=24/24 files=24 size=478.45KB
-   runtime filters: RF000 -> b.id, RF001 -> b.int_col, RF002 -> b.id, RF003 -> 
b.bigint_col, RF004 -> b.id, RF005 -> b.id, RF006 -> b.id, RF007 -> 
b.string_col, RF008 -> b.date_string_col
+   runtime filters: RF000 -> b.id, RF001 -> b.int_col, RF002 -> b.id, RF003 -> 
b.id, RF004 -> b.bigint_col, RF005 -> b.id, RF006 -> b.string_col, RF007 -> 
b.id, RF008 -> b.date_string_col
 ====
 # Tests elimination of redundant join predicates (IMPALA-912).
 select * from
@@ -1099,8 +1099,8 @@ on a.id = b.x and a.id = b.tinyint_col and
    a.int_col = b.y and a.int_col = b.bigint_col
 ---- PLAN
 04:HASH JOIN [INNER JOIN]
-|  hash predicates: a.id = x, a.id = tinyint_col, a.int_col = y, a.int_col = 
bigint_col
-|  runtime filters: RF000 <- x, RF001 <- tinyint_col, RF002 <- y, RF003 <- 
bigint_col
+|  hash predicates: a.id = tinyint_col, a.id = x, a.int_col = bigint_col, 
a.int_col = y
+|  runtime filters: RF000 <- tinyint_col, RF001 <- x, RF002 <- bigint_col, 
RF003 <- y
 |
 |--01:UNION
 |  |
@@ -1599,7 +1599,7 @@ on (v1.tinyint_col = v2.tinyint_col and
 |
 02:SCAN HDFS [functional.alltypessmall]
    partitions=4/4 files=4 size=6.32KB
-   predicates: functional.alltypessmall.tinyint_col = 
functional.alltypessmall.int_col, functional.alltypessmall.tinyint_col = 
functional.alltypessmall.bigint_col
+   predicates: functional.alltypessmall.tinyint_col = 
functional.alltypessmall.bigint_col, functional.alltypessmall.tinyint_col = 
functional.alltypessmall.int_col
    runtime filters: RF000 -> functional.alltypessmall.tinyint_col
 ====
 # Same as above but with a full outer join.
@@ -1623,7 +1623,7 @@ on (v1.tinyint_col = v2.tinyint_col and
 10:EXCHANGE [UNPARTITIONED]
 |
 04:HASH JOIN [FULL OUTER JOIN, PARTITIONED]
-|  hash predicates: tinyint_col = tinyint_col, int_col = tinyint_col, 
bigint_col = tinyint_col
+|  hash predicates: tinyint_col = tinyint_col, bigint_col = tinyint_col, 
int_col = tinyint_col
 |
 |--09:EXCHANGE [HASH(tinyint_col,tinyint_col,tinyint_col)]
 |  |
@@ -2154,7 +2154,7 @@ and (b.double_col * c.tinyint_col > 1000 or c.tinyint_col 
< 1000)
 ---- PLAN
 04:HASH JOIN [LEFT OUTER JOIN]
 |  hash predicates: c.id = a.id, c.string_col IS NOT DISTINCT FROM b.string_col
-|  other predicates: a.tinyint_col = 15, b.string_col = '15', a.day >= 6, 
b.month > 2, a.tinyint_col + b.tinyint_col < 15, a.float_col - c.double_col < 
0, (b.double_col * c.tinyint_col > 1000 OR c.tinyint_col < 1000)
+|  other predicates: a.tinyint_col = 15, b.string_col = '15', a.day >= 6, 
b.month > 2, a.float_col - c.double_col < 0, a.tinyint_col + b.tinyint_col < 
15, (b.double_col * c.tinyint_col > 1000 OR c.tinyint_col < 1000)
 |
 |--03:HASH JOIN [FULL OUTER JOIN]
 |  |  hash predicates: a.id IS NOT DISTINCT FROM b.id, a.int_col = b.int_col

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/1a5c43ef/testdata/workloads/functional-planner/queries/PlannerTest/kudu-update.test
----------------------------------------------------------------------
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/kudu-update.test 
b/testdata/workloads/functional-planner/queries/PlannerTest/kudu-update.test
index 80ba800..a26ec40 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/kudu-update.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/kudu-update.test
@@ -19,13 +19,13 @@ UPDATE KUDU [functional_kudu.testtbl]
 |  check keys exist: false
 |
 00:SCAN KUDU [functional_kudu.testtbl]
-   kudu predicates: zip > 94549, id = 5
+   kudu predicates: id = 5, zip > 94549
 ---- DISTRIBUTEDPLAN
 UPDATE KUDU [functional_kudu.testtbl]
 |  check keys exist: false
 |
 00:SCAN KUDU [functional_kudu.testtbl]
-   kudu predicates: zip > 94549, id = 5
+   kudu predicates: id = 5, zip > 94549
 ====
 # Mixing predicate and value assignment
 update functional_kudu.testtbl set zip = 94546 where zip > 94549

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/1a5c43ef/testdata/workloads/functional-planner/queries/PlannerTest/kudu.test
----------------------------------------------------------------------
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/kudu.test 
b/testdata/workloads/functional-planner/queries/PlannerTest/kudu.test
index 4df133a..565f3a3 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/kudu.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/kudu.test
@@ -96,7 +96,7 @@ where id >= 10 and zip <= 5 and 20 >= id and 'foo' = name and 
zip >= 0 and 30 >=
 and zip > 1 and zip < 50
 ---- PLAN
 00:SCAN KUDU [functional_kudu.testtbl]
-   kudu predicates: id >= 10, zip <= 5, id <= 20, zip >= 0, zip <= 30, zip > 
1, zip < 50, name = 'foo'
+   kudu predicates: id <= 20, zip <= 30, id >= 10, zip < 50, zip <= 5, zip > 
1, zip >= 0, name = 'foo'
 ---- SCANRANGELOCATIONS
 NODE 0:
   ScanToken{table=testtbl, range-partition: [<start>, (int64 id=1003))}
@@ -104,7 +104,7 @@ NODE 0:
 01:EXCHANGE [UNPARTITIONED]
 |
 00:SCAN KUDU [functional_kudu.testtbl]
-   kudu predicates: id >= 10, zip <= 5, id <= 20, zip >= 0, zip <= 30, zip > 
1, zip < 50, name = 'foo'
+   kudu predicates: id <= 20, zip <= 30, id >= 10, zip < 50, zip <= 5, zip > 
1, zip >= 0, name = 'foo'
 ====
 # Test constant folding.
 select * from functional_kudu.testtbl
@@ -112,7 +112,7 @@ where id < 10 + 30  and cast(sin(id) as boolean) = true and 
20 * 3 >= id and 10
 ---- PLAN
 00:SCAN KUDU [functional_kudu.testtbl]
    predicates: CAST(sin(id) AS BOOLEAN) = TRUE
-   kudu predicates: id < 40, id <= 60, id < 103
+   kudu predicates: id <= 60, id < 40, id < 103
 ---- SCANRANGELOCATIONS
 NODE 0:
   ScanToken{table=testtbl, range-partition: [<start>, (int64 id=1003))}
@@ -121,7 +121,7 @@ NODE 0:
 |
 00:SCAN KUDU [functional_kudu.testtbl]
    predicates: CAST(sin(id) AS BOOLEAN) = TRUE
-   kudu predicates: id < 40, id <= 60, id < 103
+   kudu predicates: id <= 60, id < 40, id < 103
 ====
 # Some predicates can be pushed down but others can't (predicate on an 
non-const value).
 select * from functional_kudu.testtbl
@@ -190,5 +190,5 @@ and 1475059765 + 100 < id
 |  output: count(*)
 |
 00:SCAN KUDU [functional_kudu.alltypes]
-   kudu predicates: id < 1475059775, id > 1475059865
+   kudu predicates: id > 1475059865, id < 1475059775
 ====

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/1a5c43ef/testdata/workloads/functional-planner/queries/PlannerTest/lineage.test
----------------------------------------------------------------------
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/lineage.test 
b/testdata/workloads/functional-planner/queries/PlannerTest/lineage.test
index 20c117e..b18a044 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/lineage.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/lineage.test
@@ -4452,4 +4452,4 @@ where not exists (select 1 from functional.alltypes a 
where v.id = a.id)
         }
     ]
 }
-====
\ No newline at end of file
+====

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/1a5c43ef/testdata/workloads/functional-planner/queries/PlannerTest/nested-collections.test
----------------------------------------------------------------------
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/nested-collections.test
 
b/testdata/workloads/functional-planner/queries/PlannerTest/nested-collections.test
index 0a8cd01..6270c11 100644
--- 
a/testdata/workloads/functional-planner/queries/PlannerTest/nested-collections.test
+++ 
b/testdata/workloads/functional-planner/queries/PlannerTest/nested-collections.test
@@ -392,7 +392,7 @@ where b.item % 2 = 0
 01:SUBPLAN
 |
 |--04:NESTED LOOP JOIN [FULL OUTER JOIN]
-|  |  join predicates: a.id < b.item, a.id < 10
+|  |  join predicates: a.id < 10, a.id < b.item
 |  |  predicates: b.item % 2 = 0
 |  |
 |  |--02:SINGULAR ROW SRC
@@ -1357,7 +1357,7 @@ where a.item between 10 and 20
 |
 00:SCAN HDFS [functional.allcomplextypes t]
    partitions=0/0 files=0 size=0B
-   predicates: t.id < 200, !empty(t.int_array_col), 
!empty(t.complex_nested_struct_col.f2)
+   predicates: t.id < 200, !empty(t.complex_nested_struct_col.f2), 
!empty(t.int_array_col)
    predicates on a: a.item >= 10, a.item <= 20, a.item % 2 = 0
    predicates on m: m.key = 'test', m.value != 30
    predicates on c: c.f11 >= 10, c.f11 <= 20, c.f11 % 2 = 0

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/1a5c43ef/testdata/workloads/functional-planner/queries/PlannerTest/outer-joins.test
----------------------------------------------------------------------
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/outer-joins.test 
b/testdata/workloads/functional-planner/queries/PlannerTest/outer-joins.test
index 74002e0..c6ccc81 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/outer-joins.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/outer-joins.test
@@ -34,7 +34,7 @@ and t1.zip + t2.zip + t3.zip= 20
 |
 |--02:SCAN HDFS [functional.testtbl t3]
 |     partitions=1/1 files=0 size=0B
-|     predicates: t3.id IS NOT NULL, t3.zip = 94720, t3.id > 0
+|     predicates: t3.id IS NOT NULL, t3.id > 0, t3.zip = 94720
 |
 03:HASH JOIN [LEFT OUTER JOIN]
 |  hash predicates: t1.id - 1 = t2.id + 1
@@ -60,7 +60,7 @@ and t1.zip + t2.zip + t3.zip= 20
 |  |
 |  02:SCAN HDFS [functional.testtbl t3]
 |     partitions=1/1 files=0 size=0B
-|     predicates: t3.id IS NOT NULL, t3.zip = 94720, t3.id > 0
+|     predicates: t3.id IS NOT NULL, t3.id > 0, t3.zip = 94720
 |
 03:HASH JOIN [LEFT OUTER JOIN, BROADCAST]
 |  hash predicates: t1.id - 1 = t2.id + 1
@@ -455,7 +455,7 @@ where a.smallint_col = 100 and a.float_col > b.float_col
 ---- PLAN
 04:HASH JOIN [FULL OUTER JOIN]
 |  hash predicates: c.int_col = a.int_col
-|  other join predicates: a.tinyint_col < b.tinyint_col, a.bigint_col < 10
+|  other join predicates: a.bigint_col < 10, a.tinyint_col < b.tinyint_col
 |  other predicates: a.smallint_col = 100, a.float_col > b.float_col
 |
 |--03:HASH JOIN [INNER JOIN]
@@ -775,7 +775,7 @@ inner join functional.alltypestiny c
 ---- PLAN
 05:HASH JOIN [INNER JOIN]
 |  hash predicates: b.id = c.id
-|  other predicates: b.int_col < 0, a.int_col > 10
+|  other predicates: a.int_col > 10, b.int_col < 0
 |  runtime filters: RF000 <- c.id
 |
 |--02:SCAN HDFS [functional.alltypestiny c]
@@ -809,7 +809,7 @@ full outer join functional.alltypestiny e
 |  hash predicates: e.id = d.id
 |
 |--08:NESTED LOOP JOIN [INNER JOIN]
-|  |  predicates: b.int_col < 0, a.int_col > 10
+|  |  predicates: a.int_col > 10, b.int_col < 0
 |  |
 |  |--07:HASH JOIN [RIGHT OUTER JOIN]
 |  |  |  hash predicates: c.id = b.id

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/1a5c43ef/testdata/workloads/functional-planner/queries/PlannerTest/predicate-propagation.test
----------------------------------------------------------------------
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/predicate-propagation.test
 
b/testdata/workloads/functional-planner/queries/PlannerTest/predicate-propagation.test
index 3ffdbd4..605f157 100644
--- 
a/testdata/workloads/functional-planner/queries/PlannerTest/predicate-propagation.test
+++ 
b/testdata/workloads/functional-planner/queries/PlannerTest/predicate-propagation.test
@@ -50,7 +50,7 @@ where month = id and id = int_col and tinyint_col = int_col 
and int_col < 2
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=2/24 files=2 size=40.32KB
-   predicates: month = id, id = int_col, functional.alltypes.id < 2, int_col < 
2, functional.alltypes.tinyint_col < 2, tinyint_col = int_col
+   predicates: functional.alltypes.id < 2, functional.alltypes.tinyint_col < 
2, id = int_col, int_col < 2, month = id, tinyint_col = int_col
 ====
 # all subquery results get materialized correctly;
 # a.string_col = 'a' needs to be evaluated by the join itself, not the scan
@@ -190,26 +190,26 @@ where a.year = 2009 and b.month + 2 <= 4 and b.id = 17
   and cast(sin(c.int_col) as boolean) = true
 ---- PLAN
 04:HASH JOIN [INNER JOIN]
-|  hash predicates: b.id = c.id, b.year = c.year, b.month = c.month, 
b.smallint_col = c.int_col
-|  runtime filters: RF000 <- c.id, RF001 <- c.year, RF002 <- c.month, RF003 <- 
c.int_col
+|  hash predicates: b.id = c.id, b.month = c.month, b.year = c.year, 
b.smallint_col = c.int_col
+|  runtime filters: RF000 <- c.id, RF001 <- c.month, RF002 <- c.year, RF003 <- 
c.int_col
 |
 |--02:SCAN HDFS [functional.alltypestiny c]
 |     partitions=2/4 files=2 size=230B
 |     predicates: c.id = 17, CAST(sin(c.int_col) AS BOOLEAN) = TRUE
 |
 03:HASH JOIN [INNER JOIN]
-|  hash predicates: a.id = b.id, a.year = b.year, a.month = b.month, 
a.tinyint_col = b.smallint_col
-|  runtime filters: RF004 <- b.id, RF005 <- b.year, RF006 <- b.month, RF007 <- 
b.smallint_col
+|  hash predicates: a.id = b.id, a.month = b.month, a.year = b.year, 
a.tinyint_col = b.smallint_col
+|  runtime filters: RF004 <- b.id, RF005 <- b.month, RF006 <- b.year, RF007 <- 
b.smallint_col
 |
 |--01:SCAN HDFS [functional.alltypessmall b]
 |     partitions=2/4 files=2 size=3.16KB
 |     predicates: b.id = 17, CAST(sin(b.smallint_col) AS BOOLEAN) = TRUE
-|     runtime filters: RF000 -> b.id, RF001 -> b.year, RF002 -> b.month, RF003 
-> b.smallint_col
+|     runtime filters: RF000 -> b.id, RF001 -> b.month, RF002 -> b.year, RF003 
-> b.smallint_col
 |
 00:SCAN HDFS [functional.alltypes a]
    partitions=2/24 files=2 size=38.07KB
    predicates: a.id = 17, CAST(sin(a.tinyint_col) AS BOOLEAN) = TRUE
-   runtime filters: RF000 -> a.id, RF001 -> a.year, RF002 -> a.month, RF003 -> 
a.tinyint_col, RF004 -> a.id, RF005 -> a.year, RF006 -> a.month, RF007 -> 
a.tinyint_col
+   runtime filters: RF000 -> a.id, RF001 -> a.month, RF002 -> a.year, RF003 -> 
a.tinyint_col, RF004 -> a.id, RF005 -> a.month, RF006 -> a.year, RF007 -> 
a.tinyint_col
 ---- SCANRANGELOCATIONS
 NODE 0:
   HDFS SPLIT 
hdfs://localhost:20500/test-warehouse/alltypes/year=2009/month=1/090101.txt 
0:20433
@@ -224,32 +224,32 @@ NODE 2:
 08:EXCHANGE [UNPARTITIONED]
 |
 04:HASH JOIN [INNER JOIN, PARTITIONED]
-|  hash predicates: b.id = c.id, b.year = c.year, b.month = c.month, 
b.smallint_col = c.int_col
-|  runtime filters: RF000 <- c.id, RF001 <- c.year, RF002 <- c.month, RF003 <- 
c.int_col
+|  hash predicates: b.id = c.id, b.month = c.month, b.year = c.year, 
b.smallint_col = c.int_col
+|  runtime filters: RF000 <- c.id, RF001 <- c.month, RF002 <- c.year, RF003 <- 
c.int_col
 |
-|--07:EXCHANGE [HASH(c.id,c.year,c.month,c.int_col)]
+|--07:EXCHANGE [HASH(c.id,c.month,c.year,c.int_col)]
 |  |
 |  02:SCAN HDFS [functional.alltypestiny c]
 |     partitions=2/4 files=2 size=230B
 |     predicates: c.id = 17, CAST(sin(c.int_col) AS BOOLEAN) = TRUE
 |
 03:HASH JOIN [INNER JOIN, PARTITIONED]
-|  hash predicates: a.id = b.id, a.year = b.year, a.month = b.month, 
a.tinyint_col = b.smallint_col
-|  runtime filters: RF004 <- b.id, RF005 <- b.year, RF006 <- b.month, RF007 <- 
b.smallint_col
+|  hash predicates: a.id = b.id, a.month = b.month, a.year = b.year, 
a.tinyint_col = b.smallint_col
+|  runtime filters: RF004 <- b.id, RF005 <- b.month, RF006 <- b.year, RF007 <- 
b.smallint_col
 |
-|--06:EXCHANGE [HASH(b.id,b.year,b.month,b.smallint_col)]
+|--06:EXCHANGE [HASH(b.id,b.month,b.year,b.smallint_col)]
 |  |
 |  01:SCAN HDFS [functional.alltypessmall b]
 |     partitions=2/4 files=2 size=3.16KB
 |     predicates: b.id = 17, CAST(sin(b.smallint_col) AS BOOLEAN) = TRUE
-|     runtime filters: RF000 -> b.id, RF001 -> b.year, RF002 -> b.month, RF003 
-> b.smallint_col
+|     runtime filters: RF000 -> b.id, RF001 -> b.month, RF002 -> b.year, RF003 
-> b.smallint_col
 |
-05:EXCHANGE [HASH(a.id,a.year,a.month,a.tinyint_col)]
+05:EXCHANGE [HASH(a.id,a.month,a.year,a.tinyint_col)]
 |
 00:SCAN HDFS [functional.alltypes a]
    partitions=2/24 files=2 size=38.07KB
    predicates: a.id = 17, CAST(sin(a.tinyint_col) AS BOOLEAN) = TRUE
-   runtime filters: RF000 -> a.id, RF001 -> a.year, RF002 -> a.month, RF003 -> 
a.tinyint_col, RF004 -> a.id, RF005 -> a.year, RF006 -> a.month, RF007 -> 
a.tinyint_col
+   runtime filters: RF000 -> a.id, RF001 -> a.month, RF002 -> a.year, RF003 -> 
a.tinyint_col, RF004 -> a.id, RF005 -> a.month, RF006 -> a.year, RF007 -> 
a.tinyint_col
 ====
 # basic propagation between equivalence classes, with partition pruning;
 # variation with inline views
@@ -263,26 +263,26 @@ where a.year = 2009 and b.month + 2 <= 4 and b.id = 17
   and cast(sin(c.int_col) as boolean) = true
 ---- PLAN
 04:HASH JOIN [INNER JOIN]
-|  hash predicates: functional.alltypessmall.id = functional.alltypestiny.id, 
functional.alltypessmall.year = functional.alltypestiny.year, 
functional.alltypessmall.month = functional.alltypestiny.month, 
functional.alltypessmall.smallint_col = functional.alltypestiny.int_col
-|  runtime filters: RF000 <- functional.alltypestiny.id, RF001 <- 
functional.alltypestiny.year, RF002 <- functional.alltypestiny.month, RF003 <- 
functional.alltypestiny.int_col
+|  hash predicates: functional.alltypessmall.id = functional.alltypestiny.id, 
functional.alltypessmall.month = functional.alltypestiny.month, 
functional.alltypessmall.year = functional.alltypestiny.year, 
functional.alltypessmall.smallint_col = functional.alltypestiny.int_col
+|  runtime filters: RF000 <- functional.alltypestiny.id, RF001 <- 
functional.alltypestiny.month, RF002 <- functional.alltypestiny.year, RF003 <- 
functional.alltypestiny.int_col
 |
 |--02:SCAN HDFS [functional.alltypestiny]
 |     partitions=2/4 files=2 size=230B
 |     predicates: functional.alltypestiny.id = 17, 
CAST(sin(functional.alltypestiny.int_col) AS BOOLEAN) = TRUE
 |
 03:HASH JOIN [INNER JOIN]
-|  hash predicates: functional.alltypes.id = functional.alltypessmall.id, 
functional.alltypes.year = functional.alltypessmall.year, 
functional.alltypes.month = functional.alltypessmall.month, 
functional.alltypes.tinyint_col = functional.alltypessmall.smallint_col
-|  runtime filters: RF004 <- functional.alltypessmall.id, RF005 <- 
functional.alltypessmall.year, RF006 <- functional.alltypessmall.month, RF007 
<- functional.alltypessmall.smallint_col
+|  hash predicates: functional.alltypes.id = functional.alltypessmall.id, 
functional.alltypes.month = functional.alltypessmall.month, 
functional.alltypes.year = functional.alltypessmall.year, 
functional.alltypes.tinyint_col = functional.alltypessmall.smallint_col
+|  runtime filters: RF004 <- functional.alltypessmall.id, RF005 <- 
functional.alltypessmall.month, RF006 <- functional.alltypessmall.year, RF007 
<- functional.alltypessmall.smallint_col
 |
 |--01:SCAN HDFS [functional.alltypessmall]
 |     partitions=2/4 files=2 size=3.16KB
 |     predicates: functional.alltypessmall.id = 17, 
CAST(sin(functional.alltypessmall.smallint_col) AS BOOLEAN) = TRUE
-|     runtime filters: RF000 -> functional.alltypessmall.id, RF001 -> 
functional.alltypessmall.year, RF002 -> functional.alltypessmall.month, RF003 
-> functional.alltypessmall.smallint_col
+|     runtime filters: RF000 -> functional.alltypessmall.id, RF001 -> 
functional.alltypessmall.month, RF002 -> functional.alltypessmall.year, RF003 
-> functional.alltypessmall.smallint_col
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=2/24 files=2 size=38.07KB
    predicates: functional.alltypes.id = 17, 
CAST(sin(functional.alltypes.tinyint_col) AS BOOLEAN) = TRUE
-   runtime filters: RF000 -> functional.alltypes.id, RF001 -> 
functional.alltypes.year, RF002 -> functional.alltypes.month, RF003 -> 
functional.alltypes.tinyint_col, RF004 -> functional.alltypes.id, RF005 -> 
functional.alltypes.year, RF006 -> functional.alltypes.month, RF007 -> 
functional.alltypes.tinyint_col
+   runtime filters: RF000 -> functional.alltypes.id, RF001 -> 
functional.alltypes.month, RF002 -> functional.alltypes.year, RF003 -> 
functional.alltypes.tinyint_col, RF004 -> functional.alltypes.id, RF005 -> 
functional.alltypes.month, RF006 -> functional.alltypes.year, RF007 -> 
functional.alltypes.tinyint_col
 ---- SCANRANGELOCATIONS
 NODE 0:
   HDFS SPLIT 
hdfs://localhost:20500/test-warehouse/alltypes/year=2009/month=1/090101.txt 
0:20433
@@ -297,32 +297,32 @@ NODE 2:
 08:EXCHANGE [UNPARTITIONED]
 |
 04:HASH JOIN [INNER JOIN, PARTITIONED]
-|  hash predicates: functional.alltypessmall.id = functional.alltypestiny.id, 
functional.alltypessmall.year = functional.alltypestiny.year, 
functional.alltypessmall.month = functional.alltypestiny.month, 
functional.alltypessmall.smallint_col = functional.alltypestiny.int_col
-|  runtime filters: RF000 <- functional.alltypestiny.id, RF001 <- 
functional.alltypestiny.year, RF002 <- functional.alltypestiny.month, RF003 <- 
functional.alltypestiny.int_col
+|  hash predicates: functional.alltypessmall.id = functional.alltypestiny.id, 
functional.alltypessmall.month = functional.alltypestiny.month, 
functional.alltypessmall.year = functional.alltypestiny.year, 
functional.alltypessmall.smallint_col = functional.alltypestiny.int_col
+|  runtime filters: RF000 <- functional.alltypestiny.id, RF001 <- 
functional.alltypestiny.month, RF002 <- functional.alltypestiny.year, RF003 <- 
functional.alltypestiny.int_col
 |
-|--07:EXCHANGE 
[HASH(functional.alltypestiny.id,functional.alltypestiny.year,functional.alltypestiny.month,functional.alltypestiny.int_col)]
+|--07:EXCHANGE 
[HASH(functional.alltypestiny.id,functional.alltypestiny.month,functional.alltypestiny.year,functional.alltypestiny.int_col)]
 |  |
 |  02:SCAN HDFS [functional.alltypestiny]
 |     partitions=2/4 files=2 size=230B
 |     predicates: functional.alltypestiny.id = 17, 
CAST(sin(functional.alltypestiny.int_col) AS BOOLEAN) = TRUE
 |
 03:HASH JOIN [INNER JOIN, PARTITIONED]
-|  hash predicates: functional.alltypes.id = functional.alltypessmall.id, 
functional.alltypes.year = functional.alltypessmall.year, 
functional.alltypes.month = functional.alltypessmall.month, 
functional.alltypes.tinyint_col = functional.alltypessmall.smallint_col
-|  runtime filters: RF004 <- functional.alltypessmall.id, RF005 <- 
functional.alltypessmall.year, RF006 <- functional.alltypessmall.month, RF007 
<- functional.alltypessmall.smallint_col
+|  hash predicates: functional.alltypes.id = functional.alltypessmall.id, 
functional.alltypes.month = functional.alltypessmall.month, 
functional.alltypes.year = functional.alltypessmall.year, 
functional.alltypes.tinyint_col = functional.alltypessmall.smallint_col
+|  runtime filters: RF004 <- functional.alltypessmall.id, RF005 <- 
functional.alltypessmall.month, RF006 <- functional.alltypessmall.year, RF007 
<- functional.alltypessmall.smallint_col
 |
-|--06:EXCHANGE 
[HASH(functional.alltypessmall.id,functional.alltypessmall.year,functional.alltypessmall.month,functional.alltypessmall.smallint_col)]
+|--06:EXCHANGE 
[HASH(functional.alltypessmall.id,functional.alltypessmall.month,functional.alltypessmall.year,functional.alltypessmall.smallint_col)]
 |  |
 |  01:SCAN HDFS [functional.alltypessmall]
 |     partitions=2/4 files=2 size=3.16KB
 |     predicates: functional.alltypessmall.id = 17, 
CAST(sin(functional.alltypessmall.smallint_col) AS BOOLEAN) = TRUE
-|     runtime filters: RF000 -> functional.alltypessmall.id, RF001 -> 
functional.alltypessmall.year, RF002 -> functional.alltypessmall.month, RF003 
-> functional.alltypessmall.smallint_col
+|     runtime filters: RF000 -> functional.alltypessmall.id, RF001 -> 
functional.alltypessmall.month, RF002 -> functional.alltypessmall.year, RF003 
-> functional.alltypessmall.smallint_col
 |
-05:EXCHANGE 
[HASH(functional.alltypes.id,functional.alltypes.year,functional.alltypes.month,functional.alltypes.tinyint_col)]
+05:EXCHANGE 
[HASH(functional.alltypes.id,functional.alltypes.month,functional.alltypes.year,functional.alltypes.tinyint_col)]
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=2/24 files=2 size=38.07KB
    predicates: functional.alltypes.id = 17, 
CAST(sin(functional.alltypes.tinyint_col) AS BOOLEAN) = TRUE
-   runtime filters: RF000 -> functional.alltypes.id, RF001 -> 
functional.alltypes.year, RF002 -> functional.alltypes.month, RF003 -> 
functional.alltypes.tinyint_col, RF004 -> functional.alltypes.id, RF005 -> 
functional.alltypes.year, RF006 -> functional.alltypes.month, RF007 -> 
functional.alltypes.tinyint_col
+   runtime filters: RF000 -> functional.alltypes.id, RF001 -> 
functional.alltypes.month, RF002 -> functional.alltypes.year, RF003 -> 
functional.alltypes.tinyint_col, RF004 -> functional.alltypes.id, RF005 -> 
functional.alltypes.month, RF006 -> functional.alltypes.year, RF007 -> 
functional.alltypes.tinyint_col
 ====
 # propagation between outer-joined tables only goes in one direction:
 # - predicates on a.year and a.tinyint_col are propagated to b
@@ -341,7 +341,7 @@ from functional.alltypes a
 where a.year = 2009 and a.tinyint_col = 7 and a.id is null and b.id = 17 and 
b.int_col is null
 ---- PLAN
 02:HASH JOIN [LEFT OUTER JOIN]
-|  hash predicates: a.tinyint_col = b.tinyint_col, a.id = b.id, a.year = 
b.year, a.month = b.month
+|  hash predicates: a.id = b.id, a.month = b.month, a.tinyint_col = 
b.tinyint_col, a.year = b.year
 |  other predicates: b.int_col IS NULL, b.id = 17
 |
 |--01:SCAN HDFS [functional.alltypessmall b]
@@ -371,7 +371,7 @@ NODE 1:
 04:EXCHANGE [UNPARTITIONED]
 |
 02:HASH JOIN [LEFT OUTER JOIN, BROADCAST]
-|  hash predicates: a.tinyint_col = b.tinyint_col, a.id = b.id, a.year = 
b.year, a.month = b.month
+|  hash predicates: a.id = b.id, a.month = b.month, a.tinyint_col = 
b.tinyint_col, a.year = b.year
 |  other predicates: b.int_col IS NULL, b.id = 17
 |
 |--03:EXCHANGE [BROADCAST]
@@ -401,9 +401,9 @@ from functional.alltypessmall a
 where b.year = 2009 and b.tinyint_col = 7 and b.id is null and a.id = 17 and 
a.int_col is null
 ---- PLAN
 02:HASH JOIN [RIGHT OUTER JOIN]
-|  hash predicates: a.tinyint_col = b.tinyint_col, a.id = b.id, a.year = 
b.year, a.month = b.month
+|  hash predicates: a.id = b.id, a.month = b.month, a.tinyint_col = 
b.tinyint_col, a.year = b.year
 |  other predicates: a.int_col IS NULL, a.id = 17
-|  runtime filters: RF000 <- b.tinyint_col, RF001 <- b.id, RF002 <- b.year, 
RF003 <- b.month
+|  runtime filters: RF000 <- b.id, RF001 <- b.month, RF002 <- b.tinyint_col, 
RF003 <- b.year
 |
 |--01:SCAN HDFS [functional.alltypes b]
 |     partitions=12/24 files=12 size=238.68KB
@@ -412,27 +412,27 @@ where b.year = 2009 and b.tinyint_col = 7 and b.id is 
null and a.id = 17 and a.i
 00:SCAN HDFS [functional.alltypessmall a]
    partitions=1/4 files=1 size=1.57KB
    predicates: a.id = 17, a.tinyint_col = 7
-   runtime filters: RF000 -> a.tinyint_col, RF001 -> a.id, RF002 -> a.year, 
RF003 -> a.month
+   runtime filters: RF000 -> a.id, RF001 -> a.month, RF002 -> a.tinyint_col, 
RF003 -> a.year
 ---- DISTRIBUTEDPLAN
 05:EXCHANGE [UNPARTITIONED]
 |
 02:HASH JOIN [RIGHT OUTER JOIN, PARTITIONED]
-|  hash predicates: a.tinyint_col = b.tinyint_col, a.id = b.id, a.year = 
b.year, a.month = b.month
+|  hash predicates: a.id = b.id, a.month = b.month, a.tinyint_col = 
b.tinyint_col, a.year = b.year
 |  other predicates: a.int_col IS NULL, a.id = 17
-|  runtime filters: RF000 <- b.tinyint_col, RF001 <- b.id, RF002 <- b.year, 
RF003 <- b.month
+|  runtime filters: RF000 <- b.id, RF001 <- b.month, RF002 <- b.tinyint_col, 
RF003 <- b.year
 |
-|--04:EXCHANGE [HASH(b.tinyint_col,b.id,b.year,b.month)]
+|--04:EXCHANGE [HASH(b.id,b.month,b.tinyint_col,b.year)]
 |  |
 |  01:SCAN HDFS [functional.alltypes b]
 |     partitions=12/24 files=12 size=238.68KB
 |     predicates: b.id IS NULL, b.tinyint_col = 7
 |
-03:EXCHANGE [HASH(a.tinyint_col,a.id,a.year,a.month)]
+03:EXCHANGE [HASH(a.id,a.month,a.tinyint_col,a.year)]
 |
 00:SCAN HDFS [functional.alltypessmall a]
    partitions=1/4 files=1 size=1.57KB
    predicates: a.id = 17, a.tinyint_col = 7
-   runtime filters: RF000 -> a.tinyint_col, RF001 -> a.id, RF002 -> a.year, 
RF003 -> a.month
+   runtime filters: RF000 -> a.id, RF001 -> a.month, RF002 -> a.tinyint_col, 
RF003 -> a.year
 ====
 # propagation into inline view with aggregation:
 # - predicates from enclosing scope applied to grouping exprs; with partition 
pruning
@@ -449,8 +449,8 @@ from functional.alltypes a
 where a.year = 2009 and b.month <= 2 and b.count_col + 1 = 17 and 
a.tinyint_col != 5
 ---- PLAN
 03:HASH JOIN [INNER JOIN]
-|  hash predicates: a.id = id, a.year = year, a.month = month, a.tinyint_col = 
int_col
-|  runtime filters: RF000 <- id, RF001 <- year, RF002 <- month, RF003 <- 
int_col
+|  hash predicates: a.id = id, a.month = month, a.year = year, a.tinyint_col = 
int_col
+|  runtime filters: RF000 <- id, RF001 <- month, RF002 <- year, RF003 <- 
int_col
 |
 |--02:AGGREGATE [FINALIZE]
 |  |  output: count(*)
@@ -459,12 +459,12 @@ where a.year = 2009 and b.month <= 2 and b.count_col + 1 
= 17 and a.tinyint_col
 |  |
 |  01:SCAN HDFS [functional.alltypessmall]
 |     partitions=2/4 files=2 size=3.16KB
-|     predicates: id > 11, functional.alltypessmall.int_col != 5
+|     predicates: functional.alltypessmall.int_col != 5, id > 11
 |
 00:SCAN HDFS [functional.alltypes a]
    partitions=2/24 files=2 size=38.07KB
    predicates: a.id > 11, a.tinyint_col != 5
-   runtime filters: RF000 -> a.id, RF001 -> a.year, RF002 -> a.month, RF003 -> 
a.tinyint_col
+   runtime filters: RF000 -> a.id, RF001 -> a.month, RF002 -> a.year, RF003 -> 
a.tinyint_col
 ---- SCANRANGELOCATIONS
 NODE 0:
   HDFS SPLIT 
hdfs://localhost:20500/test-warehouse/alltypes/year=2009/month=1/090101.txt 
0:20433
@@ -476,8 +476,8 @@ NODE 1:
 07:EXCHANGE [UNPARTITIONED]
 |
 03:HASH JOIN [INNER JOIN, BROADCAST]
-|  hash predicates: a.id = id, a.year = year, a.month = month, a.tinyint_col = 
int_col
-|  runtime filters: RF000 <- id, RF001 <- year, RF002 <- month, RF003 <- 
int_col
+|  hash predicates: a.id = id, a.month = month, a.year = year, a.tinyint_col = 
int_col
+|  runtime filters: RF000 <- id, RF001 <- month, RF002 <- year, RF003 <- 
int_col
 |
 |--06:EXCHANGE [BROADCAST]
 |  |
@@ -494,12 +494,12 @@ NODE 1:
 |  |
 |  01:SCAN HDFS [functional.alltypessmall]
 |     partitions=2/4 files=2 size=3.16KB
-|     predicates: id > 11, functional.alltypessmall.int_col != 5
+|     predicates: functional.alltypessmall.int_col != 5, id > 11
 |
 00:SCAN HDFS [functional.alltypes a]
    partitions=2/24 files=2 size=38.07KB
    predicates: a.id > 11, a.tinyint_col != 5
-   runtime filters: RF000 -> a.id, RF001 -> a.year, RF002 -> a.month, RF003 -> 
a.tinyint_col
+   runtime filters: RF000 -> a.id, RF001 -> a.month, RF002 -> a.year, RF003 -> 
a.tinyint_col
 ====
 # Same as above but with cross join
 select straight_join a.id, b.id
@@ -519,8 +519,8 @@ where a.id = b.id and
       a.tinyint_col != 5
 ---- PLAN
 03:HASH JOIN [INNER JOIN]
-|  hash predicates: a.id = id, a.year = year, a.month = month, a.tinyint_col = 
int_col
-|  runtime filters: RF000 <- id, RF001 <- year, RF002 <- month, RF003 <- 
int_col
+|  hash predicates: a.id = id, a.month = month, a.year = year, a.tinyint_col = 
int_col
+|  runtime filters: RF000 <- id, RF001 <- month, RF002 <- year, RF003 <- 
int_col
 |
 |--02:AGGREGATE [FINALIZE]
 |  |  output: count(*)
@@ -529,18 +529,18 @@ where a.id = b.id and
 |  |
 |  01:SCAN HDFS [functional.alltypessmall]
 |     partitions=2/4 files=2 size=3.16KB
-|     predicates: id > 11, functional.alltypessmall.int_col != 5
+|     predicates: functional.alltypessmall.int_col != 5, id > 11
 |
 00:SCAN HDFS [functional.alltypes a]
    partitions=2/24 files=2 size=38.07KB
    predicates: a.id > 11, a.tinyint_col != 5
-   runtime filters: RF000 -> a.id, RF001 -> a.year, RF002 -> a.month, RF003 -> 
a.tinyint_col
+   runtime filters: RF000 -> a.id, RF001 -> a.month, RF002 -> a.year, RF003 -> 
a.tinyint_col
 ---- DISTRIBUTEDPLAN
 07:EXCHANGE [UNPARTITIONED]
 |
 03:HASH JOIN [INNER JOIN, BROADCAST]
-|  hash predicates: a.id = id, a.year = year, a.month = month, a.tinyint_col = 
int_col
-|  runtime filters: RF000 <- id, RF001 <- year, RF002 <- month, RF003 <- 
int_col
+|  hash predicates: a.id = id, a.month = month, a.year = year, a.tinyint_col = 
int_col
+|  runtime filters: RF000 <- id, RF001 <- month, RF002 <- year, RF003 <- 
int_col
 |
 |--06:EXCHANGE [BROADCAST]
 |  |
@@ -557,12 +557,12 @@ where a.id = b.id and
 |  |
 |  01:SCAN HDFS [functional.alltypessmall]
 |     partitions=2/4 files=2 size=3.16KB
-|     predicates: id > 11, functional.alltypessmall.int_col != 5
+|     predicates: functional.alltypessmall.int_col != 5, id > 11
 |
 00:SCAN HDFS [functional.alltypes a]
    partitions=2/24 files=2 size=38.07KB
    predicates: a.id > 11, a.tinyint_col != 5
-   runtime filters: RF000 -> a.id, RF001 -> a.year, RF002 -> a.month, RF003 -> 
a.tinyint_col
+   runtime filters: RF000 -> a.id, RF001 -> a.month, RF002 -> a.year, RF003 -> 
a.tinyint_col
 ====
 # no propagation into select block with limit;
 # propagation out of that block is okay;
@@ -580,8 +580,8 @@ from functional.alltypes a
 where a.year = 2009 and b.month <= 2 and b.count_col + 1 = 17 and 
a.tinyint_col != 5
 ---- PLAN
 04:HASH JOIN [INNER JOIN]
-|  hash predicates: a.id = id, a.year = year, a.month = month, a.tinyint_col = 
int_col
-|  runtime filters: RF000 <- id, RF001 <- year, RF002 <- month, RF003 <- 
int_col
+|  hash predicates: a.id = id, a.month = month, a.year = year, a.tinyint_col = 
int_col
+|  runtime filters: RF000 <- id, RF001 <- month, RF002 <- year, RF003 <- 
int_col
 |
 |--03:SELECT
 |  |  predicates: count(*) + 1 = 17
@@ -598,7 +598,7 @@ where a.year = 2009 and b.month <= 2 and b.count_col + 1 = 
17 and a.tinyint_col
 00:SCAN HDFS [functional.alltypes a]
    partitions=2/24 files=2 size=38.07KB
    predicates: a.id > 11, a.tinyint_col != 5
-   runtime filters: RF000 -> a.id, RF001 -> a.year, RF002 -> a.month, RF003 -> 
a.tinyint_col
+   runtime filters: RF000 -> a.id, RF001 -> a.month, RF002 -> a.year, RF003 -> 
a.tinyint_col
 ---- SCANRANGELOCATIONS
 NODE 0:
   HDFS SPLIT 
hdfs://localhost:20500/test-warehouse/alltypes/year=2009/month=1/090101.txt 
0:20433
@@ -612,8 +612,8 @@ NODE 1:
 09:EXCHANGE [UNPARTITIONED]
 |
 04:HASH JOIN [INNER JOIN, BROADCAST]
-|  hash predicates: a.id = id, a.year = year, a.month = month, a.tinyint_col = 
int_col
-|  runtime filters: RF000 <- id, RF001 <- year, RF002 <- month, RF003 <- 
int_col
+|  hash predicates: a.id = id, a.month = month, a.year = year, a.tinyint_col = 
int_col
+|  runtime filters: RF000 <- id, RF001 <- month, RF002 <- year, RF003 <- 
int_col
 |
 |--08:EXCHANGE [BROADCAST]
 |  |
@@ -641,7 +641,7 @@ NODE 1:
 00:SCAN HDFS [functional.alltypes a]
    partitions=2/24 files=2 size=38.07KB
    predicates: a.id > 11, a.tinyint_col != 5
-   runtime filters: RF000 -> a.id, RF001 -> a.year, RF002 -> a.month, RF003 -> 
a.tinyint_col
+   runtime filters: RF000 -> a.id, RF001 -> a.month, RF002 -> a.year, RF003 -> 
a.tinyint_col
 ====
 # Similar to the above, converts the cross join to a hash join
 select straight_join a.id, b.id
@@ -662,8 +662,8 @@ where a.year = 2009 and
       a.month = b.month
 ---- PLAN
 04:HASH JOIN [INNER JOIN]
-|  hash predicates: a.id = id, a.year = year, a.month = month, a.tinyint_col = 
int_col
-|  runtime filters: RF000 <- id, RF001 <- year, RF002 <- month, RF003 <- 
int_col
+|  hash predicates: a.id = id, a.month = month, a.year = year, a.tinyint_col = 
int_col
+|  runtime filters: RF000 <- id, RF001 <- month, RF002 <- year, RF003 <- 
int_col
 |
 |--03:SELECT
 |  |  predicates: count(*) + 1 = 17
@@ -680,13 +680,13 @@ where a.year = 2009 and
 00:SCAN HDFS [functional.alltypes a]
    partitions=2/24 files=2 size=38.07KB
    predicates: a.id > 11, a.tinyint_col != 5
-   runtime filters: RF000 -> a.id, RF001 -> a.year, RF002 -> a.month, RF003 -> 
a.tinyint_col
+   runtime filters: RF000 -> a.id, RF001 -> a.month, RF002 -> a.year, RF003 -> 
a.tinyint_col
 ---- DISTRIBUTEDPLAN
 09:EXCHANGE [UNPARTITIONED]
 |
 04:HASH JOIN [INNER JOIN, BROADCAST]
-|  hash predicates: a.id = id, a.year = year, a.month = month, a.tinyint_col = 
int_col
-|  runtime filters: RF000 <- id, RF001 <- year, RF002 <- month, RF003 <- 
int_col
+|  hash predicates: a.id = id, a.month = month, a.year = year, a.tinyint_col = 
int_col
+|  runtime filters: RF000 <- id, RF001 <- month, RF002 <- year, RF003 <- 
int_col
 |
 |--08:EXCHANGE [BROADCAST]
 |  |
@@ -714,7 +714,7 @@ where a.year = 2009 and
 00:SCAN HDFS [functional.alltypes a]
    partitions=2/24 files=2 size=38.07KB
    predicates: a.id > 11, a.tinyint_col != 5
-   runtime filters: RF000 -> a.id, RF001 -> a.year, RF002 -> a.month, RF003 -> 
a.tinyint_col
+   runtime filters: RF000 -> a.id, RF001 -> a.month, RF002 -> a.year, RF003 -> 
a.tinyint_col
 ====
 # propagation of z.month=1 to alltypesagg is prevented
 select straight_join x.int_col, z.int_col
@@ -768,16 +768,16 @@ and x.id + x.b_id = 17
 |     limit: 10
 |
 02:HASH JOIN [INNER JOIN]
-|  hash predicates: a.year = b.year, a.int_col = b.int_col
+|  hash predicates: a.int_col = b.int_col, a.year = b.year
 |  other predicates: a.id + b.id = 17
-|  runtime filters: RF001 <- b.year, RF002 <- b.int_col
+|  runtime filters: RF001 <- b.int_col, RF002 <- b.year
 |
 |--01:SCAN HDFS [functional.alltypessmall b]
 |     partitions=4/4 files=4 size=6.32KB
 |
 00:SCAN HDFS [functional.alltypes a]
    partitions=12/24 files=12 size=238.68KB
-   runtime filters: RF000 -> a.id, RF001 -> a.year, RF002 -> a.int_col
+   runtime filters: RF000 -> a.id, RF001 -> a.int_col, RF002 -> a.year
 ====
 # correct placement of predicates in the presence of aggregation in an inline 
view
 select straight_join a.id, b.id
@@ -969,13 +969,13 @@ and t2.id + t2.smallint_col + t2.bigint_col > 30
 and t2.id + t3.int_col > 40
 ---- PLAN
 04:HASH JOIN [INNER JOIN]
-|  hash predicates: t2.id = functional.alltypestiny.id, t2.bigint_col = 
functional.alltypestiny.bigint_col, t2.smallint_col = 
functional.alltypestiny.int_col
+|  hash predicates: t2.bigint_col = functional.alltypestiny.bigint_col, t2.id 
= functional.alltypestiny.id, t2.smallint_col = functional.alltypestiny.int_col
 |  other predicates: t2.id + functional.alltypestiny.int_col > 40
-|  runtime filters: RF000 <- functional.alltypestiny.id, RF001 <- 
functional.alltypestiny.bigint_col, RF002 <- functional.alltypestiny.int_col
+|  runtime filters: RF000 <- functional.alltypestiny.bigint_col, RF001 <- 
functional.alltypestiny.id, RF002 <- functional.alltypestiny.int_col
 |
 |--02:SCAN HDFS [functional.alltypestiny]
 |     partitions=4/4 files=4 size=460B
-|     predicates: functional.alltypestiny.id + functional.alltypestiny.int_col 
> 10, functional.alltypestiny.id + functional.alltypestiny.bigint_col > 20, 
functional.alltypestiny.id + functional.alltypestiny.int_col + 
functional.alltypestiny.bigint_col > 30
+|     predicates: functional.alltypestiny.id + 
functional.alltypestiny.bigint_col > 20, functional.alltypestiny.id + 
functional.alltypestiny.int_col > 10, functional.alltypestiny.id + 
functional.alltypestiny.int_col + functional.alltypestiny.bigint_col > 30
 |
 03:HASH JOIN [INNER JOIN]
 |  hash predicates: t1.id = t2.id, t1.tinyint_col = t2.smallint_col
@@ -983,13 +983,13 @@ and t2.id + t3.int_col > 40
 |
 |--01:SCAN HDFS [functional.alltypessmall t2]
 |     partitions=4/4 files=4 size=6.32KB
-|     predicates: t2.id + t2.smallint_col > 10, t2.id + t2.bigint_col > 20, 
t2.id + t2.smallint_col + t2.bigint_col > 30
-|     runtime filters: RF000 -> t2.id, RF001 -> t2.bigint_col, RF002 -> 
t2.smallint_col
+|     predicates: t2.id + t2.bigint_col > 20, t2.id + t2.smallint_col > 10, 
t2.id + t2.smallint_col + t2.bigint_col > 30
+|     runtime filters: RF000 -> t2.bigint_col, RF001 -> t2.id, RF002 -> 
t2.smallint_col
 |
 00:SCAN HDFS [functional.alltypes t1]
    partitions=24/24 files=24 size=478.45KB
    predicates: t1.id + t1.tinyint_col > 10
-   runtime filters: RF000 -> t1.id, RF002 -> t1.tinyint_col, RF003 -> t1.id, 
RF004 -> t1.tinyint_col
+   runtime filters: RF001 -> t1.id, RF002 -> t1.tinyint_col, RF003 -> t1.id, 
RF004 -> t1.tinyint_col
 ====
 # basic propagation of multi-slot, single-tuple predicates with aggregates
 select straight_join 1 from
@@ -1162,7 +1162,7 @@ where a.id < 10
 |
 |--01:SCAN HDFS [functional.alltypestiny]
 |     partitions=4/4 files=4 size=460B
-|     predicates: id > 20, functional.alltypestiny.id < 10
+|     predicates: functional.alltypestiny.id < 10, id > 20
 |
 00:SCAN HDFS [functional.alltypes a]
    partitions=24/24 files=24 size=478.45KB
@@ -1185,7 +1185,7 @@ where b.id < 10
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
-   predicates: id > 20, functional.alltypes.id < 10
+   predicates: functional.alltypes.id < 10, id > 20
 ====
 # Test proper predicate assignment with predicate propagation when the
 # generated predicate is bound by an outer joined tuple (IMPALA-2018)

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/1a5c43ef/testdata/workloads/functional-planner/queries/PlannerTest/runtime-filter-propagation.test
----------------------------------------------------------------------
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/runtime-filter-propagation.test
 
b/testdata/workloads/functional-planner/queries/PlannerTest/runtime-filter-propagation.test
index 499910b..f1abd1d 100644
--- 
a/testdata/workloads/functional-planner/queries/PlannerTest/runtime-filter-propagation.test
+++ 
b/testdata/workloads/functional-planner/queries/PlannerTest/runtime-filter-propagation.test
@@ -143,7 +143,7 @@ and t1.int_col = 1 and 1 = t2.bigint_col
 ---- PLAN
 02:HASH JOIN [INNER JOIN]
 |  hash predicates: t1.id = t2.id
-|  other predicates: t1.year = t1.month + t2.int_col, t1.year + 
t2.smallint_col = t2.tinyint_col, t1.year + t2.int_col = t1.month + 
t2.tinyint_col
+|  other predicates: t1.year + t2.smallint_col = t2.tinyint_col, t1.year = 
t1.month + t2.int_col, t1.year + t2.int_col = t1.month + t2.tinyint_col
 |  runtime filters: RF000 <- t2.id
 |
 |--01:SCAN HDFS [functional.alltypesnopart t2]
@@ -262,8 +262,8 @@ where t1.year = v.int_col and t1.year = v.id and t1.month = 
v.tinyint_col
 |  runtime filters: RF000 <- t2.int_col, RF001 <- t4.tinyint_col
 |
 |--05:HASH JOIN [INNER JOIN]
-|  |  hash predicates: t3.int_col = t4.int_col, t2.tinyint_col = t4.tinyint_col
-|  |  runtime filters: RF002 <- t4.int_col, RF003 <- t4.tinyint_col
+|  |  hash predicates: t2.tinyint_col = t4.tinyint_col, t3.int_col = t4.int_col
+|  |  runtime filters: RF002 <- t4.tinyint_col, RF003 <- t4.int_col
 |  |
 |  |--03:SCAN HDFS [functional.alltypesnopart t4]
 |  |     partitions=1/1 files=0 size=0B
@@ -274,12 +274,12 @@ where t1.year = v.int_col and t1.year = v.id and t1.month 
= v.tinyint_col
 |  |
 |  |--02:SCAN HDFS [functional.alltypesnopart t3]
 |  |     partitions=1/1 files=0 size=0B
-|  |     runtime filters: RF002 -> t3.int_col
+|  |     runtime filters: RF003 -> t3.int_col
 |  |
 |  01:SCAN HDFS [functional.alltypesnopart t2]
 |     partitions=1/1 files=0 size=0B
 |     predicates: t2.int_col = t2.id
-|     runtime filters: RF003 -> t2.tinyint_col, RF004 -> t2.id
+|     runtime filters: RF002 -> t2.tinyint_col, RF004 -> t2.id
 |
 00:SCAN HDFS [functional.alltypesagg t1]
    partitions=11/11 files=11 size=814.73KB
@@ -328,8 +328,8 @@ where t1.year = t2.id and t2.int_col = t3.tinyint_col and 
t3.month = t4.bigint_c
   and t4.smallint_col = t5.smallint_col and t5.id = t1.month
 ---- PLAN
 08:HASH JOIN [INNER JOIN]
-|  hash predicates: t4.smallint_col = t5.smallint_col, t1.month = t5.id
-|  runtime filters: RF000 <- t5.smallint_col, RF001 <- t5.id
+|  hash predicates: t1.month = t5.id, t4.smallint_col = t5.smallint_col
+|  runtime filters: RF000 <- t5.id, RF001 <- t5.smallint_col
 |
 |--04:SCAN HDFS [functional.alltypesnopart t5]
 |     partitions=1/1 files=0 size=0B
@@ -340,7 +340,7 @@ where t1.year = t2.id and t2.int_col = t3.tinyint_col and 
t3.month = t4.bigint_c
 |
 |--03:SCAN HDFS [functional.alltypesnopart t4]
 |     partitions=1/1 files=0 size=0B
-|     runtime filters: RF000 -> t4.smallint_col
+|     runtime filters: RF001 -> t4.smallint_col
 |
 06:HASH JOIN [INNER JOIN]
 |  hash predicates: t2.int_col = t3.tinyint_col
@@ -360,7 +360,7 @@ where t1.year = t2.id and t2.int_col = t3.tinyint_col and 
t3.month = t4.bigint_c
 |
 00:SCAN HDFS [functional.alltypesagg t1]
    partitions=11/11 files=11 size=814.73KB
-   runtime filters: RF001 -> t1.month, RF004 -> t1.year
+   runtime filters: RF000 -> t1.month, RF004 -> t1.year
 ====
 # Two-way left outer join query; no runtime filters should be generated from 
the
 # ON-clause equi-join predicate
@@ -632,7 +632,7 @@ select straight_join * from
 where v1.year = t2.id and v1.int_col = t2.int_col and t2.smallint_col = 1
 ---- PLAN
 03:HASH JOIN [INNER JOIN]
-|  hash predicates: year = t2.id, int_col = t2.int_col
+|  hash predicates: int_col = t2.int_col, year = t2.id
 |
 |--02:SCAN HDFS [functional.alltypesnopart t2]
 |     partitions=1/1 files=0 size=0B
@@ -1213,7 +1213,7 @@ from big_six
 36:NESTED LOOP JOIN [CROSS JOIN]
 |
 |--28:HASH JOIN [INNER JOIN]
-|  |  hash predicates: a.id = b.id, a.bigint_col = b.bigint_col, a.bool_col = 
b.bool_col, a.double_col = b.double_col, a.float_col = b.float_col, a.int_col = 
b.int_col, a.smallint_col = b.smallint_col, a.tinyint_col = b.tinyint_col
+|  |  hash predicates: a.bigint_col = b.bigint_col, a.bool_col = b.bool_col, 
a.double_col = b.double_col, a.float_col = b.float_col, a.id = b.id, a.int_col 
= b.int_col, a.smallint_col = b.smallint_col, a.tinyint_col = b.tinyint_col
 |  |
 |  |--27:SCAN HDFS [functional.alltypestiny b]
 |  |     partitions=4/4 files=4 size=460B
@@ -1224,7 +1224,7 @@ from big_six
 35:NESTED LOOP JOIN [CROSS JOIN]
 |
 |--25:HASH JOIN [INNER JOIN]
-|  |  hash predicates: a.id = b.id, a.bool_col = b.bool_col, a.tinyint_col = 
b.tinyint_col
+|  |  hash predicates: a.bool_col = b.bool_col, a.id = b.id, a.tinyint_col = 
b.tinyint_col
 |  |
 |  |--24:SCAN HDFS [functional.alltypes b]
 |  |     partitions=24/24 files=24 size=478.45KB
@@ -1235,7 +1235,7 @@ from big_six
 34:NESTED LOOP JOIN [CROSS JOIN]
 |
 |--22:HASH JOIN [INNER JOIN]
-|  |  hash predicates: a.id = b.id, a.bigint_col = b.bigint_col, a.bool_col = 
b.bool_col, a.int_col = b.int_col, a.smallint_col = b.smallint_col, 
a.tinyint_col = b.tinyint_col
+|  |  hash predicates: a.bigint_col = b.bigint_col, a.bool_col = b.bool_col, 
a.id = b.id, a.int_col = b.int_col, a.smallint_col = b.smallint_col, 
a.tinyint_col = b.tinyint_col
 |  |
 |  |--21:SCAN HDFS [functional.alltypestiny b]
 |  |     partitions=4/4 files=4 size=460B
@@ -1273,20 +1273,20 @@ from big_six
 31:NESTED LOOP JOIN [CROSS JOIN]
 |
 |--11:HASH JOIN [INNER JOIN]
-|  |  hash predicates: a.id = b.id, a.bigint_col = b.bigint_col, a.bool_col = 
b.bool_col, a.double_col = b.double_col, a.float_col = b.float_col, a.int_col = 
b.int_col, a.smallint_col = b.smallint_col, a.tinyint_col = b.tinyint_col
-|  |  runtime filters: RF017 <- b.bigint_col, RF016 <- b.id, RF019 <- 
b.double_col, RF018 <- b.bool_col, RF021 <- b.int_col, RF020 <- b.float_col, 
RF023 <- b.tinyint_col, RF022 <- b.smallint_col
+|  |  hash predicates: a.bigint_col = b.bigint_col, a.bool_col = b.bool_col, 
a.double_col = b.double_col, a.float_col = b.float_col, a.id = b.id, a.int_col 
= b.int_col, a.smallint_col = b.smallint_col, a.tinyint_col = b.tinyint_col
+|  |  runtime filters: RF017 <- b.bool_col, RF016 <- b.bigint_col, RF019 <- 
b.float_col, RF018 <- b.double_col, RF021 <- b.int_col, RF020 <- b.id, RF023 <- 
b.tinyint_col, RF022 <- b.smallint_col
 |  |
 |  |--10:SCAN HDFS [functional.alltypestiny b]
 |  |     partitions=4/4 files=4 size=460B
 |  |
 |  09:SCAN HDFS [functional.alltypes a]
 |     partitions=24/24 files=24 size=478.45KB
-|     runtime filters: RF017 -> a.bigint_col, RF016 -> a.id, RF019 -> 
a.double_col, RF018 -> a.bool_col, RF021 -> a.int_col, RF020 -> a.float_col, 
RF023 -> a.tinyint_col, RF022 -> a.smallint_col
+|     runtime filters: RF017 -> a.bool_col, RF016 -> a.bigint_col, RF019 -> 
a.float_col, RF018 -> a.double_col, RF021 -> a.int_col, RF020 -> a.id, RF023 -> 
a.tinyint_col, RF022 -> a.smallint_col
 |
 30:NESTED LOOP JOIN [CROSS JOIN]
 |
 |--08:HASH JOIN [INNER JOIN]
-|  |  hash predicates: a.id = b.id, a.bool_col = b.bool_col, a.double_col = 
b.double_col, a.smallint_col = b.smallint_col, a.timestamp_col = 
b.timestamp_col, a.tinyint_col = b.tinyint_col, a.string_col = b.string_col, 
a.date_string_col = b.date_string_col
+|  |  hash predicates: a.bool_col = b.bool_col, a.double_col = b.double_col, 
a.id = b.id, a.smallint_col = b.smallint_col, a.timestamp_col = 
b.timestamp_col, a.tinyint_col = b.tinyint_col, a.string_col = b.string_col, 
a.date_string_col = b.date_string_col
 |  |
 |  |--07:SCAN HDFS [functional.alltypes b]
 |  |     partitions=24/24 files=24 size=478.45KB
@@ -1297,18 +1297,18 @@ from big_six
 29:NESTED LOOP JOIN [CROSS JOIN]
 |
 |--05:HASH JOIN [INNER JOIN]
-|  |  hash predicates: a.id = b.id, a.bool_col = b.bool_col
-|  |  runtime filters: RF006 <- b.id, RF007 <- b.bool_col
+|  |  hash predicates: a.bool_col = b.bool_col, a.id = b.id
+|  |  runtime filters: RF006 <- b.bool_col, RF007 <- b.id
 |  |
 |  |--04:SCAN HDFS [functional.alltypestiny b]
 |  |     partitions=4/4 files=4 size=460B
 |  |
 |  03:SCAN HDFS [functional.alltypes a]
 |     partitions=24/24 files=24 size=478.45KB
-|     runtime filters: RF006 -> a.id, RF007 -> a.bool_col
+|     runtime filters: RF006 -> a.bool_col, RF007 -> a.id
 |
 02:HASH JOIN [INNER JOIN]
-|  hash predicates: a.id = b.id, a.bigint_col = b.bigint_col, a.bool_col = 
b.bool_col, a.int_col = b.int_col, a.smallint_col = b.smallint_col, 
a.tinyint_col = b.tinyint_col
+|  hash predicates: a.bigint_col = b.bigint_col, a.bool_col = b.bool_col, a.id 
= b.id, a.int_col = b.int_col, a.smallint_col = b.smallint_col, a.tinyint_col = 
b.tinyint_col
 |
 |--01:SCAN HDFS [functional.alltypes b]
 |     partitions=24/24 files=24 size=478.45KB

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/1a5c43ef/testdata/workloads/functional-planner/queries/PlannerTest/subquery-rewrite.test
----------------------------------------------------------------------
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/subquery-rewrite.test
 
b/testdata/workloads/functional-planner/queries/PlannerTest/subquery-rewrite.test
index a04f723..21776ba 100644
--- 
a/testdata/workloads/functional-planner/queries/PlannerTest/subquery-rewrite.test
+++ 
b/testdata/workloads/functional-planner/queries/PlannerTest/subquery-rewrite.test
@@ -41,7 +41,7 @@ and a.int_col < 100
 ---- PLAN
 02:HASH JOIN [NULL AWARE LEFT ANTI JOIN]
 |  hash predicates: a.int_col = int_col
-|  other join predicates: g.bigint_col < a.bigint_col, a.id = g.id
+|  other join predicates: a.id = g.id, g.bigint_col < a.bigint_col
 |
 |--01:SCAN HDFS [functional.alltypesagg g]
 |     partitions=11/11 files=11 size=814.73KB
@@ -77,8 +77,8 @@ and bool_col = false
 |  output: count(*)
 |
 02:HASH JOIN [LEFT SEMI JOIN]
-|  hash predicates: int_col = int_col, a.id = g.id
-|  runtime filters: RF000 <- int_col, RF001 <- g.id
+|  hash predicates: a.id = g.id, int_col = int_col
+|  runtime filters: RF000 <- g.id, RF001 <- int_col
 |
 |--01:SCAN HDFS [functional.alltypesagg g]
 |     partitions=11/11 files=11 size=814.73KB
@@ -87,7 +87,7 @@ and bool_col = false
 00:SCAN HDFS [functional.alltypes a]
    partitions=24/24 files=24 size=478.45KB
    predicates: bool_col = FALSE
-   runtime filters: RF000 -> int_col, RF001 -> a.id
+   runtime filters: RF000 -> a.id, RF001 -> int_col
 ====
 # Complex expression in the IN predicate
 select *
@@ -174,8 +174,8 @@ and a.int_col < 10
 |  output: count(*)
 |
 04:HASH JOIN [LEFT SEMI JOIN]
-|  hash predicates: a.id = s.id, a.bool_col = s.bool_col
-|  runtime filters: RF000 <- s.id, RF001 <- s.bool_col
+|  hash predicates: a.bool_col = s.bool_col, a.id = s.id
+|  runtime filters: RF000 <- s.bool_col, RF001 <- s.id
 |
 |--03:HASH JOIN [INNER JOIN]
 |  |  hash predicates: s.int_col = t.int_col
@@ -191,7 +191,7 @@ and a.int_col < 10
 00:SCAN HDFS [functional.alltypesagg a]
    partitions=11/11 files=11 size=814.73KB
    predicates: a.int_col < 10
-   runtime filters: RF000 -> a.id, RF001 -> a.bool_col
+   runtime filters: RF000 -> a.bool_col, RF001 -> a.id
 ====
 # Outer join between the tables in the outer query block
 select count(*)
@@ -451,15 +451,15 @@ where id in
 |  runtime filters: RF000 <- id, RF001 <- a.int_col
 |
 |--03:HASH JOIN [LEFT SEMI JOIN]
-|  |  hash predicates: a.tinyint_col = tinyint_col, a.bigint_col = s.bigint_col
-|  |  runtime filters: RF002 <- tinyint_col, RF003 <- s.bigint_col
+|  |  hash predicates: a.bigint_col = s.bigint_col, a.tinyint_col = tinyint_col
+|  |  runtime filters: RF002 <- s.bigint_col, RF003 <- tinyint_col
 |  |
 |  |--02:SCAN HDFS [functional.alltypestiny s]
 |  |     partitions=4/4 files=4 size=460B
 |  |
 |  01:SCAN HDFS [functional.alltypesagg a]
 |     partitions=11/11 files=11 size=814.73KB
-|     runtime filters: RF002 -> a.tinyint_col, RF003 -> a.bigint_col
+|     runtime filters: RF002 -> a.bigint_col, RF003 -> a.tinyint_col
 |
 00:SCAN HDFS [functional.alltypes t]
    partitions=24/24 files=24 size=478.45KB
@@ -477,15 +477,15 @@ where id in
 |  runtime filters: RF000 <- id
 |
 |--03:HASH JOIN [LEFT SEMI JOIN]
-|  |  hash predicates: a.int_col = int_col, a.bigint_col = s.bigint_col
-|  |  runtime filters: RF001 <- int_col, RF002 <- s.bigint_col
+|  |  hash predicates: a.bigint_col = s.bigint_col, a.int_col = int_col
+|  |  runtime filters: RF001 <- s.bigint_col, RF002 <- int_col
 |  |
 |  |--02:SCAN HDFS [functional.alltypestiny s]
 |  |     partitions=4/4 files=4 size=460B
 |  |
 |  01:SCAN HDFS [functional.alltypesagg a]
 |     partitions=11/11 files=11 size=814.73KB
-|     runtime filters: RF001 -> a.int_col, RF002 -> a.bigint_col
+|     runtime filters: RF001 -> a.bigint_col, RF002 -> a.int_col
 |
 00:SCAN HDFS [functional.alltypes t]
    partitions=24/24 files=24 size=478.45KB
@@ -517,8 +517,8 @@ where t.int_col < 10 and t.int_col in
   (select int_col from functional.alltypessmall s where s.id = t.id)
 ---- PLAN
 04:HASH JOIN [LEFT SEMI JOIN]
-|  hash predicates: t.int_col = int_col, t.id = s.id
-|  runtime filters: RF000 <- int_col, RF001 <- s.id
+|  hash predicates: t.id = s.id, t.int_col = int_col
+|  runtime filters: RF000 <- s.id, RF001 <- int_col
 |
 |--02:SCAN HDFS [functional.alltypessmall s]
 |     partitions=4/4 files=4 size=6.32KB
@@ -531,11 +531,11 @@ where t.int_col < 10 and t.int_col in
 |--01:SCAN HDFS [functional.alltypes t]
 |     partitions=24/24 files=24 size=478.45KB
 |     predicates: t.int_col < 10
-|     runtime filters: RF000 -> t.int_col, RF001 -> t.id
+|     runtime filters: RF000 -> t.id, RF001 -> t.int_col
 |
 00:SCAN HDFS [functional.alltypesagg a]
    partitions=11/11 files=11 size=814.73KB
-   runtime filters: RF001 -> a.id, RF002 -> a.id
+   runtime filters: RF000 -> a.id, RF002 -> a.id
 ====
 # Correlated EXISTS
 select count(*)
@@ -1852,12 +1852,12 @@ select 1 from functional.alltypes t where id in
 ---- PLAN
 02:HASH JOIN [LEFT SEMI JOIN]
 |  hash predicates: id = id
-|  other join predicates: t.float_col >= a.float_col, a.tinyint_col >= 
t.tinyint_col, t.float_col <= a.double_col, a.smallint_col <= t.int_col, 
a.tinyint_col <= t.smallint_col, a.double_col <= CAST(t.string_col AS INT), 
t.string_col >= a.string_col, a.double_col >= round(acos(t.float_col), 2)
+|  other join predicates: a.tinyint_col >= t.tinyint_col, t.float_col >= 
a.float_col, a.smallint_col <= t.int_col, a.tinyint_col <= t.smallint_col, 
t.float_col <= a.double_col, a.double_col <= CAST(t.string_col AS INT), 
t.string_col >= a.string_col, a.double_col >= round(acos(t.float_col), 2)
 |  runtime filters: RF000 <- id
 |
 |--01:SCAN HDFS [functional.alltypesagg a]
 |     partitions=11/11 files=11 size=814.73KB
-|     predicates: a.smallint_col >= 10, 20 <= a.int_col
+|     predicates: 20 <= a.int_col, a.smallint_col >= 10
 |
 00:SCAN HDFS [functional.alltypes t]
    partitions=24/24 files=24 size=478.45KB

Reply via email to