@@ -1884,6 +1884,85 @@ recursiveExecuteNoUnwrap(JsonPathExecContext *cxt, JsonPathItem *jsp,
18841884 res = executeStartsWithPredicate (cxt , jsp , jb );
18851885 res = appendBoolResult (cxt , jsp , found , res , needBool );
18861886 break ;
1887+ case jpiMap :
1888+ if (JsonbType (jb ) != jbvArray )
1889+ {
1890+ if (cxt -> lax )
1891+ {
1892+ JsonValueList reslist = { 0 };
1893+
1894+ jspGetArg (jsp , & elem );
1895+ res = recursiveExecute (cxt , & elem , jb , & reslist );
1896+
1897+ if (jperIsError (res ))
1898+ return res ;
1899+
1900+ if (JsonValueListLength (& reslist ) != 1 )
1901+ return jperMakeError (ERRCODE_SINGLETON_JSON_ITEM_REQUIRED );
1902+
1903+ res = recursiveExecuteNext (cxt , jsp , NULL ,
1904+ JsonValueListHead (& reslist ),
1905+ found , true);
1906+ }
1907+ else
1908+ res = jperMakeError (ERRCODE_JSON_ARRAY_NOT_FOUND );
1909+ }
1910+ else
1911+ {
1912+ JsonbValue element_buf ;
1913+ JsonbValue * element ;
1914+ JsonbIterator * it = NULL ;
1915+ JsonbIteratorToken tok ;
1916+ JsonValueList result = { 0 };
1917+ int size = JsonbArraySize (jb );
1918+ int i ;
1919+
1920+ jspGetArg (jsp , & elem );
1921+
1922+ if (jb -> type == jbvBinary && size > 0 )
1923+ {
1924+ element = & element_buf ;
1925+ it = JsonbIteratorInit (jb -> val .binary .data );
1926+ tok = JsonbIteratorNext (& it , & element_buf , false);
1927+ if (tok != WJB_BEGIN_ARRAY )
1928+ elog (ERROR , "unexpected jsonb token at the array start" );
1929+ }
1930+
1931+ for (i = 0 ; i < size ; i ++ )
1932+ {
1933+ JsonValueList reslist = { 0 };
1934+
1935+ if (it )
1936+ {
1937+ tok = JsonbIteratorNext (& it , element , true);
1938+ if (tok != WJB_ELEM )
1939+ break ;
1940+ }
1941+ else
1942+ element = & jb -> val .array .elems [i ];
1943+
1944+ res = recursiveExecute (cxt , & elem , element , & reslist );
1945+
1946+ if (jperIsError (res ))
1947+ break ;
1948+
1949+ if (JsonValueListLength (& reslist ) != 1 )
1950+ {
1951+ res = jperMakeError (ERRCODE_SINGLETON_JSON_ITEM_REQUIRED );
1952+ break ;
1953+ }
1954+
1955+ JsonValueListConcat (& result , reslist );
1956+ }
1957+
1958+ if (jperIsError (res ))
1959+ break ;
1960+
1961+ res = recursiveExecuteNext (cxt , jsp , NULL ,
1962+ wrapItemsInArray (& result ),
1963+ found , false);
1964+ }
1965+ break ;
18871966 default :
18881967 elog (ERROR ,"2Wrong state: %d" , jsp -> type );
18891968 }
0 commit comments