From: | yuanhang <yuanhang(dot)zheng(at)qq(dot)com> |
---|---|
To: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
Cc: | pgsql-bugs(at)lists(dot)postgresql(dot)org |
Subject: | Re: BUG #16615: Cannot determine type of Date for "is null" expression |
Date: | 2020-09-14 03:23:57 |
Message-ID: | tencent_D3DFF8BEF20146DCFBCEB1108A164C741607@qq.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-bugs |
Hi Tom,
Thank you for your reply.
1. Here is the comments in JDBC Postgres driver.
// We must use UNSPECIFIED here, or inserting a Date-with-timezone into a
// timestamptz field does an unexpected rotation by the server's TimeZone:
//
// We want to interpret 2005/01/01 with calendar +0100 as
// "local midnight in +0100", but if we go via date it interprets it
// as local midnight in the server's timezone:
// template1=# select '2005-01-01+0100'::timestamptz;
// timestamptz
// ------------------------
// 2005-01-01 02:00:00+03
// (1 row)
// template1=# select '2005-01-01+0100'::date::timestamptz;
// timestamptz
// ------------------------
// 2005-01-01 00:00:00+03
// (1 row)
2. I don’t understand why the type cannot be parsed in T_NullTest. It can be parsed when using the SQL below.
String sql = "select * from tb_user where (createdat = ?)”;
PreparedStatement statement = conn.prepareStatement(sql);
statement.setDate(1, new java.sql.Date(date.getTime()));
3. Thank you for your working around solution. It’s good! I really want the entire table but I will implement pagination when the argument is null. Java actually has Date as null.
> On Sep 13, 2020, at 22:42, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> wrote:
>
> PG Bug reporting form <noreply(at)postgresql(dot)org> writes:
>> 1. Postgres JDBC driver will always use Oid UNSPECIFIED(0) for Date type.
>> See PgPreparedStatement.java, in setDate function.
>
> You could ask the JDBC crew why they do that, although I suspect they
> have reasons.
>
>> 2. In Postgres server, it won't coerce the type to Date even if we provide
>> the type. See parse_expr.c in transformExprRecurse function.
>
> There's nothing to coerce it *to*.
>
> I'd suggest working around this with something like
>
> select * from tb_user where (?::date is null or createdat > ?)
>
> Although TBH that query looks pretty fishy to start with. Do you
> really want the entire table when the argument is null? Is it even
> possible for the argument to be null --- I doubt Java has such a
> thing as a null Date?
>
> regards, tom lane
>
>
From | Date | Subject | |
---|---|---|---|
Next Message | David G. Johnston | 2020-09-14 18:29:12 | Re: BUG #16615: Cannot determine type of Date for "is null" expression |
Previous Message | Kyotaro Horiguchi | 2020-09-14 02:05:06 | Re: BUG #16605: PostgreSQL recovery startup process waiting and blocking to application queries |