http://git-wip-us.apache.org/repos/asf/impala/blob/a7ea86b7/testdata/workloads/functional-planner/queries/PlannerTest/kudu-upsert.test
----------------------------------------------------------------------
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/kudu-upsert.test 
b/testdata/workloads/functional-planner/queries/PlannerTest/kudu-upsert.test
index 0ee1aa9..d4c3beb 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/kudu-upsert.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/kudu-upsert.test
@@ -6,17 +6,22 @@ where year=2009 and month=05
 UPSERT INTO KUDU [functional_kudu.testtbl]
 |
 00:SCAN HDFS [functional.alltypes]
+   partition predicates: year = 2009, month = 5
    partitions=1/24 files=1 size=20.36KB
+   row-size=25B cardinality=310
 ---- DISTRIBUTEDPLAN
 UPSERT INTO KUDU [functional_kudu.testtbl]
 |
 02:PARTIAL SORT
 |  order by: KuduPartition(bigint_col) ASC NULLS LAST, bigint_col ASC NULLS 
LAST
+|  row-size=29B cardinality=310
 |
 01:EXCHANGE [KUDU(KuduPartition(bigint_col))]
 |
 00:SCAN HDFS [functional.alltypes]
+   partition predicates: year = 2009, month = 5
    partitions=1/24 files=1 size=20.36KB
+   row-size=25B cardinality=310
 ====
 # simple upsert with values clause
 upsert into table functional_kudu.testtbl
@@ -26,6 +31,7 @@ UPSERT INTO KUDU [functional_kudu.testtbl]
 |
 00:UNION
    constant-operands=2
+   row-size=14B cardinality=2
 ====
 # upsert with 'with' clause and limit
 with x as (select string_col, count(*) from functional.alltypes group by 
string_col)
@@ -38,44 +44,54 @@ UPSERT INTO KUDU [functional_kudu.testtbl]
 03:HASH JOIN [INNER JOIN]
 |  hash predicates: a.string_col = string_col
 |  runtime filters: RF000 <- string_col
+|  row-size=38B cardinality=7.30K
 |
 |--02:AGGREGATE [FINALIZE]
 |  |  group by: string_col
+|  |  row-size=13B cardinality=10
 |  |
 |  01:SCAN HDFS [functional.alltypes]
 |     partitions=24/24 files=24 size=478.45KB
+|     row-size=13B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes a]
    partitions=24/24 files=24 size=478.45KB
    runtime filters: RF000 -> a.string_col
+   row-size=25B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 UPSERT INTO KUDU [functional_kudu.testtbl]
 |
 08:PARTIAL SORT
 |  order by: KuduPartition(a.bigint_col) ASC NULLS LAST, bigint_col ASC NULLS 
LAST
+|  row-size=29B cardinality=7.30K
 |
 07:EXCHANGE [KUDU(KuduPartition(a.bigint_col))]
 |
 03:HASH JOIN [INNER JOIN, BROADCAST]
 |  hash predicates: a.string_col = string_col
 |  runtime filters: RF000 <- string_col
+|  row-size=38B cardinality=7.30K
 |
 |--06:EXCHANGE [BROADCAST]
 |  |
 |  05:AGGREGATE [FINALIZE]
 |  |  group by: string_col
+|  |  row-size=13B cardinality=10
 |  |
 |  04:EXCHANGE [HASH(string_col)]
 |  |
 |  02:AGGREGATE [STREAMING]
 |  |  group by: string_col
+|  |  row-size=13B cardinality=10
 |  |
 |  01:SCAN HDFS [functional.alltypes]
 |     partitions=24/24 files=24 size=478.45KB
+|     row-size=13B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes a]
    partitions=24/24 files=24 size=478.45KB
    runtime filters: RF000 -> a.string_col
+   row-size=25B cardinality=7.30K
 ====
 # upsert with inline view
 upsert into functional_kudu.testtbl
@@ -91,14 +107,17 @@ UPSERT INTO KUDU [functional_kudu.testtbl]
 |  output: count(*)
 |  group by: id, string_col
 |  having: CAST(count(*) AS INT) < 10
+|  row-size=25B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=17B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 UPSERT INTO KUDU [functional_kudu.testtbl]
 |
 05:PARTIAL SORT
 |  order by: KuduPartition(id) ASC NULLS LAST, id ASC NULLS LAST
+|  row-size=29B cardinality=7.30K
 |
 04:EXCHANGE [KUDU(KuduPartition(id))]
 |
@@ -106,15 +125,18 @@ UPSERT INTO KUDU [functional_kudu.testtbl]
 |  output: count:merge(*)
 |  group by: id, string_col
 |  having: CAST(count(*) AS INT) < 10
+|  row-size=25B cardinality=7.30K
 |
 02:EXCHANGE [HASH(id,string_col)]
 |
 01:AGGREGATE [STREAMING]
 |  output: count(*)
 |  group by: id, string_col
+|  row-size=25B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=17B cardinality=7.30K
 ====
 upsert into functional_kudu.testtbl
 select * from functional_kudu.testtbl
@@ -122,15 +144,18 @@ select * from functional_kudu.testtbl
 UPSERT INTO KUDU [functional_kudu.testtbl]
 |
 00:SCAN KUDU [functional_kudu.testtbl]
+   row-size=28B cardinality=0
 ---- DISTRIBUTEDPLAN
 UPSERT INTO KUDU [functional_kudu.testtbl]
 |
 02:PARTIAL SORT
 |  order by: KuduPartition(functional_kudu.testtbl.id) ASC NULLS LAST, id ASC 
NULLS LAST
+|  row-size=28B cardinality=0
 |
 01:EXCHANGE [KUDU(KuduPartition(functional_kudu.testtbl.id))]
 |
 00:SCAN KUDU [functional_kudu.testtbl]
+   row-size=28B cardinality=0
 ====
 # upsert with a union
 upsert into functional_kudu.testtbl select * from functional_kudu.testtbl 
where id % 3 = 0
@@ -139,27 +164,34 @@ union all select * from functional_kudu.testtbl where id 
% 3 = 1
 UPSERT INTO KUDU [functional_kudu.testtbl]
 |
 00:UNION
+|  row-size=24B cardinality=0
 |
 |--02:SCAN KUDU [functional_kudu.testtbl]
 |     predicates: id % 3 = 1
+|     row-size=28B cardinality=0
 |
 01:SCAN KUDU [functional_kudu.testtbl]
    predicates: id % 3 = 0
+   row-size=28B cardinality=0
 ---- DISTRIBUTEDPLAN
 UPSERT INTO KUDU [functional_kudu.testtbl]
 |
 04:PARTIAL SORT
 |  order by: KuduPartition(id) ASC NULLS LAST, id ASC NULLS LAST
+|  row-size=28B cardinality=0
 |
 03:EXCHANGE [KUDU(KuduPartition(id))]
 |
 00:UNION
+|  row-size=24B cardinality=0
 |
 |--02:SCAN KUDU [functional_kudu.testtbl]
 |     predicates: id % 3 = 1
+|     row-size=28B cardinality=0
 |
 01:SCAN KUDU [functional_kudu.testtbl]
    predicates: id % 3 = 0
+   row-size=28B cardinality=0
 ====
 # upsert with agg on col that is already partitioned in the input and target 
table
 # TODO: we shouldn't need to do any repartioning here (IMPALA-5254).
@@ -170,25 +202,31 @@ UPSERT INTO KUDU [functional_kudu.alltypes]
 |
 01:AGGREGATE [FINALIZE]
 |  group by: id
+|  row-size=4B cardinality=7.30K
 |
 00:SCAN KUDU [functional_kudu.alltypes]
+   row-size=4B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 UPSERT INTO KUDU [functional_kudu.alltypes]
 |
 05:PARTIAL SORT
 |  order by: KuduPartition(id) ASC NULLS LAST, id ASC NULLS LAST
+|  row-size=8B cardinality=7.30K
 |
 04:EXCHANGE [KUDU(KuduPartition(id))]
 |
 03:AGGREGATE [FINALIZE]
 |  group by: id
+|  row-size=4B cardinality=7.30K
 |
 02:EXCHANGE [HASH(id)]
 |
 01:AGGREGATE [STREAMING]
 |  group by: id
+|  row-size=4B cardinality=7.30K
 |
 00:SCAN KUDU [functional_kudu.alltypes]
+   row-size=4B cardinality=7.30K
 ====
 # Hint - noshuffle should remove the exchange node.
 upsert into functional_kudu.alltypes /* +noshuffle */ select * from 
functional.alltypes;
@@ -197,9 +235,11 @@ UPSERT INTO KUDU [functional_kudu.alltypes]
 |
 01:PARTIAL SORT
 |  order by: KuduPartition(functional.alltypes.id) ASC NULLS LAST, id ASC 
NULLS LAST
+|  row-size=93B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=89B cardinality=7.30K
 ====
 # same as above but the hint is at Oracle hint location.
 upsert /* +noshuffle */ into functional_kudu.alltypes select * from 
functional.alltypes;
@@ -208,9 +248,11 @@ UPSERT INTO KUDU [functional_kudu.alltypes]
 |
 01:PARTIAL SORT
 |  order by: KuduPartition(functional.alltypes.id) ASC NULLS LAST, id ASC 
NULLS LAST
+|  row-size=93B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=89B cardinality=7.30K
 ====
 # Hint - noclustered should remove the sort node.
 upsert into functional_kudu.alltypes /* +noclustered */ select * from 
functional.alltypes;
@@ -221,6 +263,7 @@ UPSERT INTO KUDU [functional_kudu.alltypes]
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=89B cardinality=7.30K
 ====
 # same as above but the hint is at Oracle hint location.
 upsert /* +noclustered */ into functional_kudu.alltypes select * from 
functional.alltypes;
@@ -231,6 +274,7 @@ UPSERT INTO KUDU [functional_kudu.alltypes]
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=89B cardinality=7.30K
 ====
 # Hint - noshuffle should remove the exchange node.
 upsert into functional_kudu.alltypes /* +noshuffle */ select * from 
functional.alltypes;
@@ -239,9 +283,11 @@ UPSERT INTO KUDU [functional_kudu.alltypes]
 |
 01:PARTIAL SORT
 |  order by: KuduPartition(functional.alltypes.id) ASC NULLS LAST, id ASC 
NULLS LAST
+|  row-size=93B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=89B cardinality=7.30K
 ====
 # same as above but the hint is at Oracle hint location.
 upsert /* +noshuffle */ into functional_kudu.alltypes select * from 
functional.alltypes;
@@ -250,9 +296,11 @@ UPSERT INTO KUDU [functional_kudu.alltypes]
 |
 01:PARTIAL SORT
 |  order by: KuduPartition(functional.alltypes.id) ASC NULLS LAST, id ASC 
NULLS LAST
+|  row-size=93B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=89B cardinality=7.30K
 ====
 upsert into functional_kudu.alltypes /* +noclustered,noshuffle */
 select * from functional.alltypes;
@@ -261,6 +309,7 @@ UPSERT INTO KUDU [functional_kudu.alltypes]
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=89B cardinality=7.30K
 ====
 # same as above but the hint is at Oracle hint location.
 upsert into functional_kudu.alltypes /* +noclustered,noshuffle */
@@ -270,4 +319,5 @@ UPSERT INTO KUDU [functional_kudu.alltypes]
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=89B cardinality=7.30K
 ====

http://git-wip-us.apache.org/repos/asf/impala/blob/a7ea86b7/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 dfea970..d8b50dc 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/kudu.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/kudu.test
@@ -3,6 +3,7 @@ select * from functional_kudu.testtbl
 PLAN-ROOT SINK
 |
 00:SCAN KUDU [functional_kudu.testtbl]
+   row-size=28B cardinality=0
 ---- SCANRANGELOCATIONS
 NODE 0:
   ScanToken{table=impala::functional_kudu.testtbl, range-partition: [(int64 
id=1004), (int64 id=1008))}
@@ -14,6 +15,7 @@ PLAN-ROOT SINK
 01:EXCHANGE [UNPARTITIONED]
 |
 00:SCAN KUDU [functional_kudu.testtbl]
+   row-size=28B cardinality=0
 ====
 select * from functional_kudu.testtbl where name = '10'
 ---- PLAN
@@ -21,6 +23,7 @@ PLAN-ROOT SINK
 |
 00:SCAN KUDU [functional_kudu.testtbl]
    kudu predicates: name = '10'
+   row-size=28B cardinality=0
 ---- SCANRANGELOCATIONS
 NODE 0:
   ScanToken{table=impala::functional_kudu.testtbl, range-partition: [(int64 
id=1004), (int64 id=1008))}
@@ -33,6 +36,7 @@ PLAN-ROOT SINK
 |
 00:SCAN KUDU [functional_kudu.testtbl]
    kudu predicates: name = '10'
+   row-size=28B cardinality=0
 ====
 select * from functional_kudu.testtbl where name = NULL
 ---- PLAN
@@ -40,6 +44,7 @@ PLAN-ROOT SINK
 |
 00:SCAN KUDU [functional_kudu.testtbl]
    predicates: name = NULL
+   row-size=28B cardinality=0
 ====
 insert into functional_kudu.testtbl(id) values (10)
 ---- PLAN
@@ -47,31 +52,37 @@ INSERT INTO KUDU [functional_kudu.testtbl]
 |
 00:UNION
    constant-operands=1
+   row-size=1B cardinality=1
 ---- DISTRIBUTEDPLAN
 INSERT INTO KUDU [functional_kudu.testtbl]
 |
 02:PARTIAL SORT
 |  order by: KuduPartition(10) ASC NULLS LAST, 10 ASC NULLS LAST
+|  row-size=5B cardinality=1
 |
 01:EXCHANGE [KUDU(KuduPartition(10))]
 |
 00:UNION
    constant-operands=1
+   row-size=1B cardinality=1
 ====
 insert into functional_kudu.testtbl(id) select int_col from 
functional_kudu.tinyinttable
 ---- PLAN
 INSERT INTO KUDU [functional_kudu.testtbl]
 |
 00:SCAN KUDU [functional_kudu.tinyinttable]
+   row-size=4B cardinality=10
 ---- DISTRIBUTEDPLAN
 INSERT INTO KUDU [functional_kudu.testtbl]
 |
 02:PARTIAL SORT
 |  order by: KuduPartition(int_col) ASC NULLS LAST, int_col ASC NULLS LAST
+|  row-size=8B cardinality=10
 |
 01:EXCHANGE [KUDU(KuduPartition(int_col))]
 |
 00:SCAN KUDU [functional_kudu.tinyinttable]
+   row-size=4B cardinality=10
 ====
 insert into functional_kudu.testtbl(id, name)
 select count(distinct id), name from functional_kudu.dimtbl
@@ -82,38 +93,47 @@ INSERT INTO KUDU [functional_kudu.testtbl]
 02:AGGREGATE [FINALIZE]
 |  output: count(id)
 |  group by: name
+|  row-size=25B cardinality=10
 |
 01:AGGREGATE
 |  group by: name, id
+|  row-size=25B cardinality=10
 |
 00:SCAN KUDU [functional_kudu.dimtbl]
+   row-size=29B cardinality=10
 ---- DISTRIBUTEDPLAN
 INSERT INTO KUDU [functional_kudu.testtbl]
 |
 08:PARTIAL SORT
 |  order by: KuduPartition(count(id)) ASC NULLS LAST, count(id) ASC NULLS LAST
+|  row-size=29B cardinality=10
 |
 07:EXCHANGE [KUDU(KuduPartition(count(id)))]
 |
 06:AGGREGATE [FINALIZE]
 |  output: count:merge(id)
 |  group by: name
+|  row-size=25B cardinality=10
 |
 05:EXCHANGE [HASH(name)]
 |
 02:AGGREGATE [STREAMING]
 |  output: count(id)
 |  group by: name
+|  row-size=25B cardinality=10
 |
 04:AGGREGATE
 |  group by: name, id
+|  row-size=25B cardinality=10
 |
 03:EXCHANGE [HASH(name,id)]
 |
 01:AGGREGATE [STREAMING]
 |  group by: name, id
+|  row-size=25B cardinality=10
 |
 00:SCAN KUDU [functional_kudu.dimtbl]
+   row-size=29B cardinality=10
 ====
 # All predicates can be pushed down.
 select * from functional_kudu.testtbl
@@ -124,6 +144,7 @@ PLAN-ROOT SINK
 |
 00:SCAN KUDU [functional_kudu.testtbl]
    kudu predicates: id <= 20, id >= 10, zip < 50, zip <= 30, zip <= 5, zip > 
1, zip >= 0, name = 'foo'
+   row-size=28B cardinality=0
 ---- SCANRANGELOCATIONS
 NODE 0:
   ScanToken{table=impala::functional_kudu.testtbl, range-partition: [<start>, 
(int64 id=1004))}
@@ -134,6 +155,7 @@ PLAN-ROOT SINK
 |
 00:SCAN KUDU [functional_kudu.testtbl]
    kudu predicates: id <= 20, id >= 10, zip < 50, zip <= 30, zip <= 5, zip > 
1, zip >= 0, name = 'foo'
+   row-size=28B cardinality=0
 ====
 # Constant propagation works for Kudu
 select * from functional_kudu.alltypes t
@@ -145,6 +167,7 @@ PLAN-ROOT SINK
 00:SCAN KUDU [functional_kudu.alltypes t]
    predicates: CAST(t.tinyint_col AS BIGINT) = 1000
    kudu predicates: t.bigint_col = 1000, t.int_col = 10
+   row-size=97B cardinality=107
 ====
 # Test constant folding.
 select * from functional_kudu.testtbl
@@ -155,6 +178,7 @@ PLAN-ROOT SINK
 00:SCAN KUDU [functional_kudu.testtbl]
    predicates: CAST(sin(id) AS BOOLEAN) = TRUE
    kudu predicates: id < 103, id < 40, id <= 60
+   row-size=28B cardinality=0
 ---- SCANRANGELOCATIONS
 NODE 0:
   ScanToken{table=impala::functional_kudu.testtbl, range-partition: [<start>, 
(int64 id=1004))}
@@ -166,6 +190,7 @@ PLAN-ROOT SINK
 00:SCAN KUDU [functional_kudu.testtbl]
    predicates: CAST(sin(id) AS BOOLEAN) = TRUE
    kudu predicates: id < 103, id < 40, id <= 60
+   row-size=28B cardinality=0
 ====
 # Some predicates can be pushed down but others can't (predicate on an 
non-const value).
 select * from functional_kudu.testtbl
@@ -176,6 +201,7 @@ PLAN-ROOT SINK
 00:SCAN KUDU [functional_kudu.testtbl]
    predicates: CAST(sin(id) AS BOOLEAN) = TRUE
    kudu predicates: name = 'a'
+   row-size=28B cardinality=0
 ---- SCANRANGELOCATIONS
 NODE 0:
   ScanToken{table=impala::functional_kudu.testtbl, range-partition: [(int64 
id=1004), (int64 id=1008))}
@@ -189,6 +215,7 @@ PLAN-ROOT SINK
 00:SCAN KUDU [functional_kudu.testtbl]
    predicates: CAST(sin(id) AS BOOLEAN) = TRUE
    kudu predicates: name = 'a'
+   row-size=28B cardinality=0
 ====
 # No predicates can be pushed down (predicate on a non-const value and
 # non-binary predicate). There is a single tablet so no partition pruning.
@@ -200,6 +227,7 @@ PLAN-ROOT SINK
 00:SCAN KUDU [functional_kudu.testtbl]
    predicates: CAST(sin(id) AS BOOLEAN) = TRUE
    kudu predicates: name IS NULL
+   row-size=28B cardinality=0
 ---- SCANRANGELOCATIONS
 NODE 0:
   ScanToken{table=impala::functional_kudu.testtbl, range-partition: [(int64 
id=1004), (int64 id=1008))}
@@ -213,6 +241,7 @@ PLAN-ROOT SINK
 00:SCAN KUDU [functional_kudu.testtbl]
    predicates: CAST(sin(id) AS BOOLEAN) = TRUE
    kudu predicates: name IS NULL
+   row-size=28B cardinality=0
 ====
 # Derived EmptySets for Kudu
 select * from functional_kudu.alltypes t
@@ -230,9 +259,11 @@ PLAN-ROOT SINK
 |
 01:SORT
 |  order by: o_orderkey ASC
+|  row-size=8B cardinality=150.00K
 |
 00:SCAN KUDU [tpch_kudu.orders]
    predicates: o_orderkey < 10.0
+   row-size=8B cardinality=150.00K
 ====
 # IMPALA-3871: Casting literals to TIMESTAMP throw when pushed to KuduScanNode
 select t.c from
@@ -243,10 +274,12 @@ PLAN-ROOT SINK
 |
 01:SORT
 |  order by: c ASC
+|  row-size=22B cardinality=150.00K
 |
 00:SCAN KUDU [tpch_kudu.orders]
    predicates: CAST(o_orderdate AS TIMESTAMP) <= TIMESTAMP '1995-01-01 
00:00:00'
    kudu predicates: o_orderkey < 10
+   row-size=26B cardinality=150.00K
 ====
 # IMPALA-4213: Planner not pushing some predicates with constant exprs to Kudu
 select count(*) from functional_kudu.alltypes
@@ -257,9 +290,11 @@ PLAN-ROOT SINK
 |
 01:AGGREGATE [FINALIZE]
 |  output: count(*)
+|  row-size=8B cardinality=1
 |
 00:SCAN KUDU [functional_kudu.alltypes]
    kudu predicates: id < 1475059775, id > 1475059665
+   row-size=0B cardinality=730
 ====
 insert into table functional_kudu.alltypes
 select * from functional_kudu.alltypes
@@ -267,15 +302,18 @@ select * from functional_kudu.alltypes
 INSERT INTO KUDU [functional_kudu.alltypes]
 |
 00:SCAN KUDU [functional_kudu.alltypes]
+   row-size=97B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 INSERT INTO KUDU [functional_kudu.alltypes]
 |
 02:PARTIAL SORT
 |  order by: KuduPartition(functional_kudu.alltypes.id) ASC NULLS LAST, id ASC 
NULLS LAST
+|  row-size=93B cardinality=7.30K
 |
 01:EXCHANGE [KUDU(KuduPartition(functional_kudu.alltypes.id))]
 |
 00:SCAN KUDU [functional_kudu.alltypes]
+   row-size=97B cardinality=7.30K
 ====
 insert into table functional_kudu.testtbl
 select id, name, maxzip as zip
@@ -289,27 +327,33 @@ INSERT INTO KUDU [functional_kudu.testtbl]
 01:AGGREGATE [FINALIZE]
 |  output: max(zip)
 |  group by: id, name
+|  row-size=24B cardinality=0
 |
 00:SCAN KUDU [functional_kudu.testtbl]
+   row-size=28B cardinality=0
 ---- DISTRIBUTEDPLAN
 INSERT INTO KUDU [functional_kudu.testtbl]
 |
 05:PARTIAL SORT
 |  order by: KuduPartition(id) ASC NULLS LAST, id ASC NULLS LAST
+|  row-size=28B cardinality=0
 |
 04:EXCHANGE [KUDU(KuduPartition(id))]
 |
 03:AGGREGATE [FINALIZE]
 |  output: max:merge(zip)
 |  group by: id, name
+|  row-size=24B cardinality=0
 |
 02:EXCHANGE [HASH(id,name)]
 |
 01:AGGREGATE [STREAMING]
 |  output: max(zip)
 |  group by: id, name
+|  row-size=24B cardinality=0
 |
 00:SCAN KUDU [functional_kudu.testtbl]
+   row-size=28B cardinality=0
 ====
 # IMPALA-4479: Test proper folding of constant boolean exprs.
 select * from functional_kudu.alltypes
@@ -319,6 +363,7 @@ PLAN-ROOT SINK
 |
 00:SCAN KUDU [functional_kudu.alltypes]
    kudu predicates: bool_col = FALSE
+   row-size=97B cardinality=3.65K
 ====
 # IMPALA-4578: Test predicate propagation for Kudu scans.
 select /* +straight_join */ count(*)
@@ -334,26 +379,32 @@ PLAN-ROOT SINK
 |
 05:AGGREGATE [FINALIZE]
 |  output: count(*)
+|  row-size=8B cardinality=1
 |
 04:HASH JOIN [LEFT OUTER JOIN]
 |  hash predicates: b.int_col = c.int_col
 |  other predicates: c.int_col > 20
+|  row-size=16B cardinality=1
 |
 |--02:SCAN KUDU [functional_kudu.alltypestiny c]
 |     kudu predicates: c.int_col > 20
+|     row-size=4B cardinality=1
 |
 03:HASH JOIN [INNER JOIN]
 |  hash predicates: a.id = b.id
 |  runtime filters: RF001 <- b.id
+|  row-size=12B cardinality=1
 |
 |--01:SCAN KUDU [functional_kudu.alltypessmall b]
 |     predicates: CAST(b.id AS STRING) > '123'
 |     kudu predicates: b.id > 10
+|     row-size=8B cardinality=10
 |
 00:SCAN KUDU [functional_kudu.alltypes a]
    predicates: CAST(a.id AS STRING) > '123'
    kudu predicates: a.id > 10
    runtime filters: RF001 -> a.id
+   row-size=4B cardinality=730
 ====
 # IMPALA-4662: Kudu analysis failure for NULL literal in IN list
 # NULL literal in values list results in applying predicate at scan node
@@ -366,6 +417,7 @@ PLAN-ROOT SINK
 |
 00:SCAN KUDU [functional_kudu.alltypestiny]
    predicates: id IN (1, NULL), bigint_col IN (NULL), bool_col IN (NULL), 
double_col IN (NULL), float_col IN (NULL), smallint_col IN (NULL), string_col 
IN (NULL), tinyint_col IN (NULL)
+   row-size=45B cardinality=1
 ====
 # IMPALA-3586: The operand with the Kudu scan cannot be passed through because 
id is
 # not-nullable (primary key).
@@ -377,11 +429,14 @@ PLAN-ROOT SINK
 |
 00:UNION
 |  pass-through-operands: 02
+|  row-size=4B cardinality=14.60K
 |
 |--01:SCAN KUDU [functional_kudu.alltypes]
+|     row-size=4B cardinality=7.30K
 |
 02:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=4B cardinality=7.30K
 ====
 # IMPALA-3586: When both operands are Kudu scans, they should both be passed 
through.
 select id from functional_kudu.alltypes
@@ -392,10 +447,13 @@ PLAN-ROOT SINK
 |
 00:UNION
 |  pass-through-operands: all
+|  row-size=4B cardinality=14.60K
 |
 |--02:SCAN KUDU [functional_kudu.alltypes]
+|     row-size=4B cardinality=7.30K
 |
 01:SCAN KUDU [functional_kudu.alltypes]
+   row-size=4B cardinality=7.30K
 ====
 # Hint - noshuffle should remove the exchange node.
 insert into functional_kudu.alltypes /* +noshuffle */ select * from 
functional.alltypes;
@@ -404,9 +462,11 @@ INSERT INTO KUDU [functional_kudu.alltypes]
 |
 01:PARTIAL SORT
 |  order by: KuduPartition(functional.alltypes.id) ASC NULLS LAST, id ASC 
NULLS LAST
+|  row-size=93B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=89B cardinality=7.30K
 ====
 # Hint - noclustered should remove the sort node.
 insert into functional_kudu.alltypes /* +noclustered */ select * from 
functional.alltypes;
@@ -417,6 +477,7 @@ INSERT INTO KUDU [functional_kudu.alltypes]
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=89B cardinality=7.30K
 ====
 insert into functional_kudu.alltypes /* +noclustered,noshuffle */
 select * from functional.alltypes;
@@ -425,6 +486,7 @@ INSERT INTO KUDU [functional_kudu.alltypes]
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=89B cardinality=7.30K
 ====
 # Hint - noclustered should remove the sort node from CTAS.
 create /* +noclustered */ table t
@@ -437,6 +499,7 @@ INSERT INTO KUDU [default.t]
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=89B cardinality=7.30K
 ====
 create /* +noclustered,noshuffle */ table t
 primary key(id) partition by hash(id) partitions 3 stored as kudu as
@@ -446,6 +509,7 @@ INSERT INTO KUDU [default.t]
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=89B cardinality=7.30K
 ====
 # IMPALA-5602: If a query contains predicates that are all pushed to kudu and 
there is a
 # limit, then the query should not incorrectly run with 'small query' 
optimization.
@@ -459,6 +523,7 @@ PLAN-ROOT SINK
 00:SCAN KUDU [functional_kudu.alltypesagg_idx]
    kudu predicates: functional_kudu.alltypesagg_idx.tinyint_col = 9
    limit: 10
+   row-size=103B cardinality=10
 ====
 # IMPALA-5602: If a query contains predicates that are all pushed to kudu, 
there is a
 # limit, and no table stats, then the query should not incorrectly run with 
'small query'
@@ -473,6 +538,7 @@ PLAN-ROOT SINK
 00:SCAN KUDU [kudu_planner_test.no_stats]
    kudu predicates: tinyint_col = 9
    limit: 10
+   row-size=88B cardinality=10
 ====
 # Insert into an unpartitioned table, shouldn't partition/sort
 insert into tpch_kudu.nation
@@ -481,7 +547,8 @@ select * from tpch_parquet.nation
 INSERT INTO KUDU [tpch_kudu.nation]
 |
 00:SCAN HDFS [tpch_parquet.nation]
-   partitions=1/1 files=1 size=2.74KB
+   partitions=1/1 files=1 size=2.75KB
+   row-size=109B cardinality=25
 ====
 # Unpartitioned table, still has an exchange due to shuffle hint.
 insert into tpch_kudu.nation /* +shuffle */
@@ -492,7 +559,8 @@ INSERT INTO KUDU [tpch_kudu.nation]
 01:EXCHANGE [UNPARTITIONED]
 |
 00:SCAN HDFS [tpch_parquet.nation]
-   partitions=1/1 files=1 size=2.74KB
+   partitions=1/1 files=1 size=2.75KB
+   row-size=109B cardinality=25
 ====
 # Unpartitioned table, clustered hint forces sort node.
 insert into tpch_kudu.nation /* +clustered */
@@ -502,9 +570,11 @@ INSERT INTO KUDU [tpch_kudu.nation]
 |
 01:PARTIAL SORT
 |  order by: n_nationkey ASC NULLS LAST
+|  row-size=109B cardinality=25
 |
 00:SCAN HDFS [tpch_parquet.nation]
    partitions=1/1 files=1 size=2.75KB
+   row-size=109B cardinality=25
 ====
 # Unpartitioned table, no sort node without clustered hint.
 insert into tpch_kudu.nation
@@ -514,6 +584,7 @@ INSERT INTO KUDU [tpch_kudu.nation]
 |
 00:SCAN HDFS [tpch_parquet.nation]
    partitions=1/1 files=1 size=2.75KB
+   row-size=109B cardinality=25
 ====
 # Partition and primary key exprs are all constant, so don't partition/sort.
 insert into functional_kudu.alltypes (id)
@@ -522,6 +593,7 @@ select 1 from functional_kudu.alltypes
 INSERT INTO KUDU [functional_kudu.alltypes]
 |
 00:SCAN KUDU [functional_kudu.alltypes]
+   row-size=0B cardinality=7.30K
 ====
 # Partition exprs are constant but primary key exprs aren't, so sort but don't 
partition.
 insert into functional_kudu.jointbl (test_id, test_name, test_zip, alltypes_id)
@@ -531,9 +603,11 @@ INSERT INTO KUDU [functional_kudu.jointbl]
 |
 01:PARTIAL SORT
 |  order by: int_col ASC NULLS LAST, id ASC NULLS LAST
+|  row-size=8B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=8B cardinality=7.30K
 ====
 # Decimal predicate.
 select * from functional_kudu.decimal_tbl where d4 = 0.123456789;
@@ -542,6 +616,7 @@ PLAN-ROOT SINK
 |
 00:SCAN KUDU [functional_kudu.decimal_tbl]
    kudu predicates: d4 = 0.123456789
+   row-size=56B cardinality=5
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
@@ -549,4 +624,5 @@ PLAN-ROOT SINK
 |
 00:SCAN KUDU [functional_kudu.decimal_tbl]
    kudu predicates: d4 = 0.123456789
-====
\ No newline at end of file
+   row-size=56B cardinality=5
+====

http://git-wip-us.apache.org/repos/asf/impala/blob/a7ea86b7/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 02ac733..9c4c49b 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/lineage.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/lineage.test
@@ -9,8 +9,8 @@ select * from (
     "queryText":"select * from (\n  select tinyint_col + int_col x from 
functional.alltypes\n  union all\n  select sum(bigint_col) y from (select 
bigint_col from functional.alltypes) v1) v2",
     "queryId":"0:0",
     "hash":"25456c60a2e874a20732f42c7af27553",
-    "user":"dev",
-    "timestamp":1446159271,
+    "user":"progers",
+    "timestamp":1546590134,
     "edges":[
         {
             "sources":[
@@ -63,8 +63,8 @@ order by b.bigint_col limit 10
     "queryText":"select sum(a.tinyint_col) over (partition by a.smallint_col 
order by a.id),\n  count(b.string_col), b.timestamp_col\nfrom 
functional.alltypes a join functional.alltypessmall b on (a.id = b.id)\nwhere 
a.year = 2010 and b.float_col > 0\ngroup by a.tinyint_col, a.smallint_col, 
a.id, b.string_col, b.timestamp_col, b.bigint_col\nhaving count(a.int_col) > 
10\norder by b.bigint_col limit 10",
     "queryId":"0:0",
     "hash":"e0309eeff9811f53c82657d62c1e04eb",
-    "user":"dev",
-    "timestamp":1446159271,
+    "user":"progers",
+    "timestamp":1546590134,
     "edges":[
         {
             "sources":[
@@ -199,9 +199,9 @@ create table lineage_test_tbl as select int_col, 
tinyint_col from functional.all
 {
     "queryText":"create table lineage_test_tbl as select int_col, tinyint_col 
from functional.alltypes",
     "queryId":"0:0",
-    "hash":"f7666959b65ce1aa2a695ae90adb7c85",
-    "user":"dev",
-    "timestamp":1446159271,
+    "hash":"407f23b24758ffcb2ac445b9703f5c44",
+    "user":"progers",
+    "timestamp":1546590134,
     "edges":[
         {
             "sources":[
@@ -254,9 +254,9 @@ where a.year = 2009 and b.month = 2
 {
     "queryText":"create table lineage_test_tbl as\nselect distinct a.int_col, 
a.string_col from functional.alltypes a\ninner join functional.alltypessmall b 
on (a.id = b.id)\nwhere a.year = 2009 and b.month = 2",
     "queryId":"0:0",
-    "hash":"6d83126f8e34eec31ed4e111e1c32e78",
-    "user":"dev",
-    "timestamp":1446159271,
+    "hash":"f3101dcb046a7d34d7ee14892a6cc94e",
+    "user":"progers",
+    "timestamp":1546590134,
     "edges":[
         {
             "sources":[
@@ -342,9 +342,9 @@ select * from
 {
     "queryText":"create table lineage_test_tbl as\nselect * from\n  (select * 
from\n     (select int_col from functional.alltypestiny limit 1) v1 ) v2",
     "queryId":"0:0",
-    "hash":"f719f8eba46eda75e9cc560310885558",
-    "user":"dev",
-    "timestamp":1446159271,
+    "hash":"9c04c1e9feee35ffacf14bfcd3b363a7",
+    "user":"progers",
+    "timestamp":1546590134,
     "edges":[
         {
             "sources":[
@@ -376,9 +376,9 @@ create table lineage_test_tblm as select * from 
functional_hbase.alltypes limit
 {
     "queryText":"create table lineage_test_tblm as select * from 
functional_hbase.alltypes limit 5",
     "queryId":"0:0",
-    "hash":"bedebc5bc72bbc6aec385c514944daae",
-    "user":"dev",
-    "timestamp":1446159271,
+    "hash":"a294f36bddf2adb329eac3055a76b2b5",
+    "user":"progers",
+    "timestamp":1546590134,
     "edges":[
         {
             "sources":[
@@ -642,8 +642,8 @@ functional_hbase.alltypes
     "queryText":"insert into\nfunctional_hbase.alltypes\n  values (1, 1, true, 
\"1999-12-01\", 2.0, 1.0, 1, 12, 2, \"abs\",\n  cast(now() as timestamp), 1, 
1999)",
     "queryId":"0:0",
     "hash":"b923425ce9cc2d53d36523ec83971e67",
-    "user":"dev",
-    "timestamp":1446159271,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -827,8 +827,8 @@ from functional.alltypes
     "queryText":"insert into table functional.alltypesnopart (id, bool_col, 
timestamp_col)\nselect id, bool_col, timestamp_col\nfrom functional.alltypes",
     "queryId":"0:0",
     "hash":"b7b9474fc6b97f104bd031209438ee0e",
-    "user":"dev",
-    "timestamp":1446159271,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -1006,8 +1006,8 @@ where year=2009 and month=05
     "queryText":"insert into table functional.alltypessmall (smallint_col, 
int_col)\npartition (year=2009, month=04)\nselect smallint_col, int_col\nfrom 
functional.alltypes\nwhere year=2009 and month=05",
     "queryId":"0:0",
     "hash":"2ed3a6c784e1c0c7fcef226d71375180",
-    "user":"dev",
-    "timestamp":1446159271,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -1237,8 +1237,8 @@ where year=2009 and month>10
     "queryText":"insert into table functional.alltypessmall (id, string_col, 
int_col)\npartition (year, month)\nselect id, string_col, int_col, year, 
month\nfrom functional_seq_snap.alltypes\nwhere year=2009 and month>10",
     "queryId":"0:0",
     "hash":"39ac95ce0632ef1ee8b474be644971f3",
-    "user":"dev",
-    "timestamp":1446159271,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -1480,8 +1480,8 @@ having min(id) > 10
     "queryText":"insert into table functional.alltypessmall\npartition 
(year=2009, month)\nselect min(id), min(bool_col), min(tinyint_col), 
min(smallint_col), min(int_col),\nmin(bigint_col), min(float_col), 
min(double_col), min(date_string_col), min(string_col),\nmin(timestamp_col), 
month\nfrom functional.alltypes\nwhere year=2009 and month>10\ngroup by 
month\nhaving min(id) > 10",
     "queryId":"0:0",
     "hash":"e6969c2cc67e9d6f3f985ddc6431f915",
-    "user":"dev",
-    "timestamp":1446159271,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -1767,8 +1767,8 @@ group by int_col, tinyint_col
     "queryText":"select\nmax(tinyint_col) over(partition by int_col)\nfrom 
functional.alltypes\ngroup by int_col, tinyint_col",
     "queryId":"0:0",
     "hash":"83c78528e6f5325c56a3f3521b08a78d",
-    "user":"dev",
-    "timestamp":1446159271,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -1814,8 +1814,8 @@ select int_col, rank() over(order by int_col) from 
functional.alltypesagg
     "queryText":"select int_col, rank() over(order by int_col) from 
functional.alltypesagg",
     "queryId":"0:0",
     "hash":"4f1ecaaed571d2ed9f09f091f399c311",
-    "user":"dev",
-    "timestamp":1446159272,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -1872,8 +1872,8 @@ order by a.tinyint_col, a.int_col
     "queryText":"select a.tinyint_col, a.int_col, count(a.double_col)\n  
over(partition by a.tinyint_col order by a.int_col desc rows between 1 
preceding and 1 following)\nfrom functional.alltypes a inner join 
functional.alltypessmall b on a.id = b.id\norder by a.tinyint_col, a.int_col",
     "queryId":"0:0",
     "hash":"b6e26c00b2ef17f0592ebadb0ecc21f6",
-    "user":"dev",
-    "timestamp":1446159272,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -1983,8 +1983,8 @@ order by 2, 3, 4
     "queryText":"with v2 as\n  (select\n   double_col,\n   count(int_col) 
over() a,\n   sum(int_col + bigint_col) over(partition by bool_col) b\n   
from\n     (select * from functional.alltypes) v1)\nselect double_col, a, b, a 
+ b, double_col + a from v2\norder by 2, 3, 4",
     "queryId":"0:0",
     "hash":"6bf993cea0d1ab9e613674ef178916c9",
-    "user":"dev",
-    "timestamp":1446159272,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -2115,8 +2115,8 @@ order by 2, 3, 4
     "queryText":"select double_col, a, b, a + b, double_col + a from\n  
(select\n   double_col,\n   count(int_col) over() a,\n   sum(int_col + 
bigint_col) over(partition by bool_col) b\n   from\n     (select * from 
functional.alltypes) v1) v2\norder by 2, 3, 4",
     "queryId":"0:0",
     "hash":"811403c86e86fe630dea7bd0a6c89273",
-    "user":"dev",
-    "timestamp":1446159272,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -2249,8 +2249,8 @@ where b.month = 1
     "queryText":"select a.month, a.year, b.int_col, b.month\nfrom\n  (select 
year, month from functional.alltypes\n   union all\n   select year, month from 
functional.alltypes) a\n  inner join\n  functional.alltypessmall b\n  on 
(a.month = b.month)\nwhere b.month = 1",
     "queryId":"0:0",
     "hash":"e3000cd5edf2a02e1f5407810f3cc09a",
-    "user":"dev",
-    "timestamp":1446159272,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -2357,8 +2357,8 @@ where month = 1
     "queryText":"select t1.int_col, t2.month, t2.int_col + 1\nfrom (\n  select 
int_col, count(*)\n  from functional.alltypessmall\n  where month = 1\n  group 
by int_col\n  having count(*) > 1\n  order by count(*) desc limit 5\n  ) 
t1\njoin functional.alltypes t2 on (t1.int_col = t2.int_col)\nwhere month = 1",
     "queryId":"0:0",
     "hash":"3f1ecf7239e205342aee4979e7cb4877",
-    "user":"dev",
-    "timestamp":1446159272,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -2459,8 +2459,8 @@ and x.int_col + x.float_col + cast(c.string_col as float) 
< 1000
     "queryText":"select x.smallint_col, x.id, x.tinyint_col, c.id, x.int_col, 
x.float_col, c.string_col\nfrom functional.alltypessmall c\njoin (\n   select 
a.smallint_col smallint_col, a.tinyint_col tinyint_col, a.day day,\n           
a.int_col int_col, a.month month, b.float_col float_col, b.id id\n   from ( 
select * from functional.alltypesagg a where month=1 ) a\n   join 
functional.alltypessmall b on (a.smallint_col = b.id)\n ) x on (x.tinyint_col = 
c.id)\nwhere x.day=1\nand x.int_col > 899\nand x.float_col > 4.5\nand 
c.string_col < '7'\nand x.int_col + x.float_col + cast(c.string_col as float) < 
1000",
     "queryId":"0:0",
     "hash":"4edf165aed5982ede63f7c91074f4b44",
-    "user":"dev",
-    "timestamp":1446159272,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -2636,8 +2636,8 @@ from
     "queryText":"select c1, c2, c3\nfrom\n  (select c1, c2, c3\n   from\n     
(select int_col c1, sum(float_col) c2, min(float_col) c3\n      from 
functional_hbase.alltypessmall\n      group by 1) x\n    order by 2,3 desc\n    
limit 5\n) y",
     "queryId":"0:0",
     "hash":"8b4d1ab11721d9ebdf26666d4195eb18",
-    "user":"dev",
-    "timestamp":1446159272,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -2730,8 +2730,8 @@ limit 0
     "queryText":"select c1, x2\nfrom (\n  select c1, min(c2) x2\n  from (\n    
select c1, c2, c3\n    from (\n      select int_col c1, tinyint_col c2, 
min(float_col) c3\n      from functional_hbase.alltypessmall\n      group by 1, 
2\n      order by 1,2\n      limit 1\n    ) x\n  ) x2\n  group by c1\n) 
y\norder by 2,1 desc\nlimit 0",
     "queryId":"0:0",
     "hash":"50d3b4f249f038b0711ea75c17640fc9",
-    "user":"dev",
-    "timestamp":1446159272,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -2794,8 +2794,8 @@ select int_col, string_col from functional.view_view
     "queryText":"select int_col, string_col from functional.view_view",
     "queryId":"0:0",
     "hash":"9073496459077de1332e5017977dedf5",
-    "user":"dev",
-    "timestamp":1446159272,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -2847,8 +2847,8 @@ where t.id < 10
     "queryText":"select t.id from (select id from functional.alltypes_view) 
t\nwhere t.id < 10",
     "queryId":"0:0",
     "hash":"8ba7998033f90e1e358f4fdc7ea4251b",
-    "user":"dev",
-    "timestamp":1446159272,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -2893,8 +2893,8 @@ where id in
     "queryText":"select string_col, float_col, bool_col\nfrom 
functional.alltypes\nwhere id in\n  (select id from functional.alltypesagg)",
     "queryId":"0:0",
     "hash":"e8ad1371d2a13e1ee9ec45689b62cdc9",
-    "user":"dev",
-    "timestamp":1446159272,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -2993,8 +2993,8 @@ and tinyint_col < 10
     "queryText":"select 1\nfrom functional.alltypesagg a\nwhere exists\n  
(select id, count(int_col) over (partition by bool_col)\n   from 
functional.alltypestiny b\n   where a.tinyint_col = b.tinyint_col\n   group by 
id, int_col, bool_col)\nand tinyint_col < 10",
     "queryId":"0:0",
     "hash":"a7500c022d29c583c31b287868a848bf",
-    "user":"dev",
-    "timestamp":1446159272,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -3044,8 +3044,8 @@ and a.bigint_col > 10
     "queryText":"select int_col + 1, tinyint_col - 1\nfrom functional.alltypes 
a\nwhere a.int_col <\n  (select max(int_col) from functional.alltypesagg g 
where g.bool_col = true)\nand a.bigint_col > 10",
     "queryId":"0:0",
     "hash":"5e6227f323793ea4441e2a3119af2f09",
-    "user":"dev",
-    "timestamp":1446159272,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -3125,8 +3125,8 @@ with t as (select int_col x, bigint_col y from 
functional.alltypes) select x, y
     "queryText":"with t as (select int_col x, bigint_col y from 
functional.alltypes) select x, y from t",
     "queryId":"0:0",
     "hash":"a7ab58d90540f28a8dfd69703632ad7a",
-    "user":"dev",
-    "timestamp":1446159272,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -3179,8 +3179,8 @@ select id, int_col, string_col, year, month from t1
     "queryText":"with t1 as (select * from functional.alltypestiny)\ninsert 
into functional.alltypesinsert (id, int_col, string_col) partition(year, 
month)\nselect id, int_col, string_col, year, month from t1",
     "queryId":"0:0",
     "hash":"0bc5b3e66cc72387f74893b1f1934946",
-    "user":"dev",
-    "timestamp":1446159272,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -3398,8 +3398,8 @@ from
     "queryText":"select lead(a) over (partition by b order by c)\nfrom\n  
(select lead(id) over (partition by int_col order by bigint_col) as a,\n   
max(id) over (partition by tinyint_col order by int_col) as b,\n   min(int_col) 
over (partition by string_col order by bool_col) as c\n   from 
functional.alltypes) v",
     "queryId":"0:0",
     "hash":"aa95e5e6f39fc80bb3c318a2515dc77d",
-    "user":"dev",
-    "timestamp":1446159272,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -3471,8 +3471,8 @@ create view test_view_lineage as select id from 
functional.alltypestiny
     "queryText":"create view test_view_lineage as select id from 
functional.alltypestiny",
     "queryId":"0:0",
     "hash":"ff6b1ecb265afe4f03355a07238cfe37",
-    "user":"dev",
-    "timestamp":1446159272,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -3521,8 +3521,8 @@ limit 0
     "queryText":"create view test_view_lineage (a, b) as select c1, x2\nfrom 
(\n  select c1, min(c2) x2\n  from (\n    select c1, c2, c3\n    from (\n      
select int_col c1, tinyint_col c2, min(float_col) c3\n      from 
functional_hbase.alltypessmall\n      group by 1, 2\n      order by 1,2\n      
limit 1\n    ) x\n  ) x2\n  group by c1\n) y\norder by 2,1 desc\nlimit 0",
     "queryId":"0:0",
     "hash":"b96adf892b897da1e562c5be98724fb5",
-    "user":"dev",
-    "timestamp":1446159272,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -3598,8 +3598,8 @@ create view test_view_lineage (a1, a2, a3, a4, a5, a6, 
a7) as
     "queryText":"create view test_view_lineage (a1, a2, a3, a4, a5, a6, a7) 
as\n  select x.smallint_col, x.id, x.tinyint_col, c.id, x.int_col, x.float_col, 
c.string_col\n  from functional.alltypessmall c\n  join (\n     select 
a.smallint_col smallint_col, a.tinyint_col tinyint_col, a.day day,\n           
a.int_col int_col, a.month month, b.float_col float_col, b.id id\n     from ( 
select * from functional.alltypesagg a where month=1 ) a\n     join 
functional.alltypessmall b on (a.smallint_col = b.id)\n   ) x on (x.tinyint_col 
= c.id)\n  where x.day=1\n  and x.int_col > 899\n  and x.float_col > 4.5\n  and 
c.string_col < '7'\n  and x.int_col + x.float_col + cast(c.string_col as float) 
< 1000",
     "queryId":"0:0",
     "hash":"ffbe643df8f26e92907fb45de1aeda36",
-    "user":"dev",
-    "timestamp":1446159272,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -3781,8 +3781,8 @@ create view test_view_lineage as
     "queryText":"create view test_view_lineage as\n  select * from (\n    
select sum(a.tinyint_col) over (partition by a.smallint_col order by a.id),\n   
   count(b.string_col), b.timestamp_col\n    from functional.alltypes a join 
functional.alltypessmall b on (a.id = b.id)\n    where a.year = 2010 and 
b.float_col > 0\n    group by a.tinyint_col, a.smallint_col, a.id, 
b.string_col, b.timestamp_col, b.bigint_col\n    having count(a.int_col) > 10\n 
   order by b.bigint_col limit 10) t",
     "queryId":"0:0",
     "hash":"d4b9e2d63548088f911816b2ae29d7c2",
-    "user":"dev",
-    "timestamp":1446159272,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -3918,8 +3918,8 @@ alter view functional.alltypes_view as select id from 
functional.alltypestiny
     "queryText":"alter view functional.alltypes_view as select id from 
functional.alltypestiny",
     "queryId":"0:0",
     "hash":"8c9367afc562a4c04d2d40e1276646c2",
-    "user":"dev",
-    "timestamp":1446159272,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -3959,8 +3959,8 @@ select * from (
     "queryText":"select * from (\n  select int_struct_col.f1 + 
int_struct_col.f2 x from functional.allcomplextypes\n  where year = 2000\n  
order by nested_struct_col.f2.f12.f21 limit 10\n  union all\n  select sum(f1) y 
from\n    (select complex_struct_col.f1 f1 from functional.allcomplextypes\n    
 group by 1) v1) v2",
     "queryId":"0:0",
     "hash":"4fb3ceddbf596097335af607d528f5a7",
-    "user":"dev",
-    "timestamp":1446159272,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -4027,8 +4027,8 @@ select * from functional.allcomplextypes.int_array_col a 
inner join
     "queryText":"select * from functional.allcomplextypes.int_array_col a 
inner join\n  functional.allcomplextypes.struct_map_col m on (a.item = m.f1)",
     "queryId":"0:0",
     "hash":"8c0c64f8a4c08b82ad343ab439101957",
-    "user":"dev",
-    "timestamp":1446159272,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -4133,8 +4133,8 @@ select * from functional.allcomplextypes t, 
t.int_array_col a, t.struct_map_col
     "queryText":"select * from functional.allcomplextypes t, t.int_array_col 
a, t.struct_map_col m\n  where a.item = m.f1",
     "queryId":"0:0",
     "hash":"1b0db371b32e90d33629ed7779332cf7",
-    "user":"dev",
-    "timestamp":1446159272,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -4318,8 +4318,8 @@ select a + b as ab, c, d, e from 
functional.allcomplextypes t,
     "queryText":"select a + b as ab, c, d, e from functional.allcomplextypes 
t,\n  (select sum(item) a from t.int_array_col\n   where item < 10) v1,\n  
(select count(f1) b from t.struct_map_col\n   group by key) v2,\n  (select 
avg(value) over(partition by key) c from t.map_map_col.value) v3,\n  (select 
item d from t.int_array_col\n   union all\n   select value from t.int_map_col) 
v4,\n  (select f21 e from t.complex_nested_struct_col.f2.f12 order by key limit 
10) v5",
     "queryId":"0:0",
     "hash":"4affc0d1e384475d1ff2fc2e19643064",
-    "user":"dev",
-    "timestamp":1446159272,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -4456,8 +4456,8 @@ where not exists (select 1 from functional.alltypes a 
where v.id = a.id)
     "queryText":"create view test_view_lineage as\nselect id from 
functional.alltypes_view v\nwhere not exists (select 1 from functional.alltypes 
a where v.id = a.id)",
     "queryId":"0:0",
     "hash":"e79b8abc8a682d9e0f6b2c30a6c885f3",
-    "user":"dev",
-    "timestamp":1475094005,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -4500,8 +4500,8 @@ where k.int_col < 10
     "queryText":"select count(*) from functional_kudu.alltypes k join 
functional.alltypes h on k.id = h.id\nwhere k.int_col < 10",
     "queryId":"0:0",
     "hash":"7b7c92d488186d869bb6b78c97666f41",
-    "user":"dev",
-    "timestamp":1479538352,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -4555,8 +4555,8 @@ functional.alltypes a where a.id < 100
     "queryText":"insert into functional_kudu.testtbl select id, string_col as 
name, int_col as zip from\nfunctional.alltypes a where a.id < 100",
     "queryId":"0:0",
     "hash":"87a59bac56c6ad27f7af6e71af46d552",
-    "user":"dev",
-    "timestamp":1479539012,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -4639,8 +4639,8 @@ functional.alltypes where id < 10
     "queryText":"insert into functional_kudu.testtbl (name, id) select 
string_col as name, id from\nfunctional.alltypes where id < 10",
     "queryId":"0:0",
     "hash":"0bccfdbf4118e6d5a3d94062ecb5130a",
-    "user":"dev",
-    "timestamp":1479933751,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -4703,8 +4703,8 @@ functional.alltypes where id < 10
     "queryText":"upsert into functional_kudu.testtbl (name, id) select 
string_col as name, id from\nfunctional.alltypes where id < 10",
     "queryId":"0:0",
     "hash":"f4c1e7b016e75012f7268f2f42ae5630",
-    "user":"dev",
-    "timestamp":1479933751,
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -4768,9 +4768,9 @@ from functional.alltypestiny
 {
     "queryText":"create table kudu_ctas primary key (id) partition by hash 
(id) partitions 3\nstored as kudu as select id, bool_col, tinyint_col, 
smallint_col, int_col,\nbigint_col, float_col, double_col, date_string_col, 
string_col\nfrom functional.alltypestiny",
     "queryId":"0:0",
-    "hash":"6e3e192c7fb8bb6b22674a9b7b488b55",
-    "user":"dev",
-    "timestamp":1479933751,
+    "hash":"de98b09af6b6ab0f0678c5fc0c4369b4",
+    "user":"progers",
+    "timestamp":1546590135,
     "edges":[
         {
             "sources":[
@@ -4967,9 +4967,3 @@ from functional.alltypestiny
     ]
 }
 ====
-# No lineage should be generated for UPDATE
-update functional_kudu.alltypes set int_col = 1 where id = 1
-====
-# No lineage should be generated from DELETE
-delete from functional_kudu.alltypes where id = 1
-====

http://git-wip-us.apache.org/repos/asf/impala/blob/a7ea86b7/testdata/workloads/functional-planner/queries/PlannerTest/max-row-size.test
----------------------------------------------------------------------
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/max-row-size.test 
b/testdata/workloads/functional-planner/queries/PlannerTest/max-row-size.test
index 0ffe8af..34c4938 100644
--- 
a/testdata/workloads/functional-planner/queries/PlannerTest/max-row-size.test
+++ 
b/testdata/workloads/functional-planner/queries/PlannerTest/max-row-size.test
@@ -18,7 +18,7 @@ PLAN-ROOT SINK
 |
 04:EXCHANGE [UNPARTITIONED]
 |  mem-estimate=10.33MB mem-reservation=0B thread-reservation=0
-|  tuple-ids=0,1 row-size=327B cardinality=150000
+|  tuple-ids=0,1 row-size=327B cardinality=150.00K
 |  in pipelines: 00(GETNEXT)
 |
 F00:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
@@ -28,7 +28,7 @@ Per-Host Resources: mem-estimate=41.95MB 
mem-reservation=33.94MB thread-reservat
 |  fk/pk conjuncts: c_nationkey = n_nationkey
 |  runtime filters: RF000[bloom] <- n_nationkey
 |  mem-estimate=16.94MB mem-reservation=16.94MB spill-buffer=64.00KB 
thread-reservation=0
-|  tuple-ids=0,1 row-size=327B cardinality=150000
+|  tuple-ids=0,1 row-size=327B cardinality=150.00K
 |  in pipelines: 00(GETNEXT), 01(OPEN)
 |
 |--03:EXCHANGE [BROADCAST]
@@ -56,7 +56,7 @@ Per-Host Resources: mem-estimate=41.95MB 
mem-reservation=33.94MB thread-reservat
      columns: all
    extrapolated-rows=disabled max-scan-range-rows=150000
    mem-estimate=24.00MB mem-reservation=16.00MB thread-reservation=1
-   tuple-ids=0 row-size=218B cardinality=150000
+   tuple-ids=0 row-size=218B cardinality=150.00K
    in pipelines: 00(GETNEXT)
 ====
 # Join with large build side.
@@ -79,7 +79,7 @@ PLAN-ROOT SINK
 |
 04:EXCHANGE [UNPARTITIONED]
 |  mem-estimate=11.20MB mem-reservation=0B thread-reservation=0
-|  tuple-ids=0,1N row-size=402B cardinality=6001215
+|  tuple-ids=0,1N row-size=402B cardinality=6.00M
 |  in pipelines: 00(GETNEXT)
 |
 F00:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
@@ -88,12 +88,12 @@ Per-Host Resources: mem-estimate=359.29MB 
mem-reservation=86.00MB thread-reserva
 |  hash predicates: l_orderkey = o_orderkey
 |  fk/pk conjuncts: l_orderkey = o_orderkey
 |  mem-estimate=268.94MB mem-reservation=46.00MB spill-buffer=2.00MB 
thread-reservation=0
-|  tuple-ids=0,1N row-size=402B cardinality=6001215
+|  tuple-ids=0,1N row-size=402B cardinality=6.00M
 |  in pipelines: 00(GETNEXT), 01(OPEN)
 |
 |--03:EXCHANGE [BROADCAST]
 |  |  mem-estimate=10.34MB mem-reservation=0B thread-reservation=0
-|  |  tuple-ids=1 row-size=171B cardinality=1500000
+|  |  tuple-ids=1 row-size=171B cardinality=1.50M
 |  |  in pipelines: 01(GETNEXT)
 |  |
 |  F01:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
@@ -103,19 +103,19 @@ Per-Host Resources: mem-estimate=359.29MB 
mem-reservation=86.00MB thread-reserva
 |     stored statistics:
 |       table: rows=1500000 size=54.07MB
 |       columns: all
-|     extrapolated-rows=disabled max-scan-range-rows=1177135
+|     extrapolated-rows=disabled max-scan-range-rows=1177136
 |     mem-estimate=40.00MB mem-reservation=24.00MB thread-reservation=1
-|     tuple-ids=1 row-size=171B cardinality=1500000
+|     tuple-ids=1 row-size=171B cardinality=1.50M
 |     in pipelines: 01(GETNEXT)
 |
 00:SCAN HDFS [tpch_parquet.lineitem, RANDOM]
-   partitions=1/1 files=3 size=193.72MB
+   partitions=1/1 files=3 size=193.60MB
    stored statistics:
-     table: rows=6001215 size=193.72MB
+     table: rows=6001215 size=193.60MB
      columns: all
-   extrapolated-rows=disabled max-scan-range-rows=2141609
+   extrapolated-rows=disabled max-scan-range-rows=2141702
    mem-estimate=80.00MB mem-reservation=40.00MB thread-reservation=1
-   tuple-ids=0 row-size=231B cardinality=6001215
+   tuple-ids=0 row-size=231B cardinality=6.00M
    in pipelines: 00(GETNEXT)
 ====
 # Null-aware anti-join with medium build side.
@@ -136,7 +136,7 @@ PLAN-ROOT SINK
 |
 04:EXCHANGE [UNPARTITIONED]
 |  mem-estimate=10.69MB mem-reservation=0B thread-reservation=0
-|  tuple-ids=0 row-size=231B cardinality=6001215
+|  tuple-ids=0 row-size=231B cardinality=6.00M
 |  in pipelines: 00(GETNEXT)
 |
 F00:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
@@ -144,12 +144,12 @@ Per-Host Resources: mem-estimate=124.02MB 
mem-reservation=74.00MB thread-reserva
 02:HASH JOIN [NULL AWARE LEFT ANTI JOIN, BROADCAST]
 |  hash predicates: l_orderkey = o_orderkey
 |  mem-estimate=34.00MB mem-reservation=34.00MB spill-buffer=1.00MB 
thread-reservation=0
-|  tuple-ids=0 row-size=231B cardinality=6001215
+|  tuple-ids=0 row-size=231B cardinality=6.00M
 |  in pipelines: 00(GETNEXT), 01(OPEN)
 |
 |--03:EXCHANGE [BROADCAST]
 |  |  mem-estimate=10.02MB mem-reservation=0B thread-reservation=0
-|  |  tuple-ids=1 row-size=8B cardinality=1500000
+|  |  tuple-ids=1 row-size=8B cardinality=1.50M
 |  |  in pipelines: 01(GETNEXT)
 |  |
 |  F01:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
@@ -159,19 +159,19 @@ Per-Host Resources: mem-estimate=124.02MB 
mem-reservation=74.00MB thread-reserva
 |     stored statistics:
 |       table: rows=1500000 size=54.07MB
 |       columns: all
-|     extrapolated-rows=disabled max-scan-range-rows=1177135
+|     extrapolated-rows=disabled max-scan-range-rows=1177136
 |     mem-estimate=40.00MB mem-reservation=4.00MB thread-reservation=1
-|     tuple-ids=1 row-size=8B cardinality=1500000
+|     tuple-ids=1 row-size=8B cardinality=1.50M
 |     in pipelines: 01(GETNEXT)
 |
 00:SCAN HDFS [tpch_parquet.lineitem, RANDOM]
-   partitions=1/1 files=3 size=193.72MB
+   partitions=1/1 files=3 size=193.60MB
    stored statistics:
-     table: rows=6001215 size=193.72MB
+     table: rows=6001215 size=193.60MB
      columns: all
-   extrapolated-rows=disabled max-scan-range-rows=2141609
+   extrapolated-rows=disabled max-scan-range-rows=2141702
    mem-estimate=80.00MB mem-reservation=40.00MB thread-reservation=1
-   tuple-ids=0 row-size=231B cardinality=6001215
+   tuple-ids=0 row-size=231B cardinality=6.00M
    in pipelines: 00(GETNEXT)
 ====
 # Mid NDV aggregation.
@@ -197,7 +197,7 @@ PLAN-ROOT SINK
 |
 08:EXCHANGE [UNPARTITIONED]
 |  mem-estimate=10.10MB mem-reservation=0B thread-reservation=0
-|  tuple-ids=2 row-size=29B cardinality=4690314
+|  tuple-ids=2 row-size=29B cardinality=4.69M
 |  in pipelines: 07(GETNEXT)
 |
 F03:PLAN FRAGMENT [HASH(l_orderkey,o_orderstatus)] hosts=3 instances=3
@@ -207,12 +207,12 @@ Per-Host Resources: mem-estimate=41.10MB 
mem-reservation=31.00MB thread-reservat
 |  group by: l_orderkey, o_orderstatus
 |  having: count(*) = CAST(1 AS BIGINT)
 |  mem-estimate=31.00MB mem-reservation=31.00MB spill-buffer=1.00MB 
thread-reservation=0
-|  tuple-ids=2 row-size=29B cardinality=4690314
+|  tuple-ids=2 row-size=29B cardinality=4.69M
 |  in pipelines: 07(GETNEXT), 00(OPEN)
 |
 06:EXCHANGE [HASH(l_orderkey,o_orderstatus)]
 |  mem-estimate=10.10MB mem-reservation=0B thread-reservation=0
-|  tuple-ids=2 row-size=29B cardinality=4690314
+|  tuple-ids=2 row-size=29B cardinality=4.69M
 |  in pipelines: 00(GETNEXT)
 |
 F02:PLAN FRAGMENT [HASH(l_orderkey)] hosts=3 instances=3
@@ -221,7 +221,7 @@ Per-Host Resources: mem-estimate=99.65MB 
mem-reservation=66.00MB thread-reservat
 |  output: count(*)
 |  group by: l_orderkey, o_orderstatus
 |  mem-estimate=47.56MB mem-reservation=34.00MB spill-buffer=2.00MB 
thread-reservation=0
-|  tuple-ids=2 row-size=29B cardinality=4690314
+|  tuple-ids=2 row-size=29B cardinality=4.69M
 |  in pipelines: 00(GETNEXT)
 |
 02:HASH JOIN [INNER JOIN, PARTITIONED]
@@ -229,12 +229,12 @@ Per-Host Resources: mem-estimate=99.65MB 
mem-reservation=66.00MB thread-reservat
 |  fk/pk conjuncts: l_orderkey = o_orderkey
 |  runtime filters: RF000[bloom] <- o_orderkey
 |  mem-estimate=31.00MB mem-reservation=31.00MB spill-buffer=1.00MB 
thread-reservation=0
-|  tuple-ids=0,1 row-size=29B cardinality=5757710
+|  tuple-ids=0,1 row-size=29B cardinality=5.76M
 |  in pipelines: 00(GETNEXT), 01(OPEN)
 |
 |--05:EXCHANGE [HASH(o_orderkey)]
 |  |  mem-estimate=10.05MB mem-reservation=0B thread-reservation=0
-|  |  tuple-ids=1 row-size=21B cardinality=1500000
+|  |  tuple-ids=1 row-size=21B cardinality=1.50M
 |  |  in pipelines: 01(GETNEXT)
 |  |
 |  F01:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
@@ -244,27 +244,27 @@ Per-Host Resources: mem-estimate=99.65MB 
mem-reservation=66.00MB thread-reservat
 |     stored statistics:
 |       table: rows=1500000 size=54.07MB
 |       columns: all
-|     extrapolated-rows=disabled max-scan-range-rows=1177135
+|     extrapolated-rows=disabled max-scan-range-rows=1177136
 |     mem-estimate=40.00MB mem-reservation=8.00MB thread-reservation=1
-|     tuple-ids=1 row-size=21B cardinality=1500000
+|     tuple-ids=1 row-size=21B cardinality=1.50M
 |     in pipelines: 01(GETNEXT)
 |
 04:EXCHANGE [HASH(l_orderkey)]
 |  mem-estimate=10.04MB mem-reservation=0B thread-reservation=0
-|  tuple-ids=0 row-size=8B cardinality=6001215
+|  tuple-ids=0 row-size=8B cardinality=6.00M
 |  in pipelines: 00(GETNEXT)
 |
 F00:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 Per-Host Resources: mem-estimate=81.00MB mem-reservation=5.00MB 
thread-reservation=2 runtime-filters-memory=1.00MB
 00:SCAN HDFS [tpch_parquet.lineitem, RANDOM]
-   partitions=1/1 files=3 size=193.72MB
+   partitions=1/1 files=3 size=193.60MB
    runtime filters: RF000[bloom] -> l_orderkey
    stored statistics:
-     table: rows=6001215 size=193.72MB
+     table: rows=6001215 size=193.60MB
      columns: all
-   extrapolated-rows=disabled max-scan-range-rows=2141609
+   extrapolated-rows=disabled max-scan-range-rows=2141702
    mem-estimate=80.00MB mem-reservation=4.00MB thread-reservation=1
-   tuple-ids=0 row-size=8B cardinality=6001215
+   tuple-ids=0 row-size=8B cardinality=6.00M
    in pipelines: 00(GETNEXT)
 ====
 # High NDV aggregation.
@@ -283,7 +283,7 @@ PLAN-ROOT SINK
 |
 04:EXCHANGE [UNPARTITIONED]
 |  mem-estimate=10.69MB mem-reservation=0B thread-reservation=0
-|  tuple-ids=1 row-size=231B cardinality=6001215
+|  tuple-ids=1 row-size=231B cardinality=6.00M
 |  in pipelines: 03(GETNEXT)
 |
 F01:PLAN FRAGMENT 
[HASH(tpch_parquet.lineitem.l_orderkey,tpch_parquet.lineitem.l_partkey,tpch_parquet.lineitem.l_suppkey,tpch_parquet.lineitem.l_linenumber,tpch_parquet.lineitem.l_quantity,tpch_parquet.lineitem.l_extendedprice,tpch_parquet.lineitem.l_discount,tpch_parquet.lineitem.l_tax,tpch_parquet.lineitem.l_returnflag,tpch_parquet.lineitem.l_linestatus,tpch_parquet.lineitem.l_shipdate,tpch_parquet.lineitem.l_commitdate,tpch_parquet.lineitem.l_receiptdate,tpch_parquet.lineitem.l_shipinstruct,tpch_parquet.lineitem.l_shipmode,tpch_parquet.lineitem.l_comment)]
 hosts=3 instances=3
@@ -291,12 +291,12 @@ Per-Host Resources: mem-estimate=737.12MB 
mem-reservation=46.00MB thread-reserva
 03:AGGREGATE [FINALIZE]
 |  group by: tpch_parquet.lineitem.l_orderkey, 
tpch_parquet.lineitem.l_partkey, tpch_parquet.lineitem.l_suppkey, 
tpch_parquet.lineitem.l_linenumber, tpch_parquet.lineitem.l_quantity, 
tpch_parquet.lineitem.l_extendedprice, tpch_parquet.lineitem.l_discount, 
tpch_parquet.lineitem.l_tax, tpch_parquet.lineitem.l_returnflag, 
tpch_parquet.lineitem.l_linestatus, tpch_parquet.lineitem.l_shipdate, 
tpch_parquet.lineitem.l_commitdate, tpch_parquet.lineitem.l_receiptdate, 
tpch_parquet.lineitem.l_shipinstruct, tpch_parquet.lineitem.l_shipmode, 
tpch_parquet.lineitem.l_comment
 |  mem-estimate=726.43MB mem-reservation=46.00MB spill-buffer=2.00MB 
thread-reservation=0
-|  tuple-ids=1 row-size=231B cardinality=6001215
+|  tuple-ids=1 row-size=231B cardinality=6.00M
 |  in pipelines: 03(GETNEXT), 00(OPEN)
 |
 02:EXCHANGE 
[HASH(tpch_parquet.lineitem.l_orderkey,tpch_parquet.lineitem.l_partkey,tpch_parquet.lineitem.l_suppkey,tpch_parquet.lineitem.l_linenumber,tpch_parquet.lineitem.l_quantity,tpch_parquet.lineitem.l_extendedprice,tpch_parquet.lineitem.l_discount,tpch_parquet.lineitem.l_tax,tpch_parquet.lineitem.l_returnflag,tpch_parquet.lineitem.l_linestatus,tpch_parquet.lineitem.l_shipdate,tpch_parquet.lineitem.l_commitdate,tpch_parquet.lineitem.l_receiptdate,tpch_parquet.lineitem.l_shipinstruct,tpch_parquet.lineitem.l_shipmode,tpch_parquet.lineitem.l_comment)]
 |  mem-estimate=10.69MB mem-reservation=0B thread-reservation=0
-|  tuple-ids=1 row-size=231B cardinality=6001215
+|  tuple-ids=1 row-size=231B cardinality=6.00M
 |  in pipelines: 00(GETNEXT)
 |
 F00:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
@@ -304,17 +304,17 @@ Per-Host Resources: mem-estimate=806.43MB 
mem-reservation=74.00MB thread-reserva
 01:AGGREGATE [STREAMING]
 |  group by: tpch_parquet.lineitem.l_orderkey, 
tpch_parquet.lineitem.l_partkey, tpch_parquet.lineitem.l_suppkey, 
tpch_parquet.lineitem.l_linenumber, tpch_parquet.lineitem.l_quantity, 
tpch_parquet.lineitem.l_extendedprice, tpch_parquet.lineitem.l_discount, 
tpch_parquet.lineitem.l_tax, tpch_parquet.lineitem.l_returnflag, 
tpch_parquet.lineitem.l_linestatus, tpch_parquet.lineitem.l_shipdate, 
tpch_parquet.lineitem.l_commitdate, tpch_parquet.lineitem.l_receiptdate, 
tpch_parquet.lineitem.l_shipinstruct, tpch_parquet.lineitem.l_shipmode, 
tpch_parquet.lineitem.l_comment
 |  mem-estimate=726.43MB mem-reservation=34.00MB spill-buffer=2.00MB 
thread-reservation=0
-|  tuple-ids=1 row-size=231B cardinality=6001215
+|  tuple-ids=1 row-size=231B cardinality=6.00M
 |  in pipelines: 00(GETNEXT)
 |
 00:SCAN HDFS [tpch_parquet.lineitem, RANDOM]
-   partitions=1/1 files=3 size=193.72MB
+   partitions=1/1 files=3 size=193.60MB
    stored statistics:
-     table: rows=6001215 size=193.72MB
+     table: rows=6001215 size=193.60MB
      columns: all
-   extrapolated-rows=disabled max-scan-range-rows=2141609
+   extrapolated-rows=disabled max-scan-range-rows=2141702
    mem-estimate=80.00MB mem-reservation=40.00MB thread-reservation=1
-   tuple-ids=0 row-size=231B cardinality=6001215
+   tuple-ids=0 row-size=231B cardinality=6.00M
    in pipelines: 00(GETNEXT)
 ====
 # High NDV aggregation with string aggregation function.
@@ -335,7 +335,7 @@ PLAN-ROOT SINK
 |
 04:EXCHANGE [UNPARTITIONED]
 |  mem-estimate=10.09MB mem-reservation=0B thread-reservation=0
-|  tuple-ids=1 row-size=28B cardinality=6001215
+|  tuple-ids=1 row-size=28B cardinality=6.00M
 |  in pipelines: 03(GETNEXT)
 |
 F01:PLAN FRAGMENT [HASH(l_orderkey,l_partkey)] hosts=3 instances=3
@@ -344,12 +344,12 @@ Per-Host Resources: mem-estimate=98.23MB 
mem-reservation=48.00MB thread-reservat
 |  output: group_concat:merge(l_linestatus, ',')
 |  group by: l_orderkey, l_partkey
 |  mem-estimate=88.14MB mem-reservation=48.00MB spill-buffer=2.00MB 
thread-reservation=0
-|  tuple-ids=1 row-size=28B cardinality=6001215
+|  tuple-ids=1 row-size=28B cardinality=6.00M
 |  in pipelines: 03(GETNEXT), 00(OPEN)
 |
 02:EXCHANGE [HASH(l_orderkey,l_partkey)]
 |  mem-estimate=10.09MB mem-reservation=0B thread-reservation=0
-|  tuple-ids=1 row-size=28B cardinality=6001215
+|  tuple-ids=1 row-size=28B cardinality=6.00M
 |  in pipelines: 00(GETNEXT)
 |
 F00:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
@@ -358,17 +358,17 @@ Per-Host Resources: mem-estimate=168.14MB 
mem-reservation=50.00MB thread-reserva
 |  output: group_concat(l_linestatus, ',')
 |  group by: l_orderkey, l_partkey
 |  mem-estimate=88.14MB mem-reservation=34.00MB spill-buffer=2.00MB 
thread-reservation=0
-|  tuple-ids=1 row-size=28B cardinality=6001215
+|  tuple-ids=1 row-size=28B cardinality=6.00M
 |  in pipelines: 00(GETNEXT)
 |
 00:SCAN HDFS [tpch_parquet.lineitem, RANDOM]
-   partitions=1/1 files=3 size=193.72MB
+   partitions=1/1 files=3 size=193.60MB
    stored statistics:
-     table: rows=6001215 size=193.72MB
+     table: rows=6001215 size=193.60MB
      columns: all
-   extrapolated-rows=disabled max-scan-range-rows=2141609
+   extrapolated-rows=disabled max-scan-range-rows=2141702
    mem-estimate=80.00MB mem-reservation=16.00MB thread-reservation=1
-   tuple-ids=0 row-size=29B cardinality=6001215
+   tuple-ids=0 row-size=29B cardinality=6.00M
    in pipelines: 00(GETNEXT)
 ====
 # Sort + Analytic.
@@ -389,7 +389,7 @@ PLAN-ROOT SINK
 |
 04:EXCHANGE [UNPARTITIONED]
 |  mem-estimate=56.26KB mem-reservation=0B thread-reservation=0
-|  tuple-ids=3,2 row-size=6B cardinality=7300
+|  tuple-ids=3,2 row-size=6B cardinality=7.30K
 |  in pipelines: 01(GETNEXT)
 |
 F01:PLAN FRAGMENT [HASH(int_col)] hosts=3 instances=3
@@ -398,18 +398,18 @@ Per-Host Resources: mem-estimate=40.04MB 
mem-reservation=40.00MB thread-reservat
 |  functions: max(tinyint_col)
 |  partition by: int_col
 |  mem-estimate=16.00MB mem-reservation=16.00MB spill-buffer=8.00MB 
thread-reservation=0
-|  tuple-ids=3,2 row-size=6B cardinality=7300
+|  tuple-ids=3,2 row-size=6B cardinality=7.30K
 |  in pipelines: 01(GETNEXT)
 |
 01:SORT
 |  order by: int_col ASC NULLS FIRST
 |  mem-estimate=24.00MB mem-reservation=24.00MB spill-buffer=8.00MB 
thread-reservation=0
-|  tuple-ids=3 row-size=5B cardinality=7300
+|  tuple-ids=3 row-size=5B cardinality=7.30K
 |  in pipelines: 01(GETNEXT), 00(OPEN)
 |
 03:EXCHANGE [HASH(int_col)]
 |  mem-estimate=38.88KB mem-reservation=0B thread-reservation=0
-|  tuple-ids=0 row-size=5B cardinality=7300
+|  tuple-ids=0 row-size=5B cardinality=7.30K
 |  in pipelines: 00(GETNEXT)
 |
 F00:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
@@ -422,6 +422,6 @@ Per-Host Resources: mem-estimate=16.00MB 
mem-reservation=32.00KB thread-reservat
      columns: all
    extrapolated-rows=disabled max-scan-range-rows=310
    mem-estimate=16.00MB mem-reservation=32.00KB thread-reservation=1
-   tuple-ids=0 row-size=5B cardinality=7300
+   tuple-ids=0 row-size=5B cardinality=7.30K
    in pipelines: 00(GETNEXT)
 ====

http://git-wip-us.apache.org/repos/asf/impala/blob/a7ea86b7/testdata/workloads/functional-planner/queries/PlannerTest/mem-limit-broadcast-join.test
----------------------------------------------------------------------
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/mem-limit-broadcast-join.test
 
b/testdata/workloads/functional-planner/queries/PlannerTest/mem-limit-broadcast-join.test
index 689e78a..e6f0d7d 100644
--- 
a/testdata/workloads/functional-planner/queries/PlannerTest/mem-limit-broadcast-join.test
+++ 
b/testdata/workloads/functional-planner/queries/PlannerTest/mem-limit-broadcast-join.test
@@ -9,13 +9,16 @@ PLAN-ROOT SINK
 02:HASH JOIN [INNER JOIN, BROADCAST]
 |  hash predicates: n1.n_regionkey = n2.n_regionkey
 |  runtime filters: RF000 <- n2.n_regionkey
+|  row-size=219B cardinality=125
 |
 |--03:EXCHANGE [BROADCAST]
 |  |
 |  01:SCAN HDFS [tpch.nation n2]
 |     partitions=1/1 files=1 size=2.15KB
+|     row-size=109B cardinality=25
 |
 00:SCAN HDFS [tpch.nation n1]
    partitions=1/1 files=1 size=2.15KB
    runtime filters: RF000 -> n1.n_regionkey
+   row-size=109B cardinality=25
 ====

http://git-wip-us.apache.org/repos/asf/impala/blob/a7ea86b7/testdata/workloads/functional-planner/queries/PlannerTest/min-max-runtime-filters.test
----------------------------------------------------------------------
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/min-max-runtime-filters.test
 
b/testdata/workloads/functional-planner/queries/PlannerTest/min-max-runtime-filters.test
index 0ddccdc..0a63ef6 100644
--- 
a/testdata/workloads/functional-planner/queries/PlannerTest/min-max-runtime-filters.test
+++ 
b/testdata/workloads/functional-planner/queries/PlannerTest/min-max-runtime-filters.test
@@ -18,7 +18,7 @@ PLAN-ROOT SINK
 |  fk/pk conjuncts: none
 |  runtime filters: RF002[min_max] <- b.string_col, RF003[min_max] <- 
b.tinyint_col + 1
 |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB 
thread-reservation=0
-|  tuple-ids=0,1 row-size=39B cardinality=5840
+|  tuple-ids=0,1 row-size=39B cardinality=5.84K
 |  in pipelines: 00(GETNEXT), 01(OPEN)
 |
 |--01:SCAN KUDU [functional_kudu.alltypestiny b]
@@ -29,7 +29,7 @@ PLAN-ROOT SINK
 00:SCAN KUDU [functional_kudu.alltypes a]
    runtime filters: RF002[min_max] -> a.string_col, RF003[min_max] -> a.int_col
    mem-estimate=1.50MB mem-reservation=0B thread-reservation=1
-   tuple-ids=0 row-size=21B cardinality=7300
+   tuple-ids=0 row-size=21B cardinality=7.30K
    in pipelines: 00(GETNEXT)
 ====
 # Filters are not created if the target isn't a bare Kudu column or if 'is 
(not) distinct'
@@ -55,7 +55,7 @@ PLAN-ROOT SINK
 |  fk/pk conjuncts: assumed fk/pk
 |  other predicates: a.string_col IS DISTINCT FROM b.string_col
 |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB 
thread-reservation=0
-|  tuple-ids=0,1 row-size=44B cardinality=7300
+|  tuple-ids=0,1 row-size=44B cardinality=7.30K
 |  in pipelines: 00(GETNEXT), 01(OPEN)
 |
 |--01:SCAN KUDU [functional_kudu.alltypestiny b]
@@ -65,7 +65,7 @@ PLAN-ROOT SINK
 |
 00:SCAN KUDU [functional_kudu.alltypes a]
    mem-estimate=2.25MB mem-reservation=0B thread-reservation=1
-   tuple-ids=0 row-size=22B cardinality=7300
+   tuple-ids=0 row-size=22B cardinality=7.30K
    in pipelines: 00(GETNEXT)
 ====
 # Filters are only assigned when the target expr is cast if its an implicit 
integer cast.
@@ -91,7 +91,7 @@ PLAN-ROOT SINK
 |  fk/pk conjuncts: a.string_col = b.timestamp_col, a.tinyint_col = 
b.bigint_col
 |  runtime filters: RF007[min_max] <- b.bigint_col
 |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB 
thread-reservation=0
-|  tuple-ids=0,1 row-size=60B cardinality=1460
+|  tuple-ids=0,1 row-size=60B cardinality=1.46K
 |  in pipelines: 00(GETNEXT), 01(OPEN)
 |
 |--01:SCAN KUDU [functional_kudu.alltypestiny b]
@@ -102,7 +102,7 @@ PLAN-ROOT SINK
 00:SCAN KUDU [functional_kudu.alltypes a]
    runtime filters: RF007[min_max] -> a.tinyint_col
    mem-estimate=3.00MB mem-reservation=0B thread-reservation=1
-   tuple-ids=0 row-size=26B cardinality=7300
+   tuple-ids=0 row-size=26B cardinality=7.30K
    in pipelines: 00(GETNEXT)
 ====
 # Query with both Kudu and HDFS filter targets.
@@ -126,12 +126,12 @@ PLAN-ROOT SINK
 |  fk/pk conjuncts: none
 |  runtime filters: RF000[bloom] <- c.int_col, RF001[min_max] <- c.int_col
 |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB 
thread-reservation=0
-|  tuple-ids=0,1,2 row-size=12B cardinality=5329000
+|  tuple-ids=0,1,2 row-size=12B cardinality=5.33M
 |  in pipelines: 00(GETNEXT), 02(OPEN)
 |
 |--02:SCAN KUDU [functional_kudu.alltypes c]
 |     mem-estimate=768.00KB mem-reservation=0B thread-reservation=1
-|     tuple-ids=2 row-size=4B cardinality=7300
+|     tuple-ids=2 row-size=4B cardinality=7.30K
 |     in pipelines: 02(GETNEXT)
 |
 03:HASH JOIN [INNER JOIN]
@@ -139,11 +139,11 @@ PLAN-ROOT SINK
 |  fk/pk conjuncts: assumed fk/pk
 |  runtime filters: RF003[min_max] <- b.int_col
 |  mem-estimate=2.00GB mem-reservation=34.00MB spill-buffer=2.00MB 
thread-reservation=0
-|  tuple-ids=0,1 row-size=8B cardinality=7300
+|  tuple-ids=0,1 row-size=8B cardinality=7.30K
 |  in pipelines: 00(GETNEXT), 01(OPEN)
 |
 |--01:SCAN HDFS [functional_parquet.alltypes b]
-|     partitions=24/24 files=24 size=199.69KB
+|     partitions=24/24 files=24 size=189.28KB
 |     runtime filters: RF000[bloom] -> b.int_col
 |     stored statistics:
 |       table: rows=unavailable size=unavailable
@@ -157,6 +157,6 @@ PLAN-ROOT SINK
 00:SCAN KUDU [functional_kudu.alltypes a]
    runtime filters: RF001[min_max] -> a.int_col, RF003[min_max] -> a.int_col
    mem-estimate=768.00KB mem-reservation=0B thread-reservation=1
-   tuple-ids=0 row-size=4B cardinality=7300
+   tuple-ids=0 row-size=4B cardinality=7.30K
    in pipelines: 00(GETNEXT)
 ====

http://git-wip-us.apache.org/repos/asf/impala/blob/a7ea86b7/testdata/workloads/functional-planner/queries/PlannerTest/mt-dop-validation.test
----------------------------------------------------------------------
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/mt-dop-validation.test
 
b/testdata/workloads/functional-planner/queries/PlannerTest/mt-dop-validation.test
index a1571b5..5d340f3 100644
--- 
a/testdata/workloads/functional-planner/queries/PlannerTest/mt-dop-validation.test
+++ 
b/testdata/workloads/functional-planner/queries/PlannerTest/mt-dop-validation.test
@@ -58,7 +58,7 @@ PLAN-ROOT SINK
 |  in pipelines: 01(GETNEXT), 00(OPEN)
 |
 00:SCAN HDFS [functional_parquet.alltypes]
-   partitions=24/24 files=24 size=188.92KB
+   partitions=24/24 files=24 size=189.28KB
    predicates: id < CAST(10 AS INT)
    stored statistics:
      table: rows=unavailable size=unavailable
@@ -113,7 +113,7 @@ Per-Host Resources: mem-estimate=432.00MB 
mem-reservation=102.07MB thread-reserv
 |  in pipelines: 00(GETNEXT)
 |
 00:SCAN HDFS [functional_parquet.alltypes, RANDOM]
-   partitions=24/24 files=24 size=188.92KB
+   partitions=24/24 files=24 size=189.28KB
    predicates: id < CAST(10 AS INT)
    stored statistics:
      table: rows=unavailable size=unavailable
@@ -152,7 +152,7 @@ PLAN-ROOT SINK
 |  in pipelines: 01(GETNEXT), 00(OPEN)
 |
 00:SCAN HDFS [functional_parquet.alltypes]
-   partitions=24/24 files=24 size=188.92KB
+   partitions=24/24 files=24 size=189.28KB
    predicates: id < CAST(10 AS INT)
    stored statistics:
      table: rows=unavailable size=unavailable
@@ -200,7 +200,7 @@ Per-Host Resources: mem-estimate=30.32MB 
mem-reservation=30.00MB thread-reservat
 F00:PLAN FRAGMENT [RANDOM] hosts=3 instances=9
 Per-Host Resources: mem-estimate=48.00MB mem-reservation=48.00KB 
thread-reservation=3
 00:SCAN HDFS [functional_parquet.alltypes, RANDOM]
-   partitions=24/24 files=24 size=188.92KB
+   partitions=24/24 files=24 size=189.28KB
    predicates: id < CAST(10 AS INT)
    stored statistics:
      table: rows=unavailable size=unavailable
@@ -225,7 +225,7 @@ PLAN-ROOT SINK
 |
 01:SUBPLAN
 |  mem-estimate=0B mem-reservation=0B thread-reservation=0
-|  tuple-ids=2,1,0 row-size=482B cardinality=1500000
+|  tuple-ids=2,1,0 row-size=482B cardinality=1.50M
 |  in pipelines: 00(GETNEXT)
 |
 |--08:NESTED LOOP JOIN [CROSS JOIN]
@@ -268,14 +268,14 @@ PLAN-ROOT SINK
 |     in pipelines: 00(GETNEXT)
 |
 00:SCAN HDFS [tpch_nested_parquet.customer c]
-   partitions=1/1 files=4 size=288.98MB
+   partitions=1/1 files=4 size=288.99MB
    predicates: c_custkey < CAST(10 AS BIGINT), !empty(c.c_orders)
    predicates on o: !empty(o.o_lineitems), o_orderkey < CAST(5 AS BIGINT)
    predicates on o_lineitems: l_linenumber < CAST(3 AS INT)
    stored statistics:
      table: rows=150000 size=288.99MB
      columns missing stats: c_orders
-   extrapolated-rows=disabled max-scan-range-rows=44227
+   extrapolated-rows=disabled max-scan-range-rows=44225
    parquet statistics predicates: c_custkey < CAST(10 AS BIGINT)
    parquet statistics predicates on o: o_orderkey < CAST(5 AS BIGINT)
    parquet statistics predicates on o_lineitems: l_linenumber < CAST(3 AS INT)
@@ -283,7 +283,7 @@ PLAN-ROOT SINK
    parquet dictionary predicates on o: o_orderkey < CAST(5 AS BIGINT)
    parquet dictionary predicates on o_lineitems: l_linenumber < CAST(3 AS INT)
    mem-estimate=88.00MB mem-reservation=88.00MB thread-reservation=0
-   tuple-ids=0 row-size=230B cardinality=15000
+   tuple-ids=0 row-size=230B cardinality=15.00K
    in pipelines: 00(GETNEXT)
 ---- PARALLELPLANS
 F01:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
@@ -293,14 +293,14 @@ PLAN-ROOT SINK
 |
 09:EXCHANGE [UNPARTITIONED]
 |  mem-estimate=14.34MB mem-reservation=0B thread-reservation=0
-|  tuple-ids=2,1,0 row-size=482B cardinality=1500000
+|  tuple-ids=2,1,0 row-size=482B cardinality=1.50M
 |  in pipelines: 00(GETNEXT)
 |
 F00:PLAN FRAGMENT [RANDOM] hosts=3 instances=9
 Per-Host Resources: mem-estimate=264.00MB mem-reservation=264.00MB 
thread-reservation=3
 01:SUBPLAN
 |  mem-estimate=0B mem-reservation=0B thread-reservation=0
-|  tuple-ids=2,1,0 row-size=482B cardinality=1500000
+|  tuple-ids=2,1,0 row-size=482B cardinality=1.50M
 |  in pipelines: 00(GETNEXT)
 |
 |--08:NESTED LOOP JOIN [CROSS JOIN]
@@ -343,14 +343,14 @@ Per-Host Resources: mem-estimate=264.00MB 
mem-reservation=264.00MB thread-reserv
 |     in pipelines: 00(GETNEXT)
 |
 00:SCAN HDFS [tpch_nested_parquet.customer c, RANDOM]
-   partitions=1/1 files=4 size=288.98MB
+   partitions=1/1 files=4 size=288.99MB
    predicates: c_custkey < CAST(10 AS BIGINT), !empty(c.c_orders)
    predicates on o: !empty(o.o_lineitems), o_orderkey < CAST(5 AS BIGINT)
    predicates on o_lineitems: l_linenumber < CAST(3 AS INT)
    stored statistics:
      table: rows=150000 size=288.99MB
      columns missing stats: c_orders
-   extrapolated-rows=disabled max-scan-range-rows=44229
+   extrapolated-rows=disabled max-scan-range-rows=44225
    parquet statistics predicates: c_custkey < CAST(10 AS BIGINT)
    parquet statistics predicates on o: o_orderkey < CAST(5 AS BIGINT)
    parquet statistics predicates on o_lineitems: l_linenumber < CAST(3 AS INT)
@@ -358,7 +358,7 @@ Per-Host Resources: mem-estimate=264.00MB 
mem-reservation=264.00MB thread-reserv
    parquet dictionary predicates on o: o_orderkey < CAST(5 AS BIGINT)
    parquet dictionary predicates on o_lineitems: l_linenumber < CAST(3 AS INT)
    mem-estimate=88.00MB mem-reservation=88.00MB thread-reservation=0
-   tuple-ids=0 row-size=230B cardinality=15000
+   tuple-ids=0 row-size=230B cardinality=15.00K
    in pipelines: 00(GETNEXT)
 ====
 # Hash-join in a subplan should work.
@@ -373,7 +373,7 @@ PLAN-ROOT SINK
 |
 01:SUBPLAN
 |  mem-estimate=0B mem-reservation=0B thread-reservation=0
-|  tuple-ids=1,0,2 row-size=258B cardinality=1500000
+|  tuple-ids=1,0,2 row-size=258B cardinality=1.50M
 |  in pipelines: 00(GETNEXT)
 |
 |--06:HASH JOIN [INNER JOIN]
@@ -413,11 +413,11 @@ PLAN-ROOT SINK
    stored statistics:
      table: rows=150000 size=288.99MB
      columns missing stats: c_orders, c_orders
-   extrapolated-rows=disabled max-scan-range-rows=44229
+   extrapolated-rows=disabled max-scan-range-rows=44225
    parquet statistics predicates on o1: o1.o_orderkey < CAST(5 AS BIGINT)
    parquet dictionary predicates on o1: o1.o_orderkey < CAST(5 AS BIGINT)
    mem-estimate=88.00MB mem-reservation=16.00MB thread-reservation=0
-   tuple-ids=0 row-size=242B cardinality=150000
+   tuple-ids=0 row-size=242B cardinality=150.00K
    in pipelines: 00(GETNEXT)
 ---- PARALLELPLANS
 F01:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
@@ -427,14 +427,14 @@ PLAN-ROOT SINK
 |
 07:EXCHANGE [UNPARTITIONED]
 |  mem-estimate=12.37MB mem-reservation=0B thread-reservation=0
-|  tuple-ids=1,0,2 row-size=258B cardinality=1500000
+|  tuple-ids=1,0,2 row-size=258B cardinality=1.50M
 |  in pipelines: 00(GETNEXT)
 |
 F00:PLAN FRAGMENT [RANDOM] hosts=3 instances=9
 Per-Host Resources: mem-estimate=269.81MB mem-reservation=53.81MB 
thread-reservation=3
 01:SUBPLAN
 |  mem-estimate=0B mem-reservation=0B thread-reservation=0
-|  tuple-ids=1,0,2 row-size=258B cardinality=1500000
+|  tuple-ids=1,0,2 row-size=258B cardinality=1.50M
 |  in pipelines: 00(GETNEXT)
 |
 |--06:HASH JOIN [INNER JOIN]
@@ -474,10 +474,10 @@ Per-Host Resources: mem-estimate=269.81MB 
mem-reservation=53.81MB thread-reserva
    stored statistics:
      table: rows=150000 size=288.99MB
      columns missing stats: c_orders, c_orders
-   extrapolated-rows=disabled max-scan-range-rows=44229
+   extrapolated-rows=disabled max-scan-range-rows=44225
    parquet statistics predicates on o1: o1.o_orderkey < CAST(5 AS BIGINT)
    parquet dictionary predicates on o1: o1.o_orderkey < CAST(5 AS BIGINT)
    mem-estimate=88.00MB mem-reservation=16.00MB thread-reservation=0
-   tuple-ids=0 row-size=242B cardinality=150000
+   tuple-ids=0 row-size=242B cardinality=150.00K
    in pipelines: 00(GETNEXT)
 ====

http://git-wip-us.apache.org/repos/asf/impala/blob/a7ea86b7/testdata/workloads/functional-planner/queries/PlannerTest/multiple-distinct-limit.test
----------------------------------------------------------------------
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/multiple-distinct-limit.test
 
b/testdata/workloads/functional-planner/queries/PlannerTest/multiple-distinct-limit.test
index d3c5553..bb9ee16 100644
--- 
a/testdata/workloads/functional-planner/queries/PlannerTest/multiple-distinct-limit.test
+++ 
b/testdata/workloads/functional-planner/queries/PlannerTest/multiple-distinct-limit.test
@@ -9,6 +9,7 @@ PLAN-ROOT SINK
 03:AGGREGATE [FINALIZE]
 |  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, 
count(smallint_col)), aggif(valid_tid() = 5, min(timestamp_col)), 
aggif(valid_tid() = 5, max(timestamp_col))
 |  limit: 10
+|  row-size=48B cardinality=1
 |
 02:AGGREGATE [FINALIZE]
 |  Class 0
@@ -17,6 +18,7 @@ PLAN-ROOT SINK
 |    output: count(smallint_col)
 |  Class 2
 |    output: min:merge(timestamp_col), max:merge(timestamp_col)
+|  row-size=48B cardinality=3
 |
 01:AGGREGATE
 |  Class 0
@@ -25,15 +27,18 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: min(timestamp_col), max(timestamp_col)
+|  row-size=35B cardinality=31
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=19B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
 |  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, 
count(smallint_col)), aggif(valid_tid() = 5, min(timestamp_col)), 
aggif(valid_tid() = 5, max(timestamp_col))
 |  limit: 10
+|  row-size=48B cardinality=1
 |
 07:AGGREGATE [FINALIZE]
 |  Class 0
@@ -42,6 +47,7 @@ PLAN-ROOT SINK
 |    output: count:merge(smallint_col)
 |  Class 2
 |    output: min:merge(timestamp_col), max:merge(timestamp_col)
+|  row-size=48B cardinality=3
 |
 06:EXCHANGE [UNPARTITIONED]
 |
@@ -52,6 +58,7 @@ PLAN-ROOT SINK
 |    output: count(smallint_col)
 |  Class 2
 |    output: min:merge(timestamp_col), max:merge(timestamp_col)
+|  row-size=48B cardinality=3
 |
 05:AGGREGATE
 |  Class 0
@@ -60,6 +67,7 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: min:merge(timestamp_col), max:merge(timestamp_col)
+|  row-size=35B cardinality=31
 |
 04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 
THEN murmur_hash(smallint_col) WHEN 5 THEN 0 END)]
 |
@@ -70,9 +78,11 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: min(timestamp_col), max(timestamp_col)
+|  row-size=35B cardinality=31
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=19B cardinality=7.30K
 ====
 # Test correct placement of limit. Simplifies to a single class with one 
distinct agg.
 select b from (
@@ -86,23 +96,28 @@ PLAN-ROOT SINK
 01:AGGREGATE [FINALIZE]
 |  output: min(timestamp_col)
 |  limit: 10
+|  row-size=16B cardinality=1
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=16B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 04:AGGREGATE [FINALIZE]
 |  output: min:merge(timestamp_col)
 |  limit: 10
+|  row-size=16B cardinality=1
 |
 03:EXCHANGE [UNPARTITIONED]
 |
 01:AGGREGATE
 |  output: min(timestamp_col)
+|  row-size=16B cardinality=1
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=16B cardinality=7.30K
 ====
 # Test correct placement of limit. Simplifies to a single class with a 
non-distinct agg.
 select d from (
@@ -116,23 +131,28 @@ PLAN-ROOT SINK
 01:AGGREGATE [FINALIZE]
 |  output: max(timestamp_col)
 |  limit: 10
+|  row-size=16B cardinality=1
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=16B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 04:AGGREGATE [FINALIZE]
 |  output: max:merge(timestamp_col)
 |  limit: 10
+|  row-size=16B cardinality=1
 |
 03:EXCHANGE [UNPARTITIONED]
 |
 01:AGGREGATE
 |  output: max(timestamp_col)
+|  row-size=16B cardinality=1
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=16B cardinality=7.30K
 ====
 # Test correct placement of limit. Simplifies to a single class with distinct
 # and non-distinct aggss.
@@ -147,35 +167,43 @@ PLAN-ROOT SINK
 02:AGGREGATE [FINALIZE]
 |  output: count(smallint_col), max:merge(timestamp_col)
 |  limit: 10
+|  row-size=24B cardinality=1
 |
 01:AGGREGATE
 |  output: max(timestamp_col)
 |  group by: smallint_col
+|  row-size=18B cardinality=10
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=18B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 07:AGGREGATE [FINALIZE]
 |  output: count:merge(smallint_col), max:merge(timestamp_col)
 |  limit: 10
+|  row-size=24B cardinality=1
 |
 06:EXCHANGE [UNPARTITIONED]
 |
 02:AGGREGATE
 |  output: count(smallint_col), max:merge(timestamp_col)
+|  row-size=24B cardinality=1
 |
 05:AGGREGATE
 |  output: max:merge(timestamp_col)
 |  group by: smallint_col
+|  row-size=18B cardinality=10
 |
 04:EXCHANGE [HASH(smallint_col)]
 |
 01:AGGREGATE [STREAMING]
 |  output: max(timestamp_col)
 |  group by: smallint_col
+|  row-size=18B cardinality=10
 |
 00:SCAN HDFS [functional.alltypes]
    partitions=24/24 files=24 size=478.45KB
+   row-size=18B cardinality=7.30K
 ====

Reply via email to