You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by jc...@apache.org on 2016/09/15 14:18:33 UTC

[1/4] hive git commit: HIVE-14249: Add simple materialized views with manual rebuilds (2) (Jesus Camacho Rodriguez, reviewed by Alan Gates)

Repository: hive
Updated Branches:
  refs/heads/master 7f8263e28 -> 5179558cc


http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/test/results/clientpositive/materialized_view_create.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/materialized_view_create.q.out b/ql/src/test/results/clientpositive/materialized_view_create.q.out
index c51357d..c2c6a15 100644
--- a/ql/src/test/results/clientpositive/materialized_view_create.q.out
+++ b/ql/src/test/results/clientpositive/materialized_view_create.q.out
@@ -18,12 +18,12 @@ POSTHOOK: Lineage: cmv_basetable.a EXPRESSION [(values__tmp__table__1)values__tm
 POSTHOOK: Lineage: cmv_basetable.b EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ]
 POSTHOOK: Lineage: cmv_basetable.c EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col3, type:string, comment:), ]
 PREHOOK: query: create materialized view cmv_mat_view as select a, b, c from cmv_basetable
-PREHOOK: type: CREATEVIEW
+PREHOOK: type: CREATE_MATERIALIZED_VIEW
 PREHOOK: Input: default@cmv_basetable
 PREHOOK: Output: database:default
 PREHOOK: Output: default@cmv_mat_view
 POSTHOOK: query: create materialized view cmv_mat_view as select a, b, c from cmv_basetable
-POSTHOOK: type: CREATEVIEW
+POSTHOOK: type: CREATE_MATERIALIZED_VIEW
 POSTHOOK: Input: default@cmv_basetable
 POSTHOOK: Output: database:default
 POSTHOOK: Output: default@cmv_mat_view
@@ -35,18 +35,18 @@ POSTHOOK: query: select * from cmv_mat_view
 POSTHOOK: type: QUERY
 POSTHOOK: Input: default@cmv_mat_view
 #### A masked pattern was here ####
-1	alfred	10.3
+1	alfred	10.30
 2	bob	3.14
-2	bonnie	172342.2
+2	bonnie	172342.20
 3	calvin	978.76
-3	charlie	9.8
+3	charlie	9.80
 PREHOOK: query: create materialized view if not exists cmv_mat_view2 as select a, c from cmv_basetable
-PREHOOK: type: CREATEVIEW
+PREHOOK: type: CREATE_MATERIALIZED_VIEW
 PREHOOK: Input: default@cmv_basetable
 PREHOOK: Output: database:default
 PREHOOK: Output: default@cmv_mat_view2
 POSTHOOK: query: create materialized view if not exists cmv_mat_view2 as select a, c from cmv_basetable
-POSTHOOK: type: CREATEVIEW
+POSTHOOK: type: CREATE_MATERIALIZED_VIEW
 POSTHOOK: Input: default@cmv_basetable
 POSTHOOK: Output: database:default
 POSTHOOK: Output: default@cmv_mat_view2
@@ -58,18 +58,18 @@ POSTHOOK: query: select * from cmv_mat_view2
 POSTHOOK: type: QUERY
 POSTHOOK: Input: default@cmv_mat_view2
 #### A masked pattern was here ####
-1	10.3
+1	10.30
 2	3.14
-2	172342.2
+2	172342.20
 3	978.76
-3	9.8
+3	9.80
 PREHOOK: query: create materialized view if not exists cmv_mat_view3 as select * from cmv_basetable where a > 1
-PREHOOK: type: CREATEVIEW
+PREHOOK: type: CREATE_MATERIALIZED_VIEW
 PREHOOK: Input: default@cmv_basetable
 PREHOOK: Output: database:default
 PREHOOK: Output: default@cmv_mat_view3
 POSTHOOK: query: create materialized view if not exists cmv_mat_view3 as select * from cmv_basetable where a > 1
-POSTHOOK: type: CREATEVIEW
+POSTHOOK: type: CREATE_MATERIALIZED_VIEW
 POSTHOOK: Input: default@cmv_basetable
 POSTHOOK: Output: database:default
 POSTHOOK: Output: default@cmv_mat_view3
@@ -82,16 +82,16 @@ POSTHOOK: type: QUERY
 POSTHOOK: Input: default@cmv_mat_view3
 #### A masked pattern was here ####
 2	bob	3.14
-2	bonnie	172342.2
+2	bonnie	172342.20
 3	calvin	978.76
-3	charlie	9.8
+3	charlie	9.80
 PREHOOK: query: create materialized view cmv_mat_view4 comment 'this is a comment' as select a, sum(c) from cmv_basetable group by a
-PREHOOK: type: CREATEVIEW
+PREHOOK: type: CREATE_MATERIALIZED_VIEW
 PREHOOK: Input: default@cmv_basetable
 PREHOOK: Output: database:default
 PREHOOK: Output: default@cmv_mat_view4
 POSTHOOK: query: create materialized view cmv_mat_view4 comment 'this is a comment' as select a, sum(c) from cmv_basetable group by a
-POSTHOOK: type: CREATEVIEW
+POSTHOOK: type: CREATE_MATERIALIZED_VIEW
 POSTHOOK: Input: default@cmv_basetable
 POSTHOOK: Output: database:default
 POSTHOOK: Output: default@cmv_mat_view4
@@ -103,7 +103,7 @@ POSTHOOK: query: select * from cmv_mat_view4
 POSTHOOK: type: QUERY
 POSTHOOK: Input: default@cmv_mat_view4
 #### A masked pattern was here ####
-1	10.3
+1	10.30
 2	172345.34
 3	988.56
 PREHOOK: query: describe extended cmv_mat_view4
@@ -113,7 +113,7 @@ POSTHOOK: query: describe extended cmv_mat_view4
 POSTHOOK: type: DESCTABLE
 POSTHOOK: Input: default@cmv_mat_view4
 a                   	int                 	                    
-_c1                 	decimal(20,2)       	                    
+c1                  	decimal(20,2)       	                    
 	 	 
 #### A masked pattern was here ####
 PREHOOK: query: create table cmv_basetable2 (d int, e varchar(256), f decimal(10,2))
@@ -136,13 +136,13 @@ POSTHOOK: Lineage: cmv_basetable2.d EXPRESSION [(values__tmp__table__2)values__t
 POSTHOOK: Lineage: cmv_basetable2.e EXPRESSION [(values__tmp__table__2)values__tmp__table__2.FieldSchema(name:tmp_values_col2, type:string, comment:), ]
 POSTHOOK: Lineage: cmv_basetable2.f EXPRESSION [(values__tmp__table__2)values__tmp__table__2.FieldSchema(name:tmp_values_col3, type:string, comment:), ]
 PREHOOK: query: create materialized view cmv_mat_view5 tblproperties ('key'='value') as select a, b, d, c, f from cmv_basetable t1 join cmv_basetable2 t2 on (t1.b = t2.e)
-PREHOOK: type: CREATEVIEW
+PREHOOK: type: CREATE_MATERIALIZED_VIEW
 PREHOOK: Input: default@cmv_basetable
 PREHOOK: Input: default@cmv_basetable2
 PREHOOK: Output: database:default
 PREHOOK: Output: default@cmv_mat_view5
 POSTHOOK: query: create materialized view cmv_mat_view5 tblproperties ('key'='value') as select a, b, d, c, f from cmv_basetable t1 join cmv_basetable2 t2 on (t1.b = t2.e)
-POSTHOOK: type: CREATEVIEW
+POSTHOOK: type: CREATE_MATERIALIZED_VIEW
 POSTHOOK: Input: default@cmv_basetable
 POSTHOOK: Input: default@cmv_basetable2
 POSTHOOK: Output: database:default
@@ -155,19 +155,16 @@ POSTHOOK: query: select * from cmv_mat_view5
 POSTHOOK: type: QUERY
 POSTHOOK: Input: default@cmv_mat_view5
 #### A masked pattern was here ####
-1	alfred	4	10.3	100.3
-2	bob	4	3.14	6133
-2	bonnie	5	172342.2	172.2
+1	alfred	4	10.30	100.30
+2	bob	4	3.14	6133.00
+2	bonnie	5	172342.20	172.20
 3	calvin	6	978.76	8.76
-3	charlie	17	9.8	13144339.8
+3	charlie	17	9.80	13144339.80
 PREHOOK: query: show tblproperties cmv_mat_view5
 PREHOOK: type: SHOW_TBLPROPERTIES
 POSTHOOK: query: show tblproperties cmv_mat_view5
 POSTHOOK: type: SHOW_TBLPROPERTIES
-COLUMN_STATS_ACCURATE	false
 key	value
 numFiles	1
-numRows	-1
-rawDataSize	-1
-totalSize	730
+totalSize	710
 #### A masked pattern was here ####

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/test/results/clientpositive/materialized_view_describe.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/materialized_view_describe.q.out b/ql/src/test/results/clientpositive/materialized_view_describe.q.out
new file mode 100644
index 0000000..5714198
--- /dev/null
+++ b/ql/src/test/results/clientpositive/materialized_view_describe.q.out
@@ -0,0 +1,335 @@
+PREHOOK: query: create table cmv_basetable (a int, b varchar(256), c decimal(10,2))
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@cmv_basetable
+POSTHOOK: query: create table cmv_basetable (a int, b varchar(256), c decimal(10,2))
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@cmv_basetable
+PREHOOK: query: insert into cmv_basetable values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@values__tmp__table__1
+PREHOOK: Output: default@cmv_basetable
+POSTHOOK: query: insert into cmv_basetable values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@values__tmp__table__1
+POSTHOOK: Output: default@cmv_basetable
+POSTHOOK: Lineage: cmv_basetable.a EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ]
+POSTHOOK: Lineage: cmv_basetable.b EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ]
+POSTHOOK: Lineage: cmv_basetable.c EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col3, type:string, comment:), ]
+PREHOOK: query: create materialized view cmv_mat_view
+comment 'this is the first view'
+tblproperties ('key'='foo') as select a, c from cmv_basetable
+PREHOOK: type: CREATE_MATERIALIZED_VIEW
+PREHOOK: Input: default@cmv_basetable
+PREHOOK: Output: database:default
+PREHOOK: Output: default@cmv_mat_view
+POSTHOOK: query: create materialized view cmv_mat_view
+comment 'this is the first view'
+tblproperties ('key'='foo') as select a, c from cmv_basetable
+POSTHOOK: type: CREATE_MATERIALIZED_VIEW
+POSTHOOK: Input: default@cmv_basetable
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@cmv_mat_view
+PREHOOK: query: describe cmv_mat_view
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@cmv_mat_view
+POSTHOOK: query: describe cmv_mat_view
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@cmv_mat_view
+a                   	int                 	                    
+c                   	decimal(10,2)       	                    
+PREHOOK: query: describe extended cmv_mat_view
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@cmv_mat_view
+POSTHOOK: query: describe extended cmv_mat_view
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@cmv_mat_view
+a                   	int                 	                    
+c                   	decimal(10,2)       	                    
+	 	 
+#### A masked pattern was here ####
+PREHOOK: query: describe formatted cmv_mat_view
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@cmv_mat_view
+POSTHOOK: query: describe formatted cmv_mat_view
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@cmv_mat_view
+# col_name            	data_type           	comment             
+	 	 
+a                   	int                 	                    
+c                   	decimal(10,2)       	                    
+	 	 
+# Detailed Table Information	 	 
+Database:           	default             	 
+#### A masked pattern was here ####
+Retention:          	0                   	 
+#### A masked pattern was here ####
+Table Type:         	MATERIALIZED_VIEW   	 
+Table Parameters:	 	 
+	comment             	this is the first view
+	key                 	foo                 
+	numFiles            	1                   
+	totalSize           	346                 
+#### A masked pattern was here ####
+	 	 
+# Storage Information	 	 
+SerDe Library:      	org.apache.hadoop.hive.ql.io.orc.OrcSerde	 
+InputFormat:        	org.apache.hadoop.hive.ql.io.orc.OrcInputFormat	 
+OutputFormat:       	org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat	 
+Compressed:         	No                  	 
+Num Buckets:        	-1                  	 
+Bucket Columns:     	[]                  	 
+Sort Columns:       	[]                  	 
+PREHOOK: query: show tblproperties cmv_mat_view
+PREHOOK: type: SHOW_TBLPROPERTIES
+POSTHOOK: query: show tblproperties cmv_mat_view
+POSTHOOK: type: SHOW_TBLPROPERTIES
+comment	this is the first view
+key	foo
+numFiles	1
+totalSize	346
+#### A masked pattern was here ####
+PREHOOK: query: select a, c from cmv_mat_view
+PREHOOK: type: QUERY
+PREHOOK: Input: default@cmv_mat_view
+#### A masked pattern was here ####
+POSTHOOK: query: select a, c from cmv_mat_view
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@cmv_mat_view
+#### A masked pattern was here ####
+1	10.30
+2	3.14
+2	172342.20
+3	978.76
+3	9.80
+PREHOOK: query: drop materialized view cmv_mat_view
+PREHOOK: type: DROP_MATERIALIZED_VIEW
+PREHOOK: Input: default@cmv_mat_view
+PREHOOK: Output: default@cmv_mat_view
+POSTHOOK: query: drop materialized view cmv_mat_view
+POSTHOOK: type: DROP_MATERIALIZED_VIEW
+POSTHOOK: Input: default@cmv_mat_view
+POSTHOOK: Output: default@cmv_mat_view
+PREHOOK: query: create materialized view cmv_mat_view2
+comment 'this is the second view'
+stored as textfile
+tblproperties ('key'='alice','key2'='bob') as select a from cmv_basetable
+PREHOOK: type: CREATE_MATERIALIZED_VIEW
+PREHOOK: Input: default@cmv_basetable
+PREHOOK: Output: database:default
+PREHOOK: Output: default@cmv_mat_view2
+POSTHOOK: query: create materialized view cmv_mat_view2
+comment 'this is the second view'
+stored as textfile
+tblproperties ('key'='alice','key2'='bob') as select a from cmv_basetable
+POSTHOOK: type: CREATE_MATERIALIZED_VIEW
+POSTHOOK: Input: default@cmv_basetable
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@cmv_mat_view2
+PREHOOK: query: describe formatted cmv_mat_view2
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@cmv_mat_view2
+POSTHOOK: query: describe formatted cmv_mat_view2
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@cmv_mat_view2
+# col_name            	data_type           	comment             
+	 	 
+a                   	int                 	                    
+	 	 
+# Detailed Table Information	 	 
+Database:           	default             	 
+#### A masked pattern was here ####
+Retention:          	0                   	 
+#### A masked pattern was here ####
+Table Type:         	MATERIALIZED_VIEW   	 
+Table Parameters:	 	 
+	comment             	this is the second view
+	key                 	alice               
+	key2                	bob                 
+	numFiles            	1                   
+	totalSize           	10                  
+#### A masked pattern was here ####
+	 	 
+# Storage Information	 	 
+SerDe Library:      	org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe	 
+InputFormat:        	org.apache.hadoop.mapred.TextInputFormat	 
+OutputFormat:       	org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat	 
+Compressed:         	No                  	 
+Num Buckets:        	-1                  	 
+Bucket Columns:     	[]                  	 
+Sort Columns:       	[]                  	 
+PREHOOK: query: select a from cmv_mat_view2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@cmv_mat_view2
+#### A masked pattern was here ####
+POSTHOOK: query: select a from cmv_mat_view2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@cmv_mat_view2
+#### A masked pattern was here ####
+1
+2
+2
+3
+3
+PREHOOK: query: drop materialized view cmv_mat_view2
+PREHOOK: type: DROP_MATERIALIZED_VIEW
+PREHOOK: Input: default@cmv_mat_view2
+PREHOOK: Output: default@cmv_mat_view2
+POSTHOOK: query: drop materialized view cmv_mat_view2
+POSTHOOK: type: DROP_MATERIALIZED_VIEW
+POSTHOOK: Input: default@cmv_mat_view2
+POSTHOOK: Output: default@cmv_mat_view2
+PREHOOK: query: create materialized view cmv_mat_view3
+comment 'this is the third view'
+row format
+  delimited fields terminated by '\t'
+as select * from cmv_basetable
+PREHOOK: type: CREATE_MATERIALIZED_VIEW
+PREHOOK: Input: default@cmv_basetable
+PREHOOK: Output: database:default
+PREHOOK: Output: default@cmv_mat_view3
+POSTHOOK: query: create materialized view cmv_mat_view3
+comment 'this is the third view'
+row format
+  delimited fields terminated by '\t'
+as select * from cmv_basetable
+POSTHOOK: type: CREATE_MATERIALIZED_VIEW
+POSTHOOK: Input: default@cmv_basetable
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@cmv_mat_view3
+PREHOOK: query: describe formatted cmv_mat_view3
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@cmv_mat_view3
+POSTHOOK: query: describe formatted cmv_mat_view3
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@cmv_mat_view3
+# col_name            	data_type           	comment             
+	 	 
+a                   	int                 	                    
+b                   	varchar(256)        	                    
+c                   	decimal(10,2)       	                    
+	 	 
+# Detailed Table Information	 	 
+Database:           	default             	 
+#### A masked pattern was here ####
+Retention:          	0                   	 
+#### A masked pattern was here ####
+Table Type:         	MATERIALIZED_VIEW   	 
+Table Parameters:	 	 
+	comment             	this is the third view
+	numFiles            	1                   
+	totalSize           	497                 
+#### A masked pattern was here ####
+	 	 
+# Storage Information	 	 
+SerDe Library:      	org.apache.hadoop.hive.ql.io.orc.OrcSerde	 
+InputFormat:        	org.apache.hadoop.hive.ql.io.orc.OrcInputFormat	 
+OutputFormat:       	org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat	 
+Compressed:         	No                  	 
+Num Buckets:        	-1                  	 
+Bucket Columns:     	[]                  	 
+Sort Columns:       	[]                  	 
+PREHOOK: query: select a, b, c from cmv_mat_view3
+PREHOOK: type: QUERY
+PREHOOK: Input: default@cmv_mat_view3
+#### A masked pattern was here ####
+POSTHOOK: query: select a, b, c from cmv_mat_view3
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@cmv_mat_view3
+#### A masked pattern was here ####
+1	alfred	10.30
+2	bob	3.14
+2	bonnie	172342.20
+3	calvin	978.76
+3	charlie	9.80
+PREHOOK: query: select distinct a from cmv_mat_view3
+PREHOOK: type: QUERY
+PREHOOK: Input: default@cmv_mat_view3
+#### A masked pattern was here ####
+POSTHOOK: query: select distinct a from cmv_mat_view3
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@cmv_mat_view3
+#### A masked pattern was here ####
+1
+2
+3
+PREHOOK: query: drop materialized view cmv_mat_view3
+PREHOOK: type: DROP_MATERIALIZED_VIEW
+PREHOOK: Input: default@cmv_mat_view3
+PREHOOK: Output: default@cmv_mat_view3
+POSTHOOK: query: drop materialized view cmv_mat_view3
+POSTHOOK: type: DROP_MATERIALIZED_VIEW
+POSTHOOK: Input: default@cmv_mat_view3
+POSTHOOK: Output: default@cmv_mat_view3
+PREHOOK: query: create materialized view cmv_mat_view4
+comment 'this is the last view'
+stored as textfile
+#### A masked pattern was here ####
+as select a from cmv_basetable
+PREHOOK: type: CREATE_MATERIALIZED_VIEW
+PREHOOK: Input: default@cmv_basetable
+#### A masked pattern was here ####
+PREHOOK: Output: database:default
+PREHOOK: Output: default@cmv_mat_view4
+POSTHOOK: query: create materialized view cmv_mat_view4
+comment 'this is the last view'
+stored as textfile
+#### A masked pattern was here ####
+as select a from cmv_basetable
+POSTHOOK: type: CREATE_MATERIALIZED_VIEW
+POSTHOOK: Input: default@cmv_basetable
+#### A masked pattern was here ####
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@cmv_mat_view4
+PREHOOK: query: describe formatted cmv_mat_view4
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@cmv_mat_view4
+POSTHOOK: query: describe formatted cmv_mat_view4
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@cmv_mat_view4
+# col_name            	data_type           	comment             
+	 	 
+a                   	int                 	                    
+	 	 
+# Detailed Table Information	 	 
+Database:           	default             	 
+#### A masked pattern was here ####
+Retention:          	0                   	 
+#### A masked pattern was here ####
+Table Type:         	MATERIALIZED_VIEW   	 
+Table Parameters:	 	 
+	comment             	this is the last view
+	numFiles            	1                   
+	totalSize           	10                  
+#### A masked pattern was here ####
+	 	 
+# Storage Information	 	 
+SerDe Library:      	org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe	 
+InputFormat:        	org.apache.hadoop.mapred.TextInputFormat	 
+OutputFormat:       	org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat	 
+Compressed:         	No                  	 
+Num Buckets:        	-1                  	 
+Bucket Columns:     	[]                  	 
+Sort Columns:       	[]                  	 
+PREHOOK: query: select a from cmv_mat_view4
+PREHOOK: type: QUERY
+PREHOOK: Input: default@cmv_mat_view4
+#### A masked pattern was here ####
+POSTHOOK: query: select a from cmv_mat_view4
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@cmv_mat_view4
+#### A masked pattern was here ####
+1
+2
+2
+3
+3
+PREHOOK: query: drop materialized view cmv_mat_view4
+PREHOOK: type: DROP_MATERIALIZED_VIEW
+PREHOOK: Input: default@cmv_mat_view4
+PREHOOK: Output: default@cmv_mat_view4
+POSTHOOK: query: drop materialized view cmv_mat_view4
+POSTHOOK: type: DROP_MATERIALIZED_VIEW
+POSTHOOK: Input: default@cmv_mat_view4
+POSTHOOK: Output: default@cmv_mat_view4

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/test/results/clientpositive/materialized_view_drop.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/materialized_view_drop.q.out b/ql/src/test/results/clientpositive/materialized_view_drop.q.out
index ed99a09..3cf13d0 100644
--- a/ql/src/test/results/clientpositive/materialized_view_drop.q.out
+++ b/ql/src/test/results/clientpositive/materialized_view_drop.q.out
@@ -1,10 +1,10 @@
 PREHOOK: query: create materialized view dmv_mat_view as select cint, cstring1 from alltypesorc where cint < 0
-PREHOOK: type: CREATEVIEW
+PREHOOK: type: CREATE_MATERIALIZED_VIEW
 PREHOOK: Input: default@alltypesorc
 PREHOOK: Output: database:default
 PREHOOK: Output: default@dmv_mat_view
 POSTHOOK: query: create materialized view dmv_mat_view as select cint, cstring1 from alltypesorc where cint < 0
-POSTHOOK: type: CREATEVIEW
+POSTHOOK: type: CREATE_MATERIALIZED_VIEW
 POSTHOOK: Input: default@alltypesorc
 POSTHOOK: Output: database:default
 POSTHOOK: Output: default@dmv_mat_view
@@ -20,17 +20,17 @@ columns:struct columns { i32 cint, string cstring1}
 partitioned:false
 partitionColumns:
 totalNumberFiles:1
-totalFileSize:47146
-maxFileSize:47146
-minFileSize:47146
+totalFileSize:47140
+maxFileSize:47140
+minFileSize:47140
 #### A masked pattern was here ####
 
 PREHOOK: query: drop materialized view dmv_mat_view
-PREHOOK: type: DROPTABLE
+PREHOOK: type: DROP_MATERIALIZED_VIEW
 PREHOOK: Input: default@dmv_mat_view
 PREHOOK: Output: default@dmv_mat_view
 POSTHOOK: query: drop materialized view dmv_mat_view
-POSTHOOK: type: DROPTABLE
+POSTHOOK: type: DROP_MATERIALIZED_VIEW
 POSTHOOK: Input: default@dmv_mat_view
 POSTHOOK: Output: default@dmv_mat_view
 PREHOOK: query: show table extended like dmv_mat_view

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/test/results/clientpositive/materialized_view_rebuild.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/materialized_view_rebuild.q.out b/ql/src/test/results/clientpositive/materialized_view_rebuild.q.out
deleted file mode 100644
index 9bede0d..0000000
--- a/ql/src/test/results/clientpositive/materialized_view_rebuild.q.out
+++ /dev/null
@@ -1,67 +0,0 @@
-PREHOOK: query: create table rmv_table (cint int, cstring1 string)
-PREHOOK: type: CREATETABLE
-PREHOOK: Output: database:default
-PREHOOK: Output: default@rmv_table
-POSTHOOK: query: create table rmv_table (cint int, cstring1 string)
-POSTHOOK: type: CREATETABLE
-POSTHOOK: Output: database:default
-POSTHOOK: Output: default@rmv_table
-PREHOOK: query: insert into rmv_table values(1, 'fred'), (10, 'wilma')
-PREHOOK: type: QUERY
-PREHOOK: Input: default@values__tmp__table__1
-PREHOOK: Output: default@rmv_table
-POSTHOOK: query: insert into rmv_table values(1, 'fred'), (10, 'wilma')
-POSTHOOK: type: QUERY
-POSTHOOK: Input: default@values__tmp__table__1
-POSTHOOK: Output: default@rmv_table
-POSTHOOK: Lineage: rmv_table.cint EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ]
-POSTHOOK: Lineage: rmv_table.cstring1 SIMPLE [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ]
-PREHOOK: query: create materialized view rmv_mat_view as select cint, cstring1 from rmv_table where cint < 10
-PREHOOK: type: CREATEVIEW
-PREHOOK: Input: default@rmv_table
-PREHOOK: Output: database:default
-PREHOOK: Output: default@rmv_mat_view
-POSTHOOK: query: create materialized view rmv_mat_view as select cint, cstring1 from rmv_table where cint < 10
-POSTHOOK: type: CREATEVIEW
-POSTHOOK: Input: default@rmv_table
-POSTHOOK: Output: database:default
-POSTHOOK: Output: default@rmv_mat_view
-PREHOOK: query: select * from rmv_mat_view
-PREHOOK: type: QUERY
-PREHOOK: Input: default@rmv_mat_view
-#### A masked pattern was here ####
-POSTHOOK: query: select * from rmv_mat_view
-POSTHOOK: type: QUERY
-POSTHOOK: Input: default@rmv_mat_view
-#### A masked pattern was here ####
-1	fred
-PREHOOK: query: insert into rmv_table values(2, 'barney'), (11, 'betty')
-PREHOOK: type: QUERY
-PREHOOK: Input: default@values__tmp__table__2
-PREHOOK: Output: default@rmv_table
-POSTHOOK: query: insert into rmv_table values(2, 'barney'), (11, 'betty')
-POSTHOOK: type: QUERY
-POSTHOOK: Input: default@values__tmp__table__2
-POSTHOOK: Output: default@rmv_table
-POSTHOOK: Lineage: rmv_table.cint EXPRESSION [(values__tmp__table__2)values__tmp__table__2.FieldSchema(name:tmp_values_col1, type:string, comment:), ]
-POSTHOOK: Lineage: rmv_table.cstring1 SIMPLE [(values__tmp__table__2)values__tmp__table__2.FieldSchema(name:tmp_values_col2, type:string, comment:), ]
-PREHOOK: query: alter materialized view rmv_mat_view rebuild
-PREHOOK: type: CREATEVIEW
-PREHOOK: Input: default@rmv_table
-PREHOOK: Output: database:default
-PREHOOK: Output: default@rmv_mat_view
-POSTHOOK: query: alter materialized view rmv_mat_view rebuild
-POSTHOOK: type: CREATEVIEW
-POSTHOOK: Input: default@rmv_table
-POSTHOOK: Output: database:default
-POSTHOOK: Output: default@rmv_mat_view
-PREHOOK: query: select * from rmv_mat_view
-PREHOOK: type: QUERY
-PREHOOK: Input: default@rmv_mat_view
-#### A masked pattern was here ####
-POSTHOOK: query: select * from rmv_mat_view
-POSTHOOK: type: QUERY
-POSTHOOK: Input: default@rmv_mat_view
-#### A masked pattern was here ####
-1	fred
-2	barney


[3/4] hive git commit: HIVE-14249: Add simple materialized views with manual rebuilds (1) (Alan Gates, reviewed by Jesus Camacho Rodriguez)

Posted by jc...@apache.org.
http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/queries/clientpositive/materialized_view_authorization_sqlstd.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/materialized_view_authorization_sqlstd.q b/ql/src/test/queries/clientpositive/materialized_view_authorization_sqlstd.q
new file mode 100644
index 0000000..87a53e9
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/materialized_view_authorization_sqlstd.q
@@ -0,0 +1,58 @@
+set hive.test.authz.sstd.hs2.mode=true;
+set hive.security.authorization.manager=org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactoryForTest;
+set hive.security.authenticator.manager=org.apache.hadoop.hive.ql.security.SessionStateConfigUserAuthenticator;
+set hive.security.authorization.enabled=true;
+set user.name=user1;
+
+create table amvs_table (a int, b varchar(256), c decimal(10,2));
+
+insert into amvs_table values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8);
+
+create materialized view amvs_mat_view as select a, c from amvs_table;
+
+show grant user user1 on table amvs_mat_view;
+
+grant select on amvs_mat_view to user user2;
+
+set user.name=user2;
+show grant user user2 on table amvs_mat_view;
+select * from amvs_mat_view;
+
+set user.name=user3;
+show grant user user3 on table amvs_mat_view;
+
+
+set user.name=hive_admin_user;
+set role admin;
+show grant on table amvs_mat_view;
+
+set user.name=user1;
+revoke select on table amvs_mat_view from user user2;
+set user.name=user2;
+show grant user user2 on table amvs_mat_view;
+
+set user.name=hive_admin_user;
+set role ADMIN;
+create role role_v;
+grant  role_v to user user4 ;
+show role grant user user4;
+show roles;
+
+grant all on table amvs_mat_view to role role_v;
+show grant role role_v on table amvs_mat_view;
+show grant user user4 on table amvs_mat_view;
+select * from amvs_mat_view;
+
+set user.name=user1;
+alter materialized view amvs_mat_view rebuild;
+
+grant select on table amvs_table to user user2 with grant option;
+set user.name=user2;
+create materialized view amvs_mat_view2 as select a, b from amvs_table;
+
+select * from amvs_mat_view2;
+
+drop materialized view amvs_mat_view2;
+
+set user.name=hive_admin_user;
+set role ADMIN;

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/queries/clientpositive/materialized_view_create.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/materialized_view_create.q b/ql/src/test/queries/clientpositive/materialized_view_create.q
new file mode 100644
index 0000000..57f8bb7
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/materialized_view_create.q
@@ -0,0 +1,31 @@
+create table cmv_basetable (a int, b varchar(256), c decimal(10,2));
+
+insert into cmv_basetable values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8);
+
+create materialized view cmv_mat_view as select a, b, c from cmv_basetable;
+
+select * from cmv_mat_view;
+
+create materialized view if not exists cmv_mat_view2 as select a, c from cmv_basetable;
+
+select * from cmv_mat_view2;
+
+create materialized view if not exists cmv_mat_view3 as select * from cmv_basetable where a > 1;
+
+select * from cmv_mat_view3;
+
+create materialized view cmv_mat_view4 comment 'this is a comment' as select a, sum(c) from cmv_basetable group by a;
+
+select * from cmv_mat_view4;
+
+describe extended cmv_mat_view4;
+
+create table cmv_basetable2 (d int, e varchar(256), f decimal(10,2));
+
+insert into cmv_basetable2 values (4, 'alfred', 100.30),(4, 'bob', 6133,14),(5, 'bonnie', 172.2),(6, 'calvin', 8.76),(17, 'charlie', 13144339.8);
+
+create materialized view cmv_mat_view5 tblproperties ('key'='value') as select a, b, d, c, f from cmv_basetable t1 join cmv_basetable2 t2 on (t1.b = t2.e);
+
+select * from cmv_mat_view5;
+
+show tblproperties cmv_mat_view5;

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/queries/clientpositive/materialized_view_drop.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/materialized_view_drop.q b/ql/src/test/queries/clientpositive/materialized_view_drop.q
new file mode 100644
index 0000000..8897159
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/materialized_view_drop.q
@@ -0,0 +1,7 @@
+create materialized view dmv_mat_view as select cint, cstring1 from alltypesorc where cint < 0;
+
+show table extended like dmv_mat_view;
+
+drop materialized view dmv_mat_view;
+
+show table extended like dmv_mat_view;

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/queries/clientpositive/materialized_view_rebuild.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/materialized_view_rebuild.q b/ql/src/test/queries/clientpositive/materialized_view_rebuild.q
new file mode 100644
index 0000000..c0a5530
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/materialized_view_rebuild.q
@@ -0,0 +1,13 @@
+create table rmv_table (cint int, cstring1 string);
+
+insert into rmv_table values(1, 'fred'), (10, 'wilma');
+
+create materialized view rmv_mat_view as select cint, cstring1 from rmv_table where cint < 10;
+
+select * from rmv_mat_view;
+
+insert into rmv_table values(2, 'barney'), (11, 'betty');
+
+alter materialized view rmv_mat_view rebuild;
+
+select * from rmv_mat_view;

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/queries/clientpositive/view_authorization_sqlstd.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/view_authorization_sqlstd.q b/ql/src/test/queries/clientpositive/view_authorization_sqlstd.q
new file mode 100644
index 0000000..64c5520
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/view_authorization_sqlstd.q
@@ -0,0 +1,89 @@
+set hive.test.authz.sstd.hs2.mode=true;
+set hive.security.authorization.manager=org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactoryForTest;
+set hive.security.authenticator.manager=org.apache.hadoop.hive.ql.security.SessionStateConfigUserAuthenticator;
+set hive.security.authorization.enabled=true;
+set user.name=user1;
+
+-- Test view authorization , and 'show grant' variants
+
+create table t1(i int, j int, k int);
+grant select on t1 to user user2 with grant option;
+show grant user user1 on table t1;
+
+-- protecting certain columns
+create view vt1 as select i,k from t1;
+
+-- protecting certain rows
+create view vt2 as select * from t1 where i > 1;
+
+show grant user user1 on all;
+
+--view grant to user
+-- try with and without table keyword
+
+grant select on vt1 to user user2;
+grant insert on table vt1 to user user3;
+
+set user.name=user2;
+show grant user user2 on table vt1;
+create view vt3 as select i,k from t1;
+
+set user.name=user3;
+show grant user user3 on table vt1;
+
+
+set user.name=user2;
+
+explain authorization select * from vt1;
+select * from vt1;
+
+-- verify input objects required does not include table
+-- even if view is within a sub query
+select * from (select * from vt1) a;
+
+select * from vt1 union all select * from vt1;
+
+set user.name=user1;
+
+grant all on table vt2 to user user2;
+
+set user.name=user2;
+show grant user user2 on table vt2;
+show grant user user2 on all;
+set user.name=user1;
+
+revoke all on vt2 from user user2;
+
+set user.name=user2;
+show grant user user2 on table vt2;
+
+
+set user.name=hive_admin_user;
+set role admin;
+show grant on table vt2;
+
+set user.name=user1;
+revoke select on table vt1 from user user2;
+
+set user.name=user2;
+show grant user user2 on table vt1;
+show grant user user2 on all;
+
+set user.name=user3;
+-- grant privileges on roles for view, after next statement
+show grant user user3 on table vt1;
+
+set user.name=hive_admin_user;
+show current roles;
+set role ADMIN;
+create role role_v;
+grant  role_v to user user4 ;
+show role grant user user4;
+show roles;
+
+grant all on table vt2 to role role_v;
+show grant role role_v on table vt2;
+
+revoke delete on table vt2 from role role_v;
+show grant role role_v on table vt2;
+show grant on table vt2;

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/results/clientnegative/materialized_view_authorization_create_no_grant.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/materialized_view_authorization_create_no_grant.q.out b/ql/src/test/results/clientnegative/materialized_view_authorization_create_no_grant.q.out
new file mode 100644
index 0000000..8c6da0d
--- /dev/null
+++ b/ql/src/test/results/clientnegative/materialized_view_authorization_create_no_grant.q.out
@@ -0,0 +1,26 @@
+PREHOOK: query: create table amvcng_gtable (a int, b varchar(256), c decimal(10,2))
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@amvcng_gtable
+POSTHOOK: query: create table amvcng_gtable (a int, b varchar(256), c decimal(10,2))
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@amvcng_gtable
+PREHOOK: query: insert into amvcng_gtable values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@values__tmp__table__1
+PREHOOK: Output: default@amvcng_gtable
+POSTHOOK: query: insert into amvcng_gtable values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@values__tmp__table__1
+POSTHOOK: Output: default@amvcng_gtable
+POSTHOOK: Lineage: amvcng_gtable.a EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ]
+POSTHOOK: Lineage: amvcng_gtable.b EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ]
+POSTHOOK: Lineage: amvcng_gtable.c EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col3, type:string, comment:), ]
+PREHOOK: query: grant select on table amvcng_gtable to user user2
+PREHOOK: type: GRANT_PRIVILEGE
+PREHOOK: Output: default@amvcng_gtable
+POSTHOOK: query: grant select on table amvcng_gtable to user user2
+POSTHOOK: type: GRANT_PRIVILEGE
+POSTHOOK: Output: default@amvcng_gtable
+FAILED: HiveAccessControlException Permission denied: Principal [name=user2, type=USER] does not have following privileges for operation CREATE_MATERIALIZED_VIEW [[SELECT with grant] on Object [type=TABLE_OR_VIEW, name=default.amvcng_gtable]]

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/results/clientnegative/materialized_view_authorization_create_no_select_perm.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/materialized_view_authorization_create_no_select_perm.q.out b/ql/src/test/results/clientnegative/materialized_view_authorization_create_no_select_perm.q.out
new file mode 100644
index 0000000..67d3474
--- /dev/null
+++ b/ql/src/test/results/clientnegative/materialized_view_authorization_create_no_select_perm.q.out
@@ -0,0 +1,20 @@
+PREHOOK: query: create table amvnsp_table (a int, b varchar(256), c decimal(10,2))
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@amvnsp_table
+POSTHOOK: query: create table amvnsp_table (a int, b varchar(256), c decimal(10,2))
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@amvnsp_table
+PREHOOK: query: insert into amvnsp_table values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@values__tmp__table__1
+PREHOOK: Output: default@amvnsp_table
+POSTHOOK: query: insert into amvnsp_table values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@values__tmp__table__1
+POSTHOOK: Output: default@amvnsp_table
+POSTHOOK: Lineage: amvnsp_table.a EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ]
+POSTHOOK: Lineage: amvnsp_table.b EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ]
+POSTHOOK: Lineage: amvnsp_table.c EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col3, type:string, comment:), ]
+FAILED: HiveAccessControlException Permission denied: Principal [name=user2, type=USER] does not have following privileges for operation CREATE_MATERIALIZED_VIEW [[SELECT with grant] on Object [type=TABLE_OR_VIEW, name=default.amvnsp_table]]

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/results/clientnegative/materialized_view_authorization_drop_other.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/materialized_view_authorization_drop_other.q.out b/ql/src/test/results/clientnegative/materialized_view_authorization_drop_other.q.out
new file mode 100644
index 0000000..d1aff33
--- /dev/null
+++ b/ql/src/test/results/clientnegative/materialized_view_authorization_drop_other.q.out
@@ -0,0 +1,30 @@
+PREHOOK: query: create table amvdo_table (a int, b varchar(256), c decimal(10,2))
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@amvdo_table
+POSTHOOK: query: create table amvdo_table (a int, b varchar(256), c decimal(10,2))
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@amvdo_table
+PREHOOK: query: insert into amvdo_table values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@values__tmp__table__1
+PREHOOK: Output: default@amvdo_table
+POSTHOOK: query: insert into amvdo_table values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@values__tmp__table__1
+POSTHOOK: Output: default@amvdo_table
+POSTHOOK: Lineage: amvdo_table.a EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ]
+POSTHOOK: Lineage: amvdo_table.b EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ]
+POSTHOOK: Lineage: amvdo_table.c EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col3, type:string, comment:), ]
+PREHOOK: query: create materialized view amvdo_mat_view as select a, c from amvdo_table
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@amvdo_table
+PREHOOK: Output: database:default
+PREHOOK: Output: default@amvdo_mat_view
+POSTHOOK: query: create materialized view amvdo_mat_view as select a, c from amvdo_table
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@amvdo_table
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@amvdo_mat_view
+FAILED: HiveAccessControlException Permission denied: Principal [name=user2, type=USER] does not have following privileges for operation DROPTABLE [[OBJECT OWNERSHIP] on Object [type=TABLE_OR_VIEW, name=default.amvdo_mat_view]]

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/results/clientnegative/materialized_view_authorization_no_select_perm.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/materialized_view_authorization_no_select_perm.q.out b/ql/src/test/results/clientnegative/materialized_view_authorization_no_select_perm.q.out
new file mode 100644
index 0000000..a3a3405
--- /dev/null
+++ b/ql/src/test/results/clientnegative/materialized_view_authorization_no_select_perm.q.out
@@ -0,0 +1,30 @@
+PREHOOK: query: create table amvnsp_table (a int, b varchar(256), c decimal(10,2))
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@amvnsp_table
+POSTHOOK: query: create table amvnsp_table (a int, b varchar(256), c decimal(10,2))
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@amvnsp_table
+PREHOOK: query: insert into amvnsp_table values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@values__tmp__table__1
+PREHOOK: Output: default@amvnsp_table
+POSTHOOK: query: insert into amvnsp_table values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@values__tmp__table__1
+POSTHOOK: Output: default@amvnsp_table
+POSTHOOK: Lineage: amvnsp_table.a EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ]
+POSTHOOK: Lineage: amvnsp_table.b EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ]
+POSTHOOK: Lineage: amvnsp_table.c EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col3, type:string, comment:), ]
+PREHOOK: query: create materialized view amvnsp_mat_view as select a, c from amvnsp_table
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@amvnsp_table
+PREHOOK: Output: database:default
+PREHOOK: Output: default@amvnsp_mat_view
+POSTHOOK: query: create materialized view amvnsp_mat_view as select a, c from amvnsp_table
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@amvnsp_table
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@amvnsp_mat_view
+FAILED: HiveAccessControlException Permission denied: Principal [name=user2, type=USER] does not have following privileges for operation QUERY [[SELECT] on Object [type=TABLE_OR_VIEW, name=default.amvnsp_mat_view]]

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/results/clientnegative/materialized_view_authorization_rebuild_no_grant.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/materialized_view_authorization_rebuild_no_grant.q.out b/ql/src/test/results/clientnegative/materialized_view_authorization_rebuild_no_grant.q.out
new file mode 100644
index 0000000..dc7a58d
--- /dev/null
+++ b/ql/src/test/results/clientnegative/materialized_view_authorization_rebuild_no_grant.q.out
@@ -0,0 +1,42 @@
+PREHOOK: query: create table amvrng_table (a int, b varchar(256), c decimal(10,2))
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@amvrng_table
+POSTHOOK: query: create table amvrng_table (a int, b varchar(256), c decimal(10,2))
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@amvrng_table
+PREHOOK: query: insert into amvrng_table values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@values__tmp__table__1
+PREHOOK: Output: default@amvrng_table
+POSTHOOK: query: insert into amvrng_table values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@values__tmp__table__1
+POSTHOOK: Output: default@amvrng_table
+POSTHOOK: Lineage: amvrng_table.a EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ]
+POSTHOOK: Lineage: amvrng_table.b EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ]
+POSTHOOK: Lineage: amvrng_table.c EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col3, type:string, comment:), ]
+PREHOOK: query: grant select on table amvrng_table to user user2 with grant option
+PREHOOK: type: GRANT_PRIVILEGE
+PREHOOK: Output: default@amvrng_table
+POSTHOOK: query: grant select on table amvrng_table to user user2 with grant option
+POSTHOOK: type: GRANT_PRIVILEGE
+POSTHOOK: Output: default@amvrng_table
+PREHOOK: query: create materialized view amvrng_mat_view as select a, c from amvrng_table
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@amvrng_table
+PREHOOK: Output: database:default
+PREHOOK: Output: default@amvrng_mat_view
+POSTHOOK: query: create materialized view amvrng_mat_view as select a, c from amvrng_table
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@amvrng_table
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@amvrng_mat_view
+PREHOOK: query: revoke grant option for select on table amvrng_table from user user2
+PREHOOK: type: REVOKE_PRIVILEGE
+PREHOOK: Output: default@amvrng_table
+POSTHOOK: query: revoke grant option for select on table amvrng_table from user user2
+POSTHOOK: type: REVOKE_PRIVILEGE
+POSTHOOK: Output: default@amvrng_table
+FAILED: HiveAccessControlException Permission denied: Principal [name=user2, type=USER] does not have following privileges for operation CREATE_MATERIALIZED_VIEW [[SELECT with grant] on Object [type=TABLE_OR_VIEW, name=default.amvrng_table]]

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/results/clientnegative/materialized_view_authorization_rebuild_other.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/materialized_view_authorization_rebuild_other.q.out b/ql/src/test/results/clientnegative/materialized_view_authorization_rebuild_other.q.out
new file mode 100644
index 0000000..9c25b52
--- /dev/null
+++ b/ql/src/test/results/clientnegative/materialized_view_authorization_rebuild_other.q.out
@@ -0,0 +1,30 @@
+PREHOOK: query: create table amvro_table (a int, b varchar(256), c decimal(10,2))
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@amvro_table
+POSTHOOK: query: create table amvro_table (a int, b varchar(256), c decimal(10,2))
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@amvro_table
+PREHOOK: query: insert into amvro_table values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@values__tmp__table__1
+PREHOOK: Output: default@amvro_table
+POSTHOOK: query: insert into amvro_table values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@values__tmp__table__1
+POSTHOOK: Output: default@amvro_table
+POSTHOOK: Lineage: amvro_table.a EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ]
+POSTHOOK: Lineage: amvro_table.b EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ]
+POSTHOOK: Lineage: amvro_table.c EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col3, type:string, comment:), ]
+PREHOOK: query: create materialized view amvro_mat_view as select a, c from amvro_table
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@amvro_table
+PREHOOK: Output: database:default
+PREHOOK: Output: default@amvro_mat_view
+POSTHOOK: query: create materialized view amvro_mat_view as select a, c from amvro_table
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@amvro_table
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@amvro_mat_view
+FAILED: HiveAccessControlException Permission denied: Principal [name=user2, type=USER] does not have following privileges for operation CREATE_MATERIALIZED_VIEW [[SELECT with grant] on Object [type=TABLE_OR_VIEW, name=default.amvro_table]]

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/results/clientnegative/materialized_view_delete.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/materialized_view_delete.q.out b/ql/src/test/results/clientnegative/materialized_view_delete.q.out
new file mode 100644
index 0000000..6013e1c
--- /dev/null
+++ b/ql/src/test/results/clientnegative/materialized_view_delete.q.out
@@ -0,0 +1,19 @@
+PREHOOK: query: create table dmv_basetable (a int, b varchar(256), c decimal(10,2))
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@dmv_basetable
+POSTHOOK: query: create table dmv_basetable (a int, b varchar(256), c decimal(10,2))
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@dmv_basetable
+PREHOOK: query: create materialized view dmv_mat_view as select a, b, c from dmv_basetable
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@dmv_basetable
+PREHOOK: Output: database:default
+PREHOOK: Output: default@dmv_mat_view
+POSTHOOK: query: create materialized view dmv_mat_view as select a, b, c from dmv_basetable
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@dmv_basetable
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@dmv_mat_view
+FAILED: SemanticException [Error 10304]: You cannot update or delete records in a view

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/results/clientnegative/materialized_view_insert.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/materialized_view_insert.q.out b/ql/src/test/results/clientnegative/materialized_view_insert.q.out
new file mode 100644
index 0000000..08b9a78
--- /dev/null
+++ b/ql/src/test/results/clientnegative/materialized_view_insert.q.out
@@ -0,0 +1,19 @@
+PREHOOK: query: create table imv_basetable (a int, b varchar(256), c decimal(10,2))
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@imv_basetable
+POSTHOOK: query: create table imv_basetable (a int, b varchar(256), c decimal(10,2))
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@imv_basetable
+PREHOOK: query: create materialized view imv_mat_view as select a, b, c from imv_basetable
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@imv_basetable
+PREHOOK: Output: database:default
+PREHOOK: Output: default@imv_mat_view
+POSTHOOK: query: create materialized view imv_mat_view as select a, b, c from imv_basetable
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@imv_basetable
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@imv_mat_view
+FAILED: SemanticException [Error 10090]: A view cannot be used as target table for LOAD or INSERT

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/results/clientnegative/materialized_view_load.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/materialized_view_load.q.out b/ql/src/test/results/clientnegative/materialized_view_load.q.out
new file mode 100644
index 0000000..4814365
--- /dev/null
+++ b/ql/src/test/results/clientnegative/materialized_view_load.q.out
@@ -0,0 +1,19 @@
+PREHOOK: query: create table lmv_basetable (a int, b varchar(256), c decimal(10,2))
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@lmv_basetable
+POSTHOOK: query: create table lmv_basetable (a int, b varchar(256), c decimal(10,2))
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@lmv_basetable
+PREHOOK: query: create materialized view lmv_mat_view as select a, b, c from lmv_basetable
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@lmv_basetable
+PREHOOK: Output: database:default
+PREHOOK: Output: default@lmv_mat_view
+POSTHOOK: query: create materialized view lmv_mat_view as select a, b, c from lmv_basetable
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@lmv_basetable
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@lmv_mat_view
+FAILED: SemanticException [Error 10090]: A view cannot be used as target table for LOAD or INSERT

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/results/clientnegative/materialized_view_replace_with_view.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/materialized_view_replace_with_view.q.out b/ql/src/test/results/clientnegative/materialized_view_replace_with_view.q.out
new file mode 100644
index 0000000..dac3538
--- /dev/null
+++ b/ql/src/test/results/clientnegative/materialized_view_replace_with_view.q.out
@@ -0,0 +1,30 @@
+PREHOOK: query: create table rmvwv_basetable (a int, b varchar(256), c decimal(10,2))
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@rmvwv_basetable
+POSTHOOK: query: create table rmvwv_basetable (a int, b varchar(256), c decimal(10,2))
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@rmvwv_basetable
+PREHOOK: query: insert into rmvwv_basetable values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@values__tmp__table__1
+PREHOOK: Output: default@rmvwv_basetable
+POSTHOOK: query: insert into rmvwv_basetable values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@values__tmp__table__1
+POSTHOOK: Output: default@rmvwv_basetable
+POSTHOOK: Lineage: rmvwv_basetable.a EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ]
+POSTHOOK: Lineage: rmvwv_basetable.b EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ]
+POSTHOOK: Lineage: rmvwv_basetable.c EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col3, type:string, comment:), ]
+PREHOOK: query: create materialized view rmvwv_mat_view as select a, b, c from rmvwv_basetable
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@rmvwv_basetable
+PREHOOK: Output: database:default
+PREHOOK: Output: default@rmvwv_mat_view
+POSTHOOK: query: create materialized view rmvwv_mat_view as select a, b, c from rmvwv_basetable
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@rmvwv_basetable
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@rmvwv_mat_view
+FAILED: SemanticException [Error 10303]: Attempt to replace materialized view rmvwv_mat_view with view

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/results/clientnegative/materialized_view_update.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/materialized_view_update.q.out b/ql/src/test/results/clientnegative/materialized_view_update.q.out
new file mode 100644
index 0000000..bee63a8
--- /dev/null
+++ b/ql/src/test/results/clientnegative/materialized_view_update.q.out
@@ -0,0 +1,19 @@
+PREHOOK: query: create table umv_basetable (a int, b varchar(256), c decimal(10,2))
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@umv_basetable
+POSTHOOK: query: create table umv_basetable (a int, b varchar(256), c decimal(10,2))
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@umv_basetable
+PREHOOK: query: create materialized view umv_mat_view as select a, b, c from umv_basetable
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@umv_basetable
+PREHOOK: Output: database:default
+PREHOOK: Output: default@umv_mat_view
+POSTHOOK: query: create materialized view umv_mat_view as select a, b, c from umv_basetable
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@umv_basetable
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@umv_mat_view
+FAILED: SemanticException [Error 10304]: You cannot update or delete records in a view

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/results/clientnegative/view_delete.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/view_delete.q.out b/ql/src/test/results/clientnegative/view_delete.q.out
new file mode 100644
index 0000000..3e72344
--- /dev/null
+++ b/ql/src/test/results/clientnegative/view_delete.q.out
@@ -0,0 +1,19 @@
+PREHOOK: query: create table dv_basetable (a int, b varchar(256), c decimal(10,2))
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@dv_basetable
+POSTHOOK: query: create table dv_basetable (a int, b varchar(256), c decimal(10,2))
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@dv_basetable
+PREHOOK: query: create view dv_view as select a, b, c from dv_basetable
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@dv_basetable
+PREHOOK: Output: database:default
+PREHOOK: Output: default@dv_view
+POSTHOOK: query: create view dv_view as select a, b, c from dv_basetable
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@dv_basetable
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@dv_view
+FAILED: SemanticException [Error 10304]: You cannot update or delete records in a view

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/results/clientnegative/view_update.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/view_update.q.out b/ql/src/test/results/clientnegative/view_update.q.out
new file mode 100644
index 0000000..8a12665
--- /dev/null
+++ b/ql/src/test/results/clientnegative/view_update.q.out
@@ -0,0 +1,19 @@
+PREHOOK: query: create table uv_basetable (a int, b varchar(256), c decimal(10,2))
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@uv_basetable
+POSTHOOK: query: create table uv_basetable (a int, b varchar(256), c decimal(10,2))
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@uv_basetable
+PREHOOK: query: create view uv_view as select a, b, c from uv_basetable
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@uv_basetable
+PREHOOK: Output: database:default
+PREHOOK: Output: default@uv_view
+POSTHOOK: query: create view uv_view as select a, b, c from uv_basetable
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@uv_basetable
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@uv_view
+FAILED: SemanticException [Error 10304]: You cannot update or delete records in a view

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/results/clientpositive/authorization_view_sqlstd.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/authorization_view_sqlstd.q.out b/ql/src/test/results/clientpositive/authorization_view_sqlstd.q.out
deleted file mode 100644
index d2fab2f..0000000
--- a/ql/src/test/results/clientpositive/authorization_view_sqlstd.q.out
+++ /dev/null
@@ -1,269 +0,0 @@
-PREHOOK: query: -- Test view authorization , and 'show grant' variants
-
-create table t1(i int, j int, k int)
-PREHOOK: type: CREATETABLE
-PREHOOK: Output: database:default
-PREHOOK: Output: default@t1
-POSTHOOK: query: -- Test view authorization , and 'show grant' variants
-
-create table t1(i int, j int, k int)
-POSTHOOK: type: CREATETABLE
-POSTHOOK: Output: database:default
-POSTHOOK: Output: default@t1
-PREHOOK: query: show grant user user1 on table t1
-PREHOOK: type: SHOW_GRANT
-POSTHOOK: query: show grant user user1 on table t1
-POSTHOOK: type: SHOW_GRANT
-default	t1			user1	USER	DELETE	true	-1	user1
-default	t1			user1	USER	INSERT	true	-1	user1
-default	t1			user1	USER	SELECT	true	-1	user1
-default	t1			user1	USER	UPDATE	true	-1	user1
-PREHOOK: query: -- protecting certain columns
-create view vt1 as select i,k from t1
-PREHOOK: type: CREATEVIEW
-PREHOOK: Input: default@t1
-PREHOOK: Output: database:default
-PREHOOK: Output: default@vt1
-POSTHOOK: query: -- protecting certain columns
-create view vt1 as select i,k from t1
-POSTHOOK: type: CREATEVIEW
-POSTHOOK: Input: default@t1
-POSTHOOK: Output: database:default
-POSTHOOK: Output: default@vt1
-PREHOOK: query: -- protecting certain rows
-create view vt2 as select * from t1 where i > 1
-PREHOOK: type: CREATEVIEW
-PREHOOK: Input: default@t1
-PREHOOK: Output: database:default
-PREHOOK: Output: default@vt2
-POSTHOOK: query: -- protecting certain rows
-create view vt2 as select * from t1 where i > 1
-POSTHOOK: type: CREATEVIEW
-POSTHOOK: Input: default@t1
-POSTHOOK: Output: database:default
-POSTHOOK: Output: default@vt2
-PREHOOK: query: show grant user user1 on all
-PREHOOK: type: SHOW_GRANT
-POSTHOOK: query: show grant user user1 on all
-POSTHOOK: type: SHOW_GRANT
-default	t1			user1	USER	DELETE	true	-1	user1
-default	t1			user1	USER	INSERT	true	-1	user1
-default	t1			user1	USER	SELECT	true	-1	user1
-default	t1			user1	USER	UPDATE	true	-1	user1
-default	vt1			user1	USER	DELETE	true	-1	user1
-default	vt1			user1	USER	INSERT	true	-1	user1
-default	vt1			user1	USER	SELECT	true	-1	user1
-default	vt1			user1	USER	UPDATE	true	-1	user1
-default	vt2			user1	USER	DELETE	true	-1	user1
-default	vt2			user1	USER	INSERT	true	-1	user1
-default	vt2			user1	USER	SELECT	true	-1	user1
-default	vt2			user1	USER	UPDATE	true	-1	user1
-PREHOOK: query: --view grant to user
--- try with and without table keyword
-
-grant select on vt1 to user user2
-PREHOOK: type: GRANT_PRIVILEGE
-PREHOOK: Output: default@vt1
-POSTHOOK: query: --view grant to user
--- try with and without table keyword
-
-grant select on vt1 to user user2
-POSTHOOK: type: GRANT_PRIVILEGE
-POSTHOOK: Output: default@vt1
-PREHOOK: query: grant insert on table vt1 to user user3
-PREHOOK: type: GRANT_PRIVILEGE
-PREHOOK: Output: default@vt1
-POSTHOOK: query: grant insert on table vt1 to user user3
-POSTHOOK: type: GRANT_PRIVILEGE
-POSTHOOK: Output: default@vt1
-PREHOOK: query: show grant user user2 on table vt1
-PREHOOK: type: SHOW_GRANT
-POSTHOOK: query: show grant user user2 on table vt1
-POSTHOOK: type: SHOW_GRANT
-default	vt1			user2	USER	SELECT	false	-1	user1
-PREHOOK: query: show grant user user3 on table vt1
-PREHOOK: type: SHOW_GRANT
-POSTHOOK: query: show grant user user3 on table vt1
-POSTHOOK: type: SHOW_GRANT
-default	vt1			user3	USER	INSERT	false	-1	user1
-PREHOOK: query: explain authorization select * from vt1
-PREHOOK: type: QUERY
-POSTHOOK: query: explain authorization select * from vt1
-POSTHOOK: type: QUERY
-INPUTS: 
-  default@vt1
-  default@t1
-OUTPUTS: 
-#### A masked pattern was here ####
-CURRENT_USER: 
-  user2
-OPERATION: 
-  QUERY
-PREHOOK: query: select * from vt1
-PREHOOK: type: QUERY
-PREHOOK: Input: default@t1
-PREHOOK: Input: default@vt1
-#### A masked pattern was here ####
-POSTHOOK: query: select * from vt1
-POSTHOOK: type: QUERY
-POSTHOOK: Input: default@t1
-POSTHOOK: Input: default@vt1
-#### A masked pattern was here ####
-PREHOOK: query: -- verify input objects required does not include table
--- even if view is within a sub query
-select * from (select * from vt1) a
-PREHOOK: type: QUERY
-PREHOOK: Input: default@t1
-PREHOOK: Input: default@vt1
-#### A masked pattern was here ####
-POSTHOOK: query: -- verify input objects required does not include table
--- even if view is within a sub query
-select * from (select * from vt1) a
-POSTHOOK: type: QUERY
-POSTHOOK: Input: default@t1
-POSTHOOK: Input: default@vt1
-#### A masked pattern was here ####
-PREHOOK: query: select * from vt1 union all select * from vt1
-PREHOOK: type: QUERY
-PREHOOK: Input: default@t1
-PREHOOK: Input: default@vt1
-#### A masked pattern was here ####
-POSTHOOK: query: select * from vt1 union all select * from vt1
-POSTHOOK: type: QUERY
-POSTHOOK: Input: default@t1
-POSTHOOK: Input: default@vt1
-#### A masked pattern was here ####
-PREHOOK: query: grant all on table vt2 to user user2
-PREHOOK: type: GRANT_PRIVILEGE
-PREHOOK: Output: default@vt2
-POSTHOOK: query: grant all on table vt2 to user user2
-POSTHOOK: type: GRANT_PRIVILEGE
-POSTHOOK: Output: default@vt2
-PREHOOK: query: show grant user user2 on table vt2
-PREHOOK: type: SHOW_GRANT
-POSTHOOK: query: show grant user user2 on table vt2
-POSTHOOK: type: SHOW_GRANT
-default	vt2			user2	USER	DELETE	false	-1	user1
-default	vt2			user2	USER	INSERT	false	-1	user1
-default	vt2			user2	USER	SELECT	false	-1	user1
-default	vt2			user2	USER	UPDATE	false	-1	user1
-PREHOOK: query: show grant user user2 on all
-PREHOOK: type: SHOW_GRANT
-POSTHOOK: query: show grant user user2 on all
-POSTHOOK: type: SHOW_GRANT
-default	vt1			user2	USER	SELECT	false	-1	user1
-default	vt2			user2	USER	DELETE	false	-1	user1
-default	vt2			user2	USER	INSERT	false	-1	user1
-default	vt2			user2	USER	SELECT	false	-1	user1
-default	vt2			user2	USER	UPDATE	false	-1	user1
-PREHOOK: query: revoke all on vt2 from user user2
-PREHOOK: type: REVOKE_PRIVILEGE
-PREHOOK: Output: default@vt2
-POSTHOOK: query: revoke all on vt2 from user user2
-POSTHOOK: type: REVOKE_PRIVILEGE
-POSTHOOK: Output: default@vt2
-PREHOOK: query: show grant user user2 on table vt2
-PREHOOK: type: SHOW_GRANT
-POSTHOOK: query: show grant user user2 on table vt2
-POSTHOOK: type: SHOW_GRANT
-PREHOOK: query: set role admin
-PREHOOK: type: SHOW_ROLES
-POSTHOOK: query: set role admin
-POSTHOOK: type: SHOW_ROLES
-PREHOOK: query: show grant on table vt2
-PREHOOK: type: SHOW_GRANT
-POSTHOOK: query: show grant on table vt2
-POSTHOOK: type: SHOW_GRANT
-default	vt2			user1	USER	DELETE	true	-1	user1
-default	vt2			user1	USER	INSERT	true	-1	user1
-default	vt2			user1	USER	SELECT	true	-1	user1
-default	vt2			user1	USER	UPDATE	true	-1	user1
-PREHOOK: query: revoke select on table vt1 from user user2
-PREHOOK: type: REVOKE_PRIVILEGE
-PREHOOK: Output: default@vt1
-POSTHOOK: query: revoke select on table vt1 from user user2
-POSTHOOK: type: REVOKE_PRIVILEGE
-POSTHOOK: Output: default@vt1
-PREHOOK: query: show grant user user2 on table vt1
-PREHOOK: type: SHOW_GRANT
-POSTHOOK: query: show grant user user2 on table vt1
-POSTHOOK: type: SHOW_GRANT
-PREHOOK: query: show grant user user2 on all
-PREHOOK: type: SHOW_GRANT
-POSTHOOK: query: show grant user user2 on all
-POSTHOOK: type: SHOW_GRANT
-PREHOOK: query: -- grant privileges on roles for view, after next statement
-show grant user user3 on table vt1
-PREHOOK: type: SHOW_GRANT
-POSTHOOK: query: -- grant privileges on roles for view, after next statement
-show grant user user3 on table vt1
-POSTHOOK: type: SHOW_GRANT
-default	vt1			user3	USER	INSERT	false	-1	user1
-PREHOOK: query: show current roles
-PREHOOK: type: SHOW_ROLES
-POSTHOOK: query: show current roles
-POSTHOOK: type: SHOW_ROLES
-public
-PREHOOK: query: set role ADMIN
-PREHOOK: type: SHOW_ROLES
-POSTHOOK: query: set role ADMIN
-POSTHOOK: type: SHOW_ROLES
-PREHOOK: query: create role role_v
-PREHOOK: type: CREATEROLE
-POSTHOOK: query: create role role_v
-POSTHOOK: type: CREATEROLE
-PREHOOK: query: grant  role_v to user user4
-PREHOOK: type: GRANT_ROLE
-POSTHOOK: query: grant  role_v to user user4
-POSTHOOK: type: GRANT_ROLE
-PREHOOK: query: show role grant user user4
-PREHOOK: type: SHOW_ROLE_GRANT
-POSTHOOK: query: show role grant user user4
-POSTHOOK: type: SHOW_ROLE_GRANT
-public	false	-1	
-role_v	false	-1	hive_admin_user
-PREHOOK: query: show roles
-PREHOOK: type: SHOW_ROLES
-POSTHOOK: query: show roles
-POSTHOOK: type: SHOW_ROLES
-admin
-public
-role_v
-PREHOOK: query: grant all on table vt2 to role role_v
-PREHOOK: type: GRANT_PRIVILEGE
-PREHOOK: Output: default@vt2
-POSTHOOK: query: grant all on table vt2 to role role_v
-POSTHOOK: type: GRANT_PRIVILEGE
-POSTHOOK: Output: default@vt2
-PREHOOK: query: show grant role role_v on table vt2
-PREHOOK: type: SHOW_GRANT
-POSTHOOK: query: show grant role role_v on table vt2
-POSTHOOK: type: SHOW_GRANT
-default	vt2			role_v	ROLE	DELETE	false	-1	hive_admin_user
-default	vt2			role_v	ROLE	INSERT	false	-1	hive_admin_user
-default	vt2			role_v	ROLE	SELECT	false	-1	hive_admin_user
-default	vt2			role_v	ROLE	UPDATE	false	-1	hive_admin_user
-PREHOOK: query: revoke delete on table vt2 from role role_v
-PREHOOK: type: REVOKE_PRIVILEGE
-PREHOOK: Output: default@vt2
-POSTHOOK: query: revoke delete on table vt2 from role role_v
-POSTHOOK: type: REVOKE_PRIVILEGE
-POSTHOOK: Output: default@vt2
-PREHOOK: query: show grant role role_v on table vt2
-PREHOOK: type: SHOW_GRANT
-POSTHOOK: query: show grant role role_v on table vt2
-POSTHOOK: type: SHOW_GRANT
-default	vt2			role_v	ROLE	INSERT	false	-1	hive_admin_user
-default	vt2			role_v	ROLE	SELECT	false	-1	hive_admin_user
-default	vt2			role_v	ROLE	UPDATE	false	-1	hive_admin_user
-PREHOOK: query: show grant on table vt2
-PREHOOK: type: SHOW_GRANT
-POSTHOOK: query: show grant on table vt2
-POSTHOOK: type: SHOW_GRANT
-default	vt2			role_v	ROLE	INSERT	false	-1	hive_admin_user
-default	vt2			role_v	ROLE	SELECT	false	-1	hive_admin_user
-default	vt2			role_v	ROLE	UPDATE	false	-1	hive_admin_user
-default	vt2			user1	USER	DELETE	true	-1	user1
-default	vt2			user1	USER	INSERT	true	-1	user1
-default	vt2			user1	USER	SELECT	true	-1	user1
-default	vt2			user1	USER	UPDATE	true	-1	user1

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/results/clientpositive/materialized_view_authorization_sqlstd.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/materialized_view_authorization_sqlstd.q.out b/ql/src/test/results/clientpositive/materialized_view_authorization_sqlstd.q.out
new file mode 100644
index 0000000..b167702
--- /dev/null
+++ b/ql/src/test/results/clientpositive/materialized_view_authorization_sqlstd.q.out
@@ -0,0 +1,195 @@
+PREHOOK: query: create table amvs_table (a int, b varchar(256), c decimal(10,2))
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@amvs_table
+POSTHOOK: query: create table amvs_table (a int, b varchar(256), c decimal(10,2))
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@amvs_table
+PREHOOK: query: insert into amvs_table values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@values__tmp__table__1
+PREHOOK: Output: default@amvs_table
+POSTHOOK: query: insert into amvs_table values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@values__tmp__table__1
+POSTHOOK: Output: default@amvs_table
+POSTHOOK: Lineage: amvs_table.a EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ]
+POSTHOOK: Lineage: amvs_table.b EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ]
+POSTHOOK: Lineage: amvs_table.c EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col3, type:string, comment:), ]
+PREHOOK: query: create materialized view amvs_mat_view as select a, c from amvs_table
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@amvs_table
+PREHOOK: Output: database:default
+PREHOOK: Output: default@amvs_mat_view
+POSTHOOK: query: create materialized view amvs_mat_view as select a, c from amvs_table
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@amvs_table
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@amvs_mat_view
+PREHOOK: query: show grant user user1 on table amvs_mat_view
+PREHOOK: type: SHOW_GRANT
+POSTHOOK: query: show grant user user1 on table amvs_mat_view
+POSTHOOK: type: SHOW_GRANT
+default	amvs_mat_view			user1	USER	DELETE	true	-1	user1
+default	amvs_mat_view			user1	USER	INSERT	true	-1	user1
+default	amvs_mat_view			user1	USER	SELECT	true	-1	user1
+default	amvs_mat_view			user1	USER	UPDATE	true	-1	user1
+PREHOOK: query: grant select on amvs_mat_view to user user2
+PREHOOK: type: GRANT_PRIVILEGE
+PREHOOK: Output: default@amvs_mat_view
+POSTHOOK: query: grant select on amvs_mat_view to user user2
+POSTHOOK: type: GRANT_PRIVILEGE
+POSTHOOK: Output: default@amvs_mat_view
+PREHOOK: query: show grant user user2 on table amvs_mat_view
+PREHOOK: type: SHOW_GRANT
+POSTHOOK: query: show grant user user2 on table amvs_mat_view
+POSTHOOK: type: SHOW_GRANT
+default	amvs_mat_view			user2	USER	SELECT	false	-1	user1
+PREHOOK: query: select * from amvs_mat_view
+PREHOOK: type: QUERY
+PREHOOK: Input: default@amvs_mat_view
+#### A masked pattern was here ####
+POSTHOOK: query: select * from amvs_mat_view
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@amvs_mat_view
+#### A masked pattern was here ####
+1	10.3
+2	3.14
+2	172342.2
+3	978.76
+3	9.8
+PREHOOK: query: show grant user user3 on table amvs_mat_view
+PREHOOK: type: SHOW_GRANT
+POSTHOOK: query: show grant user user3 on table amvs_mat_view
+POSTHOOK: type: SHOW_GRANT
+PREHOOK: query: set role admin
+PREHOOK: type: SHOW_ROLES
+POSTHOOK: query: set role admin
+POSTHOOK: type: SHOW_ROLES
+PREHOOK: query: show grant on table amvs_mat_view
+PREHOOK: type: SHOW_GRANT
+POSTHOOK: query: show grant on table amvs_mat_view
+POSTHOOK: type: SHOW_GRANT
+default	amvs_mat_view			user1	USER	DELETE	true	-1	user1
+default	amvs_mat_view			user1	USER	INSERT	true	-1	user1
+default	amvs_mat_view			user1	USER	SELECT	true	-1	user1
+default	amvs_mat_view			user1	USER	UPDATE	true	-1	user1
+default	amvs_mat_view			user2	USER	SELECT	false	-1	user1
+PREHOOK: query: revoke select on table amvs_mat_view from user user2
+PREHOOK: type: REVOKE_PRIVILEGE
+PREHOOK: Output: default@amvs_mat_view
+POSTHOOK: query: revoke select on table amvs_mat_view from user user2
+POSTHOOK: type: REVOKE_PRIVILEGE
+POSTHOOK: Output: default@amvs_mat_view
+PREHOOK: query: show grant user user2 on table amvs_mat_view
+PREHOOK: type: SHOW_GRANT
+POSTHOOK: query: show grant user user2 on table amvs_mat_view
+POSTHOOK: type: SHOW_GRANT
+PREHOOK: query: set role ADMIN
+PREHOOK: type: SHOW_ROLES
+POSTHOOK: query: set role ADMIN
+POSTHOOK: type: SHOW_ROLES
+PREHOOK: query: create role role_v
+PREHOOK: type: CREATEROLE
+POSTHOOK: query: create role role_v
+POSTHOOK: type: CREATEROLE
+PREHOOK: query: grant  role_v to user user4
+PREHOOK: type: GRANT_ROLE
+POSTHOOK: query: grant  role_v to user user4
+POSTHOOK: type: GRANT_ROLE
+PREHOOK: query: show role grant user user4
+PREHOOK: type: SHOW_ROLE_GRANT
+POSTHOOK: query: show role grant user user4
+POSTHOOK: type: SHOW_ROLE_GRANT
+public	false	-1	
+role_v	false	-1	hive_admin_user
+PREHOOK: query: show roles
+PREHOOK: type: SHOW_ROLES
+POSTHOOK: query: show roles
+POSTHOOK: type: SHOW_ROLES
+admin
+public
+role_v
+PREHOOK: query: grant all on table amvs_mat_view to role role_v
+PREHOOK: type: GRANT_PRIVILEGE
+PREHOOK: Output: default@amvs_mat_view
+POSTHOOK: query: grant all on table amvs_mat_view to role role_v
+POSTHOOK: type: GRANT_PRIVILEGE
+POSTHOOK: Output: default@amvs_mat_view
+PREHOOK: query: show grant role role_v on table amvs_mat_view
+PREHOOK: type: SHOW_GRANT
+POSTHOOK: query: show grant role role_v on table amvs_mat_view
+POSTHOOK: type: SHOW_GRANT
+default	amvs_mat_view			role_v	ROLE	DELETE	false	-1	hive_admin_user
+default	amvs_mat_view			role_v	ROLE	INSERT	false	-1	hive_admin_user
+default	amvs_mat_view			role_v	ROLE	SELECT	false	-1	hive_admin_user
+default	amvs_mat_view			role_v	ROLE	UPDATE	false	-1	hive_admin_user
+PREHOOK: query: show grant user user4 on table amvs_mat_view
+PREHOOK: type: SHOW_GRANT
+POSTHOOK: query: show grant user user4 on table amvs_mat_view
+POSTHOOK: type: SHOW_GRANT
+PREHOOK: query: select * from amvs_mat_view
+PREHOOK: type: QUERY
+PREHOOK: Input: default@amvs_mat_view
+#### A masked pattern was here ####
+POSTHOOK: query: select * from amvs_mat_view
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@amvs_mat_view
+#### A masked pattern was here ####
+1	10.3
+2	3.14
+2	172342.2
+3	978.76
+3	9.8
+PREHOOK: query: alter materialized view amvs_mat_view rebuild
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@amvs_table
+PREHOOK: Output: database:default
+PREHOOK: Output: default@amvs_mat_view
+POSTHOOK: query: alter materialized view amvs_mat_view rebuild
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@amvs_table
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@amvs_mat_view
+PREHOOK: query: grant select on table amvs_table to user user2 with grant option
+PREHOOK: type: GRANT_PRIVILEGE
+PREHOOK: Output: default@amvs_table
+POSTHOOK: query: grant select on table amvs_table to user user2 with grant option
+POSTHOOK: type: GRANT_PRIVILEGE
+POSTHOOK: Output: default@amvs_table
+PREHOOK: query: create materialized view amvs_mat_view2 as select a, b from amvs_table
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@amvs_table
+PREHOOK: Output: database:default
+PREHOOK: Output: default@amvs_mat_view2
+POSTHOOK: query: create materialized view amvs_mat_view2 as select a, b from amvs_table
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@amvs_table
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@amvs_mat_view2
+PREHOOK: query: select * from amvs_mat_view2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@amvs_mat_view2
+#### A masked pattern was here ####
+POSTHOOK: query: select * from amvs_mat_view2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@amvs_mat_view2
+#### A masked pattern was here ####
+1	alfred
+2	bob
+2	bonnie
+3	calvin
+3	charlie
+PREHOOK: query: drop materialized view amvs_mat_view2
+PREHOOK: type: DROPTABLE
+PREHOOK: Input: default@amvs_mat_view2
+PREHOOK: Output: default@amvs_mat_view2
+POSTHOOK: query: drop materialized view amvs_mat_view2
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Input: default@amvs_mat_view2
+POSTHOOK: Output: default@amvs_mat_view2
+PREHOOK: query: set role ADMIN
+PREHOOK: type: SHOW_ROLES
+POSTHOOK: query: set role ADMIN
+POSTHOOK: type: SHOW_ROLES

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/results/clientpositive/materialized_view_create.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/materialized_view_create.q.out b/ql/src/test/results/clientpositive/materialized_view_create.q.out
new file mode 100644
index 0000000..c51357d
--- /dev/null
+++ b/ql/src/test/results/clientpositive/materialized_view_create.q.out
@@ -0,0 +1,173 @@
+PREHOOK: query: create table cmv_basetable (a int, b varchar(256), c decimal(10,2))
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@cmv_basetable
+POSTHOOK: query: create table cmv_basetable (a int, b varchar(256), c decimal(10,2))
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@cmv_basetable
+PREHOOK: query: insert into cmv_basetable values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@values__tmp__table__1
+PREHOOK: Output: default@cmv_basetable
+POSTHOOK: query: insert into cmv_basetable values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@values__tmp__table__1
+POSTHOOK: Output: default@cmv_basetable
+POSTHOOK: Lineage: cmv_basetable.a EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ]
+POSTHOOK: Lineage: cmv_basetable.b EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ]
+POSTHOOK: Lineage: cmv_basetable.c EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col3, type:string, comment:), ]
+PREHOOK: query: create materialized view cmv_mat_view as select a, b, c from cmv_basetable
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@cmv_basetable
+PREHOOK: Output: database:default
+PREHOOK: Output: default@cmv_mat_view
+POSTHOOK: query: create materialized view cmv_mat_view as select a, b, c from cmv_basetable
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@cmv_basetable
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@cmv_mat_view
+PREHOOK: query: select * from cmv_mat_view
+PREHOOK: type: QUERY
+PREHOOK: Input: default@cmv_mat_view
+#### A masked pattern was here ####
+POSTHOOK: query: select * from cmv_mat_view
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@cmv_mat_view
+#### A masked pattern was here ####
+1	alfred	10.3
+2	bob	3.14
+2	bonnie	172342.2
+3	calvin	978.76
+3	charlie	9.8
+PREHOOK: query: create materialized view if not exists cmv_mat_view2 as select a, c from cmv_basetable
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@cmv_basetable
+PREHOOK: Output: database:default
+PREHOOK: Output: default@cmv_mat_view2
+POSTHOOK: query: create materialized view if not exists cmv_mat_view2 as select a, c from cmv_basetable
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@cmv_basetable
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@cmv_mat_view2
+PREHOOK: query: select * from cmv_mat_view2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@cmv_mat_view2
+#### A masked pattern was here ####
+POSTHOOK: query: select * from cmv_mat_view2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@cmv_mat_view2
+#### A masked pattern was here ####
+1	10.3
+2	3.14
+2	172342.2
+3	978.76
+3	9.8
+PREHOOK: query: create materialized view if not exists cmv_mat_view3 as select * from cmv_basetable where a > 1
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@cmv_basetable
+PREHOOK: Output: database:default
+PREHOOK: Output: default@cmv_mat_view3
+POSTHOOK: query: create materialized view if not exists cmv_mat_view3 as select * from cmv_basetable where a > 1
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@cmv_basetable
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@cmv_mat_view3
+PREHOOK: query: select * from cmv_mat_view3
+PREHOOK: type: QUERY
+PREHOOK: Input: default@cmv_mat_view3
+#### A masked pattern was here ####
+POSTHOOK: query: select * from cmv_mat_view3
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@cmv_mat_view3
+#### A masked pattern was here ####
+2	bob	3.14
+2	bonnie	172342.2
+3	calvin	978.76
+3	charlie	9.8
+PREHOOK: query: create materialized view cmv_mat_view4 comment 'this is a comment' as select a, sum(c) from cmv_basetable group by a
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@cmv_basetable
+PREHOOK: Output: database:default
+PREHOOK: Output: default@cmv_mat_view4
+POSTHOOK: query: create materialized view cmv_mat_view4 comment 'this is a comment' as select a, sum(c) from cmv_basetable group by a
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@cmv_basetable
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@cmv_mat_view4
+PREHOOK: query: select * from cmv_mat_view4
+PREHOOK: type: QUERY
+PREHOOK: Input: default@cmv_mat_view4
+#### A masked pattern was here ####
+POSTHOOK: query: select * from cmv_mat_view4
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@cmv_mat_view4
+#### A masked pattern was here ####
+1	10.3
+2	172345.34
+3	988.56
+PREHOOK: query: describe extended cmv_mat_view4
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@cmv_mat_view4
+POSTHOOK: query: describe extended cmv_mat_view4
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@cmv_mat_view4
+a                   	int                 	                    
+_c1                 	decimal(20,2)       	                    
+	 	 
+#### A masked pattern was here ####
+PREHOOK: query: create table cmv_basetable2 (d int, e varchar(256), f decimal(10,2))
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@cmv_basetable2
+POSTHOOK: query: create table cmv_basetable2 (d int, e varchar(256), f decimal(10,2))
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@cmv_basetable2
+PREHOOK: query: insert into cmv_basetable2 values (4, 'alfred', 100.30),(4, 'bob', 6133,14),(5, 'bonnie', 172.2),(6, 'calvin', 8.76),(17, 'charlie', 13144339.8)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@values__tmp__table__2
+PREHOOK: Output: default@cmv_basetable2
+POSTHOOK: query: insert into cmv_basetable2 values (4, 'alfred', 100.30),(4, 'bob', 6133,14),(5, 'bonnie', 172.2),(6, 'calvin', 8.76),(17, 'charlie', 13144339.8)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@values__tmp__table__2
+POSTHOOK: Output: default@cmv_basetable2
+POSTHOOK: Lineage: cmv_basetable2.d EXPRESSION [(values__tmp__table__2)values__tmp__table__2.FieldSchema(name:tmp_values_col1, type:string, comment:), ]
+POSTHOOK: Lineage: cmv_basetable2.e EXPRESSION [(values__tmp__table__2)values__tmp__table__2.FieldSchema(name:tmp_values_col2, type:string, comment:), ]
+POSTHOOK: Lineage: cmv_basetable2.f EXPRESSION [(values__tmp__table__2)values__tmp__table__2.FieldSchema(name:tmp_values_col3, type:string, comment:), ]
+PREHOOK: query: create materialized view cmv_mat_view5 tblproperties ('key'='value') as select a, b, d, c, f from cmv_basetable t1 join cmv_basetable2 t2 on (t1.b = t2.e)
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@cmv_basetable
+PREHOOK: Input: default@cmv_basetable2
+PREHOOK: Output: database:default
+PREHOOK: Output: default@cmv_mat_view5
+POSTHOOK: query: create materialized view cmv_mat_view5 tblproperties ('key'='value') as select a, b, d, c, f from cmv_basetable t1 join cmv_basetable2 t2 on (t1.b = t2.e)
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@cmv_basetable
+POSTHOOK: Input: default@cmv_basetable2
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@cmv_mat_view5
+PREHOOK: query: select * from cmv_mat_view5
+PREHOOK: type: QUERY
+PREHOOK: Input: default@cmv_mat_view5
+#### A masked pattern was here ####
+POSTHOOK: query: select * from cmv_mat_view5
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@cmv_mat_view5
+#### A masked pattern was here ####
+1	alfred	4	10.3	100.3
+2	bob	4	3.14	6133
+2	bonnie	5	172342.2	172.2
+3	calvin	6	978.76	8.76
+3	charlie	17	9.8	13144339.8
+PREHOOK: query: show tblproperties cmv_mat_view5
+PREHOOK: type: SHOW_TBLPROPERTIES
+POSTHOOK: query: show tblproperties cmv_mat_view5
+POSTHOOK: type: SHOW_TBLPROPERTIES
+COLUMN_STATS_ACCURATE	false
+key	value
+numFiles	1
+numRows	-1
+rawDataSize	-1
+totalSize	730
+#### A masked pattern was here ####

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/results/clientpositive/materialized_view_drop.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/materialized_view_drop.q.out b/ql/src/test/results/clientpositive/materialized_view_drop.q.out
new file mode 100644
index 0000000..ed99a09
--- /dev/null
+++ b/ql/src/test/results/clientpositive/materialized_view_drop.q.out
@@ -0,0 +1,39 @@
+PREHOOK: query: create materialized view dmv_mat_view as select cint, cstring1 from alltypesorc where cint < 0
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@alltypesorc
+PREHOOK: Output: database:default
+PREHOOK: Output: default@dmv_mat_view
+POSTHOOK: query: create materialized view dmv_mat_view as select cint, cstring1 from alltypesorc where cint < 0
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@alltypesorc
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@dmv_mat_view
+PREHOOK: query: show table extended like dmv_mat_view
+PREHOOK: type: SHOW_TABLESTATUS
+POSTHOOK: query: show table extended like dmv_mat_view
+POSTHOOK: type: SHOW_TABLESTATUS
+tableName:dmv_mat_view
+#### A masked pattern was here ####
+inputformat:org.apache.hadoop.hive.ql.io.orc.OrcInputFormat
+outputformat:org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat
+columns:struct columns { i32 cint, string cstring1}
+partitioned:false
+partitionColumns:
+totalNumberFiles:1
+totalFileSize:47146
+maxFileSize:47146
+minFileSize:47146
+#### A masked pattern was here ####
+
+PREHOOK: query: drop materialized view dmv_mat_view
+PREHOOK: type: DROPTABLE
+PREHOOK: Input: default@dmv_mat_view
+PREHOOK: Output: default@dmv_mat_view
+POSTHOOK: query: drop materialized view dmv_mat_view
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Input: default@dmv_mat_view
+POSTHOOK: Output: default@dmv_mat_view
+PREHOOK: query: show table extended like dmv_mat_view
+PREHOOK: type: SHOW_TABLESTATUS
+POSTHOOK: query: show table extended like dmv_mat_view
+POSTHOOK: type: SHOW_TABLESTATUS

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/results/clientpositive/materialized_view_rebuild.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/materialized_view_rebuild.q.out b/ql/src/test/results/clientpositive/materialized_view_rebuild.q.out
new file mode 100644
index 0000000..9bede0d
--- /dev/null
+++ b/ql/src/test/results/clientpositive/materialized_view_rebuild.q.out
@@ -0,0 +1,67 @@
+PREHOOK: query: create table rmv_table (cint int, cstring1 string)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@rmv_table
+POSTHOOK: query: create table rmv_table (cint int, cstring1 string)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@rmv_table
+PREHOOK: query: insert into rmv_table values(1, 'fred'), (10, 'wilma')
+PREHOOK: type: QUERY
+PREHOOK: Input: default@values__tmp__table__1
+PREHOOK: Output: default@rmv_table
+POSTHOOK: query: insert into rmv_table values(1, 'fred'), (10, 'wilma')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@values__tmp__table__1
+POSTHOOK: Output: default@rmv_table
+POSTHOOK: Lineage: rmv_table.cint EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ]
+POSTHOOK: Lineage: rmv_table.cstring1 SIMPLE [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ]
+PREHOOK: query: create materialized view rmv_mat_view as select cint, cstring1 from rmv_table where cint < 10
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@rmv_table
+PREHOOK: Output: database:default
+PREHOOK: Output: default@rmv_mat_view
+POSTHOOK: query: create materialized view rmv_mat_view as select cint, cstring1 from rmv_table where cint < 10
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@rmv_table
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@rmv_mat_view
+PREHOOK: query: select * from rmv_mat_view
+PREHOOK: type: QUERY
+PREHOOK: Input: default@rmv_mat_view
+#### A masked pattern was here ####
+POSTHOOK: query: select * from rmv_mat_view
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@rmv_mat_view
+#### A masked pattern was here ####
+1	fred
+PREHOOK: query: insert into rmv_table values(2, 'barney'), (11, 'betty')
+PREHOOK: type: QUERY
+PREHOOK: Input: default@values__tmp__table__2
+PREHOOK: Output: default@rmv_table
+POSTHOOK: query: insert into rmv_table values(2, 'barney'), (11, 'betty')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@values__tmp__table__2
+POSTHOOK: Output: default@rmv_table
+POSTHOOK: Lineage: rmv_table.cint EXPRESSION [(values__tmp__table__2)values__tmp__table__2.FieldSchema(name:tmp_values_col1, type:string, comment:), ]
+POSTHOOK: Lineage: rmv_table.cstring1 SIMPLE [(values__tmp__table__2)values__tmp__table__2.FieldSchema(name:tmp_values_col2, type:string, comment:), ]
+PREHOOK: query: alter materialized view rmv_mat_view rebuild
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@rmv_table
+PREHOOK: Output: database:default
+PREHOOK: Output: default@rmv_mat_view
+POSTHOOK: query: alter materialized view rmv_mat_view rebuild
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@rmv_table
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@rmv_mat_view
+PREHOOK: query: select * from rmv_mat_view
+PREHOOK: type: QUERY
+PREHOOK: Input: default@rmv_mat_view
+#### A masked pattern was here ####
+POSTHOOK: query: select * from rmv_mat_view
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@rmv_mat_view
+#### A masked pattern was here ####
+1	fred
+2	barney

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/results/clientpositive/view_authorization_sqlstd.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/view_authorization_sqlstd.q.out b/ql/src/test/results/clientpositive/view_authorization_sqlstd.q.out
new file mode 100644
index 0000000..122ca4e
--- /dev/null
+++ b/ql/src/test/results/clientpositive/view_authorization_sqlstd.q.out
@@ -0,0 +1,295 @@
+PREHOOK: query: -- Test view authorization , and 'show grant' variants
+
+create table t1(i int, j int, k int)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@t1
+POSTHOOK: query: -- Test view authorization , and 'show grant' variants
+
+create table t1(i int, j int, k int)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@t1
+PREHOOK: query: grant select on t1 to user user2 with grant option
+PREHOOK: type: GRANT_PRIVILEGE
+PREHOOK: Output: default@t1
+POSTHOOK: query: grant select on t1 to user user2 with grant option
+POSTHOOK: type: GRANT_PRIVILEGE
+POSTHOOK: Output: default@t1
+PREHOOK: query: show grant user user1 on table t1
+PREHOOK: type: SHOW_GRANT
+POSTHOOK: query: show grant user user1 on table t1
+POSTHOOK: type: SHOW_GRANT
+default	t1			user1	USER	DELETE	true	-1	user1
+default	t1			user1	USER	INSERT	true	-1	user1
+default	t1			user1	USER	SELECT	true	-1	user1
+default	t1			user1	USER	UPDATE	true	-1	user1
+PREHOOK: query: -- protecting certain columns
+create view vt1 as select i,k from t1
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@t1
+PREHOOK: Output: database:default
+PREHOOK: Output: default@vt1
+POSTHOOK: query: -- protecting certain columns
+create view vt1 as select i,k from t1
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@t1
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@vt1
+PREHOOK: query: -- protecting certain rows
+create view vt2 as select * from t1 where i > 1
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@t1
+PREHOOK: Output: database:default
+PREHOOK: Output: default@vt2
+POSTHOOK: query: -- protecting certain rows
+create view vt2 as select * from t1 where i > 1
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@t1
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@vt2
+PREHOOK: query: show grant user user1 on all
+PREHOOK: type: SHOW_GRANT
+POSTHOOK: query: show grant user user1 on all
+POSTHOOK: type: SHOW_GRANT
+default	t1			user1	USER	DELETE	true	-1	user1
+default	t1			user1	USER	INSERT	true	-1	user1
+default	t1			user1	USER	SELECT	true	-1	user1
+default	t1			user1	USER	UPDATE	true	-1	user1
+default	vt1			user1	USER	DELETE	true	-1	user1
+default	vt1			user1	USER	INSERT	true	-1	user1
+default	vt1			user1	USER	SELECT	true	-1	user1
+default	vt1			user1	USER	UPDATE	true	-1	user1
+default	vt2			user1	USER	DELETE	true	-1	user1
+default	vt2			user1	USER	INSERT	true	-1	user1
+default	vt2			user1	USER	SELECT	true	-1	user1
+default	vt2			user1	USER	UPDATE	true	-1	user1
+PREHOOK: query: --view grant to user
+-- try with and without table keyword
+
+grant select on vt1 to user user2
+PREHOOK: type: GRANT_PRIVILEGE
+PREHOOK: Output: default@vt1
+POSTHOOK: query: --view grant to user
+-- try with and without table keyword
+
+grant select on vt1 to user user2
+POSTHOOK: type: GRANT_PRIVILEGE
+POSTHOOK: Output: default@vt1
+PREHOOK: query: grant insert on table vt1 to user user3
+PREHOOK: type: GRANT_PRIVILEGE
+PREHOOK: Output: default@vt1
+POSTHOOK: query: grant insert on table vt1 to user user3
+POSTHOOK: type: GRANT_PRIVILEGE
+POSTHOOK: Output: default@vt1
+PREHOOK: query: show grant user user2 on table vt1
+PREHOOK: type: SHOW_GRANT
+POSTHOOK: query: show grant user user2 on table vt1
+POSTHOOK: type: SHOW_GRANT
+default	vt1			user2	USER	SELECT	false	-1	user1
+PREHOOK: query: create view vt3 as select i,k from t1
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@t1
+PREHOOK: Output: database:default
+PREHOOK: Output: default@vt3
+POSTHOOK: query: create view vt3 as select i,k from t1
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@t1
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@vt3
+PREHOOK: query: show grant user user3 on table vt1
+PREHOOK: type: SHOW_GRANT
+POSTHOOK: query: show grant user user3 on table vt1
+POSTHOOK: type: SHOW_GRANT
+default	vt1			user3	USER	INSERT	false	-1	user1
+PREHOOK: query: explain authorization select * from vt1
+PREHOOK: type: QUERY
+POSTHOOK: query: explain authorization select * from vt1
+POSTHOOK: type: QUERY
+INPUTS: 
+  default@vt1
+  default@t1
+OUTPUTS: 
+#### A masked pattern was here ####
+CURRENT_USER: 
+  user2
+OPERATION: 
+  QUERY
+PREHOOK: query: select * from vt1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@t1
+PREHOOK: Input: default@vt1
+#### A masked pattern was here ####
+POSTHOOK: query: select * from vt1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@t1
+POSTHOOK: Input: default@vt1
+#### A masked pattern was here ####
+PREHOOK: query: -- verify input objects required does not include table
+-- even if view is within a sub query
+select * from (select * from vt1) a
+PREHOOK: type: QUERY
+PREHOOK: Input: default@t1
+PREHOOK: Input: default@vt1
+#### A masked pattern was here ####
+POSTHOOK: query: -- verify input objects required does not include table
+-- even if view is within a sub query
+select * from (select * from vt1) a
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@t1
+POSTHOOK: Input: default@vt1
+#### A masked pattern was here ####
+PREHOOK: query: select * from vt1 union all select * from vt1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@t1
+PREHOOK: Input: default@vt1
+#### A masked pattern was here ####
+POSTHOOK: query: select * from vt1 union all select * from vt1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@t1
+POSTHOOK: Input: default@vt1
+#### A masked pattern was here ####
+PREHOOK: query: grant all on table vt2 to user user2
+PREHOOK: type: GRANT_PRIVILEGE
+PREHOOK: Output: default@vt2
+POSTHOOK: query: grant all on table vt2 to user user2
+POSTHOOK: type: GRANT_PRIVILEGE
+POSTHOOK: Output: default@vt2
+PREHOOK: query: show grant user user2 on table vt2
+PREHOOK: type: SHOW_GRANT
+POSTHOOK: query: show grant user user2 on table vt2
+POSTHOOK: type: SHOW_GRANT
+default	vt2			user2	USER	DELETE	false	-1	user1
+default	vt2			user2	USER	INSERT	false	-1	user1
+default	vt2			user2	USER	SELECT	false	-1	user1
+default	vt2			user2	USER	UPDATE	false	-1	user1
+PREHOOK: query: show grant user user2 on all
+PREHOOK: type: SHOW_GRANT
+POSTHOOK: query: show grant user user2 on all
+POSTHOOK: type: SHOW_GRANT
+default	t1			user2	USER	SELECT	true	-1	user1
+default	vt1			user2	USER	SELECT	false	-1	user1
+default	vt2			user2	USER	DELETE	false	-1	user1
+default	vt2			user2	USER	INSERT	false	-1	user1
+default	vt2			user2	USER	SELECT	false	-1	user1
+default	vt2			user2	USER	UPDATE	false	-1	user1
+default	vt3			user2	USER	DELETE	true	-1	user1
+default	vt3			user2	USER	INSERT	true	-1	user1
+default	vt3			user2	USER	SELECT	true	-1	user1
+default	vt3			user2	USER	UPDATE	true	-1	user1
+PREHOOK: query: revoke all on vt2 from user user2
+PREHOOK: type: REVOKE_PRIVILEGE
+PREHOOK: Output: default@vt2
+POSTHOOK: query: revoke all on vt2 from user user2
+POSTHOOK: type: REVOKE_PRIVILEGE
+POSTHOOK: Output: default@vt2
+PREHOOK: query: show grant user user2 on table vt2
+PREHOOK: type: SHOW_GRANT
+POSTHOOK: query: show grant user user2 on table vt2
+POSTHOOK: type: SHOW_GRANT
+PREHOOK: query: set role admin
+PREHOOK: type: SHOW_ROLES
+POSTHOOK: query: set role admin
+POSTHOOK: type: SHOW_ROLES
+PREHOOK: query: show grant on table vt2
+PREHOOK: type: SHOW_GRANT
+POSTHOOK: query: show grant on table vt2
+POSTHOOK: type: SHOW_GRANT
+default	vt2			user1	USER	DELETE	true	-1	user1
+default	vt2			user1	USER	INSERT	true	-1	user1
+default	vt2			user1	USER	SELECT	true	-1	user1
+default	vt2			user1	USER	UPDATE	true	-1	user1
+PREHOOK: query: revoke select on table vt1 from user user2
+PREHOOK: type: REVOKE_PRIVILEGE
+PREHOOK: Output: default@vt1
+POSTHOOK: query: revoke select on table vt1 from user user2
+POSTHOOK: type: REVOKE_PRIVILEGE
+POSTHOOK: Output: default@vt1
+PREHOOK: query: show grant user user2 on table vt1
+PREHOOK: type: SHOW_GRANT
+POSTHOOK: query: show grant user user2 on table vt1
+POSTHOOK: type: SHOW_GRANT
+PREHOOK: query: show grant user user2 on all
+PREHOOK: type: SHOW_GRANT
+POSTHOOK: query: show grant user user2 on all
+POSTHOOK: type: SHOW_GRANT
+default	t1			user2	USER	SELECT	true	-1	user1
+default	vt3			user2	USER	DELETE	true	-1	user1
+default	vt3			user2	USER	INSERT	true	-1	user1
+default	vt3			user2	USER	SELECT	true	-1	user1
+default	vt3			user2	USER	UPDATE	true	-1	user1
+PREHOOK: query: -- grant privileges on roles for view, after next statement
+show grant user user3 on table vt1
+PREHOOK: type: SHOW_GRANT
+POSTHOOK: query: -- grant privileges on roles for view, after next statement
+show grant user user3 on table vt1
+POSTHOOK: type: SHOW_GRANT
+default	vt1			user3	USER	INSERT	false	-1	user1
+PREHOOK: query: show current roles
+PREHOOK: type: SHOW_ROLES
+POSTHOOK: query: show current roles
+POSTHOOK: type: SHOW_ROLES
+public
+PREHOOK: query: set role ADMIN
+PREHOOK: type: SHOW_ROLES
+POSTHOOK: query: set role ADMIN
+POSTHOOK: type: SHOW_ROLES
+PREHOOK: query: create role role_v
+PREHOOK: type: CREATEROLE
+POSTHOOK: query: create role role_v
+POSTHOOK: type: CREATEROLE
+PREHOOK: query: grant  role_v to user user4
+PREHOOK: type: GRANT_ROLE
+POSTHOOK: query: grant  role_v to user user4
+POSTHOOK: type: GRANT_ROLE
+PREHOOK: query: show role grant user user4
+PREHOOK: type: SHOW_ROLE_GRANT
+POSTHOOK: query: show role grant user user4
+POSTHOOK: type: SHOW_ROLE_GRANT
+public	false	-1	
+role_v	false	-1	hive_admin_user
+PREHOOK: query: show roles
+PREHOOK: type: SHOW_ROLES
+POSTHOOK: query: show roles
+POSTHOOK: type: SHOW_ROLES
+admin
+public
+role_v
+PREHOOK: query: grant all on table vt2 to role role_v
+PREHOOK: type: GRANT_PRIVILEGE
+PREHOOK: Output: default@vt2
+POSTHOOK: query: grant all on table vt2 to role role_v
+POSTHOOK: type: GRANT_PRIVILEGE
+POSTHOOK: Output: default@vt2
+PREHOOK: query: show grant role role_v on table vt2
+PREHOOK: type: SHOW_GRANT
+POSTHOOK: query: show grant role role_v on table vt2
+POSTHOOK: type: SHOW_GRANT
+default	vt2			role_v	ROLE	DELETE	false	-1	hive_admin_user
+default	vt2			role_v	ROLE	INSERT	false	-1	hive_admin_user
+default	vt2			role_v	ROLE	SELECT	false	-1	hive_admin_user
+default	vt2			role_v	ROLE	UPDATE	false	-1	hive_admin_user
+PREHOOK: query: revoke delete on table vt2 from role role_v
+PREHOOK: type: REVOKE_PRIVILEGE
+PREHOOK: Output: default@vt2
+POSTHOOK: query: revoke delete on table vt2 from role role_v
+POSTHOOK: type: REVOKE_PRIVILEGE
+POSTHOOK: Output: default@vt2
+PREHOOK: query: show grant role role_v on table vt2
+PREHOOK: type: SHOW_GRANT
+POSTHOOK: query: show grant role role_v on table vt2
+POSTHOOK: type: SHOW_GRANT
+default	vt2			role_v	ROLE	INSERT	false	-1	hive_admin_user
+default	vt2			role_v	ROLE	SELECT	false	-1	hive_admin_user
+default	vt2			role_v	ROLE	UPDATE	false	-1	hive_admin_user
+PREHOOK: query: show grant on table vt2
+PREHOOK: type: SHOW_GRANT
+POSTHOOK: query: show grant on table vt2
+POSTHOOK: type: SHOW_GRANT
+default	vt2			role_v	ROLE	INSERT	false	-1	hive_admin_user
+default	vt2			role_v	ROLE	SELECT	false	-1	hive_admin_user
+default	vt2			role_v	ROLE	UPDATE	false	-1	hive_admin_user
+default	vt2			user1	USER	DELETE	true	-1	user1
+default	vt2			user1	USER	INSERT	true	-1	user1
+default	vt2			user1	USER	SELECT	true	-1	user1
+default	vt2			user1	USER	UPDATE	true	-1	user1

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/service/src/java/org/apache/hive/service/cli/operation/ClassicTableTypeMapping.java
----------------------------------------------------------------------
diff --git a/service/src/java/org/apache/hive/service/cli/operation/ClassicTableTypeMapping.java b/service/src/java/org/apache/hive/service/cli/operation/ClassicTableTypeMapping.java
index 5f8cc1e..86417a4 100644
--- a/service/src/java/org/apache/hive/service/cli/operation/ClassicTableTypeMapping.java
+++ b/service/src/java/org/apache/hive/service/cli/operation/ClassicTableTypeMapping.java
@@ -47,6 +47,7 @@ public class ClassicTableTypeMapping implements TableTypeMapping {
   public enum ClassicTableTypes {
     TABLE,
     VIEW,
+    MATERIALIZED_VIEW,
   }
 
   private final Map<String, String> hiveToClientMap = new HashMap<String, String>();
@@ -56,10 +57,14 @@ public class ClassicTableTypeMapping implements TableTypeMapping {
     hiveToClientMap.put(TableType.MANAGED_TABLE.name(), ClassicTableTypes.TABLE.name());
     hiveToClientMap.put(TableType.EXTERNAL_TABLE.name(), ClassicTableTypes.TABLE.name());
     hiveToClientMap.put(TableType.VIRTUAL_VIEW.name(), ClassicTableTypes.VIEW.name());
+    hiveToClientMap.put(TableType.MATERIALIZED_VIEW.toString(),
+            ClassicTableTypes.MATERIALIZED_VIEW.toString());
 
     clientToHiveMap.putAll(ClassicTableTypes.TABLE.name(), Arrays.asList(
         TableType.MANAGED_TABLE.name(), TableType.EXTERNAL_TABLE.name()));
     clientToHiveMap.put(ClassicTableTypes.VIEW.name(), TableType.VIRTUAL_VIEW.name());
+    clientToHiveMap.put(ClassicTableTypes.MATERIALIZED_VIEW.toString(),
+            TableType.MATERIALIZED_VIEW.toString());
   }
 
   @Override


[4/4] hive git commit: HIVE-14249: Add simple materialized views with manual rebuilds (1) (Alan Gates, reviewed by Jesus Camacho Rodriguez)

Posted by jc...@apache.org.
HIVE-14249: Add simple materialized views with manual rebuilds (1) (Alan Gates, reviewed by Jesus Camacho Rodriguez)


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/438109cb
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/438109cb
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/438109cb

Branch: refs/heads/master
Commit: 438109cb90f126e6043533bba060f166bf55c954
Parents: 7f8263e
Author: Alan Gates <ga...@apache.org>
Authored: Wed Jul 20 12:37:31 2016 +0100
Committer: Jesus Camacho Rodriguez <jc...@apache.org>
Committed: Thu Sep 15 15:14:44 2016 +0100

----------------------------------------------------------------------
 .../org/apache/hadoop/hive/conf/HiveConf.java   |  13 +-
 .../apache/hive/jdbc/HiveDatabaseMetaData.java  |   2 +
 .../apache/hadoop/hive/metastore/TableType.java |   2 +-
 .../org/apache/hadoop/hive/ql/ErrorMsg.java     |   3 +
 .../apache/hadoop/hive/ql/QueryProperties.java  |  15 +
 .../org/apache/hadoop/hive/ql/exec/DDLTask.java |  75 +++--
 .../apache/hadoop/hive/ql/metadata/Table.java   |   9 +-
 .../hive/ql/parse/BaseSemanticAnalyzer.java     |  12 +-
 .../hive/ql/parse/DDLSemanticAnalyzer.java      |   2 +-
 .../apache/hadoop/hive/ql/parse/EximUtil.java   |   2 +-
 .../apache/hadoop/hive/ql/parse/HiveParser.g    |  27 ++
 .../hive/ql/parse/LoadSemanticAnalyzer.java     |   2 +-
 .../hadoop/hive/ql/parse/ParseContext.java      |  27 +-
 .../org/apache/hadoop/hive/ql/parse/QB.java     |  16 +
 .../hadoop/hive/ql/parse/SemanticAnalyzer.java  | 203 ++++++++-----
 .../hadoop/hive/ql/parse/StorageFormat.java     |  17 +-
 .../hadoop/hive/ql/parse/TaskCompiler.java      | 105 ++++---
 .../ql/parse/UpdateDeleteSemanticAnalyzer.java  |   7 +
 .../hadoop/hive/ql/plan/CreateViewDesc.java     |  54 ++++
 .../hadoop/hive/ql/plan/HiveOperation.java      |   2 +
 .../hadoop/hive/ql/plan/LoadFileDesc.java       |  10 +-
 .../apache/hadoop/hive/ql/plan/PlanUtils.java   |  41 +++
 .../authorization/plugin/HiveOperationType.java |   1 +
 .../plugin/sqlstd/Operation2Privilege.java      |   4 +
 ...ialized_view_authorization_create_no_grant.q |  15 +
 ...d_view_authorization_create_no_select_perm.q |  14 +
 ...materialized_view_authorization_drop_other.q |  14 +
 ...rialized_view_authorization_no_select_perm.q |  14 +
 ...alized_view_authorization_rebuild_no_grant.q |  20 ++
 ...erialized_view_authorization_rebuild_other.q |  14 +
 .../clientnegative/materialized_view_delete.q   |  10 +
 .../clientnegative/materialized_view_insert.q   |   6 +
 .../clientnegative/materialized_view_load.q     |   7 +
 .../materialized_view_replace_with_view.q       |   8 +
 .../clientnegative/materialized_view_update.q   |  10 +
 .../test/queries/clientnegative/view_delete.q   |  10 +
 .../test/queries/clientnegative/view_update.q   |  10 +
 .../clientpositive/authorization_view_sqlstd.q  |  86 ------
 .../materialized_view_authorization_sqlstd.q    |  58 ++++
 .../clientpositive/materialized_view_create.q   |  31 ++
 .../clientpositive/materialized_view_drop.q     |   7 +
 .../clientpositive/materialized_view_rebuild.q  |  13 +
 .../clientpositive/view_authorization_sqlstd.q  |  89 ++++++
 ...zed_view_authorization_create_no_grant.q.out |  26 ++
 ...ew_authorization_create_no_select_perm.q.out |  20 ++
 ...rialized_view_authorization_drop_other.q.out |  30 ++
 ...ized_view_authorization_no_select_perm.q.out |  30 ++
 ...ed_view_authorization_rebuild_no_grant.q.out |  42 +++
 ...lized_view_authorization_rebuild_other.q.out |  30 ++
 .../materialized_view_delete.q.out              |  19 ++
 .../materialized_view_insert.q.out              |  19 ++
 .../clientnegative/materialized_view_load.q.out |  19 ++
 .../materialized_view_replace_with_view.q.out   |  30 ++
 .../materialized_view_update.q.out              |  19 ++
 .../results/clientnegative/view_delete.q.out    |  19 ++
 .../results/clientnegative/view_update.q.out    |  19 ++
 .../authorization_view_sqlstd.q.out             | 269 -----------------
 ...materialized_view_authorization_sqlstd.q.out | 195 ++++++++++++
 .../materialized_view_create.q.out              | 173 +++++++++++
 .../clientpositive/materialized_view_drop.q.out |  39 +++
 .../materialized_view_rebuild.q.out             |  67 +++++
 .../view_authorization_sqlstd.q.out             | 295 +++++++++++++++++++
 .../cli/operation/ClassicTableTypeMapping.java  |   5 +
 63 files changed, 1931 insertions(+), 521 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
----------------------------------------------------------------------
diff --git a/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java b/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
index d6944ee..d68c4fb 100644
--- a/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
+++ b/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
@@ -1104,10 +1104,15 @@ public class HiveConf extends Configuration {
     HIVEDEFAULTFILEFORMAT("hive.default.fileformat", "TextFile", new StringSet("TextFile", "SequenceFile", "RCfile", "ORC"),
         "Default file format for CREATE TABLE statement. Users can explicitly override it by CREATE TABLE ... STORED AS [FORMAT]"),
     HIVEDEFAULTMANAGEDFILEFORMAT("hive.default.fileformat.managed", "none",
-  new StringSet("none", "TextFile", "SequenceFile", "RCfile", "ORC"),
-  "Default file format for CREATE TABLE statement applied to managed tables only. External tables will be \n" +
-  "created with format specified by hive.default.fileformat. Leaving this null will result in using hive.default.fileformat \n" +
-  "for all tables."),
+        new StringSet("none", "TextFile", "SequenceFile", "RCfile", "ORC"),
+        "Default file format for CREATE TABLE statement applied to managed tables only. External tables will be \n" +
+        "created with format specified by hive.default.fileformat. Leaving this null will result in using hive.default.fileformat \n" +
+        "for all tables."),
+    HIVEMATERIALIZEDVIEWFILEFORMAT("hive.materializedview.fileformat", "ORC",
+        new StringSet("none", "TextFile", "SequenceFile", "RCfile", "ORC"),
+        "File format for CREATE MATERIALIZED VIEW statement."),
+    HIVEMATERIALIZEDVIEWSERDE("hive.materializedview.serde",
+        "org.apache.hadoop.hive.ql.io.orc.OrcSerde", "Serde used for materialized views"),
     HIVEQUERYRESULTFILEFORMAT("hive.query.result.fileformat", "SequenceFile", new StringSet("TextFile", "SequenceFile", "RCfile", "Llap"),
         "Default file format for storing result of the query."),
     HIVECHECKFILEFORMAT("hive.fileformat.check", true, "Whether to check file format or not when loading data files"),

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/jdbc/src/java/org/apache/hive/jdbc/HiveDatabaseMetaData.java
----------------------------------------------------------------------
diff --git a/jdbc/src/java/org/apache/hive/jdbc/HiveDatabaseMetaData.java b/jdbc/src/java/org/apache/hive/jdbc/HiveDatabaseMetaData.java
index 9d73470..fa984f4 100644
--- a/jdbc/src/java/org/apache/hive/jdbc/HiveDatabaseMetaData.java
+++ b/jdbc/src/java/org/apache/hive/jdbc/HiveDatabaseMetaData.java
@@ -728,6 +728,8 @@ public class HiveDatabaseMetaData implements DatabaseMetaData {
       return "VIEW";
     } else if (hivetabletype.equals(TableType.EXTERNAL_TABLE.toString())) {
       return "EXTERNAL TABLE";
+    } else if (hivetabletype.equals(TableType.MATERIALIZED_VIEW.toString())) {
+      return "MATERIALIZED VIEW";
     } else {
       return hivetabletype;
     }

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/metastore/src/java/org/apache/hadoop/hive/metastore/TableType.java
----------------------------------------------------------------------
diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/TableType.java b/metastore/src/java/org/apache/hadoop/hive/metastore/TableType.java
index 56eeaa0..e9e16d7 100644
--- a/metastore/src/java/org/apache/hadoop/hive/metastore/TableType.java
+++ b/metastore/src/java/org/apache/hadoop/hive/metastore/TableType.java
@@ -22,5 +22,5 @@ package org.apache.hadoop.hive.metastore;
  * Typesafe enum for types of tables described by the metastore.
  */
 public enum TableType {
-  MANAGED_TABLE, EXTERNAL_TABLE, VIRTUAL_VIEW, INDEX_TABLE
+  MANAGED_TABLE, EXTERNAL_TABLE, VIRTUAL_VIEW, INDEX_TABLE, MATERIALIZED_VIEW
 }

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java b/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java
index 001f852..af1583f 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java
@@ -450,6 +450,9 @@ public enum ErrorMsg {
   ACID_NOT_ENOUGH_HISTORY(10327, "Not enough history available for ({0},{1}).  " +
     "Oldest available base: {2}", true),
   INVALID_COLUMN_NAME(10328, "Invalid column name"),
+  REPLACE_VIEW_WITH_MATERIALIZED(10400, "Attempt to replace view {0} with materialized view", true),
+  REPLACE_MATERIALIZED_WITH_VIEW(10401, "Attempt to replace materialized view {0} with view", true),
+  UPDATE_DELETE_VIEW(10402, "You cannot update or delete records in a view"),
   //========================== 20000 range starts here ========================//
   SCRIPT_INIT_ERROR(20000, "Unable to initialize custom script."),
   SCRIPT_IO_ERROR(20001, "An error occurred while reading or writing to your custom script. "

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/java/org/apache/hadoop/hive/ql/QueryProperties.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/QueryProperties.java b/ql/src/java/org/apache/hadoop/hive/ql/QueryProperties.java
index 3bc9432..650792b 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/QueryProperties.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/QueryProperties.java
@@ -65,6 +65,8 @@ public class QueryProperties {
   private boolean multiDestQuery;
   private boolean filterWithSubQuery;
 
+  // True if this statement creates or replaces a materialized view
+  private boolean isMaterializedView;
 
   public boolean isQuery() {
     return query;
@@ -260,6 +262,19 @@ public class QueryProperties {
     return this.filterWithSubQuery;
   }
 
+  /**
+   * True indicates this statement create or replaces a materialized view, not that it is a query
+   * against a materialized view.
+   * @return
+   */
+  public boolean isMaterializedView() {
+    return isMaterializedView;
+  }
+
+  public void setMaterializedView(boolean isMaterializedView) {
+    this.isMaterializedView = isMaterializedView;
+  }
+
   public void clear() {
     query = false;
     analyzeCommand = false;

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
index 569c19e..68d5fde 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
@@ -4041,7 +4041,8 @@ public class DDLTask extends Task<DDLWork> implements Serializable {
     // Get the existing table
     Table oldtbl = db.getTable(crtTbl.getLikeTableName());
     Table tbl;
-    if (oldtbl.getTableType() == TableType.VIRTUAL_VIEW) {
+    if (oldtbl.getTableType() == TableType.VIRTUAL_VIEW ||
+        oldtbl.getTableType() == TableType.MATERIALIZED_VIEW) {
       String targetTableName = crtTbl.getTableName();
       tbl=db.newTable(targetTableName);
 
@@ -4187,39 +4188,50 @@ public class DDLTask extends Task<DDLWork> implements Serializable {
   private int createView(Hive db, CreateViewDesc crtView) throws HiveException {
     Table oldview = db.getTable(crtView.getViewName(), false);
     if (crtView.getOrReplace() && oldview != null) {
-      // replace existing view
-      // remove the existing partition columns from the field schema
-      oldview.setViewOriginalText(crtView.getViewOriginalText());
-      oldview.setViewExpandedText(crtView.getViewExpandedText());
-      oldview.setFields(crtView.getSchema());
-      if (crtView.getComment() != null) {
-        oldview.setProperty("comment", crtView.getComment());
-      }
-      if (crtView.getTblProps() != null) {
-        oldview.getTTable().getParameters().putAll(crtView.getTblProps());
-      }
-      oldview.setPartCols(crtView.getPartCols());
-      if (crtView.getInputFormat() != null) {
-        oldview.setInputFormatClass(crtView.getInputFormat());
-      }
-      if (crtView.getOutputFormat() != null) {
-        oldview.setOutputFormatClass(crtView.getOutputFormat());
-      }
-      oldview.checkValidity(null);
-      try {
-        db.alterTable(crtView.getViewName(), oldview, null);
-      } catch (InvalidOperationException e) {
-        throw new HiveException(e);
+      if (!crtView.isMaterialized()) {
+        // replace existing view
+        // remove the existing partition columns from the field schema
+        oldview.setViewOriginalText(crtView.getViewOriginalText());
+        oldview.setViewExpandedText(crtView.getViewExpandedText());
+        oldview.setFields(crtView.getSchema());
+        if (crtView.getComment() != null) {
+          oldview.setProperty("comment", crtView.getComment());
+        }
+        if (crtView.getTblProps() != null) {
+          oldview.getTTable().getParameters().putAll(crtView.getTblProps());
+        }
+        oldview.setPartCols(crtView.getPartCols());
+        if (crtView.getInputFormat() != null) {
+          oldview.setInputFormatClass(crtView.getInputFormat());
+        }
+        if (crtView.getOutputFormat() != null) {
+          oldview.setOutputFormatClass(crtView.getOutputFormat());
+        }
+        oldview.checkValidity(null);
+        try {
+          db.alterTable(crtView.getViewName(), oldview, null);
+        } catch (InvalidOperationException e) {
+          throw new HiveException(e);
+        }
+        work.getOutputs().add(new WriteEntity(oldview, WriteEntity.WriteType.DDL_NO_LOCK));
+      } else {
+        // This is a replace, so we need an exclusive lock
+        work.getOutputs().add(new WriteEntity(oldview, WriteEntity.WriteType.DDL_EXCLUSIVE));
       }
-      work.getOutputs().add(new WriteEntity(oldview, WriteEntity.WriteType.DDL_NO_LOCK));
     } else {
       // create new view
       Table tbl = db.newTable(crtView.getViewName());
-      tbl.setTableType(TableType.VIRTUAL_VIEW);
+      if (crtView.isMaterialized()) {
+        tbl.setTableType(TableType.MATERIALIZED_VIEW);
+      } else {
+        tbl.setTableType(TableType.VIRTUAL_VIEW);
+      }
       tbl.setSerializationLib(null);
       tbl.clearSerDeInfo();
       tbl.setViewOriginalText(crtView.getViewOriginalText());
-      tbl.setViewExpandedText(crtView.getViewExpandedText());
+      if (!crtView.isMaterialized()) {
+        tbl.setViewExpandedText(crtView.getViewExpandedText());
+      }
       tbl.setFields(crtView.getSchema());
       if (crtView.getComment() != null) {
         tbl.setProperty("comment", crtView.getComment());
@@ -4239,6 +4251,15 @@ public class DDLTask extends Task<DDLWork> implements Serializable {
         tbl.setOutputFormatClass(crtView.getOutputFormat());
       }
 
+      if (crtView.isMaterialized()) {
+        // Short circuit the checks that the input format is valid, this is configured for all
+        // materialized views and doesn't change so we don't need to check it constantly.
+        tbl.getSd().setInputFormat(crtView.getInputFormat());
+        tbl.getSd().setOutputFormat(crtView.getOutputFormat());
+        tbl.getSd().setSerdeInfo(new SerDeInfo(crtView.getSerde(), crtView.getSerde(),
+                Collections.<String, String>emptyMap()));
+      }
+
       db.createTable(tbl, crtView.getIfNotExists());
       work.getOutputs().add(new WriteEntity(tbl, WriteEntity.WriteType.DDL_NO_LOCK));
     }

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/java/org/apache/hadoop/hive/ql/metadata/Table.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/metadata/Table.java b/ql/src/java/org/apache/hadoop/hive/ql/metadata/Table.java
index e0d35d3..ea90889 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/metadata/Table.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/metadata/Table.java
@@ -209,8 +209,11 @@ public class Table implements Serializable {
     }
 
     if (isView()) {
+      assert (getViewOriginalText() != null);
+      assert (getViewExpandedText() != null);
+    } else if (isMaterializedView()) {
       assert(getViewOriginalText() != null);
-      assert(getViewExpandedText() != null);
+      assert(getViewExpandedText() == null);
     } else {
       assert(getViewOriginalText() == null);
       assert(getViewExpandedText() == null);
@@ -824,6 +827,10 @@ public class Table implements Serializable {
     return TableType.VIRTUAL_VIEW.equals(getTableType());
   }
 
+  public boolean isMaterializedView() {
+    return TableType.MATERIALIZED_VIEW.equals(getTableType());
+  }
+
   /**
    * @return whether this table is actually an index table
    */

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
index e0e9b12..dd86abd 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
@@ -1000,7 +1000,9 @@ public abstract class BaseSemanticAnalyzer {
       assert (ast.getToken().getType() == HiveParser.TOK_TAB
           || ast.getToken().getType() == HiveParser.TOK_TABLE_PARTITION
           || ast.getToken().getType() == HiveParser.TOK_TABTYPE
-          || ast.getToken().getType() == HiveParser.TOK_CREATETABLE);
+          || ast.getToken().getType() == HiveParser.TOK_CREATETABLE
+          || ast.getToken().getType() == HiveParser.TOK_CREATE_MATERIALIZED_VIEW
+          || ast.getToken().getType() == HiveParser.TOK_REBUILD_MATERIALIZED_VIEW);
       int childIndex = 0;
       numDynParts = 0;
 
@@ -1012,7 +1014,9 @@ public abstract class BaseSemanticAnalyzer {
           tableName = conf.getVar(HiveConf.ConfVars.HIVETESTMODEPREFIX)
               + tableName;
         }
-        if (ast.getToken().getType() != HiveParser.TOK_CREATETABLE) {
+        if (ast.getToken().getType() != HiveParser.TOK_CREATETABLE &&
+            ast.getToken().getType() != HiveParser.TOK_CREATE_MATERIALIZED_VIEW &&
+            ast.getToken().getType() != HiveParser.TOK_REBUILD_MATERIALIZED_VIEW) {
           tableHandle = db.getTable(tableName);
         }
       } catch (InvalidTableException ite) {
@@ -1024,7 +1028,9 @@ public abstract class BaseSemanticAnalyzer {
       }
 
       // get partition metadata if partition specified
-      if (ast.getChildCount() == 2 && ast.getToken().getType() != HiveParser.TOK_CREATETABLE) {
+      if (ast.getChildCount() == 2 && ast.getToken().getType() != HiveParser.TOK_CREATETABLE &&
+          ast.getToken().getType() != HiveParser.TOK_CREATE_MATERIALIZED_VIEW &&
+          ast.getToken().getType() != HiveParser.TOK_REBUILD_MATERIALIZED_VIEW) {
         childIndex = 1;
         ASTNode partspec = (ASTNode) ast.getChild(1);
         partitions = new ArrayList<Partition>();

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java
index 9329e00..988c58e 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java
@@ -1160,7 +1160,7 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer {
       }
     }
 
-    storageFormat.fillDefaultStorageFormat(false);
+    storageFormat.fillDefaultStorageFormat(false, false);
     if (indexTableName == null) {
       indexTableName = MetaStoreUtils.getIndexTableName(qTabName[0], qTabName[1], indexName);
       indexTableName = qTabName[0] + "." + indexTableName; // on same database with base table

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/java/org/apache/hadoop/hive/ql/parse/EximUtil.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/EximUtil.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/EximUtil.java
index a3fcaa0..167f7a5 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/EximUtil.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/EximUtil.java
@@ -127,7 +127,7 @@ public class EximUtil {
   }
 
   static void validateTable(org.apache.hadoop.hive.ql.metadata.Table table) throws SemanticException {
-    if (table.isView()) {
+    if (table.isView() || table.isMaterializedView()) {
       throw new SemanticException(ErrorMsg.DML_AGAINST_VIEW.getMsg());
     }
     if (table.isNonNative()) {

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g b/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g
index df596ff..92dfc90 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g
@@ -250,6 +250,8 @@ TOK_ALTERVIEW_DROPPROPERTIES;
 TOK_ALTERVIEW_ADDPARTS;
 TOK_ALTERVIEW_DROPPARTS;
 TOK_ALTERVIEW_RENAME;
+TOK_REBUILD_MATERIALIZED_VIEW;
+TOK_CREATE_MATERIALIZED_VIEW;
 TOK_VIEWPARTCOLS;
 TOK_EXPLAIN;
 TOK_EXPLAIN_SQ_REWRITE;
@@ -784,7 +786,9 @@ ddlStatement
     | showStatement
     | metastoreCheck
     | createViewStatement
+    | createMaterializedViewStatement
     | dropViewStatement
+    | dropMaterializedViewStatement
     | createFunctionStatement
     | createMacroStatement
     | createIndexStatement
@@ -1030,6 +1034,7 @@ alterStatement
 @after { popMsg(state); }
     : KW_ALTER KW_TABLE tableName alterTableStatementSuffix -> ^(TOK_ALTERTABLE tableName alterTableStatementSuffix)
     | KW_ALTER KW_VIEW tableName KW_AS? alterViewStatementSuffix -> ^(TOK_ALTERVIEW tableName alterViewStatementSuffix)
+    | KW_ALTER KW_MATERIALIZED KW_VIEW tableName KW_REBUILD -> ^(TOK_REBUILD_MATERIALIZED_VIEW tableName)
     | KW_ALTER KW_INDEX alterIndexStatementSuffix -> alterIndexStatementSuffix
     | KW_ALTER (KW_DATABASE|KW_SCHEMA) alterDatabaseStatementSuffix -> alterDatabaseStatementSuffix
     ;
@@ -1778,6 +1783,22 @@ createViewStatement
         )
     ;
 
+createMaterializedViewStatement
+@init {
+    pushMsg("create materialized view statement", state);
+}
+@after { popMsg(state); }
+    : KW_CREATE KW_MATERIALIZED KW_VIEW (ifNotExists)? name=tableName
+        tableComment? tablePropertiesPrefixed?
+        KW_AS selectStatementWithCTE
+    -> ^(TOK_CREATE_MATERIALIZED_VIEW $name 
+         ifNotExists?
+         tableComment?
+         tablePropertiesPrefixed?
+         selectStatementWithCTE
+        )
+    ;
+
 viewPartition
 @init { pushMsg("view partition specification", state); }
 @after { popMsg(state); }
@@ -1791,6 +1812,12 @@ dropViewStatement
     : KW_DROP KW_VIEW ifExists? viewName -> ^(TOK_DROPVIEW viewName ifExists?)
     ;
 
+dropMaterializedViewStatement
+@init { pushMsg("drop materialized view statement", state); }
+@after { popMsg(state); }
+    : KW_DROP KW_MATERIALIZED KW_VIEW ifExists? viewName -> ^(TOK_DROPTABLE viewName ifExists?)
+    ;
+
 showFunctionIdentifier
 @init { pushMsg("identifier for show function statement", state); }
 @after { popMsg(state); }

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/java/org/apache/hadoop/hive/ql/parse/LoadSemanticAnalyzer.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/LoadSemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/LoadSemanticAnalyzer.java
index a49b813..a7005f1 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/LoadSemanticAnalyzer.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/LoadSemanticAnalyzer.java
@@ -199,7 +199,7 @@ public class LoadSemanticAnalyzer extends BaseSemanticAnalyzer {
     // initialize destination table/partition
     TableSpec ts = new TableSpec(db, conf, (ASTNode) tableTree);
 
-   if (ts.tableHandle.isView()) {
+    if (ts.tableHandle.isView() || ts.tableHandle.isMaterializedView()) {
       throw new SemanticException(ErrorMsg.DML_AGAINST_VIEW.getMsg());
     }
     if (ts.tableHandle.isNonNative()) {

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/java/org/apache/hadoop/hive/ql/parse/ParseContext.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/ParseContext.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/ParseContext.java
index 4353d3a..35f34da 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/ParseContext.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/ParseContext.java
@@ -51,6 +51,7 @@ import org.apache.hadoop.hive.ql.optimizer.ppr.PartitionPruner;
 import org.apache.hadoop.hive.ql.optimizer.unionproc.UnionProcContext;
 import org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer.AnalyzeRewriteContext;
 import org.apache.hadoop.hive.ql.plan.CreateTableDesc;
+import org.apache.hadoop.hive.ql.plan.CreateViewDesc;
 import org.apache.hadoop.hive.ql.plan.ExprNodeDesc;
 import org.apache.hadoop.hive.ql.plan.FileSinkDesc;
 import org.apache.hadoop.hive.ql.plan.FilterDesc.SampleDesc;
@@ -116,6 +117,7 @@ public class ParseContext {
 
   private AnalyzeRewriteContext analyzeRewrite;
   private CreateTableDesc createTableDesc;
+  private CreateViewDesc createViewDesc;
   private boolean reduceSinkAddedBySortedDynPartition;
 
   private Map<SelectOperator, Table> viewProjectToViewSchema;  
@@ -129,20 +131,14 @@ public class ParseContext {
 
   /**
    * @param conf
-   * @param qb
-   *          current QB
-   * @param ast
-   *          current parse tree
    * @param opToPartPruner
    *          map from table scan operator to partition pruner
    * @param opToPartList
    * @param topOps
    *          list of operators for the top query
-   * @param opParseCtx
-   *          operator parse context - contains a mapping from operator to
-   *          operator parse state (row resolver etc.)
    * @param joinOps
    *          context needed join processing (map join specifically)
+   * @param smbMapJoinOps
    * @param loadTableWork
    *          list of destination tables being loaded
    * @param loadFileWork
@@ -154,13 +150,19 @@ public class ParseContext {
    * @param destTableId
    * @param listMapJoinOpsNoReducer
    *          list of map join operators with no reducer
-   * @param groupOpToInputTables
    * @param prunedPartitions
    * @param opToSamplePruner
    *          operator to sample pruner map
    * @param globalLimitCtx
    * @param nameToSplitSample
    * @param rootTasks
+   * @param opToPartToSkewedPruner
+   * @param viewAliasToInput
+   * @param reduceSinkOperatorsAddedByEnforceBucketingSorting
+   * @param analyzeRewrite
+   * @param createTableDesc
+   * @param createViewDesc
+   * @param queryProperties
    */
   public ParseContext(
       QueryState queryState,
@@ -183,8 +185,8 @@ public class ParseContext {
       Map<String, ReadEntity> viewAliasToInput,
       List<ReduceSinkOperator> reduceSinkOperatorsAddedByEnforceBucketingSorting,
       AnalyzeRewriteContext analyzeRewrite, CreateTableDesc createTableDesc,
-      QueryProperties queryProperties, Map<SelectOperator, Table> viewProjectToTableSchema,
-      Set<FileSinkDesc> acidFileSinks) {
+      CreateViewDesc createViewDesc, QueryProperties queryProperties,
+      Map<SelectOperator, Table> viewProjectToTableSchema, Set<FileSinkDesc> acidFileSinks) {
     this.queryState = queryState;
     this.conf = queryState.getConf();
     this.opToPartPruner = opToPartPruner;
@@ -213,6 +215,7 @@ public class ParseContext {
         reduceSinkOperatorsAddedByEnforceBucketingSorting;
     this.analyzeRewrite = analyzeRewrite;
     this.createTableDesc = createTableDesc;
+    this.createViewDesc = createViewDesc;
     this.queryProperties = queryProperties;
     this.viewProjectToViewSchema = viewProjectToTableSchema;
     this.needViewColumnAuthorization = viewProjectToTableSchema != null
@@ -582,6 +585,10 @@ public class ParseContext {
     this.createTableDesc = createTableDesc;
   }
 
+  public CreateViewDesc getCreateViewDesc() {
+    return createViewDesc;
+  }
+
   public void setReduceSinkAddedBySortedDynPartition(
       final boolean reduceSinkAddedBySortedDynPartition) {
     this.reduceSinkAddedBySortedDynPartition = reduceSinkAddedBySortedDynPartition;

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/java/org/apache/hadoop/hive/ql/parse/QB.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/QB.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/QB.java
index 7e732f3..59d537f 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/QB.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/QB.java
@@ -32,6 +32,7 @@ import org.slf4j.LoggerFactory;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hive.ql.metadata.Table;
 import org.apache.hadoop.hive.ql.plan.CreateTableDesc;
+import org.apache.hadoop.hive.ql.plan.CreateViewDesc;
 
 /**
  * Implementation of the query block.
@@ -63,6 +64,9 @@ public class QB {
   private boolean insideView;
   private Set<String> aliasInsideView;
 
+  // If this is a materialized view, this stores the view descriptor
+  private CreateViewDesc viewDesc;
+
   // used by PTFs
   /*
    * This map maintains the PTFInvocationSpec for each PTF chain invocation in this QB.
@@ -404,6 +408,18 @@ public class QB {
     return havingClauseSubQueryPredicate;
   }
 
+  public CreateViewDesc getViewDesc() {
+    return viewDesc;
+  }
+
+  public void setViewDesc(CreateViewDesc viewDesc) {
+    this.viewDesc = viewDesc;
+  }
+
+  public boolean isMaterializedView() {
+    return viewDesc != null && viewDesc.isMaterialized();
+  }
+
   void addEncryptedTargetTablePath(Path p) {
     if(encryptedTargetTablePaths == null) {
       encryptedTargetTablePaths = new ArrayList<>();

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
index b071ddf..ab2966b 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
@@ -469,7 +469,7 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
         listMapJoinOpsNoReducer, prunedPartitions, tabNameToTabObject,
         opToSamplePruner, globalLimitCtx, nameToSplitSample, inputs, rootTasks,
         opToPartToSkewedPruner, viewAliasToInput, reduceSinkOperatorsAddedByEnforceBucketingSorting,
-        analyzeRewrite, tableDesc, queryProperties, viewProjectToTableSchema, acidFileSinks);
+        analyzeRewrite, tableDesc, createVwDesc, queryProperties, viewProjectToTableSchema, acidFileSinks);
   }
 
   public CompilationOpContext getOpContext() {
@@ -2060,7 +2060,7 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
       switch (ast.getToken().getType()) {
         case HiveParser.TOK_TAB: {
           TableSpec ts = new TableSpec(db, conf, ast);
-          if (ts.tableHandle.isView()) {
+          if (ts.tableHandle.isView() || ts.tableHandle.isMaterializedView()) {
             throw new SemanticException(ErrorMsg.DML_AGAINST_VIEW.getMsg());
           }
 
@@ -2098,7 +2098,7 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
           if ((!qb.getParseInfo().getIsSubQ())
               && (((ASTNode) ast.getChild(0)).getToken().getType() == HiveParser.TOK_TMP_FILE)) {
 
-            if (qb.isCTAS()) {
+            if (qb.isCTAS() || qb.isMaterializedView()) {
               qb.setIsQuery(false);
               ctx.setResDir(null);
               ctx.setResFile(null);
@@ -4403,12 +4403,10 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
   /**
    * Returns the GenericUDAFInfo struct for the aggregation.
    *
-   * @param aggName
-   *          The name of the UDAF.
+   * @param evaluator
+   * @param emode
    * @param aggParameters
    *          The exprNodeDesc of the original parameters
-   * @param aggTree
-   *          The ASTNode node of the UDAF in the query.
    * @return GenericUDAFInfo
    * @throws SemanticException
    *           when the UDAF is not found or has problems.
@@ -4714,6 +4712,9 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
    * Generate the GroupByOperator for the Query Block (parseInfo.getXXX(dest)).
    * The new GroupByOperator will be a child of the reduceSinkOperatorInfo.
    *
+   * @param parseInfo
+   * @param dest
+   * @param reduceSinkOperatorInfo
    * @param mode
    *          The mode of the aggregation (MERGEPARTIAL, PARTIAL2)
    * @param genericUDAFEvaluators
@@ -4723,7 +4724,7 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
    *          list of grouping sets
    * @param groupingSetsPresent
    *          whether grouping sets are present in this query
-   * @param groupingSetsConsumedCurrentMR
+   * @param groupingSetsNeedAdditionalMRJob
    *          whether grouping sets are consumed by this group by
    * @return the new GroupByOperator
    */
@@ -6796,10 +6797,14 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
       // table command rather than taking the default value
       List<FieldSchema> field_schemas = null;
       CreateTableDesc tblDesc = qb.getTableDesc();
+      CreateViewDesc viewDesc = qb.getViewDesc();
       if (tblDesc != null) {
         field_schemas = new ArrayList<FieldSchema>();
         destTableIsTemporary = tblDesc.isTemporary();
         destTableIsMaterialization = tblDesc.isMaterialization();
+      } else if (viewDesc != null) {
+        field_schemas = new ArrayList<FieldSchema>();
+        destTableIsTemporary = false;
       }
 
       boolean first = true;
@@ -6858,6 +6863,8 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
       // update the create table descriptor with the resulting schema.
       if (tblDesc != null) {
         tblDesc.setCols(new ArrayList<FieldSchema>(field_schemas));
+      } else if (viewDesc != null) {
+        viewDesc.setSchema(new ArrayList<FieldSchema>(field_schemas));
       }
 
       boolean isDestTempFile = true;
@@ -6869,11 +6876,13 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
       }
 
       boolean isDfsDir = (dest_type.intValue() == QBMetaData.DEST_DFS_FILE);
-      loadFileWork.add(new LoadFileDesc(tblDesc, queryTmpdir, dest_path, isDfsDir, cols,
+      loadFileWork.add(new LoadFileDesc(tblDesc, viewDesc, queryTmpdir, dest_path, isDfsDir, cols,
           colTypes));
 
       if (tblDesc == null) {
-        if (qb.getIsQuery()) {
+        if (viewDesc != null) {
+          table_desc = PlanUtils.getTableDesc(viewDesc, cols, colTypes);
+        } else if (qb.getIsQuery()) {
           String fileFormat;
           if (SessionState.get().getIsUsingThriftJDBCBinarySerDe()) {
               fileFormat = "SequenceFile";
@@ -10434,7 +10443,8 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
    *
    * @param source
    * @param dest
-   * @param outputColNames
+   * @param colExprMap
+   * @param outputInternalColNames
    *          - a list to which the new internal column names will be added, in
    *          the same order as in the dest row resolver
    */
@@ -10687,10 +10697,12 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
     }
 
     // 3. analyze create view command
-    if (ast.getToken().getType() == HiveParser.TOK_CREATEVIEW
-        || (ast.getToken().getType() == HiveParser.TOK_ALTERVIEW && ast.getChild(1).getType() == HiveParser.TOK_QUERY)) {
+    if (ast.getToken().getType() == HiveParser.TOK_CREATEVIEW ||
+        ast.getToken().getType() == HiveParser.TOK_CREATE_MATERIALIZED_VIEW ||
+        ast.getToken().getType() == HiveParser.TOK_REBUILD_MATERIALIZED_VIEW ||
+        (ast.getToken().getType() == HiveParser.TOK_ALTERVIEW &&
+            ast.getChild(1).getType() == HiveParser.TOK_QUERY)) {
       child = analyzeCreateView(ast, qb);
-      queryState.setCommandType(HiveOperation.CREATEVIEW);
       if (child == null) {
         return false;
       }
@@ -10835,7 +10847,7 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
         listMapJoinOpsNoReducer, prunedPartitions, tabNameToTabObject, opToSamplePruner,
         globalLimitCtx, nameToSplitSample, inputs, rootTasks, opToPartToSkewedPruner,
         viewAliasToInput, reduceSinkOperatorsAddedByEnforceBucketingSorting,
-        analyzeRewrite, tableDesc, queryProperties, viewProjectToTableSchema, acidFileSinks);
+        analyzeRewrite, tableDesc, createVwDesc, queryProperties, viewProjectToTableSchema, acidFileSinks);
 
     // 5. Take care of view creation
     if (createVwDesc != null) {
@@ -10846,32 +10858,34 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
 
       // validate the create view statement at this point, the createVwDesc gets
       // all the information for semanticcheck
-      validateCreateView(createVwDesc);
+      validateCreateView();
 
-      // Since we're only creating a view (not executing it), we don't need to
-      // optimize or translate the plan (and in fact, those procedures can
-      // interfere with the view creation). So skip the rest of this method.
-      ctx.setResDir(null);
-      ctx.setResFile(null);
+      if (!createVwDesc.isMaterialized()) {
+        // Since we're only creating a view (not executing it), we don't need to
+        // optimize or translate the plan (and in fact, those procedures can
+        // interfere with the view creation). So skip the rest of this method.
+        ctx.setResDir(null);
+        ctx.setResFile(null);
 
-      try {
-        PlanUtils.addInputsForView(pCtx);
-      } catch (HiveException e) {
-        throw new SemanticException(e);
-      }
+        try {
+          PlanUtils.addInputsForView(pCtx);
+        } catch (HiveException e) {
+          throw new SemanticException(e);
+        }
 
-      // Generate lineage info for create view statements
-      // if LineageLogger hook is configured.
-      if (HiveConf.getVar(conf, HiveConf.ConfVars.POSTEXECHOOKS).contains(
-          "org.apache.hadoop.hive.ql.hooks.LineageLogger")) {
-        ArrayList<Transform> transformations = new ArrayList<Transform>();
-        transformations.add(new HiveOpConverterPostProc());
-        transformations.add(new Generator());
-        for (Transform t : transformations) {
-          pCtx = t.transform(pCtx);
+        // Generate lineage info for create view statements
+        // if LineageLogger hook is configured.
+        if (HiveConf.getVar(conf, HiveConf.ConfVars.POSTEXECHOOKS).contains(
+            "org.apache.hadoop.hive.ql.hooks.LineageLogger")) {
+          ArrayList<Transform> transformations = new ArrayList<Transform>();
+          transformations.add(new HiveOpConverterPostProc());
+          transformations.add(new Generator());
+          for (Transform t : transformations) {
+            pCtx = t.transform(pCtx);
+          }
         }
+        return;
       }
-      return;
     }
 
     // 6. Generate table access stats if required
@@ -11002,6 +11016,11 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
 
   private void saveViewDefinition() throws SemanticException {
 
+    if (createVwDesc.isMaterialized() && createVwDesc.getOrReplace()) {
+      // This is a rebuild, there's nothing to do here.
+      return;
+    }
+
     // Make a copy of the statement's result schema, since we may
     // modify it below as part of imposing view column names.
     List<FieldSchema> derivedSchema =
@@ -11112,7 +11131,10 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
     }
 
     createVwDesc.setSchema(derivedSchema);
-    createVwDesc.setViewExpandedText(expandedText);
+    if (!createVwDesc.isMaterialized()) {
+      // materialized views don't store the expanded text as they won't be rewritten at query time.
+      createVwDesc.setViewExpandedText(expandedText);
+    }
   }
 
   static List<FieldSchema> convertRowSchemaToViewSchema(RowResolver rr) throws SemanticException {
@@ -11496,8 +11518,7 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
     RowFormatParams rowFormatParams = new RowFormatParams();
     StorageFormat storageFormat = new StorageFormat(conf);
 
-    LOG.info("Creating table " + dbDotTab + " position="
-        + ast.getCharPositionInLine());
+    LOG.info("Creating table " + dbDotTab + " position=" + ast.getCharPositionInLine());
     int numCh = ast.getChildCount();
 
     /*
@@ -11539,6 +11560,7 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
           command_type = CTLT;
         }
         break;
+
       case HiveParser.TOK_QUERY: // CTAS
         if (command_type == CTLT) {
           throw new SemanticException(ErrorMsg.CTAS_CTLT_COEXISTENCE.getMsg());
@@ -11629,7 +11651,7 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
         throw new SemanticException("Unrecognized command.");
     }
 
-    storageFormat.fillDefaultStorageFormat(isExt);
+    storageFormat.fillDefaultStorageFormat(isExt, false);
 
     if ((command_type == CTAS) && (storageFormat.getStorageHandler() != null)) {
       throw new SemanticException(ErrorMsg.CREATE_NON_NATIVE_AS.getMsg());
@@ -11782,6 +11804,7 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
       qb.setTableDesc(tableDesc);
 
       return selectStmt;
+
     default:
       throw new SemanticException("Unrecognized command.");
     }
@@ -11797,8 +11820,7 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
     outputs.add(new WriteEntity(t, WriteEntity.WriteType.DDL_NO_LOCK));
   }
 
-  private ASTNode analyzeCreateView(ASTNode ast, QB qb)
-      throws SemanticException {
+  private ASTNode analyzeCreateView(ASTNode ast, QB qb) throws SemanticException {
     String[] qualTabName = getQualifiedTableName((ASTNode) ast.getChild(0));
     String dbDotTable = getDotName(qualTabName);
     List<FieldSchema> cols = null;
@@ -11809,6 +11831,11 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
     ASTNode selectStmt = null;
     Map<String, String> tblProps = null;
     List<String> partColNames = null;
+    boolean isRebuild = ast.getToken().getType() == HiveParser.TOK_REBUILD_MATERIALIZED_VIEW;
+    boolean isMaterialized = ast.getToken().getType() == HiveParser.TOK_CREATE_MATERIALIZED_VIEW
+        || isRebuild;
+    StorageFormat storageFormat = storageFormat = new StorageFormat(conf);
+    storageFormat.fillDefaultStorageFormat(false, isMaterialized);
 
     LOG.info("Creating view " + dbDotTable + " position="
         + ast.getCharPositionInLine());
@@ -11852,18 +11879,40 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
       orReplace = true;
     }
 
-    StorageFormat defaultFmt = new StorageFormat(conf);
-    defaultFmt.fillDefaultStorageFormat(false);
-    createVwDesc = new CreateViewDesc(
-      dbDotTable, cols, comment, defaultFmt.getInputFormat(),
-      defaultFmt.getOutputFormat(), tblProps, partColNames,
-      ifNotExists, orReplace, isAlterViewAs);
-
     unparseTranslator.enable();
-    rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(),
-        createVwDesc), conf));
 
-    addDbAndTabToOutputs(qualTabName, TableType.VIRTUAL_VIEW);
+    if (isMaterialized) {
+      createVwDesc = new CreateViewDesc(dbDotTable, cols, comment, tblProps, partColNames,
+              ifNotExists, orReplace || isRebuild, isAlterViewAs, storageFormat.getInputFormat(),
+              storageFormat.getOutputFormat(), storageFormat.getSerde());
+      addDbAndTabToOutputs(qualTabName, TableType.MATERIALIZED_VIEW);
+      queryState.setCommandType(HiveOperation.CREATE_MATERIALIZED_VIEW);
+      qb.setViewDesc(createVwDesc);
+    } else {
+      createVwDesc = new CreateViewDesc(
+              dbDotTable, cols, comment, tblProps, partColNames,
+              ifNotExists, orReplace, isAlterViewAs, storageFormat.getInputFormat(),
+              storageFormat.getOutputFormat(), storageFormat.getSerde());
+      rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(),
+              createVwDesc), conf));
+
+      addDbAndTabToOutputs(qualTabName, TableType.VIRTUAL_VIEW);
+      queryState.setCommandType(HiveOperation.CREATEVIEW);
+    }
+
+    if (isRebuild) {
+      // We need to go lookup the table and get the select statement and then parse it.
+      try {
+        Table tab = db.getTable(qualTabName[0], qualTabName[1]);
+        String viewText = tab.getViewOriginalText();
+        ParseDriver pd = new ParseDriver();
+        ASTNode tree = pd.parse(viewText, ctx, false);
+        selectStmt = ParseUtils.findRootNonNullToken(tree);
+      } catch (Exception e) {
+        throw new SemanticException(e);
+      }
+    }
+
     return selectStmt;
   }
 
@@ -11874,7 +11923,7 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
   // validate the create view statement
   // the statement could be CREATE VIEW, REPLACE VIEW, or ALTER VIEW AS SELECT
   // check semantic conditions
-  private void validateCreateView(CreateViewDesc createVwDesc)
+  private void validateCreateView()
     throws SemanticException {
     try {
       Table oldView = getTable(createVwDesc.getViewName(), false);
@@ -11903,8 +11952,21 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
       //replace view
       if (createVwDesc.getOrReplace() && oldView != null) {
 
+        // Don't allow swapping between virtual and materialized view in replace
+        if (oldView.getTableType().equals(TableType.VIRTUAL_VIEW) && createVwDesc.isMaterialized()) {
+          throw new SemanticException(ErrorMsg.REPLACE_VIEW_WITH_MATERIALIZED,
+              oldView.getTableName());
+        }
+
+        if (oldView.getTableType().equals(TableType.MATERIALIZED_VIEW) &&
+            !createVwDesc.isMaterialized()) {
+          throw new SemanticException(ErrorMsg.REPLACE_MATERIALIZED_WITH_VIEW,
+              oldView.getTableName());
+        }
+
         // Existing table is not a view
-        if (!oldView.getTableType().equals(TableType.VIRTUAL_VIEW)) {
+        if (!oldView.getTableType().equals(TableType.VIRTUAL_VIEW) &&
+            !oldView.getTableType().equals(TableType.MATERIALIZED_VIEW)) {
           String tableNotViewErrorMsg =
             "The following is an existing table, not a view: " +
             createVwDesc.getViewName();
@@ -11912,26 +11974,28 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
             ErrorMsg.EXISTING_TABLE_IS_NOT_VIEW.getMsg(tableNotViewErrorMsg));
         }
 
-        // if old view has partitions, it could not be replaced
-        String partitionViewErrorMsg =
-          "The following view has partition, it could not be replaced: " +
-          createVwDesc.getViewName();
-        try {
-          if ((createVwDesc.getPartCols() == null ||
-            createVwDesc.getPartCols().isEmpty() ||
-            !createVwDesc.getPartCols().equals(oldView.getPartCols())) &&
-            !oldView.getPartCols().isEmpty() &&
-            !db.getPartitions(oldView).isEmpty()) {
+        if (!createVwDesc.isMaterialized()) {
+          // if old view has partitions, it could not be replaced
+          String partitionViewErrorMsg =
+              "The following view has partition, it could not be replaced: " +
+                  createVwDesc.getViewName();
+          try {
+            if ((createVwDesc.getPartCols() == null ||
+                createVwDesc.getPartCols().isEmpty() ||
+                !createVwDesc.getPartCols().equals(oldView.getPartCols())) &&
+                !oldView.getPartCols().isEmpty() &&
+                !db.getPartitions(oldView).isEmpty()) {
+              throw new SemanticException(
+                  ErrorMsg.REPLACE_VIEW_WITH_PARTITION.getMsg(partitionViewErrorMsg));
+            }
+          } catch (HiveException e) {
             throw new SemanticException(
-              ErrorMsg.REPLACE_VIEW_WITH_PARTITION.getMsg(partitionViewErrorMsg));
+                ErrorMsg.REPLACE_VIEW_WITH_PARTITION.getMsg(partitionViewErrorMsg));
           }
-        } catch (HiveException e) {
-          throw new SemanticException(
-            ErrorMsg.REPLACE_VIEW_WITH_PARTITION.getMsg(partitionViewErrorMsg));
         }
       }
     } catch (HiveException e) {
-      throw new SemanticException(e.getMessage());
+      throw new SemanticException(e.getMessage(), e);
     }
   }
 
@@ -13040,6 +13104,7 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
       queryProperties.setHasOuterOrderBy(!qb.getParseInfo().getIsSubQ() &&
               !qb.getParseInfo().getDestToOrderBy().isEmpty());
       queryProperties.setOuterQueryLimit(qb.getParseInfo().getOuterQueryLimit());
+      queryProperties.setMaterializedView(qb.getViewDesc() != null);
     }
   }
   private void warn(String msg) {

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/java/org/apache/hadoop/hive/ql/parse/StorageFormat.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/StorageFormat.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/StorageFormat.java
index 48aca4d..d3b955c 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/StorageFormat.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/StorageFormat.java
@@ -104,13 +104,22 @@ public class StorageFormat {
     }
   }
 
-  protected void fillDefaultStorageFormat(boolean isExternal) throws SemanticException {
+  protected void fillDefaultStorageFormat(boolean isExternal, boolean isMaterializedView)
+      throws  SemanticException {
     if ((inputFormat == null) && (storageHandler == null)) {
-      String defaultFormat = HiveConf.getVar(conf, HiveConf.ConfVars.HIVEDEFAULTFILEFORMAT);
-      String defaultManagedFormat = HiveConf.getVar(conf, HiveConf.ConfVars.HIVEDEFAULTMANAGEDFILEFORMAT);
+      String defaultFormat;
+      String defaultManagedFormat;
+      if (isMaterializedView) {
+        defaultFormat = defaultManagedFormat =
+            HiveConf.getVar(conf, HiveConf.ConfVars.HIVEMATERIALIZEDVIEWFILEFORMAT);
+        serde = HiveConf.getVar(conf, HiveConf.ConfVars.HIVEMATERIALIZEDVIEWSERDE);
+      } else {
+        defaultFormat = HiveConf.getVar(conf, HiveConf.ConfVars.HIVEDEFAULTFILEFORMAT);
+        defaultManagedFormat = HiveConf.getVar(conf, HiveConf.ConfVars.HIVEDEFAULTMANAGEDFILEFORMAT);
+      }
 
       if (!isExternal && !"none".equals(defaultManagedFormat)) {
-	defaultFormat = defaultManagedFormat;
+        defaultFormat = defaultManagedFormat;
       }
 
       if (StringUtils.isBlank(defaultFormat)) {

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/java/org/apache/hadoop/hive/ql/parse/TaskCompiler.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/TaskCompiler.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/TaskCompiler.java
index fb2b992..f781390 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/TaskCompiler.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/TaskCompiler.java
@@ -59,6 +59,7 @@ import org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer.AnalyzeRewriteContex
 import org.apache.hadoop.hive.ql.plan.ColumnStatsDesc;
 import org.apache.hadoop.hive.ql.plan.ColumnStatsWork;
 import org.apache.hadoop.hive.ql.plan.CreateTableDesc;
+import org.apache.hadoop.hive.ql.plan.CreateViewDesc;
 import org.apache.hadoop.hive.ql.plan.DDLWork;
 import org.apache.hadoop.hive.ql.plan.FetchWork;
 import org.apache.hadoop.hive.ql.plan.LoadFileDesc;
@@ -76,8 +77,6 @@ import org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe;
 import org.apache.hadoop.hive.serde2.thrift.ThriftFormatter;
 import org.apache.hadoop.hive.serde2.thrift.ThriftJDBCBinarySerDe;
 
-import akka.util.Collections;
-
 import com.google.common.collect.Interner;
 import com.google.common.collect.Interners;
 
@@ -226,18 +225,25 @@ public abstract class TaskCompiler {
 
       boolean oneLoadFile = true;
       for (LoadFileDesc lfd : loadFileWork) {
-        if (pCtx.getQueryProperties().isCTAS()) {
+        if (pCtx.getQueryProperties().isCTAS() || pCtx.getQueryProperties().isMaterializedView()) {
           assert (oneLoadFile); // should not have more than 1 load file for
           // CTAS
           // make the movetask's destination directory the table's destination.
           Path location;
-          String loc = pCtx.getCreateTable().getLocation();
+          String loc = pCtx.getQueryProperties().isCTAS() ?
+                  pCtx.getCreateTable().getLocation() : null;
           if (loc == null) {
             // get the table's default location
+            // Always use default location for materialized view
             Path targetPath;
             try {
-              String[] names = Utilities.getDbTableName(
-                      pCtx.getCreateTable().getTableName());
+              String protoName = null;
+              if (pCtx.getQueryProperties().isCTAS()) {
+                protoName = pCtx.getCreateTable().getTableName();
+              } else if (pCtx.getQueryProperties().isMaterializedView()) {
+                protoName = pCtx.getCreateViewDesc().getViewName();
+              }
+              String[] names = Utilities.getDbTableName(protoName);
               if (!db.databaseExists(names[0])) {
                 throw new SemanticException("ERROR: The database " + names[0]
                     + " does not exist.");
@@ -314,41 +320,15 @@ public abstract class TaskCompiler {
 
       crtTblDesc.validate(conf);
 
-      // clear the mapredWork output file from outputs for CTAS
-      // DDLWork at the tail of the chain will have the output
-      Iterator<WriteEntity> outIter = outputs.iterator();
-      while (outIter.hasNext()) {
-        switch (outIter.next().getType()) {
-        case DFS_DIR:
-        case LOCAL_DIR:
-          outIter.remove();
-          break;
-        default:
-          break;
-        }
-      }
       Task<? extends Serializable> crtTblTask = TaskFactory.get(new DDLWork(
           inputs, outputs, crtTblDesc), conf);
-
-      // find all leaf tasks and make the DDLTask as a dependent task of all of
-      // them
-      HashSet<Task<? extends Serializable>> leaves = new LinkedHashSet<Task<? extends Serializable>>();
-      getLeafTasks(rootTasks, leaves);
-      assert (leaves.size() > 0);
-      for (Task<? extends Serializable> task : leaves) {
-        if (task instanceof StatsTask) {
-          // StatsTask require table to already exist
-          for (Task<? extends Serializable> parentOfStatsTask : task.getParentTasks()) {
-            parentOfStatsTask.addDependentTask(crtTblTask);
-          }
-          for (Task<? extends Serializable> parentOfCrtTblTask : crtTblTask.getParentTasks()) {
-            parentOfCrtTblTask.removeDependentTask(task);
-          }
-          crtTblTask.addDependentTask(task);
-        } else {
-          task.addDependentTask(crtTblTask);
-        }
-      }
+      patchUpAfterCTASorMaterializedView(rootTasks, outputs, crtTblTask);
+    } else if (pCtx.getQueryProperties().isMaterializedView()) {
+      // generate a DDL task and make it a dependent task of the leaf
+      CreateViewDesc viewDesc = pCtx.getCreateViewDesc();
+      Task<? extends Serializable> crtViewTask = TaskFactory.get(new DDLWork(
+          inputs, outputs, viewDesc), conf);
+      patchUpAfterCTASorMaterializedView(rootTasks, outputs, crtViewTask);
     }
 
     if (globalLimitCtx.isEnable() && pCtx.getFetchTask() != null) {
@@ -376,6 +356,44 @@ public abstract class TaskCompiler {
     }
   }
 
+  private void patchUpAfterCTASorMaterializedView(final List<Task<? extends Serializable>>  rootTasks,
+                                                  final HashSet<WriteEntity> outputs,
+                                                  Task<? extends Serializable> createTask) {
+    // clear the mapredWork output file from outputs for CTAS
+    // DDLWork at the tail of the chain will have the output
+    Iterator<WriteEntity> outIter = outputs.iterator();
+    while (outIter.hasNext()) {
+      switch (outIter.next().getType()) {
+      case DFS_DIR:
+      case LOCAL_DIR:
+        outIter.remove();
+        break;
+      default:
+        break;
+      }
+    }
+
+    // find all leaf tasks and make the DDLTask as a dependent task of all of
+    // them
+    HashSet<Task<? extends Serializable>> leaves =
+        new LinkedHashSet<Task<? extends Serializable>>();
+    getLeafTasks(rootTasks, leaves);
+    assert (leaves.size() > 0);
+    for (Task<? extends Serializable> task : leaves) {
+      if (task instanceof StatsTask) {
+        // StatsTask require table to already exist
+        for (Task<? extends Serializable> parentOfStatsTask : task.getParentTasks()) {
+          parentOfStatsTask.addDependentTask(createTask);
+        }
+        for (Task<? extends Serializable> parentOfCrtTblTask : createTask.getParentTasks()) {
+          parentOfCrtTblTask.removeDependentTask(task);
+        }
+        createTask.addDependentTask(task);
+      } else {
+        task.addDependentTask(createTask);
+      }
+    }
+  }
 
   /**
    * A helper function to generate a column stats task on top of map-red task. The column stats
@@ -385,7 +403,11 @@ public abstract class TaskCompiler {
    * This method generates a plan with a column stats task on top of map-red task and sets up the
    * appropriate metadata to be used during execution.
    *
-   * @param qb
+   * @param analyzeRewrite
+   * @param loadTableWork
+   * @param loadFileWork
+   * @param rootTasks
+   * @param outerQueryLimit
    */
   @SuppressWarnings("unchecked")
   protected void genColumnStatsTask(AnalyzeRewriteContext analyzeRewrite,
@@ -494,7 +516,8 @@ public abstract class TaskCompiler {
         pCtx.getNameToSplitSample(), pCtx.getSemanticInputs(), rootTasks,
         pCtx.getOpToPartToSkewedPruner(), pCtx.getViewAliasToInput(),
         pCtx.getReduceSinkOperatorsAddedByEnforceBucketingSorting(),
-        pCtx.getAnalyzeRewrite(), pCtx.getCreateTable(), pCtx.getQueryProperties(), pCtx.getViewProjectToTableSchema(),
+        pCtx.getAnalyzeRewrite(), pCtx.getCreateTable(), pCtx.getCreateViewDesc(),
+        pCtx.getQueryProperties(), pCtx.getViewProjectToTableSchema(),
         pCtx.getAcidSinks());
     clone.setFetchTask(pCtx.getFetchTask());
     clone.setLineageInfo(pCtx.getLineageInfo());

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/java/org/apache/hadoop/hive/ql/parse/UpdateDeleteSemanticAnalyzer.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/UpdateDeleteSemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/UpdateDeleteSemanticAnalyzer.java
index 34d83ef..5b874e4 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/UpdateDeleteSemanticAnalyzer.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/UpdateDeleteSemanticAnalyzer.java
@@ -26,6 +26,7 @@ import java.util.Map;
 import java.util.Set;
 
 import org.apache.hadoop.hive.conf.HiveConf;
+import org.apache.hadoop.hive.metastore.TableType;
 import org.apache.hadoop.hive.metastore.api.FieldSchema;
 import org.apache.hadoop.hive.ql.Context;
 import org.apache.hadoop.hive.ql.ErrorMsg;
@@ -141,6 +142,12 @@ public class UpdateDeleteSemanticAnalyzer extends SemanticAnalyzer {
       throw new SemanticException(e.getMessage(), e);
     }
 
+    if (mTable.getTableType() == TableType.VIRTUAL_VIEW ||
+        mTable.getTableType() == TableType.MATERIALIZED_VIEW) {
+      LOG.error("Table " + getDotName(tableName) + " is a view or materialized view");
+      throw new SemanticException(ErrorMsg.UPDATE_DELETE_VIEW.getMsg());
+    }
+
     List<FieldSchema> partCols = mTable.getPartCols();
     List<String> bucketingCols = mTable.getBucketCols();
 

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/java/org/apache/hadoop/hive/ql/plan/CreateViewDesc.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/CreateViewDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/CreateViewDesc.java
index 81c4f77..3ddbb1f 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/plan/CreateViewDesc.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/CreateViewDesc.java
@@ -48,6 +48,8 @@ public class CreateViewDesc extends DDLDesc implements Serializable {
   private boolean ifNotExists;
   private boolean orReplace;
   private boolean isAlterViewAs;
+  private boolean isMaterialized;
+  private String serde; // only used for materialized views
 
   /**
    * For serialization only.
@@ -55,6 +57,17 @@ public class CreateViewDesc extends DDLDesc implements Serializable {
   public CreateViewDesc() {
   }
 
+  /**
+   * Used to create a virtual view descriptor.
+   * @param viewName
+   * @param schema
+   * @param comment
+   * @param tblProps
+   * @param partColNames
+   * @param ifNotExists
+   * @param orReplace
+   * @param isAlterViewAs
+   */
   public CreateViewDesc(String viewName, List<FieldSchema> schema,
       String comment, String inputFormat,
       String outputFormat, Map<String, String> tblProps,
@@ -70,6 +83,39 @@ public class CreateViewDesc extends DDLDesc implements Serializable {
     this.ifNotExists = ifNotExists;
     this.orReplace = orReplace;
     this.isAlterViewAs = isAlterViewAs;
+    this.isMaterialized = false;
+  }
+
+  /**
+   * Used to create a materialized view descriptor
+   * @param viewName
+   * @param schema
+   * @param comment
+   * @param tblProps
+   * @param partColNames
+   * @param ifNotExists
+   * @param orReplace
+   * @param isAlterViewAs
+   * @param inputFormat
+   * @param outputFormat
+   * @param serde
+   */
+  public CreateViewDesc(String viewName, List<FieldSchema> schema, String comment,
+                        Map<String, String> tblProps, List<String> partColNames,
+                        boolean ifNotExists, boolean orReplace, boolean isAlterViewAs,
+                        String inputFormat, String outputFormat, String serde) {
+    this.viewName = viewName;
+    this.schema = schema;
+    this.tblProps = tblProps;
+    this.partColNames = partColNames;
+    this.comment = comment;
+    this.ifNotExists = ifNotExists;
+    this.orReplace = orReplace;
+    this.isAlterViewAs = isAlterViewAs;
+    this.isMaterialized = true;
+    this.inputFormat = inputFormat;
+    this.outputFormat = outputFormat;
+    this.serde = serde;
   }
 
   @Explain(displayName = "name", explainLevels = { Level.USER, Level.DEFAULT, Level.EXTENDED })
@@ -194,4 +240,12 @@ public class CreateViewDesc extends DDLDesc implements Serializable {
     this.outputFormat = outputFormat;
   }
 
+  public boolean isMaterialized() {
+    return isMaterialized;
+  }
+
+  public String getSerde() {
+    return serde;
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/java/org/apache/hadoop/hive/ql/plan/HiveOperation.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/HiveOperation.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/HiveOperation.java
index d2746ae..d5b1c9d 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/plan/HiveOperation.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/HiveOperation.java
@@ -78,6 +78,8 @@ public enum HiveOperation {
   CREATEMACRO("CREATEMACRO", null, null),
   DROPMACRO("DROPMACRO", null, null),
   CREATEVIEW("CREATEVIEW", new Privilege[]{Privilege.SELECT}, new Privilege[]{Privilege.CREATE}),
+  CREATE_MATERIALIZED_VIEW("CREATEVIEW", new Privilege[]{Privilege.SELECT}, new
+      Privilege[]{Privilege.CREATE}),
   DROPVIEW("DROPVIEW", null, new Privilege[]{Privilege.DROP}),
   CREATEINDEX("CREATEINDEX", null, null),
   DROPINDEX("DROPINDEX", null, null),

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/java/org/apache/hadoop/hive/ql/plan/LoadFileDesc.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/LoadFileDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/LoadFileDesc.java
index df153a2..9a868a0 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/plan/LoadFileDesc.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/LoadFileDesc.java
@@ -39,15 +39,19 @@ public class LoadFileDesc extends LoadDesc implements Serializable {
   public LoadFileDesc() {
   }
 
-  public LoadFileDesc(final CreateTableDesc createTableDesc, final Path sourcePath,
-      final Path targetDir,
-      final boolean isDfsDir, final String columns, final String columnTypes) {
+  public LoadFileDesc(final CreateTableDesc createTableDesc, final CreateViewDesc  createViewDesc,
+                      final Path sourcePath, final Path targetDir, final boolean isDfsDir,
+                      final String columns, final String columnTypes) {
     this(sourcePath, targetDir, isDfsDir, columns, columnTypes);
     if (createTableDesc != null && createTableDesc.getDatabaseName() != null
         && createTableDesc.getTableName() != null) {
       destinationCreateTable = (createTableDesc.getTableName().contains(".") ? "" : createTableDesc
           .getDatabaseName() + ".")
           + createTableDesc.getTableName();
+    } else if (createViewDesc != null) {
+      // The work is already done in analyzeCreateView to assure that the view name is fully
+      // qualified.
+      destinationCreateTable = createViewDesc.getViewName();
     }
   }
 

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/java/org/apache/hadoop/hive/ql/plan/PlanUtils.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/PlanUtils.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/PlanUtils.java
index 5dc3aa6..b15ad34 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/plan/PlanUtils.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/PlanUtils.java
@@ -380,6 +380,47 @@ public final class PlanUtils {
     return ret;
   }
 
+ /**
+   * Generate a table descriptor from a createViewDesc.
+   */
+  public static TableDesc getTableDesc(CreateViewDesc crtViewDesc, String cols, String colTypes) {
+    TableDesc ret;
+
+    try {
+      Class serdeClass = JavaUtils.loadClass(crtViewDesc.getSerde());
+      ret = getTableDesc(serdeClass, new String(LazySerDeParameters.DefaultSeparators), cols,
+          colTypes, false,  false);
+
+      // set other table properties
+      /*
+      TODO - I don't think I need any of this
+      Properties properties = ret.getProperties();
+
+      if (crtTblDesc.getTableName() != null && crtTblDesc.getDatabaseName() != null) {
+        properties.setProperty(org.apache.hadoop.hive.metastore.api.hive_metastoreConstants.META_TABLE_NAME,
+            crtTblDesc.getTableName());
+      }
+
+      if (crtTblDesc.getTblProps() != null) {
+        properties.putAll(crtTblDesc.getTblProps());
+      }
+       */
+
+      // replace the default input & output file format with those found in
+      // crtTblDesc
+      Class<? extends InputFormat> inClass =
+          (Class<? extends InputFormat>)JavaUtils.loadClass(crtViewDesc.getInputFormat());
+      Class<? extends HiveOutputFormat> outClass =
+          (Class<? extends HiveOutputFormat>)JavaUtils.loadClass(crtViewDesc.getOutputFormat());
+
+      ret.setInputFileFormatClass(inClass);
+      ret.setOutputFileFormatClass(outClass);
+    } catch (ClassNotFoundException e) {
+      throw new RuntimeException("Unable to find class in getTableDesc: " + e.getMessage(), e);
+    }
+    return ret;
+  }
+
   /**
    * Generate the table descriptor of MetadataTypedColumnsetSerDe with the
    * separatorCode. MetaDataTypedColumnsetSerDe is used because LazySimpleSerDe

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/HiveOperationType.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/HiveOperationType.java b/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/HiveOperationType.java
index c507f67..884b129 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/HiveOperationType.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/HiveOperationType.java
@@ -82,6 +82,7 @@ public enum HiveOperationType {
   CREATEMACRO,
   DROPMACRO,
   CREATEVIEW,
+  CREATE_MATERIALIZED_VIEW,
   DROPVIEW,
   CREATEINDEX,
   DROPINDEX,

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/sqlstd/Operation2Privilege.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/sqlstd/Operation2Privilege.java b/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/sqlstd/Operation2Privilege.java
index bbe28ab..ddf1e66 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/sqlstd/Operation2Privilege.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/sqlstd/Operation2Privilege.java
@@ -332,6 +332,10 @@ public class Operation2Privilege {
         new PrivRequirement(SEL_GRANT_AR, IOType.INPUT),
         new PrivRequirement(OWNER_PRIV_AR, HivePrivilegeObjectType.DATABASE)));
 
+    op2Priv.put(HiveOperationType.CREATE_MATERIALIZED_VIEW, PrivRequirement.newPrivRequirementList(
+        new PrivRequirement(SEL_GRANT_AR, IOType.INPUT),
+        new PrivRequirement(OWNER_PRIV_AR, HivePrivilegeObjectType.DATABASE)));
+
     op2Priv.put(HiveOperationType.SHOWFUNCTIONS, PrivRequirement.newIOPrivRequirement
 (null, null));
     op2Priv.put(HiveOperationType.SHOWINDEXES, PrivRequirement.newIOPrivRequirement

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/queries/clientnegative/materialized_view_authorization_create_no_grant.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientnegative/materialized_view_authorization_create_no_grant.q b/ql/src/test/queries/clientnegative/materialized_view_authorization_create_no_grant.q
new file mode 100644
index 0000000..079baff
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/materialized_view_authorization_create_no_grant.q
@@ -0,0 +1,15 @@
+set hive.test.authz.sstd.hs2.mode=true;
+set hive.security.authorization.manager=org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactoryForTest;
+set hive.security.authenticator.manager=org.apache.hadoop.hive.ql.security.SessionStateConfigUserAuthenticator;
+set hive.security.authorization.enabled=true;
+set user.name=user1;
+
+create table amvcng_gtable (a int, b varchar(256), c decimal(10,2));
+
+insert into amvcng_gtable values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8);
+
+grant select on table amvcng_gtable to user user2;
+
+set user.name=user2;
+
+create materialized view amvcng_gmat_view as select a, c from amvcng_gtable;

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/queries/clientnegative/materialized_view_authorization_create_no_select_perm.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientnegative/materialized_view_authorization_create_no_select_perm.q b/ql/src/test/queries/clientnegative/materialized_view_authorization_create_no_select_perm.q
new file mode 100644
index 0000000..4de525c
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/materialized_view_authorization_create_no_select_perm.q
@@ -0,0 +1,14 @@
+set hive.test.authz.sstd.hs2.mode=true;
+set hive.security.authorization.manager=org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactoryForTest;
+set hive.security.authenticator.manager=org.apache.hadoop.hive.ql.security.SessionStateConfigUserAuthenticator;
+set hive.security.authorization.enabled=true;
+set user.name=user1;
+
+create table amvnsp_table (a int, b varchar(256), c decimal(10,2));
+
+insert into amvnsp_table values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8);
+
+
+set user.name=user2;
+
+create materialized view amvnsp_mat_view as select a, c from amvnsp_table;

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/queries/clientnegative/materialized_view_authorization_drop_other.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientnegative/materialized_view_authorization_drop_other.q b/ql/src/test/queries/clientnegative/materialized_view_authorization_drop_other.q
new file mode 100644
index 0000000..c9a5930
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/materialized_view_authorization_drop_other.q
@@ -0,0 +1,14 @@
+set hive.test.authz.sstd.hs2.mode=true;
+set hive.security.authorization.manager=org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactoryForTest;
+set hive.security.authenticator.manager=org.apache.hadoop.hive.ql.security.SessionStateConfigUserAuthenticator;
+set hive.security.authorization.enabled=true;
+set user.name=user1;
+
+create table amvdo_table (a int, b varchar(256), c decimal(10,2));
+
+insert into amvdo_table values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8);
+
+create materialized view amvdo_mat_view as select a, c from amvdo_table;
+
+set user.name=user2;
+drop materialized view amvdo_mat_view;

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/queries/clientnegative/materialized_view_authorization_no_select_perm.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientnegative/materialized_view_authorization_no_select_perm.q b/ql/src/test/queries/clientnegative/materialized_view_authorization_no_select_perm.q
new file mode 100644
index 0000000..8428152
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/materialized_view_authorization_no_select_perm.q
@@ -0,0 +1,14 @@
+set hive.test.authz.sstd.hs2.mode=true;
+set hive.security.authorization.manager=org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactoryForTest;
+set hive.security.authenticator.manager=org.apache.hadoop.hive.ql.security.SessionStateConfigUserAuthenticator;
+set hive.security.authorization.enabled=true;
+set user.name=user1;
+
+create table amvnsp_table (a int, b varchar(256), c decimal(10,2));
+
+insert into amvnsp_table values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8);
+
+create materialized view amvnsp_mat_view as select a, c from amvnsp_table;
+
+set user.name=user2;
+select * from amvnsp_mat_view;

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/queries/clientnegative/materialized_view_authorization_rebuild_no_grant.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientnegative/materialized_view_authorization_rebuild_no_grant.q b/ql/src/test/queries/clientnegative/materialized_view_authorization_rebuild_no_grant.q
new file mode 100644
index 0000000..a2e7d38
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/materialized_view_authorization_rebuild_no_grant.q
@@ -0,0 +1,20 @@
+set hive.test.authz.sstd.hs2.mode=true;
+set hive.security.authorization.manager=org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactoryForTest;
+set hive.security.authenticator.manager=org.apache.hadoop.hive.ql.security.SessionStateConfigUserAuthenticator;
+set hive.security.authorization.enabled=true;
+set user.name=user1;
+
+create table amvrng_table (a int, b varchar(256), c decimal(10,2));
+
+insert into amvrng_table values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8);
+
+grant select on table amvrng_table to user user2 with grant option;
+
+set user.name=user2;
+create materialized view amvrng_mat_view as select a, c from amvrng_table;
+
+set user.name=user1;
+revoke grant option for select on table amvrng_table from user user2;
+
+set user.name=user2;
+alter materialized view amvrng_mat_view rebuild;

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/queries/clientnegative/materialized_view_authorization_rebuild_other.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientnegative/materialized_view_authorization_rebuild_other.q b/ql/src/test/queries/clientnegative/materialized_view_authorization_rebuild_other.q
new file mode 100644
index 0000000..7c2d145
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/materialized_view_authorization_rebuild_other.q
@@ -0,0 +1,14 @@
+set hive.test.authz.sstd.hs2.mode=true;
+set hive.security.authorization.manager=org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactoryForTest;
+set hive.security.authenticator.manager=org.apache.hadoop.hive.ql.security.SessionStateConfigUserAuthenticator;
+set hive.security.authorization.enabled=true;
+set user.name=user1;
+
+create table amvro_table (a int, b varchar(256), c decimal(10,2));
+
+insert into amvro_table values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8);
+
+create materialized view amvro_mat_view as select a, c from amvro_table;
+
+set user.name=user2;
+alter materialized view amvro_mat_view rebuild;

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/queries/clientnegative/materialized_view_delete.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientnegative/materialized_view_delete.q b/ql/src/test/queries/clientnegative/materialized_view_delete.q
new file mode 100644
index 0000000..f557df9
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/materialized_view_delete.q
@@ -0,0 +1,10 @@
+set hive.support.concurrency=true;
+set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
+set hive.enforce.bucketing=true;
+
+create table dmv_basetable (a int, b varchar(256), c decimal(10,2));
+
+
+create materialized view dmv_mat_view as select a, b, c from dmv_basetable;
+
+delete from dmv_mat_view where b = 'fred';

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/queries/clientnegative/materialized_view_insert.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientnegative/materialized_view_insert.q b/ql/src/test/queries/clientnegative/materialized_view_insert.q
new file mode 100644
index 0000000..2daae52
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/materialized_view_insert.q
@@ -0,0 +1,6 @@
+create table imv_basetable (a int, b varchar(256), c decimal(10,2));
+
+
+create materialized view imv_mat_view as select a, b, c from imv_basetable;
+
+insert into imv_mat_view values (1, 'fred', 3.14);

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/queries/clientnegative/materialized_view_load.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientnegative/materialized_view_load.q b/ql/src/test/queries/clientnegative/materialized_view_load.q
new file mode 100644
index 0000000..a8d0dfd
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/materialized_view_load.q
@@ -0,0 +1,7 @@
+create table lmv_basetable (a int, b varchar(256), c decimal(10,2));
+
+
+create materialized view lmv_mat_view as select a, b, c from lmv_basetable;
+
+LOAD DATA LOCAL INPATH '../../data/files/kv1.txt' INTO TABLE lmv_mat_view;
+

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/queries/clientnegative/materialized_view_replace_with_view.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientnegative/materialized_view_replace_with_view.q b/ql/src/test/queries/clientnegative/materialized_view_replace_with_view.q
new file mode 100644
index 0000000..7c972f5
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/materialized_view_replace_with_view.q
@@ -0,0 +1,8 @@
+create table rmvwv_basetable (a int, b varchar(256), c decimal(10,2));
+
+insert into rmvwv_basetable values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8);
+
+create materialized view rmvwv_mat_view as select a, b, c from rmvwv_basetable;
+
+create or replace view rmvwv_mat_view as select a, c from rmvwv_basetable;
+

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/queries/clientnegative/materialized_view_update.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientnegative/materialized_view_update.q b/ql/src/test/queries/clientnegative/materialized_view_update.q
new file mode 100644
index 0000000..8245ef0
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/materialized_view_update.q
@@ -0,0 +1,10 @@
+set hive.support.concurrency=true;
+set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
+set hive.enforce.bucketing=true;
+
+create table umv_basetable (a int, b varchar(256), c decimal(10,2));
+
+
+create materialized view umv_mat_view as select a, b, c from umv_basetable;
+
+update umv_mat_view set b = 'joe' where b = 'fred';

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/queries/clientnegative/view_delete.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientnegative/view_delete.q b/ql/src/test/queries/clientnegative/view_delete.q
new file mode 100644
index 0000000..c9dc985
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/view_delete.q
@@ -0,0 +1,10 @@
+set hive.support.concurrency=true;
+set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
+set hive.enforce.bucketing=true;
+
+create table dv_basetable (a int, b varchar(256), c decimal(10,2));
+
+
+create view dv_view as select a, b, c from dv_basetable;
+
+delete from dv_view where b = 'fred';

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/queries/clientnegative/view_update.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientnegative/view_update.q b/ql/src/test/queries/clientnegative/view_update.q
new file mode 100644
index 0000000..3a54ccb
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/view_update.q
@@ -0,0 +1,10 @@
+set hive.support.concurrency=true;
+set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
+set hive.enforce.bucketing=true;
+
+create table uv_basetable (a int, b varchar(256), c decimal(10,2));
+
+
+create view uv_view as select a, b, c from uv_basetable;
+
+update uv_view set b = 'joe' where b = 'fred';

http://git-wip-us.apache.org/repos/asf/hive/blob/438109cb/ql/src/test/queries/clientpositive/authorization_view_sqlstd.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/authorization_view_sqlstd.q b/ql/src/test/queries/clientpositive/authorization_view_sqlstd.q
deleted file mode 100644
index 14044bf..0000000
--- a/ql/src/test/queries/clientpositive/authorization_view_sqlstd.q
+++ /dev/null
@@ -1,86 +0,0 @@
-set hive.test.authz.sstd.hs2.mode=true;
-set hive.security.authorization.manager=org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactoryForTest;
-set hive.security.authenticator.manager=org.apache.hadoop.hive.ql.security.SessionStateConfigUserAuthenticator;
-set hive.security.authorization.enabled=true;
-set user.name=user1;
-
--- Test view authorization , and 'show grant' variants
-
-create table t1(i int, j int, k int);
-show grant user user1 on table t1;
-
--- protecting certain columns
-create view vt1 as select i,k from t1;
-
--- protecting certain rows
-create view vt2 as select * from t1 where i > 1;
-
-show grant user user1 on all;
-
---view grant to user
--- try with and without table keyword
-
-grant select on vt1 to user user2;
-grant insert on table vt1 to user user3;
-
-set user.name=user2;
-show grant user user2 on table vt1;
-set user.name=user3;
-show grant user user3 on table vt1;
-
-
-set user.name=user2;
-
-explain authorization select * from vt1;
-select * from vt1;
-
--- verify input objects required does not include table
--- even if view is within a sub query
-select * from (select * from vt1) a;
-
-select * from vt1 union all select * from vt1;
-
-set user.name=user1;
-
-grant all on table vt2 to user user2;
-
-set user.name=user2;
-show grant user user2 on table vt2;
-show grant user user2 on all;
-set user.name=user1;
-
-revoke all on vt2 from user user2;
-
-set user.name=user2;
-show grant user user2 on table vt2;
-
-
-set user.name=hive_admin_user;
-set role admin;
-show grant on table vt2;
-
-set user.name=user1;
-revoke select on table vt1 from user user2;
-
-set user.name=user2;
-show grant user user2 on table vt1;
-show grant user user2 on all;
-
-set user.name=user3;
--- grant privileges on roles for view, after next statement
-show grant user user3 on table vt1;
-
-set user.name=hive_admin_user;
-show current roles;
-set role ADMIN;
-create role role_v;
-grant  role_v to user user4 ;
-show role grant user user4;
-show roles;
-
-grant all on table vt2 to role role_v;
-show grant role role_v on table vt2;
-
-revoke delete on table vt2 from role role_v;
-show grant role role_v on table vt2;
-show grant on table vt2;


[2/4] hive git commit: HIVE-14249: Add simple materialized views with manual rebuilds (2) (Jesus Camacho Rodriguez, reviewed by Alan Gates)

Posted by jc...@apache.org.
HIVE-14249: Add simple materialized views with manual rebuilds (2) (Jesus Camacho Rodriguez, reviewed by Alan Gates)

Close apache/hive#91


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/5179558c
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/5179558c
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/5179558c

Branch: refs/heads/master
Commit: 5179558cc22649a30f127fe7ba2c5ede29af8241
Parents: 438109c
Author: Jesus Camacho Rodriguez <jc...@apache.org>
Authored: Wed Jul 20 12:38:09 2016 +0100
Committer: Jesus Camacho Rodriguez <jc...@apache.org>
Committed: Thu Sep 15 15:14:44 2016 +0100

----------------------------------------------------------------------
 .../org/apache/hadoop/hive/conf/HiveConf.java   |   4 +-
 .../hadoop/hive/metastore/MetaStoreUtils.java   |   7 +
 .../org/apache/hadoop/hive/ql/ErrorMsg.java     |   1 +
 .../org/apache/hadoop/hive/ql/exec/DDLTask.java |  29 +-
 .../hive/ql/parse/BaseSemanticAnalyzer.java     |  16 +-
 .../hadoop/hive/ql/parse/CalcitePlanner.java    |  63 +++-
 .../hive/ql/parse/DDLSemanticAnalyzer.java      |  14 +-
 .../apache/hadoop/hive/ql/parse/HiveParser.g    |  12 +-
 .../hive/ql/parse/ImportSemanticAnalyzer.java   |   2 +-
 .../hadoop/hive/ql/parse/SemanticAnalyzer.java  |  86 ++---
 .../hive/ql/parse/SemanticAnalyzerFactory.java  |   3 +
 .../hadoop/hive/ql/parse/TaskCompiler.java      |   5 +-
 .../hadoop/hive/ql/plan/CreateViewDesc.java     |  53 ++-
 .../hadoop/hive/ql/plan/DropTableDesc.java      |  27 +-
 .../hadoop/hive/ql/plan/HiveOperation.java      |   3 +-
 .../AuthorizationPreEventListener.java          |   2 +
 .../authorization/plugin/HiveOperationType.java |   1 +
 .../plugin/sqlstd/Operation2Privilege.java      |   2 +
 ...alized_view_authorization_rebuild_no_grant.q |  20 --
 ...erialized_view_authorization_rebuild_other.q |  14 -
 .../clientnegative/materialized_view_drop.q     |   9 +
 .../clientnegative/materialized_view_drop2.q    |   7 +
 .../test/queries/clientnegative/view_delete.q   |   1 -
 .../test/queries/clientnegative/view_update.q   |   1 -
 .../materialized_view_authorization_sqlstd.q    |   2 -
 .../clientpositive/materialized_view_describe.q |  58 ++++
 .../clientpositive/materialized_view_rebuild.q  |  13 -
 ...rialized_view_authorization_drop_other.q.out |   6 +-
 ...ized_view_authorization_no_select_perm.q.out |   4 +-
 ...ed_view_authorization_rebuild_no_grant.q.out |  42 ---
 ...lized_view_authorization_rebuild_other.q.out |  30 --
 .../materialized_view_delete.q.out              |   6 +-
 .../clientnegative/materialized_view_drop.q.out |  42 +++
 .../materialized_view_drop2.q.out               |  34 ++
 .../materialized_view_insert.q.out              |   4 +-
 .../clientnegative/materialized_view_load.q.out |   4 +-
 .../materialized_view_replace_with_view.q.out   |   6 +-
 .../materialized_view_update.q.out              |   6 +-
 .../results/clientnegative/view_delete.q.out    |   2 +-
 .../results/clientnegative/view_update.q.out    |   2 +-
 ...materialized_view_authorization_sqlstd.q.out |  34 +-
 .../materialized_view_create.q.out              |  53 ++-
 .../materialized_view_describe.q.out            | 335 +++++++++++++++++++
 .../clientpositive/materialized_view_drop.q.out |  14 +-
 .../materialized_view_rebuild.q.out             |  67 ----
 45 files changed, 769 insertions(+), 377 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
----------------------------------------------------------------------
diff --git a/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java b/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
index d68c4fb..301159e 100644
--- a/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
+++ b/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
@@ -1110,9 +1110,9 @@ public class HiveConf extends Configuration {
         "for all tables."),
     HIVEMATERIALIZEDVIEWFILEFORMAT("hive.materializedview.fileformat", "ORC",
         new StringSet("none", "TextFile", "SequenceFile", "RCfile", "ORC"),
-        "File format for CREATE MATERIALIZED VIEW statement."),
+        "Default file format for CREATE MATERIALIZED VIEW statement"),
     HIVEMATERIALIZEDVIEWSERDE("hive.materializedview.serde",
-        "org.apache.hadoop.hive.ql.io.orc.OrcSerde", "Serde used for materialized views"),
+        "org.apache.hadoop.hive.ql.io.orc.OrcSerde", "Default SerDe used for materialized views"),
     HIVEQUERYRESULTFILEFORMAT("hive.query.result.fileformat", "SequenceFile", new StringSet("TextFile", "SequenceFile", "RCfile", "Llap"),
         "Default file format for storing result of the query."),
     HIVECHECKFILEFORMAT("hive.fileformat.check", true, "Whether to check file format or not when loading data files"),

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreUtils.java
----------------------------------------------------------------------
diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreUtils.java b/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreUtils.java
index f632542..41385f7 100644
--- a/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreUtils.java
+++ b/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreUtils.java
@@ -1548,6 +1548,13 @@ public class MetaStoreUtils {
     return TableType.INDEX_TABLE.toString().equals(table.getTableType());
   }
 
+  public static boolean isMaterializedViewTable(Table table) {
+    if (table == null) {
+      return false;
+    }
+    return TableType.MATERIALIZED_VIEW.toString().equals(table.getTableType());
+  }
+
   /**
    * Given a map of partition column names to values, this creates a filter
    * string that can be used to call the *byFilter methods

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java b/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java
index af1583f..f308832 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java
@@ -453,6 +453,7 @@ public enum ErrorMsg {
   REPLACE_VIEW_WITH_MATERIALIZED(10400, "Attempt to replace view {0} with materialized view", true),
   REPLACE_MATERIALIZED_WITH_VIEW(10401, "Attempt to replace materialized view {0} with view", true),
   UPDATE_DELETE_VIEW(10402, "You cannot update or delete records in a view"),
+  MATERIALIZED_VIEW_DEF_EMPTY(10403, "Query for the materialized view rebuild could not be retrieved"),
   //========================== 20000 range starts here ========================//
   SCRIPT_INIT_ERROR(20000, "Unable to initialize custom script."),
   SCRIPT_IO_ERROR(20001, "An error occurred while reading or writing to your custom script. "

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
index 68d5fde..ec31cf4 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
@@ -3795,7 +3795,22 @@ public class DDLTask extends Task<DDLWork> implements Serializable {
           if (dropTbl.getIfExists()) {
             return;
           }
-          throw new HiveException("Cannot drop a view with DROP TABLE");
+          if (dropTbl.getExpectMaterializedView()) {
+            throw new HiveException("Cannot drop a view with DROP MATERIALIZED VIEW");
+          } else {
+            throw new HiveException("Cannot drop a view with DROP TABLE");
+          }
+        }
+      } else if (tbl.isMaterializedView()) {
+        if (!dropTbl.getExpectMaterializedView()) {
+          if (dropTbl.getIfExists()) {
+            return;
+          }
+          if (dropTbl.getExpectView()) {
+            throw new HiveException("Cannot drop a materialized view with DROP VIEW");
+          } else {
+            throw new HiveException("Cannot drop a materialized view with DROP TABLE");
+          }
         }
       } else {
         if (dropTbl.getExpectView()) {
@@ -3804,6 +3819,12 @@ public class DDLTask extends Task<DDLWork> implements Serializable {
           }
           throw new HiveException(
               "Cannot drop a base table with DROP VIEW");
+        } else if (dropTbl.getExpectMaterializedView()) {
+          if (dropTbl.getIfExists()) {
+            return;
+          }
+          throw new HiveException(
+              "Cannot drop a base table with DROP MATERIALIZED VIEW");
         }
       }
     }
@@ -4247,17 +4268,21 @@ public class DDLTask extends Task<DDLWork> implements Serializable {
       if (crtView.getInputFormat() != null) {
         tbl.setInputFormatClass(crtView.getInputFormat());
       }
+
       if (crtView.getOutputFormat() != null) {
         tbl.setOutputFormatClass(crtView.getOutputFormat());
       }
 
       if (crtView.isMaterialized()) {
+        if (crtView.getLocation() != null) {
+          tbl.setDataLocation(new Path(crtView.getLocation()));
+        }
         // Short circuit the checks that the input format is valid, this is configured for all
         // materialized views and doesn't change so we don't need to check it constantly.
         tbl.getSd().setInputFormat(crtView.getInputFormat());
         tbl.getSd().setOutputFormat(crtView.getOutputFormat());
         tbl.getSd().setSerdeInfo(new SerDeInfo(crtView.getSerde(), crtView.getSerde(),
-                Collections.<String, String>emptyMap()));
+                crtView.getSerdeProps()));
       }
 
       db.createTable(tbl, crtView.getIfNotExists());

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
index dd86abd..ffb6ae3 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
@@ -58,7 +58,12 @@ import org.apache.hadoop.hive.ql.hooks.LineageInfo;
 import org.apache.hadoop.hive.ql.hooks.ReadEntity;
 import org.apache.hadoop.hive.ql.hooks.WriteEntity;
 import org.apache.hadoop.hive.ql.lib.Node;
-import org.apache.hadoop.hive.ql.metadata.*;
+import org.apache.hadoop.hive.ql.metadata.Hive;
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.metadata.InvalidTableException;
+import org.apache.hadoop.hive.ql.metadata.Partition;
+import org.apache.hadoop.hive.ql.metadata.Table;
+import org.apache.hadoop.hive.ql.metadata.VirtualColumn;
 import org.apache.hadoop.hive.ql.optimizer.listbucketingpruner.ListBucketingPrunerUtils;
 import org.apache.hadoop.hive.ql.plan.ExprNodeConstantDesc;
 import org.apache.hadoop.hive.ql.plan.ExprNodeDesc;
@@ -1001,8 +1006,7 @@ public abstract class BaseSemanticAnalyzer {
           || ast.getToken().getType() == HiveParser.TOK_TABLE_PARTITION
           || ast.getToken().getType() == HiveParser.TOK_TABTYPE
           || ast.getToken().getType() == HiveParser.TOK_CREATETABLE
-          || ast.getToken().getType() == HiveParser.TOK_CREATE_MATERIALIZED_VIEW
-          || ast.getToken().getType() == HiveParser.TOK_REBUILD_MATERIALIZED_VIEW);
+          || ast.getToken().getType() == HiveParser.TOK_CREATE_MATERIALIZED_VIEW);
       int childIndex = 0;
       numDynParts = 0;
 
@@ -1015,8 +1019,7 @@ public abstract class BaseSemanticAnalyzer {
               + tableName;
         }
         if (ast.getToken().getType() != HiveParser.TOK_CREATETABLE &&
-            ast.getToken().getType() != HiveParser.TOK_CREATE_MATERIALIZED_VIEW &&
-            ast.getToken().getType() != HiveParser.TOK_REBUILD_MATERIALIZED_VIEW) {
+            ast.getToken().getType() != HiveParser.TOK_CREATE_MATERIALIZED_VIEW) {
           tableHandle = db.getTable(tableName);
         }
       } catch (InvalidTableException ite) {
@@ -1029,8 +1032,7 @@ public abstract class BaseSemanticAnalyzer {
 
       // get partition metadata if partition specified
       if (ast.getChildCount() == 2 && ast.getToken().getType() != HiveParser.TOK_CREATETABLE &&
-          ast.getToken().getType() != HiveParser.TOK_CREATE_MATERIALIZED_VIEW &&
-          ast.getToken().getType() != HiveParser.TOK_REBUILD_MATERIALIZED_VIEW) {
+          ast.getToken().getType() != HiveParser.TOK_CREATE_MATERIALIZED_VIEW) {
         childIndex = 1;
         ASTNode partspec = (ASTNode) ast.getChild(1);
         partitions = new ArrayList<Partition>();

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java
index ff94160..e2ddb14 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java
@@ -275,7 +275,7 @@ public class CalcitePlanner extends SemanticAnalyzer {
       // table, destination), so if the query is otherwise ok, it is as if we
       // did remove those and gave CBO the proper AST. That is kinda hacky.
       ASTNode queryForCbo = ast;
-      if (cboCtx.type == PreCboCtx.Type.CTAS) {
+      if (cboCtx.type == PreCboCtx.Type.CTAS_OR_MV) {
         queryForCbo = cboCtx.nodeOfInterest; // nodeOfInterest is the query
       }
       runCBO = canCBOHandleAst(queryForCbo, getQB(), cboCtx);
@@ -284,6 +284,7 @@ public class CalcitePlanner extends SemanticAnalyzer {
       if (runCBO) {
         disableJoinMerge = true;
         boolean reAnalyzeAST = false;
+        final boolean materializedView = getQB().isMaterializedView();
 
         try {
           if (this.conf.getBoolVar(HiveConf.ConfVars.HIVE_CBO_RETPATH_HIVEOP)) {
@@ -295,15 +296,30 @@ public class CalcitePlanner extends SemanticAnalyzer {
             // 1. Gen Optimized AST
             ASTNode newAST = getOptimizedAST();
 
-            // 1.1. Fix up the query for insert/ctas
-            newAST = fixUpCtasAndInsertAfterCbo(ast, newAST, cboCtx);
+            // 1.1. Fix up the query for insert/ctas/materialized views
+            newAST = fixUpAfterCbo(ast, newAST, cboCtx);
 
             // 2. Regen OP plan from optimized AST
             init(false);
-            if (cboCtx.type == PreCboCtx.Type.CTAS) {
-              // Redo create-table analysis, because it's not part of doPhase1.
-              setAST(newAST);
-              newAST = reAnalyzeCtasAfterCbo(newAST);
+            if (cboCtx.type == PreCboCtx.Type.CTAS_OR_MV) {
+              // Redo create-table/view analysis, because it's not part of doPhase1.
+              if (materializedView) {
+                // Use the REWRITTEN AST
+                setAST(newAST);
+                newAST = reAnalyzeMaterializedViewAfterCbo(newAST);
+                // Store text of the ORIGINAL QUERY
+                String originalText = ctx.getTokenRewriteStream().toString(
+                    cboCtx.nodeOfInterest.getTokenStartIndex(),
+                    cboCtx.nodeOfInterest.getTokenStopIndex());
+                createVwDesc.setViewOriginalText(originalText);
+                viewSelect = newAST;
+                viewsExpanded = new ArrayList<>();
+                viewsExpanded.add(createVwDesc.getViewName());
+              } else {
+                // CTAS
+                setAST(newAST);
+                newAST = reAnalyzeCTASAfterCbo(newAST);
+              }
             }
             Phase1Ctx ctx_1 = initPhase1Ctx();
             if (!doPhase1(newAST, getQB(), ctx_1, null)) {
@@ -402,12 +418,13 @@ public class CalcitePlanner extends SemanticAnalyzer {
     int root = ast.getToken().getType();
     boolean needToLogMessage = STATIC_LOG.isInfoEnabled();
     boolean isSupportedRoot = root == HiveParser.TOK_QUERY || root == HiveParser.TOK_EXPLAIN
-        || qb.isCTAS();
+        || qb.isCTAS() || qb.isMaterializedView();
     // Queries without a source table currently are not supported by CBO
     boolean isSupportedType = (qb.getIsQuery() && !qb.containsQueryWithoutSourceTable())
-        || qb.isCTAS() || cboCtx.type == PreCboCtx.Type.INSERT;
+        || qb.isCTAS() || qb.isMaterializedView() || cboCtx.type == PreCboCtx.Type.INSERT;
     boolean noBadTokens = HiveCalciteUtil.validateASTForUnsupportedTokens(ast);
-    boolean result = isSupportedRoot && isSupportedType && getCreateViewDesc() == null
+    boolean result = isSupportedRoot && isSupportedType
+        && (getCreateViewDesc() == null || getCreateViewDesc().isMaterialized())
         && noBadTokens;
 
     if (!result) {
@@ -420,7 +437,7 @@ public class CalcitePlanner extends SemanticAnalyzer {
           msg += "is not a query with at least one source table "
                   + " or there is a subquery without a source table, or CTAS, or insert; ";
         }
-        if (getCreateViewDesc() != null) {
+        if (getCreateViewDesc() != null && !getCreateViewDesc().isMaterialized()) {
           msg += "has create view; ";
         }
         if (!noBadTokens) {
@@ -592,7 +609,7 @@ public class CalcitePlanner extends SemanticAnalyzer {
    */
   static class PreCboCtx extends PlannerContext {
     enum Type {
-      NONE, INSERT, CTAS, UNEXPECTED
+      NONE, INSERT, CTAS_OR_MV, UNEXPECTED
     }
 
     private ASTNode nodeOfInterest;
@@ -610,8 +627,8 @@ public class CalcitePlanner extends SemanticAnalyzer {
     }
 
     @Override
-    void setCTASToken(ASTNode child) {
-      set(PreCboCtx.Type.CTAS, child);
+    void setCTASOrMVToken(ASTNode child) {
+      set(PreCboCtx.Type.CTAS_OR_MV, child);
     }
 
     @Override
@@ -622,7 +639,7 @@ public class CalcitePlanner extends SemanticAnalyzer {
     }
   }
 
-  ASTNode fixUpCtasAndInsertAfterCbo(ASTNode originalAst, ASTNode newAst, PreCboCtx cboCtx)
+  ASTNode fixUpAfterCbo(ASTNode originalAst, ASTNode newAst, PreCboCtx cboCtx)
       throws SemanticException {
     switch (cboCtx.type) {
 
@@ -630,7 +647,7 @@ public class CalcitePlanner extends SemanticAnalyzer {
       // nothing to do
       return newAst;
 
-    case CTAS: {
+    case CTAS_OR_MV: {
       // Patch the optimized query back into original CTAS AST, replacing the
       // original query.
       replaceASTChild(cboCtx.nodeOfInterest, newAst);
@@ -655,7 +672,7 @@ public class CalcitePlanner extends SemanticAnalyzer {
     }
   }
 
-  ASTNode reAnalyzeCtasAfterCbo(ASTNode newAst) throws SemanticException {
+  ASTNode reAnalyzeCTASAfterCbo(ASTNode newAst) throws SemanticException {
     // analyzeCreateTable uses this.ast, but doPhase1 doesn't, so only reset it
     // here.
     newAst = analyzeCreateTable(newAst, getQB(), null);
@@ -667,6 +684,18 @@ public class CalcitePlanner extends SemanticAnalyzer {
     return newAst;
   }
 
+  ASTNode reAnalyzeMaterializedViewAfterCbo(ASTNode newAst) throws SemanticException {
+    // analyzeCreateView uses this.ast, but doPhase1 doesn't, so only reset it
+    // here.
+    newAst = analyzeCreateView(newAst, getQB(), null);
+    if (newAst == null) {
+      LOG.error("analyzeCreateTable failed to initialize materialized view after CBO;" + " new ast is "
+          + getAST().dump());
+      throw new SemanticException("analyzeCreateTable failed to initialize materialized view after CBO");
+    }
+    return newAst;
+  }
+
   /**
    * Performs breadth-first search of the AST for a nested set of tokens. Tokens
    * don't have to be each others' direct children, they can be separated by

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java
index 988c58e..8b0db4a 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java
@@ -332,7 +332,7 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer {
       break;
     }
     case HiveParser.TOK_DROPTABLE:
-      analyzeDropTable(ast, false);
+      analyzeDropTable(ast, null);
       break;
     case HiveParser.TOK_TRUNCATETABLE:
       analyzeTruncateTable(ast);
@@ -407,7 +407,10 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer {
       analyzeMetastoreCheck(ast);
       break;
     case HiveParser.TOK_DROPVIEW:
-      analyzeDropTable(ast, true);
+      analyzeDropTable(ast, TableType.VIRTUAL_VIEW);
+      break;
+    case HiveParser.TOK_DROP_MATERIALIZED_VIEW:
+      analyzeDropTable(ast, TableType.MATERIALIZED_VIEW);
       break;
     case HiveParser.TOK_ALTERVIEW: {
       String[] qualified = getQualifiedTableName((ASTNode) ast.getChild(0));
@@ -881,7 +884,7 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer {
 
 
 
-  private void analyzeDropTable(ASTNode ast, boolean expectView)
+  private void analyzeDropTable(ASTNode ast, TableType expectedType)
       throws SemanticException {
     String tableName = getUnescapedName((ASTNode) ast.getChild(0));
     boolean ifExists = (ast.getFirstChildWithType(HiveParser.TOK_IFEXISTS) != null);
@@ -899,7 +902,7 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer {
     }
 
     boolean ifPurge = (ast.getFirstChildWithType(HiveParser.KW_PURGE) != null);
-    DropTableDesc dropTblDesc = new DropTableDesc(tableName, expectView, ifExists, ifPurge, replicationSpec);
+    DropTableDesc dropTblDesc = new DropTableDesc(tableName, expectedType, ifExists, ifPurge, replicationSpec);
     rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(),
         dropTblDesc), conf));
   }
@@ -2736,7 +2739,8 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer {
     addTableDropPartsOutputs(tab, partSpecs.values(), !ifExists);
 
     DropTableDesc dropTblDesc =
-        new DropTableDesc(getDotName(qualified), partSpecs, expectView, mustPurge, replicationSpec);
+        new DropTableDesc(getDotName(qualified), partSpecs, expectView ? TableType.VIRTUAL_VIEW : null,
+                mustPurge, replicationSpec);
     rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(), dropTblDesc), conf));
   }
 

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g b/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g
index 92dfc90..62bbcc6 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g
@@ -250,8 +250,8 @@ TOK_ALTERVIEW_DROPPROPERTIES;
 TOK_ALTERVIEW_ADDPARTS;
 TOK_ALTERVIEW_DROPPARTS;
 TOK_ALTERVIEW_RENAME;
-TOK_REBUILD_MATERIALIZED_VIEW;
 TOK_CREATE_MATERIALIZED_VIEW;
+TOK_DROP_MATERIALIZED_VIEW;
 TOK_VIEWPARTCOLS;
 TOK_EXPLAIN;
 TOK_EXPLAIN_SQ_REWRITE;
@@ -1034,7 +1034,6 @@ alterStatement
 @after { popMsg(state); }
     : KW_ALTER KW_TABLE tableName alterTableStatementSuffix -> ^(TOK_ALTERTABLE tableName alterTableStatementSuffix)
     | KW_ALTER KW_VIEW tableName KW_AS? alterViewStatementSuffix -> ^(TOK_ALTERVIEW tableName alterViewStatementSuffix)
-    | KW_ALTER KW_MATERIALIZED KW_VIEW tableName KW_REBUILD -> ^(TOK_REBUILD_MATERIALIZED_VIEW tableName)
     | KW_ALTER KW_INDEX alterIndexStatementSuffix -> alterIndexStatementSuffix
     | KW_ALTER (KW_DATABASE|KW_SCHEMA) alterDatabaseStatementSuffix -> alterDatabaseStatementSuffix
     ;
@@ -1789,11 +1788,14 @@ createMaterializedViewStatement
 }
 @after { popMsg(state); }
     : KW_CREATE KW_MATERIALIZED KW_VIEW (ifNotExists)? name=tableName
-        tableComment? tablePropertiesPrefixed?
-        KW_AS selectStatementWithCTE
+        tableComment? tableRowFormat? tableFileFormat? tableLocation?
+        tablePropertiesPrefixed? KW_AS selectStatementWithCTE
     -> ^(TOK_CREATE_MATERIALIZED_VIEW $name 
          ifNotExists?
          tableComment?
+         tableRowFormat?
+         tableFileFormat?
+         tableLocation?
          tablePropertiesPrefixed?
          selectStatementWithCTE
         )
@@ -1815,7 +1817,7 @@ dropViewStatement
 dropMaterializedViewStatement
 @init { pushMsg("drop materialized view statement", state); }
 @after { popMsg(state); }
-    : KW_DROP KW_MATERIALIZED KW_VIEW ifExists? viewName -> ^(TOK_DROPTABLE viewName ifExists?)
+    : KW_DROP KW_MATERIALIZED KW_VIEW ifExists? viewName -> ^(TOK_DROP_MATERIALIZED_VIEW viewName ifExists?)
     ;
 
 showFunctionIdentifier

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/java/org/apache/hadoop/hive/ql/parse/ImportSemanticAnalyzer.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/ImportSemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/ImportSemanticAnalyzer.java
index d562ddf..9986fcf 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/ImportSemanticAnalyzer.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/ImportSemanticAnalyzer.java
@@ -345,7 +345,7 @@ public class ImportSemanticAnalyzer extends BaseSemanticAnalyzer {
     return TaskFactory.get(new DDLWork(
         getInputs(),
         getOutputs(),
-        new DropTableDesc(table.getTableName(), false, true, true, null)
+        new DropTableDesc(table.getTableName(), null, true, true, null)
     ), conf);
   }
 

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
index ab2966b..577d006 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
@@ -55,7 +55,6 @@ import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.fs.permission.FsAction;
-import org.apache.hadoop.hive.common.BlobStorageUtils;
 import org.apache.hadoop.hive.common.FileUtils;
 import org.apache.hadoop.hive.common.ObjectPair;
 import org.apache.hadoop.hive.common.StatsSetupConst;
@@ -285,9 +284,9 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
   Map<GroupByOperator, Set<String>> groupOpToInputTables;
   Map<String, PrunedPartitionList> prunedPartitions;
   protected List<FieldSchema> resultSchema;
-  private CreateViewDesc createVwDesc;
-  private ArrayList<String> viewsExpanded;
-  private ASTNode viewSelect;
+  protected CreateViewDesc createVwDesc;
+  protected ArrayList<String> viewsExpanded;
+  protected ASTNode viewSelect;
   protected final UnparseTranslator unparseTranslator;
   private final GlobalLimitCtx globalLimitCtx;
 
@@ -10514,7 +10513,7 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
       this.ctx_1 = ctx_1;
     }
 
-    void setCTASToken(ASTNode child) {
+    void setCTASOrMVToken(ASTNode child) {
     }
 
     void setInsertToken(ASTNode ast, boolean isTmpFileDest) {
@@ -10699,10 +10698,9 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
     // 3. analyze create view command
     if (ast.getToken().getType() == HiveParser.TOK_CREATEVIEW ||
         ast.getToken().getType() == HiveParser.TOK_CREATE_MATERIALIZED_VIEW ||
-        ast.getToken().getType() == HiveParser.TOK_REBUILD_MATERIALIZED_VIEW ||
         (ast.getToken().getType() == HiveParser.TOK_ALTERVIEW &&
             ast.getChild(1).getType() == HiveParser.TOK_QUERY)) {
-      child = analyzeCreateView(ast, qb);
+      child = analyzeCreateView(ast, qb, plannerCtx);
       if (child == null) {
         return false;
       }
@@ -11015,12 +11013,6 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
   }
 
   private void saveViewDefinition() throws SemanticException {
-
-    if (createVwDesc.isMaterialized() && createVwDesc.getOrReplace()) {
-      // This is a rebuild, there's nothing to do here.
-      return;
-    }
-
     // Make a copy of the statement's result schema, since we may
     // modify it below as part of imposing view column names.
     List<FieldSchema> derivedSchema =
@@ -11039,9 +11031,11 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
     }
 
     // Preserve the original view definition as specified by the user.
-    String originalText = ctx.getTokenRewriteStream().toString(
-        viewSelect.getTokenStartIndex(), viewSelect.getTokenStopIndex());
-    createVwDesc.setViewOriginalText(originalText);
+    if (createVwDesc.getViewOriginalText() == null) {
+      String originalText = ctx.getTokenRewriteStream().toString(
+          viewSelect.getTokenStartIndex(), viewSelect.getTokenStopIndex());
+      createVwDesc.setViewOriginalText(originalText);
+    }
 
     // Now expand the view definition with extras such as explicit column
     // references; this expanded form is what we'll re-parse when the view is
@@ -11582,7 +11576,7 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
         }
         command_type = CTAS;
         if (plannerCtx != null) {
-          plannerCtx.setCTASToken(child);
+          plannerCtx.setCTASOrMVToken(child);
         }
         selectStmt = child;
         break;
@@ -11820,7 +11814,7 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
     outputs.add(new WriteEntity(t, WriteEntity.WriteType.DDL_NO_LOCK));
   }
 
-  private ASTNode analyzeCreateView(ASTNode ast, QB qb) throws SemanticException {
+  protected ASTNode analyzeCreateView(ASTNode ast, QB qb, PlannerContext plannerCtx) throws SemanticException {
     String[] qualTabName = getQualifiedTableName((ASTNode) ast.getChild(0));
     String dbDotTable = getDotName(qualTabName);
     List<FieldSchema> cols = null;
@@ -11831,17 +11825,19 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
     ASTNode selectStmt = null;
     Map<String, String> tblProps = null;
     List<String> partColNames = null;
-    boolean isRebuild = ast.getToken().getType() == HiveParser.TOK_REBUILD_MATERIALIZED_VIEW;
-    boolean isMaterialized = ast.getToken().getType() == HiveParser.TOK_CREATE_MATERIALIZED_VIEW
-        || isRebuild;
-    StorageFormat storageFormat = storageFormat = new StorageFormat(conf);
-    storageFormat.fillDefaultStorageFormat(false, isMaterialized);
+    boolean isMaterialized = ast.getToken().getType() == HiveParser.TOK_CREATE_MATERIALIZED_VIEW;
+    String location = null;
+    RowFormatParams rowFormatParams = new RowFormatParams();
+    StorageFormat storageFormat = new StorageFormat(conf);
 
     LOG.info("Creating view " + dbDotTable + " position="
         + ast.getCharPositionInLine());
     int numCh = ast.getChildCount();
     for (int num = 1; num < numCh; num++) {
       ASTNode child = (ASTNode) ast.getChild(num);
+      if (storageFormat.fillStorageFormat(child)) {
+        continue;
+      }
       switch (child.getToken().getType()) {
       case HiveParser.TOK_IFNOTEXISTS:
         ifNotExists = true;
@@ -11850,6 +11846,10 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
         orReplace = true;
         break;
       case HiveParser.TOK_QUERY:
+        // For CBO
+        if (plannerCtx != null) {
+          plannerCtx.setCTASOrMVToken(child);
+        }
         selectStmt = child;
         break;
       case HiveParser.TOK_TABCOLNAME:
@@ -11864,11 +11864,29 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
       case HiveParser.TOK_VIEWPARTCOLS:
         partColNames = getColumnNames((ASTNode) child.getChild(0));
         break;
+      case HiveParser.TOK_TABLEROWFORMAT:
+        rowFormatParams.analyzeRowFormat(child);
+        break;
+      case HiveParser.TOK_TABLELOCATION:
+        location = unescapeSQLString(child.getChild(0).getText());
+        location = EximUtil.relativeToAbsolutePath(conf, location);
+        inputs.add(toReadEntity(location));
+        break;
+      case HiveParser.TOK_TABLESERIALIZER:
+        child = (ASTNode) child.getChild(0);
+        storageFormat.setSerde(unescapeSQLString(child.getChild(0).getText()));
+        if (child.getChildCount() == 2) {
+          readProps((ASTNode) (child.getChild(1).getChild(0)),
+              storageFormat.getSerdeProps());
+        }
+        break;
       default:
         assert false;
       }
     }
 
+    storageFormat.fillDefaultStorageFormat(false, isMaterialized);
+
     if (ifNotExists && orReplace){
       throw new SemanticException("Can't combine IF NOT EXISTS and OR REPLACE.");
     }
@@ -11882,9 +11900,11 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
     unparseTranslator.enable();
 
     if (isMaterialized) {
-      createVwDesc = new CreateViewDesc(dbDotTable, cols, comment, tblProps, partColNames,
-              ifNotExists, orReplace || isRebuild, isAlterViewAs, storageFormat.getInputFormat(),
-              storageFormat.getOutputFormat(), storageFormat.getSerde());
+      createVwDesc = new CreateViewDesc(
+              dbDotTable, cols, comment, tblProps, partColNames,
+              ifNotExists, orReplace, isAlterViewAs, storageFormat.getInputFormat(),
+              storageFormat.getOutputFormat(), location, storageFormat.getSerde(),
+              storageFormat.getStorageHandler(), storageFormat.getSerdeProps());
       addDbAndTabToOutputs(qualTabName, TableType.MATERIALIZED_VIEW);
       queryState.setCommandType(HiveOperation.CREATE_MATERIALIZED_VIEW);
       qb.setViewDesc(createVwDesc);
@@ -11895,24 +11915,10 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
               storageFormat.getOutputFormat(), storageFormat.getSerde());
       rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(),
               createVwDesc), conf));
-
       addDbAndTabToOutputs(qualTabName, TableType.VIRTUAL_VIEW);
       queryState.setCommandType(HiveOperation.CREATEVIEW);
     }
 
-    if (isRebuild) {
-      // We need to go lookup the table and get the select statement and then parse it.
-      try {
-        Table tab = db.getTable(qualTabName[0], qualTabName[1]);
-        String viewText = tab.getViewOriginalText();
-        ParseDriver pd = new ParseDriver();
-        ASTNode tree = pd.parse(viewText, ctx, false);
-        selectStmt = ParseUtils.findRootNonNullToken(tree);
-      } catch (Exception e) {
-        throw new SemanticException(e);
-      }
-    }
-
     return selectStmt;
   }
 

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzerFactory.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzerFactory.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzerFactory.java
index cc731bf..18439f9 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzerFactory.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzerFactory.java
@@ -84,7 +84,9 @@ public final class SemanticAnalyzerFactory {
     commandType.put(HiveParser.TOK_CREATEMACRO, HiveOperation.CREATEMACRO);
     commandType.put(HiveParser.TOK_DROPMACRO, HiveOperation.DROPMACRO);
     commandType.put(HiveParser.TOK_CREATEVIEW, HiveOperation.CREATEVIEW);
+    commandType.put(HiveParser.TOK_CREATE_MATERIALIZED_VIEW, HiveOperation.CREATE_MATERIALIZED_VIEW);
     commandType.put(HiveParser.TOK_DROPVIEW, HiveOperation.DROPVIEW);
+    commandType.put(HiveParser.TOK_DROP_MATERIALIZED_VIEW, HiveOperation.DROP_MATERIALIZED_VIEW);
     commandType.put(HiveParser.TOK_CREATEINDEX, HiveOperation.CREATEINDEX);
     commandType.put(HiveParser.TOK_DROPINDEX, HiveOperation.DROPINDEX);
     commandType.put(HiveParser.TOK_ALTERINDEX_REBUILD, HiveOperation.ALTERINDEX_REBUILD);
@@ -231,6 +233,7 @@ public final class SemanticAnalyzerFactory {
       case HiveParser.TOK_SWITCHDATABASE:
       case HiveParser.TOK_DROPTABLE:
       case HiveParser.TOK_DROPVIEW:
+      case HiveParser.TOK_DROP_MATERIALIZED_VIEW:
       case HiveParser.TOK_DESCDATABASE:
       case HiveParser.TOK_DESCTABLE:
       case HiveParser.TOK_DESCFUNCTION:

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/java/org/apache/hadoop/hive/ql/parse/TaskCompiler.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/TaskCompiler.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/TaskCompiler.java
index f781390..97cf585 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/TaskCompiler.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/TaskCompiler.java
@@ -231,10 +231,9 @@ public abstract class TaskCompiler {
           // make the movetask's destination directory the table's destination.
           Path location;
           String loc = pCtx.getQueryProperties().isCTAS() ?
-                  pCtx.getCreateTable().getLocation() : null;
+                  pCtx.getCreateTable().getLocation() : pCtx.getCreateViewDesc().getLocation();
           if (loc == null) {
-            // get the table's default location
-            // Always use default location for materialized view
+            // get the default location
             Path targetPath;
             try {
               String protoName = null;

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/java/org/apache/hadoop/hive/ql/plan/CreateViewDesc.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/CreateViewDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/CreateViewDesc.java
index 3ddbb1f..6830bda 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/plan/CreateViewDesc.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/CreateViewDesc.java
@@ -36,8 +36,6 @@ public class CreateViewDesc extends DDLDesc implements Serializable {
   private static final long serialVersionUID = 1L;
 
   private String viewName;
-  private String inputFormat;
-  private String outputFormat;
   private String originalText;
   private String expandedText;
   private List<FieldSchema> schema;
@@ -49,7 +47,12 @@ public class CreateViewDesc extends DDLDesc implements Serializable {
   private boolean orReplace;
   private boolean isAlterViewAs;
   private boolean isMaterialized;
+  private String inputFormat;
+  private String outputFormat;
+  private String location; // only used for materialized views
   private String serde; // only used for materialized views
+  private String storageHandler; // only used for materialized views
+  private Map<String, String> serdeProps; // only used for materialized views
 
   /**
    * For serialization only.
@@ -58,7 +61,7 @@ public class CreateViewDesc extends DDLDesc implements Serializable {
   }
 
   /**
-   * Used to create a virtual view descriptor.
+   * Used to create a materialized view descriptor
    * @param viewName
    * @param schema
    * @param comment
@@ -67,27 +70,37 @@ public class CreateViewDesc extends DDLDesc implements Serializable {
    * @param ifNotExists
    * @param orReplace
    * @param isAlterViewAs
+   * @param inputFormat
+   * @param outputFormat
+   * @param location
+   * @param serde
+   * @param storageHandler
+   * @param serdeProps
    */
-  public CreateViewDesc(String viewName, List<FieldSchema> schema,
-      String comment, String inputFormat,
-      String outputFormat, Map<String, String> tblProps,
-      List<String> partColNames, boolean ifNotExists,
-      boolean orReplace, boolean isAlterViewAs) {
+  public CreateViewDesc(String viewName, List<FieldSchema> schema, String comment,
+          Map<String, String> tblProps, List<String> partColNames,
+          boolean ifNotExists, boolean orReplace, boolean isAlterViewAs,
+          String inputFormat, String outputFormat, String location,
+          String serde, String storageHandler, Map<String, String> serdeProps) {
     this.viewName = viewName;
     this.schema = schema;
-    this.comment = comment;
-    this.inputFormat = inputFormat;
-    this.outputFormat = outputFormat;
     this.tblProps = tblProps;
     this.partColNames = partColNames;
+    this.comment = comment;
     this.ifNotExists = ifNotExists;
     this.orReplace = orReplace;
     this.isAlterViewAs = isAlterViewAs;
-    this.isMaterialized = false;
+    this.isMaterialized = true;
+    this.inputFormat = inputFormat;
+    this.outputFormat = outputFormat;
+    this.location = location;
+    this.serde = serde;
+    this.storageHandler = storageHandler;
+    this.serdeProps = serdeProps;
   }
 
   /**
-   * Used to create a materialized view descriptor
+   * Used to create a view descriptor
    * @param viewName
    * @param schema
    * @param comment
@@ -112,7 +125,7 @@ public class CreateViewDesc extends DDLDesc implements Serializable {
     this.ifNotExists = ifNotExists;
     this.orReplace = orReplace;
     this.isAlterViewAs = isAlterViewAs;
-    this.isMaterialized = true;
+    this.isMaterialized = false;
     this.inputFormat = inputFormat;
     this.outputFormat = outputFormat;
     this.serde = serde;
@@ -244,8 +257,20 @@ public class CreateViewDesc extends DDLDesc implements Serializable {
     return isMaterialized;
   }
 
+  public String getLocation() {
+    return location;
+  }
+
   public String getSerde() {
     return serde;
   }
 
+  public String getStorageHandler() {
+    return storageHandler;
+  }
+
+  public Map<String, String> getSerdeProps() {
+    return serdeProps;
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/java/org/apache/hadoop/hive/ql/plan/DropTableDesc.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/DropTableDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/DropTableDesc.java
index 62c8f7e..74c742c 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/plan/DropTableDesc.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/DropTableDesc.java
@@ -18,14 +18,15 @@
 
 package org.apache.hadoop.hive.ql.plan;
 
-import org.apache.hadoop.hive.ql.parse.ReplicationSpec;
-import org.apache.hadoop.hive.ql.plan.Explain.Level;
-
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.hadoop.hive.metastore.TableType;
+import org.apache.hadoop.hive.ql.parse.ReplicationSpec;
+import org.apache.hadoop.hive.ql.plan.Explain.Level;
+
 /**
  * DropTableDesc.
  * TODO: this is currently used for both drop table and drop partitions.
@@ -53,10 +54,11 @@ public class DropTableDesc extends DDLDesc implements Serializable {
 
   String tableName;
   ArrayList<PartSpec> partSpecs;
-  boolean expectView;
+  TableType expectedType;
   boolean ifExists;
   boolean ifPurge;
   ReplicationSpec replicationSpec;
+  
 
   public DropTableDesc() {
   }
@@ -66,18 +68,18 @@ public class DropTableDesc extends DDLDesc implements Serializable {
    * @param ifPurge
    */
   public DropTableDesc(
-      String tableName, boolean expectView, boolean ifExists,
+      String tableName, TableType expectedType, boolean ifExists,
       boolean ifPurge, ReplicationSpec replicationSpec) {
     this.tableName = tableName;
     this.partSpecs = null;
-    this.expectView = expectView;
+    this.expectedType = expectedType;
     this.ifExists = ifExists;
     this.ifPurge = ifPurge;
     this.replicationSpec = replicationSpec;
   }
 
   public DropTableDesc(String tableName, Map<Integer, List<ExprNodeGenericFuncDesc>> partSpecs,
-      boolean expectView, boolean ifPurge, ReplicationSpec replicationSpec) {
+      TableType expectedType, boolean ifPurge, ReplicationSpec replicationSpec) {
     this.tableName = tableName;
     this.partSpecs = new ArrayList<PartSpec>(partSpecs.size());
     for (Map.Entry<Integer, List<ExprNodeGenericFuncDesc>> partSpec : partSpecs.entrySet()) {
@@ -86,7 +88,7 @@ public class DropTableDesc extends DDLDesc implements Serializable {
         this.partSpecs.add(new PartSpec(expr, prefixLength));
       }
     }
-    this.expectView = expectView;
+    this.expectedType = expectedType;
     this.ifPurge = ifPurge;
     this.replicationSpec = replicationSpec;
   }
@@ -118,15 +120,14 @@ public class DropTableDesc extends DDLDesc implements Serializable {
    * @return whether to expect a view being dropped
    */
   public boolean getExpectView() {
-    return expectView;
+    return expectedType != null && expectedType == TableType.VIRTUAL_VIEW;
   }
 
   /**
-   * @param expectView
-   *          set whether to expect a view being dropped
+   * @return whether to expect a materialized view being dropped
    */
-  public void setExpectView(boolean expectView) {
-    this.expectView = expectView;
+  public boolean getExpectMaterializedView() {
+    return expectedType != null && expectedType == TableType.MATERIALIZED_VIEW;
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/java/org/apache/hadoop/hive/ql/plan/HiveOperation.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/HiveOperation.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/HiveOperation.java
index d5b1c9d..6fd4df4 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/plan/HiveOperation.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/HiveOperation.java
@@ -78,9 +78,10 @@ public enum HiveOperation {
   CREATEMACRO("CREATEMACRO", null, null),
   DROPMACRO("DROPMACRO", null, null),
   CREATEVIEW("CREATEVIEW", new Privilege[]{Privilege.SELECT}, new Privilege[]{Privilege.CREATE}),
-  CREATE_MATERIALIZED_VIEW("CREATEVIEW", new Privilege[]{Privilege.SELECT}, new
+  CREATE_MATERIALIZED_VIEW("CREATE_MATERIALIZED_VIEW", new Privilege[]{Privilege.SELECT}, new
       Privilege[]{Privilege.CREATE}),
   DROPVIEW("DROPVIEW", null, new Privilege[]{Privilege.DROP}),
+  DROP_MATERIALIZED_VIEW("DROP_MATERIALIZED_VIEW", null, new Privilege[]{Privilege.DROP}),
   CREATEINDEX("CREATEINDEX", null, null),
   DROPINDEX("DROPINDEX", null, null),
   ALTERINDEX_REBUILD("ALTERINDEX_REBUILD", null, null),

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/AuthorizationPreEventListener.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/AuthorizationPreEventListener.java b/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/AuthorizationPreEventListener.java
index 82e7fc5..4931e60 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/AuthorizationPreEventListener.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/AuthorizationPreEventListener.java
@@ -424,6 +424,8 @@ public class AuthorizationPreEventListener extends MetaStorePreEventListener {
           wrapperApiTable.setTableType(TableType.EXTERNAL_TABLE.toString());
         } else if (MetaStoreUtils.isIndexTable(wrapperApiTable)) {
           wrapperApiTable.setTableType(TableType.INDEX_TABLE.toString());
+        } else if (MetaStoreUtils.isMaterializedViewTable(wrapperApiTable)) {
+          wrapperApiTable.setTableType(TableType.MATERIALIZED_VIEW.toString());
         } else if ((wrapperApiTable.getSd() == null) || (wrapperApiTable.getSd().getLocation() == null)) {
           wrapperApiTable.setTableType(TableType.VIRTUAL_VIEW.toString());
         } else {

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/HiveOperationType.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/HiveOperationType.java b/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/HiveOperationType.java
index 884b129..2da4249 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/HiveOperationType.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/HiveOperationType.java
@@ -84,6 +84,7 @@ public enum HiveOperationType {
   CREATEVIEW,
   CREATE_MATERIALIZED_VIEW,
   DROPVIEW,
+  DROP_MATERIALIZED_VIEW,
   CREATEINDEX,
   DROPINDEX,
   ALTERINDEX_REBUILD,

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/sqlstd/Operation2Privilege.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/sqlstd/Operation2Privilege.java b/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/sqlstd/Operation2Privilege.java
index ddf1e66..e5389bd 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/sqlstd/Operation2Privilege.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/sqlstd/Operation2Privilege.java
@@ -257,6 +257,8 @@ public class Operation2Privilege {
 (OWNER_PRIV_AR, OWNER_PRIV_AR));
     op2Priv.put(HiveOperationType.DROPVIEW, PrivRequirement.newIOPrivRequirement
 (OWNER_PRIV_AR, OWNER_PRIV_AR));
+    op2Priv.put(HiveOperationType.DROP_MATERIALIZED_VIEW, PrivRequirement.newIOPrivRequirement
+(OWNER_PRIV_AR, OWNER_PRIV_AR));
 
     op2Priv.put(HiveOperationType.ANALYZE_TABLE, PrivRequirement.newIOPrivRequirement
 (arr(SQLPrivTypeGrant.SELECT_NOGRANT, SQLPrivTypeGrant.INSERT_NOGRANT), null));

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/test/queries/clientnegative/materialized_view_authorization_rebuild_no_grant.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientnegative/materialized_view_authorization_rebuild_no_grant.q b/ql/src/test/queries/clientnegative/materialized_view_authorization_rebuild_no_grant.q
deleted file mode 100644
index a2e7d38..0000000
--- a/ql/src/test/queries/clientnegative/materialized_view_authorization_rebuild_no_grant.q
+++ /dev/null
@@ -1,20 +0,0 @@
-set hive.test.authz.sstd.hs2.mode=true;
-set hive.security.authorization.manager=org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactoryForTest;
-set hive.security.authenticator.manager=org.apache.hadoop.hive.ql.security.SessionStateConfigUserAuthenticator;
-set hive.security.authorization.enabled=true;
-set user.name=user1;
-
-create table amvrng_table (a int, b varchar(256), c decimal(10,2));
-
-insert into amvrng_table values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8);
-
-grant select on table amvrng_table to user user2 with grant option;
-
-set user.name=user2;
-create materialized view amvrng_mat_view as select a, c from amvrng_table;
-
-set user.name=user1;
-revoke grant option for select on table amvrng_table from user user2;
-
-set user.name=user2;
-alter materialized view amvrng_mat_view rebuild;

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/test/queries/clientnegative/materialized_view_authorization_rebuild_other.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientnegative/materialized_view_authorization_rebuild_other.q b/ql/src/test/queries/clientnegative/materialized_view_authorization_rebuild_other.q
deleted file mode 100644
index 7c2d145..0000000
--- a/ql/src/test/queries/clientnegative/materialized_view_authorization_rebuild_other.q
+++ /dev/null
@@ -1,14 +0,0 @@
-set hive.test.authz.sstd.hs2.mode=true;
-set hive.security.authorization.manager=org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactoryForTest;
-set hive.security.authenticator.manager=org.apache.hadoop.hive.ql.security.SessionStateConfigUserAuthenticator;
-set hive.security.authorization.enabled=true;
-set user.name=user1;
-
-create table amvro_table (a int, b varchar(256), c decimal(10,2));
-
-insert into amvro_table values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8);
-
-create materialized view amvro_mat_view as select a, c from amvro_table;
-
-set user.name=user2;
-alter materialized view amvro_mat_view rebuild;

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/test/queries/clientnegative/materialized_view_drop.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientnegative/materialized_view_drop.q b/ql/src/test/queries/clientnegative/materialized_view_drop.q
new file mode 100644
index 0000000..f16d8a7
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/materialized_view_drop.q
@@ -0,0 +1,9 @@
+create table cmv_basetable (a int, b varchar(256), c decimal(10,2));
+
+insert into cmv_basetable values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8);
+
+create materialized view cmv_mat_view as select a, b, c from cmv_basetable;
+
+drop materialized view cmv_mat_view;
+
+drop materialized view cmv_basetable;

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/test/queries/clientnegative/materialized_view_drop2.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientnegative/materialized_view_drop2.q b/ql/src/test/queries/clientnegative/materialized_view_drop2.q
new file mode 100644
index 0000000..627a78b
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/materialized_view_drop2.q
@@ -0,0 +1,7 @@
+create table cmv_basetable (a int, b varchar(256), c decimal(10,2));
+
+insert into cmv_basetable values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8);
+
+create materialized view cmv_mat_view as select a, b, c from cmv_basetable;
+
+drop view cmv_mat_view;

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/test/queries/clientnegative/view_delete.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientnegative/view_delete.q b/ql/src/test/queries/clientnegative/view_delete.q
index c9dc985..a19b0e3 100644
--- a/ql/src/test/queries/clientnegative/view_delete.q
+++ b/ql/src/test/queries/clientnegative/view_delete.q
@@ -4,7 +4,6 @@ set hive.enforce.bucketing=true;
 
 create table dv_basetable (a int, b varchar(256), c decimal(10,2));
 
-
 create view dv_view as select a, b, c from dv_basetable;
 
 delete from dv_view where b = 'fred';

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/test/queries/clientnegative/view_update.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientnegative/view_update.q b/ql/src/test/queries/clientnegative/view_update.q
index 3a54ccb..af27ae6 100644
--- a/ql/src/test/queries/clientnegative/view_update.q
+++ b/ql/src/test/queries/clientnegative/view_update.q
@@ -4,7 +4,6 @@ set hive.enforce.bucketing=true;
 
 create table uv_basetable (a int, b varchar(256), c decimal(10,2));
 
-
 create view uv_view as select a, b, c from uv_basetable;
 
 update uv_view set b = 'joe' where b = 'fred';

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/test/queries/clientpositive/materialized_view_authorization_sqlstd.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/materialized_view_authorization_sqlstd.q b/ql/src/test/queries/clientpositive/materialized_view_authorization_sqlstd.q
index 87a53e9..eef1b01 100644
--- a/ql/src/test/queries/clientpositive/materialized_view_authorization_sqlstd.q
+++ b/ql/src/test/queries/clientpositive/materialized_view_authorization_sqlstd.q
@@ -44,8 +44,6 @@ show grant user user4 on table amvs_mat_view;
 select * from amvs_mat_view;
 
 set user.name=user1;
-alter materialized view amvs_mat_view rebuild;
-
 grant select on table amvs_table to user user2 with grant option;
 set user.name=user2;
 create materialized view amvs_mat_view2 as select a, b from amvs_table;

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/test/queries/clientpositive/materialized_view_describe.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/materialized_view_describe.q b/ql/src/test/queries/clientpositive/materialized_view_describe.q
new file mode 100644
index 0000000..2c48e1d
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/materialized_view_describe.q
@@ -0,0 +1,58 @@
+create table cmv_basetable (a int, b varchar(256), c decimal(10,2));
+
+insert into cmv_basetable values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8);
+
+create materialized view cmv_mat_view
+comment 'this is the first view'
+tblproperties ('key'='foo') as select a, c from cmv_basetable;
+
+describe cmv_mat_view;
+
+describe extended cmv_mat_view;
+
+describe formatted cmv_mat_view;
+
+show tblproperties cmv_mat_view;
+
+select a, c from cmv_mat_view;
+
+drop materialized view cmv_mat_view;
+
+create materialized view cmv_mat_view2
+comment 'this is the second view'
+stored as textfile
+tblproperties ('key'='alice','key2'='bob') as select a from cmv_basetable;
+
+describe formatted cmv_mat_view2;
+
+select a from cmv_mat_view2;
+
+drop materialized view cmv_mat_view2;
+
+create materialized view cmv_mat_view3
+comment 'this is the third view'
+row format
+  delimited fields terminated by '\t'
+as select * from cmv_basetable;
+
+describe formatted cmv_mat_view3;
+
+select a, b, c from cmv_mat_view3;
+
+select distinct a from cmv_mat_view3;
+
+drop materialized view cmv_mat_view3;
+
+dfs ${system:test.dfs.mkdir} ${system:test.tmp.dir}/t;
+
+create materialized view cmv_mat_view4
+comment 'this is the last view'
+stored as textfile
+location '${system:test.tmp.dir}/t'
+as select a from cmv_basetable;
+
+describe formatted cmv_mat_view4;
+
+select a from cmv_mat_view4;
+
+drop materialized view cmv_mat_view4;

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/test/queries/clientpositive/materialized_view_rebuild.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/materialized_view_rebuild.q b/ql/src/test/queries/clientpositive/materialized_view_rebuild.q
deleted file mode 100644
index c0a5530..0000000
--- a/ql/src/test/queries/clientpositive/materialized_view_rebuild.q
+++ /dev/null
@@ -1,13 +0,0 @@
-create table rmv_table (cint int, cstring1 string);
-
-insert into rmv_table values(1, 'fred'), (10, 'wilma');
-
-create materialized view rmv_mat_view as select cint, cstring1 from rmv_table where cint < 10;
-
-select * from rmv_mat_view;
-
-insert into rmv_table values(2, 'barney'), (11, 'betty');
-
-alter materialized view rmv_mat_view rebuild;
-
-select * from rmv_mat_view;

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/test/results/clientnegative/materialized_view_authorization_drop_other.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/materialized_view_authorization_drop_other.q.out b/ql/src/test/results/clientnegative/materialized_view_authorization_drop_other.q.out
index d1aff33..9be10d6 100644
--- a/ql/src/test/results/clientnegative/materialized_view_authorization_drop_other.q.out
+++ b/ql/src/test/results/clientnegative/materialized_view_authorization_drop_other.q.out
@@ -18,13 +18,13 @@ POSTHOOK: Lineage: amvdo_table.a EXPRESSION [(values__tmp__table__1)values__tmp_
 POSTHOOK: Lineage: amvdo_table.b EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ]
 POSTHOOK: Lineage: amvdo_table.c EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col3, type:string, comment:), ]
 PREHOOK: query: create materialized view amvdo_mat_view as select a, c from amvdo_table
-PREHOOK: type: CREATEVIEW
+PREHOOK: type: CREATE_MATERIALIZED_VIEW
 PREHOOK: Input: default@amvdo_table
 PREHOOK: Output: database:default
 PREHOOK: Output: default@amvdo_mat_view
 POSTHOOK: query: create materialized view amvdo_mat_view as select a, c from amvdo_table
-POSTHOOK: type: CREATEVIEW
+POSTHOOK: type: CREATE_MATERIALIZED_VIEW
 POSTHOOK: Input: default@amvdo_table
 POSTHOOK: Output: database:default
 POSTHOOK: Output: default@amvdo_mat_view
-FAILED: HiveAccessControlException Permission denied: Principal [name=user2, type=USER] does not have following privileges for operation DROPTABLE [[OBJECT OWNERSHIP] on Object [type=TABLE_OR_VIEW, name=default.amvdo_mat_view]]
+FAILED: HiveAccessControlException Permission denied: Principal [name=user2, type=USER] does not have following privileges for operation DROP_MATERIALIZED_VIEW [[OBJECT OWNERSHIP] on Object [type=TABLE_OR_VIEW, name=default.amvdo_mat_view], [OBJECT OWNERSHIP] on Object [type=TABLE_OR_VIEW, name=default.amvdo_mat_view]]

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/test/results/clientnegative/materialized_view_authorization_no_select_perm.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/materialized_view_authorization_no_select_perm.q.out b/ql/src/test/results/clientnegative/materialized_view_authorization_no_select_perm.q.out
index a3a3405..57f992f 100644
--- a/ql/src/test/results/clientnegative/materialized_view_authorization_no_select_perm.q.out
+++ b/ql/src/test/results/clientnegative/materialized_view_authorization_no_select_perm.q.out
@@ -18,12 +18,12 @@ POSTHOOK: Lineage: amvnsp_table.a EXPRESSION [(values__tmp__table__1)values__tmp
 POSTHOOK: Lineage: amvnsp_table.b EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ]
 POSTHOOK: Lineage: amvnsp_table.c EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col3, type:string, comment:), ]
 PREHOOK: query: create materialized view amvnsp_mat_view as select a, c from amvnsp_table
-PREHOOK: type: CREATEVIEW
+PREHOOK: type: CREATE_MATERIALIZED_VIEW
 PREHOOK: Input: default@amvnsp_table
 PREHOOK: Output: database:default
 PREHOOK: Output: default@amvnsp_mat_view
 POSTHOOK: query: create materialized view amvnsp_mat_view as select a, c from amvnsp_table
-POSTHOOK: type: CREATEVIEW
+POSTHOOK: type: CREATE_MATERIALIZED_VIEW
 POSTHOOK: Input: default@amvnsp_table
 POSTHOOK: Output: database:default
 POSTHOOK: Output: default@amvnsp_mat_view

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/test/results/clientnegative/materialized_view_authorization_rebuild_no_grant.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/materialized_view_authorization_rebuild_no_grant.q.out b/ql/src/test/results/clientnegative/materialized_view_authorization_rebuild_no_grant.q.out
deleted file mode 100644
index dc7a58d..0000000
--- a/ql/src/test/results/clientnegative/materialized_view_authorization_rebuild_no_grant.q.out
+++ /dev/null
@@ -1,42 +0,0 @@
-PREHOOK: query: create table amvrng_table (a int, b varchar(256), c decimal(10,2))
-PREHOOK: type: CREATETABLE
-PREHOOK: Output: database:default
-PREHOOK: Output: default@amvrng_table
-POSTHOOK: query: create table amvrng_table (a int, b varchar(256), c decimal(10,2))
-POSTHOOK: type: CREATETABLE
-POSTHOOK: Output: database:default
-POSTHOOK: Output: default@amvrng_table
-PREHOOK: query: insert into amvrng_table values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
-PREHOOK: type: QUERY
-PREHOOK: Input: default@values__tmp__table__1
-PREHOOK: Output: default@amvrng_table
-POSTHOOK: query: insert into amvrng_table values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
-POSTHOOK: type: QUERY
-POSTHOOK: Input: default@values__tmp__table__1
-POSTHOOK: Output: default@amvrng_table
-POSTHOOK: Lineage: amvrng_table.a EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ]
-POSTHOOK: Lineage: amvrng_table.b EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ]
-POSTHOOK: Lineage: amvrng_table.c EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col3, type:string, comment:), ]
-PREHOOK: query: grant select on table amvrng_table to user user2 with grant option
-PREHOOK: type: GRANT_PRIVILEGE
-PREHOOK: Output: default@amvrng_table
-POSTHOOK: query: grant select on table amvrng_table to user user2 with grant option
-POSTHOOK: type: GRANT_PRIVILEGE
-POSTHOOK: Output: default@amvrng_table
-PREHOOK: query: create materialized view amvrng_mat_view as select a, c from amvrng_table
-PREHOOK: type: CREATEVIEW
-PREHOOK: Input: default@amvrng_table
-PREHOOK: Output: database:default
-PREHOOK: Output: default@amvrng_mat_view
-POSTHOOK: query: create materialized view amvrng_mat_view as select a, c from amvrng_table
-POSTHOOK: type: CREATEVIEW
-POSTHOOK: Input: default@amvrng_table
-POSTHOOK: Output: database:default
-POSTHOOK: Output: default@amvrng_mat_view
-PREHOOK: query: revoke grant option for select on table amvrng_table from user user2
-PREHOOK: type: REVOKE_PRIVILEGE
-PREHOOK: Output: default@amvrng_table
-POSTHOOK: query: revoke grant option for select on table amvrng_table from user user2
-POSTHOOK: type: REVOKE_PRIVILEGE
-POSTHOOK: Output: default@amvrng_table
-FAILED: HiveAccessControlException Permission denied: Principal [name=user2, type=USER] does not have following privileges for operation CREATE_MATERIALIZED_VIEW [[SELECT with grant] on Object [type=TABLE_OR_VIEW, name=default.amvrng_table]]

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/test/results/clientnegative/materialized_view_authorization_rebuild_other.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/materialized_view_authorization_rebuild_other.q.out b/ql/src/test/results/clientnegative/materialized_view_authorization_rebuild_other.q.out
deleted file mode 100644
index 9c25b52..0000000
--- a/ql/src/test/results/clientnegative/materialized_view_authorization_rebuild_other.q.out
+++ /dev/null
@@ -1,30 +0,0 @@
-PREHOOK: query: create table amvro_table (a int, b varchar(256), c decimal(10,2))
-PREHOOK: type: CREATETABLE
-PREHOOK: Output: database:default
-PREHOOK: Output: default@amvro_table
-POSTHOOK: query: create table amvro_table (a int, b varchar(256), c decimal(10,2))
-POSTHOOK: type: CREATETABLE
-POSTHOOK: Output: database:default
-POSTHOOK: Output: default@amvro_table
-PREHOOK: query: insert into amvro_table values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
-PREHOOK: type: QUERY
-PREHOOK: Input: default@values__tmp__table__1
-PREHOOK: Output: default@amvro_table
-POSTHOOK: query: insert into amvro_table values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
-POSTHOOK: type: QUERY
-POSTHOOK: Input: default@values__tmp__table__1
-POSTHOOK: Output: default@amvro_table
-POSTHOOK: Lineage: amvro_table.a EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ]
-POSTHOOK: Lineage: amvro_table.b EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ]
-POSTHOOK: Lineage: amvro_table.c EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col3, type:string, comment:), ]
-PREHOOK: query: create materialized view amvro_mat_view as select a, c from amvro_table
-PREHOOK: type: CREATEVIEW
-PREHOOK: Input: default@amvro_table
-PREHOOK: Output: database:default
-PREHOOK: Output: default@amvro_mat_view
-POSTHOOK: query: create materialized view amvro_mat_view as select a, c from amvro_table
-POSTHOOK: type: CREATEVIEW
-POSTHOOK: Input: default@amvro_table
-POSTHOOK: Output: database:default
-POSTHOOK: Output: default@amvro_mat_view
-FAILED: HiveAccessControlException Permission denied: Principal [name=user2, type=USER] does not have following privileges for operation CREATE_MATERIALIZED_VIEW [[SELECT with grant] on Object [type=TABLE_OR_VIEW, name=default.amvro_table]]

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/test/results/clientnegative/materialized_view_delete.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/materialized_view_delete.q.out b/ql/src/test/results/clientnegative/materialized_view_delete.q.out
index 6013e1c..c4a5887 100644
--- a/ql/src/test/results/clientnegative/materialized_view_delete.q.out
+++ b/ql/src/test/results/clientnegative/materialized_view_delete.q.out
@@ -7,13 +7,13 @@ POSTHOOK: type: CREATETABLE
 POSTHOOK: Output: database:default
 POSTHOOK: Output: default@dmv_basetable
 PREHOOK: query: create materialized view dmv_mat_view as select a, b, c from dmv_basetable
-PREHOOK: type: CREATEVIEW
+PREHOOK: type: CREATE_MATERIALIZED_VIEW
 PREHOOK: Input: default@dmv_basetable
 PREHOOK: Output: database:default
 PREHOOK: Output: default@dmv_mat_view
 POSTHOOK: query: create materialized view dmv_mat_view as select a, b, c from dmv_basetable
-POSTHOOK: type: CREATEVIEW
+POSTHOOK: type: CREATE_MATERIALIZED_VIEW
 POSTHOOK: Input: default@dmv_basetable
 POSTHOOK: Output: database:default
 POSTHOOK: Output: default@dmv_mat_view
-FAILED: SemanticException [Error 10304]: You cannot update or delete records in a view
+FAILED: SemanticException [Error 10402]: You cannot update or delete records in a view

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/test/results/clientnegative/materialized_view_drop.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/materialized_view_drop.q.out b/ql/src/test/results/clientnegative/materialized_view_drop.q.out
new file mode 100644
index 0000000..f3ac66c
--- /dev/null
+++ b/ql/src/test/results/clientnegative/materialized_view_drop.q.out
@@ -0,0 +1,42 @@
+PREHOOK: query: create table cmv_basetable (a int, b varchar(256), c decimal(10,2))
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@cmv_basetable
+POSTHOOK: query: create table cmv_basetable (a int, b varchar(256), c decimal(10,2))
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@cmv_basetable
+PREHOOK: query: insert into cmv_basetable values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@values__tmp__table__1
+PREHOOK: Output: default@cmv_basetable
+POSTHOOK: query: insert into cmv_basetable values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@values__tmp__table__1
+POSTHOOK: Output: default@cmv_basetable
+POSTHOOK: Lineage: cmv_basetable.a EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ]
+POSTHOOK: Lineage: cmv_basetable.b EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ]
+POSTHOOK: Lineage: cmv_basetable.c EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col3, type:string, comment:), ]
+PREHOOK: query: create materialized view cmv_mat_view as select a, b, c from cmv_basetable
+PREHOOK: type: CREATE_MATERIALIZED_VIEW
+PREHOOK: Input: default@cmv_basetable
+PREHOOK: Output: database:default
+PREHOOK: Output: default@cmv_mat_view
+POSTHOOK: query: create materialized view cmv_mat_view as select a, b, c from cmv_basetable
+POSTHOOK: type: CREATE_MATERIALIZED_VIEW
+POSTHOOK: Input: default@cmv_basetable
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@cmv_mat_view
+PREHOOK: query: drop materialized view cmv_mat_view
+PREHOOK: type: DROP_MATERIALIZED_VIEW
+PREHOOK: Input: default@cmv_mat_view
+PREHOOK: Output: default@cmv_mat_view
+POSTHOOK: query: drop materialized view cmv_mat_view
+POSTHOOK: type: DROP_MATERIALIZED_VIEW
+POSTHOOK: Input: default@cmv_mat_view
+POSTHOOK: Output: default@cmv_mat_view
+PREHOOK: query: drop materialized view cmv_basetable
+PREHOOK: type: DROP_MATERIALIZED_VIEW
+PREHOOK: Input: default@cmv_basetable
+PREHOOK: Output: default@cmv_basetable
+FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Cannot drop a base table with DROP MATERIALIZED VIEW

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/test/results/clientnegative/materialized_view_drop2.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/materialized_view_drop2.q.out b/ql/src/test/results/clientnegative/materialized_view_drop2.q.out
new file mode 100644
index 0000000..46a9e1f
--- /dev/null
+++ b/ql/src/test/results/clientnegative/materialized_view_drop2.q.out
@@ -0,0 +1,34 @@
+PREHOOK: query: create table cmv_basetable (a int, b varchar(256), c decimal(10,2))
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@cmv_basetable
+POSTHOOK: query: create table cmv_basetable (a int, b varchar(256), c decimal(10,2))
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@cmv_basetable
+PREHOOK: query: insert into cmv_basetable values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@values__tmp__table__1
+PREHOOK: Output: default@cmv_basetable
+POSTHOOK: query: insert into cmv_basetable values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@values__tmp__table__1
+POSTHOOK: Output: default@cmv_basetable
+POSTHOOK: Lineage: cmv_basetable.a EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ]
+POSTHOOK: Lineage: cmv_basetable.b EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ]
+POSTHOOK: Lineage: cmv_basetable.c EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col3, type:string, comment:), ]
+PREHOOK: query: create materialized view cmv_mat_view as select a, b, c from cmv_basetable
+PREHOOK: type: CREATE_MATERIALIZED_VIEW
+PREHOOK: Input: default@cmv_basetable
+PREHOOK: Output: database:default
+PREHOOK: Output: default@cmv_mat_view
+POSTHOOK: query: create materialized view cmv_mat_view as select a, b, c from cmv_basetable
+POSTHOOK: type: CREATE_MATERIALIZED_VIEW
+POSTHOOK: Input: default@cmv_basetable
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@cmv_mat_view
+PREHOOK: query: drop view cmv_mat_view
+PREHOOK: type: DROPVIEW
+PREHOOK: Input: default@cmv_mat_view
+PREHOOK: Output: default@cmv_mat_view
+FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Cannot drop a materialized view with DROP VIEW

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/test/results/clientnegative/materialized_view_insert.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/materialized_view_insert.q.out b/ql/src/test/results/clientnegative/materialized_view_insert.q.out
index 08b9a78..3e1f591 100644
--- a/ql/src/test/results/clientnegative/materialized_view_insert.q.out
+++ b/ql/src/test/results/clientnegative/materialized_view_insert.q.out
@@ -7,12 +7,12 @@ POSTHOOK: type: CREATETABLE
 POSTHOOK: Output: database:default
 POSTHOOK: Output: default@imv_basetable
 PREHOOK: query: create materialized view imv_mat_view as select a, b, c from imv_basetable
-PREHOOK: type: CREATEVIEW
+PREHOOK: type: CREATE_MATERIALIZED_VIEW
 PREHOOK: Input: default@imv_basetable
 PREHOOK: Output: database:default
 PREHOOK: Output: default@imv_mat_view
 POSTHOOK: query: create materialized view imv_mat_view as select a, b, c from imv_basetable
-POSTHOOK: type: CREATEVIEW
+POSTHOOK: type: CREATE_MATERIALIZED_VIEW
 POSTHOOK: Input: default@imv_basetable
 POSTHOOK: Output: database:default
 POSTHOOK: Output: default@imv_mat_view

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/test/results/clientnegative/materialized_view_load.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/materialized_view_load.q.out b/ql/src/test/results/clientnegative/materialized_view_load.q.out
index 4814365..b48bba4 100644
--- a/ql/src/test/results/clientnegative/materialized_view_load.q.out
+++ b/ql/src/test/results/clientnegative/materialized_view_load.q.out
@@ -7,12 +7,12 @@ POSTHOOK: type: CREATETABLE
 POSTHOOK: Output: database:default
 POSTHOOK: Output: default@lmv_basetable
 PREHOOK: query: create materialized view lmv_mat_view as select a, b, c from lmv_basetable
-PREHOOK: type: CREATEVIEW
+PREHOOK: type: CREATE_MATERIALIZED_VIEW
 PREHOOK: Input: default@lmv_basetable
 PREHOOK: Output: database:default
 PREHOOK: Output: default@lmv_mat_view
 POSTHOOK: query: create materialized view lmv_mat_view as select a, b, c from lmv_basetable
-POSTHOOK: type: CREATEVIEW
+POSTHOOK: type: CREATE_MATERIALIZED_VIEW
 POSTHOOK: Input: default@lmv_basetable
 POSTHOOK: Output: database:default
 POSTHOOK: Output: default@lmv_mat_view

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/test/results/clientnegative/materialized_view_replace_with_view.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/materialized_view_replace_with_view.q.out b/ql/src/test/results/clientnegative/materialized_view_replace_with_view.q.out
index dac3538..45160ad 100644
--- a/ql/src/test/results/clientnegative/materialized_view_replace_with_view.q.out
+++ b/ql/src/test/results/clientnegative/materialized_view_replace_with_view.q.out
@@ -18,13 +18,13 @@ POSTHOOK: Lineage: rmvwv_basetable.a EXPRESSION [(values__tmp__table__1)values__
 POSTHOOK: Lineage: rmvwv_basetable.b EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ]
 POSTHOOK: Lineage: rmvwv_basetable.c EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col3, type:string, comment:), ]
 PREHOOK: query: create materialized view rmvwv_mat_view as select a, b, c from rmvwv_basetable
-PREHOOK: type: CREATEVIEW
+PREHOOK: type: CREATE_MATERIALIZED_VIEW
 PREHOOK: Input: default@rmvwv_basetable
 PREHOOK: Output: database:default
 PREHOOK: Output: default@rmvwv_mat_view
 POSTHOOK: query: create materialized view rmvwv_mat_view as select a, b, c from rmvwv_basetable
-POSTHOOK: type: CREATEVIEW
+POSTHOOK: type: CREATE_MATERIALIZED_VIEW
 POSTHOOK: Input: default@rmvwv_basetable
 POSTHOOK: Output: database:default
 POSTHOOK: Output: default@rmvwv_mat_view
-FAILED: SemanticException [Error 10303]: Attempt to replace materialized view rmvwv_mat_view with view
+FAILED: SemanticException [Error 10401]: Attempt to replace materialized view rmvwv_mat_view with view

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/test/results/clientnegative/materialized_view_update.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/materialized_view_update.q.out b/ql/src/test/results/clientnegative/materialized_view_update.q.out
index bee63a8..b9e7761 100644
--- a/ql/src/test/results/clientnegative/materialized_view_update.q.out
+++ b/ql/src/test/results/clientnegative/materialized_view_update.q.out
@@ -7,13 +7,13 @@ POSTHOOK: type: CREATETABLE
 POSTHOOK: Output: database:default
 POSTHOOK: Output: default@umv_basetable
 PREHOOK: query: create materialized view umv_mat_view as select a, b, c from umv_basetable
-PREHOOK: type: CREATEVIEW
+PREHOOK: type: CREATE_MATERIALIZED_VIEW
 PREHOOK: Input: default@umv_basetable
 PREHOOK: Output: database:default
 PREHOOK: Output: default@umv_mat_view
 POSTHOOK: query: create materialized view umv_mat_view as select a, b, c from umv_basetable
-POSTHOOK: type: CREATEVIEW
+POSTHOOK: type: CREATE_MATERIALIZED_VIEW
 POSTHOOK: Input: default@umv_basetable
 POSTHOOK: Output: database:default
 POSTHOOK: Output: default@umv_mat_view
-FAILED: SemanticException [Error 10304]: You cannot update or delete records in a view
+FAILED: SemanticException [Error 10402]: You cannot update or delete records in a view

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/test/results/clientnegative/view_delete.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/view_delete.q.out b/ql/src/test/results/clientnegative/view_delete.q.out
index 3e72344..24e7ba5 100644
--- a/ql/src/test/results/clientnegative/view_delete.q.out
+++ b/ql/src/test/results/clientnegative/view_delete.q.out
@@ -16,4 +16,4 @@ POSTHOOK: type: CREATEVIEW
 POSTHOOK: Input: default@dv_basetable
 POSTHOOK: Output: database:default
 POSTHOOK: Output: default@dv_view
-FAILED: SemanticException [Error 10304]: You cannot update or delete records in a view
+FAILED: SemanticException [Error 10402]: You cannot update or delete records in a view

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/test/results/clientnegative/view_update.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/view_update.q.out b/ql/src/test/results/clientnegative/view_update.q.out
index 8a12665..aaee442 100644
--- a/ql/src/test/results/clientnegative/view_update.q.out
+++ b/ql/src/test/results/clientnegative/view_update.q.out
@@ -16,4 +16,4 @@ POSTHOOK: type: CREATEVIEW
 POSTHOOK: Input: default@uv_basetable
 POSTHOOK: Output: database:default
 POSTHOOK: Output: default@uv_view
-FAILED: SemanticException [Error 10304]: You cannot update or delete records in a view
+FAILED: SemanticException [Error 10402]: You cannot update or delete records in a view

http://git-wip-us.apache.org/repos/asf/hive/blob/5179558c/ql/src/test/results/clientpositive/materialized_view_authorization_sqlstd.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/materialized_view_authorization_sqlstd.q.out b/ql/src/test/results/clientpositive/materialized_view_authorization_sqlstd.q.out
index b167702..25f081b 100644
--- a/ql/src/test/results/clientpositive/materialized_view_authorization_sqlstd.q.out
+++ b/ql/src/test/results/clientpositive/materialized_view_authorization_sqlstd.q.out
@@ -18,12 +18,12 @@ POSTHOOK: Lineage: amvs_table.a EXPRESSION [(values__tmp__table__1)values__tmp__
 POSTHOOK: Lineage: amvs_table.b EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ]
 POSTHOOK: Lineage: amvs_table.c EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col3, type:string, comment:), ]
 PREHOOK: query: create materialized view amvs_mat_view as select a, c from amvs_table
-PREHOOK: type: CREATEVIEW
+PREHOOK: type: CREATE_MATERIALIZED_VIEW
 PREHOOK: Input: default@amvs_table
 PREHOOK: Output: database:default
 PREHOOK: Output: default@amvs_mat_view
 POSTHOOK: query: create materialized view amvs_mat_view as select a, c from amvs_table
-POSTHOOK: type: CREATEVIEW
+POSTHOOK: type: CREATE_MATERIALIZED_VIEW
 POSTHOOK: Input: default@amvs_table
 POSTHOOK: Output: database:default
 POSTHOOK: Output: default@amvs_mat_view
@@ -54,11 +54,11 @@ POSTHOOK: query: select * from amvs_mat_view
 POSTHOOK: type: QUERY
 POSTHOOK: Input: default@amvs_mat_view
 #### A masked pattern was here ####
-1	10.3
+1	10.30
 2	3.14
-2	172342.2
+2	172342.20
 3	978.76
-3	9.8
+3	9.80
 PREHOOK: query: show grant user user3 on table amvs_mat_view
 PREHOOK: type: SHOW_GRANT
 POSTHOOK: query: show grant user user3 on table amvs_mat_view
@@ -137,21 +137,11 @@ POSTHOOK: query: select * from amvs_mat_view
 POSTHOOK: type: QUERY
 POSTHOOK: Input: default@amvs_mat_view
 #### A masked pattern was here ####
-1	10.3
+1	10.30
 2	3.14
-2	172342.2
+2	172342.20
 3	978.76
-3	9.8
-PREHOOK: query: alter materialized view amvs_mat_view rebuild
-PREHOOK: type: CREATEVIEW
-PREHOOK: Input: default@amvs_table
-PREHOOK: Output: database:default
-PREHOOK: Output: default@amvs_mat_view
-POSTHOOK: query: alter materialized view amvs_mat_view rebuild
-POSTHOOK: type: CREATEVIEW
-POSTHOOK: Input: default@amvs_table
-POSTHOOK: Output: database:default
-POSTHOOK: Output: default@amvs_mat_view
+3	9.80
 PREHOOK: query: grant select on table amvs_table to user user2 with grant option
 PREHOOK: type: GRANT_PRIVILEGE
 PREHOOK: Output: default@amvs_table
@@ -159,12 +149,12 @@ POSTHOOK: query: grant select on table amvs_table to user user2 with grant optio
 POSTHOOK: type: GRANT_PRIVILEGE
 POSTHOOK: Output: default@amvs_table
 PREHOOK: query: create materialized view amvs_mat_view2 as select a, b from amvs_table
-PREHOOK: type: CREATEVIEW
+PREHOOK: type: CREATE_MATERIALIZED_VIEW
 PREHOOK: Input: default@amvs_table
 PREHOOK: Output: database:default
 PREHOOK: Output: default@amvs_mat_view2
 POSTHOOK: query: create materialized view amvs_mat_view2 as select a, b from amvs_table
-POSTHOOK: type: CREATEVIEW
+POSTHOOK: type: CREATE_MATERIALIZED_VIEW
 POSTHOOK: Input: default@amvs_table
 POSTHOOK: Output: database:default
 POSTHOOK: Output: default@amvs_mat_view2
@@ -182,11 +172,11 @@ POSTHOOK: Input: default@amvs_mat_view2
 3	calvin
 3	charlie
 PREHOOK: query: drop materialized view amvs_mat_view2
-PREHOOK: type: DROPTABLE
+PREHOOK: type: DROP_MATERIALIZED_VIEW
 PREHOOK: Input: default@amvs_mat_view2
 PREHOOK: Output: default@amvs_mat_view2
 POSTHOOK: query: drop materialized view amvs_mat_view2
-POSTHOOK: type: DROPTABLE
+POSTHOOK: type: DROP_MATERIALIZED_VIEW
 POSTHOOK: Input: default@amvs_mat_view2
 POSTHOOK: Output: default@amvs_mat_view2
 PREHOOK: query: set role ADMIN