Repository: sqoop
Updated Branches:
  refs/heads/trunk 62bf442a8 -> 91b698ab1


SQOOP-1298: Cannot export to VARBINARY with null value

(Mike Adamson via Jarek Jarcec Cecho)


Project: http://git-wip-us.apache.org/repos/asf/sqoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/sqoop/commit/91b698ab
Tree: http://git-wip-us.apache.org/repos/asf/sqoop/tree/91b698ab
Diff: http://git-wip-us.apache.org/repos/asf/sqoop/diff/91b698ab

Branch: refs/heads/trunk
Commit: 91b698ab120863b6bc60ad5c0223141355e2e3bb
Parents: 62bf442
Author: Jarek Jarcec Cecho <[email protected]>
Authored: Thu Mar 20 10:00:20 2014 -0700
Committer: Jarek Jarcec Cecho <[email protected]>
Committed: Thu Mar 20 10:00:20 2014 -0700

----------------------------------------------------------------------
 src/java/org/apache/sqoop/orm/ClassWriter.java  |  6 +--
 .../com/cloudera/sqoop/orm/TestClassWriter.java | 48 ++++++++++++++++++++
 2 files changed, 51 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/sqoop/blob/91b698ab/src/java/org/apache/sqoop/orm/ClassWriter.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/sqoop/orm/ClassWriter.java 
b/src/java/org/apache/sqoop/orm/ClassWriter.java
index 0adc718..d680105 100644
--- a/src/java/org/apache/sqoop/orm/ClassWriter.java
+++ b/src/java/org/apache/sqoop/orm/ClassWriter.java
@@ -750,9 +750,9 @@ public class ClassWriter {
         sb.append("    o." + colName + " = (o." + colName + " != null) ? ("
                 + javaType + ") o." + colName + ".clone() : null;\n");
       } else if (javaType.equals(BytesWritable.class.getName())) {
-        sb.append("    o." + colName + " = new BytesWritable("
-            + "Arrays.copyOf(" + colName + ".getBytes(), "
-            + colName + ".getLength()));\n");
+        sb.append("    o." + colName + " = (o." + colName + " != null) ? "
+            + "new BytesWritable(Arrays.copyOf(" + colName + ".getBytes(), "
+            + colName + ".getLength())) : null;\n");
       }
     }
 

http://git-wip-us.apache.org/repos/asf/sqoop/blob/91b698ab/src/test/com/cloudera/sqoop/orm/TestClassWriter.java
----------------------------------------------------------------------
diff --git a/src/test/com/cloudera/sqoop/orm/TestClassWriter.java 
b/src/test/com/cloudera/sqoop/orm/TestClassWriter.java
index 78a250c..83770a5 100644
--- a/src/test/com/cloudera/sqoop/orm/TestClassWriter.java
+++ b/src/test/com/cloudera/sqoop/orm/TestClassWriter.java
@@ -46,6 +46,7 @@ import com.cloudera.sqoop.testutil.HsqldbTestServer;
 import com.cloudera.sqoop.testutil.ImportJobTestCase;
 import com.cloudera.sqoop.tool.ImportTool;
 import com.cloudera.sqoop.util.ClassLoaderStack;
+
 import java.lang.reflect.Field;
 
 /**
@@ -404,6 +405,53 @@ public class TestClassWriter extends TestCase {
         + HsqldbTestServer.getTableName());
   }
 
+  @Test
+  public void testCloningTableWithVarbinaryDoesNotThrowNPE() throws 
SQLException,
+      IOException, ClassNotFoundException, NoSuchMethodException,
+      SecurityException, InstantiationException, IllegalAccessException,
+      IllegalArgumentException, InvocationTargetException {
+    String tableName = HsqldbTestServer.getTableName();
+    Connection connection = testServer.getConnection();
+    Statement st = connection.createStatement();
+    try {
+      st.executeUpdate("DROP TABLE " + tableName + " IF EXISTS");
+      st.executeUpdate("CREATE TABLE " + tableName
+          + " (id INT, test VARBINARY(10))");
+      connection.commit();
+    } finally {
+      st.close();
+      connection.close();
+    }
+
+    String [] argv = {
+      "--bindir",
+      JAR_GEN_DIR,
+      "--outdir",
+      CODE_GEN_DIR,
+      "--package-name",
+      OVERRIDE_PACKAGE_NAME,
+    };
+
+    String className = OVERRIDE_PACKAGE_NAME + "."
+        + HsqldbTestServer.getTableName();
+    File ormJarFile = runGenerationTest(argv, className);
+
+    ClassLoader prevClassLoader = ClassLoaderStack.addJarFile(
+        ormJarFile.getCanonicalPath(), className);
+    Class tableClass = Class.forName(className, true,
+        Thread.currentThread().getContextClassLoader());
+    Method cloneImplementation = tableClass.getMethod("clone");
+
+    Object instance = tableClass.newInstance();
+
+    assertTrue(cloneImplementation.invoke(instance).getClass().
+        getCanonicalName().equals(className));
+
+    if (null != prevClassLoader) {
+      ClassLoaderStack.setCurrentClassLoader(prevClassLoader);
+    }
+  }
+
   /**
    * Test the generated equals method.
    * @throws IOException

Reply via email to