From 02f45c6439e56f76ece490ceea7d87bd474533de Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 28 Dec 2012 15:39:40 +0100 Subject: [PATCH] [#2055] MySQL's UPDATE [t1] JOIN [t2] syntax can cause syntax errors as column references are not fully qualified --- .../test/_/testcases/InsertUpdateTests.java | 30 +++++++++++++++++++ .../src/org/jooq/test/jOOQAbstractTest.java | 5 ++++ .../src/main/java/org/jooq/impl/Executor.java | 10 +++++++ .../java/org/jooq/impl/FieldMapForUpdate.java | 18 ++++++++--- 4 files changed, 59 insertions(+), 4 deletions(-) diff --git a/jOOQ-test/src/org/jooq/test/_/testcases/InsertUpdateTests.java b/jOOQ-test/src/org/jooq/test/_/testcases/InsertUpdateTests.java index 8dd144907c..2a6a459703 100644 --- a/jOOQ-test/src/org/jooq/test/_/testcases/InsertUpdateTests.java +++ b/jOOQ-test/src/org/jooq/test/_/testcases/InsertUpdateTests.java @@ -1098,6 +1098,36 @@ extends BaseTest + *

+ * Note that some databases support table expressions more complex than + * simple table references. In CUBRID and MySQL, for instance, you can write + *

+     * create.update(t1.join(t2).on(t1.id.eq(t2.id)))
+     *       .set(t1.value, value1)
+     *       .set(t2.value, value2)
+     *       .where(t1.id.eq(10))
+     *       .execute();
+     * 
*/ @Support public final UpdateSetFirstStep update(Table table) { diff --git a/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java b/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java index 3fe9596897..a6a209338c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java +++ b/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java @@ -35,6 +35,9 @@ */ package org.jooq.impl; +import static java.util.Arrays.asList; +import static org.jooq.SQLDialect.POSTGRES; +import static org.jooq.SQLDialect.SQLITE; import static org.jooq.impl.Factory.val; import java.util.Map; @@ -61,8 +64,15 @@ class FieldMapForUpdate extends AbstractQueryPartMap, Field> { if (size() > 0) { String separator = ""; - // [#989] Avoid qualifying fields in INSERT field declaration - boolean qualify = context.qualify(); + // [#989] Some dialects do not support qualified column references + // in the UPDATE statement's SET clause + + // [#2055] Other dialects require qualified column references to + // disambiguated columns in queries like + // UPDATE t1 JOIN t2 .. SET t1.val = ..., t2.val = ... + boolean restoreQualify = context.qualify(); + boolean supportsQualify = asList(POSTGRES, SQLITE).contains(context.getDialect()) ? false : restoreQualify; + for (Entry, Field> entry : entrySet()) { context.sql(separator); @@ -70,9 +80,9 @@ class FieldMapForUpdate extends AbstractQueryPartMap, Field> { context.formatNewLine(); } - context.qualify(false) + context.qualify(supportsQualify) .sql(entry.getKey()) - .qualify(qualify) + .qualify(restoreQualify) .sql(" = ") .sql(entry.getValue());