Skip to content

Commit 66aff53

Browse files
authored
Enquote SQL identifiers (#77)
1 parent 6e26b16 commit 66aff53

File tree

6 files changed

+73
-3
lines changed

6 files changed

+73
-3
lines changed

codegen/src/main/java/org/seasar/doma/gradle/codegen/dialect/CodeGenDialect.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,12 @@ Map<String, String> getColumnCommentMap(
4444
String convertToDateLiteral(String value);
4545

4646
String convertToTimestampLiteral(String value);
47+
48+
/**
49+
* Enclose the name with quotation marks.
50+
*
51+
* @param name the name of a database object such as a table, a column, and so on
52+
* @return the name that is enclosed with quotation marks
53+
*/
54+
String applyQuote(String name);
4755
}

codegen/src/main/java/org/seasar/doma/gradle/codegen/dialect/Mssql2008CodeGenDialect.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@
1010

1111
public class Mssql2008CodeGenDialect extends StandardCodeGenDialect {
1212

13+
/** the quotation mark of the start */
14+
protected static final char OPEN_QUOTE = '[';
15+
16+
/** the quotation mark of the end */
17+
protected static final char CLOSE_QUOTE = ']';
18+
1319
public Mssql2008CodeGenDialect() {
1420
classNameMap.put("datetime", LocalDateTime.class.getName());
1521
classNameMap.put("datetime2", LocalDateTime.class.getName());
@@ -64,4 +70,9 @@ public String getMappedPropertyClassName(ColumnMeta columnMeta) {
6470
}
6571
return super.getMappedPropertyClassName(columnMeta);
6672
}
73+
74+
@Override
75+
public String applyQuote(String name) {
76+
return OPEN_QUOTE + name + CLOSE_QUOTE;
77+
}
6778
}

codegen/src/main/java/org/seasar/doma/gradle/codegen/dialect/MysqlCodeGenDialect.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@
1111

1212
public class MysqlCodeGenDialect extends StandardCodeGenDialect {
1313

14+
/** the quotation mark of the start */
15+
protected static final char OPEN_QUOTE = '`';
16+
17+
/** the quotation mark of the end */
18+
protected static final char CLOSE_QUOTE = '`';
19+
1420
public MysqlCodeGenDialect() {
1521
classNameMap.put("bool", Boolean.class.getName());
1622
classNameMap.put("boolean", Boolean.class.getName());
@@ -81,4 +87,9 @@ public boolean supportsIdentity() {
8187
public boolean supportsSequence() {
8288
return true;
8389
}
90+
91+
@Override
92+
public String applyQuote(String name) {
93+
return OPEN_QUOTE + name + CLOSE_QUOTE;
94+
}
8495
}

codegen/src/main/java/org/seasar/doma/gradle/codegen/dialect/StandardCodeGenDialect.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@
2525

2626
public class StandardCodeGenDialect implements CodeGenDialect {
2727

28+
/** the quotation mark of the start */
29+
protected static final char OPEN_QUOTE = '"';
30+
31+
/** the quotation mark of the end */
32+
protected static final char CLOSE_QUOTE = '"';
33+
2834
protected final Map<String, String> classNameMap = new HashMap<String, String>();
2935

3036
protected final Map<Integer, String> fallbackClassNameMap = new HashMap<Integer, String>();
@@ -124,8 +130,10 @@ public boolean isAutoIncrement(
124130
if (columnName == null) {
125131
throw new CodeGenNullPointerException("columnName");
126132
}
127-
String fullTableName = TableUtil.getQualifiedTableName(catalogName, schemaName, tableName);
128-
String sql = "select " + columnName + " from " + fullTableName + " where 1 = 0";
133+
String fullTableName =
134+
TableUtil.getEnquoteQualifiedTableName(
135+
this::applyQuote, catalogName, schemaName, tableName);
136+
String sql = "select " + applyQuote(columnName) + " from " + fullTableName + " where 1 = 0";
129137
PreparedStatement preparedStatement = connection.prepareStatement(sql);
130138
try {
131139
ResultSet resultSet = preparedStatement.executeQuery();
@@ -220,4 +228,9 @@ public String convertToTimestampLiteral(String value) {
220228
}
221229
return "'" + value + "'";
222230
}
231+
232+
@Override
233+
public String applyQuote(String name) {
234+
return OPEN_QUOTE + name + CLOSE_QUOTE;
235+
}
223236
}

codegen/src/main/java/org/seasar/doma/gradle/codegen/util/TableUtil.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.seasar.doma.gradle.codegen.util;
22

3+
import java.util.function.Function;
4+
35
public final class TableUtil {
46

57
public static String getQualifiedTableName(
@@ -13,4 +15,16 @@ public static String getQualifiedTableName(
1315
}
1416
return buf.append(tableName).toString();
1517
}
18+
19+
public static String getEnquoteQualifiedTableName(
20+
Function<String, String> enquote, String catalogName, String schemaName, String tableName) {
21+
StringBuilder buf = new StringBuilder();
22+
if (catalogName != null && !catalogName.isEmpty()) {
23+
buf.append(enquote.apply(catalogName)).append(".");
24+
}
25+
if (schemaName != null && !schemaName.isEmpty()) {
26+
buf.append(enquote.apply(schemaName)).append(".");
27+
}
28+
return buf.append(enquote.apply(tableName)).toString();
29+
}
1630
}

codegen/src/test/java/org/seasar/doma/gradle/codegen/util/TableUtilTest.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,28 @@
22

33
import static org.junit.jupiter.api.Assertions.assertEquals;
44

5+
import java.util.function.Function;
56
import org.junit.jupiter.api.Test;
67

78
public class TableUtilTest {
89

910
@Test
10-
public void test() throws Exception {
11+
public void testGetQualifiedTableName() {
1112
assertEquals("aaa.bbb.ccc", TableUtil.getQualifiedTableName("aaa", "bbb", "ccc"));
1213
assertEquals("bbb.ccc", TableUtil.getQualifiedTableName(null, "bbb", "ccc"));
1314
assertEquals("aaa.ccc", TableUtil.getQualifiedTableName("aaa", null, "ccc"));
1415
assertEquals("ccc", TableUtil.getQualifiedTableName(null, null, "ccc"));
1516
}
17+
18+
@Test
19+
public void testGetEnquoteQualifiedTableName() {
20+
Function<String, String> enquote = name -> "[" + name + "]";
21+
assertEquals(
22+
"[aaa].[bbb].[ccc]", TableUtil.getEnquoteQualifiedTableName(enquote, "aaa", "bbb", "ccc"));
23+
assertEquals(
24+
"[bbb].[ccc]", TableUtil.getEnquoteQualifiedTableName(enquote, null, "bbb", "ccc"));
25+
assertEquals(
26+
"[aaa].[ccc]", TableUtil.getEnquoteQualifiedTableName(enquote, "aaa", null, "ccc"));
27+
assertEquals("[ccc]", TableUtil.getEnquoteQualifiedTableName(enquote, null, null, "ccc"));
28+
}
1629
}

0 commit comments

Comments
 (0)