You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by sp...@apache.org on 2017/05/17 15:13:51 UTC
hive git commit: HIVE-16664: Add join related Hive blobstore tests
(Rentao Wu, reviewed by Sergio Pena)
Repository: hive
Updated Branches:
refs/heads/master e97734b1c -> c99549fba
HIVE-16664: Add join related Hive blobstore tests (Rentao Wu, reviewed by Sergio Pena)
Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/c99549fb
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/c99549fb
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/c99549fb
Branch: refs/heads/master
Commit: c99549fba67f0e4971e74b6872596408fce0f25d
Parents: e97734b
Author: Rentao Wu <re...@amazon.com>
Authored: Wed May 17 10:13:21 2017 -0500
Committer: Sergio Pena <se...@cloudera.com>
Committed: Wed May 17 10:13:21 2017 -0500
----------------------------------------------------------------------
data/files/4col_data.txt | 7 +
data/files/5col_data.txt | 3 +
.../src/test/queries/clientpositive/join.q | 66 +++
.../src/test/queries/clientpositive/join2.q | 19 +
.../src/test/queries/clientpositive/map_join.q | 24 +
.../queries/clientpositive/map_join_on_filter.q | 16 +
.../queries/clientpositive/nested_outer_join.q | 25 +
.../src/test/results/clientpositive/join.q.out | 198 +++++++
.../src/test/results/clientpositive/join2.q.out | 64 +++
.../test/results/clientpositive/map_join.q.out | 563 +++++++++++++++++++
.../clientpositive/map_join_on_filter.q.out | 50 ++
.../clientpositive/nested_outer_join.q.out | 76 +++
12 files changed, 1111 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hive/blob/c99549fb/data/files/4col_data.txt
----------------------------------------------------------------------
diff --git a/data/files/4col_data.txt b/data/files/4col_data.txt
new file mode 100644
index 0000000..a67ebc6
--- /dev/null
+++ b/data/files/4col_data.txt
@@ -0,0 +1,7 @@
+101 1 1 3
+102 2 2 4
+102 3 3 9
+103 1 3 7
+103 2 2 2
+101 3 1 3
+101 1 1 4
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/hive/blob/c99549fb/data/files/5col_data.txt
----------------------------------------------------------------------
diff --git a/data/files/5col_data.txt b/data/files/5col_data.txt
new file mode 100644
index 0000000..cb10b09
--- /dev/null
+++ b/data/files/5col_data.txt
@@ -0,0 +1,3 @@
+101 1 1 3 url1
+102 2 2 4 url2
+102 3 3 9 url3
http://git-wip-us.apache.org/repos/asf/hive/blob/c99549fb/itests/hive-blobstore/src/test/queries/clientpositive/join.q
----------------------------------------------------------------------
diff --git a/itests/hive-blobstore/src/test/queries/clientpositive/join.q b/itests/hive-blobstore/src/test/queries/clientpositive/join.q
new file mode 100644
index 0000000..640c0ff
--- /dev/null
+++ b/itests/hive-blobstore/src/test/queries/clientpositive/join.q
@@ -0,0 +1,66 @@
+-- Test inner join query
+
+DROP TABLE events;
+DROP TABLE profiled_users;
+DROP TABLE page_profiles_latest;
+DROP TABLE page_profiles_out;
+CREATE TABLE events (
+ userUid string,
+ trackingId string,
+ eventType string,
+ action string,
+ url string)
+PARTITIONED BY (dt string)
+ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
+LOCATION '${hiveconf:test.blobstore.path.unique}/join/page-profiles';
+
+LOAD DATA LOCAL INPATH '../../data/files/5col_data.txt' OVERWRITE INTO TABLE events
+PARTITION (dt='2010-12-08');
+
+CREATE TABLE profiled_users (
+ userUid string,
+ categoryId int,
+ score bigint,
+ count bigint)
+ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
+LINES TERMINATED BY '\n'
+LOCATION '${hiveconf:test.blobstore.path.unique}/join/measured-profiles';
+
+LOAD DATA LOCAL INPATH '../../data/files/4col_data.txt' OVERWRITE INTO TABLE profiled_users;
+
+CREATE EXTERNAL TABLE page_profiles_latest (
+ url string,
+ categoryId int,
+ score bigint,
+ count bigint)
+ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
+LINES TERMINATED BY '\n'
+LOCATION '${hiveconf:test.blobstore.path.unique}/join/page-profiles/dt=2010-12-08';
+
+CREATE TABLE page_profiles_out (
+ url string,
+ categoryId int,
+ score bigint,
+ count bigint)
+ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
+LINES TERMINATED BY '\n'
+LOCATION '${hiveconf:test.blobstore.path.unique}/join/page_profiles_out';
+
+INSERT OVERWRITE TABLE page_profiles_out
+SELECT url, categoryId, SUM(score) as score, SUM(count) AS count
+FROM (
+ SELECT
+ e.url AS url,
+ u.categoryId AS categoryId,
+ ROUND(SUM(IF(u.score > 0, log2(u.score + 2), 0))) AS score,
+ SUM(u.count) AS count
+ FROM events e
+ JOIN profiled_users u ON (e.userUid = u.userUid)
+ WHERE e.userUid != "0"
+ GROUP BY e.url, u.categoryId
+ UNION ALL
+ SELECT * FROM page_profiles_latest
+) page_profiles
+GROUP BY url, categoryId;
+
+SELECT * FROM page_profiles_out;
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/hive/blob/c99549fb/itests/hive-blobstore/src/test/queries/clientpositive/join2.q
----------------------------------------------------------------------
diff --git a/itests/hive-blobstore/src/test/queries/clientpositive/join2.q b/itests/hive-blobstore/src/test/queries/clientpositive/join2.q
new file mode 100644
index 0000000..c5152d0
--- /dev/null
+++ b/itests/hive-blobstore/src/test/queries/clientpositive/join2.q
@@ -0,0 +1,19 @@
+-- Test left and right outer join
+-- SORT_QUERY_RESULTS
+
+DROP TABLE join_src;
+CREATE TABLE join_src (
+ key int,
+ value string)
+STORED AS TEXTFILE
+LOCATION '${hiveconf:test.blobstore.path.unique}/join2/join_src';
+
+LOAD DATA LOCAL INPATH '../../data/files/smbbucket_1.txt' INTO TABLE join_src;
+
+SELECT *
+FROM join_src a
+LEFT OUTER JOIN join_src b ON (a.key=b.key AND a.key < 10);
+
+SELECT *
+FROM join_src a
+RIGHT OUTER JOIN join_src b ON (a.key=b.key AND a.key < 10);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/hive/blob/c99549fb/itests/hive-blobstore/src/test/queries/clientpositive/map_join.q
----------------------------------------------------------------------
diff --git a/itests/hive-blobstore/src/test/queries/clientpositive/map_join.q b/itests/hive-blobstore/src/test/queries/clientpositive/map_join.q
new file mode 100644
index 0000000..63a6c8a
--- /dev/null
+++ b/itests/hive-blobstore/src/test/queries/clientpositive/map_join.q
@@ -0,0 +1,24 @@
+-- Test MAPJOIN hint
+
+DROP TABLE keyval1;
+DROP TABLE keyval2;
+
+CREATE TABLE keyval1 (
+ key int,
+ value string)
+STORED AS TEXTFILE
+LOCATION '${hiveconf:test.blobstore.path.unique}/map_join/keyval1';
+
+LOAD DATA LOCAL INPATH '../../data/files/srcbucket1.txt' INTO TABLE keyval1;
+
+CREATE TABLE keyval2 (
+ key int,
+ value string)
+STORED AS TEXTFILE
+LOCATION '${hiveconf:test.blobstore.path.unique}/map_join/keyval2';
+
+LOAD DATA LOCAL INPATH '../../data/files/srcbucket0.txt' INTO TABLE keyval2;
+
+SELECT /*+ MAPJOIN(x) */ x.key, x.value, y.value
+FROM keyval1 x
+JOIN keyval2 y ON (x.value = y.value);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/hive/blob/c99549fb/itests/hive-blobstore/src/test/queries/clientpositive/map_join_on_filter.q
----------------------------------------------------------------------
diff --git a/itests/hive-blobstore/src/test/queries/clientpositive/map_join_on_filter.q b/itests/hive-blobstore/src/test/queries/clientpositive/map_join_on_filter.q
new file mode 100644
index 0000000..55b366d
--- /dev/null
+++ b/itests/hive-blobstore/src/test/queries/clientpositive/map_join_on_filter.q
@@ -0,0 +1,16 @@
+-- Test MAPJOIN with filters in the ON condition
+
+DROP TABLE src_a_data;
+CREATE TABLE src_a_data (
+ key int,
+ value string)
+STORED AS TEXTFILE
+LOCATION '${hiveconf:test.blobstore.path.unique}/map_join_on_filter/src_a_data';
+
+LOAD DATA LOCAL INPATH '../../data/files/smbbucket_1.txt' INTO TABLE src_a_data;
+
+SELECT /*+ MAPJOIN(src1, src2) */ *
+FROM src_a_data src1
+RIGHT OUTER JOIN src_a_data src2 ON (src1.key = src2.key AND src1.key < 10 AND src2.key > 10)
+JOIN src_a_data src3 ON (src2.key = src3.key AND src3.key < 10)
+SORT BY src1.key, src1.value, src2.key, src2.value, src3.key, src3.value;
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/hive/blob/c99549fb/itests/hive-blobstore/src/test/queries/clientpositive/nested_outer_join.q
----------------------------------------------------------------------
diff --git a/itests/hive-blobstore/src/test/queries/clientpositive/nested_outer_join.q b/itests/hive-blobstore/src/test/queries/clientpositive/nested_outer_join.q
new file mode 100644
index 0000000..512b459
--- /dev/null
+++ b/itests/hive-blobstore/src/test/queries/clientpositive/nested_outer_join.q
@@ -0,0 +1,25 @@
+-- Test nested outer join queries
+
+DROP TABLE src_a_data;
+CREATE TABLE src_a_data (
+ key int,
+ value string)
+STORED AS TEXTFILE
+LOCATION '${hiveconf:test.blobstore.path.unique}/nested_outer_join/src_a_data';
+
+LOAD DATA LOCAL INPATH '../../data/files/smbbucket_3.txt' INTO TABLE src_a_data;
+
+SELECT s.keya, s.keyb, c.key keyc
+FROM (
+ SELECT a.key keya, b.key keyb
+ FROM src_a_data a
+ LEFT OUTER JOIN src_a_data b ON (a.key=b.key)
+) s
+LEFT OUTER JOIN src_a_data c ON (s.keyb=c.key AND s.keyb<10)
+WHERE s.keya<20;
+
+SELECT a.key keya, b.key keyb, c.key keyc
+FROM src_a_data a
+LEFT OUTER JOIN src_a_data b ON (a.key=b.key)
+LEFT OUTER JOIN src_a_data c ON (b.key=c.key AND b.key<10)
+WHERE a.key<20;
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/hive/blob/c99549fb/itests/hive-blobstore/src/test/results/clientpositive/join.q.out
----------------------------------------------------------------------
diff --git a/itests/hive-blobstore/src/test/results/clientpositive/join.q.out b/itests/hive-blobstore/src/test/results/clientpositive/join.q.out
new file mode 100644
index 0000000..c049185
--- /dev/null
+++ b/itests/hive-blobstore/src/test/results/clientpositive/join.q.out
@@ -0,0 +1,198 @@
+PREHOOK: query: DROP TABLE events
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE events
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: DROP TABLE profiled_users
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE profiled_users
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: DROP TABLE page_profiles_latest
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE page_profiles_latest
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: DROP TABLE page_profiles_out
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE page_profiles_out
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: CREATE TABLE events (
+ userUid string,
+ trackingId string,
+ eventType string,
+ action string,
+ url string)
+PARTITIONED BY (dt string)
+ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
+#### A masked pattern was here ####
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: ### test.blobstore.path ###/join/page-profiles
+PREHOOK: Output: database:default
+PREHOOK: Output: default@events
+POSTHOOK: query: CREATE TABLE events (
+ userUid string,
+ trackingId string,
+ eventType string,
+ action string,
+ url string)
+PARTITIONED BY (dt string)
+ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
+#### A masked pattern was here ####
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: ### test.blobstore.path ###/join/page-profiles
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@events
+PREHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/5col_data.txt' OVERWRITE INTO TABLE events
+PARTITION (dt='2010-12-08')
+PREHOOK: type: LOAD
+#### A masked pattern was here ####
+PREHOOK: Output: default@events
+POSTHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/5col_data.txt' OVERWRITE INTO TABLE events
+PARTITION (dt='2010-12-08')
+POSTHOOK: type: LOAD
+#### A masked pattern was here ####
+POSTHOOK: Output: default@events
+POSTHOOK: Output: default@events@dt=2010-12-08
+PREHOOK: query: CREATE TABLE profiled_users (
+ userUid string,
+ categoryId int,
+ score bigint,
+ count bigint)
+ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
+LINES TERMINATED BY '\n'
+#### A masked pattern was here ####
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: ### test.blobstore.path ###/join/measured-profiles
+PREHOOK: Output: database:default
+PREHOOK: Output: default@profiled_users
+POSTHOOK: query: CREATE TABLE profiled_users (
+ userUid string,
+ categoryId int,
+ score bigint,
+ count bigint)
+ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
+LINES TERMINATED BY '\n'
+#### A masked pattern was here ####
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: ### test.blobstore.path ###/join/measured-profiles
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@profiled_users
+PREHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/4col_data.txt' OVERWRITE INTO TABLE profiled_users
+PREHOOK: type: LOAD
+#### A masked pattern was here ####
+PREHOOK: Output: default@profiled_users
+POSTHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/4col_data.txt' OVERWRITE INTO TABLE profiled_users
+POSTHOOK: type: LOAD
+#### A masked pattern was here ####
+POSTHOOK: Output: default@profiled_users
+PREHOOK: query: CREATE EXTERNAL TABLE page_profiles_latest (
+ url string,
+ categoryId int,
+ score bigint,
+ count bigint)
+ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
+LINES TERMINATED BY '\n'
+#### A masked pattern was here ####
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: ### test.blobstore.path ###/join/page-profiles/dt=2010-12-08
+PREHOOK: Output: database:default
+PREHOOK: Output: default@page_profiles_latest
+POSTHOOK: query: CREATE EXTERNAL TABLE page_profiles_latest (
+ url string,
+ categoryId int,
+ score bigint,
+ count bigint)
+ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
+LINES TERMINATED BY '\n'
+#### A masked pattern was here ####
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: ### test.blobstore.path ###/join/page-profiles/dt=2010-12-08
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@page_profiles_latest
+PREHOOK: query: CREATE TABLE page_profiles_out (
+ url string,
+ categoryId int,
+ score bigint,
+ count bigint)
+ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
+LINES TERMINATED BY '\n'
+#### A masked pattern was here ####
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: ### test.blobstore.path ###/join/page_profiles_out
+PREHOOK: Output: database:default
+PREHOOK: Output: default@page_profiles_out
+POSTHOOK: query: CREATE TABLE page_profiles_out (
+ url string,
+ categoryId int,
+ score bigint,
+ count bigint)
+ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
+LINES TERMINATED BY '\n'
+#### A masked pattern was here ####
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: ### test.blobstore.path ###/join/page_profiles_out
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@page_profiles_out
+PREHOOK: query: INSERT OVERWRITE TABLE page_profiles_out
+SELECT url, categoryId, SUM(score) as score, SUM(count) AS count
+FROM (
+ SELECT
+ e.url AS url,
+ u.categoryId AS categoryId,
+ ROUND(SUM(IF(u.score > 0, log2(u.score + 2), 0))) AS score,
+ SUM(u.count) AS count
+ FROM events e
+ JOIN profiled_users u ON (e.userUid = u.userUid)
+ WHERE e.userUid != "0"
+ GROUP BY e.url, u.categoryId
+ UNION ALL
+ SELECT * FROM page_profiles_latest
+) page_profiles
+GROUP BY url, categoryId
+PREHOOK: type: QUERY
+PREHOOK: Input: default@events
+PREHOOK: Input: default@events@dt=2010-12-08
+PREHOOK: Input: default@page_profiles_latest
+PREHOOK: Input: default@profiled_users
+PREHOOK: Output: default@page_profiles_out
+POSTHOOK: query: INSERT OVERWRITE TABLE page_profiles_out
+SELECT url, categoryId, SUM(score) as score, SUM(count) AS count
+FROM (
+ SELECT
+ e.url AS url,
+ u.categoryId AS categoryId,
+ ROUND(SUM(IF(u.score > 0, log2(u.score + 2), 0))) AS score,
+ SUM(u.count) AS count
+ FROM events e
+ JOIN profiled_users u ON (e.userUid = u.userUid)
+ WHERE e.userUid != "0"
+ GROUP BY e.url, u.categoryId
+ UNION ALL
+ SELECT * FROM page_profiles_latest
+) page_profiles
+GROUP BY url, categoryId
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@events
+POSTHOOK: Input: default@events@dt=2010-12-08
+POSTHOOK: Input: default@page_profiles_latest
+POSTHOOK: Input: default@profiled_users
+POSTHOOK: Output: default@page_profiles_out
+POSTHOOK: Lineage: page_profiles_out.categoryid EXPRESSION [(profiled_users)u.FieldSchema(name:categoryid, type:int, comment:null), (page_profiles_latest)page_profiles_latest.FieldSchema(name:categoryid, type:int, comment:null), ]
+POSTHOOK: Lineage: page_profiles_out.count EXPRESSION [(profiled_users)u.FieldSchema(name:count, type:bigint, comment:null), (page_profiles_latest)page_profiles_latest.FieldSchema(name:count, type:bigint, comment:null), ]
+POSTHOOK: Lineage: page_profiles_out.score EXPRESSION [(profiled_users)u.FieldSchema(name:score, type:bigint, comment:null), (page_profiles_latest)page_profiles_latest.FieldSchema(name:score, type:bigint, comment:null), ]
+POSTHOOK: Lineage: page_profiles_out.url EXPRESSION [(events)e.FieldSchema(name:url, type:string, comment:null), (page_profiles_latest)page_profiles_latest.FieldSchema(name:url, type:string, comment:null), ]
+PREHOOK: query: SELECT * FROM page_profiles_out
+PREHOOK: type: QUERY
+PREHOOK: Input: default@page_profiles_out
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT * FROM page_profiles_out
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@page_profiles_out
+#### A masked pattern was here ####
+101 1 1 3
+102 2 2 4
+102 3 3 9
+url1 1 3 7
+url1 3 2 3
+url2 2 2 4
+url2 3 2 9
+url3 2 2 4
+url3 3 2 9
http://git-wip-us.apache.org/repos/asf/hive/blob/c99549fb/itests/hive-blobstore/src/test/results/clientpositive/join2.q.out
----------------------------------------------------------------------
diff --git a/itests/hive-blobstore/src/test/results/clientpositive/join2.q.out b/itests/hive-blobstore/src/test/results/clientpositive/join2.q.out
new file mode 100644
index 0000000..f5b9e3c
--- /dev/null
+++ b/itests/hive-blobstore/src/test/results/clientpositive/join2.q.out
@@ -0,0 +1,64 @@
+PREHOOK: query: DROP TABLE join_src
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE join_src
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: CREATE TABLE join_src (
+ key int,
+ value string)
+STORED AS TEXTFILE
+#### A masked pattern was here ####
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: ### test.blobstore.path ###/join2/join_src
+PREHOOK: Output: database:default
+PREHOOK: Output: default@join_src
+POSTHOOK: query: CREATE TABLE join_src (
+ key int,
+ value string)
+STORED AS TEXTFILE
+#### A masked pattern was here ####
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: ### test.blobstore.path ###/join2/join_src
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@join_src
+PREHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/smbbucket_1.txt' INTO TABLE join_src
+PREHOOK: type: LOAD
+#### A masked pattern was here ####
+PREHOOK: Output: default@join_src
+POSTHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/smbbucket_1.txt' INTO TABLE join_src
+POSTHOOK: type: LOAD
+#### A masked pattern was here ####
+POSTHOOK: Output: default@join_src
+PREHOOK: query: SELECT *
+FROM join_src a
+LEFT OUTER JOIN join_src b ON (a.key=b.key AND a.key < 10)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@join_src
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT *
+FROM join_src a
+LEFT OUTER JOIN join_src b ON (a.key=b.key AND a.key < 10)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@join_src
+#### A masked pattern was here ####
+1 val_1 1 val_1
+10 val_10 NULL NULL
+3 val_3 3 val_3
+4 val_4 4 val_4
+5 val_5 5 val_5
+PREHOOK: query: SELECT *
+FROM join_src a
+RIGHT OUTER JOIN join_src b ON (a.key=b.key AND a.key < 10)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@join_src
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT *
+FROM join_src a
+RIGHT OUTER JOIN join_src b ON (a.key=b.key AND a.key < 10)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@join_src
+#### A masked pattern was here ####
+1 val_1 1 val_1
+3 val_3 3 val_3
+4 val_4 4 val_4
+5 val_5 5 val_5
+NULL NULL 10 val_10
http://git-wip-us.apache.org/repos/asf/hive/blob/c99549fb/itests/hive-blobstore/src/test/results/clientpositive/map_join.q.out
----------------------------------------------------------------------
diff --git a/itests/hive-blobstore/src/test/results/clientpositive/map_join.q.out b/itests/hive-blobstore/src/test/results/clientpositive/map_join.q.out
new file mode 100644
index 0000000..268bb52
--- /dev/null
+++ b/itests/hive-blobstore/src/test/results/clientpositive/map_join.q.out
@@ -0,0 +1,563 @@
+PREHOOK: query: DROP TABLE keyval1
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE keyval1
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: DROP TABLE keyval2
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE keyval2
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: CREATE TABLE keyval1 (
+ key int,
+ value string)
+STORED AS TEXTFILE
+#### A masked pattern was here ####
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: ### test.blobstore.path ###/map_join/keyval1
+PREHOOK: Output: database:default
+PREHOOK: Output: default@keyval1
+POSTHOOK: query: CREATE TABLE keyval1 (
+ key int,
+ value string)
+STORED AS TEXTFILE
+#### A masked pattern was here ####
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: ### test.blobstore.path ###/map_join/keyval1
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@keyval1
+PREHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/srcbucket1.txt' INTO TABLE keyval1
+PREHOOK: type: LOAD
+#### A masked pattern was here ####
+PREHOOK: Output: default@keyval1
+POSTHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/srcbucket1.txt' INTO TABLE keyval1
+POSTHOOK: type: LOAD
+#### A masked pattern was here ####
+POSTHOOK: Output: default@keyval1
+PREHOOK: query: CREATE TABLE keyval2 (
+ key int,
+ value string)
+STORED AS TEXTFILE
+#### A masked pattern was here ####
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: ### test.blobstore.path ###/map_join/keyval2
+PREHOOK: Output: database:default
+PREHOOK: Output: default@keyval2
+POSTHOOK: query: CREATE TABLE keyval2 (
+ key int,
+ value string)
+STORED AS TEXTFILE
+#### A masked pattern was here ####
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: ### test.blobstore.path ###/map_join/keyval2
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@keyval2
+PREHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/srcbucket0.txt' INTO TABLE keyval2
+PREHOOK: type: LOAD
+#### A masked pattern was here ####
+PREHOOK: Output: default@keyval2
+POSTHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/srcbucket0.txt' INTO TABLE keyval2
+POSTHOOK: type: LOAD
+#### A masked pattern was here ####
+POSTHOOK: Output: default@keyval2
+PREHOOK: query: SELECT /*+ MAPJOIN(x) */ x.key, x.value, y.value
+FROM keyval1 x
+JOIN keyval2 y ON (x.value = y.value)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@keyval1
+PREHOOK: Input: default@keyval2
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT /*+ MAPJOIN(x) */ x.key, x.value, y.value
+FROM keyval1 x
+JOIN keyval2 y ON (x.value = y.value)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@keyval1
+POSTHOOK: Input: default@keyval2
+#### A masked pattern was here ####
+99 val_100 val_100
+99 val_100 val_100
+103 val_103 val_103
+103 val_103 val_103
+105 val_105 val_105
+105 val_105 val_105
+105 val_105 val_105
+11 val_11 val_11
+111 val_111 val_111
+117 val_118 val_118
+117 val_118 val_118
+117 val_118 val_118
+117 val_118 val_118
+119 val_119 val_119
+119 val_119 val_119
+119 val_119 val_119
+119 val_119 val_119
+119 val_119 val_119
+119 val_119 val_119
+119 val_119 val_119
+119 val_119 val_119
+119 val_119 val_119
+11 val_12 val_12
+11 val_12 val_12
+11 val_12 val_12
+11 val_12 val_12
+11 val_12 val_12
+11 val_12 val_12
+119 val_120 val_120
+119 val_120 val_120
+119 val_120 val_120
+119 val_120 val_120
+119 val_120 val_120
+119 val_120 val_120
+125 val_126 val_126
+129 val_129 val_129
+129 val_129 val_129
+129 val_129 val_129
+129 val_129 val_129
+133 val_133 val_133
+133 val_133 val_133
+133 val_134 val_134
+133 val_134 val_134
+135 val_136 val_136
+135 val_136 val_136
+135 val_136 val_136
+137 val_137 val_137
+137 val_137 val_137
+137 val_138 val_138
+137 val_138 val_138
+137 val_138 val_138
+137 val_138 val_138
+145 val_145 val_145
+149 val_150 val_150
+151 val_152 val_152
+151 val_152 val_152
+151 val_152 val_152
+151 val_152 val_152
+153 val_153 val_153
+153 val_153 val_153
+153 val_153 val_153
+157 val_157 val_157
+157 val_157 val_157
+157 val_158 val_158
+157 val_158 val_158
+161 val_162 val_162
+161 val_162 val_162
+161 val_162 val_162
+161 val_162 val_162
+163 val_163 val_163
+165 val_165 val_165
+165 val_165 val_165
+165 val_165 val_165
+165 val_165 val_165
+165 val_166 val_166
+167 val_168 val_168
+169 val_169 val_169
+169 val_169 val_169
+169 val_169 val_169
+169 val_169 val_169
+17 val_17 val_17
+17 val_17 val_17
+175 val_175 val_175
+175 val_175 val_175
+175 val_175 val_175
+175 val_175 val_175
+175 val_176 val_176
+175 val_176 val_176
+175 val_176 val_176
+175 val_176 val_176
+177 val_178 val_178
+177 val_178 val_178
+179 val_179 val_179
+179 val_179 val_179
+179 val_179 val_179
+179 val_179 val_179
+179 val_180 val_180
+183 val_183 val_183
+185 val_186 val_186
+189 val_190 val_190
+191 val_192 val_192
+193 val_193 val_193
+193 val_193 val_193
+193 val_193 val_193
+197 val_197 val_197
+197 val_197 val_197
+197 val_197 val_197
+197 val_197 val_197
+197 val_197 val_197
+197 val_197 val_197
+1 val_2 val_2
+19 val_20 val_20
+199 val_200 val_200
+199 val_200 val_200
+205 val_205 val_205
+205 val_205 val_205
+207 val_207 val_207
+207 val_207 val_207
+207 val_207 val_207
+207 val_207 val_207
+207 val_207 val_207
+207 val_207 val_207
+213 val_213 val_213
+213 val_213 val_213
+213 val_214 val_214
+215 val_216 val_216
+215 val_216 val_216
+217 val_217 val_217
+217 val_217 val_217
+217 val_218 val_218
+217 val_218 val_218
+223 val_223 val_223
+223 val_223 val_223
+227 val_228 val_228
+229 val_229 val_229
+229 val_229 val_229
+239 val_239 val_239
+239 val_239 val_239
+23 val_24 val_24
+23 val_24 val_24
+241 val_241 val_241
+241 val_242 val_242
+241 val_242 val_242
+241 val_242 val_242
+241 val_242 val_242
+241 val_242 val_242
+241 val_242 val_242
+241 val_242 val_242
+241 val_242 val_242
+243 val_244 val_244
+243 val_244 val_244
+247 val_247 val_247
+247 val_247 val_247
+249 val_249 val_249
+255 val_255 val_255
+255 val_255 val_255
+257 val_257 val_257
+257 val_258 val_258
+257 val_258 val_258
+259 val_260 val_260
+259 val_260 val_260
+261 val_262 val_262
+263 val_263 val_263
+263 val_263 val_263
+265 val_265 val_265
+265 val_265 val_265
+265 val_265 val_265
+265 val_265 val_265
+265 val_266 val_266
+271 val_272 val_272
+271 val_272 val_272
+273 val_273 val_273
+273 val_273 val_273
+273 val_273 val_273
+273 val_274 val_274
+275 val_275 val_275
+277 val_277 val_277
+277 val_277 val_277
+277 val_277 val_277
+277 val_277 val_277
+277 val_278 val_278
+277 val_278 val_278
+277 val_278 val_278
+277 val_278 val_278
+281 val_282 val_282
+281 val_282 val_282
+281 val_282 val_282
+281 val_282 val_282
+281 val_282 val_282
+281 val_282 val_282
+285 val_285 val_285
+285 val_285 val_285
+285 val_286 val_286
+287 val_287 val_287
+287 val_288 val_288
+287 val_288 val_288
+287 val_288 val_288
+287 val_288 val_288
+291 val_292 val_292
+291 val_292 val_292
+295 val_296 val_296
+295 val_296 val_296
+29 val_30 val_30
+29 val_30 val_30
+305 val_305 val_305
+305 val_306 val_306
+307 val_307 val_307
+307 val_307 val_307
+309 val_309 val_309
+309 val_309 val_309
+309 val_309 val_309
+309 val_309 val_309
+309 val_310 val_310
+311 val_311 val_311
+311 val_311 val_311
+311 val_311 val_311
+311 val_311 val_311
+311 val_311 val_311
+311 val_311 val_311
+311 val_311 val_311
+311 val_311 val_311
+311 val_311 val_311
+315 val_315 val_315
+317 val_318 val_318
+317 val_318 val_318
+317 val_318 val_318
+323 val_323 val_323
+325 val_325 val_325
+325 val_325 val_325
+327 val_327 val_327
+327 val_327 val_327
+327 val_327 val_327
+33 val_33 val_33
+331 val_331 val_331
+331 val_331 val_331
+331 val_332 val_332
+331 val_332 val_332
+335 val_335 val_335
+335 val_336 val_336
+335 val_336 val_336
+337 val_338 val_338
+339 val_339 val_339
+33 val_34 val_34
+341 val_341 val_341
+341 val_342 val_342
+341 val_342 val_342
+341 val_342 val_342
+341 val_342 val_342
+341 val_342 val_342
+341 val_342 val_342
+343 val_344 val_344
+343 val_344 val_344
+345 val_345 val_345
+347 val_348 val_348
+347 val_348 val_348
+347 val_348 val_348
+347 val_348 val_348
+347 val_348 val_348
+347 val_348 val_348
+347 val_348 val_348
+347 val_348 val_348
+347 val_348 val_348
+347 val_348 val_348
+353 val_353 val_353
+353 val_353 val_353
+353 val_353 val_353
+353 val_353 val_353
+355 val_356 val_356
+355 val_356 val_356
+363 val_364 val_364
+363 val_364 val_364
+363 val_364 val_364
+365 val_365 val_365
+367 val_368 val_368
+367 val_368 val_368
+373 val_374 val_374
+375 val_375 val_375
+377 val_377 val_377
+379 val_379 val_379
+381 val_382 val_382
+381 val_382 val_382
+385 val_386 val_386
+385 val_386 val_386
+389 val_389 val_389
+391 val_392 val_392
+391 val_392 val_392
+393 val_393 val_393
+393 val_393 val_393
+393 val_394 val_394
+393 val_394 val_394
+395 val_396 val_396
+395 val_396 val_396
+395 val_396 val_396
+395 val_396 val_396
+395 val_396 val_396
+395 val_396 val_396
+399 val_399 val_399
+399 val_399 val_399
+3 val_4 val_4
+399 val_400 val_400
+399 val_400 val_400
+401 val_402 val_402
+403 val_403 val_403
+403 val_403 val_403
+403 val_403 val_403
+403 val_403 val_403
+403 val_403 val_403
+403 val_403 val_403
+403 val_403 val_403
+403 val_403 val_403
+403 val_403 val_403
+405 val_406 val_406
+405 val_406 val_406
+405 val_406 val_406
+405 val_406 val_406
+407 val_407 val_407
+409 val_409 val_409
+409 val_409 val_409
+409 val_409 val_409
+409 val_409 val_409
+409 val_409 val_409
+409 val_409 val_409
+41 val_41 val_41
+41 val_41 val_41
+411 val_411 val_411
+413 val_413 val_413
+413 val_413 val_413
+413 val_413 val_413
+413 val_413 val_413
+413 val_414 val_414
+413 val_414 val_414
+417 val_417 val_417
+417 val_417 val_417
+417 val_417 val_417
+423 val_424 val_424
+423 val_424 val_424
+427 val_427 val_427
+429 val_429 val_429
+429 val_429 val_429
+43 val_43 val_43
+43 val_43 val_43
+43 val_43 val_43
+429 val_430 val_430
+429 val_430 val_430
+429 val_430 val_430
+429 val_430 val_430
+429 val_430 val_430
+429 val_430 val_430
+431 val_431 val_431
+431 val_431 val_431
+431 val_431 val_431
+431 val_432 val_432
+435 val_436 val_436
+437 val_437 val_437
+437 val_438 val_438
+437 val_438 val_438
+437 val_438 val_438
+439 val_439 val_439
+439 val_439 val_439
+439 val_439 val_439
+439 val_439 val_439
+443 val_443 val_443
+443 val_444 val_444
+443 val_444 val_444
+443 val_444 val_444
+447 val_448 val_448
+449 val_449 val_449
+451 val_452 val_452
+453 val_454 val_454
+453 val_454 val_454
+453 val_454 val_454
+455 val_455 val_455
+455 val_455 val_455
+457 val_458 val_458
+457 val_458 val_458
+457 val_458 val_458
+457 val_458 val_458
+459 val_460 val_460
+461 val_462 val_462
+461 val_462 val_462
+463 val_463 val_463
+463 val_463 val_463
+467 val_468 val_468
+467 val_468 val_468
+467 val_468 val_468
+467 val_468 val_468
+469 val_469 val_469
+469 val_469 val_469
+469 val_469 val_469
+469 val_469 val_469
+469 val_469 val_469
+469 val_469 val_469
+469 val_469 val_469
+469 val_469 val_469
+469 val_469 val_469
+469 val_469 val_469
+469 val_469 val_469
+469 val_469 val_469
+469 val_469 val_469
+469 val_469 val_469
+469 val_469 val_469
+47 val_47 val_47
+469 val_470 val_470
+475 val_475 val_475
+475 val_475 val_475
+477 val_477 val_477
+477 val_477 val_477
+477 val_478 val_478
+477 val_478 val_478
+479 val_479 val_479
+479 val_479 val_479
+481 val_481 val_481
+481 val_481 val_481
+481 val_482 val_482
+483 val_483 val_483
+485 val_485 val_485
+487 val_487 val_487
+489 val_489 val_489
+489 val_489 val_489
+489 val_489 val_489
+489 val_489 val_489
+489 val_490 val_490
+491 val_491 val_491
+491 val_492 val_492
+491 val_492 val_492
+491 val_492 val_492
+491 val_492 val_492
+493 val_493 val_493
+493 val_493 val_493
+495 val_495 val_495
+495 val_495 val_495
+495 val_496 val_496
+497 val_497 val_497
+497 val_498 val_498
+497 val_498 val_498
+497 val_498 val_498
+497 val_498 val_498
+497 val_498 val_498
+497 val_498 val_498
+5 val_5 val_5
+5 val_5 val_5
+5 val_5 val_5
+51 val_51 val_51
+51 val_51 val_51
+53 val_53 val_53
+53 val_53 val_53
+53 val_53 val_53
+53 val_53 val_53
+53 val_54 val_54
+57 val_57 val_57
+63 val_64 val_64
+65 val_66 val_66
+65 val_66 val_66
+69 val_69 val_69
+69 val_70 val_70
+69 val_70 val_70
+69 val_70 val_70
+71 val_72 val_72
+71 val_72 val_72
+75 val_76 val_76
+75 val_76 val_76
+77 val_77 val_77
+77 val_77 val_77
+77 val_77 val_77
+77 val_78 val_78
+77 val_78 val_78
+83 val_83 val_83
+83 val_83 val_83
+83 val_83 val_83
+83 val_83 val_83
+85 val_86 val_86
+87 val_87 val_87
+9 val_9 val_9
+89 val_90 val_90
+89 val_90 val_90
+89 val_90 val_90
+89 val_90 val_90
+89 val_90 val_90
+89 val_90 val_90
+89 val_90 val_90
+89 val_90 val_90
+89 val_90 val_90
+91 val_92 val_92
+95 val_95 val_95
+95 val_95 val_95
+97 val_98 val_98
+97 val_98 val_98
+97 val_98 val_98
+97 val_98 val_98
http://git-wip-us.apache.org/repos/asf/hive/blob/c99549fb/itests/hive-blobstore/src/test/results/clientpositive/map_join_on_filter.q.out
----------------------------------------------------------------------
diff --git a/itests/hive-blobstore/src/test/results/clientpositive/map_join_on_filter.q.out b/itests/hive-blobstore/src/test/results/clientpositive/map_join_on_filter.q.out
new file mode 100644
index 0000000..653faab
--- /dev/null
+++ b/itests/hive-blobstore/src/test/results/clientpositive/map_join_on_filter.q.out
@@ -0,0 +1,50 @@
+PREHOOK: query: DROP TABLE src_a_data
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE src_a_data
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: CREATE TABLE src_a_data (
+ key int,
+ value string)
+STORED AS TEXTFILE
+#### A masked pattern was here ####
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: ### test.blobstore.path ###/map_join_on_filter/src_a_data
+PREHOOK: Output: database:default
+PREHOOK: Output: default@src_a_data
+POSTHOOK: query: CREATE TABLE src_a_data (
+ key int,
+ value string)
+STORED AS TEXTFILE
+#### A masked pattern was here ####
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: ### test.blobstore.path ###/map_join_on_filter/src_a_data
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@src_a_data
+PREHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/smbbucket_1.txt' INTO TABLE src_a_data
+PREHOOK: type: LOAD
+#### A masked pattern was here ####
+PREHOOK: Output: default@src_a_data
+POSTHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/smbbucket_1.txt' INTO TABLE src_a_data
+POSTHOOK: type: LOAD
+#### A masked pattern was here ####
+POSTHOOK: Output: default@src_a_data
+PREHOOK: query: SELECT /*+ MAPJOIN(src1, src2) */ *
+FROM src_a_data src1
+RIGHT OUTER JOIN src_a_data src2 ON (src1.key = src2.key AND src1.key < 10 AND src2.key > 10)
+JOIN src_a_data src3 ON (src2.key = src3.key AND src3.key < 10)
+SORT BY src1.key, src1.value, src2.key, src2.value, src3.key, src3.value
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src_a_data
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT /*+ MAPJOIN(src1, src2) */ *
+FROM src_a_data src1
+RIGHT OUTER JOIN src_a_data src2 ON (src1.key = src2.key AND src1.key < 10 AND src2.key > 10)
+JOIN src_a_data src3 ON (src2.key = src3.key AND src3.key < 10)
+SORT BY src1.key, src1.value, src2.key, src2.value, src3.key, src3.value
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src_a_data
+#### A masked pattern was here ####
+NULL NULL 1 val_1 1 val_1
+NULL NULL 3 val_3 3 val_3
+NULL NULL 4 val_4 4 val_4
+NULL NULL 5 val_5 5 val_5
http://git-wip-us.apache.org/repos/asf/hive/blob/c99549fb/itests/hive-blobstore/src/test/results/clientpositive/nested_outer_join.q.out
----------------------------------------------------------------------
diff --git a/itests/hive-blobstore/src/test/results/clientpositive/nested_outer_join.q.out b/itests/hive-blobstore/src/test/results/clientpositive/nested_outer_join.q.out
new file mode 100644
index 0000000..f06c0ee
--- /dev/null
+++ b/itests/hive-blobstore/src/test/results/clientpositive/nested_outer_join.q.out
@@ -0,0 +1,76 @@
+PREHOOK: query: DROP TABLE src_a_data
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE src_a_data
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: CREATE TABLE src_a_data (
+ key int,
+ value string)
+STORED AS TEXTFILE
+#### A masked pattern was here ####
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: ### test.blobstore.path ###/nested_outer_join/src_a_data
+PREHOOK: Output: database:default
+PREHOOK: Output: default@src_a_data
+POSTHOOK: query: CREATE TABLE src_a_data (
+ key int,
+ value string)
+STORED AS TEXTFILE
+#### A masked pattern was here ####
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: ### test.blobstore.path ###/nested_outer_join/src_a_data
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@src_a_data
+PREHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/smbbucket_3.txt' INTO TABLE src_a_data
+PREHOOK: type: LOAD
+#### A masked pattern was here ####
+PREHOOK: Output: default@src_a_data
+POSTHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/smbbucket_3.txt' INTO TABLE src_a_data
+POSTHOOK: type: LOAD
+#### A masked pattern was here ####
+POSTHOOK: Output: default@src_a_data
+PREHOOK: query: SELECT s.keya, s.keyb, c.key keyc
+FROM (
+ SELECT a.key keya, b.key keyb
+ FROM src_a_data a
+ LEFT OUTER JOIN src_a_data b ON (a.key=b.key)
+) s
+LEFT OUTER JOIN src_a_data c ON (s.keyb=c.key AND s.keyb<10)
+WHERE s.keya<20
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src_a_data
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT s.keya, s.keyb, c.key keyc
+FROM (
+ SELECT a.key keya, b.key keyb
+ FROM src_a_data a
+ LEFT OUTER JOIN src_a_data b ON (a.key=b.key)
+) s
+LEFT OUTER JOIN src_a_data c ON (s.keyb=c.key AND s.keyb<10)
+WHERE s.keya<20
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src_a_data
+#### A masked pattern was here ####
+4 4 4
+10 10 NULL
+17 17 NULL
+19 19 NULL
+PREHOOK: query: SELECT a.key keya, b.key keyb, c.key keyc
+FROM src_a_data a
+LEFT OUTER JOIN src_a_data b ON (a.key=b.key)
+LEFT OUTER JOIN src_a_data c ON (b.key=c.key AND b.key<10)
+WHERE a.key<20
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src_a_data
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT a.key keya, b.key keyb, c.key keyc
+FROM src_a_data a
+LEFT OUTER JOIN src_a_data b ON (a.key=b.key)
+LEFT OUTER JOIN src_a_data c ON (b.key=c.key AND b.key<10)
+WHERE a.key<20
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src_a_data
+#### A masked pattern was here ####
+4 4 4
+10 10 NULL
+17 17 NULL
+19 19 NULL