utility.c

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

C
1,566
字号
						AlterTableAddColumn(relid,							  interpretInhOption(stmt->relation->inhOpt),											(ColumnDef *) stmt->def);						break;					case 'T':	/* ALTER COLUMN DEFAULT */						/*						 * Recursively alter column default for table and,						 * if requested, for descendants						 */						AlterTableAlterColumnDefault(relid,							  interpretInhOption(stmt->relation->inhOpt),													 stmt->name,													 stmt->def);						break;					case 'N':	/* ALTER COLUMN DROP NOT NULL */						AlterTableAlterColumnDropNotNull(relid,							  interpretInhOption(stmt->relation->inhOpt),														 stmt->name);						break;					case 'n':	/* ALTER COLUMN SET NOT NULL */						AlterTableAlterColumnSetNotNull(relid,							  interpretInhOption(stmt->relation->inhOpt),														stmt->name);						break;					case 'S':	/* ALTER COLUMN STATISTICS */					case 'M':	/* ALTER COLUMN STORAGE */						/*						 * Recursively alter column statistics for table						 * and, if requested, for descendants						 */						AlterTableAlterColumnFlags(relid,							  interpretInhOption(stmt->relation->inhOpt),												   stmt->name,												   stmt->def,												   &(stmt->subtype));						break;					case 'D':	/* DROP COLUMN */						/*						 * Recursively drop column from table and, if						 * requested, from descendants						 */						AlterTableDropColumn(relid,							  interpretInhOption(stmt->relation->inhOpt),											 false,											 stmt->name,											 stmt->behavior);						break;					case 'C':	/* ADD CONSTRAINT */						/*						 * Recursively add constraint to table and, if						 * requested, to descendants						 */						AlterTableAddConstraint(relid,							  interpretInhOption(stmt->relation->inhOpt),												(List *) stmt->def);						break;					case 'X':	/* DROP CONSTRAINT */						/*						 * Recursively drop constraint from table and, if						 * requested, from descendants						 */						AlterTableDropConstraint(relid,							  interpretInhOption(stmt->relation->inhOpt),												 stmt->name,												 stmt->behavior);						break;					case 'E':	/* CREATE TOAST TABLE */						AlterTableCreateToastTable(relid, false);						break;					case 'U':	/* ALTER OWNER */						/* check that we are the superuser */						if (!superuser())							ereport(ERROR,								(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),							errmsg("must be superuser to alter owner")));						/* get_usesysid raises an error if no such user */						AlterTableOwner(relid,										get_usesysid(stmt->name));						break;					case 'L':	/* CLUSTER ON */						AlterTableClusterOn(relid, stmt->name);						break;					case 'o':	/* ADD OIDS */						AlterTableAlterOids(relid,							  interpretInhOption(stmt->relation->inhOpt),											false);						break;					default:	/* oops */						elog(ERROR, "unrecognized alter table type: %d",							 (int) stmt->subtype);						break;				}			}			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;					case 'U':	/* OWNER TO */						/* check that we are the superuser */						if (!superuser())							ereport(ERROR,								(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),							errmsg("must be superuser to alter owner")));						/* get_usesysid raises an error if no such user */						AlterTypeOwner(stmt->typename,									   get_usesysid(stmt->name));						break;					default:	/* oops */						elog(ERROR, "unrecognized alter domain type: %d",							 (int) stmt->subtype);						break;				}			}			break;		case T_GrantStmt:			ExecuteGrantStmt((GrantStmt *) 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_IndexStmt:		/* CREATE INDEX */			{				IndexStmt  *stmt = (IndexStmt *) parsetree;				CheckRelationOwnership(stmt->relation, true);				DefineIndex(stmt->relation,		/* relation */							stmt->idxname,		/* index name */							stmt->accessMethod, /* am name */							stmt->indexParams,	/* parameters */							stmt->unique,							stmt->primary,							stmt->isconstraint,							(Expr *) stmt->whereClause,							stmt->rangetable);			}			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_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, MyProcPid);			}			break;		case T_UnlistenStmt:			{				UnlistenStmt *stmt = (UnlistenStmt *) parsetree;				Async_Unlisten(stmt->relation->relname, MyProcPid);			}			break;		case T_LoadStmt:			{				LoadStmt   *stmt = (LoadStmt *) parsetree;				closeAllVfds(); /* probably not necessary... */				load_file(stmt->filename);			}			break;		case T_ClusterStmt:			cluster((ClusterStmt *) parsetree);			break;		case T_VacuumStmt:			vacuum((VacuumStmt *) parsetree);			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)				{					List	   *head;					foreach(head, n->args)					{						DefElem    *item = (DefElem *) lfirst(head);						if (strcmp(item->defname, "transaction_isolation") == 0)							SetPGVariable("transaction_isolation",									  makeList1(item->arg), n->is_local);						else if (strcmp(item->defname, "transaction_read_only") == 0)							SetPGVariable("transaction_read_only",									  makeList1(item->arg), n->is_local);					}				}				else if (strcmp(n->name, "SESSION CHARACTERISTICS") == 0)				{					List	   *head;					foreach(head, n->args)					{						DefElem    *item = (DefElem *) lfirst(head);						if (strcmp(item->defname, "transaction_isolation") == 0)							SetPGVariable("default_transaction_isolation",									  makeList1(item->arg), n->is_local);						else if (strcmp(item->defname, "transaction_read_only") == 0)							SetPGVariable("default_transaction_read_only",									  makeList1(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;			/*			 * ******************************** USER statements ****			 */		case T_CreateUserStmt:			CreateUser((CreateUserStmt *) parsetree);			break;		case T_AlterUserStmt:			AlterUser((AlterUserStmt *) parsetree);			break;		case T_AlterUserSetStmt:			AlterUserSet((AlterUserSetStmt *) parsetree);			break;		case T_DropUserStmt:			DropUser((DropUserStmt *) parsetree);			break;		case T_LockStmt:			LockTableCommand((LockStmt *) parsetree);			break;		case T_ConstraintsSetStmt:			DeferredTriggerSetState((ConstraintsSetStmt *) parsetree);			break;		case T_CreateGroupStmt:			CreateGroup((CreateGroupStmt *) parsetree);			break;		case T_AlterGroupStmt:			AlterGroup((AlterGroupStmt *) parsetree, "ALTER GROUP");			break;		case T_DropGroupStmt:			DropGroup((DropGroupStmt *) parsetree);			break;		case T_CheckPointStmt:			if (!superuser())				ereport(ERROR,						(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),						 errmsg("must be superuser to do CHECKPOINT")));			CreateCheckPoint(false, false);			break;		case T_ReindexStmt:			{				ReindexStmt *stmt = (ReindexStmt *) parsetree;				switch (stmt->kind)				{					case OBJECT_INDEX:						ReindexIndex(stmt->relation, stmt->force);						break;					case OBJECT_TABLE:						ReindexTable(stmt->relation, stmt->force);						break;					case OBJECT_DATABASE:						ReindexDatabase(stmt->name, stmt->force, false);						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

⌨️ 快捷键说明

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