diff --git data/files/struct3_a.txt data/files/struct3_a.txt deleted file mode 100644 index 19dbd7f..0000000 --- data/files/struct3_a.txt +++ /dev/null @@ -1,2 +0,0 @@ -1|true,200,72909,3244222,-99999999999|original -2|0,100,483777,14,-23866739993|original \ No newline at end of file diff --git data/files/struct3_b.txt data/files/struct3_b.txt deleted file mode 100644 index 030e0c0..0000000 --- data/files/struct3_b.txt +++ /dev/null @@ -1 +0,0 @@ -3|true,400,44388,-100,953967041.,62.079153,718.78,1,verdict,verdict,timestamp,date,binary|new \ No newline at end of file diff --git data/files/struct3_c.txt data/files/struct3_c.txt deleted file mode 100644 index 236694b..0000000 --- data/files/struct3_c.txt +++ /dev/null @@ -1 +0,0 @@ -4|false,-67,833,63993,1255178165.77663,905070.974,-4314.7918,-1240033819,trial,trial,2016-03-0703:02:22.0,2016-03-07,binary|new \ No newline at end of file diff --git data/files/struct5_a.txt data/files/struct5_a.txt new file mode 100644 index 0000000..3ed20d5 --- /dev/null +++ data/files/struct5_a.txt @@ -0,0 +1,2 @@ +1|original|true,200,72909,3244222,-99999999999|after_original +2|original|0,100,483777,14,-23866739993|after_original \ No newline at end of file diff --git data/files/struct5_b.txt data/files/struct5_b.txt new file mode 100644 index 0000000..e4df3f5 --- /dev/null +++ data/files/struct5_b.txt @@ -0,0 +1 @@ +3|new|true,400,44388,-100,953967041.,62.079153,718.78,1,verdict,verdict,1987-02-21 19:48:29.0|after_new \ No newline at end of file diff --git data/files/struct5_c.txt data/files/struct5_c.txt new file mode 100644 index 0000000..0f3c79c --- /dev/null +++ data/files/struct5_c.txt @@ -0,0 +1 @@ +4|new|false,-67,833,63993,1255178165.77663,905070.974,-4314.7918,-1240033819,trial,trial,2016-03-07 03:02:22.0|after_new \ No newline at end of file diff --git llap-server/src/java/org/apache/hadoop/hive/llap/io/encoded/OrcEncodedDataReader.java llap-server/src/java/org/apache/hadoop/hive/llap/io/encoded/OrcEncodedDataReader.java index 1befba7..f0a1b3e 100644 --- llap-server/src/java/org/apache/hadoop/hive/llap/io/encoded/OrcEncodedDataReader.java +++ llap-server/src/java/org/apache/hadoop/hive/llap/io/encoded/OrcEncodedDataReader.java @@ -704,7 +704,7 @@ private boolean determineRgsToRead(boolean[] globalIncludes, int rowIndexStride, String[] colNamesForSarg = OrcInputFormat.getSargColumnNames( columnNames, types, globalIncludes, fileMetadata.isOriginalFormat()); sargApp = new RecordReaderImpl.SargApplier(sarg, colNamesForSarg, - rowIndexStride, types, globalIncludes.length); + rowIndexStride, globalIncludes.length); } boolean hasAnyData = false; // readState should have been initialized by this time with an empty array. diff --git orc/src/java/org/apache/orc/OrcUtils.java orc/src/java/org/apache/orc/OrcUtils.java index dc83b9c..0f33b0a 100644 --- orc/src/java/org/apache/orc/OrcUtils.java +++ orc/src/java/org/apache/orc/OrcUtils.java @@ -246,7 +246,7 @@ public static void appendOrcTypesRebuildSubtypes(List result, { // Make room for MAP type. result.add(null); - + // Add MAP type pair in order to determine their subtype values. appendOrcTypesRebuildSubtypes(result, children.get(0)); int subtype2 = result.size(); @@ -384,7 +384,7 @@ public static int appendOrcTypesRebuildSubtypes(List result, { // Make room for MAP type. result.add(null); - + // Add MAP type pair in order to determine their subtype values. columnId = appendOrcTypesRebuildSubtypes(result, types, columnId); int subtype2 = result.size(); @@ -538,4 +538,47 @@ TypeDescription convertTypeFromProtobuf(List types, } return result; } + + /** + * Determine whether a schema has the ACID struct by examining whether the transaction related + * column names are present. + * @param type + * @return + */ + public static boolean checkAcidSchema(TypeDescription type) { + if (type.getCategory().equals(TypeDescription.Category.STRUCT)) { + List rootFields = type.getFieldNames(); + if (acidEventFieldNames.equals(rootFields)) { + return true; + } + } + return false; + } + + /** + * @param typeDescr + * @return ORC types for the ACID event based on the row's type description + */ + public static TypeDescription createEventSchema(TypeDescription typeDescr) { + TypeDescription result = TypeDescription.createStruct() + .addField("operation", TypeDescription.createInt()) + .addField("originalTransaction", TypeDescription.createLong()) + .addField("bucket", TypeDescription.createInt()) + .addField("rowId", TypeDescription.createLong()) + .addField("currentTransaction", TypeDescription.createLong()) + .addField("row", typeDescr.clone()); + return result; + } + + public static int ACID_ROW_CHILD = 6; + + public static final List acidEventFieldNames= new ArrayList(); + static { + acidEventFieldNames.add("operation"); + acidEventFieldNames.add("originalTransaction"); + acidEventFieldNames.add("bucket"); + acidEventFieldNames.add("rowId"); + acidEventFieldNames.add("currentTransaction"); + acidEventFieldNames.add("row"); + } } diff --git orc/src/java/org/apache/orc/TypeDescription.java orc/src/java/org/apache/orc/TypeDescription.java index ffe3c1f..c9e146d 100644 --- orc/src/java/org/apache/orc/TypeDescription.java +++ orc/src/java/org/apache/orc/TypeDescription.java @@ -319,6 +319,34 @@ public boolean equals(Object other) { } /** + * Checks to see if another type has the same category and attributes (e.g. maxLength, + * scale, precision, number of children). + * + * Different than equals because we do not compare type id, maximum id, or STRUCT field names. + * + * @return + */ + public boolean sameCategoryAndAttributes(TypeDescription other) { + if (category != other.category || + maxLength != other.maxLength || + scale != other.scale || + precision != other.precision) { + return false; + } + if (children != null) { + if (children.size() != other.children.size()) { + return false; + } + for (int i = 0; i < children.size(); ++i) { + if (!children.get(i).sameCategoryAndAttributes(other.children.get(i))) { + return false; + } + } + } + return true; + } + + /** * Get the maximum id assigned to this type or its children. * The first call will cause all of the the ids in tree to be assigned, so * it should not be called before the type is completely built. diff --git orc/src/java/org/apache/orc/impl/ConvertTreeReaderFactory.java orc/src/java/org/apache/orc/impl/ConvertTreeReaderFactory.java index c0c6964..2e9aa5b 100644 --- orc/src/java/org/apache/orc/impl/ConvertTreeReaderFactory.java +++ orc/src/java/org/apache/orc/impl/ConvertTreeReaderFactory.java @@ -2066,7 +2066,6 @@ private static TreeReader createAnyIntegerConvertTreeReader(int columnId, TypeDescription fileType, TypeDescription readerType, SchemaEvolution evolution, - boolean[] included, boolean skipCorrupt) throws IOException { // CONVERT from (BOOLEAN, BYTE, SHORT, INT, LONG) to schema type. @@ -2123,7 +2122,6 @@ private static TreeReader createFloatConvertTreeReader(int columnId, TypeDescription fileType, TypeDescription readerType, SchemaEvolution evolution, - boolean[] included, boolean skipCorrupt) throws IOException { // CONVERT from FLOAT to schema type. @@ -2172,7 +2170,6 @@ private static TreeReader createDoubleConvertTreeReader(int columnId, TypeDescription fileType, TypeDescription readerType, SchemaEvolution evolution, - boolean[] included, boolean skipCorrupt) throws IOException { // CONVERT from DOUBLE to schema type. @@ -2221,7 +2218,6 @@ private static TreeReader createDecimalConvertTreeReader(int columnId, TypeDescription fileType, TypeDescription readerType, SchemaEvolution evolution, - boolean[] included, boolean skipCorrupt) throws IOException { // CONVERT from DECIMAL to schema type. @@ -2269,7 +2265,6 @@ private static TreeReader createStringConvertTreeReader(int columnId, TypeDescription fileType, TypeDescription readerType, SchemaEvolution evolution, - boolean[] included, boolean skipCorrupt) throws IOException { // CONVERT from STRING to schema type. @@ -2326,7 +2321,6 @@ private static TreeReader createCharConvertTreeReader(int columnId, TypeDescription fileType, TypeDescription readerType, SchemaEvolution evolution, - boolean[] included, boolean skipCorrupt) throws IOException { // CONVERT from CHAR to schema type. @@ -2382,7 +2376,6 @@ private static TreeReader createVarcharConvertTreeReader(int columnId, TypeDescription fileType, TypeDescription readerType, SchemaEvolution evolution, - boolean[] included, boolean skipCorrupt) throws IOException { // CONVERT from VARCHAR to schema type. @@ -2438,7 +2431,6 @@ private static TreeReader createTimestampConvertTreeReader(int columnId, TypeDescription fileType, TypeDescription readerType, SchemaEvolution evolution, - boolean[] included, boolean skipCorrupt) throws IOException { // CONVERT from TIMESTAMP to schema type. @@ -2489,7 +2481,6 @@ private static TreeReader createDateConvertTreeReader(int columnId, TypeDescription fileType, TypeDescription readerType, SchemaEvolution evolution, - boolean[] included, boolean skipCorrupt) throws IOException { // CONVERT from DATE to schema type. @@ -2532,7 +2523,6 @@ private static TreeReader createBinaryConvertTreeReader(int columnId, TypeDescription fileType, TypeDescription readerType, SchemaEvolution evolution, - boolean[] included, boolean skipCorrupt) throws IOException { // CONVERT from DATE to schema type. @@ -2698,7 +2688,6 @@ private static TreeReader createBinaryConvertTreeReader(int columnId, */ public static TreeReader createConvertTreeReader(TypeDescription readerType, SchemaEvolution evolution, - boolean[] included, boolean skipCorrupt ) throws IOException { @@ -2713,43 +2702,43 @@ public static TreeReader createConvertTreeReader(TypeDescription readerType, case INT: case LONG: return createAnyIntegerConvertTreeReader(columnId, fileType, readerType, evolution, - included, skipCorrupt); + skipCorrupt); case FLOAT: return createFloatConvertTreeReader(columnId, fileType, readerType, evolution, - included, skipCorrupt); + skipCorrupt); case DOUBLE: return createDoubleConvertTreeReader(columnId, fileType, readerType, evolution, - included, skipCorrupt); + skipCorrupt); case DECIMAL: return createDecimalConvertTreeReader(columnId, fileType, readerType, evolution, - included, skipCorrupt); + skipCorrupt); case STRING: return createStringConvertTreeReader(columnId, fileType, readerType, evolution, - included, skipCorrupt); + skipCorrupt); case CHAR: return createCharConvertTreeReader(columnId, fileType, readerType, evolution, - included, skipCorrupt); + skipCorrupt); case VARCHAR: return createVarcharConvertTreeReader(columnId, fileType, readerType, evolution, - included, skipCorrupt); + skipCorrupt); case TIMESTAMP: return createTimestampConvertTreeReader(columnId, fileType, readerType, evolution, - included, skipCorrupt); + skipCorrupt); case DATE: return createDateConvertTreeReader(columnId, fileType, readerType, evolution, - included, skipCorrupt); + skipCorrupt); case BINARY: return createBinaryConvertTreeReader(columnId, fileType, readerType, evolution, - included, skipCorrupt); + skipCorrupt); // UNDONE: Complex conversions... case STRUCT: diff --git orc/src/java/org/apache/orc/impl/ReaderImpl.java orc/src/java/org/apache/orc/impl/ReaderImpl.java index d6df7d7..93fc0ce 100644 --- orc/src/java/org/apache/orc/impl/ReaderImpl.java +++ orc/src/java/org/apache/orc/impl/ReaderImpl.java @@ -572,13 +572,6 @@ public RecordReader rows() throws IOException { @Override public RecordReader rows(Options options) throws IOException { LOG.info("Reading ORC rows from " + path + " with " + options); - boolean[] include = options.getInclude(); - // if included columns is null, then include all columns - if (include == null) { - include = new boolean[types.size()]; - Arrays.fill(include, true); - options.include(include); - } return new RecordReaderImpl(this, options); } diff --git orc/src/java/org/apache/orc/impl/RecordReaderImpl.java orc/src/java/org/apache/orc/impl/RecordReaderImpl.java index 23f532c..824554c 100644 --- orc/src/java/org/apache/orc/impl/RecordReaderImpl.java +++ orc/src/java/org/apache/orc/impl/RecordReaderImpl.java @@ -134,24 +134,24 @@ static int findColumns(String[] columnNames, protected RecordReaderImpl(ReaderImpl fileReader, Reader.Options options) throws IOException { - SchemaEvolution treeReaderSchema; - this.included = options.getInclude(); - included[0] = true; + SchemaEvolution evolution; if (options.getSchema() == null) { if (LOG.isInfoEnabled()) { LOG.info("Schema on read not provided -- using file schema " + fileReader.getSchema()); } - treeReaderSchema = new SchemaEvolution(fileReader.getSchema(), included); + evolution = new SchemaEvolution(fileReader.getSchema(), options.getInclude(), + options.getColumnNames()); } else { // Now that we are creating a record reader for a file, validate that the schema to read // is compatible with the file schema. // - treeReaderSchema = new SchemaEvolution(fileReader.getSchema(), - options.getSchema(),included); + evolution = new SchemaEvolution(fileReader.getSchema(), options.getSchema(), + options.getInclude(), options.getColumnNames()); } - this.schema = treeReaderSchema.getReaderSchema(); + this.schema = evolution.getReaderSchema(); + this.included = evolution.getReaderIncluded(); this.path = fileReader.path; this.codec = fileReader.codec; this.types = fileReader.types; @@ -160,8 +160,7 @@ protected RecordReaderImpl(ReaderImpl fileReader, SearchArgument sarg = options.getSearchArgument(); if (sarg != null && rowIndexStride != 0) { sargApp = new SargApplier( - sarg, options.getColumnNames(), rowIndexStride, types, - included.length); + sarg, evolution.getReaderColumnNames(), rowIndexStride, included.length); } else { sargApp = null; } @@ -205,8 +204,8 @@ protected RecordReaderImpl(ReaderImpl fileReader, skipCorrupt = OrcConf.SKIP_CORRUPT_DATA.getBoolean(fileReader.conf); } - reader = TreeReaderFactory.createTreeReader(treeReaderSchema.getReaderSchema(), - treeReaderSchema, included, skipCorrupt); + reader = TreeReaderFactory.createTreeReader(evolution.getReaderSchema(), evolution, + skipCorrupt); indexes = new OrcProto.RowIndex[types.size()]; bloomFilterIndices = new OrcProto.BloomFilterIndex[types.size()]; advanceToNextRow(reader, 0L, true); @@ -707,7 +706,7 @@ private static Object getBaseObjectForComparison(PredicateLeaf.Type type, Object private final boolean[] sargColumns; public SargApplier(SearchArgument sarg, String[] columnNames, long rowIndexStride, - List types, int includedCount) { + int includedCount) { this.sarg = sarg; sargLeaves = sarg.getLeaves(); filterColumns = mapSargColumnsToOrcInternalColIdx(sargLeaves, columnNames, 0); diff --git orc/src/java/org/apache/orc/impl/SchemaEvolution.java orc/src/java/org/apache/orc/impl/SchemaEvolution.java index a6c1d60..ed9dbb7 100644 --- orc/src/java/org/apache/orc/impl/SchemaEvolution.java +++ orc/src/java/org/apache/orc/impl/SchemaEvolution.java @@ -20,51 +20,205 @@ import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.orc.OrcUtils; import org.apache.orc.TypeDescription; +import org.apache.orc.TypeDescription.Category; + +import com.google.common.base.Preconditions; /** * Take the file types and the (optional) configuration column names/types and see if there * has been schema evolution. + * + * The logical schema is schema desired by the client of the ORC input file format. E.g. Hive. + * + * The reader schema will be same as the logical schema for non-ACID ORC files. But for ACID ORC + * files, the reader schema will have the wrapper ACID STRUCT. In this case, the logical schema + * will be the ROW field of the ACID STRUCT. + * + * The file schema is has the actual file columns. If it is different than the reader schema, then + * there is Schema Evolution. + * + * The getFileType method goes from a reader type to a file type. It is for helping + * with creating the tree readers. If the column is not needed (i.e. not included), getFileType + * returns null. */ public class SchemaEvolution { - private final Map readerToFile; - private final boolean[] included; + private final TypeDescription logicalSchema; + private final boolean[] logicalIncluded; + private final int logicalFirstId; + private final String[] logicalColumnNames; private final TypeDescription readerSchema; + private final boolean[] readerIncluded; + private final String[] readerColumnNames; + private final Map readerToFile; + private boolean hadConversion; + private static final Log LOG = LogFactory.getLog(SchemaEvolution.class); - public SchemaEvolution(TypeDescription readerSchema, boolean[] included) { - this.included = included; + /** + * Use when the logical schema is the file schema. + * + * I.e. when no schema evolution is needed. + * + * @param logicalSchema + * @param logicalIncluded The columns to include from the schema. Indexed by the schema + * type id. + * @param logicalColumnNames The column names. Can be null. + */ + public SchemaEvolution(TypeDescription logicalSchema, + boolean[] logicalIncluded, + String[] logicalColumnNames) { + + // If an ACID file is being read, it is assumed to be low-level access not involving + // higher level functionality like included. + Preconditions.checkState(!OrcUtils.checkAcidSchema(logicalSchema) || logicalIncluded == null); + + this.logicalSchema = logicalSchema; + this.logicalIncluded = makeLogicalIncluded(logicalIncluded); + logicalFirstId = 0; + this.logicalColumnNames = logicalColumnNames; + + // No mapping. readerToFile = null; - this.readerSchema = readerSchema; + + readerSchema = this.logicalSchema; + readerIncluded = this.logicalIncluded; + readerColumnNames = this.logicalColumnNames; + + hadConversion = false; } + /** + * Use when the file and reader schema may be different and require schema evolution. + * + * @param fileSchema + * @param logicalSchema The schema (excluding ACID metadata columns) desired by the reader. + * @param logicalIncluded The columns to include from the logical schema. Indexed by the + * schema type id. + * @throws IOException + */ public SchemaEvolution(TypeDescription fileSchema, - TypeDescription readerSchema, - boolean[] included) throws IOException { - readerToFile = new HashMap<>(readerSchema.getMaximumId() + 1); - this.included = included; - if (checkAcidSchema(fileSchema)) { - this.readerSchema = createEventSchema(readerSchema); + TypeDescription logicalSchema, + boolean[] logicalIncluded, + String[] logicalColumnNames) throws IOException { + Preconditions.checkState(fileSchema.getCategory() == Category.STRUCT); + Preconditions.checkState(logicalSchema.getCategory() == Category.STRUCT); + + this.logicalSchema = logicalSchema; + this.logicalIncluded = makeLogicalIncluded(logicalIncluded); + + /* + * We need special handling for ACID. + */ + if (OrcUtils.checkAcidSchema(fileSchema)) { + readerSchema = OrcUtils.createEventSchema(this.logicalSchema); + + /* + * We need the range of type ids for the logical schema so we can create the + * logicalFileTypes below. + */ + logicalFirstId = OrcUtils.ACID_ROW_CHILD; } else { - this.readerSchema = readerSchema; + this.readerSchema = this.logicalSchema; + logicalFirstId = 0; } - buildMapping(fileSchema, this.readerSchema); + this.logicalColumnNames = logicalColumnNames; + + readerIncluded = makeReaderIncluded(); + readerColumnNames = makeReaderColumnNames(); + + readerToFile = new HashMap<>(readerSchema.getMaximumId() + 1); + + // Void call to make sure all the ids are assigned. + fileSchema.getId(); + + hadConversion = false; + buildMapping(fileSchema, readerSchema); + } + + /** + * Is there Schema Evolution data type conversion? + * @return + */ + public boolean hadConversion() { + return hadConversion; } + /** + * The schema desired by the reader. + * + * For an ACID table, it will have the ACID metadata. + * + * @return + */ public TypeDescription getReaderSchema() { return readerSchema; } + /** + * The needed columns from the reader schema. + * + * For an ACID table, the boolean array will include the ACID metadata columns. + * + * We always provide a non-null include boolean area as a convenience. + * + * @return + */ + public boolean[] getReaderIncluded() { + return readerIncluded; + } + + /** + * The reader column names when logical column names were provided to the constructor. + * + * For an ACID table, the column name array will have the ACID metadata columns. + * + * @return + */ + public String[] getReaderColumnNames() { + return readerColumnNames; + } + + /** + * The schema desired by the reader *without* ACID metadata columns. + * + * @return + */ + public TypeDescription getLogicalSchema() { + return logicalSchema; + } + + /** + * The needed columns from the logical schema. + * + * For an ACID table, the boolean array will *not* include the ACID metadata columns. + * + * We always provide a non-null include boolean area as a convenience. + * + * @return + */ + public boolean[] getLogicalIncluded() { + return logicalIncluded; + } + + + /** + * Get the file type for a reader type. + * @param readerType + * @return + */ public TypeDescription getFileType(TypeDescription readerType) { TypeDescription result; if (readerToFile == null) { - if (included == null || included[readerType.getId()]) { + if (readerIncluded[readerType.getId()]) { result = readerType; } else { result = null; @@ -77,8 +231,8 @@ public TypeDescription getFileType(TypeDescription readerType) { void buildMapping(TypeDescription fileType, TypeDescription readerType) throws IOException { - // if the column isn't included, don't map it - if (included != null && !included[readerType.getId()]) { + // When a column isn't included, don't map it. + if (!readerIncluded[readerType.getId()]) { return; } boolean isOk = true; @@ -101,9 +255,16 @@ void buildMapping(TypeDescription fileType, case CHAR: case VARCHAR: // We do conversion when same CHAR/VARCHAR type but different maxLength. + if (fileType.getMaxLength() != readerType.getMaxLength()) { + hadConversion = true; + } break; case DECIMAL: // We do conversion when same DECIMAL type but different precision/scale. + if (fileType.getPrecision() != readerType.getPrecision() || + fileType.getScale() != readerType.getScale()) { + hadConversion = true; + } break; case UNION: case MAP: @@ -124,6 +285,9 @@ void buildMapping(TypeDescription fileType, // allow either side to have fewer fields than the other List fileChildren = fileType.getChildren(); List readerChildren = readerType.getChildren(); + if (fileChildren.size() != readerChildren.size()) { + hadConversion = true; + } int jointSize = Math.min(fileChildren.size(), readerChildren.size()); for(int i=0; i < jointSize; ++i) { buildMapping(fileChildren.get(i), readerChildren.get(i)); @@ -139,6 +303,7 @@ void buildMapping(TypeDescription fileType, */ isOk = ConvertTreeReaderFactory.canConvert(fileType, readerType); + hadConversion = true; } if (isOk) { readerToFile.put(readerType, fileType); @@ -151,38 +316,56 @@ void buildMapping(TypeDescription fileType, } } - private static boolean checkAcidSchema(TypeDescription type) { - if (type.getCategory().equals(TypeDescription.Category.STRUCT)) { - List rootFields = type.getFieldNames(); - if (acidEventFieldNames.equals(rootFields)) { - return true; + private boolean[] makeLogicalIncluded(boolean[] logicalIncluded) { + final int logicalLength = logicalSchema.getMaximumId() + 1; + boolean[] result = new boolean[logicalLength]; + if (logicalIncluded == null) { + Arrays.fill(result, true); + } else { + + // When logicalIncluded is shorter, then extra columns are not included. + System.arraycopy(logicalIncluded, 0, result, 0, logicalIncluded.length); + + if (logicalSchema.getCategory() == Category.STRUCT) { + // Always include top level struct. + result[0] = true; } } - return false; + return result; } - /** - * @param typeDescr - * @return ORC types for the ACID event based on the row's type description - */ - public static TypeDescription createEventSchema(TypeDescription typeDescr) { - TypeDescription result = TypeDescription.createStruct() - .addField("operation", TypeDescription.createInt()) - .addField("originalTransaction", TypeDescription.createLong()) - .addField("bucket", TypeDescription.createInt()) - .addField("rowId", TypeDescription.createLong()) - .addField("currentTransaction", TypeDescription.createLong()) - .addField("row", typeDescr.clone()); + private boolean[] makeReaderIncluded() { + final int logicalLength = logicalSchema.getMaximumId() + 1; + final int readerLength = readerSchema.getMaximumId() + 1; + boolean[] result; + if (logicalLength == readerLength) { + result = logicalIncluded; + } else { + result = new boolean[readerLength]; + Arrays.fill(result, true); + System.arraycopy(logicalIncluded, 0, result, logicalFirstId, logicalLength); + } return result; } - public static final List acidEventFieldNames= new ArrayList(); - static { - acidEventFieldNames.add("operation"); - acidEventFieldNames.add("originalTransaction"); - acidEventFieldNames.add("bucket"); - acidEventFieldNames.add("rowId"); - acidEventFieldNames.add("currentTransaction"); - acidEventFieldNames.add("row"); + /** + * If logical column names are provided, return the reader column name array. + * Otherwise, null is returned. + * @return + */ + private String[] makeReaderColumnNames() { + if (logicalColumnNames == null) { + return null; + } + final int logicalLength = logicalSchema.getMaximumId() + 1; + final int readerLength = readerSchema.getMaximumId() + 1; + String[] result; + if (logicalLength == readerLength) { + result = logicalColumnNames; + } else { + result = new String[readerLength]; + System.arraycopy(logicalColumnNames, 0, result, logicalFirstId, logicalLength); + } + return result; } } diff --git orc/src/java/org/apache/orc/impl/TreeReaderFactory.java orc/src/java/org/apache/orc/impl/TreeReaderFactory.java index c4a2093..a56f1c7 100644 --- orc/src/java/org/apache/orc/impl/TreeReaderFactory.java +++ orc/src/java/org/apache/orc/impl/TreeReaderFactory.java @@ -1705,7 +1705,6 @@ public void nextVector(ColumnVector previousVector, protected StructTreeReader(int columnId, TypeDescription readerSchema, SchemaEvolution evolution, - boolean[] included, boolean skipCorrupt) throws IOException { super(columnId); @@ -1713,7 +1712,7 @@ protected StructTreeReader(int columnId, this.fields = new TreeReader[childrenTypes.size()]; for (int i = 0; i < fields.length; ++i) { TypeDescription subtype = childrenTypes.get(i); - this.fields[i] = createTreeReader(subtype, evolution, included, skipCorrupt); + this.fields[i] = createTreeReader(subtype, evolution, skipCorrupt); } } @@ -1790,7 +1789,6 @@ void skipRows(long items) throws IOException { protected UnionTreeReader(int fileColumn, TypeDescription readerSchema, SchemaEvolution evolution, - boolean[] included, boolean skipCorrupt) throws IOException { super(fileColumn); List childrenTypes = readerSchema.getChildren(); @@ -1798,7 +1796,7 @@ protected UnionTreeReader(int fileColumn, this.fields = new TreeReader[fieldCount]; for (int i = 0; i < fieldCount; ++i) { TypeDescription subtype = childrenTypes.get(i); - this.fields[i] = createTreeReader(subtype, evolution, included, skipCorrupt); + this.fields[i] = createTreeReader(subtype, evolution, skipCorrupt); } } @@ -1867,12 +1865,10 @@ void skipRows(long items) throws IOException { protected ListTreeReader(int fileColumn, TypeDescription readerSchema, SchemaEvolution evolution, - boolean[] included, boolean skipCorrupt) throws IOException { super(fileColumn); TypeDescription elementType = readerSchema.getChildren().get(0); - elementReader = createTreeReader(elementType, evolution, included, - skipCorrupt); + elementReader = createTreeReader(elementType, evolution, skipCorrupt); } @Override @@ -1947,13 +1943,12 @@ void skipRows(long items) throws IOException { protected MapTreeReader(int fileColumn, TypeDescription readerSchema, SchemaEvolution evolution, - boolean[] included, boolean skipCorrupt) throws IOException { super(fileColumn); TypeDescription keyType = readerSchema.getChildren().get(0); TypeDescription valueType = readerSchema.getChildren().get(1); - keyReader = createTreeReader(keyType, evolution, included, skipCorrupt); - valueReader = createTreeReader(valueType, evolution, included, skipCorrupt); + keyReader = createTreeReader(keyType, evolution, skipCorrupt); + valueReader = createTreeReader(valueType, evolution, skipCorrupt); } @Override @@ -2028,23 +2023,20 @@ void skipRows(long items) throws IOException { public static TreeReader createTreeReader(TypeDescription readerType, SchemaEvolution evolution, - boolean[] included, boolean skipCorrupt ) throws IOException { TypeDescription fileType = evolution.getFileType(readerType); - if (fileType == null || - (included != null && !included[readerType.getId()])) { + if (fileType == null) { return new NullTreeReader(0); } TypeDescription.Category readerTypeCategory = readerType.getCategory(); - if (!fileType.equals(readerType) && + if (!fileType.sameCategoryAndAttributes(readerType) && (readerTypeCategory != TypeDescription.Category.STRUCT && readerTypeCategory != TypeDescription.Category.MAP && readerTypeCategory != TypeDescription.Category.LIST && readerTypeCategory != TypeDescription.Category.UNION)) { // We only convert complex children. - return ConvertTreeReaderFactory.createConvertTreeReader(readerType, evolution, - included, skipCorrupt); + return ConvertTreeReaderFactory.createConvertTreeReader(readerType, evolution, skipCorrupt); } switch (readerTypeCategory) { case BOOLEAN: @@ -2078,16 +2070,16 @@ public static TreeReader createTreeReader(TypeDescription readerType, readerType.getScale()); case STRUCT: return new StructTreeReader(fileType.getId(), readerType, - evolution, included, skipCorrupt); + evolution, skipCorrupt); case LIST: return new ListTreeReader(fileType.getId(), readerType, - evolution, included, skipCorrupt); + evolution, skipCorrupt); case MAP: return new MapTreeReader(fileType.getId(), readerType, evolution, - included, skipCorrupt); + skipCorrupt); case UNION: return new UnionTreeReader(fileType.getId(), readerType, - evolution, included, skipCorrupt); + evolution, skipCorrupt); default: throw new IllegalArgumentException("Unsupported type " + readerTypeCategory); diff --git ql/src/java/org/apache/hadoop/hive/ql/io/orc/OrcInputFormat.java ql/src/java/org/apache/hadoop/hive/ql/io/orc/OrcInputFormat.java index 69d58d6..625fb16 100644 --- ql/src/java/org/apache/hadoop/hive/ql/io/orc/OrcInputFormat.java +++ ql/src/java/org/apache/hadoop/hive/ql/io/orc/OrcInputFormat.java @@ -116,6 +116,7 @@ import org.apache.orc.OrcProto; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.google.protobuf.CodedInputStream; @@ -306,14 +307,15 @@ public static RecordReader createReaderFromFile(Reader file, /** * Do we have schema on read in the configuration variables? */ - TypeDescription schema = getDesiredRowTypeDescr(conf, false, Integer.MAX_VALUE); + TypeDescription logicalSchema = getDesiredRowTypeDescr(conf, false, Integer.MAX_VALUE); Reader.Options options = new Reader.Options().range(offset, length); - options.schema(schema); - boolean isOriginal = isOriginal(file); - List types = file.getTypes(); - options.include(genIncludedColumns(types, conf, isOriginal)); - setSearchArgument(options, types, conf, isOriginal); + options.schema(logicalSchema); + if (logicalSchema == null) { + logicalSchema = file.getSchema(); + } + options.include(genIncludedColumns(logicalSchema, conf)); + setSearchArgument(options, logicalSchema, conf); return (RecordReader) file.rowsOptions(options); } @@ -323,6 +325,114 @@ public static boolean isOriginal(Reader file) { /** * Recurse down into a type subtree turning on all of the sub-columns. + * + * NOTE: Currently, the included columns are just the top level columns. Any STRUCT type columns + * will have all of their columns included, recursively. There is open HIVE-13873 that would + * enhance things to have included columns have depth into STRUCT type columns so unnecessary + * STRUCT columns are not read. + * + * @param typeDescr the possible complex type. + * @param result the global view of columns that should be included + */ + private static void includeColumnRecursive(TypeDescription typeDescr, + boolean[] result) { + result[typeDescr.getId()] = true; + final List children = typeDescr.getChildren(); + if (children == null) { + return; + } + final int numChildren = children.size(); + for(int i=0; i < numChildren; ++i) { + TypeDescription child = children.get(i); + includeColumnRecursive(child, result); + } + } + + /** + * Generate an included boolean array from the reader schema and list of column ids. + * @param logicalSchema + * @param included + * @return + */ + public static boolean[] genIncludedColumns(TypeDescription logicalSchema, + List included) { + boolean[] result = new boolean[logicalSchema.getMaximumId() + 1]; + result[0] = true; + final List children = logicalSchema.getChildren(); + final int numChildren = children.size(); + for (int i = 0; i < numChildren; ++i) { + TypeDescription child = children.get(i); + if (included.contains(i)) { + includeColumnRecursive(child, result); + } + } + return result; + } + + /** + * Determine the logical included columns from the reader schema and configuration. + * + * @param schema + * @param conf + * @return Will be null if included colummns are not present in the configuration. + */ + public static boolean[] genIncludedColumns( + TypeDescription schema, Configuration conf) { + if (!ColumnProjectionUtils.isReadAllColumns(conf)) { + List included = ColumnProjectionUtils.getReadColumnIDs(conf); + return genIncludedColumns(schema, included); + } else { + return null; + } + } + + public static String[] getSargColumnNames(String[] originalColumnNames, + TypeDescription logicalSchema, boolean[] includedColumns) { + String[] columnNames = new String[logicalSchema.getMaximumId() + 1]; + int i = 0; + final List children = logicalSchema.getChildren(); + // The way this works is as such. originalColumnNames is the equivalent on getNeededColumns + // from TSOP. They are assumed to be in the same order as the columns in ORC file, AND they are + // assumed to be equivalent to the columns in includedColumns (because it was generated from + // we go thru all the top level ORC file columns that are included, in order, they match + // originalColumnNames. This way, we do not depend on names stored inside ORC for SARG leaf + // column name resolution (see mapSargColumns method). + for(TypeDescription child : children) { + int id = child.getId(); + if (includedColumns == null || includedColumns[id]) { + // this is guaranteed to be positive because types only have children + // ids greater than their own id. + columnNames[id] = originalColumnNames[i++]; + } + } + return columnNames; + } + + static void setSearchArgument(Reader.Options options, + TypeDescription logicalSchema, + Configuration conf) { + String neededColumnNames = getNeededColumnNamesString(conf); + if (neededColumnNames == null) { + LOG.debug("No ORC pushdown predicate - no column names"); + options.searchArgument(null, null); + return; + } + SearchArgument sarg = ConvertAstToSearchArg.createFromConf(conf); + if (sarg == null) { + LOG.debug("No ORC pushdown predicate"); + options.searchArgument(null, null); + return; + } + + if (LOG.isInfoEnabled()) { + LOG.info("ORC pushdown predicate: " + sarg); + } + options.searchArgument(sarg, getSargColumnNames( + neededColumnNames.split(","), logicalSchema, options.getInclude())); + } + + /** + * Recurse down into a type subtree turning on all of the sub-columns. * @param types the types of the file * @param result the global view of columns that should be included * @param typeId the root of tree to enable @@ -1703,19 +1813,18 @@ public float getProgress() throws IOException { /** - * Do we have schema on read in the configuration variables? + * We always have the schema in the configuration variables for ACID. */ - TypeDescription schema = getDesiredRowTypeDescr(conf, true, Integer.MAX_VALUE); + final TypeDescription logicalSchema = getDesiredRowTypeDescr(conf, true, Integer.MAX_VALUE); + Preconditions.checkState(logicalSchema != null); final Reader reader; final int bucket; - Reader.Options readOptions = new Reader.Options().schema(schema); + Reader.Options readOptions = new Reader.Options().schema(logicalSchema); readOptions.range(split.getStart(), split.getLength()); - // TODO: Convert genIncludedColumns and setSearchArgument to use TypeDescription. - final List schemaTypes = OrcUtils.getOrcTypes(schema); - readOptions.include(genIncludedColumns(schemaTypes, conf, SCHEMA_TYPES_IS_ORIGINAL)); - setSearchArgument(readOptions, schemaTypes, conf, SCHEMA_TYPES_IS_ORIGINAL); + readOptions.include(genIncludedColumns(logicalSchema, conf)); + setSearchArgument(readOptions, logicalSchema, conf); if (split.hasBase()) { bucket = AcidUtils.parseBaseBucketFilename(split.getPath(), conf) @@ -1741,7 +1850,7 @@ public float getProgress() throws IOException { @Override public ObjectInspector getObjectInspector() { - return OrcStruct.createObjectInspector(0, schemaTypes); + return OrcStruct.createObjectInspector(0, OrcUtils.getOrcTypes(logicalSchema)); } @Override diff --git ql/src/java/org/apache/hadoop/hive/ql/io/orc/OrcRawRecordMerger.java ql/src/java/org/apache/hadoop/hive/ql/io/orc/OrcRawRecordMerger.java index b9094bf..010bdd8 100644 --- ql/src/java/org/apache/hadoop/hive/ql/io/orc/OrcRawRecordMerger.java +++ ql/src/java/org/apache/hadoop/hive/ql/io/orc/OrcRawRecordMerger.java @@ -146,7 +146,7 @@ public int compareTo(RecordIdentifier other) { private boolean isSameRow(ReaderKey other) { return compareRow(other) == 0 && currentTransactionId == other.currentTransactionId; } - + public long getCurrentTransactionId() { return currentTransactionId; } @@ -385,40 +385,6 @@ private void discoverKeyBounds(Reader reader, } /** - * Convert from the row include/sarg/columnNames to the event equivalent - * for the underlying file. - * @param options options for the row reader - * @return a cloned options object that is modified for the event reader - */ - static Reader.Options createEventOptions(Reader.Options options) { - Reader.Options result = options.clone(); - result.range(options.getOffset(), Long.MAX_VALUE); - // slide the columns down by 6 for the include array - if (options.getInclude() != null) { - boolean[] orig = options.getInclude(); - // we always need the base row - orig[0] = true; - boolean[] include = new boolean[orig.length + OrcRecordUpdater.FIELDS]; - Arrays.fill(include, 0, OrcRecordUpdater.FIELDS, true); - for(int i= 0; i < orig.length; ++i) { - include[i + OrcRecordUpdater.FIELDS] = orig[i]; - } - result.include(include); - } - - // slide the column names down by 6 for the name array - if (options.getColumnNames() != null) { - String[] orig = options.getColumnNames(); - String[] cols = new String[orig.length + OrcRecordUpdater.FIELDS]; - for(int i=0; i < orig.length; ++i) { - cols[i + OrcRecordUpdater.FIELDS] = orig[i]; - } - result.searchArgument(options.getSearchArgument(), cols); - } - return result; - } - - /** * Create a reader that merge sorts the ACID events together. * @param conf the configuration * @param collapseEvents should the events on the same row be collapsed @@ -442,14 +408,15 @@ private void discoverKeyBounds(Reader reader, this.length = options.getLength(); this.validTxnList = validTxnList; - TypeDescription typeDescr = + TypeDescription logicalSchema = OrcInputFormat.getDesiredRowTypeDescr(conf, true, Integer.MAX_VALUE); + options.schema(logicalSchema); objectInspector = OrcRecordUpdater.createEventSchema - (OrcStruct.createObjectInspector(0, OrcUtils.getOrcTypes(typeDescr))); + (OrcStruct.createObjectInspector(0, OrcUtils.getOrcTypes(logicalSchema))); + + Reader.Options eventOptions = options.clone().range(options.getOffset(), Long.MAX_VALUE); - // modify the options to reflect the event instead of the base row - Reader.Options eventOptions = createEventOptions(options); if (reader == null) { baseReader = null; } else { diff --git ql/src/java/org/apache/hadoop/hive/ql/io/orc/ReaderImpl.java ql/src/java/org/apache/hadoop/hive/ql/io/orc/ReaderImpl.java index 9bcdb39..4160e77 100644 --- ql/src/java/org/apache/hadoop/hive/ql/io/orc/ReaderImpl.java +++ ql/src/java/org/apache/hadoop/hive/ql/io/orc/ReaderImpl.java @@ -76,13 +76,6 @@ public RecordReader rows() throws IOException { @Override public RecordReader rowsOptions(Options options) throws IOException { LOG.info("Reading ORC rows from " + path + " with " + options); - boolean[] include = options.getInclude(); - // if included columns is null, then include all columns - if (include == null) { - include = new boolean[types.size()]; - Arrays.fill(include, true); - options.include(include); - } return new RecordReaderImpl(this, options); } diff --git ql/src/java/org/apache/hadoop/hive/ql/io/orc/VectorizedOrcInputFormat.java ql/src/java/org/apache/hadoop/hive/ql/io/orc/VectorizedOrcInputFormat.java index 9275aa9..09eb6bb 100644 --- ql/src/java/org/apache/hadoop/hive/ql/io/orc/VectorizedOrcInputFormat.java +++ ql/src/java/org/apache/hadoop/hive/ql/io/orc/VectorizedOrcInputFormat.java @@ -74,30 +74,29 @@ /** * Do we have schema on read in the configuration variables? */ - List types = file.getTypes(); int dataColumns = rbCtx.getDataColumnCount(); - TypeDescription schema = + TypeDescription logicalSchema = OrcInputFormat.getDesiredRowTypeDescr(conf, false, dataColumns); - if (schema == null) { - schema = file.getSchema(); + if (logicalSchema == null) { + logicalSchema = file.getSchema(); // Even if the user isn't doing schema evolution, cut the schema // to the desired size. - if (schema.getCategory() == TypeDescription.Category.STRUCT && - schema.getChildren().size() > dataColumns) { - schema = schema.clone(); - List children = schema.getChildren(); + if (logicalSchema.getCategory() == TypeDescription.Category.STRUCT && + logicalSchema.getChildren().size() > dataColumns) { + logicalSchema = logicalSchema.clone(); + List children = logicalSchema.getChildren(); for(int c = children.size() - 1; c >= dataColumns; --c) { children.remove(c); } } } - Reader.Options options = new Reader.Options().schema(schema); + Reader.Options options = new Reader.Options().schema(logicalSchema); this.offset = fileSplit.getStart(); this.length = fileSplit.getLength(); options.range(offset, length); - options.include(OrcInputFormat.genIncludedColumns(types, conf, true)); - OrcInputFormat.setSearchArgument(options, types, conf, true); + options.include(OrcInputFormat.genIncludedColumns(logicalSchema, conf)); + OrcInputFormat.setSearchArgument(options, logicalSchema, conf); this.reader = file.rowsOptions(options); diff --git ql/src/test/org/apache/hadoop/hive/ql/TestTxnCommands2.java ql/src/test/org/apache/hadoop/hive/ql/TestTxnCommands2.java index e76c925..165017a 100644 --- ql/src/test/org/apache/hadoop/hive/ql/TestTxnCommands2.java +++ ql/src/test/org/apache/hadoop/hive/ql/TestTxnCommands2.java @@ -846,7 +846,7 @@ public void testInitiatorWithMultipleFailedCompactions() throws Exception { init.run(); int numAttemptedCompactions = 1; checkCompactionState(new CompactionsByState(numAttemptedCompactions,numFailedCompactions,0,0,0,0,numFailedCompactions + numAttemptedCompactions), countCompacts(txnHandler)); - + hiveConf.setTimeVar(HiveConf.ConfVars.COMPACTOR_HISTORY_REAPER_INTERVAL, 10, TimeUnit.MILLISECONDS); AcidCompactionHistoryService compactionHistoryService = new AcidCompactionHistoryService(); runHouseKeeperService(compactionHistoryService, hiveConf);//should not remove anything from history @@ -868,7 +868,7 @@ public void testInitiatorWithMultipleFailedCompactions() throws Exception { hiveConf.getIntVar(HiveConf.ConfVars.COMPACTOR_HISTORY_RETENTION_ATTEMPTED), hiveConf.getIntVar(HiveConf.ConfVars.COMPACTOR_HISTORY_RETENTION_FAILED),0,0,0,0, hiveConf.getIntVar(HiveConf.ConfVars.COMPACTOR_HISTORY_RETENTION_FAILED) + hiveConf.getIntVar(HiveConf.ConfVars.COMPACTOR_HISTORY_RETENTION_ATTEMPTED)), countCompacts(txnHandler)); - + hiveConf.setBoolVar(HiveConf.ConfVars.HIVETESTMODEFAILCOMPACTION, false); txnHandler.compact(new CompactionRequest("default", tblName, CompactionType.MINOR)); //at this point "show compactions" should have (COMPACTOR_HISTORY_RETENTION_FAILED) failed + 1 initiated (explicitly by user) @@ -1139,6 +1139,31 @@ public void testOpenTxnsCounter() throws Exception { Assert.assertNull(exception); } + @Test + public void testCompactWithDelete() throws Exception { + int[][] tableData = {{1,2},{3,4}}; + runStatementOnDriver("insert into " + Table.ACIDTBL + "(a,b) " + makeValuesClause(tableData)); + runStatementOnDriver("alter table "+ Table.ACIDTBL + " compact 'MAJOR'"); + Worker t = new Worker(); + t.setThreadId((int) t.getId()); + t.setHiveConf(hiveConf); + AtomicBoolean stop = new AtomicBoolean(); + AtomicBoolean looped = new AtomicBoolean(); + stop.set(true); + t.init(stop, looped); + t.run(); + runStatementOnDriver("delete from " + Table.ACIDTBL + " where b = 4"); + runStatementOnDriver("update " + Table.ACIDTBL + " set b = -2 where b = 2"); + runStatementOnDriver("alter table "+ Table.ACIDTBL + " compact 'MINOR'"); + t.run(); + TxnStore txnHandler = TxnUtils.getTxnStore(hiveConf); + ShowCompactResponse resp = txnHandler.showCompact(new ShowCompactRequest()); + Assert.assertEquals("Unexpected number of compactions in history", 2, resp.getCompactsSize()); + Assert.assertEquals("Unexpected 0 compaction state", TxnStore.CLEANING_RESPONSE, resp.getCompacts().get(0).getState()); + Assert.assertEquals("Unexpected 1 compaction state", TxnStore.CLEANING_RESPONSE, resp.getCompacts().get(1).getState()); + } + + /** * takes raw data and turns it into a string as if from Driver.getResults() * sorts rows in dictionary order diff --git ql/src/test/queries/clientpositive/schema_evol_orc_nonvec_mapwork_part_all_complex.q ql/src/test/queries/clientpositive/schema_evol_orc_nonvec_mapwork_part_all_complex.q index 27cea8d..40172be 100644 --- ql/src/test/queries/clientpositive/schema_evol_orc_nonvec_mapwork_part_all_complex.q +++ ql/src/test/queries/clientpositive/schema_evol_orc_nonvec_mapwork_part_all_complex.q @@ -160,3 +160,46 @@ select insert_num,part,b,s3 from part_add_to_various_various_struct4 order by in select insert_num,part,b,s3 from part_add_to_various_various_struct4 order by insert_num; drop table part_add_to_various_various_struct4; + + + +-- +-- SUBSECTION: ALTER TABLE ADD COLUMNS for Various --> Various: ADD COLUMNS to STRUCT type as INNER column +-- +CREATE TABLE part_add_to_various_various_struct5(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) PARTITIONED BY(part INT); + +CREATE TABLE struct5_a_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile; +load data local inpath '../../data/files/struct5_a.txt' overwrite into table struct5_a_txt; + +insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_a_txt; + +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num; + +-- Table-Non-Cascade CHANGE COLUMNS ... +alter table part_add_to_various_various_struct5 replace columns (insert_num int, b STRING, s5 STRUCT, after_struct_column STRING); + +CREATE TABLE struct5_b_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile; +load data local inpath '../../data/files/struct5_b.txt' overwrite into table struct5_b_txt; + +insert into table part_add_to_various_various_struct5 partition(part=2) select * from struct5_b_txt; + +CREATE TABLE struct5_c_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile; +load data local inpath '../../data/files/struct5_c.txt' overwrite into table struct5_c_txt; + +insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_c_txt; + +explain +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num; + +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num; + +drop table part_add_to_various_various_struct5; diff --git ql/src/test/queries/clientpositive/schema_evol_orc_vec_mapwork_part_all_complex.q ql/src/test/queries/clientpositive/schema_evol_orc_vec_mapwork_part_all_complex.q index f8a8fa6..1fd70a1 100644 --- ql/src/test/queries/clientpositive/schema_evol_orc_vec_mapwork_part_all_complex.q +++ ql/src/test/queries/clientpositive/schema_evol_orc_vec_mapwork_part_all_complex.q @@ -160,3 +160,46 @@ select insert_num,part,b,s3 from part_add_to_various_various_struct4 order by in select insert_num,part,b,s3 from part_add_to_various_various_struct4 order by insert_num; drop table part_add_to_various_various_struct4; + + + +-- +-- SUBSECTION: ALTER TABLE ADD COLUMNS for Various --> Various: ADD COLUMNS to STRUCT type as INNER column +-- +CREATE TABLE part_add_to_various_various_struct5(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) PARTITIONED BY(part INT); + +CREATE TABLE struct5_a_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile; +load data local inpath '../../data/files/struct5_a.txt' overwrite into table struct5_a_txt; + +insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_a_txt; + +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num; + +-- Table-Non-Cascade CHANGE COLUMNS ... +alter table part_add_to_various_various_struct5 replace columns (insert_num int, b STRING, s5 STRUCT, after_struct_column STRING); + +CREATE TABLE struct5_b_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile; +load data local inpath '../../data/files/struct5_b.txt' overwrite into table struct5_b_txt; + +insert into table part_add_to_various_various_struct5 partition(part=2) select * from struct5_b_txt; + +CREATE TABLE struct5_c_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile; +load data local inpath '../../data/files/struct5_c.txt' overwrite into table struct5_c_txt; + +insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_c_txt; + +explain +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num; + +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num; + +drop table part_add_to_various_various_struct5; diff --git ql/src/test/queries/clientpositive/schema_evol_text_nonvec_mapwork_part_all_complex.q ql/src/test/queries/clientpositive/schema_evol_text_nonvec_mapwork_part_all_complex.q index c1e8af6..35767c1 100644 --- ql/src/test/queries/clientpositive/schema_evol_text_nonvec_mapwork_part_all_complex.q +++ ql/src/test/queries/clientpositive/schema_evol_text_nonvec_mapwork_part_all_complex.q @@ -160,3 +160,46 @@ select insert_num,part,b,s3 from part_add_to_various_various_struct4 order by in select insert_num,part,b,s3 from part_add_to_various_various_struct4 order by insert_num; drop table part_add_to_various_various_struct4; + + + +-- +-- SUBSECTION: ALTER TABLE ADD COLUMNS for Various --> Various: ADD COLUMNS to STRUCT type as INNER column +-- +CREATE TABLE part_add_to_various_various_struct5(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) PARTITIONED BY(part INT); + +CREATE TABLE struct5_a_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile; +load data local inpath '../../data/files/struct5_a.txt' overwrite into table struct5_a_txt; + +insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_a_txt; + +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num; + +-- Table-Non-Cascade CHANGE COLUMNS ... +alter table part_add_to_various_various_struct5 replace columns (insert_num int, b STRING, s5 STRUCT, after_struct_column STRING); + +CREATE TABLE struct5_b_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile; +load data local inpath '../../data/files/struct5_b.txt' overwrite into table struct5_b_txt; + +insert into table part_add_to_various_various_struct5 partition(part=2) select * from struct5_b_txt; + +CREATE TABLE struct5_c_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile; +load data local inpath '../../data/files/struct5_c.txt' overwrite into table struct5_c_txt; + +insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_c_txt; + +explain +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num; + +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num; + +drop table part_add_to_various_various_struct5; diff --git ql/src/test/queries/clientpositive/schema_evol_text_vec_mapwork_part_all_complex.q ql/src/test/queries/clientpositive/schema_evol_text_vec_mapwork_part_all_complex.q index a914544..8272cd6 100644 --- ql/src/test/queries/clientpositive/schema_evol_text_vec_mapwork_part_all_complex.q +++ ql/src/test/queries/clientpositive/schema_evol_text_vec_mapwork_part_all_complex.q @@ -162,3 +162,46 @@ select insert_num,part,b,s3 from part_add_to_various_various_struct4 order by in select insert_num,part,b,s3 from part_add_to_various_various_struct4 order by insert_num; drop table part_add_to_various_various_struct4; + + + +-- +-- SUBSECTION: ALTER TABLE ADD COLUMNS for Various --> Various: ADD COLUMNS to STRUCT type as INNER column +-- +CREATE TABLE part_add_to_various_various_struct5(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) PARTITIONED BY(part INT); + +CREATE TABLE struct5_a_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile; +load data local inpath '../../data/files/struct5_a.txt' overwrite into table struct5_a_txt; + +insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_a_txt; + +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num; + +-- Table-Non-Cascade CHANGE COLUMNS ... +alter table part_add_to_various_various_struct5 replace columns (insert_num int, b STRING, s5 STRUCT, after_struct_column STRING); + +CREATE TABLE struct5_b_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile; +load data local inpath '../../data/files/struct5_b.txt' overwrite into table struct5_b_txt; + +insert into table part_add_to_various_various_struct5 partition(part=2) select * from struct5_b_txt; + +CREATE TABLE struct5_c_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile; +load data local inpath '../../data/files/struct5_c.txt' overwrite into table struct5_c_txt; + +insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_c_txt; + +explain +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num; + +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num; + +drop table part_add_to_various_various_struct5; diff --git ql/src/test/queries/clientpositive/schema_evol_text_vecrow_mapwork_part_all_complex.q ql/src/test/queries/clientpositive/schema_evol_text_vecrow_mapwork_part_all_complex.q index 7737abf..babd032 100644 --- ql/src/test/queries/clientpositive/schema_evol_text_vecrow_mapwork_part_all_complex.q +++ ql/src/test/queries/clientpositive/schema_evol_text_vecrow_mapwork_part_all_complex.q @@ -163,3 +163,46 @@ select insert_num,part,b,s3 from part_add_to_various_various_struct4 order by in select insert_num,part,b,s3 from part_add_to_various_various_struct4 order by insert_num; drop table part_add_to_various_various_struct4; + + + +-- +-- SUBSECTION: ALTER TABLE ADD COLUMNS for Various --> Various: ADD COLUMNS to STRUCT type as INNER column +-- +CREATE TABLE part_add_to_various_various_struct5(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) PARTITIONED BY(part INT); + +CREATE TABLE struct5_a_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile; +load data local inpath '../../data/files/struct5_a.txt' overwrite into table struct5_a_txt; + +insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_a_txt; + +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num; + +-- Table-Non-Cascade CHANGE COLUMNS ... +alter table part_add_to_various_various_struct5 replace columns (insert_num int, b STRING, s5 STRUCT, after_struct_column STRING); + +CREATE TABLE struct5_b_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile; +load data local inpath '../../data/files/struct5_b.txt' overwrite into table struct5_b_txt; + +insert into table part_add_to_various_various_struct5 partition(part=2) select * from struct5_b_txt; + +CREATE TABLE struct5_c_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile; +load data local inpath '../../data/files/struct5_c.txt' overwrite into table struct5_c_txt; + +insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_c_txt; + +explain +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num; + +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num; + +drop table part_add_to_various_various_struct5; diff --git ql/src/test/results/clientpositive/schema_evol_orc_nonvec_mapwork_part_all_complex.q.out ql/src/test/results/clientpositive/schema_evol_orc_nonvec_mapwork_part_all_complex.q.out index 97e8fc0..bc2ff88 100644 --- ql/src/test/results/clientpositive/schema_evol_orc_nonvec_mapwork_part_all_complex.q.out +++ ql/src/test/results/clientpositive/schema_evol_orc_nonvec_mapwork_part_all_complex.q.out @@ -724,3 +724,216 @@ POSTHOOK: query: drop table part_add_to_various_various_struct4 POSTHOOK: type: DROPTABLE POSTHOOK: Input: default@part_add_to_various_various_struct4 POSTHOOK: Output: default@part_add_to_various_various_struct4 +PREHOOK: query: -- +-- SUBSECTION: ALTER TABLE ADD COLUMNS for Various --> Various: ADD COLUMNS to STRUCT type as INNER column +-- +CREATE TABLE part_add_to_various_various_struct5(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) PARTITIONED BY(part INT) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: -- +-- SUBSECTION: ALTER TABLE ADD COLUMNS for Various --> Various: ADD COLUMNS to STRUCT type as INNER column +-- +CREATE TABLE part_add_to_various_various_struct5(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) PARTITIONED BY(part INT) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@part_add_to_various_various_struct5 +PREHOOK: query: CREATE TABLE struct5_a_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_a_txt +POSTHOOK: query: CREATE TABLE struct5_a_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_a_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_a.txt' overwrite into table struct5_a_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_a_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_a.txt' overwrite into table struct5_a_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_a_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_a_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_a_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_a_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_a_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).after_struct_column SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).b SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).insert_num SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).s5 SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_a_txt.insert_num struct5_a_txt.b struct5_a_txt.s5 struct5_a_txt.after_struct_column +PREHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=1 +#### A masked pattern was here #### +POSTHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=1 +#### A masked pattern was here #### +insert_num part b s5 after_struct_column +1 1 original {"c1":true,"c2":null,"c3":null,"c4":3244222,"c5":-99999999999} after_original +2 1 original {"c1":null,"c2":100,"c3":null,"c4":14,"c5":-23866739993} after_original +PREHOOK: query: -- Table-Non-Cascade CHANGE COLUMNS ... +alter table part_add_to_various_various_struct5 replace columns (insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +PREHOOK: type: ALTERTABLE_REPLACECOLS +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: -- Table-Non-Cascade CHANGE COLUMNS ... +alter table part_add_to_various_various_struct5 replace columns (insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +POSTHOOK: type: ALTERTABLE_REPLACECOLS +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Output: default@part_add_to_various_various_struct5 +PREHOOK: query: CREATE TABLE struct5_b_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_b_txt +POSTHOOK: query: CREATE TABLE struct5_b_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_b_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_b.txt' overwrite into table struct5_b_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_b_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_b.txt' overwrite into table struct5_b_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_b_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=2) select * from struct5_b_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_b_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=2 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=2) select * from struct5_b_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_b_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=2 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).after_struct_column SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).b SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).insert_num SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).s5 SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_b_txt.insert_num struct5_b_txt.b struct5_b_txt.s5 struct5_b_txt.after_struct_column +PREHOOK: query: CREATE TABLE struct5_c_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_c_txt +POSTHOOK: query: CREATE TABLE struct5_c_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_c_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_c.txt' overwrite into table struct5_c_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_c_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_c.txt' overwrite into table struct5_c_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_c_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_c_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_c_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_c_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_c_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).after_struct_column SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).b SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).insert_num SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).s5 SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_c_txt.insert_num struct5_c_txt.b struct5_c_txt.s5 struct5_c_txt.after_struct_column +PREHOOK: query: explain +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +POSTHOOK: query: explain +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +Explain +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Map Operator Tree: + TableScan + alias: part_add_to_various_various_struct5 + Statistics: Num rows: 4 Data size: 1554 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: insert_num (type: int), part (type: int), b (type: string), s5 (type: struct), after_struct_column (type: string) + outputColumnNames: _col0, _col1, _col2, _col3, _col4 + Statistics: Num rows: 4 Data size: 1554 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: int) + sort order: + + Statistics: Num rows: 4 Data size: 1554 Basic stats: COMPLETE Column stats: NONE + value expressions: _col1 (type: int), _col2 (type: string), _col3 (type: struct), _col4 (type: string) + Reduce Operator Tree: + Select Operator + expressions: KEY.reducesinkkey0 (type: int), VALUE._col0 (type: int), VALUE._col1 (type: string), VALUE._col2 (type: struct), VALUE._col3 (type: string) + outputColumnNames: _col0, _col1, _col2, _col3, _col4 + Statistics: Num rows: 4 Data size: 1554 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 4 Data size: 1554 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.SequenceFileInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=1 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=2 +#### A masked pattern was here #### +POSTHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=2 +#### A masked pattern was here #### +insert_num part b s5 after_struct_column +1 1 original {"c1":true,"c2":null,"c3":null,"c4":3244222,"c5":-99999999999,"c6":null,"c7":null,"c8":null,"c9":null,"c10":null,"c11":null} after_original +2 1 original {"c1":null,"c2":100,"c3":null,"c4":14,"c5":-23866739993,"c6":null,"c7":null,"c8":null,"c9":null,"c10":null,"c11":null} after_original +3 2 new {"c1":true,"c2":null,"c3":null,"c4":-100,"c5":953967041,"c6":62.07915,"c7":718.78,"c8":1,"c9":"verdict ","c10":"verdict","c11":"1987-02-21 19:48:29"} after_new +4 1 new {"c1":false,"c2":-67,"c3":833,"c4":63993,"c5":1255178165,"c6":905071.0,"c7":-4314.7918,"c8":-1240033819,"c9":"trial ","c10":"trial","c11":"2016-03-07 03:02:22"} after_new +PREHOOK: query: drop table part_add_to_various_various_struct5 +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: drop table part_add_to_various_various_struct5 +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Output: default@part_add_to_various_various_struct5 diff --git ql/src/test/results/clientpositive/schema_evol_orc_vec_mapwork_part_all_complex.q.out ql/src/test/results/clientpositive/schema_evol_orc_vec_mapwork_part_all_complex.q.out index 62047fb..f8ce329 100644 --- ql/src/test/results/clientpositive/schema_evol_orc_vec_mapwork_part_all_complex.q.out +++ ql/src/test/results/clientpositive/schema_evol_orc_vec_mapwork_part_all_complex.q.out @@ -724,3 +724,216 @@ POSTHOOK: query: drop table part_add_to_various_various_struct4 POSTHOOK: type: DROPTABLE POSTHOOK: Input: default@part_add_to_various_various_struct4 POSTHOOK: Output: default@part_add_to_various_various_struct4 +PREHOOK: query: -- +-- SUBSECTION: ALTER TABLE ADD COLUMNS for Various --> Various: ADD COLUMNS to STRUCT type as INNER column +-- +CREATE TABLE part_add_to_various_various_struct5(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) PARTITIONED BY(part INT) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: -- +-- SUBSECTION: ALTER TABLE ADD COLUMNS for Various --> Various: ADD COLUMNS to STRUCT type as INNER column +-- +CREATE TABLE part_add_to_various_various_struct5(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) PARTITIONED BY(part INT) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@part_add_to_various_various_struct5 +PREHOOK: query: CREATE TABLE struct5_a_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_a_txt +POSTHOOK: query: CREATE TABLE struct5_a_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_a_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_a.txt' overwrite into table struct5_a_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_a_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_a.txt' overwrite into table struct5_a_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_a_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_a_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_a_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_a_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_a_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).after_struct_column SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).b SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).insert_num SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).s5 SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_a_txt.insert_num struct5_a_txt.b struct5_a_txt.s5 struct5_a_txt.after_struct_column +PREHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=1 +#### A masked pattern was here #### +POSTHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=1 +#### A masked pattern was here #### +insert_num part b s5 after_struct_column +1 1 original {"c1":true,"c2":null,"c3":null,"c4":3244222,"c5":-99999999999} after_original +2 1 original {"c1":null,"c2":100,"c3":null,"c4":14,"c5":-23866739993} after_original +PREHOOK: query: -- Table-Non-Cascade CHANGE COLUMNS ... +alter table part_add_to_various_various_struct5 replace columns (insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +PREHOOK: type: ALTERTABLE_REPLACECOLS +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: -- Table-Non-Cascade CHANGE COLUMNS ... +alter table part_add_to_various_various_struct5 replace columns (insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +POSTHOOK: type: ALTERTABLE_REPLACECOLS +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Output: default@part_add_to_various_various_struct5 +PREHOOK: query: CREATE TABLE struct5_b_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_b_txt +POSTHOOK: query: CREATE TABLE struct5_b_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_b_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_b.txt' overwrite into table struct5_b_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_b_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_b.txt' overwrite into table struct5_b_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_b_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=2) select * from struct5_b_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_b_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=2 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=2) select * from struct5_b_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_b_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=2 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).after_struct_column SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).b SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).insert_num SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).s5 SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_b_txt.insert_num struct5_b_txt.b struct5_b_txt.s5 struct5_b_txt.after_struct_column +PREHOOK: query: CREATE TABLE struct5_c_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_c_txt +POSTHOOK: query: CREATE TABLE struct5_c_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_c_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_c.txt' overwrite into table struct5_c_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_c_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_c.txt' overwrite into table struct5_c_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_c_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_c_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_c_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_c_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_c_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).after_struct_column SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).b SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).insert_num SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).s5 SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_c_txt.insert_num struct5_c_txt.b struct5_c_txt.s5 struct5_c_txt.after_struct_column +PREHOOK: query: explain +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +POSTHOOK: query: explain +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +Explain +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Map Operator Tree: + TableScan + alias: part_add_to_various_various_struct5 + Statistics: Num rows: 4 Data size: 1554 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: insert_num (type: int), part (type: int), b (type: string), s5 (type: struct), after_struct_column (type: string) + outputColumnNames: _col0, _col1, _col2, _col3, _col4 + Statistics: Num rows: 4 Data size: 1554 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: int) + sort order: + + Statistics: Num rows: 4 Data size: 1554 Basic stats: COMPLETE Column stats: NONE + value expressions: _col1 (type: int), _col2 (type: string), _col3 (type: struct), _col4 (type: string) + Reduce Operator Tree: + Select Operator + expressions: KEY.reducesinkkey0 (type: int), VALUE._col0 (type: int), VALUE._col1 (type: string), VALUE._col2 (type: struct), VALUE._col3 (type: string) + outputColumnNames: _col0, _col1, _col2, _col3, _col4 + Statistics: Num rows: 4 Data size: 1554 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 4 Data size: 1554 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.SequenceFileInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=1 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=2 +#### A masked pattern was here #### +POSTHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=2 +#### A masked pattern was here #### +insert_num part b s5 after_struct_column +1 1 original {"c1":true,"c2":null,"c3":null,"c4":3244222,"c5":-99999999999,"c6":null,"c7":null,"c8":null,"c9":null,"c10":null,"c11":null} after_original +2 1 original {"c1":null,"c2":100,"c3":null,"c4":14,"c5":-23866739993,"c6":null,"c7":null,"c8":null,"c9":null,"c10":null,"c11":null} after_original +3 2 new {"c1":true,"c2":null,"c3":null,"c4":-100,"c5":953967041,"c6":62.07915,"c7":718.78,"c8":1,"c9":"verdict ","c10":"verdict","c11":"1987-02-21 19:48:29"} after_new +4 1 new {"c1":false,"c2":-67,"c3":833,"c4":63993,"c5":1255178165,"c6":905071.0,"c7":-4314.7918,"c8":-1240033819,"c9":"trial ","c10":"trial","c11":"2016-03-07 03:02:22"} after_new +PREHOOK: query: drop table part_add_to_various_various_struct5 +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: drop table part_add_to_various_various_struct5 +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Output: default@part_add_to_various_various_struct5 diff --git ql/src/test/results/clientpositive/schema_evol_text_nonvec_mapwork_part_all_complex.q.out ql/src/test/results/clientpositive/schema_evol_text_nonvec_mapwork_part_all_complex.q.out index 2a5fb24..239b558 100644 --- ql/src/test/results/clientpositive/schema_evol_text_nonvec_mapwork_part_all_complex.q.out +++ ql/src/test/results/clientpositive/schema_evol_text_nonvec_mapwork_part_all_complex.q.out @@ -724,3 +724,216 @@ POSTHOOK: query: drop table part_add_to_various_various_struct4 POSTHOOK: type: DROPTABLE POSTHOOK: Input: default@part_add_to_various_various_struct4 POSTHOOK: Output: default@part_add_to_various_various_struct4 +PREHOOK: query: -- +-- SUBSECTION: ALTER TABLE ADD COLUMNS for Various --> Various: ADD COLUMNS to STRUCT type as INNER column +-- +CREATE TABLE part_add_to_various_various_struct5(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) PARTITIONED BY(part INT) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: -- +-- SUBSECTION: ALTER TABLE ADD COLUMNS for Various --> Various: ADD COLUMNS to STRUCT type as INNER column +-- +CREATE TABLE part_add_to_various_various_struct5(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) PARTITIONED BY(part INT) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@part_add_to_various_various_struct5 +PREHOOK: query: CREATE TABLE struct5_a_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_a_txt +POSTHOOK: query: CREATE TABLE struct5_a_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_a_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_a.txt' overwrite into table struct5_a_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_a_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_a.txt' overwrite into table struct5_a_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_a_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_a_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_a_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_a_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_a_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).after_struct_column SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).b SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).insert_num SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).s5 SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_a_txt.insert_num struct5_a_txt.b struct5_a_txt.s5 struct5_a_txt.after_struct_column +PREHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=1 +#### A masked pattern was here #### +POSTHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=1 +#### A masked pattern was here #### +insert_num part b s5 after_struct_column +1 1 original {"c1":true,"c2":null,"c3":null,"c4":3244222,"c5":-99999999999} after_original +2 1 original {"c1":null,"c2":100,"c3":null,"c4":14,"c5":-23866739993} after_original +PREHOOK: query: -- Table-Non-Cascade CHANGE COLUMNS ... +alter table part_add_to_various_various_struct5 replace columns (insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +PREHOOK: type: ALTERTABLE_REPLACECOLS +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: -- Table-Non-Cascade CHANGE COLUMNS ... +alter table part_add_to_various_various_struct5 replace columns (insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +POSTHOOK: type: ALTERTABLE_REPLACECOLS +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Output: default@part_add_to_various_various_struct5 +PREHOOK: query: CREATE TABLE struct5_b_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_b_txt +POSTHOOK: query: CREATE TABLE struct5_b_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_b_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_b.txt' overwrite into table struct5_b_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_b_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_b.txt' overwrite into table struct5_b_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_b_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=2) select * from struct5_b_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_b_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=2 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=2) select * from struct5_b_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_b_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=2 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).after_struct_column SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).b SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).insert_num SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).s5 SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_b_txt.insert_num struct5_b_txt.b struct5_b_txt.s5 struct5_b_txt.after_struct_column +PREHOOK: query: CREATE TABLE struct5_c_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_c_txt +POSTHOOK: query: CREATE TABLE struct5_c_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_c_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_c.txt' overwrite into table struct5_c_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_c_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_c.txt' overwrite into table struct5_c_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_c_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_c_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_c_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_c_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_c_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).after_struct_column SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).b SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).insert_num SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).s5 SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_c_txt.insert_num struct5_c_txt.b struct5_c_txt.s5 struct5_c_txt.after_struct_column +PREHOOK: query: explain +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +POSTHOOK: query: explain +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +Explain +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Map Operator Tree: + TableScan + alias: part_add_to_various_various_struct5 + Statistics: Num rows: 4 Data size: 389 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: insert_num (type: int), part (type: int), b (type: string), s5 (type: struct), after_struct_column (type: string) + outputColumnNames: _col0, _col1, _col2, _col3, _col4 + Statistics: Num rows: 4 Data size: 389 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: int) + sort order: + + Statistics: Num rows: 4 Data size: 389 Basic stats: COMPLETE Column stats: NONE + value expressions: _col1 (type: int), _col2 (type: string), _col3 (type: struct), _col4 (type: string) + Reduce Operator Tree: + Select Operator + expressions: KEY.reducesinkkey0 (type: int), VALUE._col0 (type: int), VALUE._col1 (type: string), VALUE._col2 (type: struct), VALUE._col3 (type: string) + outputColumnNames: _col0, _col1, _col2, _col3, _col4 + Statistics: Num rows: 4 Data size: 389 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 4 Data size: 389 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.SequenceFileInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=1 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=2 +#### A masked pattern was here #### +POSTHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=2 +#### A masked pattern was here #### +insert_num part b s5 after_struct_column +1 1 original {"c1":true,"c2":null,"c3":null,"c4":3244222,"c5":-99999999999,"c6":null,"c7":null,"c8":null,"c9":null,"c10":null,"c11":null} after_original +2 1 original {"c1":null,"c2":100,"c3":null,"c4":14,"c5":-23866739993,"c6":null,"c7":null,"c8":null,"c9":null,"c10":null,"c11":null} after_original +3 2 new {"c1":true,"c2":null,"c3":null,"c4":-100,"c5":953967041,"c6":62.07915,"c7":718.78,"c8":1,"c9":"verdict ","c10":"verdict","c11":"1987-02-21 19:48:29"} after_new +4 1 new {"c1":false,"c2":-67,"c3":833,"c4":63993,"c5":1255178165,"c6":null,"c7":null,"c8":null,"c9":null,"c10":null,"c11":null} after_new +PREHOOK: query: drop table part_add_to_various_various_struct5 +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: drop table part_add_to_various_various_struct5 +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Output: default@part_add_to_various_various_struct5 diff --git ql/src/test/results/clientpositive/schema_evol_text_vec_mapwork_part_all_complex.q.out ql/src/test/results/clientpositive/schema_evol_text_vec_mapwork_part_all_complex.q.out index 7a1ccfe..e03e2d5 100644 --- ql/src/test/results/clientpositive/schema_evol_text_vec_mapwork_part_all_complex.q.out +++ ql/src/test/results/clientpositive/schema_evol_text_vec_mapwork_part_all_complex.q.out @@ -728,3 +728,216 @@ POSTHOOK: query: drop table part_add_to_various_various_struct4 POSTHOOK: type: DROPTABLE POSTHOOK: Input: default@part_add_to_various_various_struct4 POSTHOOK: Output: default@part_add_to_various_various_struct4 +PREHOOK: query: -- +-- SUBSECTION: ALTER TABLE ADD COLUMNS for Various --> Various: ADD COLUMNS to STRUCT type as INNER column +-- +CREATE TABLE part_add_to_various_various_struct5(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) PARTITIONED BY(part INT) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: -- +-- SUBSECTION: ALTER TABLE ADD COLUMNS for Various --> Various: ADD COLUMNS to STRUCT type as INNER column +-- +CREATE TABLE part_add_to_various_various_struct5(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) PARTITIONED BY(part INT) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@part_add_to_various_various_struct5 +PREHOOK: query: CREATE TABLE struct5_a_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_a_txt +POSTHOOK: query: CREATE TABLE struct5_a_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_a_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_a.txt' overwrite into table struct5_a_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_a_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_a.txt' overwrite into table struct5_a_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_a_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_a_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_a_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_a_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_a_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).after_struct_column SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).b SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).insert_num SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).s5 SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_a_txt.insert_num struct5_a_txt.b struct5_a_txt.s5 struct5_a_txt.after_struct_column +PREHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=1 +#### A masked pattern was here #### +POSTHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=1 +#### A masked pattern was here #### +insert_num part b s5 after_struct_column +1 1 original {"c1":true,"c2":null,"c3":null,"c4":3244222,"c5":-99999999999} after_original +2 1 original {"c1":null,"c2":100,"c3":null,"c4":14,"c5":-23866739993} after_original +PREHOOK: query: -- Table-Non-Cascade CHANGE COLUMNS ... +alter table part_add_to_various_various_struct5 replace columns (insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +PREHOOK: type: ALTERTABLE_REPLACECOLS +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: -- Table-Non-Cascade CHANGE COLUMNS ... +alter table part_add_to_various_various_struct5 replace columns (insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +POSTHOOK: type: ALTERTABLE_REPLACECOLS +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Output: default@part_add_to_various_various_struct5 +PREHOOK: query: CREATE TABLE struct5_b_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_b_txt +POSTHOOK: query: CREATE TABLE struct5_b_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_b_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_b.txt' overwrite into table struct5_b_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_b_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_b.txt' overwrite into table struct5_b_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_b_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=2) select * from struct5_b_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_b_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=2 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=2) select * from struct5_b_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_b_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=2 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).after_struct_column SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).b SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).insert_num SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).s5 SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_b_txt.insert_num struct5_b_txt.b struct5_b_txt.s5 struct5_b_txt.after_struct_column +PREHOOK: query: CREATE TABLE struct5_c_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_c_txt +POSTHOOK: query: CREATE TABLE struct5_c_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_c_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_c.txt' overwrite into table struct5_c_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_c_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_c.txt' overwrite into table struct5_c_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_c_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_c_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_c_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_c_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_c_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).after_struct_column SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).b SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).insert_num SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).s5 SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_c_txt.insert_num struct5_c_txt.b struct5_c_txt.s5 struct5_c_txt.after_struct_column +PREHOOK: query: explain +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +POSTHOOK: query: explain +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +Explain +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Map Operator Tree: + TableScan + alias: part_add_to_various_various_struct5 + Statistics: Num rows: 4 Data size: 389 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: insert_num (type: int), part (type: int), b (type: string), s5 (type: struct), after_struct_column (type: string) + outputColumnNames: _col0, _col1, _col2, _col3, _col4 + Statistics: Num rows: 4 Data size: 389 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: int) + sort order: + + Statistics: Num rows: 4 Data size: 389 Basic stats: COMPLETE Column stats: NONE + value expressions: _col1 (type: int), _col2 (type: string), _col3 (type: struct), _col4 (type: string) + Reduce Operator Tree: + Select Operator + expressions: KEY.reducesinkkey0 (type: int), VALUE._col0 (type: int), VALUE._col1 (type: string), VALUE._col2 (type: struct), VALUE._col3 (type: string) + outputColumnNames: _col0, _col1, _col2, _col3, _col4 + Statistics: Num rows: 4 Data size: 389 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 4 Data size: 389 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.SequenceFileInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=1 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=2 +#### A masked pattern was here #### +POSTHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=2 +#### A masked pattern was here #### +insert_num part b s5 after_struct_column +1 1 original {"c1":true,"c2":null,"c3":null,"c4":3244222,"c5":-99999999999,"c6":null,"c7":null,"c8":null,"c9":null,"c10":null,"c11":null} after_original +2 1 original {"c1":null,"c2":100,"c3":null,"c4":14,"c5":-23866739993,"c6":null,"c7":null,"c8":null,"c9":null,"c10":null,"c11":null} after_original +3 2 new {"c1":true,"c2":null,"c3":null,"c4":-100,"c5":953967041,"c6":62.07915,"c7":718.78,"c8":1,"c9":"verdict ","c10":"verdict","c11":"1987-02-21 19:48:29"} after_new +4 1 new {"c1":false,"c2":-67,"c3":833,"c4":63993,"c5":1255178165,"c6":null,"c7":null,"c8":null,"c9":null,"c10":null,"c11":null} after_new +PREHOOK: query: drop table part_add_to_various_various_struct5 +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: drop table part_add_to_various_various_struct5 +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Output: default@part_add_to_various_various_struct5 diff --git ql/src/test/results/clientpositive/schema_evol_text_vecrow_mapwork_part_all_complex.q.out ql/src/test/results/clientpositive/schema_evol_text_vecrow_mapwork_part_all_complex.q.out index 8af1b4f..8f5e147 100644 --- ql/src/test/results/clientpositive/schema_evol_text_vecrow_mapwork_part_all_complex.q.out +++ ql/src/test/results/clientpositive/schema_evol_text_vecrow_mapwork_part_all_complex.q.out @@ -730,3 +730,216 @@ POSTHOOK: query: drop table part_add_to_various_various_struct4 POSTHOOK: type: DROPTABLE POSTHOOK: Input: default@part_add_to_various_various_struct4 POSTHOOK: Output: default@part_add_to_various_various_struct4 +PREHOOK: query: -- +-- SUBSECTION: ALTER TABLE ADD COLUMNS for Various --> Various: ADD COLUMNS to STRUCT type as INNER column +-- +CREATE TABLE part_add_to_various_various_struct5(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) PARTITIONED BY(part INT) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: -- +-- SUBSECTION: ALTER TABLE ADD COLUMNS for Various --> Various: ADD COLUMNS to STRUCT type as INNER column +-- +CREATE TABLE part_add_to_various_various_struct5(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) PARTITIONED BY(part INT) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@part_add_to_various_various_struct5 +PREHOOK: query: CREATE TABLE struct5_a_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_a_txt +POSTHOOK: query: CREATE TABLE struct5_a_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_a_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_a.txt' overwrite into table struct5_a_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_a_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_a.txt' overwrite into table struct5_a_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_a_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_a_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_a_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_a_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_a_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).after_struct_column SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).b SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).insert_num SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).s5 SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_a_txt.insert_num struct5_a_txt.b struct5_a_txt.s5 struct5_a_txt.after_struct_column +PREHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=1 +#### A masked pattern was here #### +POSTHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=1 +#### A masked pattern was here #### +insert_num part b s5 after_struct_column +1 1 original {"c1":true,"c2":null,"c3":null,"c4":3244222,"c5":-99999999999} after_original +2 1 original {"c1":null,"c2":100,"c3":null,"c4":14,"c5":-23866739993} after_original +PREHOOK: query: -- Table-Non-Cascade CHANGE COLUMNS ... +alter table part_add_to_various_various_struct5 replace columns (insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +PREHOOK: type: ALTERTABLE_REPLACECOLS +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: -- Table-Non-Cascade CHANGE COLUMNS ... +alter table part_add_to_various_various_struct5 replace columns (insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +POSTHOOK: type: ALTERTABLE_REPLACECOLS +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Output: default@part_add_to_various_various_struct5 +PREHOOK: query: CREATE TABLE struct5_b_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_b_txt +POSTHOOK: query: CREATE TABLE struct5_b_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_b_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_b.txt' overwrite into table struct5_b_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_b_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_b.txt' overwrite into table struct5_b_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_b_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=2) select * from struct5_b_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_b_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=2 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=2) select * from struct5_b_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_b_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=2 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).after_struct_column SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).b SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).insert_num SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).s5 SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_b_txt.insert_num struct5_b_txt.b struct5_b_txt.s5 struct5_b_txt.after_struct_column +PREHOOK: query: CREATE TABLE struct5_c_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_c_txt +POSTHOOK: query: CREATE TABLE struct5_c_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_c_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_c.txt' overwrite into table struct5_c_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_c_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_c.txt' overwrite into table struct5_c_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_c_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_c_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_c_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_c_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_c_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).after_struct_column SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).b SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).insert_num SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).s5 SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_c_txt.insert_num struct5_c_txt.b struct5_c_txt.s5 struct5_c_txt.after_struct_column +PREHOOK: query: explain +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +POSTHOOK: query: explain +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +Explain +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Map Operator Tree: + TableScan + alias: part_add_to_various_various_struct5 + Statistics: Num rows: 4 Data size: 389 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: insert_num (type: int), part (type: int), b (type: string), s5 (type: struct), after_struct_column (type: string) + outputColumnNames: _col0, _col1, _col2, _col3, _col4 + Statistics: Num rows: 4 Data size: 389 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: int) + sort order: + + Statistics: Num rows: 4 Data size: 389 Basic stats: COMPLETE Column stats: NONE + value expressions: _col1 (type: int), _col2 (type: string), _col3 (type: struct), _col4 (type: string) + Reduce Operator Tree: + Select Operator + expressions: KEY.reducesinkkey0 (type: int), VALUE._col0 (type: int), VALUE._col1 (type: string), VALUE._col2 (type: struct), VALUE._col3 (type: string) + outputColumnNames: _col0, _col1, _col2, _col3, _col4 + Statistics: Num rows: 4 Data size: 389 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 4 Data size: 389 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.SequenceFileInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=1 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=2 +#### A masked pattern was here #### +POSTHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=2 +#### A masked pattern was here #### +insert_num part b s5 after_struct_column +1 1 original {"c1":true,"c2":null,"c3":null,"c4":3244222,"c5":-99999999999,"c6":null,"c7":null,"c8":null,"c9":null,"c10":null,"c11":null} after_original +2 1 original {"c1":null,"c2":100,"c3":null,"c4":14,"c5":-23866739993,"c6":null,"c7":null,"c8":null,"c9":null,"c10":null,"c11":null} after_original +3 2 new {"c1":true,"c2":null,"c3":null,"c4":-100,"c5":953967041,"c6":62.07915,"c7":718.78,"c8":1,"c9":"verdict ","c10":"verdict","c11":"1987-02-21 19:48:29"} after_new +4 1 new {"c1":false,"c2":-67,"c3":833,"c4":63993,"c5":1255178165,"c6":null,"c7":null,"c8":null,"c9":null,"c10":null,"c11":null} after_new +PREHOOK: query: drop table part_add_to_various_various_struct5 +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: drop table part_add_to_various_various_struct5 +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Output: default@part_add_to_various_various_struct5 diff --git ql/src/test/results/clientpositive/tez/schema_evol_orc_nonvec_mapwork_part_all_complex.q.out ql/src/test/results/clientpositive/tez/schema_evol_orc_nonvec_mapwork_part_all_complex.q.out index 34795b1..c10a210 100644 --- ql/src/test/results/clientpositive/tez/schema_evol_orc_nonvec_mapwork_part_all_complex.q.out +++ ql/src/test/results/clientpositive/tez/schema_evol_orc_nonvec_mapwork_part_all_complex.q.out @@ -667,3 +667,197 @@ POSTHOOK: query: drop table part_add_to_various_various_struct4 POSTHOOK: type: DROPTABLE POSTHOOK: Input: default@part_add_to_various_various_struct4 POSTHOOK: Output: default@part_add_to_various_various_struct4 +PREHOOK: query: -- +-- SUBSECTION: ALTER TABLE ADD COLUMNS for Various --> Various: ADD COLUMNS to STRUCT type as INNER column +-- +CREATE TABLE part_add_to_various_various_struct5(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) PARTITIONED BY(part INT) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: -- +-- SUBSECTION: ALTER TABLE ADD COLUMNS for Various --> Various: ADD COLUMNS to STRUCT type as INNER column +-- +CREATE TABLE part_add_to_various_various_struct5(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) PARTITIONED BY(part INT) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@part_add_to_various_various_struct5 +PREHOOK: query: CREATE TABLE struct5_a_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_a_txt +POSTHOOK: query: CREATE TABLE struct5_a_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_a_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_a.txt' overwrite into table struct5_a_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_a_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_a.txt' overwrite into table struct5_a_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_a_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_a_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_a_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_a_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_a_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).after_struct_column SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).b SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).insert_num SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).s5 SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_a_txt.insert_num struct5_a_txt.b struct5_a_txt.s5 struct5_a_txt.after_struct_column +PREHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=1 +#### A masked pattern was here #### +POSTHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=1 +#### A masked pattern was here #### +insert_num part b s5 after_struct_column +1 1 original {"c1":true,"c2":null,"c3":null,"c4":3244222,"c5":-99999999999} after_original +2 1 original {"c1":null,"c2":100,"c3":null,"c4":14,"c5":-23866739993} after_original +PREHOOK: query: -- Table-Non-Cascade CHANGE COLUMNS ... +alter table part_add_to_various_various_struct5 replace columns (insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +PREHOOK: type: ALTERTABLE_REPLACECOLS +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: -- Table-Non-Cascade CHANGE COLUMNS ... +alter table part_add_to_various_various_struct5 replace columns (insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +POSTHOOK: type: ALTERTABLE_REPLACECOLS +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Output: default@part_add_to_various_various_struct5 +PREHOOK: query: CREATE TABLE struct5_b_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_b_txt +POSTHOOK: query: CREATE TABLE struct5_b_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_b_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_b.txt' overwrite into table struct5_b_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_b_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_b.txt' overwrite into table struct5_b_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_b_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=2) select * from struct5_b_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_b_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=2 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=2) select * from struct5_b_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_b_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=2 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).after_struct_column SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).b SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).insert_num SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).s5 SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_b_txt.insert_num struct5_b_txt.b struct5_b_txt.s5 struct5_b_txt.after_struct_column +PREHOOK: query: CREATE TABLE struct5_c_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_c_txt +POSTHOOK: query: CREATE TABLE struct5_c_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_c_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_c.txt' overwrite into table struct5_c_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_c_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_c.txt' overwrite into table struct5_c_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_c_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_c_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_c_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_c_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_c_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).after_struct_column SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).b SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).insert_num SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).s5 SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_c_txt.insert_num struct5_c_txt.b struct5_c_txt.s5 struct5_c_txt.after_struct_column +PREHOOK: query: explain +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +POSTHOOK: query: explain +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +Explain +Plan optimized by CBO. + +Vertex dependency in root stage +Reducer 2 <- Map 1 (SIMPLE_EDGE) + +Stage-0 + Fetch Operator + limit:-1 + Stage-1 + Reducer 2 + File Output Operator [FS_4] + Select Operator [SEL_3] (rows=4 width=388) + Output:["_col0","_col1","_col2","_col3","_col4"] + <-Map 1 [SIMPLE_EDGE] + SHUFFLE [RS_2] + Select Operator [SEL_1] (rows=4 width=388) + Output:["_col0","_col1","_col2","_col3","_col4"] + TableScan [TS_0] (rows=4 width=388) + default@part_add_to_various_various_struct5,part_add_to_various_various_struct5,Tbl:COMPLETE,Col:NONE,Output:["insert_num","b","s5","after_struct_column"] + +PREHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=1 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=2 +#### A masked pattern was here #### +POSTHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=2 +#### A masked pattern was here #### +insert_num part b s5 after_struct_column +1 1 original {"c1":true,"c2":null,"c3":null,"c4":3244222,"c5":-99999999999,"c6":null,"c7":null,"c8":null,"c9":null,"c10":null,"c11":null} after_original +2 1 original {"c1":null,"c2":100,"c3":null,"c4":14,"c5":-23866739993,"c6":null,"c7":null,"c8":null,"c9":null,"c10":null,"c11":null} after_original +3 2 new {"c1":true,"c2":null,"c3":null,"c4":-100,"c5":953967041,"c6":62.07915,"c7":718.78,"c8":1,"c9":"verdict ","c10":"verdict","c11":"1987-02-21 19:48:29"} after_new +4 1 new {"c1":false,"c2":-67,"c3":833,"c4":63993,"c5":1255178165,"c6":905071.0,"c7":-4314.7918,"c8":-1240033819,"c9":"trial ","c10":"trial","c11":"2016-03-07 03:02:22"} after_new +PREHOOK: query: drop table part_add_to_various_various_struct5 +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: drop table part_add_to_various_various_struct5 +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Output: default@part_add_to_various_various_struct5 diff --git ql/src/test/results/clientpositive/tez/schema_evol_orc_vec_mapwork_part_all_complex.q.out ql/src/test/results/clientpositive/tez/schema_evol_orc_vec_mapwork_part_all_complex.q.out index c91eb0b..9aac540 100644 --- ql/src/test/results/clientpositive/tez/schema_evol_orc_vec_mapwork_part_all_complex.q.out +++ ql/src/test/results/clientpositive/tez/schema_evol_orc_vec_mapwork_part_all_complex.q.out @@ -667,3 +667,197 @@ POSTHOOK: query: drop table part_add_to_various_various_struct4 POSTHOOK: type: DROPTABLE POSTHOOK: Input: default@part_add_to_various_various_struct4 POSTHOOK: Output: default@part_add_to_various_various_struct4 +PREHOOK: query: -- +-- SUBSECTION: ALTER TABLE ADD COLUMNS for Various --> Various: ADD COLUMNS to STRUCT type as INNER column +-- +CREATE TABLE part_add_to_various_various_struct5(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) PARTITIONED BY(part INT) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: -- +-- SUBSECTION: ALTER TABLE ADD COLUMNS for Various --> Various: ADD COLUMNS to STRUCT type as INNER column +-- +CREATE TABLE part_add_to_various_various_struct5(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) PARTITIONED BY(part INT) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@part_add_to_various_various_struct5 +PREHOOK: query: CREATE TABLE struct5_a_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_a_txt +POSTHOOK: query: CREATE TABLE struct5_a_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_a_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_a.txt' overwrite into table struct5_a_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_a_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_a.txt' overwrite into table struct5_a_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_a_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_a_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_a_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_a_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_a_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).after_struct_column SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).b SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).insert_num SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).s5 SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_a_txt.insert_num struct5_a_txt.b struct5_a_txt.s5 struct5_a_txt.after_struct_column +PREHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=1 +#### A masked pattern was here #### +POSTHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=1 +#### A masked pattern was here #### +insert_num part b s5 after_struct_column +1 1 original {"c1":true,"c2":null,"c3":null,"c4":3244222,"c5":-99999999999} after_original +2 1 original {"c1":null,"c2":100,"c3":null,"c4":14,"c5":-23866739993} after_original +PREHOOK: query: -- Table-Non-Cascade CHANGE COLUMNS ... +alter table part_add_to_various_various_struct5 replace columns (insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +PREHOOK: type: ALTERTABLE_REPLACECOLS +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: -- Table-Non-Cascade CHANGE COLUMNS ... +alter table part_add_to_various_various_struct5 replace columns (insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +POSTHOOK: type: ALTERTABLE_REPLACECOLS +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Output: default@part_add_to_various_various_struct5 +PREHOOK: query: CREATE TABLE struct5_b_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_b_txt +POSTHOOK: query: CREATE TABLE struct5_b_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_b_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_b.txt' overwrite into table struct5_b_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_b_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_b.txt' overwrite into table struct5_b_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_b_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=2) select * from struct5_b_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_b_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=2 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=2) select * from struct5_b_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_b_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=2 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).after_struct_column SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).b SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).insert_num SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).s5 SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_b_txt.insert_num struct5_b_txt.b struct5_b_txt.s5 struct5_b_txt.after_struct_column +PREHOOK: query: CREATE TABLE struct5_c_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_c_txt +POSTHOOK: query: CREATE TABLE struct5_c_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_c_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_c.txt' overwrite into table struct5_c_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_c_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_c.txt' overwrite into table struct5_c_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_c_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_c_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_c_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_c_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_c_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).after_struct_column SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).b SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).insert_num SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).s5 SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_c_txt.insert_num struct5_c_txt.b struct5_c_txt.s5 struct5_c_txt.after_struct_column +PREHOOK: query: explain +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +POSTHOOK: query: explain +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +Explain +Plan optimized by CBO. + +Vertex dependency in root stage +Reducer 2 <- Map 1 (SIMPLE_EDGE) + +Stage-0 + Fetch Operator + limit:-1 + Stage-1 + Reducer 2 + File Output Operator [FS_4] + Select Operator [SEL_3] (rows=4 width=388) + Output:["_col0","_col1","_col2","_col3","_col4"] + <-Map 1 [SIMPLE_EDGE] + SHUFFLE [RS_2] + Select Operator [SEL_1] (rows=4 width=388) + Output:["_col0","_col1","_col2","_col3","_col4"] + TableScan [TS_0] (rows=4 width=388) + default@part_add_to_various_various_struct5,part_add_to_various_various_struct5,Tbl:COMPLETE,Col:NONE,Output:["insert_num","b","s5","after_struct_column"] + +PREHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=1 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=2 +#### A masked pattern was here #### +POSTHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=2 +#### A masked pattern was here #### +insert_num part b s5 after_struct_column +1 1 original {"c1":true,"c2":null,"c3":null,"c4":3244222,"c5":-99999999999,"c6":null,"c7":null,"c8":null,"c9":null,"c10":null,"c11":null} after_original +2 1 original {"c1":null,"c2":100,"c3":null,"c4":14,"c5":-23866739993,"c6":null,"c7":null,"c8":null,"c9":null,"c10":null,"c11":null} after_original +3 2 new {"c1":true,"c2":null,"c3":null,"c4":-100,"c5":953967041,"c6":62.07915,"c7":718.78,"c8":1,"c9":"verdict ","c10":"verdict","c11":"1987-02-21 19:48:29"} after_new +4 1 new {"c1":false,"c2":-67,"c3":833,"c4":63993,"c5":1255178165,"c6":905071.0,"c7":-4314.7918,"c8":-1240033819,"c9":"trial ","c10":"trial","c11":"2016-03-07 03:02:22"} after_new +PREHOOK: query: drop table part_add_to_various_various_struct5 +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: drop table part_add_to_various_various_struct5 +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Output: default@part_add_to_various_various_struct5 diff --git ql/src/test/results/clientpositive/tez/schema_evol_text_nonvec_mapwork_part_all_complex.q.out ql/src/test/results/clientpositive/tez/schema_evol_text_nonvec_mapwork_part_all_complex.q.out index b0b00b8..49be99f 100644 --- ql/src/test/results/clientpositive/tez/schema_evol_text_nonvec_mapwork_part_all_complex.q.out +++ ql/src/test/results/clientpositive/tez/schema_evol_text_nonvec_mapwork_part_all_complex.q.out @@ -667,3 +667,197 @@ POSTHOOK: query: drop table part_add_to_various_various_struct4 POSTHOOK: type: DROPTABLE POSTHOOK: Input: default@part_add_to_various_various_struct4 POSTHOOK: Output: default@part_add_to_various_various_struct4 +PREHOOK: query: -- +-- SUBSECTION: ALTER TABLE ADD COLUMNS for Various --> Various: ADD COLUMNS to STRUCT type as INNER column +-- +CREATE TABLE part_add_to_various_various_struct5(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) PARTITIONED BY(part INT) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: -- +-- SUBSECTION: ALTER TABLE ADD COLUMNS for Various --> Various: ADD COLUMNS to STRUCT type as INNER column +-- +CREATE TABLE part_add_to_various_various_struct5(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) PARTITIONED BY(part INT) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@part_add_to_various_various_struct5 +PREHOOK: query: CREATE TABLE struct5_a_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_a_txt +POSTHOOK: query: CREATE TABLE struct5_a_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_a_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_a.txt' overwrite into table struct5_a_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_a_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_a.txt' overwrite into table struct5_a_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_a_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_a_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_a_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_a_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_a_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).after_struct_column SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).b SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).insert_num SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).s5 SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_a_txt.insert_num struct5_a_txt.b struct5_a_txt.s5 struct5_a_txt.after_struct_column +PREHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=1 +#### A masked pattern was here #### +POSTHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=1 +#### A masked pattern was here #### +insert_num part b s5 after_struct_column +1 1 original {"c1":true,"c2":null,"c3":null,"c4":3244222,"c5":-99999999999} after_original +2 1 original {"c1":null,"c2":100,"c3":null,"c4":14,"c5":-23866739993} after_original +PREHOOK: query: -- Table-Non-Cascade CHANGE COLUMNS ... +alter table part_add_to_various_various_struct5 replace columns (insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +PREHOOK: type: ALTERTABLE_REPLACECOLS +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: -- Table-Non-Cascade CHANGE COLUMNS ... +alter table part_add_to_various_various_struct5 replace columns (insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +POSTHOOK: type: ALTERTABLE_REPLACECOLS +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Output: default@part_add_to_various_various_struct5 +PREHOOK: query: CREATE TABLE struct5_b_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_b_txt +POSTHOOK: query: CREATE TABLE struct5_b_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_b_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_b.txt' overwrite into table struct5_b_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_b_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_b.txt' overwrite into table struct5_b_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_b_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=2) select * from struct5_b_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_b_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=2 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=2) select * from struct5_b_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_b_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=2 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).after_struct_column SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).b SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).insert_num SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).s5 SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_b_txt.insert_num struct5_b_txt.b struct5_b_txt.s5 struct5_b_txt.after_struct_column +PREHOOK: query: CREATE TABLE struct5_c_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_c_txt +POSTHOOK: query: CREATE TABLE struct5_c_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_c_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_c.txt' overwrite into table struct5_c_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_c_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_c.txt' overwrite into table struct5_c_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_c_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_c_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_c_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_c_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_c_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).after_struct_column SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).b SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).insert_num SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).s5 SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_c_txt.insert_num struct5_c_txt.b struct5_c_txt.s5 struct5_c_txt.after_struct_column +PREHOOK: query: explain +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +POSTHOOK: query: explain +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +Explain +Plan optimized by CBO. + +Vertex dependency in root stage +Reducer 2 <- Map 1 (SIMPLE_EDGE) + +Stage-0 + Fetch Operator + limit:-1 + Stage-1 + Reducer 2 + File Output Operator [FS_4] + Select Operator [SEL_3] (rows=4 width=97) + Output:["_col0","_col1","_col2","_col3","_col4"] + <-Map 1 [SIMPLE_EDGE] + SHUFFLE [RS_2] + Select Operator [SEL_1] (rows=4 width=97) + Output:["_col0","_col1","_col2","_col3","_col4"] + TableScan [TS_0] (rows=4 width=97) + default@part_add_to_various_various_struct5,part_add_to_various_various_struct5,Tbl:COMPLETE,Col:NONE,Output:["insert_num","b","s5","after_struct_column"] + +PREHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=1 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=2 +#### A masked pattern was here #### +POSTHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=2 +#### A masked pattern was here #### +insert_num part b s5 after_struct_column +1 1 original {"c1":true,"c2":null,"c3":null,"c4":3244222,"c5":-99999999999,"c6":null,"c7":null,"c8":null,"c9":null,"c10":null,"c11":null} after_original +2 1 original {"c1":null,"c2":100,"c3":null,"c4":14,"c5":-23866739993,"c6":null,"c7":null,"c8":null,"c9":null,"c10":null,"c11":null} after_original +3 2 new {"c1":true,"c2":null,"c3":null,"c4":-100,"c5":953967041,"c6":62.07915,"c7":718.78,"c8":1,"c9":"verdict ","c10":"verdict","c11":"1987-02-21 19:48:29"} after_new +4 1 new {"c1":false,"c2":-67,"c3":833,"c4":63993,"c5":1255178165,"c6":null,"c7":null,"c8":null,"c9":null,"c10":null,"c11":null} after_new +PREHOOK: query: drop table part_add_to_various_various_struct5 +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: drop table part_add_to_various_various_struct5 +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Output: default@part_add_to_various_various_struct5 diff --git ql/src/test/results/clientpositive/tez/schema_evol_text_vec_mapwork_part_all_complex.q.out ql/src/test/results/clientpositive/tez/schema_evol_text_vec_mapwork_part_all_complex.q.out index 4e03c0b..cc7971d 100644 --- ql/src/test/results/clientpositive/tez/schema_evol_text_vec_mapwork_part_all_complex.q.out +++ ql/src/test/results/clientpositive/tez/schema_evol_text_vec_mapwork_part_all_complex.q.out @@ -671,3 +671,197 @@ POSTHOOK: query: drop table part_add_to_various_various_struct4 POSTHOOK: type: DROPTABLE POSTHOOK: Input: default@part_add_to_various_various_struct4 POSTHOOK: Output: default@part_add_to_various_various_struct4 +PREHOOK: query: -- +-- SUBSECTION: ALTER TABLE ADD COLUMNS for Various --> Various: ADD COLUMNS to STRUCT type as INNER column +-- +CREATE TABLE part_add_to_various_various_struct5(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) PARTITIONED BY(part INT) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: -- +-- SUBSECTION: ALTER TABLE ADD COLUMNS for Various --> Various: ADD COLUMNS to STRUCT type as INNER column +-- +CREATE TABLE part_add_to_various_various_struct5(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) PARTITIONED BY(part INT) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@part_add_to_various_various_struct5 +PREHOOK: query: CREATE TABLE struct5_a_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_a_txt +POSTHOOK: query: CREATE TABLE struct5_a_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_a_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_a.txt' overwrite into table struct5_a_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_a_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_a.txt' overwrite into table struct5_a_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_a_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_a_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_a_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_a_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_a_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).after_struct_column SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).b SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).insert_num SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).s5 SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_a_txt.insert_num struct5_a_txt.b struct5_a_txt.s5 struct5_a_txt.after_struct_column +PREHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=1 +#### A masked pattern was here #### +POSTHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=1 +#### A masked pattern was here #### +insert_num part b s5 after_struct_column +1 1 original {"c1":true,"c2":null,"c3":null,"c4":3244222,"c5":-99999999999} after_original +2 1 original {"c1":null,"c2":100,"c3":null,"c4":14,"c5":-23866739993} after_original +PREHOOK: query: -- Table-Non-Cascade CHANGE COLUMNS ... +alter table part_add_to_various_various_struct5 replace columns (insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +PREHOOK: type: ALTERTABLE_REPLACECOLS +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: -- Table-Non-Cascade CHANGE COLUMNS ... +alter table part_add_to_various_various_struct5 replace columns (insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +POSTHOOK: type: ALTERTABLE_REPLACECOLS +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Output: default@part_add_to_various_various_struct5 +PREHOOK: query: CREATE TABLE struct5_b_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_b_txt +POSTHOOK: query: CREATE TABLE struct5_b_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_b_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_b.txt' overwrite into table struct5_b_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_b_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_b.txt' overwrite into table struct5_b_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_b_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=2) select * from struct5_b_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_b_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=2 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=2) select * from struct5_b_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_b_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=2 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).after_struct_column SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).b SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).insert_num SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).s5 SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_b_txt.insert_num struct5_b_txt.b struct5_b_txt.s5 struct5_b_txt.after_struct_column +PREHOOK: query: CREATE TABLE struct5_c_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_c_txt +POSTHOOK: query: CREATE TABLE struct5_c_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_c_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_c.txt' overwrite into table struct5_c_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_c_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_c.txt' overwrite into table struct5_c_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_c_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_c_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_c_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_c_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_c_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).after_struct_column SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).b SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).insert_num SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).s5 SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_c_txt.insert_num struct5_c_txt.b struct5_c_txt.s5 struct5_c_txt.after_struct_column +PREHOOK: query: explain +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +POSTHOOK: query: explain +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +Explain +Plan optimized by CBO. + +Vertex dependency in root stage +Reducer 2 <- Map 1 (SIMPLE_EDGE) + +Stage-0 + Fetch Operator + limit:-1 + Stage-1 + Reducer 2 + File Output Operator [FS_4] + Select Operator [SEL_3] (rows=4 width=97) + Output:["_col0","_col1","_col2","_col3","_col4"] + <-Map 1 [SIMPLE_EDGE] + SHUFFLE [RS_2] + Select Operator [SEL_1] (rows=4 width=97) + Output:["_col0","_col1","_col2","_col3","_col4"] + TableScan [TS_0] (rows=4 width=97) + default@part_add_to_various_various_struct5,part_add_to_various_various_struct5,Tbl:COMPLETE,Col:NONE,Output:["insert_num","b","s5","after_struct_column"] + +PREHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=1 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=2 +#### A masked pattern was here #### +POSTHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=2 +#### A masked pattern was here #### +insert_num part b s5 after_struct_column +1 1 original {"c1":true,"c2":null,"c3":null,"c4":3244222,"c5":-99999999999,"c6":null,"c7":null,"c8":null,"c9":null,"c10":null,"c11":null} after_original +2 1 original {"c1":null,"c2":100,"c3":null,"c4":14,"c5":-23866739993,"c6":null,"c7":null,"c8":null,"c9":null,"c10":null,"c11":null} after_original +3 2 new {"c1":true,"c2":null,"c3":null,"c4":-100,"c5":953967041,"c6":62.07915,"c7":718.78,"c8":1,"c9":"verdict ","c10":"verdict","c11":"1987-02-21 19:48:29"} after_new +4 1 new {"c1":false,"c2":-67,"c3":833,"c4":63993,"c5":1255178165,"c6":null,"c7":null,"c8":null,"c9":null,"c10":null,"c11":null} after_new +PREHOOK: query: drop table part_add_to_various_various_struct5 +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: drop table part_add_to_various_various_struct5 +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Output: default@part_add_to_various_various_struct5 diff --git ql/src/test/results/clientpositive/tez/schema_evol_text_vecrow_mapwork_part_all_complex.q.out ql/src/test/results/clientpositive/tez/schema_evol_text_vecrow_mapwork_part_all_complex.q.out index f45b517..1312485 100644 --- ql/src/test/results/clientpositive/tez/schema_evol_text_vecrow_mapwork_part_all_complex.q.out +++ ql/src/test/results/clientpositive/tez/schema_evol_text_vecrow_mapwork_part_all_complex.q.out @@ -673,3 +673,197 @@ POSTHOOK: query: drop table part_add_to_various_various_struct4 POSTHOOK: type: DROPTABLE POSTHOOK: Input: default@part_add_to_various_various_struct4 POSTHOOK: Output: default@part_add_to_various_various_struct4 +PREHOOK: query: -- +-- SUBSECTION: ALTER TABLE ADD COLUMNS for Various --> Various: ADD COLUMNS to STRUCT type as INNER column +-- +CREATE TABLE part_add_to_various_various_struct5(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) PARTITIONED BY(part INT) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: -- +-- SUBSECTION: ALTER TABLE ADD COLUMNS for Various --> Various: ADD COLUMNS to STRUCT type as INNER column +-- +CREATE TABLE part_add_to_various_various_struct5(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) PARTITIONED BY(part INT) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@part_add_to_various_various_struct5 +PREHOOK: query: CREATE TABLE struct5_a_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_a_txt +POSTHOOK: query: CREATE TABLE struct5_a_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_a_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_a.txt' overwrite into table struct5_a_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_a_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_a.txt' overwrite into table struct5_a_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_a_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_a_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_a_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_a_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_a_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).after_struct_column SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).b SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).insert_num SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).s5 SIMPLE [(struct5_a_txt)struct5_a_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_a_txt.insert_num struct5_a_txt.b struct5_a_txt.s5 struct5_a_txt.after_struct_column +PREHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=1 +#### A masked pattern was here #### +POSTHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=1 +#### A masked pattern was here #### +insert_num part b s5 after_struct_column +1 1 original {"c1":true,"c2":null,"c3":null,"c4":3244222,"c5":-99999999999} after_original +2 1 original {"c1":null,"c2":100,"c3":null,"c4":14,"c5":-23866739993} after_original +PREHOOK: query: -- Table-Non-Cascade CHANGE COLUMNS ... +alter table part_add_to_various_various_struct5 replace columns (insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +PREHOOK: type: ALTERTABLE_REPLACECOLS +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: -- Table-Non-Cascade CHANGE COLUMNS ... +alter table part_add_to_various_various_struct5 replace columns (insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +POSTHOOK: type: ALTERTABLE_REPLACECOLS +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Output: default@part_add_to_various_various_struct5 +PREHOOK: query: CREATE TABLE struct5_b_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_b_txt +POSTHOOK: query: CREATE TABLE struct5_b_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_b_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_b.txt' overwrite into table struct5_b_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_b_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_b.txt' overwrite into table struct5_b_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_b_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=2) select * from struct5_b_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_b_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=2 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=2) select * from struct5_b_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_b_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=2 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).after_struct_column SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).b SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).insert_num SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=2).s5 SIMPLE [(struct5_b_txt)struct5_b_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_b_txt.insert_num struct5_b_txt.b struct5_b_txt.s5 struct5_b_txt.after_struct_column +PREHOOK: query: CREATE TABLE struct5_c_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@struct5_c_txt +POSTHOOK: query: CREATE TABLE struct5_c_txt(insert_num int, b STRING, s5 STRUCT, after_struct_column STRING) +row format delimited fields terminated by '|' +collection items terminated by ',' +map keys terminated by ':' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@struct5_c_txt +PREHOOK: query: load data local inpath '../../data/files/struct5_c.txt' overwrite into table struct5_c_txt +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@struct5_c_txt +POSTHOOK: query: load data local inpath '../../data/files/struct5_c.txt' overwrite into table struct5_c_txt +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@struct5_c_txt +PREHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_c_txt +PREHOOK: type: QUERY +PREHOOK: Input: default@struct5_c_txt +PREHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: query: insert into table part_add_to_various_various_struct5 partition(part=1) select * from struct5_c_txt +POSTHOOK: type: QUERY +POSTHOOK: Input: default@struct5_c_txt +POSTHOOK: Output: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).after_struct_column SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:after_struct_column, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).b SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:b, type:string, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).insert_num SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:insert_num, type:int, comment:null), ] +POSTHOOK: Lineage: part_add_to_various_various_struct5 PARTITION(part=1).s5 SIMPLE [(struct5_c_txt)struct5_c_txt.FieldSchema(name:s5, type:struct, comment:null), ] +struct5_c_txt.insert_num struct5_c_txt.b struct5_c_txt.s5 struct5_c_txt.after_struct_column +PREHOOK: query: explain +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +POSTHOOK: query: explain +select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +Explain +Plan optimized by CBO. + +Vertex dependency in root stage +Reducer 2 <- Map 1 (SIMPLE_EDGE) + +Stage-0 + Fetch Operator + limit:-1 + Stage-1 + Reducer 2 + File Output Operator [FS_4] + Select Operator [SEL_3] (rows=4 width=97) + Output:["_col0","_col1","_col2","_col3","_col4"] + <-Map 1 [SIMPLE_EDGE] + SHUFFLE [RS_2] + Select Operator [SEL_1] (rows=4 width=97) + Output:["_col0","_col1","_col2","_col3","_col4"] + TableScan [TS_0] (rows=4 width=97) + default@part_add_to_various_various_struct5,part_add_to_various_various_struct5,Tbl:COMPLETE,Col:NONE,Output:["insert_num","b","s5","after_struct_column"] + +PREHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +PREHOOK: type: QUERY +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=1 +PREHOOK: Input: default@part_add_to_various_various_struct5@part=2 +#### A masked pattern was here #### +POSTHOOK: query: select insert_num,part,b,s5,after_struct_column from part_add_to_various_various_struct5 order by insert_num +POSTHOOK: type: QUERY +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=1 +POSTHOOK: Input: default@part_add_to_various_various_struct5@part=2 +#### A masked pattern was here #### +insert_num part b s5 after_struct_column +1 1 original {"c1":true,"c2":null,"c3":null,"c4":3244222,"c5":-99999999999,"c6":null,"c7":null,"c8":null,"c9":null,"c10":null,"c11":null} after_original +2 1 original {"c1":null,"c2":100,"c3":null,"c4":14,"c5":-23866739993,"c6":null,"c7":null,"c8":null,"c9":null,"c10":null,"c11":null} after_original +3 2 new {"c1":true,"c2":null,"c3":null,"c4":-100,"c5":953967041,"c6":62.07915,"c7":718.78,"c8":1,"c9":"verdict ","c10":"verdict","c11":"1987-02-21 19:48:29"} after_new +4 1 new {"c1":false,"c2":-67,"c3":833,"c4":63993,"c5":1255178165,"c6":null,"c7":null,"c8":null,"c9":null,"c10":null,"c11":null} after_new +PREHOOK: query: drop table part_add_to_various_various_struct5 +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@part_add_to_various_various_struct5 +PREHOOK: Output: default@part_add_to_various_various_struct5 +POSTHOOK: query: drop table part_add_to_various_various_struct5 +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@part_add_to_various_various_struct5 +POSTHOOK: Output: default@part_add_to_various_various_struct5