On 10/04/2017 10:33 AM, Andres Freund wrote:
On 2017-10-02 15:01:36 -0700, Andres Freund wrote:
On 2017-10-02 17:57:51 -0400, Tom Lane wrote:
Andres Freund <and...@anarazel.de> writes:
Done that way. It's a bit annoying, because we've to take care to
initialize the "unused" part of the array with a valid signalling it's
an unused mapping. Can't use 0 for that because fmgr_builtins[0] is a
valid entry.

The prototype code I posted further upthread just used -1 as the "unused"
marker. There's no reason the array can't be int16 rather than uint16,
and "if (index < 0)" is probably a faster test anyway.

Right, but whether we use -1 or UINT16_MAX or such doesn't matter. The
relevant bit is that we can't use 0, so we can't rely on the rest of the
array being zero initialized, but instead of to initialize all of it
explicitly.  I've no real feelings about using -1 or UINT16_MAX - I'd be
very surprised if there's any sort of meaningful performance difference.

I pushed a further cleaned up version of these two patches.  If you see
a way to avoid initializing the "trailing" part of the
fmgr_builtin_oid_index in a different manner, I'm all ears ;)

You could put a dummy entry at fmgr_builtins[0].

BTW, there's some alignment padding in FmgrBuiltin, when MAXIMUM_ALIGNOF==8. You could easily shrink the struct from 32 to 24 bytes by moving funcName to the end of the struct:

--- a/src/include/utils/fmgrtab.h
+++ b/src/include/utils/fmgrtab.h
@@ -25,11 +25,11 @@
 typedef struct
 {
        Oid                     foid;                   /* OID of the function 
*/
-       const char *funcName;           /* C name of the function */
        short           nargs;                  /* 0..FUNC_MAX_ARGS, or -1 if 
variable count */
        bool            strict;                 /* T if function is "strict" */
        bool            retset;                 /* T if function returns a set 
*/
        PGFunction      func;                   /* pointer to compiled function 
*/
+       const char *funcName;           /* C name of the function */
 } FmgrBuiltin;

 extern const FmgrBuiltin fmgr_builtins[];

If we care about cache efficiency here, we could move funcName out of the fmgr_builtins array, to a separate array of the same size. I believe funcName is only used when you create an internal-language function with CREATE FUNCTION, and having it in a separate array shouldn't hurt those lookups.

- Heikki


--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to