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

📄 regproc.c

📁 PostgreSQL 8.1.4的源码 适用于Linux下的开源数据库系统
💻 C
📖 第 1 页 / 共 3 页
字号:
	 * certainly there are no schemas other than pg_catalog).	 */	if (IsBootstrapProcessingMode())	{		int			matches = 0;		Relation	hdesc;		ScanKeyData skey[1];		SysScanDesc sysscan;		HeapTuple	tuple;		ScanKeyInit(&skey[0],					Anum_pg_operator_oprname,					BTEqualStrategyNumber, F_NAMEEQ,					CStringGetDatum(opr_name_or_oid));		hdesc = heap_open(OperatorRelationId, AccessShareLock);		sysscan = systable_beginscan(hdesc, OperatorNameNspIndexId, true,									 SnapshotNow, 1, skey);		while (HeapTupleIsValid(tuple = systable_getnext(sysscan)))		{			result = HeapTupleGetOid(tuple);			if (++matches > 1)				break;		}		systable_endscan(sysscan);		heap_close(hdesc, AccessShareLock);		if (matches == 0)			ereport(ERROR,					(errcode(ERRCODE_UNDEFINED_FUNCTION),					 errmsg("operator does not exist: %s", opr_name_or_oid)));		else if (matches > 1)			ereport(ERROR,					(errcode(ERRCODE_AMBIGUOUS_FUNCTION),					 errmsg("more than one operator named %s",							opr_name_or_oid)));		PG_RETURN_OID(result);	}	/*	 * Normal case: parse the name into components and see if it matches any	 * pg_operator entries in the current search path.	 */	names = stringToQualifiedNameList(opr_name_or_oid, "regoperin");	clist = OpernameGetCandidates(names, '\0');	if (clist == NULL)		ereport(ERROR,				(errcode(ERRCODE_UNDEFINED_FUNCTION),				 errmsg("operator does not exist: %s", opr_name_or_oid)));	else if (clist->next != NULL)		ereport(ERROR,				(errcode(ERRCODE_AMBIGUOUS_FUNCTION),				 errmsg("more than one operator named %s",						opr_name_or_oid)));	result = clist->oid;	PG_RETURN_OID(result);}/* * regoperout		- converts operator OID to "opr_name" */Datumregoperout(PG_FUNCTION_ARGS){	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 = InvalidOid;	List	   *names;	int			nargs;	Oid			argtypes[FUNC_MAX_ARGS];	char		oprkind;	FuncCandidateList clist;	/* '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, "regoperatorin", 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.")));	if (argtypes[0] == InvalidOid)		oprkind = 'l';	else if (argtypes[1] == InvalidOid)		oprkind = 'r';	else		oprkind = 'b';	clist = OpernameGetCandidates(names, oprkind);	for (; clist; clist = clist->next)	{		if (memcmp(clist->args, argtypes, 2 * sizeof(Oid)) == 0)			break;	}	if (clist == NULL)		ereport(ERROR,				(errcode(ERRCODE_UNDEFINED_FUNCTION),				 errmsg("operator does not exist: %s", opr_name_or_oid)));	result = clist->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, "regclassin");	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)	{

⌨️ 快捷键说明

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