Re: jsonpath versus NaN
Oleg Bartunov <obartunov@postgrespro.ru>
From: Oleg Bartunov <obartunov@postgrespro.ru>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Alexander Korotkov <a.korotkov@postgrespro.ru>, PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2020-06-18T15:51:04Z
Lists: pgsql-hackers
On Wed, Jun 17, 2020 at 6:33 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:
> Alexander Korotkov <a.korotkov@postgrespro.ru> writes:
> > On Thu, Jun 11, 2020 at 10:00 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:
> >> I don't think this is very relevant. The SQL standard has not got the
> >> concepts of Inf or NaN either (see 4.4.2 Characteristics of numbers),
> >> therefore their definition is only envisioning that a string
> representing
> >> a normal finite number should be castable to DOUBLE PRECISION. Thus,
> >> both of the relevant standards think that "numbers" are just finite
> >> numbers.
>
> > Yes, I see. No standard insists we should support NaN. However,
> > standard claims .double() should behave the same as CAST to double.
> > So, I think if CAST supports NaN, but .double() doesn't, it's still a
> > violation.
>
> No, I think you are completely misunderstanding the standard. They
> are saying that strings that look like legal numbers according to SQL
> should be castable into numbers. But NaN and Inf are not legal
> numbers according to SQL, so there is nothing in that text that
> justifies accepting "NaN". Nor does the JSON standard provide any
> support for that position. So I think it is fine to leave NaN/Inf
> out of the world of what you can write in jsonpath.
>
rfc and sql json forbid Nan and Inf ( Technical Report is freely available,
https://standards.iso.org/ittf/PubliclyAvailableStandards/c067367_ISO_IEC_TR_19075-6_2017.zip
)
Page 10 JSON terminology.
“A sequence comprising an integer part, optionally followed by a fractional
part and/or
an exponent part (non-numeric values, such as infinity and NaN are not
permitted)”
>
> I'd be more willing to let the code do this if it didn't require such
> a horrid, dangerous kluge to do so. But it does, and I don't see any
> easy way around that, so I think we should just take out the kluge.
> And do so sooner not later, before some misguided user starts to
> depend on it.
>
The problem is that we tried to find a trade-off between standard and
postgres
implementation, for example, in postgres CAST allows NaN and Inf, and SQL
Standard
requires .double should works as CAST.
SELECT 'nan'::real, 'inf'::real;
float4 | float4
--------+----------
NaN | Infinity
(1 row)
>
> regards, tom lane
>
>
>
--
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company
Commits
-
Forbid numeric NaN in jsonpath
- f4ae676e3178 12.4 landed
- 89a0b1a7ca0a 13.0 landed
- df646509f371 14.0 landed
-
Improve error reporting for jsonpath .double() method
- 3ec5f6b53dfb 12.4 landed
- b9a04a9bc665 13.0 landed
- 065718116746 14.0 landed
-
Partial implementation of SQL/JSON path language
- 72b6460336e8 12.0 cited