24 messages in org.postgresql.pgsql-jdbc"prepared" statements (Re: Limit vs s...
FromSent OnAttachments
Sebastiaan van ErkJun 21, 2006 2:11 am 
Dave CramerJun 21, 2006 7:56 am 
Sebastiaan van ErkJun 21, 2006 8:48 am 
Kris JurkaJun 21, 2006 8:59 am 
A.M.Jun 21, 2006 9:09 am 
Tom LaneJun 21, 2006 9:46 am 
Oliver JowettJun 21, 2006 3:52 pm 
Sebastiaan van ErkJun 22, 2006 1:35 am 
Mark LewisJun 22, 2006 9:15 am 
David WallJun 22, 2006 9:36 am 
Sebastiaan van ErkJun 22, 2006 1:13 pm 
Marc HerbertJul 10, 2006 1:50 am 
Marc HerbertJul 10, 2006 1:59 am 
Marc HerbertJul 10, 2006 2:05 am 
Oliver JowettJul 10, 2006 11:32 pm 
Oliver JowettJul 10, 2006 11:37 pm 
Marc HerbertJul 11, 2006 2:48 am 
Marc HerbertJul 11, 2006 3:00 am 
Oliver JowettJul 11, 2006 3:45 am 
Marc HerbertJul 11, 2006 5:14 am 
Oliver JowettJul 11, 2006 10:01 pm 
Marc HerbertJul 12, 2006 3:22 am 
Markus SchaberJul 12, 2006 3:59 am 
Marc HerbertJul 20, 2006 11:52 am 
Actions with this message:
Paste this link in email or IM:
Paste this link in email or IM:
Atom feed for this thread
Paste this URL into your reader:
Subject:"prepared" statements (Re: Limit vs setMaxRows issue)Actions...
From:Marc Herbert (Marc@continuent.com)
Date:Jul 20, 2006 11:52:26 am
List:org.postgresql.pgsql-jdbc

Oliver Jowett <oli@opencloud.com> writes:

I am a bit confused about what this discussion is actually about .. do you have a point to make here? What is it that you want to do that the current driver doesn't do well? A fair amount of work has gone into getting query execution working smoothly and efficiently within the constraints of the API already.. Vague high-level handwaving, especially without a clear target, doesn't get us anywhere. For example, it's largely irrelevant to an application whether the query gets parsed by the server at statement creation or statement execution .. at worst, it means you see parse errors at a different point.

- By the way:


<http://java.sun.com/j2se/1.4.2/docs/api/java/sql/PreparedStatement.html#getMetaData()>

Retrieves a ResultSetMetaData object that contains information about the columns of the ResultSet object that will be returned when this PreparedStatement object is executed.

Because a PreparedStatement object is precompiled, it is possible to know about the ResultSet object that it will return without having to execute it. Consequently, it is possible to invoke the method getMetaData on a PreparedStatement object rather than waiting to execute it and then invoking the ResultSet.getMetaData method on the ResultSet object that is returned.

Similar thing for #getParameterMetadata()

- However, in the 3rd edition of the JDBC book:

23.1.3 Using parameter metadata wisely

The purpose of a prepared statement is to allow the data source to "prepare" an SQL statement, that is, to compile an SQL statement before it is executed. [..] However, not all data sources prepare a statement the same way, and some do not prepare them at all. If a data source does not precompile SQL statements, the ParameterMetaData methods will not be able to return results until execution [this is a lie because it misses "lazy" implementations, see below].

According to my (limited) understanding of the code, pgjdbc sends a special "describe" request to the server for #getMetadata() in case the statement has not been executed yet, and systematically for #getParameterMetadata(). Neither one seems to cache results, at least not on the driver-side.

As you said above, all this looks very well-crafted to be functionally irrelevant to the application. It definitely looks relevant and good to know concerning performance.