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

📄 define.c

📁 关系型数据库 Postgresql 6.5.2
💻 C
📖 第 1 页 / 共 2 页
字号:
												 * associative */	char	   *functionName = NULL;	/* function for operator */	char	   *typeName1 = NULL;		/* first type name */	char	   *typeName2 = NULL;		/* second type name */	char	   *commutatorName = NULL;	/* optional commutator operator										 * name */	char	   *negatorName = NULL;		/* optional negator operator name */	char	   *restrictionName = NULL; /* optional restrict. sel.										 * procedure */	char	   *joinName = NULL;/* optional join sel. procedure name */	char	   *sortName1 = NULL;		/* optional first sort operator */	char	   *sortName2 = NULL;		/* optional second sort operator */	List	   *pl;	/*	 * loop over the definition list and extract the information we need.	 */	foreach(pl, parameters)	{		DefElem    *defel = (DefElem *) lfirst(pl);		if (!strcasecmp(defel->defname, "leftarg"))		{			/* see gram.y, must be setof */			if (nodeTag(defel->arg) == T_TypeName)				elog(ERROR, "setof type not implemented for leftarg");			if (nodeTag(defel->arg) == T_String)				typeName1 = defGetString(defel);			else				elog(ERROR, "type for leftarg is malformed.");		}		else if (!strcasecmp(defel->defname, "rightarg"))		{			/* see gram.y, must be setof */			if (nodeTag(defel->arg) == T_TypeName)				elog(ERROR, "setof type not implemented for rightarg");			if (nodeTag(defel->arg) == T_String)				typeName2 = defGetString(defel);			else				elog(ERROR, "type for rightarg is malformed.");		}		else if (!strcasecmp(defel->defname, "procedure"))			functionName = defGetString(defel);		else if (!strcasecmp(defel->defname, "precedence"))		{			/* NOT IMPLEMENTED (never worked in v4.2) */			elog(NOTICE, "CREATE OPERATOR: precedence not implemented");		}		else if (!strcasecmp(defel->defname, "associativity"))		{			/* NOT IMPLEMENTED (never worked in v4.2) */			elog(NOTICE, "CREATE OPERATOR: associativity not implemented");		}		else if (!strcasecmp(defel->defname, "commutator"))			commutatorName = defGetString(defel);		else if (!strcasecmp(defel->defname, "negator"))			negatorName = defGetString(defel);		else if (!strcasecmp(defel->defname, "restrict"))			restrictionName = defGetString(defel);		else if (!strcasecmp(defel->defname, "join"))			joinName = defGetString(defel);		else if (!strcasecmp(defel->defname, "hashes"))			canHash = TRUE;		else if (!strcasecmp(defel->defname, "sort1"))		{			/* ----------------			 * XXX ( ... [ , sort1 = oprname ] [ , sort2 = oprname ] ... )			 * XXX is undocumented in the reference manual source as of			 * 89/8/22.			 * ----------------			 */			sortName1 = defGetString(defel);		}		else if (!strcasecmp(defel->defname, "sort2"))			sortName2 = defGetString(defel);		else		{			elog(NOTICE, "DefineOperator: attribute \"%s\" not recognized",				 defel->defname);		}	}	/*	 * make sure we have our required definitions	 */	if (functionName == NULL)		elog(ERROR, "Define: \"procedure\" unspecified");	/* ----------------	 *	now have OperatorCreate do all the work..	 * ----------------	 */	OperatorCreate(oprName,		/* operator name */				   typeName1,	/* first type name */				   typeName2,	/* second type name */				   functionName,/* function for operator */				   precedence,	/* operator precedence */				   isLeftAssociative,	/* operator is left associative */				   commutatorName,		/* optional commutator operator										 * name */				   negatorName, /* optional negator operator name */				   restrictionName,		/* optional restrict. sel.										 * procedure */				   joinName,	/* optional join sel. procedure name */				   canHash,		/* operator hashes */				   sortName1,	/* optional first sort operator */				   sortName2);	/* optional second sort operator */}/* ------------------- *	DefineAggregate * ------------------ */voidDefineAggregate(char *aggName, List *parameters){	char	   *stepfunc1Name = NULL;	char	   *stepfunc2Name = NULL;	char	   *finalfuncName = NULL;	char	   *baseType = NULL;	char	   *stepfunc1Type = NULL;	char	   *stepfunc2Type = NULL;	char	   *init1 = NULL;	char	   *init2 = NULL;	List	   *pl;	foreach(pl, parameters)	{		DefElem    *defel = (DefElem *) lfirst(pl);		/*		 * sfunc1		 */		if (!strcasecmp(defel->defname, "sfunc1"))			stepfunc1Name = defGetString(defel);		else if (!strcasecmp(defel->defname, "basetype"))			baseType = defGetString(defel);		else if (!strcasecmp(defel->defname, "stype1"))		{			stepfunc1Type = defGetString(defel);			/*			 * sfunc2			 */		}		else if (!strcasecmp(defel->defname, "sfunc2"))			stepfunc2Name = defGetString(defel);		else if (!strcasecmp(defel->defname, "stype2"))		{			stepfunc2Type = defGetString(defel);			/*			 * final			 */		}		else if (!strcasecmp(defel->defname, "finalfunc"))		{			finalfuncName = defGetString(defel);			/*			 * initial conditions			 */		}		else if (!strcasecmp(defel->defname, "initcond1"))			init1 = defGetString(defel);		else if (!strcasecmp(defel->defname, "initcond2"))			init2 = defGetString(defel);		else		{			elog(NOTICE, "DefineAggregate: attribute \"%s\" not recognized",				 defel->defname);		}	}	/*	 * make sure we have our required definitions	 */	if (baseType == NULL)		elog(ERROR, "Define: \"basetype\" unspecified");	if (stepfunc1Name != NULL)	{		if (stepfunc1Type == NULL)			elog(ERROR, "Define: \"stype1\" unspecified");	}	if (stepfunc2Name != NULL)	{		if (stepfunc2Type == NULL)			elog(ERROR, "Define: \"stype2\" unspecified");	}	/*	 * Most of the argument-checking is done inside of AggregateCreate	 */	AggregateCreate(aggName,	/* aggregate name */					stepfunc1Name,		/* first step function name */					stepfunc2Name,		/* second step function name */					finalfuncName,		/* final function name */					baseType,	/* type of object being aggregated */					stepfunc1Type,		/* return type of first function */					stepfunc2Type,		/* return type of second function */					init1,		/* first initial condition */					init2);		/* second initial condition */	/* XXX free palloc'd memory */}/* * DefineType *		Registers a new type. * */voidDefineType(char *typeName, List *parameters){	int16		internalLength = 0;		/* int2 */	int16		externalLength = 0;		/* int2 */	char	   *elemName = NULL;	char	   *inputName = NULL;	char	   *outputName = NULL;	char	   *sendName = NULL;	char	   *receiveName = NULL;	char	   *defaultValue = NULL;	/* Datum */	bool		byValue = false;	char		delimiter = DEFAULT_TYPDELIM;	char	   *shadow_type;	List	   *pl;	char		alignment = 'i';/* default alignment */	/*	 * Type names can only be 15 characters long, so that the shadow type	 * can be created using the 16th character as necessary.	 */	if (strlen(typeName) >= (NAMEDATALEN - 1))	{		elog(ERROR, "DefineType: type names must be %d characters or less",			 NAMEDATALEN - 1);	}	foreach(pl, parameters)	{		DefElem    *defel = (DefElem *) lfirst(pl);		if (!strcasecmp(defel->defname, "internallength"))			internalLength = defGetTypeLength(defel);		else if (!strcasecmp(defel->defname, "externallength"))			externalLength = defGetTypeLength(defel);		else if (!strcasecmp(defel->defname, "input"))			inputName = defGetString(defel);		else if (!strcasecmp(defel->defname, "output"))			outputName = defGetString(defel);		else if (!strcasecmp(defel->defname, "send"))			sendName = defGetString(defel);		else if (!strcasecmp(defel->defname, "delimiter"))		{			char	   *p = defGetString(defel);			delimiter = p[0];		}		else if (!strcasecmp(defel->defname, "receive"))			receiveName = defGetString(defel);		else if (!strcasecmp(defel->defname, "element"))			elemName = defGetString(defel);		else if (!strcasecmp(defel->defname, "default"))			defaultValue = defGetString(defel);		else if (!strcasecmp(defel->defname, "passedbyvalue"))			byValue = true;		else if (!strcasecmp(defel->defname, "alignment"))		{			char	   *a = defGetString(defel);			if (!strcasecmp(a, "double"))				alignment = 'd';			else if (!strcasecmp(a, "int"))				alignment = 'i';			else			{				elog(ERROR, "DefineType: \"%s\" alignment  not recognized",					 a);			}		}		else		{			elog(NOTICE, "DefineType: attribute \"%s\" not recognized",				 defel->defname);		}	}	/*	 * make sure we have our required definitions	 */	if (inputName == NULL)		elog(ERROR, "Define: \"input\" unspecified");	if (outputName == NULL)		elog(ERROR, "Define: \"output\" unspecified");	/* ----------------	 *	now have TypeCreate do all the real work.	 * ----------------	 */	TypeCreate(typeName,		/* type name */			   InvalidOid,		/* relation oid (n/a here) */			   internalLength,	/* internal size */			   externalLength,	/* external size */			   'b',				/* type-type (base type) */			   delimiter,		/* array element delimiter */			   inputName,		/* input procedure */			   outputName,		/* output procedure */			   receiveName,		/* receive procedure */			   sendName,		/* send procedure */			   elemName,		/* element type name */			   defaultValue,	/* default type value */			   byValue,			/* passed by value */			   alignment);	/* ----------------	 *	When we create a true type (as opposed to a complex type)	 *	we need to have an shadow array entry for it in pg_type as well.	 * ----------------	 */	shadow_type = makeArrayTypeName(typeName);	TypeCreate(shadow_type,		/* type name */			   InvalidOid,		/* relation oid (n/a here) */			   -1,				/* internal size */			   -1,				/* external size */			   'b',				/* type-type (base type) */			   DEFAULT_TYPDELIM,/* array element delimiter */			   "array_in",		/* input procedure */			   "array_out",		/* output procedure */			   "array_in",		/* receive procedure */			   "array_out",		/* send procedure */			   typeName,		/* element type name */			   defaultValue,	/* default type value */			   false,			/* never passed by value */			   alignment);	pfree(shadow_type);}static char *defGetString(DefElem *def){	if (nodeTag(def->arg) != T_String)		elog(ERROR, "Define: \"%s\" = what?", def->defname);	return strVal(def->arg);}static intdefGetTypeLength(DefElem *def){	if (nodeTag(def->arg) == T_Integer)		return intVal(def->arg);	else if (nodeTag(def->arg) == T_String &&			 !strcasecmp(strVal(def->arg), "variable"))		return -1;				/* variable length */	elog(ERROR, "Define: \"%s\" = what?", def->defname);	return -1;}

⌨️ 快捷键说明

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