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 hllId = get_extension_oid(HLL_EXTENSION_NAME, false);
Oid hllSchemaOid = get_extension_schema(hllId); Oid hllSchemaOid = get_extension_schema(hllId);
const char *hllSchemaName = get_namespace_name(hllSchemaOid); 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); Oid unionFunctionId = FunctionOid(hllSchemaName, HLL_UNION_AGGREGATE_NAME, 1);
if (aggref->aggfnoid == addFunctionId || aggref->aggfnoid == unionFunctionId) if (aggref->aggfnoid == addFunctionId || aggref->aggfnoid == unionFunctionId)

View File

@ -18,11 +18,27 @@
#endif #endif
/* /*
* FunctionOid looks for a function that has the given name and the given number * FunctionOid searches for a function that has the given name and the given
* of arguments, and returns the corresponding function's oid. * 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 Oid
FunctionOid(const char *schemaName, const char *functionName, int argumentCount) 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; FuncCandidateList functionList = NULL;
Oid functionOid = InvalidOid; Oid functionOid = InvalidOid;
@ -32,14 +48,18 @@ FunctionOid(const char *schemaName, const char *functionName, int argumentCount)
List *argumentList = NIL; List *argumentList = NIL;
const bool findVariadics = false; const bool findVariadics = false;
const bool findDefaults = false; const bool findDefaults = false;
const bool missingOK = true;
functionList = FuncnameGetCandidates(qualifiedFunctionNameList, argumentCount, functionList = FuncnameGetCandidates(qualifiedFunctionNameList, argumentCount,
argumentList, findVariadics, argumentList, findVariadics,
findDefaults, missingOK); findDefaults, true);
if (functionList == NULL) if (functionList == NULL)
{ {
if (missingOK)
{
return InvalidOid;
}
ereport(ERROR, (errcode(ERRCODE_UNDEFINED_FUNCTION), ereport(ERROR, (errcode(ERRCODE_UNDEFINED_FUNCTION),
errmsg("function \"%s\" does not exist", functionName))); 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 */ /* get function oid from function list's head */
functionOid = functionList->oid; functionOid = functionList->oid;
return functionOid; return functionOid;
} }

View File

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