diff --git a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcImportPartitioner.java b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcImportPartitioner.java index 8d0c4ab0..d1032233 100644 --- a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcImportPartitioner.java +++ b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcImportPartitioner.java @@ -250,7 +250,8 @@ protected List partitionTextColumn() { // Having one single value means that we can create only one single split if(minStringBD.equals(maxStringBD)) { GenericJdbcImportPartition partition = new GenericJdbcImportPartition(); - partition.setConditions(constructTextConditions(prefix, maxStringBD)); + partition.setConditions(constructTextConditions(prefix, 0, 0, + partitionMinValue, partitionMaxValue, true, true)); partitions.add(partition); return partitions; } @@ -294,8 +295,8 @@ protected List partitionTextColumn() { BigDecimal end = splitPoints.get(i); GenericJdbcImportPartition partition = new GenericJdbcImportPartition(); - partition.setConditions(constructTextConditions(prefix, start, - end, i == splitPoints.size() - 1)); + partition.setConditions(constructTextConditions(prefix, start, end, + partitionMinValue, partitionMaxValue, i == 1, i == splitPoints.size() - 1)); partitions.add(partition); start = end; @@ -521,31 +522,21 @@ protected String constructDateConditions(SimpleDateFormat sdf, return conditions.toString(); } - protected String constructTextConditions(String prefix, - Object lowerBound, Object upperBound, boolean lastOne) { + protected String constructTextConditions(String prefix, Object lowerBound, Object upperBound, + String lowerStringBound, String upperStringBound, boolean firstOne, boolean lastOne) { StringBuilder conditions = new StringBuilder(); String lbString = prefix + bigDecimalToText((BigDecimal)lowerBound); String ubString = prefix + bigDecimalToText((BigDecimal)upperBound); - conditions.append('\'').append(lbString).append('\''); + conditions.append('\'').append(firstOne ? lowerStringBound : lbString).append('\''); conditions.append(" <= "); conditions.append(partitionColumnName); conditions.append(" AND "); conditions.append(partitionColumnName); conditions.append(lastOne ? " <= " : " < "); - conditions.append('\'').append(ubString).append('\''); + conditions.append('\'').append(lastOne ? upperStringBound : ubString).append('\''); return conditions.toString(); } - protected String constructTextConditions(String prefix, Object value) { - return new StringBuilder() - .append(partitionColumnName) - .append(" = ").append('\'') - .append(prefix + bigDecimalToText((BigDecimal)value)) - .append('\'').toString() - ; - } - - /** * Converts a string to a BigDecimal representation in Base 2^21 format. * The maximum Unicode code point value defined is 10FFFF. Although diff --git a/connector/connector-generic-jdbc/src/test/java/org/apache/sqoop/connector/jdbc/TestImportPartitioner.java b/connector/connector-generic-jdbc/src/test/java/org/apache/sqoop/connector/jdbc/TestImportPartitioner.java index a33dd6cf..679accff 100644 --- a/connector/connector-generic-jdbc/src/test/java/org/apache/sqoop/connector/jdbc/TestImportPartitioner.java +++ b/connector/connector-generic-jdbc/src/test/java/org/apache/sqoop/connector/jdbc/TestImportPartitioner.java @@ -409,6 +409,7 @@ public void testVarcharPartition() throws Exception { "'Y' <= VCCOL AND VCCOL <= 'Z'", }); } + public void testVarcharPartition2() throws Exception { MutableContext context = new MutableMapContext(); context.setString(GenericJdbcConnectorConstants @@ -426,6 +427,10 @@ public void testVarcharPartition2() throws Exception { PartitionerContext partitionerContext = new PartitionerContext(context, 5, null); List partitions = partitioner.getPartitions(partitionerContext, connConf, jobConf); assertEquals(partitions.size(), 5); + // First partition needs to contain entire upper bound + assertTrue(partitions.get(0).toString().contains("Breezy Badger")); + // Last partition needs to contain entire lower bound + assertTrue(partitions.get(4).toString().contains("Warty Warthog")); } public void testVarcharPartitionWithCommonPrefix() throws Exception {