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

📄 tqual.c

📁 关系型数据库 Postgresql 6.5.2
💻 C
📖 第 1 页 / 共 2 页
字号:
				return HeapTupleMayBeUpdated;			if (CommandIdGEScanCommandId(th->t_cmax))				return HeapTupleSelfUpdated;	/* updated after scan												 * started */			else				return HeapTupleInvisible;		/* updated before scan												 * started */		}		else if (!TransactionIdDidCommit(th->t_xmin))		{			if (TransactionIdDidAbort(th->t_xmin))				th->t_infomask |= HEAP_XMIN_INVALID;	/* aborted */			return HeapTupleInvisible;		}		th->t_infomask |= HEAP_XMIN_COMMITTED;	}	/* by here, the inserting transaction has committed */	if (th->t_infomask & HEAP_XMAX_INVALID)		/* xid invalid or aborted */		return HeapTupleMayBeUpdated;	if (th->t_infomask & HEAP_XMAX_COMMITTED)	{		if (th->t_infomask & HEAP_MARKED_FOR_UPDATE)			return HeapTupleMayBeUpdated;		return HeapTupleUpdated;/* updated by other */	}	if (TransactionIdIsCurrentTransactionId(th->t_xmax))	{		if (th->t_infomask & HEAP_MARKED_FOR_UPDATE)			return HeapTupleMayBeUpdated;		if (CommandIdGEScanCommandId(th->t_cmax))			return HeapTupleSelfUpdated;		/* updated after scan												 * started */		else			return HeapTupleInvisible;	/* updated before scan started */	}	if (!TransactionIdDidCommit(th->t_xmax))	{		if (TransactionIdDidAbort(th->t_xmax))		{			th->t_infomask |= HEAP_XMAX_INVALID;		/* aborted */			return HeapTupleMayBeUpdated;		}		/* running xact */		return HeapTupleBeingUpdated;	/* in updation by other */	}	/* xmax transaction committed */	th->t_infomask |= HEAP_XMAX_COMMITTED;	if (th->t_infomask & HEAP_MARKED_FOR_UPDATE)		return HeapTupleMayBeUpdated;	return HeapTupleUpdated;	/* updated by other */}boolHeapTupleSatisfiesDirty(HeapTupleHeader tuple){	SnapshotDirty->xmin = SnapshotDirty->xmax = InvalidTransactionId;	ItemPointerSetInvalid(&(SnapshotDirty->tid));	if (AMI_OVERRIDE)		return true;	if (!(tuple->t_infomask & HEAP_XMIN_COMMITTED))	{		if (tuple->t_infomask & HEAP_XMIN_INVALID)			return false;		if (tuple->t_infomask & HEAP_MOVED_OFF)		{			/*			 * HeapTupleSatisfiesDirty is used by unique btree-s and so			 * may be used while vacuuming.			 */			if (TransactionIdIsCurrentTransactionId((TransactionId) tuple->t_cmin))				return false;			if (TransactionIdDidCommit((TransactionId) tuple->t_cmin))			{				tuple->t_infomask |= HEAP_XMIN_INVALID;				return false;			}			tuple->t_infomask |= HEAP_XMIN_COMMITTED;		}		else if (tuple->t_infomask & HEAP_MOVED_IN)		{			if (!TransactionIdIsCurrentTransactionId((TransactionId) tuple->t_cmin))			{				if (TransactionIdDidCommit((TransactionId) tuple->t_cmin))					tuple->t_infomask |= HEAP_XMIN_COMMITTED;				else				{					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;			Assert(TransactionIdIsCurrentTransactionId(tuple->t_xmax));			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;			}			SnapshotDirty->xmin = tuple->t_xmin;			return true;		/* in insertion by other */		}		else			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;		SnapshotDirty->tid = tuple->t_ctid;		return false;			/* updated by other */	}	if (TransactionIdIsCurrentTransactionId(tuple->t_xmax))		return false;	if (!TransactionIdDidCommit(tuple->t_xmax))	{		if (TransactionIdDidAbort(tuple->t_xmax))		{			tuple->t_infomask |= HEAP_XMAX_INVALID;		/* aborted */			return true;		}		/* running xact */		SnapshotDirty->xmax = tuple->t_xmax;		return true;			/* in updation by other */	}	/* xmax transaction committed */	tuple->t_infomask |= HEAP_XMAX_COMMITTED;	if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE)		return true;	SnapshotDirty->tid = tuple->t_ctid;	return false;				/* updated by other */}boolHeapTupleSatisfiesSnapshot(HeapTupleHeader tuple, Snapshot snapshot){	if (AMI_OVERRIDE)		return true;	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 - have to check	 * when...	 */	if (tuple->t_xmin >= snapshot->xmax)		return false;	if (tuple->t_xmin >= snapshot->xmin)	{		uint32		i;		for (i = 0; i < snapshot->xcnt; i++)		{			if (tuple->t_xmin == snapshot->xip[i])				return false;		}	}	if (tuple->t_infomask & HEAP_XMAX_INVALID)	/* xid invalid or aborted */		return true;	if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE)		return true;	if (!(tuple->t_infomask & HEAP_XMAX_COMMITTED))	{		if (TransactionIdIsCurrentTransactionId(tuple->t_xmax))		{			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_xmax >= snapshot->xmax)		return true;	if (tuple->t_xmax >= snapshot->xmin)	{		uint32		i;		for (i = 0; i < snapshot->xcnt; i++)		{			if (tuple->t_xmax == snapshot->xip[i])				return true;		}	}	return false;}voidSetQuerySnapshot(void){	/* 1st call in xaction */	if (SerializableSnapshot == NULL)	{		SerializableSnapshot = GetSnapshotData(true);		QuerySnapshot = SerializableSnapshot;		Assert(QuerySnapshot != NULL);		return;	}	if (QuerySnapshot != SerializableSnapshot)	{		free(QuerySnapshot->xip);		free(QuerySnapshot);	}	if (XactIsoLevel == XACT_SERIALIZABLE)		QuerySnapshot = SerializableSnapshot;	else		QuerySnapshot = GetSnapshotData(false);	Assert(QuerySnapshot != NULL);}voidFreeXactSnapshot(void){	if (QuerySnapshot != NULL && QuerySnapshot != SerializableSnapshot)	{		free(QuerySnapshot->xip);		free(QuerySnapshot);	}	QuerySnapshot = NULL;	if (SerializableSnapshot != NULL)	{		free(SerializableSnapshot->xip);		free(SerializableSnapshot);	}	SerializableSnapshot = NULL;}

⌨️ 快捷键说明

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