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

From Mike Martin
Subject Re: Wrong column names in ResultSetMetaData
Date
Msg-id cemhbu$2anv$1@news.hub.org
Whole thread Raw
In response to Re: Wrong column names in ResultSetMetaData  ("Mike Martin" <mmartin@vieo.com>)
List 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



pgsql-jdbc by date:

Previous
From: Oliver Jowett
Date:
Subject: Re: Wrong column names in ResultSetMetaData
Next
From: "Mike Martin"
Date:
Subject: Re: Wrong column names in ResultSetMetaData