Repository: nifi Updated Branches: refs/heads/master 9d2b698c1 -> 410176ed2
NIFI-5525: CSVRecordReader fails with StringIndexOutOfBoundsException when field is a double quote This closes #2953. Signed-off-by: Mark Payne <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/nifi/repo Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/410176ed Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/410176ed Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/410176ed Branch: refs/heads/master Commit: 410176ed226b4db44b08c13b9f70bb70107e73e4 Parents: 9d2b698 Author: Vadim Arshavsky <[email protected]> Authored: Thu Aug 16 17:25:38 2018 +0300 Committer: Mark Payne <[email protected]> Committed: Thu Aug 16 14:22:27 2018 -0400 ---------------------------------------------------------------------- .../nifi/csv/AbstractCSVRecordReader.java | 2 +- .../apache/nifi/csv/TestCSVRecordReader.java | 21 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/nifi/blob/410176ed/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/csv/AbstractCSVRecordReader.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/csv/AbstractCSVRecordReader.java b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/csv/AbstractCSVRecordReader.java index 5bfbf42..62ddc81 100644 --- a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/csv/AbstractCSVRecordReader.java +++ b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/csv/AbstractCSVRecordReader.java @@ -79,7 +79,7 @@ abstract public class AbstractCSVRecordReader implements RecordReader { return value; } - final String trimmed = value.startsWith("\"") && value.endsWith("\"") ? value.substring(1, value.length() - 1) : value; + final String trimmed = value.startsWith("\"") && value.endsWith("\"") && (value.length() > 1) ? value.substring(1, value.length() - 1) : value; if (trimmed.isEmpty()) { return null; } http://git-wip-us.apache.org/repos/asf/nifi/blob/410176ed/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/csv/TestCSVRecordReader.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/csv/TestCSVRecordReader.java b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/csv/TestCSVRecordReader.java index e38d7fd..a4415b7 100644 --- a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/csv/TestCSVRecordReader.java +++ b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/csv/TestCSVRecordReader.java @@ -593,4 +593,25 @@ public class TestCSVRecordReader { assertNull(reader.nextRecord()); } } + + @Test + public void testQuote() throws IOException, MalformedRecordException { + final CSVFormat format = CSVFormat.RFC4180.withFirstRecordAsHeader().withTrim().withQuote('"'); + final String text = "\"name\"\n\"\"\"\""; + + final List<RecordField> fields = new ArrayList<>(); + fields.add(new RecordField("name", RecordFieldType.STRING.getDataType())); + final RecordSchema schema = new SimpleRecordSchema(fields); + + try (final InputStream bais = new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8)); + final CSVRecordReader reader = new CSVRecordReader(bais, Mockito.mock(ComponentLog.class), schema, format, true, false, + RecordFieldType.DATE.getDefaultFormat(), RecordFieldType.TIME.getDefaultFormat(), RecordFieldType.TIMESTAMP.getDefaultFormat(), StandardCharsets.UTF_8.name())) { + + final Record record = reader.nextRecord(); + final String name = (String)record.getValue("name"); + + assertEquals("\"", name); + } + } + }
