postgresql-8.0.jar and failure of ORDER BY parameters

Lists: pgsql-jdbc
From: Guillaume Cottenceau <gc(at)mnc(dot)ch>
To: pgsql-jdbc(at)postgresql(dot)org
Subject: postgresql-8.0.jar and failure of ORDER BY parameters
Date: 2005-05-04 08:24:50
Message-ID: 874qdjpfe5.fsf@meuh.mnc.ch
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-jdbc

Hi,

Trying postgresql-8.0-310.jdbc3.jar and
postgresql-8.0-311.jdbc3.jar with a 7.4.5 server, ORDER BY
parameters in a preparedStatement are not taken in account
anymore (were ok when using 7.4.x JAR driver).

E.g.

SELECT .... ORDER BY ?, ?

..

actionSt = conn.prepareStatement( getQuery(),
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY );

..

actionSt.setInt( 1, 4 );
actionSt.setInt( 2, 5 );

the last part setting ORDER BY parameters, which have no effect
on the resultset we obtain.

Is there something I can do beside changing the version of the
server used?

Thanks.

--
Guillaume Cottenceau


From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Guillaume Cottenceau <gc(at)mnc(dot)ch>
Cc: pgsql-jdbc(at)postgresql(dot)org
Subject: Re: postgresql-8.0.jar and failure of ORDER BY parameters
Date: 2005-05-04 14:14:19
Message-ID: 17996.1115216059@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-jdbc

Guillaume Cottenceau <gc(at)mnc(dot)ch> writes:
> SELECT .... ORDER BY ?, ?

> actionSt.setInt( 1, 4 );
> actionSt.setInt( 2, 5 );

This would appear to be asking for a sort by two constant values,
which of course is not going to order the data usefully at all
--- all the rows will have the same sort keys.

I suppose that it behaved differently in older versions of the JDBC
driver that didn't implement real server-side prepared statements.
If the parameters are substituted textually before the server sees
the command, then you have "ORDER BY 4,5" which is interpreted according
to the old SQL92 syntax --- ie, sort by fourth and fifth columns of the
output. But anything beyond a simple integer literal --- in particular,
a parameter symbol --- is treated as an expression value per SQL99.

So no, you can't do it like that. The fact that it happened to "work"
before was an artifact of the implementation.

regards, tom lane


From: Guillaume Cottenceau <gc(at)mnc(dot)ch>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: pgsql-jdbc(at)postgresql(dot)org
Subject: Re: postgresql-8.0.jar and failure of ORDER BY parameters
Date: 2005-05-04 14:30:18
Message-ID: 87ekcn9i85.fsf@meuh.mnc.ch
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-jdbc

Tom Lane <tgl 'at' sss.pgh.pa.us> writes:

> Guillaume Cottenceau <gc(at)mnc(dot)ch> writes:
> > SELECT .... ORDER BY ?, ?
>
> > actionSt.setInt( 1, 4 );
> > actionSt.setInt( 2, 5 );
>
> This would appear to be asking for a sort by two constant values,
> which of course is not going to order the data usefully at all
> --- all the rows will have the same sort keys.
>
> I suppose that it behaved differently in older versions of the JDBC
> driver that didn't implement real server-side prepared statements.
> If the parameters are substituted textually before the server sees
> the command, then you have "ORDER BY 4,5" which is interpreted according
> to the old SQL92 syntax --- ie, sort by fourth and fifth columns of the
> output. But anything beyond a simple integer literal --- in particular,

Yes, that's what it did. I thought this was "normal" behaviour
(even if it's cumbersome IMHO) so I have not explained it.

I'd better write for example:

actionSt.setString( 1, "surname" )

in order to sort by the value of the column named "surname", but
this has never "worked". Is it supposed to work now? I just tried
that but it didn't change the resultset, btw.

> a parameter symbol --- is treated as an expression value per SQL99.
>
> So no, you can't do it like that. The fact that it happened to "work"
> before was an artifact of the implementation.

Is there any way to give parameters to ORDER BY in a
preparedStatement then?

Thanks.

--
Guillaume Cottenceau


From: "Xavier Poinsard" <xpoinsard(at)free(dot)fr>
To:
Cc: pgsql-jdbc(at)postgresql(dot)org
Subject: Re: postgresql-8.0.jar and failure of ORDER BY parameters
Date: 2005-05-04 14:42:17
Message-ID: 4278DF49.3050006@free.fr
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-jdbc

Guillaume Cottenceau wrote:
> Is there any way to give parameters to ORDER BY in a
> preparedStatement then?

This seems impossible since the aim of the preparedStatement is the
caching of the execution plan which is affected by the ORDER BY clause.
The same reason applies for table name or columns names.
The parameters should be real parameters, not part of the query structure.


From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Guillaume Cottenceau <gc(at)mnc(dot)ch>
Cc: pgsql-jdbc(at)postgresql(dot)org
Subject: Re: postgresql-8.0.jar and failure of ORDER BY parameters
Date: 2005-05-04 14:50:36
Message-ID: 18496.1115218236@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-jdbc

Guillaume Cottenceau <gc(at)mnc(dot)ch> writes:
> I'd better write for example:
> actionSt.setString( 1, "surname" )
> in order to sort by the value of the column named "surname", but
> this has never "worked". Is it supposed to work now?

No, that's just a different way of sorting by a constant.

Parameters are *values*, they are not references to columns, and so
there is no way to do what you want. The fact that it happened to
work like that before was an implementation artifact that has now
gone away.

AFAICS you'll have to set up multiple prepared statements with all the
different orderings you want. This is not different from having to set
up different statements depending on which columns you want displayed
--- would you expect "SELECT ? FROM mytab" to allow run-time
selection of a column?

regards, tom lane


From: Guillaume Cottenceau <gc(at)mnc(dot)ch>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: pgsql-jdbc(at)postgresql(dot)org
Subject: Re: postgresql-8.0.jar and failure of ORDER BY parameters
Date: 2005-05-04 15:04:29
Message-ID: 8764xz822q.fsf@meuh.mnc.ch
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-jdbc

Tom Lane <tgl 'at' sss.pgh.pa.us> writes:

> Guillaume Cottenceau <gc(at)mnc(dot)ch> writes:
> > I'd better write for example:
> > actionSt.setString( 1, "surname" )
> > in order to sort by the value of the column named "surname", but
> > this has never "worked". Is it supposed to work now?
>
> No, that's just a different way of sorting by a constant.
>
> Parameters are *values*, they are not references to columns, and so
> there is no way to do what you want. The fact that it happened to
> work like that before was an implementation artifact that has now
> gone away.

Ok.

> AFAICS you'll have to set up multiple prepared statements with all the
> different orderings you want. This is not different from having to set
> up different statements depending on which columns you want displayed
> --- would you expect "SELECT ? FROM mytab" to allow run-time
> selection of a column?

True enough.

Thanks for the light.

--
Guillaume Cottenceau