*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.12 1997/08/19 21:30:19 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.13 1997/08/29 09:02:11 vadim Exp $
*
* NOTES
* Transaction aborts can now occur two ways:
return s->commandId;
}
+CommandId
+GetScanCommandId()
+{
+ TransactionState s = CurrentTransactionState;
+
+ /* ----------------
+ * if the transaction system is disabled, we return
+ * the special "disabled" command id.
+ * ----------------
+ */
+ if (s->state == TRANS_DISABLED)
+ return (CommandId) DisabledCommandId;
+
+ return s->scanCommandId;
+}
+
/* --------------------------------
* GetCurrentTransactionStartTime
(cid == s->commandId) ? true : false;
}
+bool
+CommandIdGEScanCommandId(CommandId cid)
+{
+ TransactionState s = CurrentTransactionState;
+
+ if (AMI_OVERRIDE)
+ return false;
+
+ return
+ (cid >= s->scanCommandId) ? true : false;
+}
+
/* --------------------------------
* ClearCommandIdCounterOverflowFlag
elog(WARN, "You may only have 65535 commands per transaction");
}
+ CurrentTransactionStateData.scanCommandId =
+ CurrentTransactionStateData.commandId;
+
/* make cache changes visible to me */
AtCommit_Cache();
AtStart_Cache();
}
+void
+SetScanCommandId (CommandId savedId)
+{
+
+ CurrentTransactionStateData.scanCommandId = savedId;
+
+}
+
/* ----------------------------------------------------------------
* initialization stuff
* ----------------------------------------------------------------
* ----------------
*/
s->commandId = FirstCommandId;
+ s->scanCommandId = FirstCommandId;
s->startTime = GetCurrentAbsoluteTime();
/* ----------------
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.3 1997/08/19 21:36:12 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.4 1997/08/29 09:04:54 vadim Exp $
*
*-------------------------------------------------------------------------
*/
* (Xmax is not committed && the row was deleted by another transaction
* Xmax != my-transaction)))) that has not been committed
*
+ * XXX
+ * CommandId stuff didn't work properly if one used SQL-functions in
+ * UPDATE/INSERT(fromSELECT)/DELETE scans: SQL-funcs call
+ * CommandCounterIncrement and made tuples changed/inserted by
+ * current command visible to command itself (so we had multiple
+ * update of updated tuples, etc). - vadim 08/29/97
+ *
* 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
if (!AbsoluteTimeIsBackwardCompatiblyValid(tuple->t_tmin)) {
if (TransactionIdIsCurrentTransactionId((TransactionId)tuple->t_xmin)
- && CommandIdIsCurrentCommandId(tuple->t_cmin)) {
+ && CommandIdGEScanCommandId(tuple->t_cmin)) {
return (false);
}
if (TransactionIdIsCurrentTransactionId((TransactionId)tuple->t_xmin)
- && !CommandIdIsCurrentCommandId(tuple->t_cmin)) {
+ && !CommandIdGEScanCommandId(tuple->t_cmin)) {
if (!TransactionIdIsValid((TransactionId)tuple->t_xmax)) {
return (true);
Assert(TransactionIdIsCurrentTransactionId((TransactionId)tuple->t_xmax));
- if (CommandIdIsCurrentCommandId(tuple->t_cmax)) {
+ if (CommandIdGEScanCommandId(tuple->t_cmax)) {
return (true);
}
}
if (!AbsoluteTimeIsBackwardCompatiblyValid(tuple->t_tmin)) {
if (TransactionIdIsCurrentTransactionId((TransactionId)tuple->t_xmin) &&
- CommandIdIsCurrentCommandId(tuple->t_cmin)) {
+ CommandIdGEScanCommandId(tuple->t_cmin)) {
return (false);
}
if (TransactionIdIsCurrentTransactionId((TransactionId)tuple->t_xmin) &&
- !CommandIdIsCurrentCommandId(tuple->t_cmin)) {
+ !CommandIdGEScanCommandId(tuple->t_cmin)) {
if (!TransactionIdIsValid((TransactionId)tuple->t_xmax)) {
return (true);
Assert(TransactionIdIsCurrentTransactionId((TransactionId)tuple->t_xmax));
- return ((bool) !CommandIdIsCurrentCommandId(tuple->t_cmax));
+ return ((bool) !CommandIdGEScanCommandId(tuple->t_cmax));
}
if (!TransactionIdDidCommit((TransactionId)tuple->t_xmin)) {
}
if (TransactionIdIsCurrentTransactionId((TransactionId)tuple->t_xmax)) {
- return (CommandIdIsCurrentCommandId(tuple->t_cmin));
+ return (CommandIdGEScanCommandId(tuple->t_cmin));
+ /* it looks like error ^^^^ */
}
if (!TransactionIdDidCommit((TransactionId)tuple->t_xmax)) {
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: xact.h,v 1.5 1997/08/19 21:37:40 momjian Exp $
+ * $Id: xact.h,v 1.6 1997/08/29 09:05:25 vadim Exp $
*
*-------------------------------------------------------------------------
*/
typedef struct TransactionStateData {
TransactionId transactionIdData;
CommandId commandId;
- AbsoluteTime startTime;
+ CommandId scanCommandId;
+ AbsoluteTime startTime;
int state;
int blockState;
} TransactionStateData;
extern void OverrideTransactionSystem(bool flag);
extern TransactionId GetCurrentTransactionId(void);
extern CommandId GetCurrentCommandId(void);
+extern CommandId GetScanCommandId(void);
+extern void SetScanCommandId(CommandId);
extern AbsoluteTime GetCurrentTransactionStartTime(void);
extern bool TransactionIdIsCurrentTransactionId(TransactionId xid);
extern bool CommandIdIsCurrentCommandId(CommandId cid);
+extern bool CommandIdGEScanCommandId(CommandId cid);
extern void CommandCounterIncrement(void);
extern void InitializeTransactionSystem(void);
extern bool CurrentXactInProgress(void);