You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@impala.apache.org by ta...@apache.org on 2019/01/12 18:19:20 UTC

[21/26] impala git commit: IMPALA-8021: Add estimated cardinality to EXPLAIN output

http://git-wip-us.apache.org/repos/asf/impala/blob/a7ea86b7/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 c75c02d..266d528 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/inline-view-limit.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/inline-view-limit.test
@@ -6,6 +6,7 @@ PLAN-ROOT SINK
 00:SCAN HDFS [functional.alltypessmall]
    partitions=4/4 files=4 size=6.32KB
    predicates: functional.alltypessmall.id < 5
+   row-size=89B cardinality=10
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
@@ -14,6 +15,7 @@ PLAN-ROOT SINK
 00:SCAN HDFS [functional.alltypessmall]
    partitions=4/4 files=4 size=6.32KB
    predicates: functional.alltypessmall.id < 5
+   row-size=89B cardinality=10
 ====
 # predicate pushdown is prevented in presence of limit clause
 select * from (select * from functional.alltypessmall limit 10) a where id < 5 limit 5
@@ -23,16 +25,19 @@ PLAN-ROOT SINK
 01:SELECT
 |  predicates: functional.alltypessmall.id < 5
 |  limit: 5
+|  row-size=89B cardinality=1
 |
 00:SCAN HDFS [functional.alltypessmall]
    partitions=4/4 files=4 size=6.32KB
    limit: 10
+   row-size=89B cardinality=10
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 01:SELECT
 |  predicates: functional.alltypessmall.id < 5
 |  limit: 5
+|  row-size=89B cardinality=1
 |
 02:EXCHANGE [UNPARTITIONED]
 |  limit: 10
@@ -40,6 +45,7 @@ PLAN-ROOT SINK
 00:SCAN HDFS [functional.alltypessmall]
    partitions=4/4 files=4 size=6.32KB
    limit: 10
+   row-size=89B cardinality=10
 ====
 # predicate pushdown is prevented in presence of order by/limit clause;
 # top-n is distributed
@@ -52,18 +58,22 @@ PLAN-ROOT SINK
 02:SELECT
 |  predicates: id < 5
 |  limit: 5
+|  row-size=89B cardinality=1
 |
 01:TOP-N [LIMIT=10]
 |  order by: id ASC
+|  row-size=89B cardinality=10
 |
 00:SCAN HDFS [functional.alltypessmall]
    partitions=4/4 files=4 size=6.32KB
+   row-size=89B cardinality=100
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 02:SELECT
 |  predicates: id < 5
 |  limit: 5
+|  row-size=89B cardinality=1
 |
 03:MERGING-EXCHANGE [UNPARTITIONED]
 |  order by: id ASC
@@ -71,9 +81,11 @@ PLAN-ROOT SINK
 |
 01:TOP-N [LIMIT=10]
 |  order by: id ASC
+|  row-size=89B cardinality=10
 |
 00:SCAN HDFS [functional.alltypessmall]
    partitions=4/4 files=4 size=6.32KB
+   row-size=89B cardinality=100
 ====
 # top-n is not distributed because it depends on the output of the aggregation
 select *
@@ -90,21 +102,26 @@ PLAN-ROOT SINK
 |  hash predicates: functional.alltypes.id = id
 |  runtime filters: RF000 <- id
 |  limit: 5
+|  row-size=101B cardinality=1
 |
 |--03:TOP-N [LIMIT=5]
 |  |  order by: count(*) ASC
+|  |  row-size=12B cardinality=5
 |  |
 |  02:AGGREGATE [FINALIZE]
 |  |  output: count(*)
 |  |  group by: id
+|  |  row-size=12B cardinality=7.30K
 |  |
 |  01:SCAN HDFS [functional.alltypes]
 |     partitions=24/24 files=24 size=478.45KB
+|     row-size=4B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
    predicates: functional.alltypes.id < 5
    runtime filters: RF000 -> functional.alltypes.id
+   row-size=89B cardinality=730
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
@@ -115,6 +132,7 @@ PLAN-ROOT SINK
 |  hash predicates: functional.alltypes.id = id
 |  runtime filters: RF000 <- id
 |  limit: 5
+|  row-size=101B cardinality=1
 |
 |--08:EXCHANGE [BROADCAST]
 |  |
@@ -124,24 +142,29 @@ PLAN-ROOT SINK
 |  |
 |  03:TOP-N [LIMIT=5]
 |  |  order by: count(*) ASC
+|  |  row-size=12B cardinality=5
 |  |
 |  06:AGGREGATE [FINALIZE]
 |  |  output: count:merge(*)
 |  |  group by: id
+|  |  row-size=12B cardinality=7.30K
 |  |
 |  05:EXCHANGE [HASH(id)]
 |  |
 |  02:AGGREGATE [STREAMING]
 |  |  output: count(*)
 |  |  group by: id
+|  |  row-size=12B cardinality=7.30K
 |  |
 |  01:SCAN HDFS [functional.alltypes]
 |     partitions=24/24 files=24 size=478.45KB
+|     row-size=4B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
    predicates: functional.alltypes.id < 5
    runtime filters: RF000 -> functional.alltypes.id
+   row-size=89B cardinality=730
 ====
 # predicate pushdown is prevented in presence of limit clause; variant w/ join
 select *
@@ -156,24 +179,29 @@ PLAN-ROOT SINK
 03:SELECT
 |  predicates: a.id < 5
 |  limit: 5
+|  row-size=93B cardinality=1
 |
 02:HASH JOIN [INNER JOIN]
 |  hash predicates: a.id = functional.alltypessmall.id
 |  runtime filters: RF000 <- functional.alltypessmall.id
 |  limit: 10
+|  row-size=93B cardinality=10
 |
 |--01:SCAN HDFS [functional.alltypessmall]
 |     partitions=4/4 files=4 size=6.32KB
+|     row-size=4B cardinality=100
 |
 00:SCAN HDFS [functional.alltypessmall a]
    partitions=4/4 files=4 size=6.32KB
    runtime filters: RF000 -> a.id
+   row-size=89B cardinality=100
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 03:SELECT
 |  predicates: a.id < 5
 |  limit: 5
+|  row-size=93B cardinality=1
 |
 05:EXCHANGE [UNPARTITIONED]
 |  limit: 10
@@ -182,15 +210,18 @@ PLAN-ROOT SINK
 |  hash predicates: a.id = functional.alltypessmall.id
 |  runtime filters: RF000 <- functional.alltypessmall.id
 |  limit: 10
+|  row-size=93B cardinality=10
 |
 |--04:EXCHANGE [BROADCAST]
 |  |
 |  01:SCAN HDFS [functional.alltypessmall]
 |     partitions=4/4 files=4 size=6.32KB
+|     row-size=4B cardinality=100
 |
 00:SCAN HDFS [functional.alltypessmall a]
    partitions=4/4 files=4 size=6.32KB
    runtime filters: RF000 -> a.id
+   row-size=89B cardinality=100
 ====
 # predicate pushdown is prevented in presence of order by/limit clause
 select *
@@ -203,21 +234,26 @@ PLAN-ROOT SINK
 |
 02:TOP-N [LIMIT=5]
 |  order by: id ASC
+|  row-size=89B cardinality=1
 |
 01:SELECT
 |  predicates: functional.alltypessmall.id < 5
+|  row-size=89B cardinality=1
 |
 00:SCAN HDFS [functional.alltypessmall]
    partitions=4/4 files=4 size=6.32KB
    limit: 10
+   row-size=89B cardinality=10
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 02:TOP-N [LIMIT=5]
 |  order by: id ASC
+|  row-size=89B cardinality=1
 |
 01:SELECT
 |  predicates: functional.alltypessmall.id < 5
+|  row-size=89B cardinality=1
 |
 03:EXCHANGE [UNPARTITIONED]
 |  limit: 10
@@ -225,6 +261,7 @@ PLAN-ROOT SINK
 00:SCAN HDFS [functional.alltypessmall]
    partitions=4/4 files=4 size=6.32KB
    limit: 10
+   row-size=89B cardinality=10
 ====
 # predicate pushdown is prevented in presence of order by/limit clause; variant w/ join
 select *
@@ -241,29 +278,36 @@ PLAN-ROOT SINK
 |
 04:TOP-N [LIMIT=5]
 |  order by: id ASC
+|  row-size=89B cardinality=1
 |
 03:SELECT
 |  predicates: a.id < 5
+|  row-size=93B cardinality=1
 |
 02:HASH JOIN [INNER JOIN]
 |  hash predicates: a.id = functional.alltypessmall.id
 |  runtime filters: RF000 <- functional.alltypessmall.id
 |  limit: 10
+|  row-size=93B cardinality=10
 |
 |--01:SCAN HDFS [functional.alltypessmall]
 |     partitions=4/4 files=4 size=6.32KB
+|     row-size=4B cardinality=100
 |
 00:SCAN HDFS [functional.alltypessmall a]
    partitions=4/4 files=4 size=6.32KB
    runtime filters: RF000 -> a.id
+   row-size=89B cardinality=100
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 04:TOP-N [LIMIT=5]
 |  order by: id ASC
+|  row-size=89B cardinality=1
 |
 03:SELECT
 |  predicates: a.id < 5
+|  row-size=93B cardinality=1
 |
 06:EXCHANGE [UNPARTITIONED]
 |  limit: 10
@@ -272,15 +316,18 @@ PLAN-ROOT SINK
 |  hash predicates: a.id = functional.alltypessmall.id
 |  runtime filters: RF000 <- functional.alltypessmall.id
 |  limit: 10
+|  row-size=93B cardinality=10
 |
 |--05:EXCHANGE [BROADCAST]
 |  |
 |  01:SCAN HDFS [functional.alltypessmall]
 |     partitions=4/4 files=4 size=6.32KB
+|     row-size=4B cardinality=100
 |
 00:SCAN HDFS [functional.alltypessmall a]
    partitions=4/4 files=4 size=6.32KB
    runtime filters: RF000 -> a.id
+   row-size=89B cardinality=100
 ====
 # join against subquery with limit creates a merge fragment that applies the limit
 select *
@@ -292,14 +339,17 @@ PLAN-ROOT SINK
 02:HASH JOIN [INNER JOIN]
 |  hash predicates: functional.alltypes.id = id
 |  runtime filters: RF000 <- id
+|  row-size=93B cardinality=10
 |
 |--01:SCAN HDFS [functional.alltypessmall]
 |     partitions=4/4 files=4 size=6.32KB
 |     limit: 10
+|     row-size=4B cardinality=10
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
    runtime filters: RF000 -> functional.alltypes.id
+   row-size=89B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
@@ -308,6 +358,7 @@ PLAN-ROOT SINK
 02:HASH JOIN [INNER JOIN, BROADCAST]
 |  hash predicates: functional.alltypes.id = id
 |  runtime filters: RF000 <- id
+|  row-size=93B cardinality=10
 |
 |--04:EXCHANGE [BROADCAST]
 |  |
@@ -317,10 +368,12 @@ PLAN-ROOT SINK
 |  01:SCAN HDFS [functional.alltypessmall]
 |     partitions=4/4 files=4 size=6.32KB
 |     limit: 10
+|     row-size=4B cardinality=10
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
    runtime filters: RF000 -> functional.alltypes.id
+   row-size=89B cardinality=7.30K
 ====
 # join against subquery with limit creates a merge fragment that applies the limit;
 # topn is distributed
@@ -333,16 +386,20 @@ PLAN-ROOT SINK
 03:HASH JOIN [INNER JOIN]
 |  hash predicates: functional.alltypes.id = id
 |  runtime filters: RF000 <- id
+|  row-size=93B cardinality=10
 |
 |--02:TOP-N [LIMIT=10]
 |  |  order by: id ASC
+|  |  row-size=4B cardinality=10
 |  |
 |  01:SCAN HDFS [functional.alltypessmall]
 |     partitions=4/4 files=4 size=6.32KB
+|     row-size=4B cardinality=100
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
    runtime filters: RF000 -> functional.alltypes.id
+   row-size=89B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
@@ -351,6 +408,7 @@ PLAN-ROOT SINK
 03:HASH JOIN [INNER JOIN, BROADCAST]
 |  hash predicates: functional.alltypes.id = id
 |  runtime filters: RF000 <- id
+|  row-size=93B cardinality=10
 |
 |--05:EXCHANGE [BROADCAST]
 |  |
@@ -360,13 +418,16 @@ PLAN-ROOT SINK
 |  |
 |  02:TOP-N [LIMIT=10]
 |  |  order by: id ASC
+|  |  row-size=4B cardinality=10
 |  |
 |  01:SCAN HDFS [functional.alltypessmall]
 |     partitions=4/4 files=4 size=6.32KB
+|     row-size=4B cardinality=100
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
    runtime filters: RF000 -> functional.alltypes.id
+   row-size=89B cardinality=7.30K
 ====
 # join against subquery with limit;
 # predicate pushdown is prevented in presence of order by/limit clause; variant w/ join
@@ -384,27 +445,33 @@ PLAN-ROOT SINK
 |
 05:TOP-N [LIMIT=5]
 |  order by: id ASC
+|  row-size=93B cardinality=1
 |
 04:HASH JOIN [INNER JOIN]
 |  hash predicates: functional.alltypes.id = a.id
 |  runtime filters: RF000 <- a.id
+|  row-size=97B cardinality=1
 |
 |--03:HASH JOIN [INNER JOIN]
 |  |  hash predicates: a.id = functional.alltypestiny.id
 |  |  runtime filters: RF002 <- functional.alltypestiny.id
 |  |  limit: 10
+|  |  row-size=8B cardinality=9
 |  |
 |  |--02:SCAN HDFS [functional.alltypestiny]
 |  |     partitions=4/4 files=4 size=460B
+|  |     row-size=4B cardinality=8
 |  |
 |  01:SCAN HDFS [functional.alltypessmall a]
 |     partitions=4/4 files=4 size=6.32KB
 |     runtime filters: RF002 -> a.id
+|     row-size=4B cardinality=100
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
    predicates: functional.alltypes.id < 5
    runtime filters: RF000 -> functional.alltypes.id
+   row-size=89B cardinality=730
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
@@ -414,10 +481,12 @@ PLAN-ROOT SINK
 |
 05:TOP-N [LIMIT=5]
 |  order by: id ASC
+|  row-size=93B cardinality=1
 |
 04:HASH JOIN [INNER JOIN, BROADCAST]
 |  hash predicates: functional.alltypes.id = a.id
 |  runtime filters: RF000 <- a.id
+|  row-size=97B cardinality=1
 |
 |--08:EXCHANGE [BROADCAST]
 |  |
@@ -428,20 +497,24 @@ PLAN-ROOT SINK
 |  |  hash predicates: a.id = functional.alltypestiny.id
 |  |  runtime filters: RF002 <- functional.alltypestiny.id
 |  |  limit: 10
+|  |  row-size=8B cardinality=9
 |  |
 |  |--06:EXCHANGE [BROADCAST]
 |  |  |
 |  |  02:SCAN HDFS [functional.alltypestiny]
 |  |     partitions=4/4 files=4 size=460B
+|  |     row-size=4B cardinality=8
 |  |
 |  01:SCAN HDFS [functional.alltypessmall a]
 |     partitions=4/4 files=4 size=6.32KB
 |     runtime filters: RF002 -> a.id
+|     row-size=4B cardinality=100
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
    predicates: functional.alltypes.id < 5
    runtime filters: RF000 -> functional.alltypes.id
+   row-size=89B cardinality=730
 ====
 # join against subquery with order by/limit;
 # predicate pushdown is prevented in presence of order by/limit clause; variant w/ join
@@ -460,29 +533,36 @@ PLAN-ROOT SINK
 |
 06:TOP-N [LIMIT=5]
 |  order by: id ASC
+|  row-size=93B cardinality=1
 |
 05:HASH JOIN [INNER JOIN]
 |  hash predicates: functional.alltypes.id = id
 |  runtime filters: RF000 <- id
+|  row-size=97B cardinality=1
 |
 |--04:TOP-N [LIMIT=10]
 |  |  order by: int_col ASC
+|  |  row-size=8B cardinality=9
 |  |
 |  03:HASH JOIN [INNER JOIN]
 |  |  hash predicates: a.id = functional.alltypestiny.id
 |  |  runtime filters: RF002 <- functional.alltypestiny.id
+|  |  row-size=12B cardinality=9
 |  |
 |  |--02:SCAN HDFS [functional.alltypestiny]
 |  |     partitions=4/4 files=4 size=460B
+|  |     row-size=4B cardinality=8
 |  |
 |  01:SCAN HDFS [functional.alltypessmall a]
 |     partitions=4/4 files=4 size=6.32KB
 |     runtime filters: RF002 -> a.id
+|     row-size=8B cardinality=100
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
    predicates: functional.alltypes.id < 5
    runtime filters: RF000 -> functional.alltypes.id
+   row-size=89B cardinality=730
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
@@ -492,10 +572,12 @@ PLAN-ROOT SINK
 |
 06:TOP-N [LIMIT=5]
 |  order by: id ASC
+|  row-size=93B cardinality=1
 |
 05:HASH JOIN [INNER JOIN, BROADCAST]
 |  hash predicates: functional.alltypes.id = id
 |  runtime filters: RF000 <- id
+|  row-size=97B cardinality=1
 |
 |--09:EXCHANGE [BROADCAST]
 |  |
@@ -505,24 +587,29 @@ PLAN-ROOT SINK
 |  |
 |  04:TOP-N [LIMIT=10]
 |  |  order by: int_col ASC
+|  |  row-size=8B cardinality=9
 |  |
 |  03:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  hash predicates: a.id = functional.alltypestiny.id
 |  |  runtime filters: RF002 <- functional.alltypestiny.id
+|  |  row-size=12B cardinality=9
 |  |
 |  |--07:EXCHANGE [BROADCAST]
 |  |  |
 |  |  02:SCAN HDFS [functional.alltypestiny]
 |  |     partitions=4/4 files=4 size=460B
+|  |     row-size=4B cardinality=8
 |  |
 |  01:SCAN HDFS [functional.alltypessmall a]
 |     partitions=4/4 files=4 size=6.32KB
 |     runtime filters: RF002 -> a.id
+|     row-size=8B cardinality=100
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
    predicates: functional.alltypes.id < 5
    runtime filters: RF000 -> functional.alltypes.id
+   row-size=89B cardinality=730
 ====
 # Subquery containing limit and offset
 select x.id from (
@@ -534,17 +621,21 @@ PLAN-ROOT SINK
 |
 02:TOP-N [LIMIT=100 OFFSET=4]
 |  order by: id ASC
+|  row-size=4B cardinality=5
 |
 01:TOP-N [LIMIT=5 OFFSET=5]
 |  order by: id ASC
+|  row-size=4B cardinality=5
 |
 00:SCAN HDFS [functional.alltypesagg]
    partitions=11/11 files=11 size=814.73KB
+   row-size=4B cardinality=11.00K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 02:TOP-N [LIMIT=100 OFFSET=4]
 |  order by: id ASC
+|  row-size=4B cardinality=5
 |
 03:MERGING-EXCHANGE [UNPARTITIONED]
 |  offset: 5
@@ -553,9 +644,11 @@ PLAN-ROOT SINK
 |
 01:TOP-N [LIMIT=10]
 |  order by: id ASC
+|  row-size=4B cardinality=10
 |
 00:SCAN HDFS [functional.alltypesagg]
    partitions=11/11 files=11 size=814.73KB
+   row-size=4B cardinality=11.00K
 ====
 # Test value transfers for outer-joined inline views with a limit.
 # Value transfer a.id->b.id is illegal due to the limit in b.
@@ -572,15 +665,18 @@ PLAN-ROOT SINK
 02:HASH JOIN [LEFT OUTER JOIN]
 |  hash predicates: id = id
 |  other predicates: id > 20
+|  row-size=8B cardinality=730
 |
 |--01:SCAN HDFS [functional.alltypessmall]
 |     partitions=4/4 files=4 size=6.32KB
 |     predicates: id != 2
 |     limit: 10
+|     row-size=4B cardinality=10
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
    predicates: functional.alltypes.id > 10, id != 1
+   row-size=4B cardinality=730
 ====
 # Test value transfers for outer-joined inline views with a limit.
 # Value transfer a.id->b.id is legal.
@@ -598,19 +694,23 @@ PLAN-ROOT SINK
 |  hash predicates: id = id
 |  other predicates: id > 20
 |  runtime filters: RF000 <- id
+|  row-size=8B cardinality=1
 |
 |--01:SELECT
 |  |  predicates: id > 10
+|  |  row-size=4B cardinality=1
 |  |
 |  00:SCAN HDFS [functional.alltypes]
 |     partitions=24/24 files=24 size=478.45KB
 |     predicates: id != 1
 |     limit: 10
+|     row-size=4B cardinality=10
 |
 02:SCAN HDFS [functional.alltypessmall]
    partitions=4/4 files=4 size=6.32KB
    predicates: functional.alltypessmall.id != 1, functional.alltypessmall.id > 10, functional.alltypessmall.id > 20, id != 2
    runtime filters: RF000 -> id
+   row-size=4B cardinality=10
 ====
 # Test value transfers for outer-joined inline views with a limit.
 # Value transfer b.id->a.id is illegal due to the limit in a.
@@ -628,16 +728,19 @@ PLAN-ROOT SINK
 |  hash predicates: id = id
 |  other predicates: id > 10
 |  runtime filters: RF000 <- id
+|  row-size=8B cardinality=10
 |
 |--01:SCAN HDFS [functional.alltypessmall]
 |     partitions=4/4 files=4 size=6.32KB
 |     predicates: functional.alltypessmall.id > 20, id != 2
+|     row-size=4B cardinality=10
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
    predicates: id != 1
    runtime filters: RF000 -> id
    limit: 10
+   row-size=4B cardinality=10
 ====
 # Test value transfers for outer-joined inline views with a limit.
 # Value transfer b.id->a.id is legal.
@@ -655,19 +758,23 @@ PLAN-ROOT SINK
 |  hash predicates: id = id
 |  other predicates: id > 10
 |  runtime filters: RF000 <- id
+|  row-size=8B cardinality=1
 |
 |--02:SELECT
 |  |  predicates: id > 20
+|  |  row-size=4B cardinality=1
 |  |
 |  01:SCAN HDFS [functional.alltypessmall]
 |     partitions=4/4 files=4 size=6.32KB
 |     predicates: id != 2
 |     limit: 10
+|     row-size=4B cardinality=10
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
    predicates: functional.alltypes.id != 2, functional.alltypes.id > 10, functional.alltypes.id > 20, id != 1
    runtime filters: RF000 -> id
+   row-size=4B cardinality=730
 ====
 # IMPALA-3450: limits on select nodes are reflected in cardinality estimates. The test for
 # this is embedded in PlannerTestBase.java and is not visible in these plans, as they only
@@ -679,8 +786,10 @@ PLAN-ROOT SINK
 01:SELECT
 |  predicates: functional.alltypes.id < 10
 |  limit: 1
+|  row-size=89B cardinality=1
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
    limit: 100
+   row-size=89B cardinality=100
 ====

http://git-wip-us.apache.org/repos/asf/impala/blob/a7ea86b7/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 55660cb..aa47074 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/inline-view.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/inline-view.test
@@ -17,21 +17,28 @@ PLAN-ROOT SINK
 04:HASH JOIN [INNER JOIN]
 |  hash predicates: t2.int_col = int_col
 |  runtime filters: RF000 <- int_col
+|  row-size=101B cardinality=620
 |
 |--02:TOP-N [LIMIT=5]
 |  |  order by: count(*) DESC
+|  |  row-size=12B cardinality=1
 |  |
 |  01:AGGREGATE [FINALIZE]
 |  |  output: count(*)
 |  |  group by: int_col
 |  |  having: count(*) > 1
+|  |  row-size=12B cardinality=1
 |  |
 |  00:SCAN HDFS [functional.alltypessmall]
+|     partition predicates: month = 1
 |     partitions=1/4 files=1 size=1.57KB
+|     row-size=4B cardinality=25
 |
 03:SCAN HDFS [functional.alltypes t2]
+   partition predicates: month = 1
    partitions=2/24 files=2 size=40.32KB
    runtime filters: RF000 -> t2.int_col
+   row-size=89B cardinality=620
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
@@ -40,6 +47,7 @@ PLAN-ROOT SINK
 04:HASH JOIN [INNER JOIN, BROADCAST]
 |  hash predicates: t2.int_col = int_col
 |  runtime filters: RF000 <- int_col
+|  row-size=101B cardinality=620
 |
 |--08:EXCHANGE [BROADCAST]
 |  |
@@ -49,24 +57,31 @@ PLAN-ROOT SINK
 |  |
 |  02:TOP-N [LIMIT=5]
 |  |  order by: count(*) DESC
+|  |  row-size=12B cardinality=1
 |  |
 |  06:AGGREGATE [FINALIZE]
 |  |  output: count:merge(*)
 |  |  group by: int_col
 |  |  having: count(*) > 1
+|  |  row-size=12B cardinality=1
 |  |
 |  05:EXCHANGE [HASH(int_col)]
 |  |
 |  01:AGGREGATE [STREAMING]
 |  |  output: count(*)
 |  |  group by: int_col
+|  |  row-size=12B cardinality=10
 |  |
 |  00:SCAN HDFS [functional.alltypessmall]
+|     partition predicates: month = 1
 |     partitions=1/4 files=1 size=1.57KB
+|     row-size=4B cardinality=25
 |
 03:SCAN HDFS [functional.alltypes t2]
+   partition predicates: month = 1
    partitions=2/24 files=2 size=40.32KB
    runtime filters: RF000 -> t2.int_col
+   row-size=89B cardinality=620
 ====
 # simple full scan subquery
 select * from (select y x from (select id y from functional_hbase.alltypessmall) a) b
@@ -74,12 +89,14 @@ select * from (select y x from (select id y from functional_hbase.alltypessmall)
 PLAN-ROOT SINK
 |
 00:SCAN HBASE [functional_hbase.alltypessmall]
+   row-size=4B cardinality=50
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 01:EXCHANGE [UNPARTITIONED]
 |
 00:SCAN HBASE [functional_hbase.alltypessmall]
+   row-size=4B cardinality=50
 ====
 # subquery doing join
 select * from (select t2.*
@@ -91,14 +108,17 @@ PLAN-ROOT SINK
 02:HASH JOIN [INNER JOIN]
 |  hash predicates: t1.id = t2.id
 |  runtime filters: RF000 <- t2.id
+|  row-size=36B cardinality=0
 |
 |--01:SCAN HDFS [functional.testtbl t2]
 |     partitions=1/1 files=0 size=0B
+|     row-size=24B cardinality=0
 |
 00:SCAN HDFS [functional.testtbl t1]
    partitions=1/1 files=0 size=0B
    predicates: t1.zip = 94611
    runtime filters: RF000 -> t1.id
+   row-size=12B cardinality=0
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
@@ -107,16 +127,19 @@ PLAN-ROOT SINK
 02:HASH JOIN [INNER JOIN, BROADCAST]
 |  hash predicates: t1.id = t2.id
 |  runtime filters: RF000 <- t2.id
+|  row-size=36B cardinality=0
 |
 |--03:EXCHANGE [BROADCAST]
 |  |
 |  01:SCAN HDFS [functional.testtbl t2]
 |     partitions=1/1 files=0 size=0B
+|     row-size=24B cardinality=0
 |
 00:SCAN HDFS [functional.testtbl t1]
    partitions=1/1 files=0 size=0B
    predicates: t1.zip = 94611
    runtime filters: RF000 -> t1.id
+   row-size=12B cardinality=0
 ====
 # subquery doing join
 # multiple join predicates;
@@ -139,15 +162,20 @@ PLAN-ROOT SINK
 |  hash predicates: a.id = b.id, a.int_col = b.int_col
 |  other predicates: a.tinyint_col = 15, a.day >= 6, a.tinyint_col + b.tinyint_col < 15
 |  runtime filters: RF000 <- b.id, RF001 <- b.int_col
+|  row-size=117B cardinality=5
 |
 |--01:SCAN HDFS [functional.alltypessmall b]
+|     partition predicates: b.month > 2
 |     partitions=2/4 files=2 size=3.17KB
 |     predicates: b.string_col = '15'
+|     row-size=22B cardinality=5
 |
 00:SCAN HDFS [functional.alltypesagg a]
+   partition predicates: a.day >= 6
    partitions=5/11 files=5 size=372.38KB
    predicates: a.tinyint_col = 15
    runtime filters: RF000 -> a.id, RF001 -> a.int_col
+   row-size=95B cardinality=556
 ---- SCANRANGELOCATIONS
 NODE 0:
   HDFS SPLIT hdfs://localhost:20500/test-warehouse/alltypesagg/year=2010/month=1/day=10/100110.txt 0:76263
@@ -167,19 +195,24 @@ PLAN-ROOT SINK
 |  hash predicates: a.id = b.id, a.int_col = b.int_col
 |  other predicates: a.tinyint_col = 15, a.day >= 6, a.tinyint_col + b.tinyint_col < 15
 |  runtime filters: RF000 <- b.id, RF001 <- b.int_col
+|  row-size=117B cardinality=5
 |
 |--04:EXCHANGE [HASH(b.id,b.int_col)]
 |  |
 |  01:SCAN HDFS [functional.alltypessmall b]
+|     partition predicates: b.month > 2
 |     partitions=2/4 files=2 size=3.17KB
 |     predicates: b.string_col = '15'
+|     row-size=22B cardinality=5
 |
 03:EXCHANGE [HASH(a.id,a.int_col)]
 |
 00:SCAN HDFS [functional.alltypesagg a]
+   partition predicates: a.day >= 6
    partitions=5/11 files=5 size=372.38KB
    predicates: a.tinyint_col = 15
    runtime filters: RF000 -> a.id, RF001 -> a.int_col
+   row-size=95B cardinality=556
 ====
 # predicate pushdown
 select * from (select * from functional_hbase.alltypessmall) a where id < 5
@@ -188,6 +221,7 @@ PLAN-ROOT SINK
 |
 00:SCAN HBASE [functional_hbase.alltypessmall]
    predicates: functional_hbase.alltypessmall.id < 5
+   row-size=89B cardinality=5
 ====
 # subquery join
 # multiple join predicates;
@@ -212,15 +246,20 @@ PLAN-ROOT SINK
 |  hash predicates: id = id, int_col = int_col
 |  other predicates: tinyint_col = 15, day >= 6, tinyint_col + tinyint_col < 15
 |  runtime filters: RF000 <- id, RF001 <- int_col
+|  row-size=39B cardinality=2
 |
 |--01:SCAN HDFS [functional.alltypessmall]
+|     partition predicates: functional.alltypessmall.month > 2
 |     partitions=2/4 files=2 size=3.17KB
 |     predicates: functional.alltypessmall.string_col = '15', functional.alltypessmall.id + 15 = 27
+|     row-size=26B cardinality=2
 |
 00:SCAN HDFS [functional.alltypesagg]
+   partition predicates: functional.alltypesagg.day >= 6
    partitions=5/11 files=5 size=372.38KB
    predicates: functional.alltypesagg.tinyint_col = 15, functional.alltypesagg.id + 15 = 27
    runtime filters: RF000 -> id, RF001 -> int_col
+   row-size=13B cardinality=167
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
@@ -230,19 +269,24 @@ PLAN-ROOT SINK
 |  hash predicates: id = id, int_col = int_col
 |  other predicates: tinyint_col = 15, day >= 6, tinyint_col + tinyint_col < 15
 |  runtime filters: RF000 <- id, RF001 <- int_col
+|  row-size=39B cardinality=2
 |
 |--04:EXCHANGE [HASH(id,int_col)]
 |  |
 |  01:SCAN HDFS [functional.alltypessmall]
+|     partition predicates: functional.alltypessmall.month > 2
 |     partitions=2/4 files=2 size=3.17KB
 |     predicates: functional.alltypessmall.string_col = '15', functional.alltypessmall.id + 15 = 27
+|     row-size=26B cardinality=2
 |
 03:EXCHANGE [HASH(id,int_col)]
 |
 00:SCAN HDFS [functional.alltypesagg]
+   partition predicates: functional.alltypesagg.day >= 6
    partitions=5/11 files=5 size=372.38KB
    predicates: functional.alltypesagg.tinyint_col = 15, functional.alltypesagg.id + 15 = 27
    runtime filters: RF000 -> id, RF001 -> int_col
+   row-size=13B cardinality=167
 ====
 # subquery join
 # multiple join predicates;
@@ -268,15 +312,20 @@ PLAN-ROOT SINK
 |  hash predicates: id = id, int_col = int_col
 |  other predicates: tinyint_col = 15, tinyint_col + tinyint_col < 15
 |  runtime filters: RF000 <- id, RF001 <- int_col
+|  row-size=39B cardinality=5
 |
 |--01:SCAN HDFS [functional.alltypessmall]
+|     partition predicates: functional.alltypessmall.month > 2
 |     partitions=2/4 files=2 size=3.17KB
 |     predicates: functional.alltypessmall.string_col = '15'
+|     row-size=26B cardinality=5
 |
 00:SCAN HDFS [functional.alltypesagg]
+   partition predicates: functional.alltypesagg.day >= 6
    partitions=5/11 files=5 size=372.38KB
    predicates: functional.alltypesagg.tinyint_col = 15
    runtime filters: RF000 -> id, RF001 -> int_col
+   row-size=13B cardinality=556
 ---- SCANRANGELOCATIONS
 NODE 0:
   HDFS SPLIT hdfs://localhost:20500/test-warehouse/alltypesagg/year=2010/month=1/day=10/100110.txt 0:76263
@@ -296,19 +345,24 @@ PLAN-ROOT SINK
 |  hash predicates: id = id, int_col = int_col
 |  other predicates: tinyint_col = 15, tinyint_col + tinyint_col < 15
 |  runtime filters: RF000 <- id, RF001 <- int_col
+|  row-size=39B cardinality=5
 |
 |--04:EXCHANGE [HASH(id,int_col)]
 |  |
 |  01:SCAN HDFS [functional.alltypessmall]
+|     partition predicates: functional.alltypessmall.month > 2
 |     partitions=2/4 files=2 size=3.17KB
 |     predicates: functional.alltypessmall.string_col = '15'
+|     row-size=26B cardinality=5
 |
 03:EXCHANGE [HASH(id,int_col)]
 |
 00:SCAN HDFS [functional.alltypesagg]
+   partition predicates: functional.alltypesagg.day >= 6
    partitions=5/11 files=5 size=372.38KB
    predicates: functional.alltypesagg.tinyint_col = 15
    runtime filters: RF000 -> id, RF001 -> int_col
+   row-size=13B cardinality=556
 ====
 # complex join, having joined subquery on the rhs, and predicate
 # at multiple subquery level. This tests that both sides of a join
@@ -333,24 +387,30 @@ PLAN-ROOT SINK
 |  hash predicates: c.id = a.tinyint_col
 |  other predicates: a.int_col + b.float_col + CAST(c.string_col AS FLOAT) < 1000
 |  runtime filters: RF000 <- a.tinyint_col
+|  row-size=32B cardinality=11
 |
 |--03:HASH JOIN [INNER JOIN]
 |  |  hash predicates: a.smallint_col = b.id
 |  |  runtime filters: RF002 <- b.id
+|  |  row-size=15B cardinality=11
 |  |
 |  |--02:SCAN HDFS [functional.alltypessmall b]
 |  |     partitions=4/4 files=4 size=6.32KB
 |  |     predicates: b.float_col > 4.5
+|  |     row-size=8B cardinality=10
 |  |
 |  01:SCAN HDFS [functional.alltypesagg a]
+|     partition predicates: month = 1, a.day = 1
 |     partitions=1/11 files=1 size=73.39KB
 |     predicates: a.int_col > 899
 |     runtime filters: RF002 -> a.smallint_col
+|     row-size=7B cardinality=100
 |
 00:SCAN HDFS [functional.alltypessmall c]
    partitions=4/4 files=4 size=6.32KB
    predicates: c.string_col < '7'
    runtime filters: RF000 -> c.id
+   row-size=17B cardinality=10
 ---- SCANRANGELOCATIONS
 NODE 0:
   HDFS SPLIT hdfs://localhost:20500/test-warehouse/alltypessmall/year=2009/month=1/090101.txt 0:1610
@@ -373,18 +433,22 @@ PLAN-ROOT SINK
 |  hash predicates: c.id = a.tinyint_col
 |  other predicates: a.int_col + b.float_col + CAST(c.string_col AS FLOAT) < 1000
 |  runtime filters: RF000 <- a.tinyint_col
+|  row-size=32B cardinality=11
 |
 |--08:EXCHANGE [HASH(a.tinyint_col)]
 |  |
 |  03:HASH JOIN [INNER JOIN, PARTITIONED]
 |  |  hash predicates: b.id = a.smallint_col
 |  |  runtime filters: RF002 <- a.smallint_col
+|  |  row-size=15B cardinality=11
 |  |
 |  |--06:EXCHANGE [HASH(a.smallint_col)]
 |  |  |
 |  |  01:SCAN HDFS [functional.alltypesagg a]
+|  |     partition predicates: month = 1, a.day = 1
 |  |     partitions=1/11 files=1 size=73.39KB
 |  |     predicates: a.int_col > 899
+|  |     row-size=7B cardinality=100
 |  |
 |  05:EXCHANGE [HASH(b.id)]
 |  |
@@ -392,6 +456,7 @@ PLAN-ROOT SINK
 |     partitions=4/4 files=4 size=6.32KB
 |     predicates: b.float_col > 4.5
 |     runtime filters: RF002 -> b.id
+|     row-size=8B cardinality=10
 |
 07:EXCHANGE [HASH(c.id)]
 |
@@ -399,6 +464,7 @@ PLAN-ROOT SINK
    partitions=4/4 files=4 size=6.32KB
    predicates: c.string_col < '7'
    runtime filters: RF000 -> c.id
+   row-size=17B cardinality=10
 ====
 # with grouping
 select tinyint_col, count(*), min(tinyint_col), max(tinyint_col), sum(tinyint_col),
@@ -411,9 +477,11 @@ PLAN-ROOT SINK
 01:AGGREGATE [FINALIZE]
 |  output: count(*), min(functional.alltypesagg.tinyint_col), max(functional.alltypesagg.tinyint_col), sum(functional.alltypesagg.tinyint_col), avg(functional.alltypesagg.tinyint_col)
 |  group by: functional.alltypesagg.tinyint_col
+|  row-size=27B cardinality=9
 |
 00:SCAN HDFS [functional.alltypesagg]
    partitions=11/11 files=11 size=814.73KB
+   row-size=1B cardinality=11.00K
 ---- SCANRANGELOCATIONS
 NODE 0:
   HDFS SPLIT hdfs://localhost:20500/test-warehouse/alltypesagg/year=2010/month=1/day=1/100101.txt 0:75153
@@ -435,15 +503,18 @@ PLAN-ROOT SINK
 03:AGGREGATE [FINALIZE]
 |  output: count:merge(*), min:merge(tinyint_col), max:merge(tinyint_col), sum:merge(tinyint_col), avg:merge(tinyint_col)
 |  group by: tinyint_col
+|  row-size=27B cardinality=9
 |
 02:EXCHANGE [HASH(tinyint_col)]
 |
 01:AGGREGATE [STREAMING]
 |  output: count(*), min(functional.alltypesagg.tinyint_col), max(functional.alltypesagg.tinyint_col), sum(functional.alltypesagg.tinyint_col), avg(functional.alltypesagg.tinyint_col)
 |  group by: functional.alltypesagg.tinyint_col
+|  row-size=27B cardinality=9
 |
 00:SCAN HDFS [functional.alltypesagg]
    partitions=11/11 files=11 size=814.73KB
+   row-size=1B cardinality=11.00K
 ====
 # with grouping
 select * from (
@@ -458,9 +529,11 @@ PLAN-ROOT SINK
 01:AGGREGATE [FINALIZE]
 |  output: count(*), min(tinyint_col), max(tinyint_col), sum(tinyint_col), avg(tinyint_col)
 |  group by: tinyint_col
+|  row-size=27B cardinality=9
 |
 00:SCAN HDFS [functional.alltypesagg]
    partitions=11/11 files=11 size=814.73KB
+   row-size=1B cardinality=11.00K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
@@ -469,15 +542,18 @@ PLAN-ROOT SINK
 03:AGGREGATE [FINALIZE]
 |  output: count:merge(*), min:merge(tinyint_col), max:merge(tinyint_col), sum:merge(tinyint_col), avg:merge(tinyint_col)
 |  group by: tinyint_col
+|  row-size=27B cardinality=9
 |
 02:EXCHANGE [HASH(tinyint_col)]
 |
 01:AGGREGATE [STREAMING]
 |  output: count(*), min(tinyint_col), max(tinyint_col), sum(tinyint_col), avg(tinyint_col)
 |  group by: tinyint_col
+|  row-size=27B cardinality=9
 |
 00:SCAN HDFS [functional.alltypesagg]
    partitions=11/11 files=11 size=814.73KB
+   row-size=1B cardinality=11.00K
 ====
 select c1, c2, c3
 from
@@ -494,12 +570,15 @@ PLAN-ROOT SINK
 |
 02:TOP-N [LIMIT=5]
 |  order by: c2 ASC, c3 DESC
+|  row-size=16B cardinality=5
 |
 01:AGGREGATE [FINALIZE]
 |  output: sum(float_col), min(float_col)
 |  group by: int_col
+|  row-size=16B cardinality=10
 |
 00:SCAN HBASE [functional_hbase.alltypessmall]
+   row-size=8B cardinality=50
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
@@ -509,18 +588,22 @@ PLAN-ROOT SINK
 |
 02:TOP-N [LIMIT=5]
 |  order by: c2 ASC, c3 DESC
+|  row-size=16B cardinality=5
 |
 04:AGGREGATE [FINALIZE]
 |  output: sum:merge(float_col), min:merge(float_col)
 |  group by: int_col
+|  row-size=16B cardinality=10
 |
 03:EXCHANGE [HASH(int_col)]
 |
 01:AGGREGATE [STREAMING]
 |  output: sum(float_col), min(float_col)
 |  group by: int_col
+|  row-size=16B cardinality=10
 |
 00:SCAN HBASE [functional_hbase.alltypessmall]
+   row-size=8B cardinality=50
 ====
 select c1, x2
 from (
@@ -556,12 +639,15 @@ PLAN-ROOT SINK
 |
 02:AGGREGATE [FINALIZE]
 |  group by: functional.testtbl.id, functional.testtbl.name, functional.testtbl.zip
+|  row-size=24B cardinality=0
 |
 01:AGGREGATE [FINALIZE]
 |  group by: functional.testtbl.id, functional.testtbl.name, functional.testtbl.zip
+|  row-size=24B cardinality=0
 |
 00:SCAN HDFS [functional.testtbl]
    partitions=1/1 files=0 size=0B
+   row-size=24B cardinality=0
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
@@ -569,17 +655,21 @@ PLAN-ROOT SINK
 |
 02:AGGREGATE [FINALIZE]
 |  group by: functional.testtbl.id, functional.testtbl.name, functional.testtbl.zip
+|  row-size=24B cardinality=0
 |
 04:AGGREGATE [FINALIZE]
 |  group by: functional.testtbl.id, functional.testtbl.name, functional.testtbl.zip
+|  row-size=24B cardinality=0
 |
 03:EXCHANGE [HASH(functional.testtbl.id,functional.testtbl.name,functional.testtbl.zip)]
 |
 01:AGGREGATE [STREAMING]
 |  group by: functional.testtbl.id, functional.testtbl.name, functional.testtbl.zip
+|  row-size=24B cardinality=0
 |
 00:SCAN HDFS [functional.testtbl]
    partitions=1/1 files=0 size=0B
+   row-size=24B cardinality=0
 ====
 # distinct w/ explicit select list
 select distinct id, zip
@@ -589,12 +679,15 @@ PLAN-ROOT SINK
 |
 02:AGGREGATE [FINALIZE]
 |  group by: functional.testtbl.id, functional.testtbl.zip
+|  row-size=12B cardinality=0
 |
 01:AGGREGATE [FINALIZE]
 |  group by: functional.testtbl.id, functional.testtbl.name, functional.testtbl.zip
+|  row-size=24B cardinality=0
 |
 00:SCAN HDFS [functional.testtbl]
    partitions=1/1 files=0 size=0B
+   row-size=24B cardinality=0
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
@@ -602,22 +695,27 @@ PLAN-ROOT SINK
 |
 06:AGGREGATE [FINALIZE]
 |  group by: id, zip
+|  row-size=12B cardinality=0
 |
 05:EXCHANGE [HASH(id,zip)]
 |
 02:AGGREGATE [STREAMING]
 |  group by: functional.testtbl.id, functional.testtbl.zip
+|  row-size=12B cardinality=0
 |
 04:AGGREGATE [FINALIZE]
 |  group by: functional.testtbl.id, functional.testtbl.name, functional.testtbl.zip
+|  row-size=24B cardinality=0
 |
 03:EXCHANGE [HASH(functional.testtbl.id,functional.testtbl.name,functional.testtbl.zip)]
 |
 01:AGGREGATE [STREAMING]
 |  group by: functional.testtbl.id, functional.testtbl.name, functional.testtbl.zip
+|  row-size=24B cardinality=0
 |
 00:SCAN HDFS [functional.testtbl]
    partitions=1/1 files=0 size=0B
+   row-size=24B cardinality=0
 ====
 # aggregate with group-by, having
 select *
@@ -638,9 +736,11 @@ PLAN-ROOT SINK
 |  output: count(*), avg(functional.alltypesagg.int_col)
 |  group by: functional.alltypesagg.int_col % 7
 |  having: int_col % 7 IS NOT NULL, count(*) > 10, avg(int_col) > 500 OR count(*) = 10
+|  row-size=20B cardinality=96
 |
 00:SCAN HDFS [functional.alltypesagg]
    partitions=11/11 files=11 size=814.73KB
+   row-size=4B cardinality=11.00K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
@@ -650,15 +750,18 @@ PLAN-ROOT SINK
 |  output: count:merge(*), avg:merge(int_col)
 |  group by: int_col % 7
 |  having: int_col % 7 IS NOT NULL, count(*) > 10, avg(int_col) > 500 OR count(*) = 10
+|  row-size=20B cardinality=96
 |
 02:EXCHANGE [HASH(int_col % 7)]
 |
 01:AGGREGATE [STREAMING]
 |  output: count(*), avg(functional.alltypesagg.int_col)
 |  group by: functional.alltypesagg.int_col % 7
+|  row-size=20B cardinality=957
 |
 00:SCAN HDFS [functional.alltypesagg]
    partitions=11/11 files=11 size=814.73KB
+   row-size=4B cardinality=11.00K
 ====
 # subquery with left outer join
 select j.*, d.*
@@ -679,14 +782,17 @@ PLAN-ROOT SINK
 02:HASH JOIN [RIGHT OUTER JOIN]
 |  hash predicates: b.name = a.test_name
 |  runtime filters: RF000 <- a.test_name
+|  row-size=63B cardinality=2
 |
 |--00:SCAN HDFS [functional.jointbl a]
 |     partitions=1/1 files=1 size=433B
 |     predicates: a.test_id <= 1006
+|     row-size=33B cardinality=2
 |
 01:SCAN HDFS [functional.dimtbl b]
    partitions=1/1 files=1 size=171B
    runtime filters: RF000 -> b.name
+   row-size=29B cardinality=10
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
@@ -695,18 +801,21 @@ PLAN-ROOT SINK
 02:HASH JOIN [RIGHT OUTER JOIN, PARTITIONED]
 |  hash predicates: b.name = a.test_name
 |  runtime filters: RF000 <- a.test_name
+|  row-size=63B cardinality=2
 |
 |--04:EXCHANGE [HASH(a.test_name)]
 |  |
 |  00:SCAN HDFS [functional.jointbl a]
 |     partitions=1/1 files=1 size=433B
 |     predicates: a.test_id <= 1006
+|     row-size=33B cardinality=2
 |
 03:EXCHANGE [HASH(b.name)]
 |
 01:SCAN HDFS [functional.dimtbl b]
    partitions=1/1 files=1 size=171B
    runtime filters: RF000 -> b.name
+   row-size=29B cardinality=10
 ====
 # complex join, having joined subquery on the rhs, and predicate
 # at multiple subquery level
@@ -732,24 +841,30 @@ PLAN-ROOT SINK
 05:AGGREGATE [FINALIZE]
 |  output: count(b.id)
 |  group by: a.smallint_col
+|  row-size=10B cardinality=97
 |
 04:HASH JOIN [RIGHT OUTER JOIN]
 |  hash predicates: a.tinyint_col = c.id
 |  runtime filters: RF000 <- c.id
+|  row-size=11B cardinality=11.11K
 |
 |--00:SCAN HDFS [functional.alltypessmall c]
 |     partitions=4/4 files=4 size=6.32KB
+|     row-size=4B cardinality=100
 |
 03:HASH JOIN [INNER JOIN]
 |  hash predicates: a.smallint_col = b.id
 |  runtime filters: RF002 <- b.id
+|  row-size=7B cardinality=11.00K
 |
 |--02:SCAN HDFS [functional.alltypessmall b]
 |     partitions=4/4 files=4 size=6.32KB
+|     row-size=4B cardinality=100
 |
 01:SCAN HDFS [functional.alltypesagg a]
    partitions=11/11 files=11 size=814.73KB
    runtime filters: RF000 -> a.tinyint_col, RF002 -> a.smallint_col
+   row-size=3B cardinality=11.00K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
@@ -758,36 +873,43 @@ PLAN-ROOT SINK
 10:AGGREGATE [FINALIZE]
 |  output: count:merge(x.id)
 |  group by: x.smallint_col
+|  row-size=10B cardinality=97
 |
 09:EXCHANGE [HASH(x.smallint_col)]
 |
 05:AGGREGATE [STREAMING]
 |  output: count(b.id)
 |  group by: a.smallint_col
+|  row-size=10B cardinality=97
 |
 04:HASH JOIN [RIGHT OUTER JOIN, PARTITIONED]
 |  hash predicates: a.tinyint_col = c.id
 |  runtime filters: RF000 <- c.id
+|  row-size=11B cardinality=11.11K
 |
 |--08:EXCHANGE [HASH(c.id)]
 |  |
 |  00:SCAN HDFS [functional.alltypessmall c]
 |     partitions=4/4 files=4 size=6.32KB
+|     row-size=4B cardinality=100
 |
 07:EXCHANGE [HASH(a.tinyint_col)]
 |
 03:HASH JOIN [INNER JOIN, BROADCAST]
 |  hash predicates: a.smallint_col = b.id
 |  runtime filters: RF002 <- b.id
+|  row-size=7B cardinality=11.00K
 |
 |--06:EXCHANGE [BROADCAST]
 |  |
 |  02:SCAN HDFS [functional.alltypessmall b]
 |     partitions=4/4 files=4 size=6.32KB
+|     row-size=4B cardinality=100
 |
 01:SCAN HDFS [functional.alltypesagg a]
    partitions=11/11 files=11 size=814.73KB
    runtime filters: RF000 -> a.tinyint_col, RF002 -> a.smallint_col
+   row-size=3B cardinality=11.00K
 ====
 # complex join, having joined subquery on the lhs, and predicate
 # at multiple subquery level
@@ -820,24 +942,30 @@ PLAN-ROOT SINK
 |  hash predicates: c.id = a.tinyint_col
 |  other predicates: a.int_col + b.float_col + CAST(c.string_col AS FLOAT) < 1000
 |  runtime filters: RF000 <- a.tinyint_col
+|  row-size=32B cardinality=11
 |
 |--02:HASH JOIN [INNER JOIN]
 |  |  hash predicates: a.smallint_col = b.id
 |  |  runtime filters: RF002 <- b.id
+|  |  row-size=15B cardinality=11
 |  |
 |  |--01:SCAN HDFS [functional.alltypessmall b]
 |  |     partitions=4/4 files=4 size=6.32KB
 |  |     predicates: b.float_col > 4.5
+|  |     row-size=8B cardinality=10
 |  |
 |  00:SCAN HDFS [functional.alltypesagg a]
+|     partition predicates: month = 1, a.day = 1
 |     partitions=1/11 files=1 size=73.39KB
 |     predicates: a.int_col > 899
 |     runtime filters: RF002 -> a.smallint_col
+|     row-size=7B cardinality=100
 |
 03:SCAN HDFS [functional.alltypessmall c]
    partitions=4/4 files=4 size=6.32KB
    predicates: c.string_col < '7'
    runtime filters: RF000 -> c.id
+   row-size=17B cardinality=10
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
@@ -847,18 +975,22 @@ PLAN-ROOT SINK
 |  hash predicates: c.id = a.tinyint_col
 |  other predicates: a.int_col + b.float_col + CAST(c.string_col AS FLOAT) < 1000
 |  runtime filters: RF000 <- a.tinyint_col
+|  row-size=32B cardinality=11
 |
 |--08:EXCHANGE [HASH(a.tinyint_col)]
 |  |
 |  02:HASH JOIN [INNER JOIN, PARTITIONED]
 |  |  hash predicates: b.id = a.smallint_col
 |  |  runtime filters: RF002 <- a.smallint_col
+|  |  row-size=15B cardinality=11
 |  |
 |  |--06:EXCHANGE [HASH(a.smallint_col)]
 |  |  |
 |  |  00:SCAN HDFS [functional.alltypesagg a]
+|  |     partition predicates: month = 1, a.day = 1
 |  |     partitions=1/11 files=1 size=73.39KB
 |  |     predicates: a.int_col > 899
+|  |     row-size=7B cardinality=100
 |  |
 |  05:EXCHANGE [HASH(b.id)]
 |  |
@@ -866,6 +998,7 @@ PLAN-ROOT SINK
 |     partitions=4/4 files=4 size=6.32KB
 |     predicates: b.float_col > 4.5
 |     runtime filters: RF002 -> b.id
+|     row-size=8B cardinality=10
 |
 07:EXCHANGE [HASH(c.id)]
 |
@@ -873,6 +1006,7 @@ PLAN-ROOT SINK
    partitions=4/4 files=4 size=6.32KB
    predicates: c.string_col < '7'
    runtime filters: RF000 -> c.id
+   row-size=17B cardinality=10
 ====
 # complex join, having joined aggregate subquery on the rhs, and predicate
 # at multiple subquery level
@@ -891,29 +1025,36 @@ PLAN-ROOT SINK
 06:AGGREGATE [FINALIZE]
 |  output: sum(count(a.id))
 |  group by: b.smallint_col
+|  row-size=10B cardinality=10
 |
 05:HASH JOIN [INNER JOIN]
 |  hash predicates: c.id = b.smallint_col
 |  runtime filters: RF000 <- b.smallint_col
+|  row-size=14B cardinality=10
 |
 |--04:AGGREGATE [FINALIZE]
 |  |  output: count(a.id)
 |  |  group by: b.smallint_col
+|  |  row-size=10B cardinality=10
 |  |
 |  03:HASH JOIN [INNER JOIN]
 |  |  hash predicates: a.smallint_col = b.id
 |  |  runtime filters: RF002 <- b.id
+|  |  row-size=12B cardinality=11.00K
 |  |
 |  |--02:SCAN HDFS [functional.alltypessmall b]
 |  |     partitions=4/4 files=4 size=6.32KB
+|  |     row-size=6B cardinality=100
 |  |
 |  01:SCAN HDFS [functional.alltypesagg a]
 |     partitions=11/11 files=11 size=814.73KB
 |     runtime filters: RF002 -> a.smallint_col
+|     row-size=6B cardinality=11.00K
 |
 00:SCAN HDFS [functional.alltypessmall c]
    partitions=4/4 files=4 size=6.32KB
    runtime filters: RF000 -> c.id
+   row-size=4B cardinality=100
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
@@ -922,45 +1063,54 @@ PLAN-ROOT SINK
 12:AGGREGATE [FINALIZE]
 |  output: sum:merge(x.cnt)
 |  group by: x.smallint_col
+|  row-size=10B cardinality=10
 |
 11:EXCHANGE [HASH(x.smallint_col)]
 |
 06:AGGREGATE [STREAMING]
 |  output: sum(count(a.id))
 |  group by: b.smallint_col
+|  row-size=10B cardinality=10
 |
 05:HASH JOIN [INNER JOIN, BROADCAST]
 |  hash predicates: c.id = b.smallint_col
 |  runtime filters: RF000 <- b.smallint_col
+|  row-size=14B cardinality=10
 |
 |--10:EXCHANGE [BROADCAST]
 |  |
 |  09:AGGREGATE [FINALIZE]
 |  |  output: count:merge(a.id)
 |  |  group by: b.smallint_col
+|  |  row-size=10B cardinality=10
 |  |
 |  08:EXCHANGE [HASH(b.smallint_col)]
 |  |
 |  04:AGGREGATE [STREAMING]
 |  |  output: count(a.id)
 |  |  group by: b.smallint_col
+|  |  row-size=10B cardinality=10
 |  |
 |  03:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  hash predicates: a.smallint_col = b.id
 |  |  runtime filters: RF002 <- b.id
+|  |  row-size=12B cardinality=11.00K
 |  |
 |  |--07:EXCHANGE [BROADCAST]
 |  |  |
 |  |  02:SCAN HDFS [functional.alltypessmall b]
 |  |     partitions=4/4 files=4 size=6.32KB
+|  |     row-size=6B cardinality=100
 |  |
 |  01:SCAN HDFS [functional.alltypesagg a]
 |     partitions=11/11 files=11 size=814.73KB
 |     runtime filters: RF002 -> a.smallint_col
+|     row-size=6B cardinality=11.00K
 |
 00:SCAN HDFS [functional.alltypessmall c]
    partitions=4/4 files=4 size=6.32KB
    runtime filters: RF000 -> c.id
+   row-size=4B cardinality=100
 ====
 # Values statement in subqueries with predicate
 select * from (select y from (values((1 as y),(11))) a where y < 10) b
@@ -969,11 +1119,13 @@ PLAN-ROOT SINK
 |
 00:UNION
    constant-operands=1
+   row-size=1B cardinality=1
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 00:UNION
    constant-operands=1
+   row-size=1B cardinality=1
 ====
 # Mixed constant and non-constant select; the predicate is evaluated directly
 # by the non-const select
@@ -989,10 +1141,12 @@ PLAN-ROOT SINK
 00:UNION
 |  constant-operands=1
 |  pass-through-operands: all
+|  row-size=1B cardinality=731
 |
 01:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
    predicates: functional.alltypes.tinyint_col < 10
+   row-size=1B cardinality=730
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
@@ -1001,10 +1155,12 @@ PLAN-ROOT SINK
 00:UNION
 |  constant-operands=1
 |  pass-through-operands: all
+|  row-size=1B cardinality=731
 |
 01:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
    predicates: functional.alltypes.tinyint_col < 10
+   row-size=1B cardinality=730
 ====
 # Union of constant selects in subquery
 select * from (select 1 as y union all select 2 union all select * from (select 11) a) b
@@ -1014,11 +1170,13 @@ PLAN-ROOT SINK
 |
 00:UNION
    constant-operands=2
+   row-size=1B cardinality=2
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 00:UNION
    constant-operands=2
+   row-size=1B cardinality=2
 ====
 # Union of values statements in subquery
 # TODO: We could combine the merge nodes below.
@@ -1029,15 +1187,19 @@ PLAN-ROOT SINK
 |
 00:UNION
 |  constant-operands=2
+|  row-size=1B cardinality=2
 |
 01:UNION
+   row-size=1B cardinality=0
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 00:UNION
 |  constant-operands=2
+|  row-size=1B cardinality=2
 |
 01:UNION
+   row-size=1B cardinality=0
 ====
 # Inner join on inline views made up of unions of constant selects
 select * from
@@ -1051,39 +1213,49 @@ PLAN-ROOT SINK
 |
 04:HASH JOIN [INNER JOIN]
 |  hash predicates: b = b
+|  row-size=6B cardinality=2
 |
 |--02:UNION
 |     constant-operands=2
+|     row-size=2B cardinality=2
 |
 03:HASH JOIN [INNER JOIN]
 |  hash predicates: a = a
+|  row-size=4B cardinality=2
 |
 |--01:UNION
 |     constant-operands=2
+|     row-size=2B cardinality=2
 |
 00:UNION
    constant-operands=2
+   row-size=2B cardinality=2
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 04:HASH JOIN [INNER JOIN, BROADCAST]
 |  hash predicates: b = b
+|  row-size=6B cardinality=2
 |
 |--06:EXCHANGE [UNPARTITIONED]
 |  |
 |  02:UNION
 |     constant-operands=2
+|     row-size=2B cardinality=2
 |
 03:HASH JOIN [INNER JOIN, BROADCAST]
 |  hash predicates: a = a
+|  row-size=4B cardinality=2
 |
 |--05:EXCHANGE [UNPARTITIONED]
 |  |
 |  01:UNION
 |     constant-operands=2
+|     row-size=2B cardinality=2
 |
 00:UNION
    constant-operands=2
+   row-size=2B cardinality=2
 ====
 # Semi and inner join on a table and on inline views made up of constant selects
 select * from functional.alltypessmall x
@@ -1097,20 +1269,25 @@ PLAN-ROOT SINK
 04:HASH JOIN [INNER JOIN]
 |  hash predicates: x.id + 2 = b
 |  runtime filters: RF000 <- b
+|  row-size=91B cardinality=2
 |
 |--02:UNION
 |     constant-operands=2
+|     row-size=2B cardinality=2
 |
 03:HASH JOIN [LEFT SEMI JOIN]
 |  hash predicates: x.id = a
 |  runtime filters: RF002 <- a
+|  row-size=89B cardinality=2
 |
 |--01:UNION
 |     constant-operands=2
+|     row-size=1B cardinality=2
 |
 00:SCAN HDFS [functional.alltypessmall x]
    partitions=4/4 files=4 size=6.32KB
    runtime filters: RF000 -> x.id + 2, RF002 -> x.id
+   row-size=89B cardinality=100
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
@@ -1119,24 +1296,29 @@ PLAN-ROOT SINK
 04:HASH JOIN [INNER JOIN, BROADCAST]
 |  hash predicates: x.id + 2 = b
 |  runtime filters: RF000 <- b
+|  row-size=91B cardinality=2
 |
 |--06:EXCHANGE [BROADCAST]
 |  |
 |  02:UNION
 |     constant-operands=2
+|     row-size=2B cardinality=2
 |
 03:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
 |  hash predicates: x.id = a
 |  runtime filters: RF002 <- a
+|  row-size=89B cardinality=2
 |
 |--05:EXCHANGE [BROADCAST]
 |  |
 |  01:UNION
 |     constant-operands=2
+|     row-size=1B cardinality=2
 |
 00:SCAN HDFS [functional.alltypessmall x]
    partitions=4/4 files=4 size=6.32KB
    runtime filters: RF000 -> x.id + 2, RF002 -> x.id
+   row-size=89B cardinality=100
 ====
 # Tests that views correctly reanalyze cloned exprs. (IMPALA-984)
 select b.* from functional.decimal_tbl a left outer join
@@ -1147,12 +1329,15 @@ PLAN-ROOT SINK
 |
 02:HASH JOIN [LEFT OUTER JOIN]
 |  hash predicates: a.d1 = d1
+|  row-size=8B cardinality=unavailable
 |
 |--01:SCAN HDFS [functional.decimal_tbl]
 |     partitions=1/1 files=1 size=195B
+|     row-size=4B cardinality=unavailable
 |
 00:SCAN HDFS [functional.decimal_tbl a]
    partitions=1/1 files=1 size=195B
+   row-size=4B cardinality=unavailable
 ====
 # Test predicate assignment through inline view when the query contains
 # group by and distinct (IMPALA-1165)
@@ -1168,13 +1353,16 @@ PLAN-ROOT SINK
 |  output: sum(foo)
 |  group by: foo
 |  limit: 10
+|  row-size=16B cardinality=10
 |
 01:AGGREGATE
 |  group by: int_col + int_col, int_col + int_col
+|  row-size=16B cardinality=11
 |
 00:SCAN HDFS [functional.alltypesagg]
    partitions=11/11 files=11 size=814.73KB
    predicates: int_col + int_col = 10
+   row-size=4B cardinality=11
 ====
 # Test enforcement of inline-view slot equivalences when the inline-view
 # contains an outer join (IMPALA-1441)
@@ -1188,13 +1376,16 @@ PLAN-ROOT SINK
 02:HASH JOIN [RIGHT OUTER JOIN]
 |  hash predicates: t2.int_col = t1.int_col, t2.tinyint_col = t1.tinyint_col
 |  runtime filters: RF000 <- t1.int_col, RF001 <- t1.tinyint_col
+|  row-size=10B cardinality=5.84K
 |
 |--00:SCAN HDFS [functional.alltypestiny t1]
 |     partitions=4/4 files=4 size=460B
+|     row-size=5B cardinality=8
 |
 01:SCAN HDFS [functional.alltypes t2]
    partitions=24/24 files=24 size=478.45KB
    runtime filters: RF000 -> t2.int_col, RF001 -> t2.tinyint_col
+   row-size=5B cardinality=7.30K
 ====
 # IMPALA-1459: Test correct assignment of On-clause predicate from an enclosing block
 # inside an inline view with an outer join.
@@ -1211,28 +1402,35 @@ PLAN-ROOT SINK
 06:HASH JOIN [INNER JOIN]
 |  hash predicates: a.id = c.id
 |  runtime filters: RF000 <- c.id
+|  row-size=16B cardinality=9
 |
 |--05:SCAN HDFS [functional.alltypestiny c]
 |     partitions=4/4 files=4 size=460B
+|     row-size=4B cardinality=8
 |
 04:HASH JOIN [FULL OUTER JOIN]
 |  hash predicates: a.id = c.id
 |  other predicates: a.id < b.id, a.id = b.id
+|  row-size=12B cardinality=7.40K
 |
 |--02:SCAN HDFS [functional.alltypessmall c]
 |     partitions=4/4 files=4 size=6.32KB
+|     row-size=4B cardinality=100
 |
 03:HASH JOIN [INNER JOIN]
 |  hash predicates: a.id = b.id
 |  runtime filters: RF002 <- b.id
+|  row-size=8B cardinality=7.30K
 |
 |--01:SCAN HDFS [functional.alltypes b]
 |     partitions=24/24 files=24 size=478.45KB
 |     runtime filters: RF000 -> b.id
+|     row-size=4B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes a]
    partitions=24/24 files=24 size=478.45KB
    runtime filters: RF000 -> a.id, RF002 -> a.id
+   row-size=4B cardinality=7.30K
 ====
 # IMPALA-2665: Test correct assignment of On-clause predicate from an enclosing block
 # inside an inline view with an outer join.
@@ -1248,24 +1446,29 @@ PLAN-ROOT SINK
 04:HASH JOIN [INNER JOIN]
 |  hash predicates: a.id = t1.id
 |  runtime filters: RF000 <- t1.id
+|  row-size=12B cardinality=73
 |
 |--00:SCAN HDFS [functional.alltypes t1]
 |     partitions=24/24 files=24 size=478.45KB
 |     predicates: t1.id < 10
+|     row-size=4B cardinality=730
 |
 03:HASH JOIN [LEFT OUTER JOIN]
 |  hash predicates: a.id = b.int_col
 |  other predicates: b.int_col IS NULL, b.int_col < 10
+|  row-size=8B cardinality=730
 |
 |--02:SCAN HDFS [functional.alltypes b]
 |     partitions=24/24 files=24 size=478.45KB
 |     predicates: b.int_col < 10
 |     runtime filters: RF000 -> b.int_col
+|     row-size=4B cardinality=730
 |
 01:SCAN HDFS [functional.alltypes a]
    partitions=24/24 files=24 size=478.45KB
    predicates: a.id < 10
    runtime filters: RF000 -> a.id
+   row-size=4B cardinality=730
 ====
 # IMPALA-2643: Test inline views with duplicate exprs in their select list.
 # Inferred predicate referencing the same expr gets filtered out.
@@ -1279,6 +1482,7 @@ PLAN-ROOT SINK
 |
 00:SCAN HDFS [functional.alltypestiny]
    partitions=4/4 files=4 size=460B
+   row-size=8B cardinality=8
 ====
 # IMPALA-2643: Explicit predicates remain unafftected.
 select * from
@@ -1292,6 +1496,7 @@ PLAN-ROOT SINK
 00:SCAN HDFS [functional.alltypestiny]
    partitions=4/4 files=4 size=460B
    predicates: bigint_col = bigint_col
+   row-size=8B cardinality=1
 ====
 # IMPALA-2643: Test aggregation.
 # Inferred predicate referencing the same expr gets filtered out.
@@ -1305,9 +1510,11 @@ PLAN-ROOT SINK
 |
 01:AGGREGATE [FINALIZE]
 |  output: sum(bigint_col)
+|  row-size=8B cardinality=1
 |
 00:SCAN HDFS [functional.alltypestiny]
    partitions=4/4 files=4 size=460B
+   row-size=8B cardinality=8
 ====
 # IMPALA-2643: Explicit predicates remain unafftected.
 select * from
@@ -1321,7 +1528,9 @@ PLAN-ROOT SINK
 01:AGGREGATE [FINALIZE]
 |  output: sum(bigint_col)
 |  having: sum(bigint_col) = sum(bigint_col)
+|  row-size=8B cardinality=0
 |
 00:SCAN HDFS [functional.alltypestiny]
    partitions=4/4 files=4 size=460B
+   row-size=8B cardinality=8
 ====

http://git-wip-us.apache.org/repos/asf/impala/blob/a7ea86b7/testdata/workloads/functional-planner/queries/PlannerTest/insert-sort-by.test
----------------------------------------------------------------------
diff --git a/testdata/workloads/functional-planner/queries/PlannerTest/insert-sort-by.test b/testdata/workloads/functional-planner/queries/PlannerTest/insert-sort-by.test
index f2ecb2c..e6432da 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/insert-sort-by.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/insert-sort-by.test
@@ -8,20 +8,24 @@ WRITE TO HDFS [test_sort_by.t, OVERWRITE=false, PARTITION-KEYS=(year,month)]
 |
 01:SORT
 |  order by: year ASC NULLS LAST, month ASC NULLS LAST, int_col ASC NULLS LAST, bool_col ASC NULLS LAST
+|  row-size=17B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=17B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 WRITE TO HDFS [test_sort_by.t, OVERWRITE=false, PARTITION-KEYS=(year,month)]
 |  partitions=24
 |
 02:SORT
 |  order by: year ASC NULLS LAST, month ASC NULLS LAST, int_col ASC NULLS LAST, bool_col ASC NULLS LAST
+|  row-size=17B cardinality=7.30K
 |
 01:EXCHANGE [HASH(year,month)]
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=17B cardinality=7.30K
 ====
 # IMPALA-4166: insert with noshuffle hint into tables with sort.columns property adds
 # sort node.
@@ -33,18 +37,22 @@ WRITE TO HDFS [test_sort_by.t, OVERWRITE=false, PARTITION-KEYS=(year,month)]
 |
 01:SORT
 |  order by: year ASC NULLS LAST, month ASC NULLS LAST, int_col ASC NULLS LAST, bool_col ASC NULLS LAST
+|  row-size=17B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=17B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 WRITE TO HDFS [test_sort_by.t, OVERWRITE=false, PARTITION-KEYS=(year,month)]
 |  partitions=24
 |
 01:SORT
 |  order by: year ASC NULLS LAST, month ASC NULLS LAST, int_col ASC NULLS LAST, bool_col ASC NULLS LAST
+|  row-size=17B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=17B cardinality=7.30K
 ====
 # IMPALA-4166: insert into tables with sort.columns property adds sort node. Clustering
 # columns are added to the sort columns. noclustered hint is ignored when sort.columns
@@ -57,20 +65,24 @@ WRITE TO HDFS [test_sort_by.t, OVERWRITE=false, PARTITION-KEYS=(year,month)]
 |
 01:SORT
 |  order by: year ASC NULLS LAST, month ASC NULLS LAST, int_col ASC NULLS LAST, bool_col ASC NULLS LAST
+|  row-size=17B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=17B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 WRITE TO HDFS [test_sort_by.t, OVERWRITE=false, PARTITION-KEYS=(year,month)]
 |  partitions=24
 |
 02:SORT
 |  order by: year ASC NULLS LAST, month ASC NULLS LAST, int_col ASC NULLS LAST, bool_col ASC NULLS LAST
+|  row-size=17B cardinality=7.30K
 |
 01:EXCHANGE [HASH(year,month)]
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=17B cardinality=7.30K
 ====
 # IMPALA-4166: insert into tables with sort.columns property adds sort node.
 insert into table test_sort_by.t_nopart /*+ shuffle */
@@ -81,20 +93,24 @@ WRITE TO HDFS [test_sort_by.t_nopart, OVERWRITE=false]
 |
 01:SORT
 |  order by: int_col ASC NULLS LAST, bool_col ASC NULLS LAST
+|  row-size=9B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=9B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 WRITE TO HDFS [test_sort_by.t_nopart, OVERWRITE=false]
 |  partitions=1
 |
 02:SORT
 |  order by: int_col ASC NULLS LAST, bool_col ASC NULLS LAST
+|  row-size=9B cardinality=7.30K
 |
 01:EXCHANGE [UNPARTITIONED]
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=9B cardinality=7.30K
 ====
 # IMPALA-4166: insert with noshuffle hint into tables with sort.columns property adds
 # sort node.
@@ -106,18 +122,22 @@ WRITE TO HDFS [test_sort_by.t_nopart, OVERWRITE=false]
 |
 01:SORT
 |  order by: int_col ASC NULLS LAST, bool_col ASC NULLS LAST
+|  row-size=9B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=9B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 WRITE TO HDFS [test_sort_by.t_nopart, OVERWRITE=false]
 |  partitions=1
 |
 01:SORT
 |  order by: int_col ASC NULLS LAST, bool_col ASC NULLS LAST
+|  row-size=9B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=9B cardinality=7.30K
 ====
 # IMPALA-4166: sort columns are correct when using an identity column permutation.
 insert into table test_sort_by.t_nopart (id, int_col, bool_col) /*+ shuffle */
@@ -128,20 +148,24 @@ WRITE TO HDFS [test_sort_by.t_nopart, OVERWRITE=false]
 |
 01:SORT
 |  order by: int_col ASC NULLS LAST, bool_col ASC NULLS LAST
+|  row-size=9B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=9B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 WRITE TO HDFS [test_sort_by.t_nopart, OVERWRITE=false]
 |  partitions=1
 |
 02:SORT
 |  order by: int_col ASC NULLS LAST, bool_col ASC NULLS LAST
+|  row-size=9B cardinality=7.30K
 |
 01:EXCHANGE [UNPARTITIONED]
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=9B cardinality=7.30K
 ====
 # IMPALA-4166: sort columns are correct when using a non-trivial column permutation.
 insert into table test_sort_by.t_nopart (bool_col, id, int_col) /*+ shuffle */
@@ -152,20 +176,24 @@ WRITE TO HDFS [test_sort_by.t_nopart, OVERWRITE=false]
 |
 01:SORT
 |  order by: int_col ASC NULLS LAST, bool_col ASC NULLS LAST
+|  row-size=9B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=9B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 WRITE TO HDFS [test_sort_by.t_nopart, OVERWRITE=false]
 |  partitions=1
 |
 02:SORT
 |  order by: int_col ASC NULLS LAST, bool_col ASC NULLS LAST
+|  row-size=9B cardinality=7.30K
 |
 01:EXCHANGE [UNPARTITIONED]
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=9B cardinality=7.30K
 ====
 # IMPALA-4166: sort columns are correct when using a partial column permutation.
 insert into table test_sort_by.t_nopart (bool_col, id) /*+ shuffle */
@@ -176,20 +204,24 @@ WRITE TO HDFS [test_sort_by.t_nopart, OVERWRITE=false]
 |
 01:SORT
 |  order by: bool_col ASC NULLS LAST
+|  row-size=5B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=5B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 WRITE TO HDFS [test_sort_by.t_nopart, OVERWRITE=false]
 |  partitions=1
 |
 02:SORT
 |  order by: bool_col ASC NULLS LAST
+|  row-size=5B cardinality=7.30K
 |
 01:EXCHANGE [UNPARTITIONED]
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=5B cardinality=7.30K
 ====
 # IMPALA-4166: no sort node is added when using a partial column permutation and none of
 # the sort columns appear in the permutation.
@@ -201,6 +233,7 @@ WRITE TO HDFS [test_sort_by.t_nopart, OVERWRITE=false]
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=4B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 WRITE TO HDFS [test_sort_by.t_nopart, OVERWRITE=false]
 |  partitions=1
@@ -209,6 +242,7 @@ WRITE TO HDFS [test_sort_by.t_nopart, OVERWRITE=false]
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=4B cardinality=7.30K
 ====
 # IMPALA-4166: sort columns with a join
 insert into table test_sort_by.t partition(year, month) /*+ noclustered */
@@ -221,26 +255,32 @@ WRITE TO HDFS [test_sort_by.t, OVERWRITE=false, PARTITION-KEYS=(year,month)]
 |
 04:SORT
 |  order by: year ASC NULLS LAST, month ASC NULLS LAST, int_col ASC NULLS LAST, bool_col ASC NULLS LAST
+|  row-size=17B cardinality=10
 |
 03:TOP-N [LIMIT=10]
 |  order by: string_col ASC
+|  row-size=30B cardinality=10
 |
 02:HASH JOIN [INNER JOIN]
 |  hash predicates: b.id = a.id
 |  runtime filters: RF000 <- a.id
+|  row-size=34B cardinality=7.30K
 |
 |--00:SCAN HDFS [functional.alltypes a]
 |     partitions=24/24 files=24 size=478.45KB
+|     row-size=9B cardinality=7.30K
 |
 01:SCAN HDFS [functional.alltypes b]
    partitions=24/24 files=24 size=478.45KB
    runtime filters: RF000 -> b.id
+   row-size=25B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 WRITE TO HDFS [test_sort_by.t, OVERWRITE=false, PARTITION-KEYS=(year,month)]
 |  partitions=24
 |
 07:SORT
 |  order by: year ASC NULLS LAST, month ASC NULLS LAST, int_col ASC NULLS LAST, bool_col ASC NULLS LAST
+|  row-size=17B cardinality=10
 |
 06:MERGING-EXCHANGE [UNPARTITIONED]
 |  order by: string_col ASC
@@ -248,21 +288,25 @@ WRITE TO HDFS [test_sort_by.t, OVERWRITE=false, PARTITION-KEYS=(year,month)]
 |
 03:TOP-N [LIMIT=10]
 |  order by: string_col ASC
+|  row-size=30B cardinality=10
 |
 02:HASH JOIN [INNER JOIN, PARTITIONED]
 |  hash predicates: b.id = a.id
 |  runtime filters: RF000 <- a.id
+|  row-size=34B cardinality=7.30K
 |
 |--05:EXCHANGE [HASH(a.id)]
 |  |
 |  00:SCAN HDFS [functional.alltypes a]
 |     partitions=24/24 files=24 size=478.45KB
+|     row-size=9B cardinality=7.30K
 |
 04:EXCHANGE [HASH(b.id)]
 |
 01:SCAN HDFS [functional.alltypes b]
    partitions=24/24 files=24 size=478.45KB
    runtime filters: RF000 -> b.id
+   row-size=25B cardinality=7.30K
 ====
 # IMPALA-4166: sort columns with a join and agg
 insert into table test_sort_by.t partition(year, month) /*+ noclustered */
@@ -275,54 +319,65 @@ WRITE TO HDFS [test_sort_by.t, OVERWRITE=false, PARTITION-KEYS=(b.year,a.month)]
 |
 04:SORT
 |  order by: b.year ASC NULLS LAST, a.month ASC NULLS LAST, max(b.int_col) ASC NULLS LAST, min(a.bool_col) ASC NULLS LAST
+|  row-size=17B cardinality=7.30K
 |
 03:AGGREGATE [FINALIZE]
 |  output: max(b.int_col), min(a.bool_col)
 |  group by: a.id, b.year, a.month
+|  row-size=17B cardinality=7.30K
 |
 02:HASH JOIN [INNER JOIN]
 |  hash predicates: b.id = a.id
 |  runtime filters: RF000 <- a.id
+|  row-size=21B cardinality=7.30K
 |
 |--00:SCAN HDFS [functional.alltypes a]
 |     partitions=24/24 files=24 size=478.45KB
+|     row-size=9B cardinality=7.30K
 |
 01:SCAN HDFS [functional.alltypes b]
    partitions=24/24 files=24 size=478.45KB
    runtime filters: RF000 -> b.id
+   row-size=12B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 WRITE TO HDFS [test_sort_by.t, OVERWRITE=false, PARTITION-KEYS=(b.year,a.month)]
 |  partitions=24
 |
 09:SORT
 |  order by: b.year ASC NULLS LAST, a.month ASC NULLS LAST, max(b.int_col) ASC NULLS LAST, min(a.bool_col) ASC NULLS LAST
+|  row-size=17B cardinality=7.30K
 |
 08:EXCHANGE [HASH(b.year,a.month)]
 |
 07:AGGREGATE [FINALIZE]
 |  output: max:merge(b.int_col), min:merge(a.bool_col)
 |  group by: a.id, b.year, a.month
+|  row-size=17B cardinality=7.30K
 |
 06:EXCHANGE [HASH(a.id,b.year,a.month)]
 |
 03:AGGREGATE [STREAMING]
 |  output: max(b.int_col), min(a.bool_col)
 |  group by: a.id, b.year, a.month
+|  row-size=17B cardinality=7.30K
 |
 02:HASH JOIN [INNER JOIN, PARTITIONED]
 |  hash predicates: b.id = a.id
 |  runtime filters: RF000 <- a.id
+|  row-size=21B cardinality=7.30K
 |
 |--05:EXCHANGE [HASH(a.id)]
 |  |
 |  00:SCAN HDFS [functional.alltypes a]
 |     partitions=24/24 files=24 size=478.45KB
+|     row-size=9B cardinality=7.30K
 |
 04:EXCHANGE [HASH(b.id)]
 |
 01:SCAN HDFS [functional.alltypes b]
    partitions=24/24 files=24 size=478.45KB
    runtime filters: RF000 -> b.id
+   row-size=12B cardinality=7.30K
 ====
 # IMPALA-5339: Sort columns with a union to trigger expr rewrite
 insert into table test_sort_by.t_nopart
@@ -333,24 +388,30 @@ WRITE TO HDFS [test_sort_by.t_nopart, OVERWRITE=false]
 |
 02:SORT
 |  order by: CAST(id AS INT) ASC NULLS LAST
+|  row-size=1B cardinality=2
 |
 01:AGGREGATE [FINALIZE]
 |  group by: id
+|  row-size=1B cardinality=2
 |
 00:UNION
    constant-operands=2
+   row-size=1B cardinality=2
 ---- DISTRIBUTEDPLAN
 WRITE TO HDFS [test_sort_by.t_nopart, OVERWRITE=false]
 |  partitions=1
 |
 02:SORT
 |  order by: CAST(id AS INT) ASC NULLS LAST
+|  row-size=1B cardinality=2
 |
 01:AGGREGATE [FINALIZE]
 |  group by: id
+|  row-size=1B cardinality=2
 |
 00:UNION
    constant-operands=2
+   row-size=1B cardinality=2
 ====
 # IMPALA-5339: Sort columns with a subquery to trigger expr rewrite
 insert into table test_sort_by.t_nopart
@@ -361,45 +422,56 @@ WRITE TO HDFS [test_sort_by.t_nopart, OVERWRITE=false]
 |
 04:SORT
 |  order by: id ASC NULLS LAST
+|  row-size=4B cardinality=0
 |
 03:HASH JOIN [LEFT SEMI JOIN]
 |  hash predicates: id = min(id)
 |  runtime filters: RF000 <- min(id)
+|  row-size=4B cardinality=0
 |
 |--02:AGGREGATE [FINALIZE]
 |  |  output: min(id)
+|  |  row-size=4B cardinality=0
 |  |
 |  01:SCAN HDFS [test_sort_by.t]
 |     partitions=0/0 files=0 size=0B
+|     row-size=4B cardinality=0
 |
 00:SCAN HDFS [test_sort_by.t_nopart]
    partitions=1/0 files=0 size=0B
    runtime filters: RF000 -> id
+   row-size=4B cardinality=0
 ---- DISTRIBUTEDPLAN
 WRITE TO HDFS [test_sort_by.t_nopart, OVERWRITE=false]
 |  partitions=1
 |
 07:SORT
 |  order by: id ASC NULLS LAST
+|  row-size=4B cardinality=0
 |
 03:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
 |  hash predicates: id = min(id)
 |  runtime filters: RF000 <- min(id)
+|  row-size=4B cardinality=0
 |
 |--06:EXCHANGE [BROADCAST]
 |  |
 |  05:AGGREGATE [FINALIZE]
 |  |  output: min:merge(id)
+|  |  row-size=4B cardinality=0
 |  |
 |  04:EXCHANGE [UNPARTITIONED]
 |  |
 |  02:AGGREGATE
 |  |  output: min(id)
+|  |  row-size=4B cardinality=0
 |  |
 |  01:SCAN HDFS [test_sort_by.t]
 |     partitions=0/0 files=0 size=0B
+|     row-size=4B cardinality=0
 |
 00:SCAN HDFS [test_sort_by.t_nopart]
    partitions=1/0 files=0 size=0B
    runtime filters: RF000 -> id
+   row-size=4B cardinality=0
 ====