Skip to content

Commit 81c6766

Browse files
committed
serialによるシーケンス名が一定長を超えると、エラーとなるので組み込み関数経由でシーケンス名を取得する
1 parent a320330 commit 81c6766

File tree

3 files changed

+19
-17
lines changed

3 files changed

+19
-17
lines changed

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

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -171,12 +171,12 @@ public PreparedSql getIdentitySelectSql(String catalogName,
171171
if (columnName == null) {
172172
throw new DomaNullPointerException("columnName");
173173
}
174-
String identityTableName = createIdentityTableName(catalogName,
175-
schemaName, tableName, columnName, isQuoteRequired);
174+
String identitySeqFuncExpr = createIdentitySequenceFunctionExpression(
175+
catalogName, schemaName, tableName, columnName, isQuoteRequired);
176176
StringBuilder buf = new StringBuilder(64);
177-
buf.append("select currval('");
178-
buf.append(identityTableName);
179-
buf.append("')");
177+
buf.append("select currval(");
178+
buf.append(identitySeqFuncExpr);
179+
buf.append(")");
180180
String rawSql = buf.toString();
181181
return new PreparedSql(SqlKind.SELECT, rawSql, rawSql, null,
182182
Collections.<InParameter<?>> emptyList(), SqlLogType.FORMATTED);
@@ -192,26 +192,27 @@ public Sql<?> getIdentityReservationSql(String catalogName,
192192
if (columnName == null) {
193193
throw new DomaNullPointerException("columnName");
194194
}
195-
String identityTableName = createIdentityTableName(catalogName,
196-
schemaName, tableName, columnName, isQuoteRequired);
195+
String identitySeqFuncExpr = createIdentitySequenceFunctionExpression(
196+
catalogName, schemaName, tableName, columnName, isQuoteRequired);
197197
StringBuilder buf = new StringBuilder(64);
198-
buf.append("select nextval('");
199-
buf.append(identityTableName);
200-
buf.append("') from generate_series(1, ");
198+
buf.append("select nextval(");
199+
buf.append(identitySeqFuncExpr);
200+
buf.append(") from generate_series(1, ");
201201
buf.append(reservationSize);
202202
buf.append(")");
203203
String rawSql = buf.toString();
204204
return new PreparedSql(SqlKind.SELECT, rawSql, rawSql, null,
205205
Collections.<InParameter<?>> emptyList(), SqlLogType.FORMATTED);
206206
}
207207

208-
protected String createIdentityTableName(String catalogName,
208+
protected String createIdentitySequenceFunctionExpression(String catalogName,
209209
String schemaName, String tableName, String columnName,
210210
boolean isQuoteRequired) {
211211
String qualifiedTableName = DatabaseObjectUtil.getQualifiedName(
212212
isQuoteRequired ? this::applyQuote : Function.identity(),
213-
catalogName, schemaName, tableName + "_" + columnName + "_seq");
214-
return qualifiedTableName;
213+
catalogName, schemaName, tableName);
214+
String colName = isQuoteRequired ? columnName : columnName.toLowerCase();
215+
return "pg_catalog.pg_get_serial_sequence('" + qualifiedTableName + "', '" + colName + "')";
215216
}
216217

217218
@Override

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,15 @@ public void testGetIdentitySelectSql_quoteNotRequired() throws Exception {
3030
PostgresDialect dialect = new PostgresDialect();
3131
PreparedSql sql = dialect.getIdentitySelectSql("aaa", "bbb", "ccc",
3232
"ddd", false);
33-
assertEquals("select currval('aaa.bbb.ccc_ddd_seq')", sql.getRawSql());
33+
assertEquals("select currval(pg_catalog.pg_get_serial_sequence('aaa.bbb.ccc', 'ddd'))",
34+
sql.getRawSql());
3435
}
3536

3637
public void testGetIdentitySelectSql_quoteRequired() throws Exception {
3738
PostgresDialect dialect = new PostgresDialect();
3839
PreparedSql sql = dialect.getIdentitySelectSql("aaa", "bbb", "ccc",
3940
"ddd", true);
40-
assertEquals("select currval('\"aaa\".\"bbb\".\"ccc_ddd_seq\"')",
41+
assertEquals("select currval(pg_catalog.pg_get_serial_sequence('\"aaa\".\"bbb\".\"ccc\"', 'ddd'))",
4142
sql.getRawSql());
4243
}
4344

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('\"CATA\".\"EMP_ID_seq\"')",
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('\"CATA\".\"EMP_ID_seq\"') 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)