44.9. Utility Functions
  The
  
   plpy
  
  module also provides the functions
 
| 
     plpy.debug(
     
       | 
| 
     plpy.log(
     
       | 
| 
     plpy.info(
     
       | 
| 
     plpy.notice(
     
       | 
| 
     plpy.warning(
     
       | 
| 
     plpy.error(
     
       | 
| 
     plpy.fatal(
     
       | 
  
  
  
   plpy.error
  
  and
  
   plpy.fatal
  
  actually raise a Python exception which, if uncaught, propagates out to
   the calling query, causing the current transaction or subtransaction to
   be aborted.
  
   raise plpy.Error(
   
    
  and
  
     msg
    
   
   )
  
   raise plpy.Fatal(
   
    
  are
   equivalent to calling
  
     msg
    
   
   )
  
   plpy.error(
   
    
  and
  
     msg
    
   
   )
  
   plpy.fatal(
   
    
  , respectively but
   the
  
     msg
    
   
   )
  
   raise
  
  form does not allow passing keyword arguments.
   The other functions only generate messages of different priority levels.
   Whether messages of a particular priority are reported to the client,
   written to the server log, or both is controlled by the
  
   log_min_messages
  
  and
  
   client_min_messages
  
  configuration
   variables. See
  
   Chapter 19
  
  for more information.
 
  The
  
   
    msg
   
  
  argument is given as a positional argument.  For
   backward compatibility, more than one positional argument can be given. In
   that case, the string representation of the tuple of positional arguments
   becomes the message reported to the client.
 
The following keyword-only arguments are accepted:
| 
     detail
     | 
| 
     hint
     | 
| 
     sqlstate
     | 
| 
     schema_name
     | 
| 
     table_name
     | 
| 
     column_name
     | 
| 
     datatype_name
     | 
| 
     constraint_name
     | 
The string representation of the objects passed as keyword-only arguments is used to enrich the messages reported to the client. For example:
CREATE FUNCTION raise_custom_exception() RETURNS void AS $$
plpy.error("custom exception message",
           detail="some info about exception",
           hint="hint for users")
$$ LANGUAGE plpython3u;
=# SELECT raise_custom_exception();
ERROR:  plpy.Error: custom exception message
DETAIL:  some info about exception
HINT:  hint for users
CONTEXT:  Traceback (most recent call last):
  PL/Python function "raise_custom_exception", line 4, in 
    hint="hint for users")
PL/Python function "raise_custom_exception"
 
 
  Another set of utility functions are
  
   plpy.quote_literal(
   
    
  ,
  
     string
    
   
   )
  
   plpy.quote_nullable(
   
    
  , and
  
     string
    
   
   )
  
   plpy.quote_ident(
   
    
  .  They
   are equivalent to the built-in quoting functions described in
  
   Section 9.4
  
  .  They are useful when constructing
   ad-hoc queries.  A PL/Python equivalent of dynamic SQL from
  
   Example 41.1
  
  would be:
 
     string
    
   
   )
  
plpy.execute("UPDATE tbl SET %s = %s WHERE key = %s" % (
    plpy.quote_ident(colname),
    plpy.quote_nullable(newvalue),
    plpy.quote_literal(keyvalue)))