Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit3152996

Browse files
committed
Fix very old bug which made tuples changed/inserted by a commnd
visible to command itself (so we had multiple update of updated tuples,etc).
1 parente06099c commit3152996

File tree

3 files changed

+63
-11
lines changed

3 files changed

+63
-11
lines changed

‎src/backend/access/transam/xact.c

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.12 1997/08/19 21:30:19 momjian Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.13 1997/08/29 09:02:11 vadim Exp $
1111
*
1212
* NOTES
1313
*Transaction aborts can now occur two ways:
@@ -377,6 +377,22 @@ GetCurrentCommandId()
377377
returns->commandId;
378378
}
379379

380+
CommandId
381+
GetScanCommandId()
382+
{
383+
TransactionStates=CurrentTransactionState;
384+
385+
/* ----------------
386+
*if the transaction system is disabled, we return
387+
* the special "disabled" command id.
388+
* ----------------
389+
*/
390+
if (s->state==TRANS_DISABLED)
391+
return (CommandId)DisabledCommandId;
392+
393+
returns->scanCommandId;
394+
}
395+
380396

381397
/* --------------------------------
382398
*GetCurrentTransactionStartTime
@@ -432,6 +448,18 @@ CommandIdIsCurrentCommandId(CommandId cid)
432448
(cid==s->commandId) ? true : false;
433449
}
434450

451+
bool
452+
CommandIdGEScanCommandId(CommandIdcid)
453+
{
454+
TransactionStates=CurrentTransactionState;
455+
456+
if (AMI_OVERRIDE)
457+
return false;
458+
459+
return
460+
(cid >=s->scanCommandId) ? true : false;
461+
}
462+
435463

436464
/* --------------------------------
437465
*ClearCommandIdCounterOverflowFlag
@@ -458,11 +486,22 @@ CommandCounterIncrement()
458486
elog(WARN,"You may only have 65535 commands per transaction");
459487
}
460488

489+
CurrentTransactionStateData.scanCommandId=
490+
CurrentTransactionStateData.commandId;
491+
461492
/* make cache changes visible to me */
462493
AtCommit_Cache();
463494
AtStart_Cache();
464495
}
465496

497+
void
498+
SetScanCommandId (CommandIdsavedId)
499+
{
500+
501+
CurrentTransactionStateData.scanCommandId=savedId;
502+
503+
}
504+
466505
/* ----------------------------------------------------------------
467506
* initialization stuff
468507
* ----------------------------------------------------------------
@@ -757,6 +796,7 @@ StartTransaction()
757796
* ----------------
758797
*/
759798
s->commandId=FirstCommandId;
799+
s->scanCommandId=FirstCommandId;
760800
s->startTime=GetCurrentAbsoluteTime();
761801

762802
/* ----------------

‎src/backend/utils/time/tqual.c

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.3 1997/08/19 21:36:12 momjian Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.4 1997/08/29 09:04:54 vadim Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -580,6 +580,13 @@ HeapTupleSatisfiesItself(HeapTuple tuple)
580580
* (Xmax is not committed && the row was deleted by another transaction
581581
* Xmax != my-transaction)))) that has not been committed
582582
*
583+
* XXX
584+
*CommandId stuff didn't work properly if one used SQL-functions in
585+
*UPDATE/INSERT(fromSELECT)/DELETE scans: SQL-funcs call
586+
*CommandCounterIncrement and made tuples changed/inserted by
587+
*current command visible to command itself (so we had multiple
588+
*update of updated tuples, etc).- vadim 08/29/97
589+
*
583590
*mao says 17 march 1993: the tests in this routine are correct;
584591
*if you think they're not, you're wrong, and you should think
585592
*about it again. i know, it happened to me. we don't need to
@@ -615,21 +622,21 @@ HeapTupleSatisfiesNow(HeapTuple tuple)
615622
if (!AbsoluteTimeIsBackwardCompatiblyValid(tuple->t_tmin)) {
616623

617624
if (TransactionIdIsCurrentTransactionId((TransactionId)tuple->t_xmin)
618-
&&CommandIdIsCurrentCommandId(tuple->t_cmin)) {
625+
&&CommandIdGEScanCommandId(tuple->t_cmin)) {
619626

620627
return (false);
621628
}
622629

623630
if (TransactionIdIsCurrentTransactionId((TransactionId)tuple->t_xmin)
624-
&& !CommandIdIsCurrentCommandId(tuple->t_cmin)) {
631+
&& !CommandIdGEScanCommandId(tuple->t_cmin)) {
625632

626633
if (!TransactionIdIsValid((TransactionId)tuple->t_xmax)) {
627634
return (true);
628635
}
629636

630637
Assert(TransactionIdIsCurrentTransactionId((TransactionId)tuple->t_xmax));
631638

632-
if (CommandIdIsCurrentCommandId(tuple->t_cmax)) {
639+
if (CommandIdGEScanCommandId(tuple->t_cmax)) {
633640
return (true);
634641
}
635642
}
@@ -813,21 +820,21 @@ HeapTupleSatisfiesUpperUnboundedInternalTimeQual(HeapTuple tuple,
813820
if (!AbsoluteTimeIsBackwardCompatiblyValid(tuple->t_tmin)) {
814821

815822
if (TransactionIdIsCurrentTransactionId((TransactionId)tuple->t_xmin)&&
816-
CommandIdIsCurrentCommandId(tuple->t_cmin)) {
823+
CommandIdGEScanCommandId(tuple->t_cmin)) {
817824

818825
return (false);
819826
}
820827

821828
if (TransactionIdIsCurrentTransactionId((TransactionId)tuple->t_xmin)&&
822-
!CommandIdIsCurrentCommandId(tuple->t_cmin)) {
829+
!CommandIdGEScanCommandId(tuple->t_cmin)) {
823830

824831
if (!TransactionIdIsValid((TransactionId)tuple->t_xmax)) {
825832
return (true);
826833
}
827834

828835
Assert(TransactionIdIsCurrentTransactionId((TransactionId)tuple->t_xmax));
829836

830-
return ((bool) !CommandIdIsCurrentCommandId(tuple->t_cmax));
837+
return ((bool) !CommandIdGEScanCommandId(tuple->t_cmax));
831838
}
832839

833840
if (!TransactionIdDidCommit((TransactionId)tuple->t_xmin)) {
@@ -849,7 +856,8 @@ HeapTupleSatisfiesUpperUnboundedInternalTimeQual(HeapTuple tuple,
849856
}
850857

851858
if (TransactionIdIsCurrentTransactionId((TransactionId)tuple->t_xmax)) {
852-
return (CommandIdIsCurrentCommandId(tuple->t_cmin));
859+
return (CommandIdGEScanCommandId(tuple->t_cmin));
860+
/* it looks like error ^^^^ */
853861
}
854862

855863
if (!TransactionIdDidCommit((TransactionId)tuple->t_xmax)) {

‎src/include/access/xact.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*
77
* Copyright (c) 1994, Regents of the University of California
88
*
9-
* $Id: xact.h,v 1.5 1997/08/19 21:37:40 momjian Exp $
9+
* $Id: xact.h,v 1.6 1997/08/29 09:05:25 vadim Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -22,7 +22,8 @@
2222
typedefstructTransactionStateData {
2323
TransactionIdtransactionIdData;
2424
CommandIdcommandId;
25-
AbsoluteTimestartTime;
25+
CommandIdscanCommandId;
26+
AbsoluteTimestartTime;
2627
intstate;
2728
intblockState;
2829
}TransactionStateData;
@@ -63,9 +64,12 @@ extern bool IsAbortedTransactionBlockState(void);
6364
externvoidOverrideTransactionSystem(boolflag);
6465
externTransactionIdGetCurrentTransactionId(void);
6566
externCommandIdGetCurrentCommandId(void);
67+
externCommandIdGetScanCommandId(void);
68+
externvoidSetScanCommandId(CommandId);
6669
externAbsoluteTimeGetCurrentTransactionStartTime(void);
6770
externboolTransactionIdIsCurrentTransactionId(TransactionIdxid);
6871
externboolCommandIdIsCurrentCommandId(CommandIdcid);
72+
externboolCommandIdGEScanCommandId(CommandIdcid);
6973
externvoidCommandCounterIncrement(void);
7074
externvoidInitializeTransactionSystem(void);
7175
externboolCurrentXactInProgress(void);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp