亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? view.c

?? PostgreSQL7.4.6 for Linux
?? C
字號:
/*------------------------------------------------------------------------- * * view.c *	  use rewrite rules to construct views * * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION *	  $Header: /cvsroot/pgsql/src/backend/commands/view.c,v 1.78 2003/09/25 06:57:59 petere Exp $ * *------------------------------------------------------------------------- */#include "postgres.h"#include "access/heapam.h"#include "catalog/dependency.h"#include "catalog/namespace.h"#include "commands/tablecmds.h"#include "commands/view.h"#include "miscadmin.h"#include "nodes/makefuncs.h"#include "parser/parse_relation.h"#include "rewrite/rewriteDefine.h"#include "rewrite/rewriteManip.h"#include "rewrite/rewriteSupport.h"#include "utils/acl.h"#include "utils/lsyscache.h"static void checkViewTupleDesc(TupleDesc newdesc, TupleDesc olddesc);/*--------------------------------------------------------------------- * DefineVirtualRelation * * Create the "view" relation. `DefineRelation' does all the work, * we just provide the correct arguments ... at least when we're * creating a view.  If we're updating an existing view, we have to * work harder. *--------------------------------------------------------------------- */static OidDefineVirtualRelation(const RangeVar *relation, List *tlist, bool replace){	Oid			viewOid,				namespaceId;	CreateStmt *createStmt = makeNode(CreateStmt);	List	   *attrList,			   *t;	/*	 * create a list of ColumnDef nodes based on the names and types of	 * the (non-junk) targetlist items from the view's SELECT list.	 */	attrList = NIL;	foreach(t, tlist)	{		TargetEntry *entry = lfirst(t);		Resdom	   *res = entry->resdom;		if (!res->resjunk)		{			ColumnDef  *def = makeNode(ColumnDef);			TypeName   *typename = makeNode(TypeName);			def->colname = pstrdup(res->resname);			typename->typeid = res->restype;			typename->typmod = res->restypmod;			def->typename = typename;			def->inhcount = 0;			def->is_local = true;			def->is_not_null = false;			def->raw_default = NULL;			def->cooked_default = NULL;			def->constraints = NIL;			def->support = NULL;			attrList = lappend(attrList, def);		}	}	if (attrList == NIL)		ereport(ERROR,				(errcode(ERRCODE_INVALID_TABLE_DEFINITION),				 errmsg("view must have at least one column")));	/*	 * Check to see if we want to replace an existing view.	 */	namespaceId = RangeVarGetCreationNamespace(relation);	viewOid = get_relname_relid(relation->relname, namespaceId);	if (OidIsValid(viewOid) && replace)	{		Relation	rel;		TupleDesc	descriptor;		/*		 * Yes.  Get exclusive lock on the existing view ...		 */		rel = relation_open(viewOid, AccessExclusiveLock);		/*		 * Make sure it *is* a view, and do permissions checks.		 */		if (rel->rd_rel->relkind != RELKIND_VIEW)			ereport(ERROR,					(errcode(ERRCODE_WRONG_OBJECT_TYPE),					 errmsg("\"%s\" is not a view",							RelationGetRelationName(rel))));		if (!pg_class_ownercheck(viewOid, GetUserId()))			aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_CLASS,						   RelationGetRelationName(rel));		/*		 * Create a tuple descriptor to compare against the existing view,		 * and verify it matches.		 */		descriptor = BuildDescForRelation(attrList);		checkViewTupleDesc(descriptor, rel->rd_att);		/*		 * Seems okay, so return the OID of the pre-existing view.		 */		relation_close(rel, NoLock);	/* keep the lock! */		return viewOid;	}	else	{		/*		 * now create the parameters for keys/inheritance etc. All of them		 * are nil...		 */		createStmt->relation = (RangeVar *) relation;		createStmt->tableElts = attrList;		createStmt->inhRelations = NIL;		createStmt->constraints = NIL;		createStmt->hasoids = false;		createStmt->oncommit = ONCOMMIT_NOOP;		/*		 * finally create the relation (this will error out if there's an		 * existing view, so we don't need more code to complain if		 * "replace" is false).		 */		return DefineRelation(createStmt, RELKIND_VIEW);	}}/* * Verify that tupledesc associated with proposed new view definition * matches tupledesc of old view.  This is basically a cut-down version * of equalTupleDescs(), with code added to generate specific complaints. */static voidcheckViewTupleDesc(TupleDesc newdesc, TupleDesc olddesc){	int			i;	if (newdesc->natts != olddesc->natts)		ereport(ERROR,				(errcode(ERRCODE_INVALID_TABLE_DEFINITION),				 errmsg("cannot change number of columns in view")));	/* we can ignore tdhasoid */	for (i = 0; i < newdesc->natts; i++)	{		Form_pg_attribute newattr = newdesc->attrs[i];		Form_pg_attribute oldattr = olddesc->attrs[i];		/* XXX not right, but we don't support DROP COL on view anyway */		if (newattr->attisdropped != oldattr->attisdropped)			ereport(ERROR,					(errcode(ERRCODE_INVALID_TABLE_DEFINITION),					 errmsg("cannot change number of columns in view")));		if (strcmp(NameStr(newattr->attname), NameStr(oldattr->attname)) != 0)			ereport(ERROR,					(errcode(ERRCODE_INVALID_TABLE_DEFINITION),					 errmsg("cannot change name of view column \"%s\"",							NameStr(oldattr->attname))));		/* XXX would it be safe to allow atttypmod to change?  Not sure */		if (newattr->atttypid != oldattr->atttypid ||			newattr->atttypmod != oldattr->atttypmod)			ereport(ERROR,					(errcode(ERRCODE_INVALID_TABLE_DEFINITION),				   errmsg("cannot change data type of view column \"%s\"",						  NameStr(oldattr->attname))));		/* We can ignore the remaining attributes of an attribute... */	}	/*	 * We ignore the constraint fields.  The new view desc can't have any	 * constraints, and the only ones that could be on the old view are	 * defaults, which we are happy to leave in place.	 */}static RuleStmt *FormViewRetrieveRule(const RangeVar *view, Query *viewParse, bool replace){	RuleStmt   *rule;	/*	 * Create a RuleStmt that corresponds to the suitable rewrite rule	 * args for DefineQueryRewrite();	 */	rule = makeNode(RuleStmt);	rule->relation = copyObject((RangeVar *) view);	rule->rulename = pstrdup(ViewSelectRuleName);	rule->whereClause = NULL;	rule->event = CMD_SELECT;	rule->instead = true;	rule->actions = makeList1(viewParse);	rule->replace = replace;	return rule;}static voidDefineViewRules(const RangeVar *view, Query *viewParse, bool replace){	RuleStmt   *retrieve_rule;#ifdef NOTYET	RuleStmt   *replace_rule;	RuleStmt   *append_rule;	RuleStmt   *delete_rule;#endif	retrieve_rule = FormViewRetrieveRule(view, viewParse, replace);#ifdef NOTYET	replace_rule = FormViewReplaceRule(view, viewParse);	append_rule = FormViewAppendRule(view, viewParse);	delete_rule = FormViewDeleteRule(view, viewParse);#endif	DefineQueryRewrite(retrieve_rule);#ifdef NOTYET	DefineQueryRewrite(replace_rule);	DefineQueryRewrite(append_rule);	DefineQueryRewrite(delete_rule);#endif}/*--------------------------------------------------------------- * UpdateRangeTableOfViewParse * * Update the range table of the given parsetree. * This update consists of adding two new entries IN THE BEGINNING * of the range table (otherwise the rule system will die a slow, * horrible and painful death, and we do not want that now, do we?) * one for the OLD relation and one for the NEW one (both of * them refer in fact to the "view" relation). * * Of course we must also increase the 'varnos' of all the Var nodes * by 2... * * These extra RT entries are not actually used in the query, * except for run-time permission checking. *--------------------------------------------------------------- */static Query *UpdateRangeTableOfViewParse(Oid viewOid, Query *viewParse){	List	   *new_rt;	RangeTblEntry *rt_entry1,			   *rt_entry2;	/*	 * Make a copy of the given parsetree.	It's not so much that we don't	 * want to scribble on our input, it's that the parser has a bad habit	 * of outputting multiple links to the same subtree for constructs	 * like BETWEEN, and we mustn't have OffsetVarNodes increment the	 * varno of a Var node twice.  copyObject will expand any	 * multiply-referenced subtree into multiple copies.	 */	viewParse = (Query *) copyObject(viewParse);	/*	 * Create the 2 new range table entries and form the new range	 * table... OLD first, then NEW....	 */	rt_entry1 = addRangeTableEntryForRelation(NULL, viewOid,											  makeAlias("*OLD*", NIL),											  false, false);	rt_entry2 = addRangeTableEntryForRelation(NULL, viewOid,											  makeAlias("*NEW*", NIL),											  false, false);	/* Must override addRangeTableEntry's default access-check flags */	rt_entry1->checkForRead = false;	rt_entry2->checkForRead = false;	new_rt = lcons(rt_entry1, lcons(rt_entry2, viewParse->rtable));	viewParse->rtable = new_rt;	/*	 * Now offset all var nodes by 2, and jointree RT indexes too.	 */	OffsetVarNodes((Node *) viewParse, 2, 0);	return viewParse;}/*------------------------------------------------------------------- * DefineView * *		- takes a "viewname", "parsetree" pair and then *		1)		construct the "virtual" relation *		2)		commit the command but NOT the transaction, *				so that the relation exists *				before the rules are defined. *		2)		define the "n" rules specified in the PRS2 paper *				over the "virtual" relation *------------------------------------------------------------------- */voidDefineView(const RangeVar *view, Query *viewParse, bool replace){	Oid			viewOid;	/*	 * Create the view relation	 *	 * NOTE: if it already exists and replace is false, the xact will be	 * aborted.	 */	viewOid = DefineVirtualRelation(view, viewParse->targetList, replace);	/*	 * The relation we have just created is not visible to any other	 * commands running with the same transaction & command id. So,	 * increment the command id counter (but do NOT pfree any memory!!!!)	 */	CommandCounterIncrement();	/*	 * The range table of 'viewParse' does not contain entries for the	 * "OLD" and "NEW" relations. So... add them!	 */	viewParse = UpdateRangeTableOfViewParse(viewOid, viewParse);	/*	 * Now create the rules associated with the view.	 */	DefineViewRules(view, viewParse, replace);}/* * RemoveView * * Remove a view given its name * * We just have to drop the relation; the associated rules will be * cleaned up automatically. */voidRemoveView(const RangeVar *view, DropBehavior behavior){	Oid			viewOid;	ObjectAddress object;	viewOid = RangeVarGetRelid(view, false);	object.classId = RelOid_pg_class;	object.objectId = viewOid;	object.objectSubId = 0;	performDeletion(&object, behavior);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人久久精品77777最新版本| 日本乱人伦aⅴ精品| 成人精品小蝌蚪| 欧美一区二区三区在线观看视频 | 欧美亚洲综合另类| 久久亚洲二区三区| 日本午夜精品视频在线观看 | 97se亚洲国产综合自在线| 日韩一区二区三区av| 亚洲人123区| 成人精品一区二区三区四区| 日韩美女主播在线视频一区二区三区| 亚洲精品欧美在线| 国产成人日日夜夜| 精品久久久久久综合日本欧美| 亚洲一区二区三区国产| 99视频精品在线| 久久久久国产精品麻豆ai换脸| 天堂va蜜桃一区二区三区漫画版 | 国产美女一区二区三区| 日韩欧美激情在线| 日韩国产精品久久久久久亚洲| 99精品在线免费| 国产精品国产自产拍高清av王其| 国模一区二区三区白浆| 日韩视频一区在线观看| 日韩高清不卡在线| 91麻豆精品国产自产在线观看一区 | 国产精品视频免费| 成人免费视频视频| 中文字幕av一区二区三区免费看| 国产精品中文字幕一区二区三区| 日韩精品专区在线| 久久成人羞羞网站| 欧美zozozo| 国产精品18久久久久久久久久久久 | 韩国一区二区视频| 精品不卡在线视频| 国产成人综合在线| 国产精品日日摸夜夜摸av| 成人免费视频视频| 亚洲免费av高清| 欧美视频在线不卡| 日韩av成人高清| 日韩欧美中文一区二区| 韩国一区二区三区| 日本一区二区三区四区在线视频| 国产麻豆精品theporn| 久久久久久夜精品精品免费| 国产激情91久久精品导航| 欧美激情一区不卡| 91久久精品一区二区二区| 亚洲国产美女搞黄色| 91精品综合久久久久久| 久久99久久99精品免视看婷婷 | 久久奇米777| 97精品国产97久久久久久久久久久久| 亚洲人吸女人奶水| 国产欧美日韩三区| 93久久精品日日躁夜夜躁欧美| 亚洲自拍与偷拍| 精品久久久久久久久久久久包黑料| 国产馆精品极品| 一区二区三区四区在线免费观看| 欧美人xxxx| 国产成人免费xxxxxxxx| 一区二区三区欧美在线观看| 日韩美女一区二区三区| 本田岬高潮一区二区三区| 亚洲伊人伊色伊影伊综合网| 精品日韩成人av| 91黄视频在线观看| 激情五月播播久久久精品| 亚洲欧美一区二区三区极速播放| 日韩视频在线永久播放| 91老师片黄在线观看| 久久99九九99精品| 亚洲国产色一区| 中文字幕av在线一区二区三区| 8x8x8国产精品| 99国产精品久久| 国产一区在线观看视频| 亚洲a一区二区| 国产精品美女久久久久久 | 国产精品无圣光一区二区| 欧美日韩国产美女| 99久久伊人网影院| 国精产品一区一区三区mba桃花| 一区二区三区自拍| 久久久99久久| 日韩精品在线看片z| 欧美无乱码久久久免费午夜一区| 国产白丝网站精品污在线入口| 日韩精品一二区| 亚洲成av人在线观看| 日韩毛片精品高清免费| 国产亚洲欧美色| 欧美成人精品高清在线播放| 欧美日韩电影在线播放| 色综合久久久久综合| 成a人片亚洲日本久久| 国产中文字幕一区| 北条麻妃国产九九精品视频| 久久99久久99| 毛片基地黄久久久久久天堂| 亚洲大片精品永久免费| 亚洲精品免费在线观看| 中文字幕一区二区三区在线不卡| 日本一区二区久久| 国产亚洲欧美激情| 欧美国产综合一区二区| 国产欧美日本一区视频| 中文字幕欧美激情| 国产精品高潮久久久久无| 一区二区中文视频| 一区二区三区在线免费| 亚洲精品成人在线| 亚洲国产欧美日韩另类综合| 亚洲国产精品久久不卡毛片| 亚洲成人午夜电影| 青青草国产精品97视觉盛宴 | 精品日韩一区二区三区免费视频| 日韩午夜av一区| 精品国产乱码久久久久久免费 | 欧美久久一区二区| 欧美精三区欧美精三区| 欧美日韩亚洲综合在线 | 国产成人精品一区二区三区四区 | 久久亚洲综合av| 欧美国产激情二区三区| 国产精品动漫网站| 亚洲一区二区中文在线| 免费不卡在线视频| 高清不卡一区二区在线| 一本大道久久a久久精品综合| 欧美视频一二三区| 欧美videos中文字幕| 久久久久久久久久久久久久久99 | 欧美区一区二区三区| 精品国产免费人成电影在线观看四季 | 成人av免费网站| 在线视频一区二区三区| 777奇米四色成人影色区| 久久婷婷色综合| 亚洲激情六月丁香| 免费观看在线综合色| 国产精品18久久久久久久网站| 色欧美片视频在线观看在线视频| 欧美精品电影在线播放| 亚洲国产精品高清| 天堂一区二区在线免费观看| 国产一区二区三区免费| 色欧美乱欧美15图片| 精品国产一区二区精华| 亚洲欧美日韩在线不卡| 久草中文综合在线| 99国产精品国产精品久久| 欧美一级二级三级蜜桃| 国产精品传媒视频| 久久国产福利国产秒拍| 在线亚洲免费视频| 国产欧美一区二区精品性色超碰| 亚洲午夜免费电影| 国产精品99精品久久免费| 欧美日韩国产综合一区二区三区 | 久久精品这里都是精品| 性欧美大战久久久久久久久| 成人精品免费看| 欧美变态口味重另类| 亚洲国产精品久久久男人的天堂| 高清成人在线观看| xf在线a精品一区二区视频网站| 亚洲一区二区三区四区五区黄| 粉嫩在线一区二区三区视频| 日韩一级免费一区| 亚洲成国产人片在线观看| 92精品国产成人观看免费| 久久久亚洲综合| 精品一区二区三区免费毛片爱| 欧美日韩国产一区二区三区地区| 国产精品国产自产拍在线| 国产成人精品免费一区二区| 欧美大片在线观看一区| 天堂va蜜桃一区二区三区漫画版| 91精品1区2区| 亚洲欧美日韩国产另类专区| 成人av综合在线| 国产精品色在线观看| 国产精品自在在线| 久久综合色一综合色88| 麻豆精品在线观看| 欧美高清你懂得| 午夜精品久久久久久| 欧美日韩亚洲丝袜制服| 亚洲高清三级视频| 欧美美女一区二区三区| 亚洲bt欧美bt精品| 51精品视频一区二区三区| 偷拍日韩校园综合在线| 91精品久久久久久久久99蜜臂|