Merge pull request #2533 from citusdata/fix_function_oid

Fix function oid
pull/2538/head
Burak Velioglu 2018-12-10 14:33:50 +03:00 committed by GitHub
commit 7aaf6b2cb3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 35 additions and 6 deletions

View File

@ -454,8 +454,14 @@ QueryContainsAggregateWithHLL(Query *query)
Oid hllId = get_extension_oid(HLL_EXTENSION_NAME, false);
Oid hllSchemaOid = get_extension_schema(hllId);
const char *hllSchemaName = get_namespace_name(hllSchemaOid);
Oid addFunctionId = FunctionOid(hllSchemaName, HLL_ADD_AGGREGATE_NAME,
argCount);
/*
* If the obtained oid is InvalidOid for addFunctionId, that means
* we don't have an hll_add_agg function with the given argument count.
* So, we don't need to double check whether the obtained id is valid.
*/
Oid addFunctionId = FunctionOidExtended(hllSchemaName, HLL_ADD_AGGREGATE_NAME,
argCount, true);
Oid unionFunctionId = FunctionOid(hllSchemaName, HLL_UNION_AGGREGATE_NAME, 1);
if (aggref->aggfnoid == addFunctionId || aggref->aggfnoid == unionFunctionId)

View File

@ -18,11 +18,27 @@
#endif
/*
* FunctionOid looks for a function that has the given name and the given number
* of arguments, and returns the corresponding function's oid.
* FunctionOid searches for a function that has the given name and the given
* number of arguments, and returns the corresponding function's oid. The
* function reports error if the target function is not found, or it found more
* matching instances.
*/
Oid
FunctionOid(const char *schemaName, const char *functionName, int argumentCount)
{
return FunctionOidExtended(schemaName, functionName, argumentCount, false);
}
/*
* FunctionOidExtended searches for a given function identified by schema,
* functionName, and argumentCount. It reports error if the function is not
* found or there are more than one match. If the missingOK parameter is set
* and there are no matches, then the function returns InvalidOid.
*/
Oid
FunctionOidExtended(const char *schemaName, const char *functionName, int argumentCount,
bool missingOK)
{
FuncCandidateList functionList = NULL;
Oid functionOid = InvalidOid;
@ -32,14 +48,18 @@ FunctionOid(const char *schemaName, const char *functionName, int argumentCount)
List *argumentList = NIL;
const bool findVariadics = false;
const bool findDefaults = false;
const bool missingOK = true;
functionList = FuncnameGetCandidates(qualifiedFunctionNameList, argumentCount,
argumentList, findVariadics,
findDefaults, missingOK);
findDefaults, true);
if (functionList == NULL)
{
if (missingOK)
{
return InvalidOid;
}
ereport(ERROR, (errcode(ERRCODE_UNDEFINED_FUNCTION),
errmsg("function \"%s\" does not exist", functionName)));
}
@ -51,6 +71,7 @@ FunctionOid(const char *schemaName, const char *functionName, int argumentCount)
/* get function oid from function list's head */
functionOid = functionList->oid;
return functionOid;
}

View File

@ -14,5 +14,7 @@
/* Function declaration for getting oid for the given function name */
extern Oid FunctionOid(const char *schemaName, const char *functionName,
int argumentCount);
extern Oid FunctionOidExtended(const char *schemaName, const char *functionName, int
argumentCount, bool missingOK);
extern ReturnSetInfo * FunctionCallGetTupleStore1(PGFunction function, Oid functionId,
Datum argument);