diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/ExplainTask.java ql/src/java/org/apache/hadoop/hive/ql/exec/ExplainTask.java index 35f4fa9..7f8aa4e 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/ExplainTask.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/ExplainTask.java @@ -277,7 +277,11 @@ private JSONObject outputMap(Map mp, boolean hasHeader, PrintStream out, // Print the value if (isPrintable(ent.getValue())) { if (out != null) { - out.print(ent.getValue()); + Object value = ent.getValue(); + if (value instanceof String) { + value = escapeString((String) value); + } + out.print(value); out.println(); } if (jsonOutput) { @@ -285,7 +289,7 @@ private JSONObject outputMap(Map mp, boolean hasHeader, PrintStream out, } } else if (ent.getValue() instanceof List) { - if (ent.getValue() != null && !((List)ent.getValue()).isEmpty() + if (ent.getValue() != null && !((List)ent.getValue()).isEmpty() && ((List)ent.getValue()).get(0) != null && ((List)ent.getValue()).get(0) instanceof TezWork.Dependency) { if (out != null) { @@ -351,6 +355,41 @@ else if (ent.getValue() instanceof Serializable) { return jsonOutput ? json : null; } + private String escapeString(String value) { + StringBuilder builder = new StringBuilder(); + for (char achar : value.toCharArray()) { + if (achar >= 32) { + builder.append(achar); + continue; + } + switch (achar) { + case '\b' : + builder.append("\\b"); + break; + case '\n' : + builder.append("\\n"); + break; + case '\t' : + builder.append("\\t"); + break; + case '\f' : + builder.append("\\f"); + break; + case '\r' : + builder.append("\\r"); + break; + default : + if (achar > 0xf) { + builder.append("0x" + Integer.toHexString((int)achar)); + } else { + builder.append("0x0" + Integer.toHexString((int)achar)); + } + break; + } + } + return builder.toString(); + } + private JSONArray outputList(List l, PrintStream out, boolean hasHeader, boolean extended, boolean jsonOutput, int indent) throws Exception { @@ -359,6 +398,9 @@ private JSONArray outputList(List l, PrintStream out, boolean hasHeader, JSONArray outputArray = new JSONArray(); for (Object o : l) { + if (o instanceof String) { + o = escapeString((String)o); + } if (isPrintable(o)) { String delim = first_el ? " " : ", "; if (out != null) { @@ -512,6 +554,9 @@ private JSONObject outputPlan(Serializable work, PrintStream out, if (!skipHeader) { out.printf("%s ", header); } + if (val instanceof String) { + val = escapeString((String)val); + } out.println(val); } if (jsonOutput && shouldPrint(xpl_note, val)) { diff --git ql/src/test/results/clientpositive/auto_sortmerge_join_11.q.out ql/src/test/results/clientpositive/auto_sortmerge_join_11.q.out index e502e97..e72999d 100644 Binary files ql/src/test/results/clientpositive/auto_sortmerge_join_11.q.out and ql/src/test/results/clientpositive/auto_sortmerge_join_11.q.out differ