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