utility.c

来自「PostgreSQL7.4.6 for Linux」· C语言 代码 · 共 1,566 行 · 第 1/3 页

C
1,566
字号
 * where "dest" is passed on. */boolUtilityReturnsTuples(Node *parsetree){	switch (nodeTag(parsetree))	{		case T_FetchStmt:			{				FetchStmt  *stmt = (FetchStmt *) parsetree;				Portal		portal;				if (stmt->ismove)					return false;				portal = GetPortalByName(stmt->portalname);				if (!PortalIsValid(portal))					return false;		/* not our business to raise error */				return portal->tupDesc ? true : false;			}		case T_ExecuteStmt:			{				ExecuteStmt *stmt = (ExecuteStmt *) parsetree;				PreparedStatement *entry;				if (stmt->into)					return false;				entry = FetchPreparedStatement(stmt->name, false);				if (!entry)					return false;		/* not our business to raise error */				switch (ChoosePortalStrategy(entry->query_list))				{					case PORTAL_ONE_SELECT:						return true;					case PORTAL_UTIL_SELECT:						return true;					case PORTAL_MULTI_QUERY:						/* will not return tuples */						break;				}				return false;			}		case T_ExplainStmt:			return true;		case T_VariableShowStmt:			return true;		default:			return false;	}}/* * UtilityTupleDescriptor *		Fetch the actual output tuple descriptor for a utility statement *		for which UtilityReturnsTuples() previously returned "true". * * The returned descriptor is created in (or copied into) the current memory * context. */TupleDescUtilityTupleDescriptor(Node *parsetree){	switch (nodeTag(parsetree))	{		case T_FetchStmt:			{				FetchStmt  *stmt = (FetchStmt *) parsetree;				Portal		portal;				if (stmt->ismove)					return NULL;				portal = GetPortalByName(stmt->portalname);				if (!PortalIsValid(portal))					return NULL;	/* not our business to raise error */				return CreateTupleDescCopy(portal->tupDesc);			}		case T_ExecuteStmt:			{				ExecuteStmt *stmt = (ExecuteStmt *) parsetree;				PreparedStatement *entry;				if (stmt->into)					return NULL;				entry = FetchPreparedStatement(stmt->name, false);				if (!entry)					return NULL;	/* not our business to raise error */				return FetchPreparedStatementResultDesc(entry);			}		case T_ExplainStmt:			return ExplainResultDesc((ExplainStmt *) parsetree);		case T_VariableShowStmt:			{				VariableShowStmt *n = (VariableShowStmt *) parsetree;				return GetPGVariableResultDesc(n->name);			}		default:			return NULL;	}}/* * CreateCommandTag *		utility to get a string representation of the *		command operation, given a raw (un-analyzed) parsetree. * * This must handle all raw command types, but since the vast majority * of 'em are utility commands, it seems sensible to keep it here. * * NB: all result strings must be shorter than COMPLETION_TAG_BUFSIZE. * Also, the result must point at a true constant (permanent storage). */const char *CreateCommandTag(Node *parsetree){	const char *tag;	switch (nodeTag(parsetree))	{		case T_InsertStmt:			tag = "INSERT";			break;		case T_DeleteStmt:			tag = "DELETE";			break;		case T_UpdateStmt:			tag = "UPDATE";			break;		case T_SelectStmt:			tag = "SELECT";			break;		case T_TransactionStmt:			{				TransactionStmt *stmt = (TransactionStmt *) parsetree;				switch (stmt->kind)				{					case TRANS_STMT_BEGIN:						tag = "BEGIN";						break;					case TRANS_STMT_START:						tag = "START TRANSACTION";						break;					case TRANS_STMT_COMMIT:						tag = "COMMIT";						break;					case TRANS_STMT_ROLLBACK:						tag = "ROLLBACK";						break;					default:						tag = "???";						break;				}			}			break;		case T_DeclareCursorStmt:			tag = "DECLARE CURSOR";			break;		case T_ClosePortalStmt:			tag = "CLOSE CURSOR";			break;		case T_FetchStmt:			{				FetchStmt  *stmt = (FetchStmt *) parsetree;				tag = (stmt->ismove) ? "MOVE" : "FETCH";			}			break;		case T_CreateDomainStmt:			tag = "CREATE DOMAIN";			break;		case T_CreateSchemaStmt:			tag = "CREATE SCHEMA";			break;		case T_CreateStmt:			tag = "CREATE TABLE";			break;		case T_DropStmt:			switch (((DropStmt *) parsetree)->removeType)			{				case OBJECT_TABLE:					tag = "DROP TABLE";					break;				case OBJECT_SEQUENCE:					tag = "DROP SEQUENCE";					break;				case OBJECT_VIEW:					tag = "DROP VIEW";					break;				case OBJECT_INDEX:					tag = "DROP INDEX";					break;				case OBJECT_TYPE:					tag = "DROP TYPE";					break;				case OBJECT_DOMAIN:					tag = "DROP DOMAIN";					break;				case OBJECT_CONVERSION:					tag = "DROP CONVERSION";					break;				case OBJECT_SCHEMA:					tag = "DROP SCHEMA";					break;				default:					tag = "???";			}			break;		case T_TruncateStmt:			tag = "TRUNCATE TABLE";			break;		case T_CommentStmt:			tag = "COMMENT";			break;		case T_CopyStmt:			tag = "COPY";			break;		case T_RenameStmt:			switch (((RenameStmt *) parsetree)->renameType)			{				case OBJECT_AGGREGATE:					tag = "ALTER AGGREGATE";					break;				case OBJECT_CONVERSION:					tag = "ALTER CONVERSION";					break;				case OBJECT_DATABASE:					tag = "ALTER DATABASE";					break;				case OBJECT_FUNCTION:					tag = "ALTER FUNCTION";					break;				case OBJECT_GROUP:					tag = "ALTER GROUP";					break;				case OBJECT_LANGUAGE:					tag = "ALTER LANGUAGE";					break;				case OBJECT_OPCLASS:					tag = "ALTER OPERATOR CLASS";					break;				case OBJECT_SCHEMA:					tag = "ALTER SCHEMA";					break;				case OBJECT_TRIGGER:					tag = "ALTER TRIGGER";					break;				case OBJECT_USER:					tag = "ALTER USER";					break;				default:					tag = "ALTER TABLE";			}			break;		case T_AlterTableStmt:			tag = "ALTER TABLE";			break;		case T_AlterDomainStmt:			tag = "ALTER DOMAIN";			break;		case T_GrantStmt:			{				GrantStmt  *stmt = (GrantStmt *) parsetree;				tag = (stmt->is_grant) ? "GRANT" : "REVOKE";			}			break;		case T_DefineStmt:			switch (((DefineStmt *) parsetree)->kind)			{				case OBJECT_AGGREGATE:					tag = "CREATE AGGREGATE";					break;				case OBJECT_OPERATOR:					tag = "CREATE OPERATOR";					break;				case OBJECT_TYPE:					tag = "CREATE TYPE";					break;				default:					tag = "???";			}			break;		case T_CompositeTypeStmt:			tag = "CREATE TYPE";			break;		case T_ViewStmt:			tag = "CREATE VIEW";			break;		case T_CreateFunctionStmt:			tag = "CREATE FUNCTION";			break;		case T_IndexStmt:			tag = "CREATE INDEX";			break;		case T_RuleStmt:			tag = "CREATE RULE";			break;		case T_CreateSeqStmt:			tag = "CREATE SEQUENCE";			break;		case T_AlterSeqStmt:			tag = "ALTER SEQUENCE";			break;		case T_RemoveAggrStmt:			tag = "DROP AGGREGATE";			break;		case T_RemoveFuncStmt:			tag = "DROP FUNCTION";			break;		case T_RemoveOperStmt:			tag = "DROP OPERATOR";			break;		case T_CreatedbStmt:			tag = "CREATE DATABASE";			break;		case T_AlterDatabaseSetStmt:			tag = "ALTER DATABASE";			break;		case T_DropdbStmt:			tag = "DROP DATABASE";			break;		case T_NotifyStmt:			tag = "NOTIFY";			break;		case T_ListenStmt:			tag = "LISTEN";			break;		case T_UnlistenStmt:			tag = "UNLISTEN";			break;		case T_LoadStmt:			tag = "LOAD";			break;		case T_ClusterStmt:			tag = "CLUSTER";			break;		case T_VacuumStmt:			if (((VacuumStmt *) parsetree)->vacuum)				tag = "VACUUM";			else				tag = "ANALYZE";			break;		case T_ExplainStmt:			tag = "EXPLAIN";			break;		case T_VariableSetStmt:			tag = "SET";			break;		case T_VariableShowStmt:			tag = "SHOW";			break;		case T_VariableResetStmt:			tag = "RESET";			break;		case T_CreateTrigStmt:			tag = "CREATE TRIGGER";			break;		case T_DropPropertyStmt:			switch (((DropPropertyStmt *) parsetree)->removeType)			{				case OBJECT_TRIGGER:					tag = "DROP TRIGGER";					break;				case OBJECT_RULE:					tag = "DROP RULE";					break;				default:					tag = "???";			}			break;		case T_CreatePLangStmt:			tag = "CREATE LANGUAGE";			break;		case T_DropPLangStmt:			tag = "DROP LANGUAGE";			break;		case T_CreateUserStmt:			tag = "CREATE USER";			break;		case T_AlterUserStmt:			tag = "ALTER USER";			break;		case T_AlterUserSetStmt:			tag = "ALTER USER";			break;		case T_DropUserStmt:			tag = "DROP USER";			break;		case T_LockStmt:			tag = "LOCK TABLE";			break;		case T_ConstraintsSetStmt:			tag = "SET CONSTRAINTS";			break;		case T_CreateGroupStmt:			tag = "CREATE GROUP";			break;		case T_AlterGroupStmt:			tag = "ALTER GROUP";			break;		case T_DropGroupStmt:			tag = "DROP GROUP";			break;		case T_CheckPointStmt:			tag = "CHECKPOINT";			break;		case T_ReindexStmt:			tag = "REINDEX";			break;		case T_CreateConversionStmt:			tag = "CREATE CONVERSION";			break;		case T_CreateCastStmt:			tag = "CREATE CAST";			break;		case T_DropCastStmt:			tag = "DROP CAST";			break;		case T_CreateOpClassStmt:			tag = "CREATE OPERATOR CLASS";			break;		case T_RemoveOpClassStmt:			tag = "DROP OPERATOR CLASS";			break;		case T_PrepareStmt:			tag = "PREPARE";			break;		case T_ExecuteStmt:			tag = "EXECUTE";			break;		case T_DeallocateStmt:			tag = "DEALLOCATE";			break;		default:			elog(WARNING, "unrecognized node type: %d",				 (int) nodeTag(parsetree));			tag = "???";			break;	}	return tag;}

⌨️ 快捷键说明

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