@@ -2250,6 +2250,78 @@ recursiveExecuteNoUnwrap(JsonPathExecContext *cxt, JsonPathItem *jsp,
22502250 res = recursiveExecuteNext (cxt , jsp , NULL , result , found , false);
22512251 }
22522252 break ;
2253+ case jpiMin :
2254+ case jpiMax :
2255+ if (JsonbType (jb ) != jbvArray )
2256+ {
2257+ if (cxt -> lax )
2258+ res = recursiveExecuteNext (cxt , jsp , NULL , jb , found , true);
2259+ else
2260+ res = jperMakeError (ERRCODE_JSON_ARRAY_NOT_FOUND );
2261+ }
2262+ else
2263+ {
2264+ JsonbValue jbvElementBuf ;
2265+ JsonbValue * jbvElement ;
2266+ JsonbValue * jbvResult = NULL ;
2267+ Jsonb * jbResult = NULL ;
2268+ JsonbIterator * it = NULL ;
2269+ JsonbIteratorToken tok ;
2270+ int size = JsonbArraySize (jb );
2271+ int i ;
2272+ bool isMax = jsp -> type == jpiMax ;
2273+
2274+ if (jb -> type == jbvBinary )
2275+ {
2276+ jbvElement = & jbvElementBuf ;
2277+ it = JsonbIteratorInit (jb -> val .binary .data );
2278+ tok = JsonbIteratorNext (& it , & jbvElementBuf , false);
2279+ if (tok != WJB_BEGIN_ARRAY )
2280+ elog (ERROR , "unexpected jsonb token at the array start" );
2281+ }
2282+
2283+ for (i = 0 ; i < size ; i ++ )
2284+ {
2285+ if (it )
2286+ {
2287+ tok = JsonbIteratorNext (& it , jbvElement , true);
2288+ if (tok != WJB_ELEM )
2289+ break ;
2290+ }
2291+ else
2292+ jbvElement = & jb -> val .array .elems [i ];
2293+
2294+ if (!i )
2295+ {
2296+ jbvResult = it ? copyJsonbValue (jbvElement ) : jbvElement ;
2297+
2298+ if (size > 1 )
2299+ jbResult = JsonbValueToJsonb (jbvResult );
2300+ }
2301+ else
2302+ {
2303+ Jsonb * jbElement = JsonbValueToJsonb (jbvElement );
2304+ int cmp = compareJsonbContainers (& jbElement -> root ,
2305+ & jbResult -> root );
2306+
2307+ if (isMax ? cmp > 0 : cmp < 0 )
2308+ {
2309+ jbvResult = it ? copyJsonbValue (jbvElement ) : jbvElement ;
2310+ jbResult = jbElement ;
2311+ }
2312+ }
2313+ }
2314+
2315+ if (!jbvResult )
2316+ {
2317+ res = jperNotFound ;
2318+ break ;
2319+ }
2320+
2321+ res = recursiveExecuteNext (cxt , jsp , NULL , jbvResult , found ,
2322+ false);
2323+ }
2324+ break ;
22532325 default :
22542326 elog (ERROR ,"2Wrong state: %d" , jsp -> type );
22552327 }
0 commit comments