From 54594ba78a926145ce7047f50a4ebc0407ffec89 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 11 Jul 2014 13:01:29 +0200 Subject: [PATCH] [#3360] SQLite regression when using special characters in identifiers --- .../all/testcases/RenderAndBindTests.java | 8 ++++++ .../java/org/jooq/test/jOOQAbstractTest.java | 2 +- .../org/jooq/impl/DefaultRenderContext.java | 25 +++++++++++-------- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/jOOQ-test/src/test/java/org/jooq/test/all/testcases/RenderAndBindTests.java b/jOOQ-test/src/test/java/org/jooq/test/all/testcases/RenderAndBindTests.java index 73b7aa27ea..e2cb90bde1 100644 --- a/jOOQ-test/src/test/java/org/jooq/test/all/testcases/RenderAndBindTests.java +++ b/jOOQ-test/src/test/java/org/jooq/test/all/testcases/RenderAndBindTests.java @@ -483,6 +483,14 @@ extends BaseTest s = create(new Settings().withRenderNameStyle(RenderNameStyle.AS_IS)) .select(TBook_ID(), TBook_TITLE(), TAuthor_FIRST_NAME(), TAuthor_LAST_NAME()) diff --git a/jOOQ-test/src/test/java/org/jooq/test/jOOQAbstractTest.java b/jOOQ-test/src/test/java/org/jooq/test/jOOQAbstractTest.java index 95afffcec2..0664cb539f 100644 --- a/jOOQ-test/src/test/java/org/jooq/test/jOOQAbstractTest.java +++ b/jOOQ-test/src/test/java/org/jooq/test/jOOQAbstractTest.java @@ -3013,4 +3013,4 @@ public abstract class jOOQAbstractTest< public void testStreamsCollectPOJOs() { new StreamsTest(this).testStreamsCollectPOJOs(); } -} +} \ No newline at end of file diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java b/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java index 98a592dd80..737766e9a0 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java @@ -43,6 +43,7 @@ package org.jooq.impl; import static java.util.Arrays.asList; // ... // ... +import static org.jooq.SQLDialect.SQLITE; import static org.jooq.conf.ParamType.INDEXED; import static org.jooq.conf.ParamType.INLINED; import static org.jooq.conf.ParamType.NAMED; @@ -84,9 +85,10 @@ import org.jooq.tools.StringUtils; */ class DefaultRenderContext extends AbstractContext implements RenderContext { - private static final JooqLogger log = JooqLogger.getLogger(DefaultRenderContext.class); + private static final JooqLogger log = JooqLogger.getLogger(DefaultRenderContext.class); - private static final Pattern NEWLINE = Pattern.compile("[\\n\\r]"); + private static final Pattern IDENTIFIER_PATTERN = Pattern.compile("[A-Za-z][A-Za-z0-9_]*"); + private static final Pattern NEWLINE = Pattern.compile("[\\n\\r]"); private static final Set SQLITE_KEYWORDS; private final StringBuilder sql; @@ -394,18 +396,21 @@ class DefaultRenderContext extends AbstractContext implements Ren // Quoting is needed when explicitly requested... boolean needsQuote = - (QUOTED == cachedRenderNameStyle - // [#2367] ... but in SQLite, quoting "normal" literals is generally - // asking for trouble, as SQLite bends the rules here, see - // http://www.sqlite.org/lang_keywords.html for details ... - && family != SQLDialect.SQLITE) + // [#2367] ... but in SQLite, quoting "normal" literals is generally + // asking for trouble, as SQLite bends the rules here, see + // http://www.sqlite.org/lang_keywords.html for details ... + (family != SQLITE && QUOTED == cachedRenderNameStyle) || - // [#2367] ... yet, do quote when an identifier is a SQLite keyword - (family == SQLDialect.SQLITE - && SQLITE_KEYWORDS.contains(literal.toUpperCase())); + // [#2367] ... yet, do quote when an identifier is a SQLite keyword + (family == SQLITE && SQLITE_KEYWORDS.contains(literal.toUpperCase())) + + || + + // [#1982] [#3360] ... yet, do quote when an identifier contains special characters + (family == SQLITE && !IDENTIFIER_PATTERN.matcher(literal).matches()); if (!needsQuote) { if (LOWER == cachedRenderNameStyle) {