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

📄 tqual.c

📁 关系型数据库 Postgresql 6.5.2
💻 C
📖 第 1 页 / 共 2 页
字号:
/*------------------------------------------------------------------------- * * tqual.c *	  POSTGRES "time" qualification code. * * Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION *	  $Header: /usr/local/cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.29.2.1 1999/08/02 05:25:19 scrappy Exp $ * *------------------------------------------------------------------------- *//* #define TQUALDEBUG	1 */#include "postgres.h"#include "utils/tqual.h"extern bool PostgresIsInitialized;SnapshotData SnapshotDirtyData;Snapshot	SnapshotDirty = &SnapshotDirtyData;Snapshot	QuerySnapshot = NULL;Snapshot	SerializableSnapshot = NULL;/* * XXX Transaction system override hacks start here */#ifndef GOODAMITransactionId HeapSpecialTransactionId = InvalidTransactionId;CommandId	HeapSpecialCommandId = FirstCommandId;voidsetheapoverride(bool on){	if (on)	{		TransactionIdStore(GetCurrentTransactionId(),						   &HeapSpecialTransactionId);		HeapSpecialCommandId = GetCurrentCommandId();	}	else		HeapSpecialTransactionId = InvalidTransactionId;}#endif	 /* !defined(GOODAMI) *//* * XXX Transaction system override hacks end here *//* * HeapTupleSatisfiesItself *		True iff heap tuple is valid for "itself." *		"{it}self" means valid as of everything that's happened *		in the current transaction, _including_ the current command. * * Note: *		Assumes heap tuple is valid. *//* * The satisfaction of "itself" requires the following: * * ((Xmin == my-transaction &&				the row was updated by the current transaction, and *		(Xmax is null						it was not deleted *		 [|| Xmax != my-transaction)])			[or it was deleted by another transaction] * || * * (Xmin is committed &&					the row was modified by a committed transaction, and *		(Xmax is null ||					the row has not been deleted, or *			(Xmax != my-transaction &&			the row was deleted by another transaction *			 Xmax is not committed)))			that has not been committed */boolHeapTupleSatisfiesItself(HeapTupleHeader tuple){	if (!(tuple->t_infomask & HEAP_XMIN_COMMITTED))	{		if (tuple->t_infomask & HEAP_XMIN_INVALID)			return false;		if (tuple->t_infomask & HEAP_MOVED_OFF)		{			if (TransactionIdDidCommit((TransactionId) tuple->t_cmin))			{				tuple->t_infomask |= HEAP_XMIN_INVALID;				return false;			}		}		else if (tuple->t_infomask & HEAP_MOVED_IN)		{			if (!TransactionIdDidCommit((TransactionId) tuple->t_cmin))			{				tuple->t_infomask |= HEAP_XMIN_INVALID;				return false;			}		}		else if (TransactionIdIsCurrentTransactionId(tuple->t_xmin))		{			if (tuple->t_infomask & HEAP_XMAX_INVALID)	/* xid invalid */				return true;			if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE)				return true;			return false;		}		else if (!TransactionIdDidCommit(tuple->t_xmin))		{			if (TransactionIdDidAbort(tuple->t_xmin))				tuple->t_infomask |= HEAP_XMIN_INVALID; /* aborted */			return false;		}		tuple->t_infomask |= HEAP_XMIN_COMMITTED;	}	/* the tuple was inserted validly */	if (tuple->t_infomask & HEAP_XMAX_INVALID)	/* xid invalid or aborted */		return true;	if (tuple->t_infomask & HEAP_XMAX_COMMITTED)	{		if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE)			return true;		return false;			/* updated by other */	}	if (TransactionIdIsCurrentTransactionId(tuple->t_xmax))	{		if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE)			return true;		return false;	}	if (!TransactionIdDidCommit(tuple->t_xmax))	{		if (TransactionIdDidAbort(tuple->t_xmax))			tuple->t_infomask |= HEAP_XMAX_INVALID;		/* aborted */		return true;	}	/* by here, deleting transaction has committed */	tuple->t_infomask |= HEAP_XMAX_COMMITTED;	if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE)		return true;	return false;}/* * HeapTupleSatisfiesNow *		True iff heap tuple is valid "now." *		"now" means valid including everything that's happened *		 in the current transaction _up to, but not including,_ *		 the current command. * * Note: *		Assumes heap tuple is valid. *//* * The satisfaction of "now" requires the following: * * ((Xmin == my-transaction &&				changed by the current transaction *	 Cmin != my-command &&					but not by this command, and *		(Xmax is null ||						the row has not been deleted, or *			(Xmax == my-transaction &&			it was deleted by the current transaction *			 Cmax != my-command)))				but not by this command, * ||										or * *	(Xmin is committed &&					the row was modified by a committed transaction, and *		(Xmax is null ||					the row has not been deleted, or *			(Xmax == my-transaction &&			the row is being deleted by this command, or *			 Cmax == my-command) || *			(Xmax is not committed &&			the row was deleted by another transaction *			 Xmax != my-transaction))))			that has not been committed * *		mao says 17 march 1993:  the tests in this routine are correct; *		if you think they're not, you're wrong, and you should think *		about it again.  i know, it happened to me.  we don't need to *		check commit time against the start time of this transaction *		because 2ph locking protects us from doing the wrong thing. *		if you mess around here, you'll break serializability.  the only *		problem with this code is that it does the wrong thing for system *		catalog updates, because the catalogs aren't subject to 2ph, so *		the serializability guarantees we provide don't extend to xacts *		that do catalog accesses.  this is unfortunate, but not critical. */boolHeapTupleSatisfiesNow(HeapTupleHeader tuple){	if (AMI_OVERRIDE)		return true;	/*	 * If the transaction system isn't yet initialized, then we assume	 * that transactions committed.  We only look at system catalogs	 * during startup, so this is less awful than it seems, but it's still	 * pretty awful.	 */	if (!PostgresIsInitialized)		return ((bool) (TransactionIdIsValid(tuple->t_xmin) &&						!TransactionIdIsValid(tuple->t_xmax)));	if (!(tuple->t_infomask & HEAP_XMIN_COMMITTED))	{		if (tuple->t_infomask & HEAP_XMIN_INVALID)			return false;		if (tuple->t_infomask & HEAP_MOVED_OFF)		{			if (TransactionIdDidCommit((TransactionId) tuple->t_cmin))			{				tuple->t_infomask |= HEAP_XMIN_INVALID;				return false;			}		}		else if (tuple->t_infomask & HEAP_MOVED_IN)		{			if (!TransactionIdDidCommit((TransactionId) tuple->t_cmin))			{				tuple->t_infomask |= HEAP_XMIN_INVALID;				return false;			}		}		else if (TransactionIdIsCurrentTransactionId(tuple->t_xmin))		{			if (CommandIdGEScanCommandId(tuple->t_cmin))				return false;	/* inserted after scan started */			if (tuple->t_infomask & HEAP_XMAX_INVALID)	/* xid invalid */				return true;			Assert(TransactionIdIsCurrentTransactionId(tuple->t_xmax));			if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE)				return true;			if (CommandIdGEScanCommandId(tuple->t_cmax))				return true;	/* deleted after scan started */			else				return false;	/* deleted before scan started */		}		else if (!TransactionIdDidCommit(tuple->t_xmin))		{			if (TransactionIdDidAbort(tuple->t_xmin))				tuple->t_infomask |= HEAP_XMIN_INVALID; /* aborted */			return false;		}		tuple->t_infomask |= HEAP_XMIN_COMMITTED;	}	/* by here, the inserting transaction has committed */	if (tuple->t_infomask & HEAP_XMAX_INVALID)	/* xid invalid or aborted */		return true;	if (tuple->t_infomask & HEAP_XMAX_COMMITTED)	{		if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE)			return true;		return false;	}	if (TransactionIdIsCurrentTransactionId(tuple->t_xmax))	{		if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE)			return true;		if (CommandIdGEScanCommandId(tuple->t_cmax))			return true;		/* deleted after scan started */		else			return false;		/* deleted before scan started */	}	if (!TransactionIdDidCommit(tuple->t_xmax))	{		if (TransactionIdDidAbort(tuple->t_xmax))			tuple->t_infomask |= HEAP_XMAX_INVALID;		/* aborted */		return true;	}	/* xmax transaction committed */	tuple->t_infomask |= HEAP_XMAX_COMMITTED;	if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE)		return true;	return false;}intHeapTupleSatisfiesUpdate(HeapTuple tuple){	HeapTupleHeader th = tuple->t_data;	if (AMI_OVERRIDE)		return HeapTupleMayBeUpdated;	if (!(th->t_infomask & HEAP_XMIN_COMMITTED))	{		if (th->t_infomask & HEAP_XMIN_INVALID) /* xid invalid or aborted */			return HeapTupleInvisible;		if (th->t_infomask & HEAP_MOVED_OFF)		{			if (TransactionIdDidCommit((TransactionId) th->t_cmin))			{				th->t_infomask |= HEAP_XMIN_INVALID;				return HeapTupleInvisible;			}		}		else if (th->t_infomask & HEAP_MOVED_IN)		{			if (!TransactionIdDidCommit((TransactionId) th->t_cmin))			{				th->t_infomask |= HEAP_XMIN_INVALID;				return HeapTupleInvisible;			}		}		else if (TransactionIdIsCurrentTransactionId(th->t_xmin))		{			if (CommandIdGEScanCommandId(th->t_cmin) && !heapisoverride())				return HeapTupleInvisible;		/* inserted after scan												 * started */			if (th->t_infomask & HEAP_XMAX_INVALID)		/* xid invalid */				return HeapTupleMayBeUpdated;			Assert(TransactionIdIsCurrentTransactionId(th->t_xmax));			if (th->t_infomask & HEAP_MARKED_FOR_UPDATE)

⌨️ 快捷键说明

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