0002-fixup-Implement-jsonpath-.number-.decimal-pr.patch.nocfbot

text/plain

Filename: 0002-fixup-Implement-jsonpath-.number-.decimal-pr.patch.nocfbot
Type: text/plain
Part: 1
Message: Re: More new SQL/JSON item methods
From f2f9176548d36d3b02bd3baf1d5afdf0a84a84b1 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Mon, 15 Jan 2024 14:19:22 +0100
Subject: [PATCH 2/2] fixup! Implement jsonpath .number(), .decimal([precision
 [, scale]]), .bigint(), and .integer() methods

---
 src/backend/utils/adt/jsonpath_exec.c | 48 +++++++++------------------
 1 file changed, 16 insertions(+), 32 deletions(-)

diff --git a/src/backend/utils/adt/jsonpath_exec.c b/src/backend/utils/adt/jsonpath_exec.c
index a361c456c54..092bcda45ee 100644
--- a/src/backend/utils/adt/jsonpath_exec.c
+++ b/src/backend/utils/adt/jsonpath_exec.c
@@ -1118,8 +1118,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp,
 				char	   *numstr = NULL;
 
 				if (unwrap && JsonbType(jb) == jbvArray)
-					return executeItemUnwrapTargetArray(cxt, jsp, jb, found,
-														false);
+					return executeItemUnwrapTargetArray(cxt, jsp, jb, found, false);
 
 				if (jb->type == jbvNumeric)
 				{
@@ -1131,8 +1130,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp,
 													 jspOperationName(jsp->type)))));
 
 					if (jsp->type == jpiDecimal)
-						numstr = DatumGetCString(DirectFunctionCall1(numeric_out,
-																	 NumericGetDatum(num)));
+						numstr = DatumGetCString(DirectFunctionCall1(numeric_out, NumericGetDatum(num)));
 					res = jperOk;
 				}
 				else if (jb->type == jbvString)
@@ -1144,10 +1142,8 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp,
 
 					numstr = pnstrdup(jb->val.string.val, jb->val.string.len);
 
-					noerr = DirectInputFunctionCallSafe(numeric_in, numstr,
-														InvalidOid, -1,
-														(Node *) &escontext,
-														&datum);
+					noerr = DirectInputFunctionCallSafe(numeric_in, numstr, InvalidOid, -1,
+														(Node *) &escontext, &datum);
 
 					if (!noerr || escontext.error_occurred)
 						RETURN_ERROR(ereport(ERROR,
@@ -1195,8 +1191,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp,
 					if (elem.type != jpiNumeric)
 						elog(ERROR, "invalid jsonpath item type for .decimal() precision");
 
-					precision = numeric_int4_opt_error(jspGetNumeric(&elem),
-													   &have_error);
+					precision = numeric_int4_opt_error(jspGetNumeric(&elem), &have_error);
 					if (have_error)
 						RETURN_ERROR(ereport(ERROR,
 											 (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM),
@@ -1209,8 +1204,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp,
 						if (elem.type != jpiNumeric)
 							elog(ERROR, "invalid jsonpath item type for .decimal() scale");
 
-						scale = numeric_int4_opt_error(jspGetNumeric(&elem),
-													   &have_error);
+						scale = numeric_int4_opt_error(jspGetNumeric(&elem), &have_error);
 						if (have_error)
 							RETURN_ERROR(ereport(ERROR,
 												 (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM),
@@ -1228,8 +1222,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp,
 					datums[1] = CStringGetDatum(sstr);
 					arrtypmod = construct_array_builtin(datums, 2, CSTRINGOID);
 
-					dtypmod = DirectFunctionCall1(numerictypmodin,
-												  PointerGetDatum(arrtypmod));
+					dtypmod = DirectFunctionCall1(numerictypmodin, PointerGetDatum(arrtypmod));
 
 					/* Convert numstr to Numeric with typmod */
 					Assert(numstr != NULL);
@@ -1262,8 +1255,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp,
 				Datum		datum;
 
 				if (unwrap && JsonbType(jb) == jbvArray)
-					return executeItemUnwrapTargetArray(cxt, jsp, jb, found,
-														false);
+					return executeItemUnwrapTargetArray(cxt, jsp, jb, found, false);
 
 				if (jb->type == jbvNumeric)
 				{
@@ -1288,10 +1280,8 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp,
 					ErrorSaveContext escontext = {T_ErrorSaveContext};
 					bool		noerr;
 
-					noerr = DirectInputFunctionCallSafe(int8in, tmp,
-														InvalidOid, -1,
-														(Node *) &escontext,
-														&datum);
+					noerr = DirectInputFunctionCallSafe(int8in, tmp, InvalidOid, -1,
+														(Node *) &escontext, &datum);
 
 					if (!noerr || escontext.error_occurred)
 						RETURN_ERROR(ereport(ERROR,
@@ -1309,8 +1299,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp,
 
 				jb = &jbv;
 				jb->type = jbvNumeric;
-				jb->val.numeric = DatumGetNumeric(DirectFunctionCall1(int8_numeric,
-																	  datum));
+				jb->val.numeric = DatumGetNumeric(DirectFunctionCall1(int8_numeric, datum));
 
 				res = executeNextItem(cxt, jsp, NULL, jb, found, true);
 			}
@@ -1322,8 +1311,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp,
 				Datum		datum;
 
 				if (unwrap && JsonbType(jb) == jbvArray)
-					return executeItemUnwrapTargetArray(cxt, jsp, jb, found,
-														false);
+					return executeItemUnwrapTargetArray(cxt, jsp, jb, found, false);
 
 				if (jb->type == jbvNumeric)
 				{
@@ -1343,15 +1331,12 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp,
 				else if (jb->type == jbvString)
 				{
 					/* cast string as integer */
-					char	   *tmp = pnstrdup(jb->val.string.val,
-											   jb->val.string.len);
+					char	   *tmp = pnstrdup(jb->val.string.val, jb->val.string.len);
 					ErrorSaveContext escontext = {T_ErrorSaveContext};
 					bool		noerr;
 
-					noerr = DirectInputFunctionCallSafe(int4in, tmp,
-														InvalidOid, -1,
-														(Node *) &escontext,
-														&datum);
+					noerr = DirectInputFunctionCallSafe(int4in, tmp, InvalidOid, -1,
+														(Node *) &escontext, &datum);
 
 					if (!noerr || escontext.error_occurred)
 						RETURN_ERROR(ereport(ERROR,
@@ -1369,8 +1354,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp,
 
 				jb = &jbv;
 				jb->type = jbvNumeric;
-				jb->val.numeric = DatumGetNumeric(DirectFunctionCall1(int4_numeric,
-																	  datum));
+				jb->val.numeric = DatumGetNumeric(DirectFunctionCall1(int4_numeric, datum));
 
 				res = executeNextItem(cxt, jsp, NULL, jb, found, true);
 			}
-- 
2.43.0