diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java index 6fca9f7..0fe09aa 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java @@ -93,6 +93,7 @@ import org.apache.hadoop.hive.ql.QueryPlan; import org.apache.hadoop.hive.ql.exec.ArchiveUtils.PartSpecInfo; import org.apache.hadoop.hive.ql.exec.tez.TezTask; +import org.apache.hadoop.hive.ql.hooks.LineageInfo.DataContainer; import org.apache.hadoop.hive.ql.hooks.ReadEntity; import org.apache.hadoop.hive.ql.hooks.WriteEntity; import org.apache.hadoop.hive.ql.io.AcidUtils; @@ -3914,6 +3915,13 @@ private int createTable(Hive db, CreateTableDesc crtTbl) throws HiveException { } } else { db.createTable(tbl, crtTbl.getIfNotExists()); + if ( crtTbl.isCTAS()) { + Table createdTable = db.getTable(tbl.getDbName(), tbl.getTableName()); + DataContainer dc = new DataContainer(createdTable.getTTable()); + SessionState.get().getLineageState().setLineage( + createdTable.getPath(), dc, createdTable.getCols() + ); + } } work.getOutputs().add(new WriteEntity(tbl, WriteEntity.WriteType.DDL_NO_LOCK)); return 0; diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java index 8a06582..1391124 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java @@ -6896,6 +6896,19 @@ protected Operator genFileSinkPlan(String dest, QB qb, Operator input) if (ltd != null && SessionState.get() != null) { SessionState.get().getLineageState() .mapDirToFop(ltd.getSourcePath(), (FileSinkOperator) output); + } else if ( SessionState.get().getCommandType().equals(HiveOperation.CREATETABLE_AS_SELECT.getOperationName())) { + + Path tlocation = null; + String tName = Utilities.getDbTableName(tableDesc.getTableName())[1]; + try { + Warehouse wh = new Warehouse(conf); + tlocation = wh.getTablePath(db.getDatabase(tableDesc.getDatabaseName()), tName); + } catch (MetaException|HiveException e) { + throw new SemanticException(e); + } + + SessionState.get().getLineageState() + .mapDirToFop(tlocation, (FileSinkOperator) output); } if (LOG.isDebugEnabled()) { @@ -11289,7 +11302,7 @@ ASTNode analyzeCreateTable( rowFormatParams.lineDelim, comment, storageFormat.getInputFormat(), storageFormat.getOutputFormat(), location, storageFormat.getSerde(), storageFormat.getStorageHandler(), storageFormat.getSerdeProps(), tblProps, ifNotExists, - skewedColNames, skewedValues); + skewedColNames, skewedValues, true); tableDesc.setMaterialization(isMaterialization); tableDesc.setStoredAsSubDirectories(storedAsDirs); tableDesc.setNullFormat(rowFormatParams.nullFormat); diff --git ql/src/java/org/apache/hadoop/hive/ql/plan/CreateTableDesc.java ql/src/java/org/apache/hadoop/hive/ql/plan/CreateTableDesc.java index 8b2ac3b..03b4d8b 100644 --- ql/src/java/org/apache/hadoop/hive/ql/plan/CreateTableDesc.java +++ ql/src/java/org/apache/hadoop/hive/ql/plan/CreateTableDesc.java @@ -87,6 +87,7 @@ boolean isTemporary = false; private boolean isMaterialization = false; private boolean replaceMode = false; + private boolean isCTAS = false; public CreateTableDesc() { } @@ -111,6 +112,27 @@ public CreateTableDesc(String databaseName, String tableName, boolean isExternal this.databaseName = databaseName; } + public CreateTableDesc(String databaseName, String tableName, boolean isExternal, boolean isTemporary, + List cols, List partCols, + List bucketCols, List sortCols, int numBuckets, + String fieldDelim, String fieldEscape, String collItemDelim, + String mapKeyDelim, String lineDelim, String comment, String inputFormat, + String outputFormat, String location, String serName, + String storageHandler, + Map serdeProps, + Map tblProps, + boolean ifNotExists, List skewedColNames, List> skewedColValues, + boolean isCTAS) { + this(databaseName, tableName, isExternal, isTemporary, cols, partCols, + bucketCols, sortCols, numBuckets, fieldDelim, fieldEscape, + collItemDelim, mapKeyDelim, lineDelim, comment, inputFormat, + outputFormat, location, serName, storageHandler, serdeProps, + tblProps, ifNotExists, skewedColNames, skewedColValues); + this.isCTAS = isCTAS; + + } + + public CreateTableDesc(String tableName, boolean isExternal, boolean isTemporary, List cols, List partCols, List bucketCols, List sortCols, int numBuckets, @@ -589,6 +611,10 @@ public boolean getReplaceMode() { return replaceMode; } + public boolean isCTAS() { + return isCTAS; + } + public Table toTable(HiveConf conf) throws HiveException { String databaseName = getDatabaseName(); String tableName = getTableName();