From 0fc3ffefecb30eea778e7e9f5d384553e948627d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Thu, 9 Sep 2010 15:32:06 +0000 Subject: [PATCH] #633136 : fixed path quoting issues --- .../com/mysema/query/types/path/NullExpr.java | 12 +++++++-- .../com/mysema/query/sql/Configuration.java | 2 +- .../com/mysema/query/sql/SQLSerializer.java | 19 ++++++++----- .../com/mysema/query/sql/SQLTemplates.java | 27 ++----------------- .../query/sql/ddl/CreateTableClause.java | 6 ++--- .../mysema/query/sql/ddl/DropTableClause.java | 2 +- .../query/sql/ddl/ForeignKeyBuilder.java | 4 +-- .../java/com/mysema/query/SelectBaseTest.java | 2 +- .../mysema/query/_mysql/SelectMySQLTest.java | 2 +- .../mysema/query/sql/SQLTemplatesTest.java | 10 +++++++ .../com/mysema/query/sql/TemplatesTest.java | 2 +- 11 files changed, 45 insertions(+), 43 deletions(-) diff --git a/querydsl-core/src/main/java/com/mysema/query/types/path/NullExpr.java b/querydsl-core/src/main/java/com/mysema/query/types/path/NullExpr.java index 10768cf41..ee2b2fdc2 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/path/NullExpr.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/path/NullExpr.java @@ -5,19 +5,27 @@ */ package com.mysema.query.types.path; +import java.util.Collections; + +import com.mysema.query.types.Expr; +import com.mysema.query.types.TemplateFactory; +import com.mysema.query.types.custom.CSimple; + /** + * NullExpr defines a general null expression + * * @author tiwe * * @param */ -public class NullExpr extends PSimple{ +public class NullExpr extends CSimple{ public static final NullExpr DEFAULT = new NullExpr(Object.class); private static final long serialVersionUID = -5311968198973316411L; public NullExpr(Class type) { - super(type, "null"); + super(type,TemplateFactory.DEFAULT.create("null"), Collections.>emptyList()); } } diff --git a/querydsl-sql/src/main/java/com/mysema/query/sql/Configuration.java b/querydsl-sql/src/main/java/com/mysema/query/sql/Configuration.java index 712cbc212..16aee99e3 100644 --- a/querydsl-sql/src/main/java/com/mysema/query/sql/Configuration.java +++ b/querydsl-sql/src/main/java/com/mysema/query/sql/Configuration.java @@ -22,7 +22,7 @@ import com.mysema.query.types.Path; */ public class Configuration { - public static final Configuration DEFAULT = new Configuration(new SQLTemplates()); + public static final Configuration DEFAULT = new Configuration(new SQLTemplates("\"",false)); private final JDBCTypeMapping jdbcTypeMapping = new JDBCTypeMapping(); diff --git a/querydsl-sql/src/main/java/com/mysema/query/sql/SQLSerializer.java b/querydsl-sql/src/main/java/com/mysema/query/sql/SQLSerializer.java index a7faa1d7a..d36db8491 100644 --- a/querydsl-sql/src/main/java/com/mysema/query/sql/SQLSerializer.java +++ b/querydsl-sql/src/main/java/com/mysema/query/sql/SQLSerializer.java @@ -88,12 +88,12 @@ public class SQLSerializer extends SerializerBase { private void appendAsColumnName(Path path){ String column = path.getMetadata().getExpression().toString(); - append(templates.quoteColumnName(column)); + append(templates.quoteIdentifier(column)); } private void appendAsTableName(Path path){ String table = path.getAnnotatedElement().getAnnotation(Table.class).value(); - append(templates.quoteTableName(table)); + append(templates.quoteIdentifier(table)); } public List getConstants(){ @@ -480,14 +480,21 @@ public class SQLSerializer extends SerializerBase { if (dml){ if (path.equals(entity)){ appendAsTableName(path); + return null; }else if (entity.equals(path.getMetadata().getParent()) && skipParent){ appendAsColumnName(path); - }else{ - super.visit(path, context); + return null; } - }else{ - super.visit(path, context); } + if (path.getMetadata().getPathType() == PathType.DELEGATE){ + handle(path.getMetadata().getExpression()); + return null; + + }else if (path.getMetadata().getParent() != null){ + visit(path.getMetadata().getParent(), context); + append("."); + } + append(templates.quoteIdentifier(path.getMetadata().getExpression().toString())); return null; } diff --git a/querydsl-sql/src/main/java/com/mysema/query/sql/SQLTemplates.java b/querydsl-sql/src/main/java/com/mysema/query/sql/SQLTemplates.java index 5ad1c690d..4b6e720c5 100644 --- a/querydsl-sql/src/main/java/com/mysema/query/sql/SQLTemplates.java +++ b/querydsl-sql/src/main/java/com/mysema/query/sql/SQLTemplates.java @@ -6,17 +6,11 @@ package com.mysema.query.sql; import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; -import java.util.HashSet; import java.util.Locale; import java.util.Map; -import java.util.Set; import java.util.regex.Pattern; -import javax.annotation.Nullable; - import com.mysema.commons.lang.Assert; import com.mysema.query.JoinType; import com.mysema.query.QueryException; @@ -41,7 +35,7 @@ public class SQLTemplates extends Templates { public static final Operator UNION = new OperatorImpl("UNION"); - public static final SQLTemplates DEFAULT = new SQLTemplates(); + public static final SQLTemplates DEFAULT = new SQLTemplates("\"",false); private static final Pattern IDENTIFIER_CHARS = Pattern.compile("[a-zA-Z0-9_\\-]+"); @@ -118,10 +112,6 @@ public class SQLTemplates extends Templates { private String values = "\nvalues "; private String where = "\nwhere "; - - protected SQLTemplates() { - this("\"", false); - } protected SQLTemplates(String quoteStr, boolean useQuotes) { this.quoteStr = Assert.notNull(quoteStr, "quoteStr"); @@ -161,11 +151,6 @@ public class SQLTemplates extends Templates { add(Ops.SUBSTR_1ARG, "substr({0},{1}+1)"); add(Ops.SUBSTR_2ARGS, "substr({0},{1}+1,{2})"); - if (quoteStr != null){ - add(PathType.PROPERTY, "{0}." + quoteStr + "{1s}" + quoteStr); - add(PathType.VARIABLE, quoteStr + "{0s}" + quoteStr); - } - add(CAST, "cast({0} as {1s})"); add(UNION, "{0}\nunion\n{1}"); @@ -361,16 +346,8 @@ public class SQLTemplates extends Templates { } return this; } - - public final String quoteColumnName(String column){ - return quoteIdentifier(column); - } - - public final String quoteTableName(String table){ - return quoteIdentifier(table); - } - protected String quoteIdentifier(String identifier){ + public String quoteIdentifier(String identifier){ if (useQuotes || requiresQuotes(identifier)){ return quoteStr + identifier + quoteStr; }else{ diff --git a/querydsl-sql/src/main/java/com/mysema/query/sql/ddl/CreateTableClause.java b/querydsl-sql/src/main/java/com/mysema/query/sql/ddl/CreateTableClause.java index b2b35fe5e..e468a845e 100644 --- a/querydsl-sql/src/main/java/com/mysema/query/sql/ddl/CreateTableClause.java +++ b/querydsl-sql/src/main/java/com/mysema/query/sql/ddl/CreateTableClause.java @@ -52,7 +52,7 @@ public class CreateTableClause { public CreateTableClause(Connection conn, SQLTemplates templates, String table) { this.connection = conn; this.templates = templates; - this.table = templates.quoteTableName(table); + this.table = templates.quoteIdentifier(table); } /** @@ -65,7 +65,7 @@ public class CreateTableClause { public CreateTableClause column(String name, Class type) { Assert.notNull(name,"name"); Assert.notNull(type,"type"); - columns.add(new ColumnData(templates.quoteColumnName(name), templates.getTypeForClass(type))); + columns.add(new ColumnData(templates.quoteIdentifier(name), templates.getTypeForClass(type))); return this; } @@ -115,7 +115,7 @@ public class CreateTableClause { Assert.notNull(name,"name"); Assert.notEmpty(columns,"columns"); for (int i = 0; i < columns.length; i++){ - columns[i] = templates.quoteColumnName(columns[i]); + columns[i] = templates.quoteIdentifier(columns[i]); } primaryKey = new PrimaryKeyData(name, columns); return this; diff --git a/querydsl-sql/src/main/java/com/mysema/query/sql/ddl/DropTableClause.java b/querydsl-sql/src/main/java/com/mysema/query/sql/ddl/DropTableClause.java index f4a8ce57f..ed9a9735b 100644 --- a/querydsl-sql/src/main/java/com/mysema/query/sql/ddl/DropTableClause.java +++ b/querydsl-sql/src/main/java/com/mysema/query/sql/ddl/DropTableClause.java @@ -28,7 +28,7 @@ public class DropTableClause { public DropTableClause(Connection conn, SQLTemplates templates, String table) { this.connection = conn; - this.table = templates.quoteTableName(table); + this.table = templates.quoteIdentifier(table); } @SuppressWarnings("SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE") diff --git a/querydsl-sql/src/main/java/com/mysema/query/sql/ddl/ForeignKeyBuilder.java b/querydsl-sql/src/main/java/com/mysema/query/sql/ddl/ForeignKeyBuilder.java index f20704311..3558e7ff2 100644 --- a/querydsl-sql/src/main/java/com/mysema/query/sql/ddl/ForeignKeyBuilder.java +++ b/querydsl-sql/src/main/java/com/mysema/query/sql/ddl/ForeignKeyBuilder.java @@ -40,8 +40,8 @@ public class ForeignKeyBuilder { ForeignKeyData foreignKey = new ForeignKeyData(name, table); for (int i = 0; i < parentColumns.length; i++){ foreignKey.add( - templates.quoteColumnName(foreignColumns[i]), - templates.quoteColumnName(parentColumns[i])); + templates.quoteIdentifier(foreignColumns[i]), + templates.quoteIdentifier(parentColumns[i])); } foreignKeys.add(foreignKey); return clause; diff --git a/querydsl-sql/src/test/java/com/mysema/query/SelectBaseTest.java b/querydsl-sql/src/test/java/com/mysema/query/SelectBaseTest.java index dcb58c940..6f8d32fc5 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/SelectBaseTest.java +++ b/querydsl-sql/src/test/java/com/mysema/query/SelectBaseTest.java @@ -606,7 +606,7 @@ public abstract class SelectBaseTest extends AbstractBaseTest{ @Test public void aliasQuotes() { - expectedQuery = "select firstname as \"First Name\" from EMPLOYEE2 e"; + expectedQuery = "select e.FIRSTNAME as \"First Name\" from EMPLOYEE2 e"; query().from(employee).list(employee.firstname.as("First Name")); } diff --git a/querydsl-sql/src/test/java/com/mysema/query/_mysql/SelectMySQLTest.java b/querydsl-sql/src/test/java/com/mysema/query/_mysql/SelectMySQLTest.java index 6e07df8a1..e1c0bf1fc 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/_mysql/SelectMySQLTest.java +++ b/querydsl-sql/src/test/java/com/mysema/query/_mysql/SelectMySQLTest.java @@ -37,7 +37,7 @@ public class SelectMySQLTest extends SelectBaseTest { @Test @Override public void aliasQuotes() { - expectedQuery = "select firstname as `First Name` from EMPLOYEE2 e"; + expectedQuery = "select e.FIRSTNAME as `First Name` from EMPLOYEE2 e"; query().from(employee).list(employee.firstname.as("First Name")); } diff --git a/querydsl-sql/src/test/java/com/mysema/query/sql/SQLTemplatesTest.java b/querydsl-sql/src/test/java/com/mysema/query/sql/SQLTemplatesTest.java index c37fcfb79..3def6a1f9 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/sql/SQLTemplatesTest.java +++ b/querydsl-sql/src/test/java/com/mysema/query/sql/SQLTemplatesTest.java @@ -8,6 +8,8 @@ package com.mysema.query.sql; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import java.util.regex.Pattern; + import org.junit.Test; import com.mysema.query.types.Template; @@ -26,4 +28,12 @@ public class SQLTemplatesTest { serializer.handle(CSimple.create(Object.class, template, ENumberConst.create(5))); assertEquals("fetch first 5 rows only", serializer.toString()); } + + @Test + public void quote(){ + Pattern pattern = Pattern.compile("[a-zA-Z0-9_\\-]+"); + assertTrue(pattern.matcher("a1").matches()); + assertTrue(pattern.matcher("a").matches()); + } + } diff --git a/querydsl-sql/src/test/java/com/mysema/query/sql/TemplatesTest.java b/querydsl-sql/src/test/java/com/mysema/query/sql/TemplatesTest.java index b2fb7dfbf..ed3475032 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/sql/TemplatesTest.java +++ b/querydsl-sql/src/test/java/com/mysema/query/sql/TemplatesTest.java @@ -17,7 +17,7 @@ public class TemplatesTest { new MySQLTemplates(); new OracleTemplates(); new PostgresTemplates(); - new SQLTemplates(); + new SQLTemplates("\"",false); new SQLServerTemplates(); }