From 131ed5fbfd4ea3a6e14b5b7ba6d385f5027d7814 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 10 Dec 2019 09:57:55 +0100 Subject: [PATCH] [jOOQ/jOOQ#9648] ArrayIndexOutOfBoundsException if query has a single or double quote char in vendor specific comment --- jOOQ/src/main/java/org/jooq/impl/Tools.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index aef603d923..c1d4b231c3 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -2288,8 +2288,13 @@ final class Tools { // Consume the whole string literal for (;;) { + // [#9648] The "string literal" might not be one, if we're inside + // of some vendor specific comment syntax + if (i >= sqlChars.length) + break characterLoop; + // [#3000] [#3630] Consume backslash-escaped characters if needed - if (sqlChars[i] == '\\' && needsBackslashEscaping) + else if (sqlChars[i] == '\\' && needsBackslashEscaping) render.sql(sqlChars[i++]); // Consume an escaped apostrophe @@ -2403,8 +2408,14 @@ final class Tools { identifierLoop: for (;;) { + + // [#9648] The "identifier" might not be one, if we're inside + // of some vendor specific comment syntax + if (i >= sqlChars.length) + break characterLoop; + // Consume an escaped quote - if (peek(sqlChars, i, quotes[QUOTE_END_DELIMITER_ESCAPED][delimiter])) { + else if (peek(sqlChars, i, quotes[QUOTE_END_DELIMITER_ESCAPED][delimiter])) { for (int d = 0; d < quotes[QUOTE_END_DELIMITER_ESCAPED][delimiter].length; d++) render.sql(sqlChars[i++]);