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

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

?? trigger.c

?? 關系型數據庫 Postgresql 6.5.2
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*------------------------------------------------------------------------- * * trigger.c *	  PostgreSQL TRIGGERs support code. * *------------------------------------------------------------------------- */#include "postgres.h"#include "access/genam.h"#include "access/heapam.h"#include "catalog/catalog.h"#include "catalog/catname.h"#include "catalog/indexing.h"#include "catalog/pg_language.h"#include "catalog/pg_proc.h"#include "catalog/pg_trigger.h"#include "commands/trigger.h"#include "executor/executor.h"#include "miscadmin.h"#include "utils/acl.h"#include "utils/builtins.h"#include "utils/inval.h"#include "utils/syscache.h"DLLIMPORT TriggerData *CurrentTriggerData = NULL;void		RelationBuildTriggers(Relation relation);void		FreeTriggerDesc(Relation relation);static void DescribeTrigger(TriggerDesc *trigdesc, Trigger *trigger);static HeapTuple GetTupleForTrigger(EState *estate, ItemPointer tid,				   TupleTableSlot **newSlot);extern GlobalMemory CacheCxt;voidCreateTrigger(CreateTrigStmt *stmt){	int16		tgtype;	int16		tgattr[8] = {0};	Datum		values[Natts_pg_trigger];	char		nulls[Natts_pg_trigger];	Relation	rel;	Relation	tgrel;	HeapScanDesc tgscan;	ScanKeyData key;	Relation	pgrel;	HeapTuple	tuple;	Relation	idescs[Num_pg_trigger_indices];	Relation	ridescs[Num_pg_class_indices];	MemoryContext oldcxt;	Oid			fargtypes[8];	int			found = 0;	int			i;	if (!allowSystemTableMods && IsSystemRelationName(stmt->relname))		elog(ERROR, "CreateTrigger: can't create trigger for system relation %s", stmt->relname);#ifndef NO_SECURITY	if (!pg_ownercheck(GetPgUserName(), stmt->relname, RELNAME))		elog(ERROR, "%s: %s", stmt->relname, aclcheck_error_strings[ACLCHECK_NOT_OWNER]);#endif	rel = heap_openr(stmt->relname);	if (!RelationIsValid(rel))		elog(ERROR, "CreateTrigger: there is no relation %s", stmt->relname);	LockRelation(rel, AccessExclusiveLock);	TRIGGER_CLEAR_TYPE(tgtype);	if (stmt->before)		TRIGGER_SETT_BEFORE(tgtype);	if (stmt->row)		TRIGGER_SETT_ROW(tgtype);	else		elog(ERROR, "CreateTrigger: STATEMENT triggers are unimplemented, yet");	for (i = 0; i < 3 && stmt->actions[i]; i++)	{		switch (stmt->actions[i])		{			case 'i':				if (TRIGGER_FOR_INSERT(tgtype))					elog(ERROR, "CreateTrigger: double INSERT event specified");				TRIGGER_SETT_INSERT(tgtype);				break;			case 'd':				if (TRIGGER_FOR_DELETE(tgtype))					elog(ERROR, "CreateTrigger: double DELETE event specified");				TRIGGER_SETT_DELETE(tgtype);				break;			case 'u':				if (TRIGGER_FOR_UPDATE(tgtype))					elog(ERROR, "CreateTrigger: double UPDATE event specified");				TRIGGER_SETT_UPDATE(tgtype);				break;			default:				elog(ERROR, "CreateTrigger: unknown event specified");				break;		}	}	/* Scan pg_trigger */	tgrel = heap_openr(TriggerRelationName);	LockRelation(tgrel, AccessExclusiveLock);	ScanKeyEntryInitialize(&key, 0, Anum_pg_trigger_tgrelid,						   F_OIDEQ, RelationGetRelid(rel));	tgscan = heap_beginscan(tgrel, 0, SnapshotNow, 1, &key);	while (HeapTupleIsValid(tuple = heap_getnext(tgscan, 0)))	{		Form_pg_trigger pg_trigger = (Form_pg_trigger) GETSTRUCT(tuple);		if (namestrcmp(&(pg_trigger->tgname), stmt->trigname) == 0)			elog(ERROR, "CreateTrigger: trigger %s already defined on relation %s",				 stmt->trigname, stmt->relname);		else			found++;	}	heap_endscan(tgscan);	MemSet(fargtypes, 0, 8 * sizeof(Oid));	tuple = SearchSysCacheTuple(PRONAME,								PointerGetDatum(stmt->funcname),								Int32GetDatum(0),								PointerGetDatum(fargtypes),								0);	if (!HeapTupleIsValid(tuple) ||		((Form_pg_proc) GETSTRUCT(tuple))->pronargs != 0)		elog(ERROR, "CreateTrigger: function %s() does not exist",			 stmt->funcname);	if (((Form_pg_proc) GETSTRUCT(tuple))->prorettype != 0)		elog(ERROR, "CreateTrigger: function %s() must return OPAQUE",			 stmt->funcname);	if (((Form_pg_proc) GETSTRUCT(tuple))->prolang != ClanguageId)	{		HeapTuple	langTup;		langTup = SearchSysCacheTuple(LANOID,			ObjectIdGetDatum(((Form_pg_proc) GETSTRUCT(tuple))->prolang),									  0, 0, 0);		if (!HeapTupleIsValid(langTup))			elog(ERROR, "CreateTrigger: cache lookup for PL failed");		if (((Form_pg_language) GETSTRUCT(langTup))->lanispl == false)			elog(ERROR, "CreateTrigger: only C and PL functions are supported");	}	MemSet(nulls, ' ', Natts_pg_trigger * sizeof(char));	values[Anum_pg_trigger_tgrelid - 1] = ObjectIdGetDatum(RelationGetRelid(rel));	values[Anum_pg_trigger_tgname - 1] = NameGetDatum(namein(stmt->trigname));	values[Anum_pg_trigger_tgfoid - 1] = ObjectIdGetDatum(tuple->t_data->t_oid);	values[Anum_pg_trigger_tgtype - 1] = Int16GetDatum(tgtype);	if (stmt->args)	{		List	   *le;		char	   *args;		int16		nargs = length(stmt->args);		int			len = 0;		foreach(le, stmt->args)		{			char	   *ar = (char *) lfirst(le);			len += strlen(ar) + VARHDRSZ;			for (; *ar; ar++)			{				if (*ar == '\\')					len++;			}		}		args = (char *) palloc(len + 1);		args[0] = 0;		foreach(le, stmt->args)		{			char	   *s = (char *) lfirst(le);			char	   *d = args + strlen(args);			while (*s)			{				if (*s == '\\')					*d++ = '\\';				*d++ = *s++;			}			*d = 0;			strcat(args, "\\000");		}		values[Anum_pg_trigger_tgnargs - 1] = Int16GetDatum(nargs);		values[Anum_pg_trigger_tgargs - 1] = PointerGetDatum(byteain(args));	}	else	{		values[Anum_pg_trigger_tgnargs - 1] = Int16GetDatum(0);		values[Anum_pg_trigger_tgargs - 1] = PointerGetDatum(byteain(""));	}	values[Anum_pg_trigger_tgattr - 1] = PointerGetDatum(tgattr);	tuple = heap_formtuple(tgrel->rd_att, values, nulls);	heap_insert(tgrel, tuple);	CatalogOpenIndices(Num_pg_trigger_indices, Name_pg_trigger_indices, idescs);	CatalogIndexInsert(idescs, Num_pg_trigger_indices, tgrel, tuple);	CatalogCloseIndices(Num_pg_trigger_indices, idescs);	pfree(tuple);	UnlockRelation(tgrel, AccessExclusiveLock);	heap_close(tgrel);	pfree(DatumGetPointer(values[Anum_pg_trigger_tgname - 1]));	pfree(DatumGetPointer(values[Anum_pg_trigger_tgargs - 1]));	/* update pg_class */	tuple = SearchSysCacheTupleCopy(RELNAME,									PointerGetDatum(stmt->relname),									0, 0, 0);	if (!HeapTupleIsValid(tuple))		elog(ERROR, "CreateTrigger: relation %s not found in pg_class", stmt->relname);	pgrel = heap_openr(RelationRelationName);	((Form_pg_class) GETSTRUCT(tuple))->reltriggers = found + 1;	RelationInvalidateHeapTuple(pgrel, tuple);	heap_replace(pgrel, &tuple->t_self, tuple, NULL);	CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, ridescs);	CatalogIndexInsert(ridescs, Num_pg_class_indices, pgrel, tuple);	CatalogCloseIndices(Num_pg_class_indices, ridescs);	pfree(tuple);	heap_close(pgrel);	CommandCounterIncrement();	oldcxt = MemoryContextSwitchTo((MemoryContext) CacheCxt);	FreeTriggerDesc(rel);	rel->rd_rel->reltriggers = found + 1;	RelationBuildTriggers(rel);	MemoryContextSwitchTo(oldcxt);	heap_close(rel);	return;}voidDropTrigger(DropTrigStmt *stmt){	Relation	rel;	Relation	tgrel;	HeapScanDesc tgscan;	ScanKeyData key;	Relation	pgrel;	HeapTuple	tuple;	Relation	ridescs[Num_pg_class_indices];	MemoryContext oldcxt;	int			found = 0;	int			tgfound = 0;#ifndef NO_SECURITY	if (!pg_ownercheck(GetPgUserName(), stmt->relname, RELNAME))		elog(ERROR, "%s: %s", stmt->relname, aclcheck_error_strings[ACLCHECK_NOT_OWNER]);#endif	rel = heap_openr(stmt->relname);	if (!RelationIsValid(rel))		elog(ERROR, "DropTrigger: there is no relation %s", stmt->relname);	LockRelation(rel, AccessExclusiveLock);	tgrel = heap_openr(TriggerRelationName);	LockRelation(tgrel, AccessExclusiveLock);	ScanKeyEntryInitialize(&key, 0, Anum_pg_trigger_tgrelid,						   F_OIDEQ, RelationGetRelid(rel));	tgscan = heap_beginscan(tgrel, 0, SnapshotNow, 1, &key);	while (HeapTupleIsValid(tuple = heap_getnext(tgscan, 0)))	{		Form_pg_trigger pg_trigger = (Form_pg_trigger) GETSTRUCT(tuple);		if (namestrcmp(&(pg_trigger->tgname), stmt->trigname) == 0)		{			heap_delete(tgrel, &tuple->t_self, NULL);			tgfound++;		}		else			found++;	}	if (tgfound == 0)		elog(ERROR, "DropTrigger: there is no trigger %s on relation %s",			 stmt->trigname, stmt->relname);	if (tgfound > 1)		elog(NOTICE, "DropTrigger: found (and deleted) %d trigger %s on relation %s",			 tgfound, stmt->trigname, stmt->relname);	heap_endscan(tgscan);	UnlockRelation(tgrel, AccessExclusiveLock);	heap_close(tgrel);	tuple = SearchSysCacheTupleCopy(RELNAME,									PointerGetDatum(stmt->relname),									0, 0, 0);	if (!HeapTupleIsValid(tuple))		elog(ERROR, "DropTrigger: relation %s not found in pg_class", stmt->relname);	/* update pg_class */	pgrel = heap_openr(RelationRelationName);	((Form_pg_class) GETSTRUCT(tuple))->reltriggers = found;	RelationInvalidateHeapTuple(pgrel, tuple);	heap_replace(pgrel, &tuple->t_self, tuple, NULL);	CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, ridescs);	CatalogIndexInsert(ridescs, Num_pg_class_indices, pgrel, tuple);	CatalogCloseIndices(Num_pg_class_indices, ridescs);	pfree(tuple);	heap_close(pgrel);	CommandCounterIncrement();	oldcxt = MemoryContextSwitchTo((MemoryContext) CacheCxt);	FreeTriggerDesc(rel);	rel->rd_rel->reltriggers = found;	if (found > 0)		RelationBuildTriggers(rel);	MemoryContextSwitchTo(oldcxt);	heap_close(rel);	return;}voidRelationRemoveTriggers(Relation rel){	Relation	tgrel;	HeapScanDesc tgscan;	ScanKeyData key;	HeapTuple	tup;	tgrel = heap_openr(TriggerRelationName);	LockRelation(tgrel, AccessExclusiveLock);	ScanKeyEntryInitialize(&key, 0, Anum_pg_trigger_tgrelid,						   F_OIDEQ, RelationGetRelid(rel));	tgscan = heap_beginscan(tgrel, 0, SnapshotNow, 1, &key);	while (HeapTupleIsValid(tup = heap_getnext(tgscan, 0)))		heap_delete(tgrel, &tup->t_self, NULL);	heap_endscan(tgscan);	UnlockRelation(tgrel, AccessExclusiveLock);	heap_close(tgrel);}voidRelationBuildTriggers(Relation relation){	TriggerDesc *trigdesc = (TriggerDesc *) palloc(sizeof(TriggerDesc));	int			ntrigs = relation->rd_rel->reltriggers;	Trigger    *triggers = NULL;	Trigger    *build;	Relation	tgrel;	Form_pg_trigger pg_trigger;	Relation	irel;	ScanKeyData skey;	HeapTupleData tuple;	IndexScanDesc sd;	RetrieveIndexResult indexRes;	Buffer		buffer;	struct varlena *val;	bool		isnull;	int			found;	MemSet(trigdesc, 0, sizeof(TriggerDesc));	ScanKeyEntryInitialize(&skey,						   (bits16) 0x0,						   (AttrNumber) 1,						   (RegProcedure) F_OIDEQ,						   ObjectIdGetDatum(RelationGetRelid(relation)));	tgrel = heap_openr(TriggerRelationName);	irel = index_openr(TriggerRelidIndex);	sd = index_beginscan(irel, false, 1, &skey);	for (found = 0;;)	{		indexRes = index_getnext(sd, ForwardScanDirection);		if (!indexRes)			break;		tuple.t_self = indexRes->heap_iptr;		heap_fetch(tgrel, SnapshotNow, &tuple, &buffer);		pfree(indexRes);		if (!tuple.t_data)			continue;		if (found == ntrigs)			elog(ERROR, "RelationBuildTriggers: unexpected record found for rel %.*s",				 NAMEDATALEN, relation->rd_rel->relname.data);		pg_trigger = (Form_pg_trigger) GETSTRUCT(&tuple);		if (triggers == NULL)			triggers = (Trigger *) palloc(sizeof(Trigger));		else			triggers = (Trigger *) repalloc(triggers, (found + 1) * sizeof(Trigger));		build = &(triggers[found]);		build->tgname = nameout(&(pg_trigger->tgname));		build->tgfoid = pg_trigger->tgfoid;		build->tgfunc.fn_addr = NULL;		build->tgtype = pg_trigger->tgtype;		build->tgnargs = pg_trigger->tgnargs;		memcpy(build->tgattr, &(pg_trigger->tgattr), 8 * sizeof(int16));		val = (struct varlena *) fastgetattr(&tuple,											 Anum_pg_trigger_tgargs,											 tgrel->rd_att, &isnull);		if (isnull)			elog(ERROR, "RelationBuildTriggers: tgargs IS NULL for rel %.*s",				 NAMEDATALEN, relation->rd_rel->relname.data);		if (build->tgnargs > 0)		{			char	   *p;			int			i;			val = (struct varlena *) fastgetattr(&tuple,												 Anum_pg_trigger_tgargs,												 tgrel->rd_att, &isnull);			if (isnull)				elog(ERROR, "RelationBuildTriggers: tgargs IS NULL for rel %.*s",					 NAMEDATALEN, relation->rd_rel->relname.data);			p = (char *) VARDATA(val);			build->tgargs = (char **) palloc(build->tgnargs * sizeof(char *));			for (i = 0; i < build->tgnargs; i++)			{				build->tgargs[i] = (char *) palloc(strlen(p) + 1);				strcpy(build->tgargs[i], p);				p += strlen(p) + 1;			}		}		else			build->tgargs = NULL;		found++;		ReleaseBuffer(buffer);	}	if (found < ntrigs)		elog(ERROR, "RelationBuildTriggers: %d record not found for rel %.*s",			 ntrigs - found,

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产无遮挡一区二区三区毛片日本| 国产色综合一区| 精品欧美久久久| 国产精品家庭影院| 美女视频黄免费的久久| 91亚洲资源网| 久久亚洲影视婷婷| 日韩专区中文字幕一区二区| 成人午夜电影久久影院| 精品国产免费久久 | 欧美最新大片在线看| 久久精品一区二区三区不卡牛牛| 亚洲一区二区三区四区在线免费观看| 国产一区欧美日韩| 日韩一区二区在线观看| 久久国产三级精品| 色呦呦国产精品| 国产精品久久久久精k8| 国产成人丝袜美腿| 久久久夜色精品亚洲| 青椒成人免费视频| 91.xcao| 一区二区在线看| 99国产精品久| 中文字幕视频一区| 成人在线综合网站| 欧美国产激情一区二区三区蜜月| 精品一区二区三区在线视频| 欧美一二三区精品| 免费久久99精品国产| 91精品国产色综合久久不卡电影 | 欧美精品一区二区三区在线 | 在线一区二区三区做爰视频网站| 国产欧美日韩三区| 丁香激情综合五月| 国产精品免费视频观看| 国产不卡一区视频| 国产精品看片你懂得| www.综合网.com| 亚洲黄色尤物视频| 欧美日韩一区二区在线观看视频| 亚洲激情六月丁香| 欧美猛男gaygay网站| 午夜精品久久久久久久99水蜜桃 | 日韩欧美国产一区二区在线播放| 美女一区二区久久| 久久综合999| 91色porny在线视频| 一片黄亚洲嫩模| 欧美一区二区黄色| 国产精品一区二区久久精品爱涩| 亚洲成av人**亚洲成av**| 欧美日韩精品一区二区天天拍小说| 亚洲人成小说网站色在线 | 国产激情一区二区三区四区 | 日韩欧美在线网站| 国精产品一区一区三区mba桃花| 国产亚洲女人久久久久毛片| www.色综合.com| 亚洲一区二区视频在线观看| 欧美一卡2卡三卡4卡5免费| 韩国成人福利片在线播放| 成人欧美一区二区三区黑人麻豆| 日本精品一级二级| 久久91精品久久久久久秒播| 国产精品网站导航| 欧美亚洲自拍偷拍| 国内精品伊人久久久久av一坑| 国产欧美一区二区三区鸳鸯浴| 91福利在线看| 国产精品综合在线视频| 尤物av一区二区| 久久蜜臀精品av| 欧美午夜精品久久久久久超碰| 喷白浆一区二区| 亚洲欧洲综合另类| 精品福利在线导航| 色婷婷精品久久二区二区蜜臂av | 在线综合视频播放| 丁香婷婷深情五月亚洲| 天天综合网 天天综合色| 欧美国产日韩一二三区| 欧美日韩aaa| 丁香婷婷综合色啪| 精品一区二区三区蜜桃| 依依成人精品视频| 国产精品网站在线观看| 日韩欧美在线1卡| 欧美成人精品3d动漫h| 不卡影院免费观看| 激情国产一区二区| 无吗不卡中文字幕| 一区二区三区**美女毛片| 久久美女艺术照精彩视频福利播放 | 国产精品嫩草影院com| 欧美一级爆毛片| 在线区一区二视频| 99精品偷自拍| 成人av网址在线观看| 国产精品一区二区不卡| 久久精品国产99国产| 日韩黄色免费网站| 亚洲国产精品自拍| 亚洲尤物视频在线| 玉足女爽爽91| 亚洲男人天堂av网| 中文字幕亚洲视频| 一色桃子久久精品亚洲| 日本一区二区三区电影| 国产亚洲精品超碰| 久久亚洲捆绑美女| 久久精品视频在线看| 欧美精品一区在线观看| 久久久久亚洲综合| 久久久久国产成人精品亚洲午夜| 精品剧情v国产在线观看在线| 日韩欧美一二三区| 欧美一区二区三区啪啪| 欧美一区二区三区性视频| 91精品国产综合久久福利软件| 51精品视频一区二区三区| 欧美日韩国产美| 7777精品伊人久久久大香线蕉经典版下载 | 欧美性xxxxxxxx| 欧美午夜一区二区三区免费大片| 在线观看一区日韩| 欧洲精品中文字幕| 欧美一级高清大全免费观看| 精品日本一线二线三线不卡| 精品粉嫩超白一线天av| 国产蜜臀97一区二区三区| 中文字幕亚洲在| 亚洲国产精品一区二区尤物区| 日韩主播视频在线| 精品亚洲国内自在自线福利| 国产91精品一区二区麻豆网站| 99国产精品久久久久久久久久久| 一本到不卡免费一区二区| 欧美羞羞免费网站| 欧美变态凌虐bdsm| 国产精品久线在线观看| 亚洲成人免费看| 国产麻豆视频一区| 91视频在线观看免费| 5566中文字幕一区二区电影| 久久先锋影音av| 一区二区三区美女视频| 美女免费视频一区二区| 不卡的看片网站| 欧美精三区欧美精三区| 久久精品视频在线看| 一区二区在线观看视频| 美国av一区二区| 97久久精品人人澡人人爽| 欧美一激情一区二区三区| 中文字幕一区av| 免费看日韩精品| 91网页版在线| 亚洲精品一区二区三区香蕉| 亚洲另类一区二区| 国产麻豆午夜三级精品| 欧美日韩极品在线观看一区| 亚洲国产一二三| 成人免费视频一区二区| 欧美精品99久久久**| 国产精品国产三级国产aⅴ无密码| 午夜不卡av在线| 91美女在线视频| 久久精品一区二区三区不卡| 爽好久久久欧美精品| 91视频在线看| 久久免费午夜影院| 日韩中文字幕区一区有砖一区 | 五月天久久比比资源色| 不卡视频一二三四| 精品国产91洋老外米糕| 日韩一区精品字幕| 在线观看91精品国产入口| 国产精品免费视频一区| 国产精品18久久久久久久久 | 国产欧美一区二区三区在线看蜜臀 | 中文字幕人成不卡一区| 国产一区二区美女| 欧美一区二区三区四区高清| 亚洲综合男人的天堂| 99精品久久免费看蜜臀剧情介绍| 久久蜜桃av一区二区天堂| 欧美aaaaaa午夜精品| 欧美日韩精品免费| 亚洲国产视频a| 欧美视频中文字幕| 伊人开心综合网| 在线免费观看一区| 亚洲久草在线视频| 色婷婷亚洲精品| 亚洲无线码一区二区三区| 日本福利一区二区| 亚洲最大成人综合| 欧美日韩国产精选| 婷婷综合久久一区二区三区|