Re: Wrong column names in ResultSetMetaData - Mailing list pgsql-jdbc

From Mike Martin
Subject Re: Wrong column names in ResultSetMetaData
Date
Msg-id ce9jk0$15mb$1@news.hub.org
Whole thread Raw
Responses Re: Wrong column names in ResultSetMetaData
Re: Wrong column names in ResultSetMetaData
List pgsql-jdbc
I wrote:
> With the new V3 driver the column names in ResultSetMetaData
> don't reflect the aliases used in the SQL.  I.e. if I do:
>
>     SELECT name as name_alias FROM ...
>
> the metadata says I have a result column called "name" instead
> of "name_alias".

I think I see the problem.  v2/QueryExecutorImpl.java:400 says:

    fields[i] = new Field(columnLabel, columnLabel, typeOid, typeLength,
typeModifier, 0, 0);

whereas v3/QueryExecutorImpl.java:1097 says:

    fields[i] = new Field(columnLabel,
                          null, /* name not yet determined */
                          typeOid, typeLength, typeModifier, tableOid,
positionInTable);

and a separate query is later done in getColumnName() to try
to return the unaliased *source* column name used in the query.

I'm almost certain this is wrong from a JDBC standpoint.

rsmd.getColumnName() is supposed to return the given name of
the *result* column, which SQL has rules to define.
rsmd.getColumnLabel() is "for use in printouts and displays"
and will often equate to the column name unless the DBMS has
some "prettier" column title for display purposes.

For programmatic purposes the column name concept is pretty
well defined by the docs on ResultSet.  They're supposed to
behave such that:

   String colname = rsmd.getColumnName(col);
   return rs.getXXX(colname);

is equivalent to:

   return rs.getXXX(col);

for every column that has a (non-duplicate) name.

I have to think this is going to break more code than just
ours.

Mike



pgsql-jdbc by date:

Previous
From: dgr
Date:
Subject: Re: SSL Connection Problems
Next
From: "Mike Martin"
Date:
Subject: Wrong column names in ResultSetMetaData