提交 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; ...@@ -10,13 +10,13 @@ import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.h2.message.DbException;
import org.h2.result.Row; import org.h2.result.Row;
import org.h2.table.Column; import org.h2.table.Column;
import org.h2.table.Table; import org.h2.table.Table;
import org.h2.tools.SimpleResultSet; import org.h2.tools.SimpleResultSet;
import org.h2.util.MathUtils; import org.h2.util.MathUtils;
import org.h2.util.New; import org.h2.util.New;
import org.h2.util.StringUtils;
import org.h2.value.DataType; import org.h2.value.DataType;
/** /**
...@@ -135,13 +135,13 @@ public final class GeneratedKeys { ...@@ -135,13 +135,13 @@ public final class GeneratedKeys {
int[] indices = (int[]) generatedKeysRequest; int[] indices = (int[]) generatedKeysRequest;
Column[] columns = table.getColumns(); Column[] columns = table.getColumns();
int cnt = columns.length; int cnt = columns.length;
this.allColumns.clear(); allColumns.clear();
for (int idx : indices) { for (int idx : indices) {
if (idx >= 1 && idx <= cnt) { if (idx >= 1 && idx <= cnt) {
Column column = columns[idx - 1]; Column column = columns[idx - 1];
rs.addColumn(column.getName(), DataType.convertTypeToSQLType(column.getType()), rs.addColumn(column.getName(), DataType.convertTypeToSQLType(column.getType()),
MathUtils.convertLongToInt(column.getPrecision()), column.getScale()); MathUtils.convertLongToInt(column.getPrecision()), column.getScale());
this.allColumns.add(column); allColumns.add(column);
} }
} }
} else { } else {
...@@ -150,15 +150,28 @@ public final class GeneratedKeys { ...@@ -150,15 +150,28 @@ public final class GeneratedKeys {
} else if (generatedKeysRequest instanceof String[]) { } else if (generatedKeysRequest instanceof String[]) {
if (table != null) { if (table != null) {
String[] names = (String[]) generatedKeysRequest; String[] names = (String[]) generatedKeysRequest;
this.allColumns.clear(); allColumns.clear();
for (String name : names) { for (String name : names) {
try { Column column;
Column column = table.getColumn(name); search: if (table.doesColumnExist(name)) {
rs.addColumn(column.getName(), DataType.convertTypeToSQLType(column.getType()), column = table.getColumn(name);
MathUtils.convertLongToInt(column.getPrecision()), column.getScale()); } else {
this.allColumns.add(column); name = StringUtils.toUpperEnglish(name);
} catch (DbException e) { 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 { } else {
return rs; return rs;
......
...@@ -62,6 +62,7 @@ public class TestGetGeneratedKeys extends TestBase { ...@@ -62,6 +62,7 @@ public class TestGetGeneratedKeys extends TestBase {
Connection conn = getConnection("getGeneratedKeys"); Connection conn = getConnection("getGeneratedKeys");
testBatchAndMergeInto(conn); testBatchAndMergeInto(conn);
testCalledSequenses(conn); testCalledSequenses(conn);
testNameCase(conn);
testPrepareStatement_Execute(conn); testPrepareStatement_Execute(conn);
testPrepareStatement_ExecuteBatch(conn); testPrepareStatement_ExecuteBatch(conn);
...@@ -228,6 +229,58 @@ public class TestGetGeneratedKeys extends TestBase { ...@@ -228,6 +229,58 @@ public class TestGetGeneratedKeys extends TestBase {
stat.execute("DROP SEQUENCE SEQ"); 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 * Test method for
* {@link Connection#prepareStatement(String)}.{@link PreparedStatement#execute()}. * {@link Connection#prepareStatement(String)}.{@link PreparedStatement#execute()}.
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论