From 3ff3995fac7c5f48a52c5eb9d424f893de596cd5 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 2 Nov 2012 16:09:58 +0100 Subject: [PATCH] [#1927] Problems with escaping backslashes in CSV export/import --- .../jooq/test/_/testcases/FormatTests.java | 33 +++++++++++++++---- .../main/java/org/jooq/impl/ResultImpl.java | 4 +-- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/jOOQ-test/src/org/jooq/test/_/testcases/FormatTests.java b/jOOQ-test/src/org/jooq/test/_/testcases/FormatTests.java index 68df54303e..5d048aa459 100644 --- a/jOOQ-test/src/org/jooq/test/_/testcases/FormatTests.java +++ b/jOOQ-test/src/org/jooq/test/_/testcases/FormatTests.java @@ -259,6 +259,17 @@ extends BaseTest> fields = TBook().getFields(); Result books = create().selectFrom(TBook()).fetch(); String csv = books.formatCSV(); @@ -266,14 +277,17 @@ extends BaseTest 0) { regex1 += ","; regex2 += ","; } + // This is the field whose contents we're checking. + // regex1 is the actual field value, without quoting/escaping + // regex2 is the quoted/escaped field value if (x == i) { - regex1 += value; - regex2 += "\"" + value.replaceAll("\"", "\"\"") + "\""; + regex1 += value.replace("\\", "\\\\"); + regex2 += "\"" + value.replace("\\", "\\\\\\\\").replace("\"", "\"\"") + "\""; } + + // These are all the other fields else { - regex1 += "((?!\")[^,]+|\"[^\"]*\")"; - regex2 += "((?!\")[^,]+|\"[^\"]*\")"; + regex1 += "((?!\")[^,]+|\".*?\"(?=(,|$)))"; + regex2 += "((?!\")[^,]+|\".*?\"(?=(,|$)))"; } } - assertTrue(lines[j].matches(regex1) || lines[j].matches(regex2)); + assertTrue(lines[j], lines[j].matches(regex1) || lines[j].matches(regex2)); } } } diff --git a/jOOQ/src/main/java/org/jooq/impl/ResultImpl.java b/jOOQ/src/main/java/org/jooq/impl/ResultImpl.java index f032d827e4..f66977bf6b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ResultImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ResultImpl.java @@ -521,8 +521,8 @@ class ResultImpl implements Result, AttachableInternal { String result = format0(value); - if (StringUtils.containsAny(result, ',', ';', '\t', '"', '\n', '\r', '\'')) { - return "\"" + result.replace("\"", "\"\"") + "\""; + if (StringUtils.containsAny(result, ',', ';', '\t', '"', '\n', '\r', '\'', '\\')) { + return "\"" + result.replace("\\", "\\\\").replace("\"", "\"\"") + "\""; } else { return result;