SQOOP-2290: java.lang.ArrayIndexOutOfBoundsException thrown when malformed column mapping is provided

(Venkat Ranganathan via Gwen Shapira)

(cherry picked from commit 292fd08b7e1f64756fd132f790e11605bfea9ea1)
diff --git a/src/java/org/apache/sqoop/SqoopOptions.java b/src/java/org/apache/sqoop/SqoopOptions.java
index e4eb2f2..ef6e0ce 100644
--- a/src/java/org/apache/sqoop/SqoopOptions.java
+++ b/src/java/org/apache/sqoop/SqoopOptions.java
@@ -1217,6 +1217,10 @@
     String[] maps = mapping.split(",");
     for(String map : maps) {
       String[] details = map.split("=");
+      if (details.length != 2) {
+        throw new IllegalArgumentException("Malformed mapping.  "
+            + "Column mapping should be the form key=value[,key=value]*");
+      }
       output.put(details[0], details[1]);
     }
   }
diff --git a/src/test/com/cloudera/sqoop/TestSqoopOptions.java b/src/test/com/cloudera/sqoop/TestSqoopOptions.java
index 4ae583d..f4660e5 100644
--- a/src/test/com/cloudera/sqoop/TestSqoopOptions.java
+++ b/src/test/com/cloudera/sqoop/TestSqoopOptions.java
@@ -269,6 +269,18 @@
     assertEquals("STRING", mapping.get("id"));
   }
 
+  public void testMalformedMapColumnHiveParams() throws Exception {
+    String[] args = {
+      "--map-column-hive", "id",
+    };
+    try {
+      SqoopOptions opts = parse(args);
+      fail("Malformed hive mapping does not throw exception");
+    } catch (Exception e) {
+      // Caught exception as expected
+    }
+  }
+
   public void testMapColumnJavaParams() throws Exception {
     String[] args = {
       "--map-column-java", "id=String",
@@ -280,6 +292,18 @@
     assertEquals("String", mapping.get("id"));
   }
 
+  public void testMalfromedMapColumnJavaParams() throws Exception {
+    String[] args = {
+      "--map-column-java", "id",
+    };
+    try {
+      SqoopOptions opts = parse(args);
+      fail("Malformed java mapping does not throw exception");
+    } catch (Exception e) {
+      // Caught exception as expected
+    }
+  }
+
   public void testSkipDistCacheOption() throws Exception {
     String[] args = {"--skip-dist-cache"};
     SqoopOptions opts = parse(args);