Skip to content

Commit 6d72bec

Browse files
committed
ID列名に引用符が必要かどうかのパラメータを引数に追加
PostgreSQL でシーケンスを取得する際に、列名が引用符付きで作成されたテーブルか どうかで `pg_catalog.pg_get_serial_sequence` に渡すパラメータが変わる。 そのため、列名に引用符が必要かどうかを生成メソッドが知る必要がある。
1 parent 81c6766 commit 6d72bec

File tree

10 files changed

+49
-21
lines changed

10 files changed

+49
-21
lines changed

src/main/java/org/seasar/doma/jdbc/dialect/Dialect.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,13 +159,16 @@ boolean supportsSelectForUpdate(SelectForUpdateType type,
159159
* IDENTITYカラムの名前
160160
* @param isQuoteRequired
161161
* 引用符が必要かどうか
162+
* @param isIdColumnQuoteRequired
163+
* ID列に引用符が必要かどうか
162164
* @return IDENTITYを取得するためのSQL
163165
* @throws DomaNullPointerException
164166
* {@code tableName} と {@code columnName} のいずれかが {@code null}
165167
* の場合
166168
*/
167169
Sql<?> getIdentitySelectSql(String catalogName, String schemaName,
168-
String tableName, String columnName, boolean isQuoteRequired);
170+
String tableName, String columnName, boolean isQuoteRequired,
171+
boolean isIdColumnQuoteRequired);
169172

170173
/**
171174
* データベースのIDENTITYを予約するためのSQLを返します。
@@ -182,6 +185,8 @@ Sql<?> getIdentitySelectSql(String catalogName, String schemaName,
182185
* IDENTITYカラムの名前
183186
* @param isQuoteRequired
184187
* 引用符が必要かどうか
188+
* @param isIdColumnQuoteRequired
189+
* ID列に引用符が必要かどうか
185190
* @param reservationSize
186191
* 予約サイズ
187192
* @return IDENTITYを予約するためのSQL
@@ -191,7 +196,7 @@ Sql<?> getIdentitySelectSql(String catalogName, String schemaName,
191196
*/
192197
Sql<?> getIdentityReservationSql(String catalogName, String schemaName,
193198
String tableName, String columnName, boolean isQuoteRequired,
194-
int reservationSize);
199+
boolean isIdColumnQuoteRequired, int reservationSize);
195200

196201
/**
197202
* シーケンスの次の値を取得するためのSQLを返します。

src/main/java/org/seasar/doma/jdbc/dialect/H212126Dialect.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ public boolean includesIdentityColumn() {
133133
@Override
134134
public PreparedSql getIdentitySelectSql(String catalogName,
135135
String schemaName, String tableName, String columnName,
136-
boolean isQuoteRequired) {
136+
boolean isQuoteRequired, boolean isIdColumnQuoteRequired) {
137137
if (tableName == null) {
138138
throw new DomaNullPointerException("tableName");
139139
}

src/main/java/org/seasar/doma/jdbc/dialect/HsqldbDialect.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ public boolean includesIdentityColumn() {
132132
@Override
133133
public PreparedSql getIdentitySelectSql(String catalogName,
134134
String schemaName, String tableName, String columnName,
135-
boolean isQuoteRequired) {
135+
boolean isQuoteRequired, boolean isIdColumnQuoteRequired) {
136136
if (tableName == null) {
137137
throw new DomaNullPointerException("tableName");
138138
}

src/main/java/org/seasar/doma/jdbc/dialect/PostgresDialect.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -164,15 +164,16 @@ public boolean isUniqueConstraintViolated(SQLException sqlException) {
164164
@Override
165165
public PreparedSql getIdentitySelectSql(String catalogName,
166166
String schemaName, String tableName, String columnName,
167-
boolean isQuoteRequired) {
167+
boolean isQuoteRequired, boolean isIdColumnQuoteRequired) {
168168
if (tableName == null) {
169169
throw new DomaNullPointerException("tableName");
170170
}
171171
if (columnName == null) {
172172
throw new DomaNullPointerException("columnName");
173173
}
174174
String identitySeqFuncExpr = createIdentitySequenceFunctionExpression(
175-
catalogName, schemaName, tableName, columnName, isQuoteRequired);
175+
catalogName, schemaName, tableName, columnName,
176+
isQuoteRequired, isIdColumnQuoteRequired);
176177
StringBuilder buf = new StringBuilder(64);
177178
buf.append("select currval(");
178179
buf.append(identitySeqFuncExpr);
@@ -185,15 +186,17 @@ public PreparedSql getIdentitySelectSql(String catalogName,
185186
@Override
186187
public Sql<?> getIdentityReservationSql(String catalogName,
187188
String schemaName, String tableName, String columnName,
188-
boolean isQuoteRequired, int reservationSize) {
189+
boolean isQuoteRequired, boolean isIdColumnQuoteRequired,
190+
int reservationSize) {
189191
if (tableName == null) {
190192
throw new DomaNullPointerException("tableName");
191193
}
192194
if (columnName == null) {
193195
throw new DomaNullPointerException("columnName");
194196
}
195197
String identitySeqFuncExpr = createIdentitySequenceFunctionExpression(
196-
catalogName, schemaName, tableName, columnName, isQuoteRequired);
198+
catalogName, schemaName, tableName, columnName,
199+
isQuoteRequired, isIdColumnQuoteRequired);
197200
StringBuilder buf = new StringBuilder(64);
198201
buf.append("select nextval(");
199202
buf.append(identitySeqFuncExpr);
@@ -207,11 +210,11 @@ public Sql<?> getIdentityReservationSql(String catalogName,
207210

208211
protected String createIdentitySequenceFunctionExpression(String catalogName,
209212
String schemaName, String tableName, String columnName,
210-
boolean isQuoteRequired) {
213+
boolean isQuoteRequired, boolean isIdColumnQuoteRequired) {
211214
String qualifiedTableName = DatabaseObjectUtil.getQualifiedName(
212215
isQuoteRequired ? this::applyQuote : Function.identity(),
213216
catalogName, schemaName, tableName);
214-
String colName = isQuoteRequired ? columnName : columnName.toLowerCase();
217+
String colName = isIdColumnQuoteRequired ? columnName : columnName.toLowerCase();
215218
return "pg_catalog.pg_get_serial_sequence('" + qualifiedTableName + "', '" + colName + "')";
216219
}
217220

src/main/java/org/seasar/doma/jdbc/dialect/SqliteDialect.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ public boolean includesIdentityColumn() {
129129
@Override
130130
public PreparedSql getIdentitySelectSql(String catalogName,
131131
String schemaName, String tableName, String columnName,
132-
boolean isQuoteRequired) {
132+
boolean isQuoteRequired, boolean isIdColumnQuoteRequired) {
133133
if (tableName == null) {
134134
throw new DomaNullPointerException("tableName");
135135
}

src/main/java/org/seasar/doma/jdbc/dialect/StandardDialect.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -442,15 +442,16 @@ public JdbcType<ResultSet> getResultSetType() {
442442

443443
@Override
444444
public Sql<?> getIdentitySelectSql(String catalogName, String schemaName,
445-
String tableName, String columnName, boolean isQuoteRequired) {
445+
String tableName, String columnName, boolean isQuoteRequired,
446+
boolean isIdColumnQuoteRequired) {
446447
throw new JdbcUnsupportedOperationException(getClass().getName(),
447448
"getIdentitySelectSql");
448449
}
449450

450451
@Override
451452
public Sql<?> getIdentityReservationSql(String catalogName,
452453
String schemaName, String tableName, String columnName,
453-
boolean isQuoteRequired, int reservationSize) {
454+
boolean isQuoteRequired, boolean isIdColumnQuoteRequired, int reservationSize) {
454455
throw new JdbcUnsupportedOperationException(getClass().getName(),
455456
"getIdentityReservationSql");
456457
}

src/main/java/org/seasar/doma/jdbc/id/BuiltinIdentityIdGenerator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,8 @@ protected long getGeneratedValue(IdGenerationConfig config) {
118118
.getColumnName(naming::apply);
119119
Sql<?> sql = config.getDialect().getIdentitySelectSql(catalogName,
120120
schemaName, tableName, idColumnName,
121-
entityType.isQuoteRequired());
121+
entityType.isQuoteRequired(),
122+
entityType.getGeneratedIdPropertyType().isQuoteRequired());
122123
return getGeneratedValue(config, sql);
123124
}
124125

src/main/java/org/seasar/doma/jdbc/id/ReservedIdProvider.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,11 @@ protected Sql<?> createSql() {
122122
String idColumnName = entityType.getGeneratedIdPropertyType()
123123
.getColumnName(naming::apply);
124124
boolean isQuoteRequired = entityType.isQuoteRequired();
125+
boolean isIdColumnQuoteRequired = entityType.getGeneratedIdPropertyType()
126+
.isQuoteRequired();
125127
return dialect.getIdentityReservationSql(catalogName, schemaName,
126-
tableName, idColumnName, isQuoteRequired, reservationSize);
128+
tableName, idColumnName, isQuoteRequired,
129+
isIdColumnQuoteRequired, reservationSize);
127130
}
128131

129132
protected void setupOptions(PreparedStatement preparedStatement)

src/test/java/org/seasar/doma/jdbc/dialect/PostgresDialectTest.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,35 @@
2626
*/
2727
public class PostgresDialectTest extends TestCase {
2828

29-
public void testGetIdentitySelectSql_quoteNotRequired() throws Exception {
29+
public void testGetIdentitySelectSql_quoteNotRequired_idQuoteNotRequired() throws Exception {
3030
PostgresDialect dialect = new PostgresDialect();
3131
PreparedSql sql = dialect.getIdentitySelectSql("aaa", "bbb", "ccc",
32-
"ddd", false);
32+
"DDD", false, false);
3333
assertEquals("select currval(pg_catalog.pg_get_serial_sequence('aaa.bbb.ccc', 'ddd'))",
3434
sql.getRawSql());
3535
}
3636

37-
public void testGetIdentitySelectSql_quoteRequired() throws Exception {
37+
public void testGetIdentitySelectSql_quoteRequired_idQuoteNotRequired() throws Exception {
3838
PostgresDialect dialect = new PostgresDialect();
3939
PreparedSql sql = dialect.getIdentitySelectSql("aaa", "bbb", "ccc",
40-
"ddd", true);
40+
"DDD", true, false);
4141
assertEquals("select currval(pg_catalog.pg_get_serial_sequence('\"aaa\".\"bbb\".\"ccc\"', 'ddd'))",
4242
sql.getRawSql());
4343
}
4444

45+
public void testGetIdentitySelectSql_quoteNotRequired_idQuoteRequired() throws Exception {
46+
PostgresDialect dialect = new PostgresDialect();
47+
PreparedSql sql = dialect.getIdentitySelectSql("aaa", "bbb", "ccc",
48+
"DDD", false, true);
49+
assertEquals("select currval(pg_catalog.pg_get_serial_sequence('aaa.bbb.ccc', 'DDD'))",
50+
sql.getRawSql());
51+
}
52+
53+
public void testGetIdentitySelectSql_quoteRequired_idQuoteRequired() throws Exception {
54+
PostgresDialect dialect = new PostgresDialect();
55+
PreparedSql sql = dialect.getIdentitySelectSql("aaa", "bbb", "ccc",
56+
"DDD", true, true);
57+
assertEquals("select currval(pg_catalog.pg_get_serial_sequence('\"aaa\".\"bbb\".\"ccc\"', 'DDD'))",
58+
sql.getRawSql());
59+
}
4560
}

src/test/java/org/seasar/doma/jdbc/id/BuiltinIdentityIdGeneratorTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public void test_identitySelectSql() throws Exception {
4444
Long value = identityIdGenerator.generatePostInsert(idGenerationConfig,
4545
config.dataSource.connection.preparedStatement);
4646
assertEquals(new Long(11), value);
47-
assertEquals("select currval(pg_catalog.pg_get_serial_sequence('\"CATA\".\"EMP\"', 'ID'))",
47+
assertEquals("select currval(pg_catalog.pg_get_serial_sequence('\"CATA\".\"EMP\"', 'id'))",
4848
config.dataSource.connection.preparedStatement.sql);
4949
}
5050

@@ -64,7 +64,7 @@ public void test_identityReservationSql() throws Exception {
6464
Long value = identityIdGenerator.generatePreInsert(idGenerationConfig);
6565
assertEquals(new Long(11), value);
6666
assertEquals(
67-
"select nextval(pg_catalog.pg_get_serial_sequence('\"CATA\".\"EMP\"', 'ID')) from generate_series(1, 3)",
67+
"select nextval(pg_catalog.pg_get_serial_sequence('\"CATA\".\"EMP\"', 'id')) from generate_series(1, 3)",
6868
config.dataSource.connection.preparedStatement.sql);
6969
value = identityIdGenerator.generatePreInsert(idGenerationConfig);
7070
assertEquals(new Long(12), value);

0 commit comments

Comments
 (0)