On Wed, Aug 16, 2023 at 2:28 PM Andy Fan <zhihui.fan1...@gmail.com> wrote: > > update with the correct patch..
regression=# select proname, pg_catalog.pg_get_function_arguments(oid) from pg_proc where proname = 'jsonb_extract_path_type'; proname | pg_get_function_arguments -------------------------+-------------------------------------------------------------------- jsonb_extract_path_type | from_json jsonb, VARIADIC path_elems text[], target_oid anyelement (1 row) VARIADIC should be the last argument? select jsonb_array_element_type(jsonb'[1231]',0, null::int); now return null. Should it return 1231? regression=# select jsonb_array_element_type(jsonb'1231',0, 1::int); jsonb_array_element_type -------------------------- 1231 (1 row) not sure if it's ok. if you think it's not ok then: + if (!JB_ROOT_IS_ARRAY(jb)) +PG_RETURN_NULL(); change to +if (JB_ROOT_IS_SCALAR(jb) || !JB_ROOT_IS_ARRAY(jb)) +PG_RETURN_NULL(); select jsonb_array_element_type(jsonb'[1231]',0, '1'::jsonb); will crash, because jsonb_array_element_type call cast_jsonbvalue_to_type then in switch case, it will go to default part. in default part you have Assert(false); also in cast_jsonbvalue_to_type, PG_RETURN_POINTER(NULL) code won't be reached. in jsonb_cast_support function. you already have !jsonb_cast_is_optimized(fexpr->funcresulttype)). then in the default branch of cast_jsonbvalue_to_type, you can just elog(error, "can only cast to xxx type"). jsonb_array_element_type, jsonb_object_field_type, third argument is anyelement. so targetOid can be any datatype's oid.