📄 tqual.c
字号:
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 + -