Have LookupFuncName accept NULL argtypes for 0 args
authorAlvaro Herrera <[email protected]>
Tue, 12 Nov 2019 20:04:46 +0000 (17:04 -0300)
committerAlvaro Herrera <[email protected]>
Tue, 12 Nov 2019 20:06:58 +0000 (17:06 -0300)
Prior to this change, it requires to be passed a valid pointer just to
be able to pass it to a zero-byte memcmp, per 0a52d378b03b.  Given the
strange resulting code in callsites, it seems better to test for the
case specifically and remove the requirement.

Reported-by: Ranier Vilela
Discussion: https://postgr.es/m/MN2PR18MB2927F24692485D754794F01BE3740@MN2PR18MB2927.namprd18.prod.outlook.com
Discussion: https://postgr.es/m/MN2PR18MB2927F6873DF2774A505AC298E3740@MN2PR18MB2927.namprd18.prod.outlook.com

src/backend/commands/event_trigger.c
src/backend/commands/foreigncmds.c
src/backend/commands/proclang.c
src/backend/commands/trigger.c
src/backend/parser/parse_func.c
src/pl/tcl/pltcl.c

index 6b022af4ab9d72e8ad313a10916f11e98e47ca2c..f021d71a5cbd8ddcf1528c5f61f306cfd4ab3605 100644 (file)
@@ -171,7 +171,6 @@ CreateEventTrigger(CreateEventTrigStmt *stmt)
        HeapTuple       tuple;
        Oid                     funcoid;
        Oid                     funcrettype;
-       Oid                     fargtypes[1];   /* dummy */
        Oid                     evtowner = GetUserId();
        ListCell   *lc;
        List       *tags = NULL;
@@ -237,7 +236,7 @@ CreateEventTrigger(CreateEventTrigStmt *stmt)
                                                stmt->trigname)));
 
        /* Find and validate the trigger function. */
-       funcoid = LookupFuncName(stmt->funcname, 0, fargtypes, false);
+       funcoid = LookupFuncName(stmt->funcname, 0, NULL, false);
        funcrettype = get_func_rettype(funcoid);
        if (funcrettype != EVTTRIGGEROID)
                ereport(ERROR,
index f96c278a6a1593a92835442c210e742d8f3a0f9d..766c9f95c8044b915b0e5e2bfdd55f2aa32dfe85 100644 (file)
@@ -475,13 +475,12 @@ static Oid
 lookup_fdw_handler_func(DefElem *handler)
 {
        Oid                     handlerOid;
-       Oid                     funcargtypes[1];        /* dummy */
 
        if (handler == NULL || handler->arg == NULL)
                return InvalidOid;
 
        /* handlers have no arguments */
-       handlerOid = LookupFuncName((List *) handler->arg, 0, funcargtypes, false);
+       handlerOid = LookupFuncName((List *) handler->arg, 0, NULL, false);
 
        /* check that handler has correct return type */
        if (get_func_rettype(handlerOid) != FDW_HANDLEROID)
index 343cd1dbb054bae73f35b28c595360878add81a3..b51c373b93f77757ca2e14502b30cc45fb0cc79e 100644 (file)
@@ -105,7 +105,7 @@ CreateProceduralLanguage(CreatePLangStmt *stmt)
                 * return type.
                 */
                funcname = SystemFuncName(pltemplate->tmplhandler);
-               handlerOid = LookupFuncName(funcname, 0, funcargtypes, true);
+               handlerOid = LookupFuncName(funcname, 0, NULL, true);
                if (OidIsValid(handlerOid))
                {
                        funcrettype = get_func_rettype(handlerOid);
@@ -263,7 +263,7 @@ CreateProceduralLanguage(CreatePLangStmt *stmt)
                 * Lookup the PL handler function and check that it is of the expected
                 * return type
                 */
-               handlerOid = LookupFuncName(stmt->plhandler, 0, funcargtypes, false);
+               handlerOid = LookupFuncName(stmt->plhandler, 0, NULL, false);
                funcrettype = get_func_rettype(handlerOid);
                if (funcrettype != LANGUAGE_HANDLEROID)
                {
index cef6d02f517fab0b6b9b6f9d3359f292911c5ad9..84144b46b15b705bf95a90e852a4e85e51a6cfca 100644 (file)
@@ -179,7 +179,6 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
        ScanKeyData key;
        Relation        pgrel;
        HeapTuple       tuple;
-       Oid                     fargtypes[1];   /* dummy */
        Oid                     funcrettype;
        Oid                     trigoid;
        char            internaltrigname[NAMEDATALEN];
@@ -690,7 +689,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
         * Find and validate the trigger function.
         */
        if (!OidIsValid(funcoid))
-               funcoid = LookupFuncName(stmt->funcname, 0, fargtypes, false);
+               funcoid = LookupFuncName(stmt->funcname, 0, NULL, false);
        if (!isInternal)
        {
                aclresult = pg_proc_aclcheck(funcoid, GetUserId(), ACL_EXECUTE);
index 8e926539e6a8b33bfd1e75e9420a7748ba647f9d..9d9efc2cc247aebea93b7f56d6e2f9cddb5dd59d 100644 (file)
@@ -2035,8 +2035,8 @@ LookupFuncNameInternal(List *funcname, int nargs, const Oid *argtypes,
 {
        FuncCandidateList clist;
 
-       /* Passing NULL for argtypes is no longer allowed */
-       Assert(argtypes);
+       /* NULL argtypes allowed for nullary functions only */
+       Assert(argtypes != NULL || nargs == 0);
 
        /* Always set *lookupError, to forestall uninitialized-variable warnings */
        *lookupError = FUNCLOOKUP_NOSUCHFUNC;
@@ -2070,7 +2070,9 @@ LookupFuncNameInternal(List *funcname, int nargs, const Oid *argtypes,
         */
        while (clist)
        {
-               if (memcmp(argtypes, clist->args, nargs * sizeof(Oid)) == 0)
+               /* if nargs==0, argtypes can be null; don't pass that to memcmp */
+               if (nargs == 0 ||
+                       memcmp(argtypes, clist->args, nargs * sizeof(Oid)) == 0)
                        return clist->oid;
                clist = clist->next;
        }
index 73e12788fc00c8846a3cb6d1b675a79c687f62f6..e7640008fdc22428d16d24c5cf106597e0114212 100644 (file)
@@ -592,7 +592,6 @@ call_pltcl_start_proc(Oid prolang, bool pltrusted)
        const char *gucname;
        ErrorContextCallback errcallback;
        List       *namelist;
-       Oid                     fargtypes[1];   /* dummy */
        Oid                     procOid;
        HeapTuple       procTup;
        Form_pg_proc procStruct;
@@ -616,7 +615,7 @@ call_pltcl_start_proc(Oid prolang, bool pltrusted)
 
        /* Parse possibly-qualified identifier and look up the function */
        namelist = stringToQualifiedNameList(start_proc);
-       procOid = LookupFuncName(namelist, 0, fargtypes, false);
+       procOid = LookupFuncName(namelist, 0, NULL, false);
 
        /* Current user must have permission to call function */
        aclresult = pg_proc_aclcheck(procOid, GetUserId(), ACL_EXECUTE);