PIG-5354: Show fieldname and a line number for casting errors (knoguchi)


git-svn-id: https://svn.apache.org/repos/asf/pig/trunk@1842987 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/CHANGES.txt b/CHANGES.txt
index bd52721..a59fbef 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -26,6 +26,8 @@
  
 IMPROVEMENTS
 
+PIG-5354: Show fieldname and a line number for casting errors (knoguchi)
+
 PIG-5342: Add setting to turn off bloom join combiner (satishsaley via rohini)
 
 PIG-5349: Log stderr output when shell command fail (knoguchi)
diff --git a/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/PhysicalOperator.java b/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/PhysicalOperator.java
index 8f8b968..af548a4 100644
--- a/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/PhysicalOperator.java
+++ b/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/PhysicalOperator.java
@@ -360,11 +360,30 @@
             default:
                 throw new ExecException("Unsupported type for getNext: " + DataType.findTypeName(dataType));
             }
+        } catch (ExecException e) {
+            throw new ExecException("Exception while executing for " + originalLocationsToDescriptiveString()
+                                    + ": " + e.toString(), e.getErrorCode(), e);
         } catch (RuntimeException e) {
             throw new ExecException("Exception while executing " + this.toString() + ": " + e.toString(), e);
         }
     }
 
+    private String originalLocationsToDescriptiveString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append('[');
+        boolean isFirstItem = true;
+        for( OriginalLocation ol : getOriginalLocations() ) {
+            if( isFirstItem ) {
+                isFirstItem = false;
+            } else {
+                sb.append(",");
+            }
+            sb.append(ol.getAlias()).append("[line=").append(ol.getLine())
+              .append(",offset=").append(ol.getOffset()).append("]");
+        }
+        return sb.append(']').toString();
+    }
+
     public Result getNextInteger() throws ExecException {
         return res;
     }