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
