OSDN Git Service

Fix very old bug which made tuples changed/inserted by a commnd
authorVadim B. Mikheev <vadim4o@yahoo.com>
Fri, 29 Aug 1997 09:05:25 +0000 (09:05 +0000)
committerVadim B. Mikheev <vadim4o@yahoo.com>
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 903cca4..5ac4a42 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 a584300..1fcf367 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 ef148c6..0aec4bc 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);