Define a couple of types: CREATE TYPE request_in AS ( path text[], args jsonb, server text, port smallint, headers jsonb, body bytea, type_requested text[] ); CREATE TYPE request_out AS ( status smallint, headers jsonb, body text ); and a function: CREATE OR REPLACE FUNCTION request( req request_in) RETURNS "request_out" LANGUAGE 'plv8' COST 100.0 VOLATILE AS $function$ return {'status': 200, 'headers': {}, 'body': "<body>Works!</body>"} $function$; call the function: SELECT request( ( '{}', '{}'::jsonb, '', 8080, '{}'::jsonb, ''::bytea, '{}')::request_in ) get this result: (200,{},<body>Works!</body>) This is the textual representation of the result I get in psql and Ruby. Note that the textual final value is not quoted. I imagine I can work out a way to deal with this, but this is not the most felicitous way of representing a text value that I can imagine. Note that if I add a single space after “Works!”, I get quotes around the string. This is 9.6.2 on MacOS. |