Fix very old bug which made tuples changed/inserted by a commnd
authorVadim B. Mikheev
Fri, 29 Aug 1997 09:05:25 +0000 (09:05 +0000)
committerVadim B. Mikheev
Fri, 29 Aug 1997 09:05:25 +0000 (09:05 +0000)
visible to command itself (so we had multiple update of updated tuples,
etc).

src/backend/access/transam/xact.c
src/backend/utils/time/tqual.c
src/include/access/xact.h

index 903cca411300cb78af44bdcc4265a3ec9bf064f0..5ac4a42c7c7dd06e3c123e6927d1233c0a934766 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * 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:
@@ -377,6 +377,22 @@ GetCurrentCommandId()
     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
@@ -432,6 +448,18 @@ CommandIdIsCurrentCommandId(CommandId cid)
    (cid == s->commandId) ? true : false;
 }
 
+bool
+CommandIdGEScanCommandId(CommandId cid)
+{
+    TransactionState s = CurrentTransactionState;
+    
+    if (AMI_OVERRIDE)
+   return false;
+    
+    return     
+   (cid >= s->scanCommandId) ? true : false;
+}
+
 
 /* --------------------------------
  * ClearCommandIdCounterOverflowFlag
@@ -458,11 +486,22 @@ CommandCounterIncrement()
    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
  * ----------------------------------------------------------------
@@ -757,6 +796,7 @@ StartTransaction()
      * ----------------
      */
     s->commandId =         FirstCommandId;
+    s->scanCommandId =         FirstCommandId;
     s->startTime =         GetCurrentAbsoluteTime();
     
     /* ----------------
index a5843004733181bcd7bd7f957c7951c46402bdfd..1fcf3679fe4cc562d5a4b400c0339022ef3ccbfc 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * 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 $
  *
  *-------------------------------------------------------------------------
  */
@@ -580,6 +580,13 @@ HeapTupleSatisfiesItself(HeapTuple tuple)
  *     (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
@@ -615,13 +622,13 @@ HeapTupleSatisfiesNow(HeapTuple tuple)
     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);
@@ -629,7 +636,7 @@ HeapTupleSatisfiesNow(HeapTuple tuple)
        
        Assert(TransactionIdIsCurrentTransactionId((TransactionId)tuple->t_xmax));
        
-       if (CommandIdIsCurrentCommandId(tuple->t_cmax)) {
+       if (CommandIdGEScanCommandId(tuple->t_cmax)) {
        return (true);
        }
    }
@@ -813,13 +820,13 @@ HeapTupleSatisfiesUpperUnboundedInternalTimeQual(HeapTuple tuple,
     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);
@@ -827,7 +834,7 @@ HeapTupleSatisfiesUpperUnboundedInternalTimeQual(HeapTuple tuple,
        
        Assert(TransactionIdIsCurrentTransactionId((TransactionId)tuple->t_xmax));
        
-       return ((bool) !CommandIdIsCurrentCommandId(tuple->t_cmax));
+       return ((bool) !CommandIdGEScanCommandId(tuple->t_cmax));
    }
    
    if (!TransactionIdDidCommit((TransactionId)tuple->t_xmin)) {
@@ -849,7 +856,8 @@ HeapTupleSatisfiesUpperUnboundedInternalTimeQual(HeapTuple tuple,
    }
    
    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)) {
index ef148c6b9b686e1fec1151bd63133753b6c54c66..0aec4bccb82426164c8ae61578f841e2aa7b4e85 100644 (file)
@@ -6,7 +6,7 @@
  *
  * 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 $
  *
  *-------------------------------------------------------------------------
  */
@@ -22,7 +22,8 @@
 typedef struct TransactionStateData {
     TransactionId  transactionIdData;
     CommandId      commandId;
-    AbsoluteTime       startTime;
+    CommandId      scanCommandId;
+    AbsoluteTime   startTime;
     int            state;
     int            blockState;
 } TransactionStateData;
@@ -63,9 +64,12 @@ extern bool IsAbortedTransactionBlockState(void);
 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);