bool initialize_constants(constants_t *constants) { #define CheckOid(o) if(constants->o==InvalidOid) return false constants->OID_SCHEMA_PROVSQL = get_namespace_oid("provsql", true); CheckOid(OID_SCHEMA_PROVSQL); constants->OID_TYPE_PROVENANCE_TOKEN = GetSysCacheOid2(TYPENAMENSP,CStringGetDatum("provenance_token"),ObjectIdGetDatum(constants->OID_SCHEMA_PROVSQL)); CheckOid(OID_TYPE_PROVENANCE_TOKEN); constants->OID_TYPE_UUID = TypenameGetTypid("uuid"); CheckOid(OID_TYPE_UUID); constants->OID_TYPE_UUID_ARRAY = TypenameGetTypid("_uuid"); CheckOid(OID_TYPE_UUID_ARRAY); constants->OID_TYPE_INT = TypenameGetTypid("int4"); CheckOid(OID_TYPE_INT); constants->OID_TYPE_INT_ARRAY = TypenameGetTypid("_int4"); CheckOid(OID_TYPE_INT_ARRAY); constants->OID_FUNCTION_PROVENANCE_AGG_PLUS = GetFuncOid("provenance_agg"); CheckOid(OID_FUNCTION_PROVENANCE_AGG_PLUS); constants->OID_FUNCTION_PROVENANCE_TIMES = GetFuncOid("provenance_times"); CheckOid(OID_FUNCTION_PROVENANCE_TIMES); constants->OID_FUNCTION_PROVENANCE_MONUS = GetFuncOid("provenance_monus"); CheckOid(OID_FUNCTION_PROVENANCE_MONUS); constants->OID_FUNCTION_PROVENANCE_PROJECT = GetFuncOid("provenance_project"); CheckOid(OID_FUNCTION_PROVENANCE_PROJECT); constants->OID_FUNCTION_PROVENANCE_EQ = GetFuncOid("provenance_eq"); CheckOid(OID_FUNCTION_PROVENANCE_EQ); constants->OID_FUNCTION_PROVENANCE = GetFuncOid("provenance"); CheckOid(OID_FUNCTION_PROVENANCE); return true; }
static Oid get_function_oid(const char *funcname, const char *argtype, const char *nspname) { #ifndef PROCNAMENSP Oid typid; Oid nspid; Oid funcid; Oid oids[1]; oidvector *oid_v; HeapTuple tup; if (argtype) { typid = TypenameGetTypid(argtype); elog(DEBUG1, "get_function_oid: %s typid: %d", argtype, typid); oids[0] = typid; oid_v = buildoidvector(oids, 1); } else { oid_v = buildoidvector(NULL, 0); } #if !defined(PG_VERSION_NUM) || (PG_VERSION_NUM < 90300) nspid = LookupExplicitNamespace(nspname); #else /* * LookupExplicitNamespace() of PostgreSQL 9.3 or later, has third * argument "missing_ok" which suppresses ERROR exception, but returns * invlaid_oid. See include/catalog/namespace.h */ nspid = LookupExplicitNamespace(nspname, false); #endif elog(DEBUG1, "get_function_oid: oid of \"%s\": %d", nspname, nspid); tup = SearchSysCache(PROCNAMEARGSNSP, PointerGetDatum(funcname), PointerGetDatum(oid_v), ObjectIdGetDatum(nspid), 0); if (HeapTupleIsValid(tup)) { funcid = HeapTupleGetOid(tup); elog(DEBUG1, "get_function_oid: oid of \"%s\": %d", funcname, funcid); ReleaseSysCache(tup); return funcid; } #endif return 0; }