Re: Wrong column names in ResultSetMetaData

From: "Mike Martin" <mmartin(at)vieo(dot)com>
To: pgsql-jdbc(at)postgresql(dot)org
Subject: Re: Wrong column names in ResultSetMetaData
Date: 2004-07-29 01:24:00
Message-ID: ce9jk0$15mb$1@news.hub.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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

In response to

Responses

Browse pgsql-jdbc by date

  From Date Subject
Next Message Kris Jurka 2004-07-29 03:20:46 Re: Wrong column names in ResultSetMetaData
Previous Message Mike Martin 2004-07-28 23:43:44 Wrong column names in ResultSetMetaData