Have LookupFuncName accept NULL argtypes for 0 args
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Tue, 12 Nov 2019 20:04:46 +0000 (17:04 -0300)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
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);