Index: ql/src/test/results/clientpositive/create_like_view.q.out =================================================================== --- ql/src/test/results/clientpositive/create_like_view.q.out (revision 0) +++ ql/src/test/results/clientpositive/create_like_view.q.out (revision 0) @@ -0,0 +1,173 @@ +PREHOOK: query: DROP TABLE IF EXISTS table1 +PREHOOK: type: DROPTABLE +POSTHOOK: query: DROP TABLE IF EXISTS table1 +POSTHOOK: type: DROPTABLE +PREHOOK: query: DROP TABLE IF EXISTS table2 +PREHOOK: type: DROPTABLE +POSTHOOK: query: DROP TABLE IF EXISTS table2 +POSTHOOK: type: DROPTABLE +PREHOOK: query: DROP TABLE IF EXISTS table3 +PREHOOK: type: DROPTABLE +POSTHOOK: query: DROP TABLE IF EXISTS table3 +POSTHOOK: type: DROPTABLE +PREHOOK: query: DROP VIEW IF EXISTS view1 +PREHOOK: type: DROPVIEW +POSTHOOK: query: DROP VIEW IF EXISTS view1 +POSTHOOK: type: DROPVIEW +PREHOOK: query: CREATE TABLE table1 (a STRING, b STRING) STORED AS TEXTFILE +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE table1 (a STRING, b STRING) STORED AS TEXTFILE +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@table1 +PREHOOK: query: DESCRIBE table1 +PREHOOK: type: DESCTABLE +POSTHOOK: query: DESCRIBE table1 +POSTHOOK: type: DESCTABLE +a string +b string +PREHOOK: query: DESCRIBE EXTENDED table1 +PREHOOK: type: DESCTABLE +POSTHOOK: query: DESCRIBE EXTENDED table1 +POSTHOOK: type: DESCTABLE +a string +b string + +Detailed Table Information Table(tableName:table1, dbName:default, owner:charleschen, createTime:1310160368, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:a, type:string, comment:null), FieldSchema(name:b, type:string, comment:null)], location:pfile:/Users/charleschen/hive-trunk/build/ql/test/data/warehouse/table1, inputFormat:org.apache.hadoop.mapred.TextInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, parameters:{serialization.format=1}), bucketCols:[], sortCols:[], parameters:{}), partitionKeys:[], parameters:{transient_lastDdlTime=1310160368}, viewOriginalText:null, viewExpandedText:null, tableType:MANAGED_TABLE) +PREHOOK: query: CREATE VIEW view1 AS SELECT * FROM table1 +PREHOOK: type: CREATEVIEW +PREHOOK: Output: file:/var/folders/fe/fefl-ow3ElaEd1ns0G7jB0uewEQ/-Tmp-/charleschen/hive_2011-07-08_14-26-08_958_8479798427408599978/-mr-10000 +POSTHOOK: query: CREATE VIEW view1 AS SELECT * FROM table1 +POSTHOOK: type: CREATEVIEW +POSTHOOK: Output: default@view1 +POSTHOOK: Output: file:/var/folders/fe/fefl-ow3ElaEd1ns0G7jB0uewEQ/-Tmp-/charleschen/hive_2011-07-08_14-26-08_958_8479798427408599978/-mr-10000 +PREHOOK: query: CREATE TABLE table2 LIKE view1 +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE table2 LIKE view1 +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@table2 +PREHOOK: query: DESCRIBE table2 +PREHOOK: type: DESCTABLE +POSTHOOK: query: DESCRIBE table2 +POSTHOOK: type: DESCTABLE +a string +b string +PREHOOK: query: DESCRIBE EXTENDED table2 +PREHOOK: type: DESCTABLE +POSTHOOK: query: DESCRIBE EXTENDED table2 +POSTHOOK: type: DESCTABLE +a string +b string + +Detailed Table Information Table(tableName:table2, dbName:default, owner:charleschen, createTime:1310160369, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:a, type:string, comment:null), FieldSchema(name:b, type:string, comment:null)], location:pfile:/Users/charleschen/hive-trunk/build/ql/test/data/warehouse/table2, inputFormat:org.apache.hadoop.mapred.TextInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, parameters:{}), bucketCols:[], sortCols:[], parameters:{}), partitionKeys:[], parameters:{transient_lastDdlTime=1310160369}, viewOriginalText:null, viewExpandedText:null, tableType:MANAGED_TABLE) +PREHOOK: query: CREATE TABLE IF NOT EXISTS table2 LIKE view1 +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE IF NOT EXISTS table2 LIKE view1 +POSTHOOK: type: CREATETABLE +PREHOOK: query: CREATE EXTERNAL TABLE IF NOT EXISTS table2 LIKE view1 +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE EXTERNAL TABLE IF NOT EXISTS table2 LIKE view1 +POSTHOOK: type: CREATETABLE +PREHOOK: query: CREATE EXTERNAL TABLE IF NOT EXISTS table3 LIKE view1 +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE EXTERNAL TABLE IF NOT EXISTS table3 LIKE view1 +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@table3 +PREHOOK: query: DESCRIBE table3 +PREHOOK: type: DESCTABLE +POSTHOOK: query: DESCRIBE table3 +POSTHOOK: type: DESCTABLE +a string +b string +PREHOOK: query: DESCRIBE EXTENDED table3 +PREHOOK: type: DESCTABLE +POSTHOOK: query: DESCRIBE EXTENDED table3 +POSTHOOK: type: DESCTABLE +a string +b string + +Detailed Table Information Table(tableName:table3, dbName:default, owner:charleschen, createTime:1310160369, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:a, type:string, comment:null), FieldSchema(name:b, type:string, comment:null)], location:pfile:/Users/charleschen/hive-trunk/build/ql/test/data/warehouse/table3, inputFormat:org.apache.hadoop.mapred.TextInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, parameters:{}), bucketCols:[], sortCols:[], parameters:{}), partitionKeys:[], parameters:{transient_lastDdlTime=1310160369}, viewOriginalText:null, viewExpandedText:null, tableType:MANAGED_TABLE) +PREHOOK: query: INSERT OVERWRITE TABLE table1 SELECT key, value FROM src WHERE key = 86 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: default@table1 +POSTHOOK: query: INSERT OVERWRITE TABLE table1 SELECT key, value FROM src WHERE key = 86 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: default@table1 +POSTHOOK: Lineage: table1.a SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: table1.b SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +PREHOOK: query: INSERT OVERWRITE TABLE table2 SELECT key, value FROM src WHERE key = 100 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: default@table2 +POSTHOOK: query: INSERT OVERWRITE TABLE table2 SELECT key, value FROM src WHERE key = 100 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: default@table2 +POSTHOOK: Lineage: table1.a SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: table1.b SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +POSTHOOK: Lineage: table2.a SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: table2.b SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +PREHOOK: query: SELECT * FROM table1 +PREHOOK: type: QUERY +PREHOOK: Input: default@table1 +PREHOOK: Output: file:/var/folders/fe/fefl-ow3ElaEd1ns0G7jB0uewEQ/-Tmp-/charleschen/hive_2011-07-08_14-26-21_893_616878183980516519/-mr-10000 +POSTHOOK: query: SELECT * FROM table1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@table1 +POSTHOOK: Output: file:/var/folders/fe/fefl-ow3ElaEd1ns0G7jB0uewEQ/-Tmp-/charleschen/hive_2011-07-08_14-26-21_893_616878183980516519/-mr-10000 +POSTHOOK: Lineage: table1.a SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: table1.b SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +POSTHOOK: Lineage: table2.a SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: table2.b SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +86 val_86 +PREHOOK: query: SELECT * FROM table2 +PREHOOK: type: QUERY +PREHOOK: Input: default@table2 +PREHOOK: Output: file:/var/folders/fe/fefl-ow3ElaEd1ns0G7jB0uewEQ/-Tmp-/charleschen/hive_2011-07-08_14-26-22_035_5052301634320103924/-mr-10000 +POSTHOOK: query: SELECT * FROM table2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@table2 +POSTHOOK: Output: file:/var/folders/fe/fefl-ow3ElaEd1ns0G7jB0uewEQ/-Tmp-/charleschen/hive_2011-07-08_14-26-22_035_5052301634320103924/-mr-10000 +POSTHOOK: Lineage: table1.a SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: table1.b SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +POSTHOOK: Lineage: table2.a SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: table2.b SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +100 val_100 +100 val_100 +PREHOOK: query: DROP TABLE table1 +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@table1 +PREHOOK: Output: default@table1 +POSTHOOK: query: DROP TABLE table1 +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@table1 +POSTHOOK: Output: default@table1 +POSTHOOK: Lineage: table1.a SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: table1.b SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +POSTHOOK: Lineage: table2.a SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: table2.b SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +PREHOOK: query: DROP TABLE table2 +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@table2 +PREHOOK: Output: default@table2 +POSTHOOK: query: DROP TABLE table2 +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@table2 +POSTHOOK: Output: default@table2 +POSTHOOK: Lineage: table1.a SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: table1.b SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +POSTHOOK: Lineage: table2.a SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: table2.b SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +PREHOOK: query: DROP VIEW view1 +PREHOOK: type: DROPVIEW +PREHOOK: Input: default@view1 +PREHOOK: Output: default@view1 +POSTHOOK: query: DROP VIEW view1 +POSTHOOK: type: DROPVIEW +POSTHOOK: Input: default@view1 +POSTHOOK: Output: default@view1 +POSTHOOK: Lineage: table1.a SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: table1.b SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +POSTHOOK: Lineage: table2.a SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: table2.b SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] Index: ql/src/test/queries/clientpositive/create_like_view.q =================================================================== --- ql/src/test/queries/clientpositive/create_like_view.q (revision 0) +++ ql/src/test/queries/clientpositive/create_like_view.q (revision 0) @@ -0,0 +1,32 @@ +DROP TABLE IF EXISTS table1; +DROP TABLE IF EXISTS table2; +DROP TABLE IF EXISTS table3; +DROP VIEW IF EXISTS view1; + +CREATE TABLE table1 (a STRING, b STRING) STORED AS TEXTFILE; +DESCRIBE table1; +DESCRIBE EXTENDED table1; + +CREATE VIEW view1 AS SELECT * FROM table1; + +CREATE TABLE table2 LIKE view1; +DESCRIBE table2; +DESCRIBE EXTENDED table2; + +CREATE TABLE IF NOT EXISTS table2 LIKE view1; + +CREATE EXTERNAL TABLE IF NOT EXISTS table2 LIKE view1; + +CREATE EXTERNAL TABLE IF NOT EXISTS table3 LIKE view1; +DESCRIBE table3; +DESCRIBE EXTENDED table3; + +INSERT OVERWRITE TABLE table1 SELECT key, value FROM src WHERE key = 86; +INSERT OVERWRITE TABLE table2 SELECT key, value FROM src WHERE key = 100; + +SELECT * FROM table1; +SELECT * FROM table2; + +DROP TABLE table1; +DROP TABLE table2; +DROP VIEW view1; Index: ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java (revision 1144394) +++ ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java (working copy) @@ -3259,8 +3259,31 @@ tbl.setDbName(newTable.getDbName()); tbl.setTableName(newTable.getTableName()); + // here, support CREATE TABLE LIKE view + if(tbl.getTableType()==TableType.VIRTUAL_VIEW){ + //we materialize the new table instead of keeping it as a view + tbl.setTableType(TableType.MANAGED_TABLE); + + //clear the view query text + tbl.setViewOriginalText(null); + tbl.setViewExpandedText(null); + + if (crtTbl.getDefaultSerName() == null) { + LOG.info("Default to LazySimpleSerDe for table " + crtTbl.getTableName()); + tbl.setSerializationLib(org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe.class.getName()); + } else { + // let's validate that the serde exists + validateSerDe(crtTbl.getDefaultSerName()); + tbl.setSerializationLib(crtTbl.getDefaultSerName()); + } + + tbl.setInputFormatClass(crtTbl.getDefaultInputFormat()); + tbl.setOutputFormatClass(crtTbl.getDefaultOutputFormat()); + } + if (crtTbl.isExternal()) { tbl.setProperty("EXTERNAL", "TRUE"); + tbl.setTableType(TableType.EXTERNAL_TABLE); } else { tbl.setProperty("EXTERNAL", "FALSE"); } Index: ql/src/java/org/apache/hadoop/hive/ql/plan/CreateTableLikeDesc.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/plan/CreateTableLikeDesc.java (revision 1144394) +++ ql/src/java/org/apache/hadoop/hive/ql/plan/CreateTableLikeDesc.java (working copy) @@ -19,6 +19,7 @@ package org.apache.hadoop.hive.ql.plan; import java.io.Serializable; +import java.util.Map; /** * CreateTableLikeDesc. @@ -29,6 +30,10 @@ private static final long serialVersionUID = 1L; String tableName; boolean isExternal; + String defaultInputFormat; + String defaultOutputFormat; + String defaultSerName; + Map defaultSerdeProps; String location; boolean ifNotExists; String likeTableName; @@ -37,9 +42,15 @@ } public CreateTableLikeDesc(String tableName, boolean isExternal, - String location, boolean ifNotExists, String likeTableName) { + String defaultInputFormat, String defaultOutputFormat, String location, + String defaultSerName, Map defaultSerdeProps, boolean ifNotExists, + String likeTableName) { this.tableName = tableName; this.isExternal = isExternal; + this.defaultInputFormat=defaultInputFormat; + this.defaultOutputFormat=defaultOutputFormat; + this.defaultSerName=defaultSerName; + this.defaultSerdeProps=defaultSerdeProps; this.location = location; this.ifNotExists = ifNotExists; this.likeTableName = likeTableName; @@ -63,6 +74,24 @@ this.tableName = tableName; } + @Explain(displayName = "default input format") + public String getDefaultInputFormat() { + return defaultInputFormat; + } + + public void setInputFormat(String inputFormat) { + this.defaultInputFormat = inputFormat; + } + + @Explain(displayName = "default output format") + public String getDefaultOutputFormat() { + return defaultOutputFormat; + } + + public void setOutputFormat(String outputFormat) { + this.defaultOutputFormat = outputFormat; + } + @Explain(displayName = "location") public String getLocation() { return location; @@ -81,6 +110,38 @@ this.isExternal = isExternal; } + /** + * @return the default serDeName + */ + @Explain(displayName = "default serde name") + public String getDefaultSerName() { + return defaultSerName; + } + + /** + * @param serName + * the serName to set + */ + public void setDefaultSerName(String serName) { + this.defaultSerName = serName; + } + + /** + * @return the default serDe properties + */ + @Explain(displayName = "serde properties") + public Map getDefaultSerdeProps() { + return defaultSerdeProps; + } + + /** + * @param serdeProps + * the default serde properties to set + */ + public void setDefaultSerdeProps(Map serdeProps) { + this.defaultSerdeProps = serdeProps; + } + @Explain(displayName = "like") public String getLikeTableName() { return likeTableName; Index: ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java (revision 1144394) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java (working copy) @@ -7717,8 +7717,9 @@ break; case CTLT: // create table like - CreateTableLikeDesc crtTblLikeDesc = new CreateTableLikeDesc(tableName, - isExt, location, ifNotExists, likeTableName); + CreateTableLikeDesc crtTblLikeDesc = new CreateTableLikeDesc(tableName, isExt, + storageFormat.inputFormat, storageFormat.outputFormat, location, + shared.serde, shared.serdeProps, ifNotExists, likeTableName); SessionState.get().setCommandType(HiveOperation.CREATETABLE); rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(), crtTblLikeDesc), conf));