Repository: incubator-hawq Updated Branches: refs/heads/HAWQ-703 4ccb72dd3 -> b4c52b8c7 (forced update)
HAWQ-703. Serialize HCatalog Complex Types to plain text (as Hive profile). Project: http://git-wip-us.apache.org/repos/asf/incubator-hawq/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-hawq/commit/b4c52b8c Tree: http://git-wip-us.apache.org/repos/asf/incubator-hawq/tree/b4c52b8c Diff: http://git-wip-us.apache.org/repos/asf/incubator-hawq/diff/b4c52b8c Branch: refs/heads/HAWQ-703 Commit: b4c52b8c74b9d701c4aaaa79537188771678a1a9 Parents: 6717e7d b357dbc Author: Oleksandr Diachenko <odiache...@pivotal.io> Authored: Mon May 2 13:00:44 2016 -0700 Committer: Oleksandr Diachenko <odiache...@pivotal.io> Committed: Tue May 3 17:39:07 2016 -0700 ---------------------------------------------------------------------- depends/libyarn/src/CMakeLists.txt | 2 +- .../libyarn/src/libyarnclient/LibYarnClient.cpp | 6 +- pxf/Makefile | 5 +- pxf/build.gradle | 5 + .../java/org/apache/hawq/pxf/api/Metadata.java | 28 +- .../org/apache/hawq/pxf/api/package-info.java | 23 ++ .../hawq/pxf/api/utilities/Utilities.java | 11 +- .../org/apache/hawq/pxf/api/MetadataTest.java | 11 + .../hawq/pxf/plugins/hbase/package-info.java | 23 ++ .../hawq/pxf/plugins/hdfs/AvroResolver.java | 4 +- .../hawq/pxf/plugins/hdfs/package-info.java | 23 ++ .../hawq/pxf/plugins/hive/package-info.java | 23 ++ .../hive/utilities/EnumHiveToHawqType.java | 7 +- .../plugins/hive/utilities/HiveUtilities.java | 59 +-- .../hive/utilities/HiveUtilitiesTest.java | 8 +- .../pxf/service/MetadataResponseFormatter.java | 1 + .../apache/hawq/pxf/service/package-info.java | 23 ++ .../pxf/service/utilities/ProtocolData.java | 2 +- .../service/MetadataResponseFormatterTest.java | 2 +- src/backend/executor/execMain.c | 2 +- .../gpopt/translate/CTranslatorUtils.cpp | 10 +- .../communication/rmcomm_RM2RMSEG.c | 13 +- src/backend/utils/misc/etc/gpcheck.cnf | 48 ++- src/bin/psql/describe.c | 5 +- tools/bin/gpcheck | 372 ++++++++++++++++++- tools/bin/gppylib/gpcheckutil.py | 17 +- tools/bin/hawqpylib/hawqlib.py | 18 + tools/doc/gpcheck_help | 44 ++- tools/sbin/gpcheck_hostdump | 50 ++- 29 files changed, 746 insertions(+), 99 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/b4c52b8c/pxf/pxf-api/src/main/java/org/apache/hawq/pxf/api/Metadata.java ---------------------------------------------------------------------- diff --cc pxf/pxf-api/src/main/java/org/apache/hawq/pxf/api/Metadata.java index 4cb7104,4fc510d..9e1c137 --- a/pxf/pxf-api/src/main/java/org/apache/hawq/pxf/api/Metadata.java +++ b/pxf/pxf-api/src/main/java/org/apache/hawq/pxf/api/Metadata.java @@@ -75,22 -71,22 +75,26 @@@ public class Metadata */ public static class Field { private String name; - private String type; // TODO: change to enum + private EnumHawqType type; // field type which PXF exposes - private String sourceType; // filed type PXF reads from ++ private String sourceType; // field type PXF reads from private String[] modifiers; // type modifiers, optional field - public Field(String name, EnumHawqType type, String sourceType) { - if (StringUtils.isBlank(name) || StringUtils.isBlank(type.getTypeName()) - || StringUtils.isBlank(sourceType)) { - throw new IllegalArgumentException("Field name, type and source type cannot be empty"); - public Field(String name, String type) { - - if (StringUtils.isBlank(name) || StringUtils.isBlank(type)) { - throw new IllegalArgumentException("Field name and type cannot be empty"); ++ public Field(String name, EnumHawqType type, String sourceType) { ++ if (StringUtils.isBlank(name) ++ || type == null ++ || StringUtils.isBlank(sourceType)) { ++ throw new IllegalArgumentException( ++ "Field name, type and source type cannot be empty"); + } - + this.name = name; + this.type = type; ++ this.sourceType = sourceType; } - this.name = name; - this.type = type; - this.sourceType = sourceType; - } - public Field(String name, EnumHawqType type, String sourceType, String[] modifiers) { - this(name, type, sourceType); - this.modifiers = modifiers; + - public Field(String name, String type, String[] modifiers) { - this(name, type); ++ public Field(String name, EnumHawqType type, String sourceType, ++ String[] modifiers) { ++ this(name, type, sourceType); + this.modifiers = modifiers; } public String getName() { http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/b4c52b8c/pxf/pxf-api/src/test/java/org/apache/hawq/pxf/api/MetadataTest.java ---------------------------------------------------------------------- diff --cc pxf/pxf-api/src/test/java/org/apache/hawq/pxf/api/MetadataTest.java index d6e94e1,0000000..327a15b mode 100644,000000..100644 --- a/pxf/pxf-api/src/test/java/org/apache/hawq/pxf/api/MetadataTest.java +++ b/pxf/pxf-api/src/test/java/org/apache/hawq/pxf/api/MetadataTest.java @@@ -1,49 -1,0 +1,60 @@@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hawq.pxf.api; + +import org.apache.hawq.pxf.api.Metadata; +import org.apache.hawq.pxf.api.utilities.EnumHawqType; ++ +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; ++ +import org.junit.Test; + +public class MetadataTest { + + @Test + public void createFieldEmptyNameType() { + try { + Metadata.Field field = new Metadata.Field(null, null, null, null); + fail("Empty name, type and source type shouldn't be allowed."); + } catch (IllegalArgumentException e) { + assertEquals("Field name, type and source type cannot be empty", e.getMessage()); + } + } + + @Test ++ public void createFieldNullType() { ++ try { ++ Metadata.Field field = new Metadata.Field("col1", null, "string"); ++ fail("Empty name, type and source type shouldn't be allowed."); ++ } catch (IllegalArgumentException e) { ++ assertEquals("Field name, type and source type cannot be empty", e.getMessage()); ++ } ++ } ++ @Test + public void createItemEmptyNameType() { + try { + Metadata.Item item = new Metadata.Item(null, null); + fail("Empty item name and path shouldn't be allowed."); + } catch (IllegalArgumentException e) { + assertEquals("Item or path name cannot be empty", e.getMessage()); + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/b4c52b8c/pxf/pxf-hive/src/main/java/org/apache/hawq/pxf/plugins/hive/utilities/EnumHiveToHawqType.java ---------------------------------------------------------------------- diff --cc pxf/pxf-hive/src/main/java/org/apache/hawq/pxf/plugins/hive/utilities/EnumHiveToHawqType.java index 13d402c,0000000..a747bd5 mode 100644,000000..100644 --- a/pxf/pxf-hive/src/main/java/org/apache/hawq/pxf/plugins/hive/utilities/EnumHiveToHawqType.java +++ b/pxf/pxf-hive/src/main/java/org/apache/hawq/pxf/plugins/hive/utilities/EnumHiveToHawqType.java @@@ -1,112 -1,0 +1,113 @@@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hawq.pxf.plugins.hive.utilities; + +import org.apache.hawq.pxf.api.utilities.EnumHawqType; +import org.apache.hawq.pxf.api.UnsupportedTypeException; + +/** + * + * Hive types, which are supported by plugin, mapped to HAWQ's types + * @see EnumHawqType + */ +public enum EnumHiveToHawqType { + + TinyintType("tinyint", EnumHawqType.Int2Type), + SmallintType("smallint", EnumHawqType.Int2Type), + IntType("int", EnumHawqType.Int4Type), + BigintType("bigint", EnumHawqType.Int8Type), + BooleanType("boolean", EnumHawqType.BoolType), + FloatType("float", EnumHawqType.Float4Type), + DoubleType("double", EnumHawqType.Float8Type), + StringType("string", EnumHawqType.TextType), + BinaryType("binary", EnumHawqType.ByteaType), + TimestampType("timestamp", EnumHawqType.TimestampType), + DateType("date", EnumHawqType.DateType), + DecimalType("decimal", EnumHawqType.NumericType, "[(,)]"), + VarcharType("varchar", EnumHawqType.VarcharType, "[(,)]"), + CharType("char", EnumHawqType.BpcharType, "[(,)]"), + ArrayType("array", EnumHawqType.TextType, "[<,>]"), + MapType("map", EnumHawqType.TextType, "[<,>]"), + StructType("struct", EnumHawqType.TextType, "[<,>]"), + UnionType("uniontype", EnumHawqType.TextType, "[<,>]"); + + private String typeName; + private EnumHawqType hawqType; + private String splitExpression; + + EnumHiveToHawqType(String typeName, EnumHawqType hawqType) { + this.typeName = typeName; + this.hawqType = hawqType; + } + + EnumHiveToHawqType(String typeName, EnumHawqType hawqType, String splitExpression) { + this(typeName, hawqType); + this.splitExpression = splitExpression; + } + + /** + * + * @return name of type + */ + public String getTypeName() { + return this.typeName; + } + + /** + * + * @return corresponding HAWQ type + */ + public EnumHawqType getHawqType() { + return this.hawqType; + } + + /** + * + * @return split by expression + */ + public String getSplitExpression() { + return this.splitExpression; + } + + /** + * Returns Hive to HAWQ type mapping entry for given Hive type + * + * @param hiveType full Hive type with modifiers, for example - decimal(10, 0), char(5), binary, array<string>, map<string,float> etc + * @return corresponding Hive to HAWQ type mapping entry + * @throws UnsupportedTypeException if there is no corresponding HAWQ type + */ + public static EnumHiveToHawqType getHiveToHawqType(String hiveType) { + for (EnumHiveToHawqType t : values()) { + String hiveTypeName = hiveType; - if (t.getSplitExpression() != null) { - String[] tokens = hiveType.split(t.getSplitExpression()); ++ String splitExpression = t.getSplitExpression(); ++ if (splitExpression != null) { ++ String[] tokens = hiveType.split(splitExpression); + hiveTypeName = tokens[0]; + } + - if (t.getTypeName().equals(hiveTypeName)) { ++ if (t.getTypeName().toLowerCase().equals(hiveTypeName.toLowerCase())) { + return t; + } + } + throw new UnsupportedTypeException("Unable to map Hive's type: " + + hiveType + " to HAWQ's type"); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/b4c52b8c/pxf/pxf-hive/src/main/java/org/apache/hawq/pxf/plugins/hive/utilities/HiveUtilities.java ---------------------------------------------------------------------- diff --cc pxf/pxf-hive/src/main/java/org/apache/hawq/pxf/plugins/hive/utilities/HiveUtilities.java index c5751c5,7dfe410..096c0ff --- a/pxf/pxf-hive/src/main/java/org/apache/hawq/pxf/plugins/hive/utilities/HiveUtilities.java +++ b/pxf/pxf-hive/src/main/java/org/apache/hawq/pxf/plugins/hive/utilities/HiveUtilities.java @@@ -35,8 -32,9 +33,10 @@@ import org.apache.hadoop.hive.metastore import org.apache.hadoop.hive.metastore.api.FieldSchema; import org.apache.hadoop.hive.metastore.api.MetaException; import org.apache.hadoop.hive.metastore.api.Table; - import org.apache.hawq.pxf.api.Metadata; import org.apache.hawq.pxf.api.UnsupportedTypeException; ++import org.apache.hawq.pxf.api.utilities.EnumHawqType; ++import org.apache.hawq.pxf.plugins.hive.utilities.EnumHiveToHawqType; /** * Class containing helper functions connecting @@@ -85,66 -83,99 +85,67 @@@ public class HiveUtilities } /** -- * Checks if hive type is supported, and if so -- * return its matching HAWQ type. -- * Unsupported types will result in an exception. -- * <br> -- * The supported mappings are:<ul> - * <li>{@code tinyint -> int2}</li> - * <li>{@code smallint -> int2}</li> - * <li>{@code int -> int4}</li> - * <li>{@code bigint -> int8}</li> - * <li>{@code boolean -> bool}</li> - * <li>{@code float -> float4}</li> - * <li>{@code double -> float8}</li> - * <li>{@code string -> text}</li> - * <li>{@code binary -> bytea}</li> - * <li>{@code timestamp -> timestamp}</li> - * <li>{@code date -> date}</li> - * <li>{@code decimal(precision, scale) -> numeric(precision, scale)}</li> - * <li>{@code varchar(size) -> varchar(size)}</li> - * <li>{@code char(size) -> bpchar(size)}</li> - * <li>{@code array<dataType> -> text}</li> - * <li>{@code map<keyDataType, valueDataType> -> text}</li> - * <li>{@code struct<field1:dataType,...,fieldN:dataType> -> text}</li> - * <li>{@code uniontype<...> -> text}</li> ++ * Checks if hive type is supported, and if so return its matching HAWQ ++ * type. Unsupported types will result in an exception. <br> ++ * The supported mappings are: ++ * <ul> + * <li>{@code tinyint -> int2}</li> + * <li>{@code smallint -> int2}</li> + * <li>{@code int -> int4}</li> + * <li>{@code bigint -> int8}</li> + * <li>{@code boolean -> bool}</li> + * <li>{@code float -> float4}</li> + * <li>{@code double -> float8}</li> + * <li>{@code string -> text}</li> + * <li>{@code binary -> bytea}</li> + * <li>{@code timestamp -> timestamp}</li> + * <li>{@code date -> date}</li> + * <li>{@code decimal(precision, scale) -> numeric(precision, scale)}</li> + * <li>{@code varchar(size) -> varchar(size)}</li> + * <li>{@code char(size) -> bpchar(size)}</li> ++ * <li>{@code array<dataType> -> text}</li> ++ * <li>{@code map<keyDataType, valueDataType> -> text}</li> ++ * <li>{@code struct<field1:dataType,...,fieldN:dataType> -> text}</li> ++ * <li>{@code uniontype<...> -> text}</li> * </ul> * -- * @param hiveColumn hive column schema ++ * @param hiveColumn ++ * hive column schema * @return field with mapped HAWQ type and modifiers -- * @throws UnsupportedTypeException if the column type is not supported ++ * @throws UnsupportedTypeException ++ * if the column type is not supported + * @see EnumHiveToHawqType */ public static Metadata.Field mapHiveType(FieldSchema hiveColumn) throws UnsupportedTypeException { String fieldName = hiveColumn.getName(); - String hiveType = hiveColumn.getType(); - String mappedType; - String[] modifiers = null; - - // check parameterized types: - if (hiveType.startsWith("varchar(") || - hiveType.startsWith("char(")) { - String[] toks = hiveType.split("[(,)]"); - if (toks.length != 2) { - throw new UnsupportedTypeException( "HAWQ does not support type " + hiveType + " (Field " + fieldName + "), " + - "expected type of the form <type name>(<parameter>)"); - } - mappedType = toks[0]; - if (mappedType.equals("char")) { - mappedType = "bpchar"; - } - modifiers = new String[] {toks[1]}; - } else if (hiveType.startsWith("decimal(")) { - String[] toks = hiveType.split("[(,)]"); - if (toks.length != 3) { - throw new UnsupportedTypeException( "HAWQ does not support type " + hiveType + " (Field " + fieldName + "), " + - "expected type of the form <type name>(<parameter>,<parameter>)"); - } - mappedType = "numeric"; - modifiers = new String[] {toks[1], toks[2]}; - } else { - - switch (hiveType) { - case "tinyint": - case "smallint": - mappedType = "int2"; - break; - case "int": - mappedType = "int4"; - break; - case "bigint": - mappedType = "int8"; - break; - case "boolean": - mappedType = "bool"; - break; - case "timestamp": - case "date": - mappedType = hiveType; - break; - case "float": - mappedType = "float4"; - break; - case "double": - mappedType = "float8"; - break; - case "string": - mappedType = "text"; - break; - case "binary": - mappedType = "bytea"; - break; - default: - throw new UnsupportedTypeException( - "HAWQ does not support type " + hiveType + " (Field " + fieldName + ")"); + String hiveType = hiveColumn.getType(); // Type name and modifiers if any + String hiveTypeName; // Type name + String[] modifiers = null; // Modifiers + EnumHiveToHawqType hiveToHawqType = EnumHiveToHawqType.getHiveToHawqType(hiveType); + EnumHawqType hawqType = hiveToHawqType.getHawqType(); + + if (hiveToHawqType.getSplitExpression() != null) { + String[] tokens = hiveType.split(hiveToHawqType.getSplitExpression()); + hiveTypeName = tokens[0]; + if (hawqType.getModifiersNum() > 0) { + modifiers = Arrays.copyOfRange(tokens, 1, tokens.length); + if (modifiers.length != hawqType.getModifiersNum()) { + throw new UnsupportedTypeException( + "HAWQ does not support type " + hiveType + + " (Field " + fieldName + "), " + + "expected number of modifiers: " + + hawqType.getModifiersNum() + + ", actual number of modifiers: " + + modifiers.length); + } - if (hawqType.getValidateIntegerModifiers() && !verifyIntegerModifers(modifiers)) { ++ if (hawqType.getValidateIntegerModifiers() && !verifyIntegerModifiers(modifiers)) { + throw new UnsupportedTypeException("HAWQ does not support type " + hiveType + " (Field " + fieldName + "), modifiers should be integers"); + } } - } - if (!verifyModifers(modifiers)) { - throw new UnsupportedTypeException("HAWQ does not support type " + hiveType + " (Field " + fieldName + "), modifiers should be integers"); - } - return new Metadata.Field(fieldName, mappedType, modifiers); + } else + hiveTypeName = hiveType; + + return new Metadata.Field(fieldName, hawqType, hiveTypeName, modifiers); } /** @@@ -155,7 -186,7 +156,7 @@@ * @param modifiers type modifiers to be verified * @return whether modifiers are null or integers */ - private static boolean verifyIntegerModifers(String[] modifiers) { - private static boolean verifyModifers(String[] modifiers) { ++ private static boolean verifyIntegerModifiers(String[] modifiers) { if (modifiers == null) { return true; } http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/b4c52b8c/pxf/pxf-hive/src/test/java/org/apache/hawq/pxf/plugins/hive/utilities/HiveUtilitiesTest.java ---------------------------------------------------------------------- diff --cc pxf/pxf-hive/src/test/java/org/apache/hawq/pxf/plugins/hive/utilities/HiveUtilitiesTest.java index 1054d0d,466dedb..e9b024a --- a/pxf/pxf-hive/src/test/java/org/apache/hawq/pxf/plugins/hive/utilities/HiveUtilitiesTest.java +++ b/pxf/pxf-hive/src/test/java/org/apache/hawq/pxf/plugins/hive/utilities/HiveUtilitiesTest.java @@@ -54,12 -54,6 +54,13 @@@ public class HiveUtilitiesTest {"char(40)", "bpchar", "40"}, }; + static String[][] complexTypes = { - {"array<string>", "text"}, - {"map<string,float>", "text"}, - {"struct<street:string,city:string,state:string,zip:int>", "text"}, ++ {"ArraY<string>", "text"}, ++ {"MaP<stRing, float>", "text"}, ++ {"Struct<street:string, city:string, state:string, zip:int>", "text"}, ++ {"UnionType<array<string>, string,int>", "text"} + }; + @Test public void mapHiveTypeUnsupported() throws Exception { @@@ -157,37 -152,6 +158,38 @@@ } @Test + public void mapHiveTypeInvalidModifiers() throws Exception { + String badHiveType = "decimal(abc, xyz)"; + hiveColumn = new FieldSchema("numericColumn", badHiveType, null); + try { + HiveUtilities.mapHiveType(hiveColumn); + fail("should fail with bad modifiers error"); + } catch (UnsupportedTypeException e) { + String errorMsg = "HAWQ does not support type " + badHiveType + " (Field numericColumn), modifiers should be integers"; + assertEquals(errorMsg, e.getMessage()); + } + } + + @Test + public void mapHiveTypeComplex() throws Exception { + /* + * array<dataType> -> text + * map<keyDataType, valueDataType> -> text + * struct<fieldName1:dataType, ..., fieldNameN:dataType> -> text ++ * uniontype<...> -> text + */ + for (String[] line: complexTypes) { + String hiveType = line[0]; + String expectedType = line[1]; + hiveColumn = new FieldSchema("field" + hiveType, hiveType, null); + Metadata.Field result = HiveUtilities.mapHiveType(hiveColumn); + assertEquals("field" + hiveType, result.getName()); + assertEquals(expectedType, result.getType().getTypeName()); + assertNull(result.getModifiers()); + } + } + + @Test public void parseTableQualifiedNameNoDbName() throws Exception { String name = "orphan"; tblDesc = HiveUtilities.extractTableFromName(name); http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/b4c52b8c/pxf/pxf-service/src/main/java/org/apache/hawq/pxf/service/MetadataResponseFormatter.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/b4c52b8c/pxf/pxf-service/src/test/java/org/apache/hawq/pxf/service/MetadataResponseFormatterTest.java ---------------------------------------------------------------------- diff --cc pxf/pxf-service/src/test/java/org/apache/hawq/pxf/service/MetadataResponseFormatterTest.java index 6269bb9,0182835..21bf423 --- a/pxf/pxf-service/src/test/java/org/apache/hawq/pxf/service/MetadataResponseFormatterTest.java +++ b/pxf/pxf-service/src/test/java/org/apache/hawq/pxf/service/MetadataResponseFormatterTest.java @@@ -97,31 -96,12 +97,31 @@@ public class MetadataResponseFormatterT StringBuilder expected = new StringBuilder("{\"PXFMetadata\":[{"); expected.append("\"item\":{\"path\":\"default\",\"name\":\"table1\"},") .append("\"fields\":[") - .append("{\"name\":\"field1\",\"type\":\"int\"},") - .append("{\"name\":\"field2\",\"type\":\"numeric\",\"modifiers\":[\"1349\",\"1789\"]},") - .append("{\"name\":\"field3\",\"type\":\"char\",\"modifiers\":[\"50\"]}") + .append("{\"name\":\"field1\",\"type\":\"int8\",\"sourceType\":\"bigint\"},") + .append("{\"name\":\"field2\",\"type\":\"numeric\",\"sourceType\":\"decimal\",\"modifiers\":[\"1349\",\"1789\"]},") + .append("{\"name\":\"field3\",\"type\":\"bpchar\",\"sourceType\":\"char\",\"modifiers\":[\"50\"]}") + .append("]}]}"); + + assertEquals(expected.toString(), convertResponseToString(response)); + } + + @Test + public void formatResponseStringWithSourceType() throws Exception { + List<Metadata> metadataList = new ArrayList<Metadata>(); + List<Metadata.Field> fields = new ArrayList<Metadata.Field>(); + Metadata.Item itemName = new Metadata.Item("default", "table1"); + Metadata metadata = new Metadata(itemName, fields); + fields.add(new Metadata.Field("field1", EnumHawqType.Float8Type, "double")); + metadataList.add(metadata); + + response = MetadataResponseFormatter.formatResponse(metadataList, "path.file"); + StringBuilder expected = new StringBuilder("{\"PXFMetadata\":[{"); + expected.append("\"item\":{\"path\":\"default\",\"name\":\"table1\"},") + .append("\"fields\":[") + .append("{\"name\":\"field1\",\"type\":\"float8\",\"sourceType\":\"double\"}") .append("]}]}"); - // assertEquals(expected.toString(), convertResponseToString(response)); + assertEquals(expected.toString(), convertResponseToString(response)); } @Test http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/b4c52b8c/src/bin/psql/describe.c ---------------------------------------------------------------------- diff --cc src/bin/psql/describe.c index ab2aa8b,00cfe33..85012b2 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@@ -4263,13 -4263,8 +4263,12 @@@ describePxfTable(const char *profile, c printQueryOpt myopt = pset.popt; printTableContent cont; int cols = 0; + if (verbose) - { + cols = 3; - } else ++ else + cols = 2; int total_numrows = 0; - char *headers[2]; + char *headers[cols]; bool printTableInitialized = false; char *previous_path = NULL;