mirror of
https://github.com/postgres/postgres.git
synced 2025-06-11 20:28:21 +03:00
Fix jsonb_plperl to convert Perl UV values correctly.
Values greater than IV_MAX were incorrectly converted to SQL, for instance ~0 would become -1 rather than 18446744073709551615 (on a 64-bit machine). Dagfinn Ilmari Mannsåker, adjusted a bit by me Discussion: https://postgr.es/m/d8jtvskjzzs.fsf@dalvik.ping.uio.no
This commit is contained in:
@ -198,7 +198,24 @@ SV_to_JsonbValue(SV *in, JsonbParseState **jsonb_state, bool is_elem)
|
||||
break;
|
||||
|
||||
default:
|
||||
if (SvIOK(in))
|
||||
if (SvUOK(in))
|
||||
{
|
||||
/*
|
||||
* If UV is >=64 bits, we have no better way to make this
|
||||
* happen than converting to text and back. Given the low
|
||||
* usage of UV in Perl code, it's not clear it's worth working
|
||||
* hard to provide alternate code paths.
|
||||
*/
|
||||
const char *strval = SvPV_nolen(in);
|
||||
|
||||
out.type = jbvNumeric;
|
||||
out.val.numeric =
|
||||
DatumGetNumeric(DirectFunctionCall3(numeric_in,
|
||||
CStringGetDatum(strval),
|
||||
ObjectIdGetDatum(InvalidOid),
|
||||
Int32GetDatum(-1)));
|
||||
}
|
||||
else if (SvIOK(in))
|
||||
{
|
||||
IV ival = SvIV(in);
|
||||
|
||||
|
Reference in New Issue
Block a user