diff options
author | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2019-11-12 17:04:46 -0300 |
---|---|---|
committer | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2019-11-12 17:06:58 -0300 |
commit | dcb7d3cafa3197c5425c129ba0dc5eddd23c0532 (patch) | |
tree | 9cba76bdf06895c94fc2f8e4528c8c7061af60ad /src/backend/parser/parse_func.c | |
parent | 8c951687f58ad604be13e6addfd56446afb36e13 (diff) | |
download | postgresql-dcb7d3cafa3197c5425c129ba0dc5eddd23c0532.tar.gz postgresql-dcb7d3cafa3197c5425c129ba0dc5eddd23c0532.zip |
Have LookupFuncName accept NULL argtypes for 0 args
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
Diffstat (limited to 'src/backend/parser/parse_func.c')
-rw-r--r-- | src/backend/parser/parse_func.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/src/backend/parser/parse_func.c b/src/backend/parser/parse_func.c index 8e926539e6a..9d9efc2cc24 100644 --- a/src/backend/parser/parse_func.c +++ b/src/backend/parser/parse_func.c @@ -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; } |