Thread

  1. Accessing fields past CATALOG_VARLEN

    Ed Behn <ed@behn.us> — 2022-01-03T22:23:54Z

    I'm trying to write a C-language function to be compiled into a
    shared module to be loaded by Postgres. In it, I have the OID of a function
    and I need to get information from the pg_proc table.
    
    So far, I have:
    
    HeapTuple procTuple;
    > Form_pg_proc procStruct;
    
    
    > procTuple = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcoid));
    > if(!HeapTupleIsValid(procTuple))
    >     ereport(ERROR, errmsg("cache lookup failed for function %u.",
    > funcoid));
    >
    
    
    procStruct = (Form_pg_proc) GETSTRUCT(procTuple);
    
    
    I can get fields like procStruct->prokind and procStruct->proretset.
    
    However, I get a compiler error when I try to access procStruct->proargmodes.
    I know that this is because this field is in the CATALOG_VARLEN block which
    makes it invisible to the compiler.
    
    What is the proper way to get this field?
    
           -Ed
    
  2. Re: Accessing fields past CATALOG_VARLEN

    Chapman Flack <chap@anastigmatix.net> — 2022-01-03T22:32:56Z

    On 01/03/22 17:23, Ed Behn wrote:
    > However, I get a compiler error when I try to access procStruct->proargmodes.
    > I know that this is because this field is in the CATALOG_VARLEN block which
    > makes it invisible to the compiler.
    > 
    > What is the proper way to get this field?
    
    You can use SysCacheGetAttr with the attribute number. It knows all the
    magic needed to find the right offset, possibly decompress, etc.
    
    Regards,
    -Chap
    
    
    
    
  3. Re: Accessing fields past CATALOG_VARLEN

    Tom Lane <tgl@sss.pgh.pa.us> — 2022-01-03T22:35:33Z

    Ed Behn <ed@behn.us> writes:
    > I can get fields like procStruct->prokind and procStruct->proretset.
    > However, I get a compiler error when I try to access procStruct->proargmodes.
    > I know that this is because this field is in the CATALOG_VARLEN block which
    > makes it invisible to the compiler.
    > What is the proper way to get this field?
    
    SysCacheGetAttr().  There are examples all over the tree, but
    one that's specific to proargmodes (and also illustrates the
    best practices for deciphering its value) is in
    parser/analyze.c's transformCallStmt().
    
    You should also ask yourself if you really *need* to examine
    proargmodes for yourself, or if there's a utility function
    somewhere that will compute what you need to know.
    
    			regards, tom lane