23
23
#include "utils/jsonpath.h"
24
24
#include "utils/varlena.h"
25
25
26
+ /* Special pseudo-ErrorData with zero sqlerrcode for existence queries. */
27
+ ErrorData jperNotFound [1 ];
28
+
29
+
26
30
typedef struct JsonPathExecContext
27
31
{
28
32
List * vars ;
@@ -786,12 +790,12 @@ executeComparison(JsonPathExecContext *cxt, JsonPathItem *jsp, JsonbValue *jb)
786
790
jspGetLeftArg (jsp , & elem );
787
791
res = recursiveExecuteAndUnwrap (cxt , & elem , jb , & lseq );
788
792
if (jperIsError (res ))
789
- return jpbUnknown ;
793
+ return jperReplace ( res , jpbUnknown ) ;
790
794
791
795
jspGetRightArg (jsp , & elem );
792
796
res = recursiveExecuteAndUnwrap (cxt , & elem , jb , & rseq );
793
797
if (jperIsError (res ))
794
- return jpbUnknown ;
798
+ return jperReplace ( res , jpbUnknown ) ;
795
799
796
800
while ((lval = JsonValueListNext (& lseq , & lseqit )))
797
801
{
@@ -937,14 +941,16 @@ executeBinaryArithmExpr(JsonPathExecContext *cxt, JsonPathItem *jsp,
937
941
PG_CATCH ();
938
942
{
939
943
int errcode = geterrcode ();
944
+ ErrorData * edata ;
940
945
941
946
if (ERRCODE_TO_CATEGORY (errcode ) != ERRCODE_DATA_EXCEPTION )
942
947
PG_RE_THROW ();
943
948
944
- FlushErrorState ();
945
949
MemoryContextSwitchTo (mcxt );
950
+ edata = CopyErrorData ();
951
+ FlushErrorState ();
946
952
947
- return jperMakeError ( errcode );
953
+ return jperMakeErrorData ( edata );
948
954
}
949
955
PG_END_TRY ();
950
956
@@ -971,7 +977,7 @@ executeUnaryArithmExpr(JsonPathExecContext *cxt, JsonPathItem *jsp,
971
977
jper = recursiveExecuteAndUnwrap (cxt , & elem , jb , & seq );
972
978
973
979
if (jperIsError (jper ))
974
- return jperMakeError (ERRCODE_JSON_NUMBER_NOT_FOUND );
980
+ return jperReplace ( jper , jperMakeError (ERRCODE_JSON_NUMBER_NOT_FOUND ) );
975
981
976
982
jper = jperNotFound ;
977
983
@@ -1138,7 +1144,7 @@ executeStartsWithPredicate(JsonPathExecContext *cxt, JsonPathItem *jsp,
1138
1144
jspGetRightArg (jsp , & elem );
1139
1145
res = recursiveExecute (cxt , & elem , jb , & rseq );
1140
1146
if (jperIsError (res ))
1141
- return jpbUnknown ;
1147
+ return jperReplace ( res , jpbUnknown ) ;
1142
1148
1143
1149
if (JsonValueListLength (& rseq ) != 1 )
1144
1150
return jpbUnknown ;
@@ -1154,7 +1160,7 @@ executeStartsWithPredicate(JsonPathExecContext *cxt, JsonPathItem *jsp,
1154
1160
jspGetLeftArg (jsp , & elem );
1155
1161
res = recursiveExecuteAndUnwrap (cxt , & elem , jb , & lseq );
1156
1162
if (jperIsError (res ))
1157
- return jpbUnknown ;
1163
+ return jperReplace ( res , jpbUnknown ) ;
1158
1164
1159
1165
while ((whole = JsonValueListNext (& lseq , & lit )))
1160
1166
{
@@ -1221,7 +1227,7 @@ executeLikeRegexPredicate(JsonPathExecContext *cxt, JsonPathItem *jsp,
1221
1227
jspInitByBuffer (& elem , jsp -> base , jsp -> content .like_regex .expr );
1222
1228
res = recursiveExecuteAndUnwrap (cxt , & elem , jb , & seq );
1223
1229
if (jperIsError (res ))
1224
- return jpbUnknown ;
1230
+ return jperReplace ( res , jpbUnknown ) ;
1225
1231
1226
1232
while ((str = JsonValueListNext (& seq , & it )))
1227
1233
{
@@ -1402,7 +1408,7 @@ recursiveExecuteBool(JsonPathExecContext *cxt, JsonPathItem *jsp,
1402
1408
recursiveExecute (cxt , & arg , jb , & vals );
1403
1409
1404
1410
if (jperIsError (res ))
1405
- return jpbUnknown ;
1411
+ return jperReplace ( res , jpbUnknown ) ;
1406
1412
1407
1413
return JsonValueListIsEmpty (& vals ) ? jpbFalse : jpbTrue ;
1408
1414
}
@@ -1411,7 +1417,7 @@ recursiveExecuteBool(JsonPathExecContext *cxt, JsonPathItem *jsp,
1411
1417
JsonPathExecResult res = recursiveExecute (cxt , & arg , jb , NULL );
1412
1418
1413
1419
if (jperIsError (res ))
1414
- return jpbUnknown ;
1420
+ return jperReplace ( res , jpbUnknown ) ;
1415
1421
1416
1422
return res == jperOk ? jpbTrue : jpbFalse ;
1417
1423
}
@@ -2381,59 +2387,65 @@ makePassingVars(Jsonb *jb)
2381
2387
static void
2382
2388
throwJsonPathError (JsonPathExecResult res )
2383
2389
{
2390
+ int err ;
2384
2391
if (!jperIsError (res ))
2385
2392
return ;
2386
2393
2387
- switch (jperGetError (res ))
2394
+ if (jperIsErrorData (res ))
2395
+ ThrowErrorData (jperGetErrorData (res ));
2396
+
2397
+ err = jperGetError (res );
2398
+
2399
+ switch (err )
2388
2400
{
2389
2401
case ERRCODE_JSON_ARRAY_NOT_FOUND :
2390
2402
ereport (ERROR ,
2391
- (errcode (jperGetError ( res ) ),
2403
+ (errcode (err ),
2392
2404
errmsg ("SQL/JSON array not found" )));
2393
2405
break ;
2394
2406
case ERRCODE_JSON_OBJECT_NOT_FOUND :
2395
2407
ereport (ERROR ,
2396
- (errcode (jperGetError ( res ) ),
2408
+ (errcode (err ),
2397
2409
errmsg ("SQL/JSON object not found" )));
2398
2410
break ;
2399
2411
case ERRCODE_JSON_MEMBER_NOT_FOUND :
2400
2412
ereport (ERROR ,
2401
- (errcode (jperGetError ( res ) ),
2413
+ (errcode (err ),
2402
2414
errmsg ("SQL/JSON member not found" )));
2403
2415
break ;
2404
2416
case ERRCODE_JSON_NUMBER_NOT_FOUND :
2405
2417
ereport (ERROR ,
2406
- (errcode (jperGetError ( res ) ),
2418
+ (errcode (err ),
2407
2419
errmsg ("SQL/JSON number not found" )));
2408
2420
break ;
2409
2421
case ERRCODE_JSON_SCALAR_REQUIRED :
2410
2422
ereport (ERROR ,
2411
- (errcode (jperGetError ( res ) ),
2423
+ (errcode (err ),
2412
2424
errmsg ("SQL/JSON scalar required" )));
2413
2425
break ;
2414
2426
case ERRCODE_SINGLETON_JSON_ITEM_REQUIRED :
2415
2427
ereport (ERROR ,
2416
- (errcode (jperGetError ( res ) ),
2428
+ (errcode (err ),
2417
2429
errmsg ("Singleton SQL/JSON item required" )));
2418
2430
break ;
2419
2431
case ERRCODE_NON_NUMERIC_JSON_ITEM :
2420
2432
ereport (ERROR ,
2421
- (errcode (jperGetError ( res ) ),
2433
+ (errcode (err ),
2422
2434
errmsg ("Non-numeric SQL/JSON item" )));
2423
2435
break ;
2424
2436
case ERRCODE_INVALID_JSON_SUBSCRIPT :
2425
2437
ereport (ERROR ,
2426
- (errcode (jperGetError ( res ) ),
2438
+ (errcode (err ),
2427
2439
errmsg ("Invalid SQL/JSON subscript" )));
2428
2440
break ;
2429
2441
case ERRCODE_INVALID_ARGUMENT_FOR_JSON_DATETIME_FUNCTION :
2430
2442
ereport (ERROR ,
2431
- (errcode (jperGetError ( res ) ),
2443
+ (errcode (err ),
2432
2444
errmsg ("Invalid argument for SQL/JSON datetime function" )));
2433
2445
break ;
2434
2446
default :
2435
2447
ereport (ERROR ,
2436
- (errcode (jperGetError ( res ) ),
2448
+ (errcode (err ),
2437
2449
errmsg ("Unknown SQL/JSON error" )));
2438
2450
break ;
2439
2451
}
@@ -2456,7 +2468,10 @@ jsonb_jsonpath_exists(PG_FUNCTION_ARGS)
2456
2468
PG_FREE_IF_COPY (jp , 1 );
2457
2469
2458
2470
if (jperIsError (res ))
2471
+ {
2472
+ jperFree (res );
2459
2473
PG_RETURN_NULL ();
2474
+ }
2460
2475
2461
2476
PG_RETURN_BOOL (res == jperOk );
2462
2477
}
0 commit comments