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

📄 utility.c

📁 PostgreSQL 8.1.4的源码 适用于Linux下的开源数据库系统
💻 C
📖 第 1 页 / 共 3 页
字号:
					 * but now it's done inside performDeletion().					 */				}			}			break;		case T_TruncateStmt:			{				TruncateStmt *stmt = (TruncateStmt *) parsetree;				ExecuteTruncate(stmt->relations);			}			break;		case T_CommentStmt:			CommentObject((CommentStmt *) parsetree);			break;		case T_CopyStmt:			DoCopy((CopyStmt *) parsetree);			break;		case T_PrepareStmt:			PrepareQuery((PrepareStmt *) parsetree);			break;		case T_ExecuteStmt:			ExecuteQuery((ExecuteStmt *) parsetree, dest, completionTag);			break;		case T_DeallocateStmt:			DeallocateQuery((DeallocateStmt *) parsetree);			break;			/*			 * schema			 */		case T_RenameStmt:			ExecRenameStmt((RenameStmt *) parsetree);			break;		case T_AlterObjectSchemaStmt:			ExecAlterObjectSchemaStmt((AlterObjectSchemaStmt *) parsetree);			break;		case T_AlterOwnerStmt:			ExecAlterOwnerStmt((AlterOwnerStmt *) parsetree);			break;		case T_AlterTableStmt:			AlterTable((AlterTableStmt *) parsetree);			break;		case T_AlterDomainStmt:			{				AlterDomainStmt *stmt = (AlterDomainStmt *) parsetree;				/*				 * Some or all of these functions are recursive to cover				 * inherited things, so permission checks are done there.				 */				switch (stmt->subtype)				{					case 'T':	/* ALTER DOMAIN DEFAULT */						/*						 * Recursively alter column default for table and, if						 * requested, for descendants						 */						AlterDomainDefault(stmt->typename,										   stmt->def);						break;					case 'N':	/* ALTER DOMAIN DROP NOT NULL */						AlterDomainNotNull(stmt->typename,										   false);						break;					case 'O':	/* ALTER DOMAIN SET NOT NULL */						AlterDomainNotNull(stmt->typename,										   true);						break;					case 'C':	/* ADD CONSTRAINT */						AlterDomainAddConstraint(stmt->typename,												 stmt->def);						break;					case 'X':	/* DROP CONSTRAINT */						AlterDomainDropConstraint(stmt->typename,												  stmt->name,												  stmt->behavior);						break;					default:	/* oops */						elog(ERROR, "unrecognized alter domain type: %d",							 (int) stmt->subtype);						break;				}			}			break;		case T_GrantStmt:			ExecuteGrantStmt((GrantStmt *) parsetree);			break;		case T_GrantRoleStmt:			GrantRole((GrantRoleStmt *) parsetree);			break;			/*			 * ******************************** object creation / destruction ********************************			 *			 */		case T_DefineStmt:			{				DefineStmt *stmt = (DefineStmt *) parsetree;				switch (stmt->kind)				{					case OBJECT_AGGREGATE:						DefineAggregate(stmt->defnames, stmt->definition);						break;					case OBJECT_OPERATOR:						DefineOperator(stmt->defnames, stmt->definition);						break;					case OBJECT_TYPE:						DefineType(stmt->defnames, stmt->definition);						break;					default:						elog(ERROR, "unrecognized define stmt type: %d",							 (int) stmt->kind);						break;				}			}			break;		case T_CompositeTypeStmt:		/* CREATE TYPE (composite) */			{				CompositeTypeStmt *stmt = (CompositeTypeStmt *) parsetree;				DefineCompositeType(stmt->typevar, stmt->coldeflist);			}			break;		case T_ViewStmt:		/* CREATE VIEW */			{				ViewStmt   *stmt = (ViewStmt *) parsetree;				DefineView(stmt->view, stmt->query, stmt->replace);			}			break;		case T_CreateFunctionStmt:		/* CREATE FUNCTION */			CreateFunction((CreateFunctionStmt *) parsetree);			break;		case T_AlterFunctionStmt:		/* ALTER FUNCTION */			AlterFunction((AlterFunctionStmt *) parsetree);			break;		case T_IndexStmt:		/* CREATE INDEX */			{				IndexStmt  *stmt = (IndexStmt *) parsetree;				CheckRelationOwnership(stmt->relation, true);				DefineIndex(stmt->relation,		/* relation */							stmt->idxname,		/* index name */							InvalidOid, /* no predefined OID */							stmt->accessMethod, /* am name */							stmt->tableSpace,							stmt->indexParams,	/* parameters */							(Expr *) stmt->whereClause,							stmt->rangetable,							stmt->unique,							stmt->primary,							stmt->isconstraint,							false,		/* is_alter_table */							true,		/* check_rights */							false,		/* skip_build */							false);		/* quiet */			}			break;		case T_RuleStmt:		/* CREATE RULE */			DefineQueryRewrite((RuleStmt *) parsetree);			break;		case T_CreateSeqStmt:			DefineSequence((CreateSeqStmt *) parsetree);			break;		case T_AlterSeqStmt:			AlterSequence((AlterSeqStmt *) parsetree);			break;		case T_RemoveAggrStmt:			RemoveAggregate((RemoveAggrStmt *) parsetree);			break;		case T_RemoveFuncStmt:			RemoveFunction((RemoveFuncStmt *) parsetree);			break;		case T_RemoveOperStmt:			RemoveOperator((RemoveOperStmt *) parsetree);			break;		case T_CreatedbStmt:			createdb((CreatedbStmt *) parsetree);			break;		case T_AlterDatabaseStmt:			AlterDatabase((AlterDatabaseStmt *) parsetree);			break;		case T_AlterDatabaseSetStmt:			AlterDatabaseSet((AlterDatabaseSetStmt *) parsetree);			break;		case T_DropdbStmt:			{				DropdbStmt *stmt = (DropdbStmt *) parsetree;				dropdb(stmt->dbname);			}			break;			/* Query-level asynchronous notification */		case T_NotifyStmt:			{				NotifyStmt *stmt = (NotifyStmt *) parsetree;				Async_Notify(stmt->relation->relname);			}			break;		case T_ListenStmt:			{				ListenStmt *stmt = (ListenStmt *) parsetree;				Async_Listen(stmt->relation->relname);			}			break;		case T_UnlistenStmt:			{				UnlistenStmt *stmt = (UnlistenStmt *) parsetree;				Async_Unlisten(stmt->relation->relname);			}			break;		case T_LoadStmt:			{				LoadStmt   *stmt = (LoadStmt *) parsetree;				if (!superuser())					ereport(ERROR,							(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),							 errmsg("must be superuser to do LOAD")));				closeAllVfds(); /* probably not necessary... */				load_file(stmt->filename);			}			break;		case T_ClusterStmt:			cluster((ClusterStmt *) parsetree);			break;		case T_VacuumStmt:			vacuum((VacuumStmt *) parsetree, NIL);			break;		case T_ExplainStmt:			ExplainQuery((ExplainStmt *) parsetree, dest);			break;		case T_VariableSetStmt:			{				VariableSetStmt *n = (VariableSetStmt *) parsetree;				/*				 * Special cases for special SQL syntax that effectively sets				 * more than one variable per statement.				 */				if (strcmp(n->name, "TRANSACTION") == 0)				{					ListCell   *head;					foreach(head, n->args)					{						DefElem    *item = (DefElem *) lfirst(head);						if (strcmp(item->defname, "transaction_isolation") == 0)							SetPGVariable("transaction_isolation",										  list_make1(item->arg), n->is_local);						else if (strcmp(item->defname, "transaction_read_only") == 0)							SetPGVariable("transaction_read_only",										  list_make1(item->arg), n->is_local);					}				}				else if (strcmp(n->name, "SESSION CHARACTERISTICS") == 0)				{					ListCell   *head;					foreach(head, n->args)					{						DefElem    *item = (DefElem *) lfirst(head);						if (strcmp(item->defname, "transaction_isolation") == 0)							SetPGVariable("default_transaction_isolation",										  list_make1(item->arg), n->is_local);						else if (strcmp(item->defname, "transaction_read_only") == 0)							SetPGVariable("default_transaction_read_only",										  list_make1(item->arg), n->is_local);					}				}				else					SetPGVariable(n->name, n->args, n->is_local);			}			break;		case T_VariableShowStmt:			{				VariableShowStmt *n = (VariableShowStmt *) parsetree;				GetPGVariable(n->name, dest);			}			break;		case T_VariableResetStmt:			{				VariableResetStmt *n = (VariableResetStmt *) parsetree;				ResetPGVariable(n->name);			}			break;		case T_CreateTrigStmt:			CreateTrigger((CreateTrigStmt *) parsetree, false);			break;		case T_DropPropertyStmt:			{				DropPropertyStmt *stmt = (DropPropertyStmt *) parsetree;				Oid			relId;				relId = RangeVarGetRelid(stmt->relation, false);				switch (stmt->removeType)				{					case OBJECT_RULE:						/* RemoveRewriteRule checks permissions */						RemoveRewriteRule(relId, stmt->property,										  stmt->behavior);						break;					case OBJECT_TRIGGER:						/* DropTrigger checks permissions */						DropTrigger(relId, stmt->property,									stmt->behavior);						break;					default:						elog(ERROR, "unrecognized object type: %d",							 (int) stmt->removeType);						break;				}			}			break;		case T_CreatePLangStmt:			CreateProceduralLanguage((CreatePLangStmt *) parsetree);			break;		case T_DropPLangStmt:			DropProceduralLanguage((DropPLangStmt *) parsetree);			break;			/*			 * ******************************** DOMAIN statements ****			 */		case T_CreateDomainStmt:			DefineDomain((CreateDomainStmt *) parsetree);			break;			/*			 * ******************************** ROLE statements ****			 */		case T_CreateRoleStmt:			CreateRole((CreateRoleStmt *) parsetree);			break;		case T_AlterRoleStmt:			AlterRole((AlterRoleStmt *) parsetree);			break;		case T_AlterRoleSetStmt:			AlterRoleSet((AlterRoleSetStmt *) parsetree);			break;		case T_DropRoleStmt:			DropRole((DropRoleStmt *) parsetree);			break;		case T_LockStmt:			LockTableCommand((LockStmt *) parsetree);			break;		case T_ConstraintsSetStmt:			AfterTriggerSetState((ConstraintsSetStmt *) parsetree);			break;		case T_CheckPointStmt:			if (!superuser())				ereport(ERROR,						(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),						 errmsg("must be superuser to do CHECKPOINT")));			RequestCheckpoint(true, false);			break;		case T_ReindexStmt:			{				ReindexStmt *stmt = (ReindexStmt *) parsetree;				switch (stmt->kind)				{					case OBJECT_INDEX:						ReindexIndex(stmt->relation);						break;					case OBJECT_TABLE:						ReindexTable(stmt->relation);						break;					case OBJECT_DATABASE:						ReindexDatabase(stmt->name,										stmt->do_system, stmt->do_user);						break;					default:						elog(ERROR, "unrecognized object type: %d",							 (int) stmt->kind);						break;				}				break;			}			break;		case T_CreateConversionStmt:			CreateConversionCommand((CreateConversionStmt *) parsetree);			break;		case T_CreateCastStmt:			CreateCast((CreateCastStmt *) parsetree);			break;		case T_DropCastStmt:			DropCast((DropCastStmt *) parsetree);			break;		case T_CreateOpClassStmt:			DefineOpClass((CreateOpClassStmt *) parsetree);			break;		case T_RemoveOpClassStmt:			RemoveOpClass((RemoveOpClassStmt *) parsetree);			break;		default:			elog(ERROR, "unrecognized node type: %d",				 (int) nodeTag(parsetree));			break;	}}/* * UtilityReturnsTuples *		Return "true" if this utility statement will send output to the *		destination. * * Generally, there should be a case here for each case in ProcessUtility * 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

⌨️ 快捷键说明

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