⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 regproc.c

📁 postgresql8.3.4源码,开源数据库
💻 C
📖 第 1 页 / 共 3 页
字号:
	Oid			oprid = PG_GETARG_OID(0);	char	   *result;	HeapTuple	opertup;	if (oprid == InvalidOid)	{		result = pstrdup("0");		PG_RETURN_CSTRING(result);	}	opertup = SearchSysCache(OPEROID,							 ObjectIdGetDatum(oprid),							 0, 0, 0);	if (HeapTupleIsValid(opertup))	{		Form_pg_operator operform = (Form_pg_operator) GETSTRUCT(opertup);		char	   *oprname = NameStr(operform->oprname);		/*		 * In bootstrap mode, skip the fancy namespace stuff and just return		 * the oper name.  (This path is only needed for debugging output		 * anyway.)		 */		if (IsBootstrapProcessingMode())			result = pstrdup(oprname);		else		{			FuncCandidateList clist;			/*			 * Would this oper be found (uniquely!) by regoperin? If not,			 * qualify it.			 */			clist = OpernameGetCandidates(list_make1(makeString(oprname)),										  '\0');			if (clist != NULL && clist->next == NULL &&				clist->oid == oprid)				result = pstrdup(oprname);			else			{				const char *nspname;				nspname = get_namespace_name(operform->oprnamespace);				nspname = quote_identifier(nspname);				result = (char *) palloc(strlen(nspname) + strlen(oprname) + 2);				sprintf(result, "%s.%s", nspname, oprname);			}		}		ReleaseSysCache(opertup);	}	else	{		/*		 * If OID doesn't match any pg_operator entry, return it numerically		 */		result = (char *) palloc(NAMEDATALEN);		snprintf(result, NAMEDATALEN, "%u", oprid);	}	PG_RETURN_CSTRING(result);}/* *		regoperrecv			- converts external binary format to regoper */Datumregoperrecv(PG_FUNCTION_ARGS){	/* Exactly the same as oidrecv, so share code */	return oidrecv(fcinfo);}/* *		regopersend			- converts regoper to binary format */Datumregopersend(PG_FUNCTION_ARGS){	/* Exactly the same as oidsend, so share code */	return oidsend(fcinfo);}/* * regoperatorin		- converts "oprname(args)" to operator OID * * We also accept a numeric OID, for symmetry with the output routine. * * '0' signifies unknown (OID 0).  In all other cases, the input must * match an existing pg_operator entry. */Datumregoperatorin(PG_FUNCTION_ARGS){	char	   *opr_name_or_oid = PG_GETARG_CSTRING(0);	Oid			result;	List	   *names;	int			nargs;	Oid			argtypes[FUNC_MAX_ARGS];	/* '0' ? */	if (strcmp(opr_name_or_oid, "0") == 0)		PG_RETURN_OID(InvalidOid);	/* Numeric OID? */	if (opr_name_or_oid[0] >= '0' &&		opr_name_or_oid[0] <= '9' &&		strspn(opr_name_or_oid, "0123456789") == strlen(opr_name_or_oid))	{		result = DatumGetObjectId(DirectFunctionCall1(oidin,										  CStringGetDatum(opr_name_or_oid)));		PG_RETURN_OID(result);	}	/*	 * Else it's a name and arguments.  Parse the name and arguments, look up	 * potential matches in the current namespace search list, and scan to see	 * which one exactly matches the given argument types.	(There will not be	 * more than one match.)	 *	 * XXX at present, this code will not work in bootstrap mode, hence this	 * datatype cannot be used for any system column that needs to receive	 * data during bootstrap.	 */	parseNameAndArgTypes(opr_name_or_oid, true, &names, &nargs, argtypes);	if (nargs == 1)		ereport(ERROR,				(errcode(ERRCODE_UNDEFINED_PARAMETER),				 errmsg("missing argument"),				 errhint("Use NONE to denote the missing argument of a unary operator.")));	if (nargs != 2)		ereport(ERROR,				(errcode(ERRCODE_TOO_MANY_ARGUMENTS),				 errmsg("too many arguments"),				 errhint("Provide two argument types for operator.")));	result = OpernameGetOprid(names, argtypes[0], argtypes[1]);	if (!OidIsValid(result))		ereport(ERROR,				(errcode(ERRCODE_UNDEFINED_FUNCTION),				 errmsg("operator does not exist: %s", opr_name_or_oid)));	PG_RETURN_OID(result);}/* * format_operator		- converts operator OID to "opr_name(args)" * * This exports the useful functionality of regoperatorout for use * in other backend modules.  The result is a palloc'd string. */char *format_operator(Oid operator_oid){	char	   *result;	HeapTuple	opertup;	opertup = SearchSysCache(OPEROID,							 ObjectIdGetDatum(operator_oid),							 0, 0, 0);	if (HeapTupleIsValid(opertup))	{		Form_pg_operator operform = (Form_pg_operator) GETSTRUCT(opertup);		char	   *oprname = NameStr(operform->oprname);		char	   *nspname;		StringInfoData buf;		/* XXX no support here for bootstrap mode */		initStringInfo(&buf);		/*		 * Would this oper be found (given the right args) by regoperatorin?		 * If not, we need to qualify it.		 */		if (!OperatorIsVisible(operator_oid))		{			nspname = get_namespace_name(operform->oprnamespace);			appendStringInfo(&buf, "%s.",							 quote_identifier(nspname));		}		appendStringInfo(&buf, "%s(", oprname);		if (operform->oprleft)			appendStringInfo(&buf, "%s,",							 format_type_be(operform->oprleft));		else			appendStringInfo(&buf, "NONE,");		if (operform->oprright)			appendStringInfo(&buf, "%s)",							 format_type_be(operform->oprright));		else			appendStringInfo(&buf, "NONE)");		result = buf.data;		ReleaseSysCache(opertup);	}	else	{		/*		 * If OID doesn't match any pg_operator entry, return it numerically		 */		result = (char *) palloc(NAMEDATALEN);		snprintf(result, NAMEDATALEN, "%u", operator_oid);	}	return result;}/* * regoperatorout		- converts operator OID to "opr_name(args)" */Datumregoperatorout(PG_FUNCTION_ARGS){	Oid			oprid = PG_GETARG_OID(0);	char	   *result;	if (oprid == InvalidOid)		result = pstrdup("0");	else		result = format_operator(oprid);	PG_RETURN_CSTRING(result);}/* *		regoperatorrecv			- converts external binary format to regoperator */Datumregoperatorrecv(PG_FUNCTION_ARGS){	/* Exactly the same as oidrecv, so share code */	return oidrecv(fcinfo);}/* *		regoperatorsend			- converts regoperator to binary format */Datumregoperatorsend(PG_FUNCTION_ARGS){	/* Exactly the same as oidsend, so share code */	return oidsend(fcinfo);}/* * regclassin		- converts "classname" to class OID * * We also accept a numeric OID, for symmetry with the output routine. * * '-' signifies unknown (OID 0).  In all other cases, the input must * match an existing pg_class entry. */Datumregclassin(PG_FUNCTION_ARGS){	char	   *class_name_or_oid = PG_GETARG_CSTRING(0);	Oid			result = InvalidOid;	List	   *names;	/* '-' ? */	if (strcmp(class_name_or_oid, "-") == 0)		PG_RETURN_OID(InvalidOid);	/* Numeric OID? */	if (class_name_or_oid[0] >= '0' &&		class_name_or_oid[0] <= '9' &&		strspn(class_name_or_oid, "0123456789") == strlen(class_name_or_oid))	{		result = DatumGetObjectId(DirectFunctionCall1(oidin,										CStringGetDatum(class_name_or_oid)));		PG_RETURN_OID(result);	}	/* Else it's a name, possibly schema-qualified */	/*	 * In bootstrap mode we assume the given name is not schema-qualified, and	 * just search pg_class for a match.  This is needed for initializing	 * other system catalogs (pg_namespace may not exist yet, and certainly	 * there are no schemas other than pg_catalog).	 */	if (IsBootstrapProcessingMode())	{		Relation	hdesc;		ScanKeyData skey[1];		SysScanDesc sysscan;		HeapTuple	tuple;		ScanKeyInit(&skey[0],					Anum_pg_class_relname,					BTEqualStrategyNumber, F_NAMEEQ,					CStringGetDatum(class_name_or_oid));		hdesc = heap_open(RelationRelationId, AccessShareLock);		sysscan = systable_beginscan(hdesc, ClassNameNspIndexId, true,									 SnapshotNow, 1, skey);		if (HeapTupleIsValid(tuple = systable_getnext(sysscan)))			result = HeapTupleGetOid(tuple);		else			ereport(ERROR,					(errcode(ERRCODE_UNDEFINED_TABLE),			   errmsg("relation \"%s\" does not exist", class_name_or_oid)));		/* We assume there can be only one match */		systable_endscan(sysscan);		heap_close(hdesc, AccessShareLock);		PG_RETURN_OID(result);	}	/*	 * Normal case: parse the name into components and see if it matches any	 * pg_class entries in the current search path.	 */	names = stringToQualifiedNameList(class_name_or_oid);	result = RangeVarGetRelid(makeRangeVarFromNameList(names), false);	PG_RETURN_OID(result);}/* * regclassout		- converts class OID to "class_name" */Datumregclassout(PG_FUNCTION_ARGS){	Oid			classid = PG_GETARG_OID(0);	char	   *result;	HeapTuple	classtup;	if (classid == InvalidOid)	{		result = pstrdup("-");		PG_RETURN_CSTRING(result);	}	classtup = SearchSysCache(RELOID,							  ObjectIdGetDatum(classid),							  0, 0, 0);	if (HeapTupleIsValid(classtup))	{		Form_pg_class classform = (Form_pg_class) GETSTRUCT(classtup);		char	   *classname = NameStr(classform->relname);		/*		 * In bootstrap mode, skip the fancy namespace stuff and just return		 * the class name.	(This path is only needed for debugging output		 * anyway.)		 */		if (IsBootstrapProcessingMode())			result = pstrdup(classname);		else		{			char	   *nspname;			/*			 * Would this class be found by regclassin? If not, qualify it.			 */			if (RelationIsVisible(classid))				nspname = NULL;			else				nspname = get_namespace_name(classform->relnamespace);			result = quote_qualified_identifier(nspname, classname);		}		ReleaseSysCache(classtup);	}	else	{		/* If OID doesn't match any pg_class entry, return it numerically */		result = (char *) palloc(NAMEDATALEN);		snprintf(result, NAMEDATALEN, "%u", classid);	}	PG_RETURN_CSTRING(result);}/* *		regclassrecv			- converts external binary format to regclass */Datumregclassrecv(PG_FUNCTION_ARGS){	/* Exactly the same as oidrecv, so share code */	return oidrecv(fcinfo);}/* *		regclasssend			- converts regclass to binary format */Datumregclasssend(PG_FUNCTION_ARGS){	/* Exactly the same as oidsend, so share code */	return oidsend(fcinfo);}/* * regtypein		- converts "typename" to type OID * * We also accept a numeric OID, for symmetry with the output routine. * * '-' signifies unknown (OID 0).  In all other cases, the input must * match an existing pg_type entry. * * In bootstrap mode the name must just equal some existing name in pg_type. * In normal mode the type name can be specified using the full type syntax * recognized by the parser; for example, DOUBLE PRECISION and INTEGER[] will * work and be translated to the correct type names.  (We ignore any typmod * info generated by the parser, however.) */Datumregtypein(PG_FUNCTION_ARGS){	char	   *typ_name_or_oid = PG_GETARG_CSTRING(0);	Oid			result = InvalidOid;	int32		typmod;	/* '-' ? */	if (strcmp(typ_name_or_oid, "-") == 0)		PG_RETURN_OID(InvalidOid);	/* Numeric OID? */	if (typ_name_or_oid[0] >= '0' &&		typ_name_or_oid[0] <= '9' &&		strspn(typ_name_or_oid, "0123456789") == strlen(typ_name_or_oid))	{		result = DatumGetObjectId(DirectFunctionCall1(oidin,										  CStringGetDatum(typ_name_or_oid)));		PG_RETURN_OID(result);	}	/* Else it's a type name, possibly schema-qualified or decorated */	/*	 * In bootstrap mode we assume the given name is not schema-qualified, and	 * just search pg_type for a match.  This is needed for initializing other	 * system catalogs (pg_namespace may not exist yet, and certainly there	 * are no schemas other than pg_catalog).	 */	if (IsBootstrapProcessingMode())	{		Relation	hdesc;		ScanKeyData skey[1];		SysScanDesc sysscan;		HeapTuple	tuple;		ScanKeyInit(&skey[0],					Anum_pg_type_typname,					BTEqualStrategyNumber, F_NAMEEQ,					CStringGetDatum(typ_name_or_oid));		hdesc = heap_open(TypeRelationId, AccessShareLock);		sysscan = systable_beginscan(hdesc, TypeNameNspIndexId, true,									 SnapshotNow, 1, skey);		if (HeapTupleIsValid(tuple = systable_getnext(sysscan)))			result = HeapTupleGetOid(tuple);		else			ereport(ERROR,					(errcode(ERRCODE_UNDEFINED_OBJECT),					 errmsg("type \"%s\" does not exist", typ_name_or_oid)));		/* We assume there can be only one match */		systable_endscan(sysscan);		heap_close(hdesc, AccessShareLock);		PG_RETURN_OID(result);	}	/*	 * Normal case: invoke the full parser to deal with special cases such as	 * array syntax.	 */	parseTypeString(typ_name_or_oid, &result, &typmod);	PG_RETURN_OID(result);}/* * regtypeout		- converts type OID to "typ_name" */Datumregtypeout(PG_FUNCTION_ARGS){

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -