diff options
Diffstat (limited to 'src/backend/parser/parse_func.c')
-rw-r--r-- | src/backend/parser/parse_func.c | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/src/backend/parser/parse_func.c b/src/backend/parser/parse_func.c index eb4884accbb..e24007a4393 100644 --- a/src/backend/parser/parse_func.c +++ b/src/backend/parser/parse_func.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.74 2000/03/14 23:06:32 thomas Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.75 2000/03/16 06:35:07 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -68,7 +68,6 @@ static Oid *func_select_candidate(int nargs, Oid *input_typeids, static int agg_get_candidates(char *aggname, Oid typeId, CandidateList *candidates); static Oid agg_select_candidate(Oid typeid, CandidateList candidates); -#define ISCOMPLEX(type) (typeidTypeRelid(type) ? true : false) /* ** ParseNestedFuncOrColumn @@ -1360,6 +1359,40 @@ gen_cross_product(InhPaths *arginh, int nargs) } +/* + * Given two type OIDs, determine whether the first is a complex type + * (class type) that inherits from the second. + */ +bool +typeInheritsFrom(Oid subclassTypeId, Oid superclassTypeId) +{ + Oid relid; + Oid *supervec; + int nsupers, + i; + bool result; + + if (!ISCOMPLEX(subclassTypeId) || !ISCOMPLEX(superclassTypeId)) + return false; + relid = typeidTypeRelid(subclassTypeId); + if (relid == InvalidOid) + return false; + nsupers = find_inheritors(relid, &supervec); + result = false; + for (i = 0; i < nsupers; i++) + { + if (supervec[i] == superclassTypeId) + { + result = true; + break; + } + } + if (supervec) + pfree(supervec); + return result; +} + + /* make_arguments() * Given the number and types of arguments to a function, and the * actual arguments and argument types, do the necessary typecasting. |