Skip to content

Commit

Permalink
Merge pull request #2533 from citusdata/fix_function_oid
Browse files Browse the repository at this point in the history
Fix function oid
  • Loading branch information
velioglu committed Dec 10, 2018
2 parents 4af40ee + 90704d9 commit 7aaf6b2
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 6 deletions.
10 changes: 8 additions & 2 deletions src/backend/distributed/planner/multi_master_planner.c
Expand Up @@ -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)
Expand Down
29 changes: 25 additions & 4 deletions src/backend/distributed/utils/function_utils.c
Expand Up @@ -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;
Expand All @@ -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)));
}
Expand All @@ -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;
}

Expand Down
2 changes: 2 additions & 0 deletions src/include/distributed/function_utils.h
Expand Up @@ -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);

0 comments on commit 7aaf6b2

Please sign in to comment.