Bug #43684 | JDBC Metadata ColumnName Name is incorrect if using field alias | ||
---|---|---|---|
Submitted: | 17 Mar 2009 0:16 | Modified: | 18 Mar 2009 19:00 |
Reporter: | Thomas Feldmann | Email Updates: | |
Status: | Closed | Impact on me: | |
Category: | Connector / J | Severity: | S2 (Serious) |
Version: | mySql 5.1.31 / JDBC 5.1.7 | OS: | Any |
Assigned to: | CPU Architecture: | Any | |
Tags: | alias, as, field, jdbc, metadata |
[17 Mar 2009 0:16]
Thomas Feldmann
[17 Mar 2009 7:43]
Tonci Grgin
Hi Thomas and thanks for your report. Please attach your small but complete test case (see my samples in numerous reports). Do note JDK and connection string you're using.
[17 Mar 2009 22:15]
Thomas Feldmann
Sorry for wrong information, the access with alias field name is working. But the metadata are incorrect. So other application like BIRT not working anymore. Using Java: SUN 1.5.0_15 and IBM 1.5.0_9 Example Code: import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.Statement; public class MySqlBugReport { public static void main(String[] args) { try { Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://serv1003:50101/appdb01"; Connection connection = DriverManager.getConnection(url, "root", "xxxxxx"); Statement statement = connection.createStatement(); System.out.println("Query=select COL1 as xx, COL2 as xy from TEST_ALIAS"); ResultSet resultSet = statement.executeQuery("select COL1 as xx, COL2 as xy from TEST_ALIAS"); ResultSetMetaData resultSetMetaData = resultSet.getMetaData(); for (int j = 1; j <= resultSetMetaData.getColumnCount(); j++) { System.out.println("MetaData ColumnName=" + resultSetMetaData.getColumnName(j)); } if (resultSet.next()) { String xx = resultSet.getString("xx"); System.out.println("Get xx=" + xx); } resultSet.close(); System.out.println("Query=select if(COL1=1,COL1,COL1) as xx, COL2 as xy from TEST_ALIAS"); resultSet = statement.executeQuery("select if(COL1=1,COL1,COL1) as xx, COL2 as xy from TEST_ALIAS"); resultSetMetaData = resultSet.getMetaData(); for (int j = 1; j <= resultSetMetaData.getColumnCount(); j++) { System.out.println("MetaData ColumnName=" + resultSetMetaData.getColumnName(j)); } if (resultSet.next()) { String xx = resultSet.getString("xx"); System.out.println("Get xx=" + xx); } resultSet.close(); statement.close(); connection.close(); } catch (Exception e) { e.printStackTrace(); } } } Output: Query=select COL1 as xx, COL2 as xy from TEST_ALIAS MetaData ColumnName=COL1 MetaData ColumnName=COL2 Get xx=VAL10 Query=select if(COL1=1,COL1,COL1) as xx, COL2 as xy from TEST_ALIAS MetaData ColumnName=xx MetaData ColumnName=COL2 Get xx=VAL10
[18 Mar 2009 7:45]
Tonci Grgin
Thanks Thomas. Now, this appears to me like duplicate of Bug#31499, see what Mark said there: The behavior you ask for isn't actually JDBC-compliant (which is why there was a change in behavior in 5.1). If you want the old, non-compliant behavior, you should add "useOldAliasMetadataBehavior=true" as a configuration parameter in your JDBC URL. The documentation team changed the "Upgrading" section to mention this change. Note: The JDBC-compliant way of getting the information you're asking for, i.e. the "alias" for the column is by calling ResultSetMetaData.getColumnLabel(), not getColumnName(). The reason that getColumnName() is _not_ supposed to return the alias, is because it is supposed to be possible for a consumer of this API to generate a DML statement based on the metadata present in the ResultSet and ResultSetMetaData, and thus getColumnName() should return the _physical_ column name, not the alias. Please test with "useOldAliasMetadataBehavior=true" or with rsmd.getColumnLabel() and report back to me with result.
[18 Mar 2009 19:00]
Thomas Feldmann
Thanks a lot for your support. You are right. Sorry for not finding the other bug report. We are opening a issue on BIRT, to change the metadata handling.