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

Commitea94f56

Browse files
authored
Merge pull request#12 from CherkashinSergey/add_xact_support
Add xact support: bugfix
2 parents238c1ef +054e746 commitea94f56

File tree

3 files changed

+59
-62
lines changed

3 files changed

+59
-62
lines changed

‎expected/pg_variables_trans.out

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1758,11 +1758,11 @@ SELECT pgv_free();
17581758

17591759
(1 row)
17601760

1761-
SELECT package FROM pgv_stats();
1761+
SELECT package FROM pgv_stats() ORDER BY package;
17621762
package
17631763
---------
1764-
vars2
17651764
vars
1765+
vars2
17661766
(2 rows)
17671767

17681768
SELECT * FROM pgv_list() ORDER BY package, name;
@@ -1771,11 +1771,11 @@ SELECT * FROM pgv_list() ORDER BY package, name;
17711771
(0 rows)
17721772

17731773
RELEASE sp5;
1774-
SELECT package FROM pgv_stats();
1774+
SELECT package FROM pgv_stats() ORDER BY package;
17751775
package
17761776
---------
1777-
vars2
17781777
vars
1778+
vars2
17791779
(2 rows)
17801780

17811781
SELECT * FROM pgv_list() ORDER BY package, name;
@@ -1784,7 +1784,7 @@ SELECT * FROM pgv_list() ORDER BY package, name;
17841784
(0 rows)
17851785

17861786
RELEASE sp4;
1787-
SELECT package FROM pgv_stats();
1787+
SELECT package FROM pgv_stats() ORDER BY package;
17881788
package
17891789
---------
17901790
vars
@@ -1796,7 +1796,7 @@ SELECT * FROM pgv_list() ORDER BY package, name;
17961796
(0 rows)
17971797

17981798
COMMIT;
1799-
SELECT package FROM pgv_stats();
1799+
SELECT package FROM pgv_stats() ORDER BY package;
18001800
package
18011801
---------
18021802
(0 rows)

‎pg_variables.c

Lines changed: 49 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ static void removeFromChangedVars(Package *package);
7777

7878
/* Constructors */
7979
staticvoidmakePackHTAB(Package*package,boolis_trans);
80-
80+
staticinlineChangedObject*
81+
makeChangedObject(TransObject*object,MemoryContextctx);
8182

8283
#defineCHECK_ARGS_FOR_NULL() \
8384
do { \
@@ -1247,8 +1248,7 @@ static void
12471248
makePackHTAB(Package*package,boolis_trans)
12481249
{
12491250
HASHCTLctl;
1250-
charkey[NAMEDATALEN],
1251-
hash_name[BUFSIZ];
1251+
charhash_name[BUFSIZ];
12521252

12531253
if (is_trans)
12541254
package->hctxTransact=AllocSetContextCreate(ModuleContext,
@@ -1260,7 +1260,7 @@ makePackHTAB(Package *package, bool is_trans)
12601260
ALLOCSET_DEFAULT_SIZES);
12611261

12621262
snprintf(hash_name,BUFSIZ,"%s variables hash for package \"%s\"",
1263-
is_trans ?"Transactional" :"Regular",key);
1263+
is_trans ?"Transactional" :"Regular",package->transObject.name);
12641264
ctl.keysize=NAMEDATALEN;
12651265
ctl.entrysize=sizeof(Variable);
12661266
ctl.hcxt= (is_trans ?package->hctxTransact :package->hctxRegular);
@@ -1677,6 +1677,9 @@ rollbackSavepoint(TransObject *object, TransObjectType type)
16771677
/* Restore regular vars HTAB */
16781678
makePackHTAB((Package*)object, false);
16791679
}
1680+
else
1681+
/* Pass current state to parent level */
1682+
releaseSavepoint(object,TRANS_PACKAGE);
16801683
}
16811684
else
16821685
{
@@ -1696,39 +1699,57 @@ static void
16961699
releaseSavepoint(TransObject*object,TransObjectTypetype)
16971700
{
16981701
dlist_head*states;
1699-
17001702
Assert(GetActualState(object)->level==GetCurrentTransactionNestLevel());
1701-
states=&object->states;
17021703

1703-
/* Object existed in parent transaction */
1704-
if (dlist_has_next(states,dlist_head_node(states)))
1704+
/* Mark object as changed in parent transaction... */
1705+
if (!dlist_is_empty(changesStack)/* ...if there is an upper level... */
1706+
/* ...and object is not yet in list of that level changes. */
1707+
&& !isObjectChangedInUpperTrans(object))
17051708
{
1706-
TransState*stateToDelete;
1707-
dlist_node*nodeToDelete;
1709+
ChangedObject*co_new;
1710+
ChangesStackNode*csn;
17081711

1709-
/* Remove previous state */
1710-
nodeToDelete=dlist_next_node(states,dlist_head_node(states));
1711-
stateToDelete=dlist_container(TransState,node,nodeToDelete);
1712-
removeState(object,type,stateToDelete);
1713-
}
1712+
/*
1713+
* Impossible to push in upper list existing node
1714+
* because it was created in another context
1715+
*/
1716+
csn=dlist_head_element(ChangesStackNode,node,changesStack);
1717+
co_new=makeChangedObject(object,csn->ctx);
1718+
dlist_push_head(type==TRANS_PACKAGE ?csn->changedPacksList :
1719+
csn->changedVarsList,
1720+
&co_new->node);
17141721

1715-
/*
1716-
* Object has no more previous states and can be completely removed if
1717-
* necessary
1718-
*/
1719-
if (!GetActualState(object)->is_valid&&
1720-
!dlist_has_next(states,dlist_head_node(states)))
1721-
{
1722-
removeObject(object,type);
17231722
}
1724-
/* Change subxact level due to release */
17251723
else
17261724
{
1727-
TransState*state;
1725+
states=&object->states;
17281726

1729-
state=GetActualState(object);
1730-
state->level--;
1727+
/* If object existed in parent transaction... */
1728+
if (dlist_has_next(states,dlist_head_node(states)))
1729+
{
1730+
TransState*stateToDelete;
1731+
dlist_node*nodeToDelete;
1732+
1733+
/* ...remove its previous state */
1734+
nodeToDelete=dlist_next_node(states,dlist_head_node(states));
1735+
stateToDelete=dlist_container(TransState,node,nodeToDelete);
1736+
removeState(object,type,stateToDelete);
1737+
}
1738+
1739+
/*
1740+
* Object has no more previous states and can be completely removed if
1741+
* necessary
1742+
*/
1743+
if (!GetActualState(object)->is_valid&&
1744+
!dlist_has_next(states,dlist_head_node(states)))
1745+
{
1746+
removeObject(object,type);
1747+
return;
1748+
}
17311749
}
1750+
1751+
/* Change subxact level due to release */
1752+
GetActualState(object)->level--;
17321753
}
17331754

17341755
/*
@@ -1961,31 +1982,7 @@ processChanges(Action action)
19611982
GetActualState(variable)->is_valid= false;
19621983
}
19631984

1964-
/* Did this object change at parent level? */
1965-
if (dlist_is_empty(changesStack)||
1966-
isObjectChangedInUpperTrans(object))
1967-
{
1968-
/* We just have to drop previous state */
1969-
releaseSavepoint(object,i ?TRANS_VARIABLE :TRANS_PACKAGE);
1970-
}
1971-
else
1972-
{
1973-
/* Mark object as changed at parent level */
1974-
ChangedObject*co_new;
1975-
ChangesStackNode*csn;
1976-
1977-
/*
1978-
* Impossible to push in upper list existing node
1979-
* because it was created in another context
1980-
*/
1981-
csn=dlist_head_element(ChangesStackNode,node,changesStack);
1982-
co_new=makeChangedObject(object,csn->ctx);
1983-
dlist_push_head(i ?csn->changedVarsList :
1984-
csn->changedPacksList,&co_new->node);
1985-
1986-
/* Change subxact level due to release */
1987-
GetActualState(object)->level--;
1988-
}
1985+
releaseSavepoint(object,i ?TRANS_VARIABLE :TRANS_PACKAGE);
19891986
break;
19901987
}
19911988
}

‎sql/pg_variables_trans.sql

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -441,16 +441,16 @@ SELECT pgv_set('vars2', 'trans2', 'trans2 variable exists'::text, true);
441441
SAVEPOINT sp4;
442442
SAVEPOINT sp5;
443443
SELECT pgv_free();
444-
SELECT packageFROM pgv_stats();
444+
SELECT packageFROM pgv_stats()ORDER BY package;
445445
SELECT*FROM pgv_list()ORDER BY package, name;
446446
RELEASE sp5;
447-
SELECT packageFROM pgv_stats();
447+
SELECT packageFROM pgv_stats()ORDER BY package;
448448
SELECT*FROM pgv_list()ORDER BY package, name;
449449
RELEASE sp4;
450-
SELECT packageFROM pgv_stats();
450+
SELECT packageFROM pgv_stats()ORDER BY package;
451451
SELECT*FROM pgv_list()ORDER BY package, name;
452452
COMMIT;
453-
SELECT packageFROM pgv_stats();
453+
SELECT packageFROM pgv_stats()ORDER BY package;
454454

455455
BEGIN;
456456
SELECT pgv_set('vars','trans1','package created'::text, true);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp