Re: Inconsistent casting with literal vs parameter

From: Matthew Bellew <matthew(at)bellew(dot)net>
To:
Cc: Kris Jurka <books(at)ejurka(dot)com>, pgsql-jdbc(at)postgresql(dot)org
Subject: Re: Inconsistent casting with literal vs parameter
Date: 2006-02-07 23:59:08
Message-ID: 43E9344C.2060805@bellew.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-jdbc

I wrote the following code

Properties props = new Properties();
props.put("user", "postgres");
props.put("password", "****");
props.put("stringtype", "unspecified");
Connection conn =
DriverManager.getConnection("jdbc:postgresql://localhost/cpas", props);
DatabaseMetaData md = conn.getMetaData();
System.out.println("Server URL: " + md.getURL());
System.out.println("Database Product Name: " +
md.getDatabaseProductName());
System.out.println("Database Product Version: " +
md.getDatabaseProductVersion());
System.out.println("JDBC Driver Name: " +
md.getDriverName());
System.out.println("JDBC Driver Version: " +
md.getDriverVersion());

Unfortunately, it gives the same result.

Server URL: jdbc:postgresql://localhost/cpas
Database Product Name: PostgreSQL
Database Product Version: 8.1.0
JDBC Driver Name: PostgreSQL Native Driver
JDBC Driver Version: PostgreSQL 8.1 JDBC3 with SSL (build 404)

So, does this mean this parameter is not properly respected in the driver?

Matt

Matthew Bellew wrote:

> Fantastic, thanks for the pointer this parameter. I would argue that
> the expected behavior would be that these two cases are semantically
> equivalent. The fact that this is configurable is great, but my gripe
> would be that the default setting results in 'wrong' answers for a
> very unobvious reason.
>
> Again thanks,
> Matt
>
> Kris Jurka wrote:
>
>>
>>
>> On Tue, 7 Feb 2006, Matthew Bellew wrote:
>>
>>> I have an example here where replacing a string literal with a
>>> string parameter in the same query yields different results. See
>>> Java code below, and note that this example works with int as well
>>> as float. In one case the comparisions are done as numbers in the
>>> other they are done as strings. The explanation I received from Tom
>>> Lane is that in stmtA with (x < '100'), '100' is an untyped literal,
>>> in stmtB and stmtC (x < ?), the parameter is treated as typed, and
>>> thus the coercion occurs differently. I'm afraid someone is going
>>> to answer "it works this way because..." I'm more interested to
>>> know if anyone else thinks it is a problem that these two statements
>>> return different results. I seems to me that these queries
>>> reasonably have to be considered the same, and should return the
>>> same answer..
>>
>>
>>
>> I don't think these queries are the same, consider
>> SELECT '12' < '2', 12 < 2;
>>
>> In the first case the server considers it text and the second it
>> considers it numeric. Now when considering the mixed case the server
>> has to decide what to do. When you say 12 < '2' you aren't
>> conclusively stating what type '2' is and it gets coerced to numeric,
>> but when you say setString you are explicitly telling it that it is a
>> text data type and a text comparison should be done. When you say
>> setObject with a String object you also say that it is text data. If
>> you want it interpreted as numeric data use setFloat or similar.
>>
>> The 8.2 driver has an option to allow setString data to passed to the
>> server without a type and you will get the result you desire. See
>> the stringtype parameter here:
>>
>> http://jdbc.postgresql.org/documentation/head/connect.html#connection-parameters
>>
>>
>> Kris Jurka
>>
>> ---------------------------(end of broadcast)---------------------------
>> TIP 6: explain analyze is your friend
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 6: explain analyze is your friend

In response to

Responses

Browse pgsql-jdbc by date

  From Date Subject
Next Message Kris Jurka 2006-02-08 00:02:46 Re: Inconsistent casting with literal vs parameter
Previous Message Carlos Correia 2006-02-07 23:09:28 Re: Statement has been closed (only in Windows)