From ad19c50fa73b53af4fc4a42323a8117fbe33340d Mon Sep 17 00:00:00 2001 From: lukaseder Date: Tue, 21 Nov 2017 12:16:51 +0100 Subject: [PATCH] [#6832] Enhance DSLContext.fetchFromTXT() to support Oracle DBMS_XPLAN format --- jOOQ/src/main/java/org/jooq/impl/Tools.java | 34 ++++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 7dedb11f01..8831e0ebbe 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -499,6 +499,11 @@ final class Tools { */ private static final Pattern DASH_PATTERN = Pattern.compile("(-+)"); + /** + * A pattern for the pipe line syntax + */ + private static final Pattern PIPE_PATTERN = Pattern.compile("(?<=\\|)([^|]+)(?=\\|)"); + /** * A pattern for the dash line syntax */ @@ -3348,12 +3353,15 @@ final class Tools { static final List parseTXT(String string, String nullLiteral) { String[] strings = NEW_LINES.split(string); - if (strings.length < 2) { + if (strings.length < 2) throw new DataAccessException("String must contain at least two lines"); - } - // [#2235] Distinguish between jOOQ's Result.format() and H2's format - boolean formatted = (string.charAt(0) == '+'); + + // [#2235] Distinguish between jOOQ's Result.format() and others + boolean formattedJOOQ = (string.charAt(0) == '+'); + + // [#6832] Distinguish between Oracle's format and others + boolean formattedOracle = (string.charAt(0) == '-'); // In jOOQ's Result.format(), that's line number one: // 1: +----+------+----+ @@ -3364,9 +3372,20 @@ final class Tools { // 012345678901234567 // resulting in // [{1,5} {6,12} {13,17}] - if (formatted) { + if (formattedJOOQ) return parseTXTLines(nullLiteral, strings, PLUS_PATTERN, 0, 1, 3, strings.length - 1); - } + + // In Oracle's format (e.g. when coming out of DBMS_XPLAN), that's line number one: + // 1: ------------------ + // 2: |ABC |XYZ |HEHE| + // 3: ------------------ + // 4: |Data|{null}|1234| + // 5: ------------------ + // 012345678901234567 + // resulting in + // [{1,5} {6,12} {13,17}] + else if (formattedOracle) + return parseTXTLines(nullLiteral, strings, PIPE_PATTERN, 1, 1, 3, strings.length - 1); // In H2 format, that's line number two: // 1: ABC XYZ HEHE @@ -3375,9 +3394,8 @@ final class Tools { // 0123456789012345678 // resulting in // [{0,5} {7,14} {15,19}] - else { + else return parseTXTLines(nullLiteral, strings, DASH_PATTERN, 1, 0, 2, strings.length); - } } private static final List parseTXTLines(