title: "function does not exist," but I really think it does
body: <p>Am I crazy or just plain dumb?</p>
  
  <pre><code>dev=# \df abuse_resolve 
  List of functions
  -[ RECORD 1 ]-------+------------------------------------------------------------------------------------------------------------------------------------
  Schema              | public
  Name                | abuse_resolve
  Result data type    | record
  Argument data types | INOUT __abuse_id bigint, OUT __msg character varying
  Type                | normal
  
  dev=# select abuse_resolve('30'::bigint); 
  ERROR:  function abuse_resolve(bigint) does not exist
  LINE 1: select abuse_resolve('30'::bigint);
                 ^
  HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
  </code></pre>
  
  <p>Here's the <code>CREATE FUNCTION</code>, I've omitted the meat of the code, but that should be irrelevant:</p>
  
  <pre><code>CREATE OR REPLACE FUNCTION abuse_resolve(INOUT __abuse_id bigint, OUT __msg character varying) RETURNS record AS $_$
  DECLARE
      __abuse_status    VARCHAR;
  BEGIN
   ...snip...
      UPDATE abuse SET abuse_status    = __abuse_status,
                         edate    = now(),
                         closed_on = now()
                   WHERE abuse_id        = __abuse_id;
      __msg = 'SUCCESS';
  END;
  $_$ LANGUAGE plpgsql SECURITY DEFINER;
  </code></pre>
  
  <p>And just for giggles:</p>
  
  <pre><code>GRANT ALL ON FUNCTION abuse_resolve(INOUT __abuse_id, OUT __msg character varying) TO PUBLIC;
  GRANT ALL ON FUNCTION abuse_resolve(INOUT __abuse_id, OUT __msg character varying) TO myuser;
  </code></pre>
  
  <p>That function seems like it exists. What could I be missing?</p>
  
  <p>This is resolved, the answer is: I'm dumb. I had improperly defined the arguments originally, but my code was using the correct ones. There was an extra <code>bigint</code> that had no business being there.</p>