提交 f9b296e2 authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Allow to specify names of generated columns in different case

上级 e25ccd30
......@@ -10,13 +10,13 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.h2.message.DbException;
import org.h2.result.Row;
import org.h2.table.Column;
import org.h2.table.Table;
import org.h2.tools.SimpleResultSet;
import org.h2.util.MathUtils;
import org.h2.util.New;
import org.h2.util.StringUtils;
import org.h2.value.DataType;
/**
......@@ -135,13 +135,13 @@ public final class GeneratedKeys {
int[] indices = (int[]) generatedKeysRequest;
Column[] columns = table.getColumns();
int cnt = columns.length;
this.allColumns.clear();
allColumns.clear();
for (int idx : indices) {
if (idx >= 1 && idx <= cnt) {
Column column = columns[idx - 1];
rs.addColumn(column.getName(), DataType.convertTypeToSQLType(column.getType()),
MathUtils.convertLongToInt(column.getPrecision()), column.getScale());
this.allColumns.add(column);
allColumns.add(column);
}
}
} else {
......@@ -150,15 +150,28 @@ public final class GeneratedKeys {
} else if (generatedKeysRequest instanceof String[]) {
if (table != null) {
String[] names = (String[]) generatedKeysRequest;
this.allColumns.clear();
allColumns.clear();
for (String name : names) {
try {
Column column = table.getColumn(name);
rs.addColumn(column.getName(), DataType.convertTypeToSQLType(column.getType()),
MathUtils.convertLongToInt(column.getPrecision()), column.getScale());
this.allColumns.add(column);
} catch (DbException e) {
Column column;
search: if (table.doesColumnExist(name)) {
column = table.getColumn(name);
} else {
name = StringUtils.toUpperEnglish(name);
if (table.doesColumnExist(name)) {
column = table.getColumn(name);
} else {
for (Column c : table.getColumns()) {
if (c.getName().equalsIgnoreCase(name)) {
column = c;
break search;
}
}
continue;
}
}
rs.addColumn(column.getName(), DataType.convertTypeToSQLType(column.getType()),
MathUtils.convertLongToInt(column.getPrecision()), column.getScale());
allColumns.add(column);
}
} else {
return rs;
......
......@@ -62,6 +62,7 @@ public class TestGetGeneratedKeys extends TestBase {
Connection conn = getConnection("getGeneratedKeys");
testBatchAndMergeInto(conn);
testCalledSequenses(conn);
testNameCase(conn);
testPrepareStatement_Execute(conn);
testPrepareStatement_ExecuteBatch(conn);
......@@ -228,6 +229,58 @@ public class TestGetGeneratedKeys extends TestBase {
stat.execute("DROP SEQUENCE SEQ");
}
/**
* Test method for case of letters in column names.
*
* @param conn
* connection
* @throws Exception
* on exception
*/
private void testNameCase(Connection conn) throws Exception {
Statement stat = conn.createStatement();
stat.execute("CREATE TABLE TEST (ID BIGINT PRIMARY KEY AUTO_INCREMENT,"
+ "\"id\" UUID NOT NULL DEFAULT RANDOM_UUID(), VALUE INT NOT NULL)");
// Test columns with only difference in case
PreparedStatement prep = conn.prepareStatement("INSERT INTO TEST(VALUE) VALUES (10)",
new String[] { "id", "ID" });
prep.executeUpdate();
ResultSet rs = prep.getGeneratedKeys();
assertEquals(2, rs.getMetaData().getColumnCount());
assertEquals("id", rs.getMetaData().getColumnName(1));
assertEquals("ID", rs.getMetaData().getColumnName(2));
assertTrue(rs.next());
assertEquals(UUID.class, rs.getObject(1).getClass());
assertEquals(1L, rs.getLong(2));
assertFalse(rs.next());
rs.close();
// Test lower case name of upper case column
stat.execute("ALTER TABLE TEST DROP COLUMN \"id\"");
prep = conn.prepareStatement("INSERT INTO TEST(VALUE) VALUES (20)",
new String[] { "id" });
prep.executeUpdate();
rs = prep.getGeneratedKeys();
assertEquals(1, rs.getMetaData().getColumnCount());
assertEquals("ID", rs.getMetaData().getColumnName(1));
assertTrue(rs.next());
assertEquals(2L, rs.getLong(1));
assertFalse(rs.next());
rs.close();
// Test upper case name of lower case column
stat.execute("ALTER TABLE TEST ALTER COLUMN ID RENAME TO \"id\"");
prep = conn.prepareStatement("INSERT INTO TEST(VALUE) VALUES (30)",
new String[] { "ID" });
prep.executeUpdate();
rs = prep.getGeneratedKeys();
assertEquals(1, rs.getMetaData().getColumnCount());
assertEquals("id", rs.getMetaData().getColumnName(1));
assertTrue(rs.next());
assertEquals(3L, rs.getLong(1));
assertFalse(rs.next());
rs.close();
stat.execute("DROP TABLE TEST");
}
/**
* Test method for
* {@link Connection#prepareStatement(String)}.{@link PreparedStatement#execute()}.
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论