This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git


The following commit(s) were added to refs/heads/master by this push:
     new 9b0d8dcf0 CAY-2971 Remove extra spaces within SQL parenthesis
9b0d8dcf0 is described below

commit 9b0d8dcf09ba74c0704598e44ec3f23b98f82cc2
Author: Andrus Adamchik <[email protected]>
AuthorDate: Sat Jul 4 13:38:05 2026 -0400

    CAY-2971 Remove extra spaces within SQL parenthesis
---
 RELEASE-NOTES.txt                                  |  1 +
 .../access/sqlbuilder/DefaultSQLAppendable.java    | 21 +++++++++++++
 .../cayenne/access/sqlbuilder/SQLAppendable.java   | 13 ++++++++
 .../access/sqlbuilder/sqltree/AliasedNode.java     |  4 +--
 .../access/sqlbuilder/sqltree/BetweenNode.java     |  6 ++--
 .../access/sqlbuilder/sqltree/CaseNode.java        |  4 +--
 .../access/sqlbuilder/sqltree/ColumnNode.java      |  4 +--
 .../access/sqlbuilder/sqltree/DistinctNode.java    |  2 +-
 .../access/sqlbuilder/sqltree/ElseNode.java        |  2 +-
 .../access/sqlbuilder/sqltree/EqualNode.java       |  4 +--
 .../access/sqlbuilder/sqltree/ExistsNode.java      |  2 +-
 .../access/sqlbuilder/sqltree/ExpressionNode.java  |  4 +--
 .../access/sqlbuilder/sqltree/FromNode.java        |  2 +-
 .../access/sqlbuilder/sqltree/FunctionNode.java    | 10 +++---
 .../access/sqlbuilder/sqltree/GroupByNode.java     |  2 +-
 .../access/sqlbuilder/sqltree/HavingNode.java      |  2 +-
 .../cayenne/access/sqlbuilder/sqltree/InNode.java  |  4 +--
 .../sqlbuilder/sqltree/InsertColumnsNode.java      |  2 +-
 .../sqlbuilder/sqltree/InsertValuesNode.java       |  4 +--
 .../access/sqlbuilder/sqltree/JoinNode.java        |  2 +-
 .../access/sqlbuilder/sqltree/LikeNode.java        | 10 +++---
 .../access/sqlbuilder/sqltree/LimitOffsetNode.java |  3 +-
 .../cayenne/access/sqlbuilder/sqltree/NotNode.java |  2 +-
 .../sqlbuilder/sqltree/OffsetFetchNextNode.java    |  4 +--
 .../access/sqlbuilder/sqltree/OffsetNode.java      |  2 +-
 .../sqlbuilder/sqltree/OpExpressionNode.java       |  2 +-
 .../access/sqlbuilder/sqltree/OrderByNode.java     |  2 +-
 .../access/sqlbuilder/sqltree/SelectNode.java      |  2 +-
 .../access/sqlbuilder/sqltree/TableNode.java       |  4 +--
 .../access/sqlbuilder/sqltree/ThenNode.java        |  2 +-
 .../cayenne/access/sqlbuilder/sqltree/TopNode.java |  2 +-
 .../sqlbuilder/sqltree/TrimmingColumnNode.java     |  8 ++---
 .../sqlbuilder/sqltree/UnescapedColumnNode.java    |  4 +--
 .../access/sqlbuilder/sqltree/UpdateSetNode.java   |  2 +-
 .../access/sqlbuilder/sqltree/ValueNode.java       | 10 +++---
 .../access/sqlbuilder/sqltree/WhenNode.java        |  2 +-
 .../access/sqlbuilder/sqltree/WhereNode.java       |  2 +-
 .../access/DataContextPrefetchExtrasIT.java        | 17 +++++-----
 .../access/sqlbuilder/DeleteBuilderTest.java       |  2 +-
 .../access/sqlbuilder/InsertBuilderTest.java       |  6 ++--
 .../access/sqlbuilder/SelectBuilderTest.java       | 20 ++++++------
 .../translator/batch/DeleteBatchTranslatorIT.java  |  6 ++--
 .../translator/batch/InsertBatchTranslatorIT.java  |  8 ++---
 .../translator/batch/UpdateBatchTranslatorIT.java  |  6 ++--
 .../QualifierTranslatorExistExpressionIT.java      | 36 +++++++++++-----------
 .../translator/select/QualifierTranslatorIT.java   |  4 +--
 .../translator/select/QualifierTranslatorTest.java |  2 +-
 47 files changed, 150 insertions(+), 115 deletions(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index b74745481..45deed439 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -21,6 +21,7 @@ CAY-2962 Allow unconstrained VARCHAR
 CAY-2963 Replace TypesHandler / types.xml with hardcoded map
 CAY-2969 Extender API for "soft" delete 
 CAY-2970 Tighten deferred value resolution contract on commit
+CAY-2971 Remove extra spaces within SQL parenthesis
 
 Bug Fixes:
 
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/DefaultSQLAppendable.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/DefaultSQLAppendable.java
index c6f86a8e5..0cc1b71c7 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/DefaultSQLAppendable.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/DefaultSQLAppendable.java
@@ -29,6 +29,7 @@ public class DefaultSQLAppendable implements SQLAppendable {
     final StringBuilder builder;
     private final SQLGenerationContext context;
     private final QuotingStrategy quotingStrategy;
+    private boolean suppressNextSeparator;
 
     public DefaultSQLAppendable(SQLGenerationContext context) {
         this.builder = new StringBuilder();
@@ -44,30 +45,50 @@ public class DefaultSQLAppendable implements SQLAppendable {
 
     @Override
     public SQLAppendable append(String str) {
+        suppressNextSeparator = false;
         builder.append(str);
         return this;
     }
 
     @Override
     public SQLAppendable append(char c) {
+        suppressNextSeparator = false;
         builder.append(c);
         return this;
     }
 
     @Override
     public SQLAppendable append(int c) {
+        suppressNextSeparator = false;
         builder.append(c);
         return this;
     }
 
     @Override
     public SQLAppendable appendQuoted(String str) {
+        suppressNextSeparator = false;
         quotingStrategy.appendStart(builder);
         builder.append(str);
         quotingStrategy.appendEnd(builder);
         return this;
     }
 
+    @Override
+    public SQLAppendable appendTokenSeparator() {
+        if (suppressNextSeparator) {
+            suppressNextSeparator = false;
+        } else {
+            builder.append(' ');
+        }
+        return this;
+    }
+
+    @Override
+    public SQLAppendable suppressNextTokenSeparator() {
+        suppressNextSeparator = true;
+        return this;
+    }
+
     @Override
     public SQLGenerationContext getContext() {
         return context;
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/SQLAppendable.java 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/SQLAppendable.java
index 20301e27b..c7df379a5 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/SQLAppendable.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/SQLAppendable.java
@@ -39,6 +39,19 @@ public interface SQLAppendable {
 
     SQLAppendable append(int i);
 
+    /**
+     * Emits a token separator (a single space) ahead of the next SQL token. 
SQL tree nodes call this instead of
+     * embedding a leading space in their literals, so inter-token spacing is 
owned by the appendable rather than
+     * scattered across nodes. The separator is skipped when {@link 
#suppressNextTokenSeparator()} was just called.
+     */
+    SQLAppendable appendTokenSeparator();
+
+    /**
+     * Suppresses the separator that the next {@link #appendTokenSeparator()} 
call would emit. A node calls this right
+     * after opening a parenthesis so the group hugs its first token — {@code 
(NAME)} rather than {@code ( NAME)}.
+     */
+    SQLAppendable suppressNextTokenSeparator();
+
     SQLAppendable appendQuoted(String str);
 
     SQLGenerationContext getContext();
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/AliasedNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/AliasedNode.java
index ecef9492c..cd5edeb6d 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/AliasedNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/AliasedNode.java
@@ -43,7 +43,7 @@ public class AliasedNode extends Node {
     @Override
     public SQLAppendable append(SQLAppendable buffer) {
         if(skipContent()) {
-            buffer.append(' ').append(alias);
+            buffer.appendTokenSeparator().append(alias);
         }
         return buffer;
     }
@@ -63,7 +63,7 @@ public class AliasedNode extends Node {
         if(skipContent()){
             return;
         }
-        buffer.append(" ").append(alias);
+        buffer.appendTokenSeparator().append(alias);
     }
 
     public String getAlias() {
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/BetweenNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/BetweenNode.java
index 7cd9c925b..4199c4f4c 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/BetweenNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/BetweenNode.java
@@ -39,11 +39,11 @@ public class BetweenNode extends ExpressionNode {
     public void appendChildrenSeparator(SQLAppendable buffer, int childIdx) {
         if (childIdx == 0) {
             if (not) {
-                buffer.append(" NOT");
+                buffer.appendTokenSeparator().append("NOT");
             }
-            buffer.append(" BETWEEN");
+            buffer.appendTokenSeparator().append("BETWEEN");
         } else {
-            buffer.append(" AND");
+            buffer.appendTokenSeparator().append("AND");
         }
     }
 
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/CaseNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/CaseNode.java
index 4db81f533..ba83fb659 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/CaseNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/CaseNode.java
@@ -28,7 +28,7 @@ public class CaseNode extends Node {
 
     @Override
     public SQLAppendable append(SQLAppendable buffer) {
-        return buffer.append(" CASE");
+        return buffer.appendTokenSeparator().append("CASE");
     }
 
     @Override
@@ -38,6 +38,6 @@ public class CaseNode extends Node {
 
     @Override
     public void appendChildrenEnd(SQLAppendable buffer) {
-            buffer.append(" END");
+            buffer.appendTokenSeparator().append("END");
     }
 }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ColumnNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ColumnNode.java
index 0dada27f8..d989f3de3 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ColumnNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ColumnNode.java
@@ -44,13 +44,13 @@ public class ColumnNode extends Node {
 
     @Override
     public SQLAppendable append(SQLAppendable buffer) {
-        buffer.append(' ');
+        buffer.appendTokenSeparator();
         if (table != null) {
             buffer.appendQuoted(table).append('.');
         }
         buffer.appendQuoted(column);
         if (alias != null) {
-            buffer.append(' ').appendQuoted(alias);
+            buffer.appendTokenSeparator().appendQuoted(alias);
         }
         return buffer;
     }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/DistinctNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/DistinctNode.java
index 7a7c0862b..69a83ad73 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/DistinctNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/DistinctNode.java
@@ -32,7 +32,7 @@ public class DistinctNode extends Node {
 
     @Override
     public SQLAppendable append(SQLAppendable buffer) {
-        return buffer.append(" DISTINCT");
+        return buffer.appendTokenSeparator().append("DISTINCT");
     }
 
     @Override
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ElseNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ElseNode.java
index 2d8c4a4eb..7f9b23b8a 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ElseNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ElseNode.java
@@ -28,7 +28,7 @@ public class ElseNode extends Node {
 
     @Override
     public SQLAppendable append(SQLAppendable buffer) {
-        return buffer.append(" ELSE");
+        return buffer.appendTokenSeparator().append("ELSE");
     }
 
     @Override
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/EqualNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/EqualNode.java
index c7dda8354..5d0a6a2fe 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/EqualNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/EqualNode.java
@@ -37,9 +37,9 @@ public class EqualNode extends ExpressionNode {
                 && ((ValueNode) child).getValue() == null
                 && getParent() != null
                 && getParent().getType() != NodeType.UPDATE_SET) {
-            buffer.append(" IS");
+            buffer.appendTokenSeparator().append("IS");
         } else {
-            buffer.append(" =");
+            buffer.appendTokenSeparator().append('=');
         }
     }
 
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ExistsNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ExistsNode.java
index 55913ba44..263cb14d4 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ExistsNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ExistsNode.java
@@ -28,7 +28,7 @@ public class ExistsNode extends Node {
 
     @Override
     public SQLAppendable append(SQLAppendable buffer) {
-        return buffer.append(" EXISTS");
+        return buffer.appendTokenSeparator().append("EXISTS");
     }
 
     @Override
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ExpressionNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ExpressionNode.java
index 1e6fccba1..cab202194 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ExpressionNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ExpressionNode.java
@@ -45,7 +45,7 @@ public class ExpressionNode extends Node {
                 && parent.type != NodeType.WHERE
                 && parent.type != NodeType.JOIN
                 && parent.type != NodeType.UPDATE_SET) {
-            buffer.append(" (");
+            
buffer.appendTokenSeparator().append('(').suppressNextTokenSeparator();
         }
     }
 
@@ -55,7 +55,7 @@ public class ExpressionNode extends Node {
                 && parent.type != NodeType.WHERE
                 && parent.type != NodeType.JOIN
                 && parent.type != NodeType.UPDATE_SET) {
-            buffer.append(" )");
+            buffer.append(")");
         }
     }
 
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/FromNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/FromNode.java
index f38ac97e3..a63f25e4c 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/FromNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/FromNode.java
@@ -32,7 +32,7 @@ public class FromNode extends Node {
 
     @Override
     public SQLAppendable append(SQLAppendable buffer) {
-        return buffer.append(" FROM");
+        return buffer.appendTokenSeparator().append("FROM");
     }
 
     @Override
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/FunctionNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/FunctionNode.java
index ed998a471..f303b3454 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/FunctionNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/FunctionNode.java
@@ -53,9 +53,9 @@ public class FunctionNode extends Node {
     @Override
     public SQLAppendable append(SQLAppendable buffer) {
         if(skipContent()) {
-            buffer.append(' ').append(alias);
+            buffer.appendTokenSeparator().append(alias);
         } else {
-            buffer.append(' ').append(functionName);
+            buffer.appendTokenSeparator().append(functionName);
         }
         return buffer;
     }
@@ -76,7 +76,7 @@ public class FunctionNode extends Node {
             return;
         }
         if (needParentheses) {
-            buffer.append('(');
+            buffer.append('(').suppressNextTokenSeparator();
         }
     }
 
@@ -87,11 +87,11 @@ public class FunctionNode extends Node {
         }
 
         if (needParentheses) {
-            buffer.append(" )");
+            buffer.append(")");
         }
 
         if (alias != null) {
-            buffer.append(" ").appendQuoted(alias);
+            buffer.appendTokenSeparator().appendQuoted(alias);
         }
     }
 
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/GroupByNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/GroupByNode.java
index 06eff94eb..4dcc48f9d 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/GroupByNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/GroupByNode.java
@@ -28,7 +28,7 @@ public class GroupByNode extends Node {
 
     @Override
     public SQLAppendable append(SQLAppendable buffer) {
-        return buffer.append(" GROUP BY");
+        return buffer.appendTokenSeparator().append("GROUP BY");
     }
 
     @Override
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/HavingNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/HavingNode.java
index f6047cb15..945fc8cc4 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/HavingNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/HavingNode.java
@@ -27,7 +27,7 @@ import org.apache.cayenne.access.sqlbuilder.SQLAppendable;
 public class HavingNode extends Node {
     @Override
     public SQLAppendable append(SQLAppendable buffer) {
-        return buffer.append(" HAVING");
+        return buffer.appendTokenSeparator().append("HAVING");
     }
 
     @Override
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/InNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/InNode.java
index 964c5edcc..9e5e97981 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/InNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/InNode.java
@@ -44,9 +44,9 @@ public class InNode extends Node {
     public void appendChildrenSeparator(SQLAppendable buffer, int childInd) {
         if (childInd == 0) {
             if (not) {
-                buffer.append(" NOT");
+                buffer.appendTokenSeparator().append("NOT");
             }
-            buffer.append(" IN (");
+            
buffer.appendTokenSeparator().append("IN").appendTokenSeparator().append('(').suppressNextTokenSeparator();
         }
     }
 
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/InsertColumnsNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/InsertColumnsNode.java
index cb3516940..ed736e817 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/InsertColumnsNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/InsertColumnsNode.java
@@ -52,6 +52,6 @@ public class InsertColumnsNode extends Node {
 
     @Override
     public void appendChildrenStart(SQLAppendable buffer) {
-        buffer.append('(');
+        buffer.append('(').suppressNextTokenSeparator();
     }
 }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/InsertValuesNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/InsertValuesNode.java
index 4d021c351..f82cfb2e5 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/InsertValuesNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/InsertValuesNode.java
@@ -37,12 +37,12 @@ public class InsertValuesNode extends Node {
 
     @Override
     public SQLAppendable append(SQLAppendable buffer) {
-        return buffer.append(" VALUES");
+        return buffer.appendTokenSeparator().append("VALUES");
     }
 
     @Override
     public void appendChildrenStart(SQLAppendable buffer) {
-        buffer.append('(');
+        buffer.append('(').suppressNextTokenSeparator();
     }
 
     @Override
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/JoinNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/JoinNode.java
index 8d37c0976..d73905854 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/JoinNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/JoinNode.java
@@ -46,6 +46,6 @@ public class JoinNode extends Node {
 
     @Override
     public void appendChildrenSeparator(SQLAppendable buffer, int childInd) {
-        buffer.append(" ON");
+        buffer.appendTokenSeparator().append("ON");
     }
 }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/LikeNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/LikeNode.java
index 4aa5c403c..2990452e2 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/LikeNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/LikeNode.java
@@ -44,7 +44,7 @@ public class LikeNode extends ExpressionNode {
     @Override
     public void appendChildrenStart(SQLAppendable buffer) {
         if(ignoreCase) {
-            buffer.append(" UPPER(");
+            buffer.appendTokenSeparator().append("UPPER(");
         }
     }
 
@@ -54,11 +54,11 @@ public class LikeNode extends ExpressionNode {
             buffer.append(')');
         }
         if(not) {
-            buffer.append(" NOT");
+            buffer.appendTokenSeparator().append("NOT");
         }
-        buffer.append(" LIKE");
+        buffer.appendTokenSeparator().append("LIKE");
         if(ignoreCase) {
-            buffer.append(" UPPER(");
+            buffer.appendTokenSeparator().append("UPPER(");
         }
     }
 
@@ -68,7 +68,7 @@ public class LikeNode extends ExpressionNode {
             buffer.append(')');
         }
         if(escape != 0) {
-            buffer.append(" ESCAPE '").append(escape).append('\'');
+            
buffer.appendTokenSeparator().append("ESCAPE").appendTokenSeparator().append('\'').append(escape).append('\'');
         }
     }
 
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/LimitOffsetNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/LimitOffsetNode.java
index ebae2488c..cdc695b0f 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/LimitOffsetNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/LimitOffsetNode.java
@@ -42,7 +42,8 @@ public class LimitOffsetNode extends Node {
         if(limit == 0 && offset == 0) {
             return buffer;
         }
-        return buffer.append(" LIMIT ").append(limit).append(" OFFSET 
").append(offset);
+        return 
buffer.appendTokenSeparator().append("LIMIT").appendTokenSeparator().append(limit)
+                
.appendTokenSeparator().append("OFFSET").appendTokenSeparator().append(offset);
     }
 
     public int getLimit() {
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/NotNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/NotNode.java
index 3f0cfe797..3e99df4f2 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/NotNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/NotNode.java
@@ -27,7 +27,7 @@ import org.apache.cayenne.access.sqlbuilder.SQLAppendable;
 public class NotNode extends Node {
     @Override
     public SQLAppendable append(SQLAppendable buffer) {
-        return buffer.append(" NOT");
+        return buffer.appendTokenSeparator().append("NOT");
     }
 
     @Override
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/OffsetFetchNextNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/OffsetFetchNextNode.java
index a37645177..6082ec2b8 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/OffsetFetchNextNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/OffsetFetchNextNode.java
@@ -38,10 +38,10 @@ public class OffsetFetchNextNode extends LimitOffsetNode {
     public SQLAppendable append(SQLAppendable buffer) {
         // OFFSET X ROWS FETCH NEXT Y ROWS ONLY
         if(offset > 0) {
-            buffer.append(" OFFSET ").append(offset).append(" ROWS");
+            
buffer.appendTokenSeparator().append("OFFSET").appendTokenSeparator().append(offset).appendTokenSeparator().append("ROWS");
         }
         if(limit > 0) {
-            buffer.append(" FETCH NEXT ").append(limit).append(" ROWS ONLY");
+            buffer.appendTokenSeparator().append("FETCH 
NEXT").appendTokenSeparator().append(limit).appendTokenSeparator().append("ROWS 
ONLY");
         }
         return buffer;
     }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/OffsetNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/OffsetNode.java
index f6b73fbaf..2eb1e756d 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/OffsetNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/OffsetNode.java
@@ -35,7 +35,7 @@ public class OffsetNode extends Node {
 
     @Override
     public SQLAppendable append(SQLAppendable buffer) {
-        return buffer.append(" OFFSET ").append(offset);
+        return 
buffer.appendTokenSeparator().append("OFFSET").appendTokenSeparator().append(offset);
     }
 
     @Override
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/OpExpressionNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/OpExpressionNode.java
index b0e68a471..b8eb40640 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/OpExpressionNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/OpExpressionNode.java
@@ -36,7 +36,7 @@ public class OpExpressionNode extends ExpressionNode {
 
     @Override
     public void appendChildrenSeparator(SQLAppendable buffer, int childInd) {
-        buffer.append(' ').append(op);
+        buffer.appendTokenSeparator().append(op);
     }
 
     @Override
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/OrderByNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/OrderByNode.java
index 309c9d409..eb0a082f5 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/OrderByNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/OrderByNode.java
@@ -28,7 +28,7 @@ public class OrderByNode extends Node {
 
     @Override
     public SQLAppendable append(SQLAppendable buffer) {
-        return buffer.append(" ORDER BY");
+        return buffer.appendTokenSeparator().append("ORDER BY");
     }
 
     @Override
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/SelectNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/SelectNode.java
index 4b28c32bf..950b93b96 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/SelectNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/SelectNode.java
@@ -29,7 +29,7 @@ public class SelectNode extends Node {
     @Override
     public SQLAppendable append(SQLAppendable builder) {
         if(parent != null) {
-            builder.append(" (");
+            builder.appendTokenSeparator().append('(');
         }
         return builder.append("SELECT");
     }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/TableNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/TableNode.java
index 2b23beca2..0b16891b6 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/TableNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/TableNode.java
@@ -47,7 +47,7 @@ public class TableNode extends Node {
 
     @Override
     public SQLAppendable append(SQLAppendable buffer) {
-        buffer.append(' ');
+        buffer.appendTokenSeparator();
 
         if(dbEntity != null) {
             if(dbEntity.getCatalog() != null) {
@@ -62,7 +62,7 @@ public class TableNode extends Node {
         }
 
         if (alias != null) {
-            buffer.append(' ').appendQuoted(alias);
+            buffer.appendTokenSeparator().appendQuoted(alias);
         }
         return buffer;
     }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ThenNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ThenNode.java
index b64fbc787..7b6ccc76a 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ThenNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ThenNode.java
@@ -28,7 +28,7 @@ public class ThenNode extends Node {
 
     @Override
     public SQLAppendable append(SQLAppendable buffer) {
-        return buffer.append(" THEN");
+        return buffer.appendTokenSeparator().append("THEN");
     }
 
     @Override
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/TopNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/TopNode.java
index cb5174799..35d0cc265 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/TopNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/TopNode.java
@@ -36,7 +36,7 @@ public class TopNode extends Node {
 
     @Override
     public SQLAppendable append(SQLAppendable buffer) {
-        return buffer.append(" TOP ").append(count);
+        return 
buffer.appendTokenSeparator().append("TOP").appendTokenSeparator().append(count);
     }
 
     @Override
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/TrimmingColumnNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/TrimmingColumnNode.java
index 9af170575..7cba285a2 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/TrimmingColumnNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/TrimmingColumnNode.java
@@ -66,7 +66,7 @@ public class TrimmingColumnNode extends Node {
     }
 
     protected void appendRtrim(SQLAppendable buffer) {
-        buffer.append(" RTRIM(");
+        buffer.appendTokenSeparator().append("RTRIM(");
         appendColumnNode(buffer);
         buffer.append(")");
     }
@@ -110,9 +110,9 @@ public class TrimmingColumnNode extends Node {
     }
 
     protected void appendClobColumnNode(SQLAppendable buffer) {
-        buffer.append(" CAST(");
+        buffer.appendTokenSeparator().append("CAST(");
         appendColumnNode(buffer);
-        buffer.append(" AS VARCHAR(").append(getColumnSize()).append("))");
+        
buffer.appendTokenSeparator().append("AS").appendTokenSeparator().append("VARCHAR(").append(getColumnSize()).append("))");
     }
 
     protected void appendColumnNode(SQLAppendable buffer) {
@@ -127,7 +127,7 @@ public class TrimmingColumnNode extends Node {
             return;
         }
         if (columnNode.getAlias() != null) {
-            buffer.append(' ').appendQuoted(columnNode.getAlias());
+            buffer.appendTokenSeparator().appendQuoted(columnNode.getAlias());
         }
     }
 
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/UnescapedColumnNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/UnescapedColumnNode.java
index 4483b325c..7f397910b 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/UnescapedColumnNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/UnescapedColumnNode.java
@@ -33,13 +33,13 @@ public class UnescapedColumnNode extends ColumnNode {
 
     @Override
     public SQLAppendable append(SQLAppendable buffer) {
-        buffer.append(' ');
+        buffer.appendTokenSeparator();
         if (table != null) {
             buffer.append(table).append('.');
         }
         buffer.append(column);
         if (alias != null) {
-            buffer.append(' ').appendQuoted(alias);
+            buffer.appendTokenSeparator().appendQuoted(alias);
         }
 
         return buffer;
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/UpdateSetNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/UpdateSetNode.java
index cc4c49205..8c92789d5 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/UpdateSetNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/UpdateSetNode.java
@@ -37,7 +37,7 @@ public class UpdateSetNode extends Node {
 
     @Override
     public SQLAppendable append(SQLAppendable buffer) {
-        return buffer.append(" SET");
+        return buffer.appendTokenSeparator().append("SET");
     }
 
     @Override
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ValueNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ValueNode.java
index 3aea5cdff..123b2acff 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ValueNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ValueNode.java
@@ -69,7 +69,7 @@ public class ValueNode extends Node {
     }
 
     protected void appendNullValue(SQLAppendable buffer) {
-        buffer.append(" NULL");
+        buffer.appendTokenSeparator().append("NULL");
     }
 
     private void appendValue(Object val, SQLAppendable buffer) {
@@ -108,19 +108,19 @@ public class ValueNode extends Node {
             return;
         }
         if (buffer.getContext() == null || !needBinding) {
-            buffer.append(' ').append(value.toString());
+            buffer.appendTokenSeparator().append(value.toString());
         } else {
-            buffer.append(" ?");
+            buffer.appendTokenSeparator().append('?');
             addValueBinding(buffer, value);
         }
     }
 
     protected void appendStringValue(SQLAppendable buffer, CharSequence value) 
{
         if (buffer.getContext() == null || !needBinding) {
-            buffer.append(" '").append(value.toString()).append("'");
+            
buffer.appendTokenSeparator().append('\'').append(value.toString()).append('\'');
         } else {
             // value can't be null here
-            buffer.append(" ?");
+            buffer.appendTokenSeparator().append('?');
             addValueBinding(buffer, value);
         }
     }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/WhenNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/WhenNode.java
index 3848a2841..13bc92cdd 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/WhenNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/WhenNode.java
@@ -28,7 +28,7 @@ public class WhenNode extends Node {
 
     @Override
     public SQLAppendable append(SQLAppendable buffer) {
-        return buffer.append(" WHEN");
+        return buffer.appendTokenSeparator().append("WHEN");
     }
 
     @Override
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/WhereNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/WhereNode.java
index 8e20dc94c..6f47db403 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/WhereNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/WhereNode.java
@@ -32,7 +32,7 @@ public class WhereNode extends Node {
 
     @Override
     public SQLAppendable append(SQLAppendable buffer) {
-        return buffer.append(" WHERE");
+        return buffer.appendTokenSeparator().append("WHERE");
     }
 
     @Override
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/access/DataContextPrefetchExtrasIT.java
 
b/cayenne/src/test/java/org/apache/cayenne/access/DataContextPrefetchExtrasIT.java
index 0dc0d004d..cecd8147d 100644
--- 
a/cayenne/src/test/java/org/apache/cayenne/access/DataContextPrefetchExtrasIT.java
+++ 
b/cayenne/src/test/java/org/apache/cayenne/access/DataContextPrefetchExtrasIT.java
@@ -19,7 +19,6 @@
 
 package org.apache.cayenne.access;
 
-import java.util.List;
 import org.apache.cayenne.PersistenceState;
 import org.apache.cayenne.Persistent;
 import org.apache.cayenne.PersistentObject;
@@ -34,8 +33,10 @@ import 
org.apache.cayenne.testdo.compound.CompoundPkTestEntity;
 import org.apache.cayenne.unit.CayenneProjects;
 import org.apache.cayenne.unit.CayenneTestsEnv;
 import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+import java.util.List;
 
 import static org.junit.jupiter.api.Assertions.*;
 
@@ -96,14 +97,14 @@ public class DataContextPrefetchExtrasIT  {
         List<CharPkTestEntity> pks = q.select(env.context());
         assertEquals(2, pks.size());
 
-        CharPkTestEntity pk1 = pks.get(0);
+        CharPkTestEntity pk1 = pks.getFirst();
         assertEquals("n1", pk1.getOtherCol());
         List<?> toMany = (List<?>) pk1.readPropertyDirectly("charFKs");
         assertNotNull(toMany);
         assertFalse(((ValueHolder) toMany).isFault());
         assertEquals(3, toMany.size());
 
-        CharFkTestEntity fk1 = (CharFkTestEntity) toMany.get(0);
+        CharFkTestEntity fk1 = (CharFkTestEntity) toMany.getFirst();
         assertEquals(PersistenceState.COMMITTED, fk1.getPersistenceState());
         assertSame(pk1, fk1.getToCharPK());
     }
@@ -121,13 +122,11 @@ public class DataContextPrefetchExtrasIT  {
 
         List<CompoundFkTestEntity> objects = q.select(env.context());
         assertEquals(1, objects.size());
-        PersistentObject fk1 = objects.get(0);
+        PersistentObject fk1 = objects.getFirst();
 
         Object toOnePrefetch = fk1.readNestedProperty("toCompoundPk");
         assertNotNull(toOnePrefetch);
-        assertTrue(
-                toOnePrefetch instanceof Persistent,
-                "Expected Persistent, got: " + 
toOnePrefetch.getClass().getName());
+        assertInstanceOf(Persistent.class, toOnePrefetch, "Expected 
Persistent, got: " + toOnePrefetch.getClass().getName());
 
         Persistent pk1 = (Persistent) toOnePrefetch;
         assertEquals(PersistenceState.COMMITTED, pk1.getPersistenceState());
@@ -147,7 +146,7 @@ public class DataContextPrefetchExtrasIT  {
 
         List<CompoundPkTestEntity> pks = q.select(env.context());
         assertEquals(1, pks.size());
-        PersistentObject pk1 = pks.get(0);
+        PersistentObject pk1 = pks.getFirst();
 
         List<?> toMany = (List<?>) pk1.readPropertyDirectly("compoundFkArray");
         assertNotNull(toMany);
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/access/sqlbuilder/DeleteBuilderTest.java
 
b/cayenne/src/test/java/org/apache/cayenne/access/sqlbuilder/DeleteBuilderTest.java
index 501478ca3..eb7b713dd 100644
--- 
a/cayenne/src/test/java/org/apache/cayenne/access/sqlbuilder/DeleteBuilderTest.java
+++ 
b/cayenne/src/test/java/org/apache/cayenne/access/sqlbuilder/DeleteBuilderTest.java
@@ -46,7 +46,7 @@ public class DeleteBuilderTest extends BaseSqlBuilderTest {
                         .and(column("col3").eq(value(null)))
         ).build();
         assertInstanceOf(DeleteNode.class, node);
-        assertSQL("DELETE FROM test WHERE ( ( col1 = 1 ) AND ( col2 = 'test' ) 
) AND ( col3 IS NULL )", node);
+        assertSQL("DELETE FROM test WHERE ((col1 = 1) AND (col2 = 'test')) AND 
(col3 IS NULL)", node);
     }
 
     @Test
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/access/sqlbuilder/InsertBuilderTest.java
 
b/cayenne/src/test/java/org/apache/cayenne/access/sqlbuilder/InsertBuilderTest.java
index 09b7cc14b..a8305ef18 100644
--- 
a/cayenne/src/test/java/org/apache/cayenne/access/sqlbuilder/InsertBuilderTest.java
+++ 
b/cayenne/src/test/java/org/apache/cayenne/access/sqlbuilder/InsertBuilderTest.java
@@ -70,7 +70,7 @@ public class InsertBuilderTest extends BaseSqlBuilderTest  {
         Node node = builder.build();
 
         assertInstanceOf(InsertNode.class, node);
-        assertSQL("INSERT INTO test( col1, col2, col3)", node);
+        assertSQL("INSERT INTO test(col1, col2, col3)", node);
     }
 
     @Test
@@ -83,7 +83,7 @@ public class InsertBuilderTest extends BaseSqlBuilderTest  {
         Node node = builder.build();
 
         assertInstanceOf(InsertNode.class, node);
-        assertSQL("INSERT INTO test VALUES( 1, 'test', NULL)", node);
+        assertSQL("INSERT INTO test VALUES(1, 'test', NULL)", node);
     }
 
     @Test
@@ -99,7 +99,7 @@ public class InsertBuilderTest extends BaseSqlBuilderTest  {
         Node node = builder.build();
 
         assertInstanceOf(InsertNode.class, node);
-        assertSQL("INSERT INTO test( col1, col2, col3) VALUES( 1, 'test', 
NULL)", node);
+        assertSQL("INSERT INTO test(col1, col2, col3) VALUES(1, 'test', 
NULL)", node);
     }
 
 }
\ No newline at end of file
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/access/sqlbuilder/SelectBuilderTest.java
 
b/cayenne/src/test/java/org/apache/cayenne/access/sqlbuilder/SelectBuilderTest.java
index a44f781e4..6c86c3ced 100644
--- 
a/cayenne/src/test/java/org/apache/cayenne/access/sqlbuilder/SelectBuilderTest.java
+++ 
b/cayenne/src/test/java/org/apache/cayenne/access/sqlbuilder/SelectBuilderTest.java
@@ -96,7 +96,7 @@ public class SelectBuilderTest extends BaseSqlBuilderTest  {
                 
.where(column("a").eq(value(123)).and(column("c").lt(column("d"))));
         Node node = builder.build();
         assertInstanceOf(SelectNode.class, node);
-        assertSQL("SELECT a FROM b WHERE ( a = 123 ) AND ( c < d )", node);
+        assertSQL("SELECT a FROM b WHERE (a = 123) AND (c < d)", node);
     }
 
     @Test
@@ -114,8 +114,8 @@ public class SelectBuilderTest extends BaseSqlBuilderTest  {
         assertInstanceOf(SelectNode.class, node);
         assertSQL("SELECT OrderID, Quantity, " +
                 "CASE " +
-                    "WHEN ( ( Quantity > 30 ) AND ( Quantity < 100 ) ) THEN 
'The quantity from 30 to 100' " +
-                    "WHEN ( Quantity = 30 ) THEN 'The quantity is 30' " +
+                    "WHEN ((Quantity > 30) AND (Quantity < 100)) THEN 'The 
quantity from 30 to 100' " +
+                    "WHEN (Quantity = 30) THEN 'The quantity is 30' " +
                     "ELSE 'The quantity is under 30' " +
                     "END QuantityText " +
                 "FROM OrderDetails", node);
@@ -151,7 +151,7 @@ public class SelectBuilderTest extends BaseSqlBuilderTest  {
                 .build();
 
         assertInstanceOf(SelectNode.class, node);
-        assertSQL("SELECT test( p.PAINTING_TITLE ) f FROM PAINTING p ORDER BY 
f", node);
+        assertSQL("SELECT test(p.PAINTING_TITLE) f FROM PAINTING p ORDER BY 
f", node);
     }
 
     @Test
@@ -180,14 +180,14 @@ public class SelectBuilderTest extends BaseSqlBuilderTest 
 {
                 .build();
         assertInstanceOf(SelectNode.class, node);
         assertSQL("SELECT DISTINCT" +
-                    " a.ARTIST_ID a_id, COUNT( p.PAINTING_TITLE ) p_count" +
+                    " a.ARTIST_ID a_id, COUNT(p.PAINTING_TITLE) p_count" +
                 " FROM ARTIST a" +
-                " LEFT JOIN PAINTING p ON ( a.ARTIST_ID = p.ARTIST_ID ) AND ( 
p.ESTIMATED_PRICE > 10 )" +
-                " WHERE ( ( ( a.ARTIST_NAME = 'Picasso' )" +
-                    " AND EXISTS (SELECT * FROM GALLERY g WHERE g.GALLERY_ID = 
p.GALLERY_ID) )" +
-                    " AND ( 1 = 1 ) ) OR false" +
+                " LEFT JOIN PAINTING p ON (a.ARTIST_ID = p.ARTIST_ID) AND 
(p.ESTIMATED_PRICE > 10)" +
+                " WHERE (((a.ARTIST_NAME = 'Picasso')" +
+                    " AND EXISTS (SELECT * FROM GALLERY g WHERE g.GALLERY_ID = 
p.GALLERY_ID))" +
+                    " AND (1 = 1)) OR false" +
                 " GROUP BY a.ARTIST_ID" +
-                " HAVING NOT ( COUNT( p.PAINTING_TITLE ) > 3 )" +
+                " HAVING NOT (COUNT(p.PAINTING_TITLE) > 3)" +
                 " ORDER BY p_count DESC, a_id", node);
     }
 
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/access/translator/batch/DeleteBatchTranslatorIT.java
 
b/cayenne/src/test/java/org/apache/cayenne/access/translator/batch/DeleteBatchTranslatorIT.java
index ba646a9a1..017e563ec 100644
--- 
a/cayenne/src/test/java/org/apache/cayenne/access/translator/batch/DeleteBatchTranslatorIT.java
+++ 
b/cayenne/src/test/java/org/apache/cayenne/access/translator/batch/DeleteBatchTranslatorIT.java
@@ -90,7 +90,7 @@ public class DeleteBatchTranslatorIT {
         DbAdapter adapter = objectFactory.newInstance(DbAdapter.class, 
JdbcAdapter.class.getName());
         String generatedSql = new 
DeleteBatchTranslator().translate(deleteQuery, adapter).sql();
         assertNotNull(generatedSql);
-        assertEquals("DELETE FROM " + entity.getName() + " WHERE ( 
LOCKING_TEST_ID = ? ) AND ( NAME IS NULL )", generatedSql);
+        assertEquals("DELETE FROM " + entity.getName() + " WHERE 
(LOCKING_TEST_ID = ?) AND (NAME IS NULL)", generatedSql);
     }
 
     @Test
@@ -138,8 +138,8 @@ public class DeleteBatchTranslatorIT {
             String charEnd = unitAdapter.getIdentifiersEndQuote();
             assertNotNull(generatedSql);
 
-            assertEquals("DELETE FROM " + charStart + entity.getName() + 
charEnd + " WHERE ( " + charStart
-                    + "LOCKING_TEST_ID" + charEnd + " = ? ) AND ( " + 
charStart + "NAME" + charEnd + " IS NULL )",
+            assertEquals("DELETE FROM " + charStart + entity.getName() + 
charEnd + " WHERE (" + charStart
+                    + "LOCKING_TEST_ID" + charEnd + " = ?) AND (" + charStart 
+ "NAME" + charEnd + " IS NULL)",
                     generatedSql);
         } finally {
             entity.getDataMap().setQuotingSQLIdentifiers(false);
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/access/translator/batch/InsertBatchTranslatorIT.java
 
b/cayenne/src/test/java/org/apache/cayenne/access/translator/batch/InsertBatchTranslatorIT.java
index fcd4e7a9f..78060c75c 100644
--- 
a/cayenne/src/test/java/org/apache/cayenne/access/translator/batch/InsertBatchTranslatorIT.java
+++ 
b/cayenne/src/test/java/org/apache/cayenne/access/translator/batch/InsertBatchTranslatorIT.java
@@ -64,8 +64,8 @@ public class InsertBatchTranslatorIT {
         InsertBatchQuery insertQuery = new InsertBatchQuery(entity, 1);
         String generatedSql = new 
InsertBatchTranslator().translate(insertQuery, adapter).sql();
         assertNotNull(generatedSql);
-        assertEquals("INSERT INTO " + entity.getName() + "( DESCRIPTION, 
INT_COLUMN_NOTNULL, INT_COLUMN_NULL, LOCKING_TEST_ID, NAME) " +
-                        "VALUES( ?, ?, ?, ?, ?)",
+        assertEquals("INSERT INTO " + entity.getName() + "(DESCRIPTION, 
INT_COLUMN_NOTNULL, INT_COLUMN_NULL, LOCKING_TEST_ID, NAME) " +
+                        "VALUES(?, ?, ?, ?, ?)",
                 generatedSql);
     }
 
@@ -83,11 +83,11 @@ public class InsertBatchTranslatorIT {
             String charEnd = unitAdapter.getIdentifiersEndQuote();
             assertNotNull(generatedSql);
             assertEquals("INSERT INTO " + charStart + entity.getName() + 
charEnd
-                    + "( " + charStart + "DESCRIPTION" + charEnd + ", "
+                    + "(" + charStart + "DESCRIPTION" + charEnd + ", "
                     + charStart + "INT_COLUMN_NOTNULL" + charEnd + ", "
                     + charStart + "INT_COLUMN_NULL" + charEnd + ", "
                     + charStart + "LOCKING_TEST_ID" + charEnd + ", "
-                    + charStart + "NAME" + charEnd + ") VALUES( ?, ?, ?, ?, 
?)", generatedSql);
+                    + charStart + "NAME" + charEnd + ") VALUES(?, ?, ?, ?, 
?)", generatedSql);
         } finally {
             entity.getDataMap().setQuotingSQLIdentifiers(false);
         }
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/access/translator/batch/UpdateBatchTranslatorIT.java
 
b/cayenne/src/test/java/org/apache/cayenne/access/translator/batch/UpdateBatchTranslatorIT.java
index 053a03d22..fcaccfd56 100644
--- 
a/cayenne/src/test/java/org/apache/cayenne/access/translator/batch/UpdateBatchTranslatorIT.java
+++ 
b/cayenne/src/test/java/org/apache/cayenne/access/translator/batch/UpdateBatchTranslatorIT.java
@@ -94,7 +94,7 @@ public class UpdateBatchTranslatorIT {
         String generatedSql = new 
UpdateBatchTranslator().translate(updateQuery, adapter).sql();
         assertNotNull(generatedSql);
 
-        assertEquals("UPDATE " + entity.getName() + " SET DESCRIPTION = ? 
WHERE ( LOCKING_TEST_ID = ? ) AND ( NAME IS NULL )",
+        assertEquals("UPDATE " + entity.getName() + " SET DESCRIPTION = ? 
WHERE (LOCKING_TEST_ID = ?) AND (NAME IS NULL)",
                 generatedSql);
     }
 
@@ -145,8 +145,8 @@ public class UpdateBatchTranslatorIT {
             String charStart = unitAdapter.getIdentifiersStartQuote();
             String charEnd = unitAdapter.getIdentifiersEndQuote();
             assertEquals("UPDATE " + charStart + entity.getName() + charEnd + 
" SET " + charStart + "DESCRIPTION"
-                    + charEnd + " = ? WHERE ( " + charStart + 
"LOCKING_TEST_ID" + charEnd + " = ? ) AND ( " + charStart
-                    + "NAME" + charEnd + " IS NULL )", generatedSql);
+                    + charEnd + " = ? WHERE (" + charStart + "LOCKING_TEST_ID" 
+ charEnd + " = ?) AND (" + charStart
+                    + "NAME" + charEnd + " IS NULL)", generatedSql);
 
         } finally {
             entity.getDataMap().setQuotingSQLIdentifiers(false);
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorExistExpressionIT.java
 
b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorExistExpressionIT.java
index aaf3d9efc..fcea075a0 100644
--- 
a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorExistExpressionIT.java
+++ 
b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorExistExpressionIT.java
@@ -113,7 +113,7 @@ public class QualifierTranslatorExistExpressionIT {
 
         assertSQL(" EXISTS (" +
                 "SELECT t1.PAINTING_ID FROM PAINTING t1 " +
-                "WHERE ( t1.PAINTING_TITLE IS NOT NULL ) AND ( t1.ARTIST_ID = 
t0.ARTIST_ID )" +
+                "WHERE (t1.PAINTING_TITLE IS NOT NULL) AND (t1.ARTIST_ID = 
t0.ARTIST_ID)" +
                 ")", node);
     }
 
@@ -134,7 +134,7 @@ public class QualifierTranslatorExistExpressionIT {
 
         assertSQL(" EXISTS (" +
                 "SELECT t1.PAINTING_ID FROM PAINTING t1 " +
-                "WHERE ( t1.GALLERY_ID IS NOT NULL ) AND ( t1.ARTIST_ID = 
t0.ARTIST_ID )" +
+                "WHERE (t1.GALLERY_ID IS NOT NULL) AND (t1.ARTIST_ID = 
t0.ARTIST_ID)" +
                 ")", node);
     }
 
@@ -157,7 +157,7 @@ public class QualifierTranslatorExistExpressionIT {
                 "SELECT DISTINCT t1.ARTIST_ID, t1.GROUP_ID FROM ARTIST_GROUP 
t1 " +
                 "JOIN ARTGROUP t2 ON t1.GROUP_ID = t2.GROUP_ID " +
                 "JOIN ARTGROUP t3 ON t2.GROUP_ID = t3.PARENT_GROUP_ID " +
-                "WHERE ( t3.GROUP_ID IS NOT NULL ) AND ( t1.ARTIST_ID = 
t0.ARTIST_ID )" +
+                "WHERE (t3.GROUP_ID IS NOT NULL) AND (t1.ARTIST_ID = 
t0.ARTIST_ID)" +
                 ")", node);
     }
 
@@ -178,7 +178,7 @@ public class QualifierTranslatorExistExpressionIT {
 
         assertSQL(" EXISTS (" +
                 "SELECT t1.PAINTING_ID FROM PAINTING t1 " +
-                "WHERE ( t1.PAINTING_TITLE = 'test' ) AND ( t1.ARTIST_ID = 
t0.ARTIST_ID )" +
+                "WHERE (t1.PAINTING_TITLE = 'test') AND (t1.ARTIST_ID = 
t0.ARTIST_ID)" +
                 ")", node);
     }
 
@@ -200,8 +200,8 @@ public class QualifierTranslatorExistExpressionIT {
 
         assertSQL(" EXISTS (" +
                 "SELECT t1.PAINTING_ID FROM PAINTING t1 " +
-                "WHERE ( ( t1.PAINTING_TITLE = 'test' ) OR ( t1.PAINTING_TITLE 
= 'test2' ) ) " +
-                        "AND ( t1.ARTIST_ID = t0.ARTIST_ID )" +
+                "WHERE ((t1.PAINTING_TITLE = 'test') OR (t1.PAINTING_TITLE = 
'test2')) " +
+                        "AND (t1.ARTIST_ID = t0.ARTIST_ID)" +
                 ")", node);
     }
 
@@ -222,8 +222,8 @@ public class QualifierTranslatorExistExpressionIT {
 
         assertSQL(" EXISTS (" +
                 "SELECT t1.PAINTING_ID FROM PAINTING t1 " +
-                "WHERE ( ( t1.PAINTING_TITLE = 'test' ) OR ( t1.PAINTING_TITLE 
= 'test2' ) ) " +
-                "AND ( t1.ARTIST_ID = t0.ARTIST_ID )" +
+                "WHERE ((t1.PAINTING_TITLE = 'test') OR (t1.PAINTING_TITLE = 
'test2')) " +
+                "AND (t1.ARTIST_ID = t0.ARTIST_ID)" +
                 ")", node);
     }
 
@@ -245,13 +245,13 @@ public class QualifierTranslatorExistExpressionIT {
 
         assertSQL(" EXISTS (" +
                     "SELECT t1.PAINTING_ID FROM PAINTING t1 " +
-                    "WHERE ( ( t1.PAINTING_TITLE = 'test' ) OR ( 
t1.PAINTING_TITLE = 'test2' ) ) " +
-                            "AND ( t1.ARTIST_ID = t0.ARTIST_ID )" +
+                    "WHERE ((t1.PAINTING_TITLE = 'test') OR (t1.PAINTING_TITLE 
= 'test2')) " +
+                            "AND (t1.ARTIST_ID = t0.ARTIST_ID)" +
                 ") " +
                 "AND EXISTS (" +
                     "SELECT t2.ARTIST_ID, t2.GROUP_ID FROM ARTIST_GROUP t2 " +
                     "JOIN ARTGROUP t3 ON t2.GROUP_ID = t3.GROUP_ID " +
-                    "WHERE ( t3.NAME = 'test' ) AND ( t2.ARTIST_ID = 
t0.ARTIST_ID ))", node);
+                    "WHERE (t3.NAME = 'test') AND (t2.ARTIST_ID = 
t0.ARTIST_ID))", node);
     }
 
     @Test
@@ -272,19 +272,19 @@ public class QualifierTranslatorExistExpressionIT {
 
         assertSQL(" EXISTS (" +
                     "SELECT t1.PAINTING_ID FROM PAINTING t1 " +
-                    "WHERE ( t1.PAINTING_TITLE = 'test' ) AND ( t1.ARTIST_ID = 
t0.ARTIST_ID )" +
+                    "WHERE (t1.PAINTING_TITLE = 'test') AND (t1.ARTIST_ID = 
t0.ARTIST_ID)" +
                 ") " +
-                "AND ( " +
+                "AND (" +
                     "EXISTS (" +
                         "SELECT t2.ARTIST_ID, t2.GROUP_ID FROM ARTIST_GROUP t2 
" +
                         "JOIN ARTGROUP t3 ON t2.GROUP_ID = t3.GROUP_ID " +
-                        "WHERE ( t3.NAME = 'test' ) AND ( t2.ARTIST_ID = 
t0.ARTIST_ID )" +
+                        "WHERE (t3.NAME = 'test') AND (t2.ARTIST_ID = 
t0.ARTIST_ID)" +
                     ") " +
                     "OR " +
                     "EXISTS (" +
                         "SELECT t4.PAINTING_ID FROM PAINTING t4 " +
-                        "WHERE ( t4.PAINTING_TITLE = 'test2' ) AND ( 
t4.ARTIST_ID = t0.ARTIST_ID )" +
-                    ") " +
+                        "WHERE (t4.PAINTING_TITLE = 'test2') AND (t4.ARTIST_ID 
= t0.ARTIST_ID)" +
+                    ")" +
                 ")", node);
     }
 
@@ -305,12 +305,12 @@ public class QualifierTranslatorExistExpressionIT {
 
         assertSQL(" EXISTS (" +
                     "SELECT t1.PAINTING_ID FROM PAINTING t1 " +
-                    "WHERE LENGTH( t1.PAINTING_TITLE ) IN ( 1, 2, 3) AND ( 
t1.ARTIST_ID = t0.ARTIST_ID )" +
+                    "WHERE LENGTH(t1.PAINTING_TITLE) IN (1, 2, 3) AND 
(t1.ARTIST_ID = t0.ARTIST_ID)" +
                 ") OR " +
                 "EXISTS (" +
                     "SELECT t2.ARTIST_ID, t2.GROUP_ID FROM ARTIST_GROUP t2 " +
                     "JOIN ARTGROUP t3 ON t2.GROUP_ID = t3.GROUP_ID " +
-                    "WHERE ( LENGTH( t3.NAME ) < 10 ) AND ( t2.ARTIST_ID = 
t0.ARTIST_ID )" +
+                    "WHERE (LENGTH(t3.NAME) < 10) AND (t2.ARTIST_ID = 
t0.ARTIST_ID)" +
                 ")", node);
     }
 
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorIT.java
 
b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorIT.java
index 3159a6d14..c833b979c 100644
--- 
a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorIT.java
+++ 
b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorIT.java
@@ -73,7 +73,7 @@ public class QualifierTranslatorIT {
         SQLGenerationVisitor visitor = new SQLGenerationVisitor(new 
DefaultSQLAppendable(null));
         node.visit(visitor);
 
-        assertEquals(" ( ( ( t0.F_KEY1 = 'PK1' ) AND ( t0.F_KEY2 = 'PK2' ) ) 
AND t0.NAME LIKE 'test%' ) AND t0.NAME LIKE '%a%'", visitor.getSQLString());
+        assertEquals(" (((t0.F_KEY1 = 'PK1') AND (t0.F_KEY2 = 'PK2')) AND 
t0.NAME LIKE 'test%') AND t0.NAME LIKE '%a%'", visitor.getSQLString());
     }
 
     @Test
@@ -98,7 +98,7 @@ public class QualifierTranslatorIT {
         SQLGenerationVisitor visitor = new SQLGenerationVisitor(new 
DefaultSQLAppendable(null));
         node.visit(visitor);
 
-        assertEquals(" ( ( t0.F_KEY1 = 'PK1' ) AND ( t0.F_KEY2 = 'PK2' ) ) OR 
( ( t0.F_KEY1 = 'PK3' ) AND ( t0.F_KEY2 = 'PK4' ) )", visitor.getSQLString());
+        assertEquals(" ((t0.F_KEY1 = 'PK1') AND (t0.F_KEY2 = 'PK2')) OR 
((t0.F_KEY1 = 'PK3') AND (t0.F_KEY2 = 'PK4'))", visitor.getSQLString());
     }
 
     @Test
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorTest.java
 
b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorTest.java
index 625603b6e..8054ebce7 100644
--- 
a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorTest.java
+++ 
b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorTest.java
@@ -485,7 +485,7 @@ public class QualifierTranslatorTest {
 
         SQLGenerationVisitor visitor = new SQLGenerationVisitor(new 
DefaultSQLAppendable(null));
         and.visit(visitor);
-        assertEquals(" ( t0.a < 2 ) AND t0.b IN ( 5, 6) AND ( t0.b = 7 )", 
visitor.getSQLString());
+        assertEquals(" (t0.a < 2) AND t0.b IN (5, 6) AND (t0.b = 7)", 
visitor.getSQLString());
     }
 
     @Test

Reply via email to