@@ -2057,6 +2057,85 @@ recursiveExecuteNoUnwrap(JsonPathExecContext *cxt, JsonPathItem *jsp,
20572057 res = executeLikeRegexPredicate (cxt , jsp , jb );
20582058 res = appendBoolResult (cxt , jsp , found , res , needBool );
20592059 break ;
2060+ case jpiMap :
2061+ if (JsonbType (jb ) != jbvArray )
2062+ {
2063+ if (cxt -> lax )
2064+ {
2065+ JsonValueList reslist = { 0 };
2066+
2067+ jspGetArg (jsp , & elem );
2068+ res = recursiveExecute (cxt , & elem , jb , & reslist );
2069+
2070+ if (jperIsError (res ))
2071+ return res ;
2072+
2073+ if (JsonValueListLength (& reslist ) != 1 )
2074+ return jperMakeError (ERRCODE_SINGLETON_JSON_ITEM_REQUIRED );
2075+
2076+ res = recursiveExecuteNext (cxt , jsp , NULL ,
2077+ JsonValueListHead (& reslist ),
2078+ found , true);
2079+ }
2080+ else
2081+ res = jperMakeError (ERRCODE_JSON_ARRAY_NOT_FOUND );
2082+ }
2083+ else
2084+ {
2085+ JsonbValue element_buf ;
2086+ JsonbValue * element ;
2087+ JsonbIterator * it = NULL ;
2088+ JsonbIteratorToken tok ;
2089+ JsonValueList result = { 0 };
2090+ int size = JsonbArraySize (jb );
2091+ int i ;
2092+
2093+ jspGetArg (jsp , & elem );
2094+
2095+ if (jb -> type == jbvBinary && size > 0 )
2096+ {
2097+ element = & element_buf ;
2098+ it = JsonbIteratorInit (jb -> val .binary .data );
2099+ tok = JsonbIteratorNext (& it , & element_buf , false);
2100+ if (tok != WJB_BEGIN_ARRAY )
2101+ elog (ERROR , "unexpected jsonb token at the array start" );
2102+ }
2103+
2104+ for (i = 0 ; i < size ; i ++ )
2105+ {
2106+ JsonValueList reslist = { 0 };
2107+
2108+ if (it )
2109+ {
2110+ tok = JsonbIteratorNext (& it , element , true);
2111+ if (tok != WJB_ELEM )
2112+ break ;
2113+ }
2114+ else
2115+ element = & jb -> val .array .elems [i ];
2116+
2117+ res = recursiveExecute (cxt , & elem , element , & reslist );
2118+
2119+ if (jperIsError (res ))
2120+ break ;
2121+
2122+ if (JsonValueListLength (& reslist ) != 1 )
2123+ {
2124+ res = jperMakeError (ERRCODE_SINGLETON_JSON_ITEM_REQUIRED );
2125+ break ;
2126+ }
2127+
2128+ JsonValueListConcat (& result , reslist );
2129+ }
2130+
2131+ if (jperIsError (res ))
2132+ break ;
2133+
2134+ res = recursiveExecuteNext (cxt , jsp , NULL ,
2135+ wrapItemsInArray (& result ),
2136+ found , false);
2137+ }
2138+ break ;
20602139 default :
20612140 elog (ERROR , "unrecognized jsonpath item type: %d" , jsp -> type );
20622141 }
0 commit comments