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-08-02 23:06:35
Message-ID: cemhbu$2anv$1@news.hub.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-jdbc

Kris wrote:
> > PostgreSQL 7.5 price orig_price price ""
>
> I think you have the name and column for 2 backwards. It should return ""
> for the column name because it is a derived column, so there is no
> underlying table column to return.

Sorry, you're right. I inadvertently reversed them in the process
of table-ization.

> This shows the results are different, but it doesn't indicate why. Is it
> simply because the other dbs can't implement getColumnName as we have?
> I certainly wouldn't expect this to be a common feature.
>
> Further it doesn't show that users can't write portable code using the
> ResultSetMetaData calls. It shows all drivers returning the same value
> for getColumnLabel that you would expect. Earlier you had speculated that
> other drivers would return something different for this, but you haven't
> shown that. Yes it may break existing code, but it doesn't show that they
> weren't simply using the wrong call.

No, I speculated that a driver *could*, if it had a special pretty
print label available from the DBMS, return it from getColumnLabel().
Most DBMS's don't. Oracle does in SQL*Plus; for example:

column c1 heading "# OF ROWS" format 99,999,999;
column c2 heading "#_rows*row_len" format 9,999,999,999;
column c3 heading "PCT USED" format 999;

select num_rows c1,
num_rows*avg_row_len c2,
((num_rows*avg_row_len)/(blocks*&blksz))*100 c3
from perfstat.stats$tab_stats a
...

Does their driver support that? I don't know. But it is an
example of exactly what the docs for getColumnLabel() describe:
the "suggested title for use in printouts and displays". In the
absence of such support, doesn't it make sense that driver
writers would have simply defaulted label to column name?

I don't see anything ambiguous in "suggested title for use in
printouts and displays", nor anything that would even remotely
tie it to SQL alias. But I do see, and have given you, text that
explicitly ties column names to SQL aliases. Plus evidence that
many other well-known drivers work on that basis.

And you can't just ask everyone to switch their getColumnName() to
getColumnLabel(). It doesn't even work because of findColumn()
and rs.getXXX(String). Those methods are *required* to resolve a
duplicate name to the first matching column (ResultSet Javadoc).
With your code, my rs.getFloat("PRICE") *must* resolve to column
1, and that's simply the wrong answer.

Mike

In response to

Browse pgsql-jdbc by date

  From Date Subject
Next Message Mike Martin 2004-08-02 23:16:46 Re: Wrong column names in ResultSetMetaData
Previous Message Oliver Jowett 2004-08-02 22:42:44 Re: Wrong column names in ResultSetMetaData