>
> I think that only cast to a numeric type can be made implicit, because
> it does not lose precision.
> So, sum(jsonb) will work, but ST_MakePoint(float8, float8) still will
> require an explicit cast.
>

What would be required to make ST_MakePoint(x, y) work?

Will ST_MakePoint(numeric, numeric) wrapper that performs the explicit be
enough?

Below are examples showing how it works with new casts and JSON_VALUE:
>
> =# SELECT '1234567890.1234567890'::jsonb::int2;

=# SELECT '1234567890.1234567890'::jsonb::int4;
> =# SELECT '1234567890.1234567890'::jsonb::float4;
> =# SELECT '1234567890.1234567890'::jsonb::float8;
> =# SELECT '1234567890.1234567890'::jsonb::numeric;

=# SELECT '"1234567890.1234567890"'::jsonb::numeric;


I would expect these to be equivalent to:

select ('"1234567890.1234567890"'::jsonb->>0)::numeric;

it probably makes sense in other cases:

[local] gis@gis=# SELECT ('1234567890.1234567890'::jsonb->>0)::int2;
ERROR:  22003: value "1234567890.1234567890" is out of range for type
smallint
LOCATION:  pg_atoi, numutils.c:83


-- another error message here ("cannot fit into type") will be fine here:
[local] gis@gis=# SELECT ('1234567890.1234567890'::jsonb->>0)::int4;
ERROR:  22P02: invalid input syntax for integer: "1234567890.1234567890"
LOCATION:  pg_atoi, numutils.c:106

[local] gis@gis=# SELECT ('1234567890.1234567890'::jsonb->>0)::float4;
┌─────────────┐
│   float4    │
├─────────────┤
│ 1.23457e+09 │
└─────────────┘
[local] gis@gis=# SELECT ('1234567890.1234567890'::jsonb->>0)::float8;
┌──────────────────┐
│      float8      │
├──────────────────┤
│ 1234567890.12346 │
└──────────────────┘
[local] gis@gis=# SELECT ('1234567890.1234567890'::jsonb->>0)::numeric;
┌───────────────────────┐
│        numeric        │
├───────────────────────┤
│ 1234567890.1234567890 │
└───────────────────────┘

[local] gis@gis=# SELECT ('null'::jsonb->>0)::numeric;
┌─────────┐
│ numeric │
├─────────┤
│       ¤ │
└─────────┘

[local] gis@gis=# SELECT ('"1234567890.1234567890"'::jsonb->>0)::numeric;
┌───────────────────────┐
│        numeric        │
├───────────────────────┤
│ 1234567890.1234567890 │
└───────────────────────┘

Does this make sense, or are there hidden issues in this logic? :)

Darafei Praliaskouski,
GIS Engineer / Juno Minsk

Reply via email to