SQOOP-3081: use OracleEscapeUtils.escapeIdentifier
in OracleUpsertOutputFormat instead of inline
appending quotes
(Anna Szonyi via Attila Szabo)
diff --git a/src/java/org/apache/sqoop/mapreduce/OracleUpsertOutputFormat.java b/src/java/org/apache/sqoop/mapreduce/OracleUpsertOutputFormat.java
index 88754e7..79a4efd 100644
--- a/src/java/org/apache/sqoop/mapreduce/OracleUpsertOutputFormat.java
+++ b/src/java/org/apache/sqoop/mapreduce/OracleUpsertOutputFormat.java
@@ -22,12 +22,14 @@
import java.sql.SQLException;
import java.util.LinkedHashSet;
import java.util.Set;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.mapreduce.RecordWriter;
import org.apache.hadoop.mapreduce.TaskAttemptContext;
import com.cloudera.sqoop.lib.SqoopRecord;
import com.cloudera.sqoop.mapreduce.UpdateOutputFormat;
+import org.apache.sqoop.manager.oracle.OracleUtils;
/**
* Update an existing table with new value if the table already
@@ -71,7 +73,7 @@
// lookup table for update columns
Set<String> updateKeyLookup = new LinkedHashSet<String>();
for (String updateKey : updateCols) {
- updateKeyLookup.add('"' + updateKey + '"');
+ updateKeyLookup.add(OracleUtils.escapeIdentifier(updateKey, isOracleEscapingDisabled()));
}
StringBuilder sb = new StringBuilder();
@@ -85,7 +87,8 @@
} else {
sb.append(" AND ");
}
- sb.append('"' + updateCols[i] + '"').append(" = ?");
+ sb.append(OracleUtils.escapeIdentifier(updateCols[i], isOracleEscapingDisabled()));
+ sb.append(" = ?");
}
sb.append(" )");
@@ -127,5 +130,9 @@
return sb.toString();
}
+
+ private boolean isOracleEscapingDisabled() {
+ return OracleUtils.isOracleEscapingDisabled(getConf());
+ }
}
}
diff --git a/src/test/com/cloudera/sqoop/manager/OracleExportTest.java b/src/test/com/cloudera/sqoop/manager/OracleExportTest.java
index 382eb92..07d672f 100644
--- a/src/test/com/cloudera/sqoop/manager/OracleExportTest.java
+++ b/src/test/com/cloudera/sqoop/manager/OracleExportTest.java
@@ -277,4 +277,18 @@
"--update-key", "ID", "--update-mode", "allowinsert", "--oracle-escaping-disabled", "false")));
verifyExport(TOTAL_RECORDS);
}
+
+ /** Make sure mixed update/insert export work correctly. */
+ public void testUpsertTextExportWithEscapingDisabled() throws IOException, SQLException {
+ final int TOTAL_RECORDS = 10;
+ createTextFile(0, TOTAL_RECORDS, false);
+ createTable();
+ // first time will be insert.
+ runExport(getArgv(true, 10, 10, newStrArray(null,
+ "--update-key", "ID", "--update-mode", "allowinsert", "--oracle-escaping-disabled", "true")));
+ // second time will be update.
+ runExport(getArgv(true, 10, 10, newStrArray(null,
+ "--update-key", "ID", "--update-mode", "allowinsert", "--oracle-escaping-disabled", "true")));
+ verifyExport(TOTAL_RECORDS);
+ }
}