@@ -910,7 +910,6 @@ static JsonPathExecResult
910
910
executeBinaryArithmExpr (JsonPathExecContext * cxt , JsonPathItem * jsp ,
911
911
JsonbValue * jb , JsonValueList * found )
912
912
{
913
- MemoryContext mcxt = CurrentMemoryContext ;
914
913
JsonPathExecResult jper ;
915
914
JsonPathItem elem ;
916
915
JsonValueList lseq = { 0 };
@@ -919,11 +918,10 @@ executeBinaryArithmExpr(JsonPathExecContext *cxt, JsonPathItem *jsp,
919
918
JsonbValue * rval ;
920
919
JsonbValue lvalbuf ;
921
920
JsonbValue rvalbuf ;
922
- PGFunction func ;
923
- Datum ldatum ;
924
- Datum rdatum ;
925
- Datum res ;
921
+ Numeric (* func )(Numeric , Numeric , ErrorData * * );
922
+ Numeric res ;
926
923
bool hasNext ;
924
+ ErrorData * edata ;
927
925
928
926
jspGetLeftArg (jsp , & elem );
929
927
@@ -962,55 +960,38 @@ executeBinaryArithmExpr(JsonPathExecContext *cxt, JsonPathItem *jsp,
962
960
if (!found && !hasNext )
963
961
return jperOk ;
964
962
965
- ldatum = NumericGetDatum (lval -> val .numeric );
966
- rdatum = NumericGetDatum (rval -> val .numeric );
967
-
968
963
switch (jsp -> type )
969
964
{
970
965
case jpiAdd :
971
- func = numeric_add ;
966
+ func = numeric_add_internal ;
972
967
break ;
973
968
case jpiSub :
974
- func = numeric_sub ;
969
+ func = numeric_sub_internal ;
975
970
break ;
976
971
case jpiMul :
977
- func = numeric_mul ;
972
+ func = numeric_mul_internal ;
978
973
break ;
979
974
case jpiDiv :
980
- func = numeric_div ;
975
+ func = numeric_div_internal ;
981
976
break ;
982
977
case jpiMod :
983
- func = numeric_mod ;
978
+ func = numeric_mod_internal ;
984
979
break ;
985
980
default :
986
981
elog (ERROR , "unknown jsonpath arithmetic operation %d" , jsp -> type );
987
982
func = NULL ;
988
983
break ;
989
984
}
990
985
991
- PG_TRY ();
992
- {
993
- res = DirectFunctionCall2 (func , ldatum , rdatum );
994
- }
995
- PG_CATCH ();
996
- {
997
- int errcode = geterrcode ();
998
- ErrorData * edata ;
999
-
1000
- if (ERRCODE_TO_CATEGORY (errcode ) != ERRCODE_DATA_EXCEPTION )
1001
- PG_RE_THROW ();
1002
-
1003
- MemoryContextSwitchTo (mcxt );
1004
- edata = CopyErrorData ();
1005
- FlushErrorState ();
986
+ edata = NULL ;
987
+ res = func (lval -> val .numeric , rval -> val .numeric , & edata );
1006
988
989
+ if (edata )
1007
990
return jperMakeErrorData (edata );
1008
- }
1009
- PG_END_TRY ();
1010
991
1011
992
lval = palloc (sizeof (* lval ));
1012
993
lval -> type = jbvNumeric ;
1013
- lval -> val .numeric = DatumGetNumeric ( res ) ;
994
+ lval -> val .numeric = res ;
1014
995
1015
996
return recursiveExecuteNext (cxt , jsp , & elem , lval , found , false);
1016
997
}
@@ -1947,53 +1928,53 @@ recursiveExecuteNoUnwrap(JsonPathExecContext *cxt, JsonPathItem *jsp,
1947
1928
case jpiDouble :
1948
1929
{
1949
1930
JsonbValue jbv ;
1950
- MemoryContext mcxt = CurrentMemoryContext ;
1931
+ ErrorData * edata = NULL ;
1951
1932
1952
1933
if (JsonbType (jb ) == jbvScalar )
1953
1934
jb = JsonbExtractScalar (jb -> val .binary .data , & jbv );
1954
1935
1955
- PG_TRY ();
1936
+ if ( jb -> type == jbvNumeric )
1956
1937
{
1957
- if (jb -> type == jbvNumeric )
1958
- {
1959
- /* only check success of numeric to double cast */
1960
- DirectFunctionCall1 (numeric_float8 ,
1961
- NumericGetDatum (jb -> val .numeric ));
1962
- res = jperOk ;
1963
- }
1964
- else if (jb -> type == jbvString )
1965
- {
1966
- /* cast string as double */
1967
- char * str = pnstrdup (jb -> val .string .val ,
1968
- jb -> val .string .len );
1969
- Datum val = DirectFunctionCall1 (
1970
- float8in , CStringGetDatum (str ));
1971
- pfree (str );
1938
+ /* only check success of numeric to double cast */
1939
+ (void ) numeric_float8_internal (jb -> val .numeric , & edata );
1940
+ }
1941
+ else if (jb -> type == jbvString )
1942
+ {
1943
+ /* cast string as double */
1944
+ char * str = pnstrdup (jb -> val .string .val ,
1945
+ jb -> val .string .len );
1946
+ double val ;
1972
1947
1948
+ val = float8in_internal_safe (str , NULL , "double precision" ,
1949
+ str , & edata );
1950
+ pfree (str );
1951
+
1952
+ if (!edata )
1953
+ {
1973
1954
jb = & jbv ;
1974
1955
jb -> type = jbvNumeric ;
1975
- jb -> val .numeric = DatumGetNumeric (DirectFunctionCall1 (
1976
- float8_numeric , val ));
1977
- res = jperOk ;
1978
-
1956
+ jb -> val .numeric = float8_numeric_internal (val , & edata );
1979
1957
}
1980
- else
1981
- res = jperMakeError (ERRCODE_NON_NUMERIC_JSON_ITEM );
1982
1958
}
1983
- PG_CATCH ();
1959
+ else
1960
+ {
1961
+ res = jperMakeError (ERRCODE_NON_NUMERIC_JSON_ITEM );
1962
+ break ;
1963
+ }
1964
+
1965
+ if (edata )
1984
1966
{
1985
- if (ERRCODE_TO_CATEGORY (geterrcode () ) !=
1986
- ERRCODE_DATA_EXCEPTION )
1987
- PG_RE_THROW ( );
1967
+ if (ERRCODE_TO_CATEGORY (edata -> sqlerrcode ) !=
1968
+ ERRCODE_DATA_EXCEPTION )
1969
+ ThrowErrorData ( edata );
1988
1970
1989
- FlushErrorState ();
1990
- MemoryContextSwitchTo (mcxt );
1971
+ FreeErrorData (edata );
1991
1972
res = jperMakeError (ERRCODE_NON_NUMERIC_JSON_ITEM );
1992
1973
}
1993
- PG_END_TRY ();
1994
-
1995
- if (res == jperOk )
1974
+ else
1975
+ {
1996
1976
res = recursiveExecuteNext (cxt , jsp , NULL , jb , found , true);
1977
+ }
1997
1978
}
1998
1979
break ;
1999
1980
case jpiDatetime :
0 commit comments