Skip to content

Commit 20fee63

Browse files
CherkashinSergeyza-arthur
authored andcommitted
Remove variable from changes list
in case If variable created and removed in same transaction level
1 parent dd9f391 commit 20fee63

File tree

3 files changed

+63
-24
lines changed

3 files changed

+63
-24
lines changed

expected/pg_variables_trans.out

+21
Original file line numberDiff line numberDiff line change
@@ -1859,6 +1859,27 @@ SELECT pgv_insert('vars4', 'r1', row('str1', 'str1'));
18591859
ERROR: could not identify a hash function for type unknown
18601860
SELECT pgv_select('vars4', 'r1', 0);
18611861
ERROR: unrecognized variable "r1"
1862+
-- If variable created and removed in same transaction level,
1863+
-- it should be totally removed and should not be present
1864+
-- in changes list and cache.
1865+
BEGIN;
1866+
SELECT pgv_set('vars', 'any1', 'some value'::text, true);
1867+
pgv_set
1868+
---------
1869+
1870+
(1 row)
1871+
1872+
SAVEPOINT comm;
1873+
SELECT pgv_remove('vars', 'any1');
1874+
pgv_remove
1875+
------------
1876+
1877+
(1 row)
1878+
1879+
RELEASE comm;
1880+
SELECT pgv_get('vars', 'any1',NULL::text);
1881+
ERROR: unrecognized variable "any1"
1882+
COMMIT;
18621883
SELECT pgv_free();
18631884
pgv_free
18641885
----------

pg_variables.c

+31-24
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ static bool isObjectChangedInUpperTrans(TransObject *object);
7373

7474
static void addToChangesStack(TransObject *object, TransObjectType type);
7575
static void pushChangesStack(void);
76-
static void removeFromChangedVars(Package *package);
76+
static void removeFromChangesStack(TransObject *transObj, TransObjectType type);
7777

7878
/* Constructors */
7979
static void makePackHTAB(Package *package, bool is_trans);
@@ -1658,16 +1658,16 @@ removeObject(TransObject *object, TransObjectType type)
16581658
bool found;
16591659
HTAB *hash;
16601660

1661+
/*
1662+
* Delete an object from the change history of the overlying
1663+
* transaction level (head of 'changesStack' at this point).
1664+
*/
1665+
if (!dlist_is_empty(changesStack))
1666+
removeFromChangesStack(object, type);
16611667
if (type == TRANS_PACKAGE)
16621668
{
16631669
Package *package = (Package *) object;
16641670

1665-
/*
1666-
* Delete a variable from the change history of the overlying
1667-
* transaction level (head of 'changesStack' at this point)
1668-
*/
1669-
if (!dlist_is_empty(changesStack))
1670-
removeFromChangedVars(package);
16711671
/* Regular variables had already removed */
16721672
MemoryContextDelete(package->hctxTransact);
16731673
hash = packagesHash;
@@ -1939,33 +1939,40 @@ addToChangesStack(TransObject *transObj, TransObjectType type)
19391939
* Remove from the changes list a deleted package
19401940
*/
19411941
static void
1942-
removeFromChangedVars(Package *package)
1942+
removeFromChangesStack(TransObject *object, TransObjectType type)
19431943
{
19441944
dlist_mutable_iter var_miter,
1945-
pack_miter;
1946-
dlist_head *changedVarsList,
1947-
*changedPacksList;
1945+
pack_miter;
1946+
dlist_head *changesList;
1947+
ChangesStackNode *csn = get_actual_changes_list();
19481948

1949-
/* First remove corresponding variables from changedVarsList */
1950-
changedVarsList = get_actual_changes_list()->changedVarsList;
1951-
dlist_foreach_modify(var_miter, changedVarsList)
1949+
/*
1950+
* If we remove package, we should remove corresponding variables
1951+
* from changedVarsList first.
1952+
*/
1953+
if (type == TRANS_PACKAGE)
19521954
{
1953-
ChangedObject *co_cur = dlist_container(ChangedObject, node,
1954-
var_miter.cur);
1955-
Variable *var = (Variable *) co_cur->object;
1955+
changesList = csn->changedVarsList;
1956+
dlist_foreach_modify(var_miter, changesList)
1957+
{
1958+
ChangedObject *co_cur = dlist_container(ChangedObject, node,
1959+
var_miter.cur);
1960+
Variable *var = (Variable *) co_cur->object;
19561961

1957-
if (var->package == package)
1958-
dlist_delete(&co_cur->node);
1962+
if (var->package == (Package *)object)
1963+
dlist_delete(&co_cur->node);
1964+
}
19591965
}
1960-
/* Now remove package itself from changedPacksList */
1961-
changedPacksList = get_actual_changes_list()->changedPacksList;
1962-
dlist_foreach_modify(pack_miter, changedPacksList)
1966+
/* Now remove object itself from changes list */
1967+
changesList = (type == TRANS_PACKAGE ? csn->changedPacksList :
1968+
csn->changedVarsList);
1969+
dlist_foreach_modify(pack_miter, changesList)
19631970
{
19641971
ChangedObject *co_cur = dlist_container(ChangedObject, node,
19651972
pack_miter.cur);
1966-
Package *pack = (Package *) co_cur->object;
1973+
TransObject *obj = co_cur->object;
19671974

1968-
if (pack == package)
1975+
if (obj == object)
19691976
{
19701977
dlist_delete(&co_cur->node);
19711978
break;

sql/pg_variables_trans.sql

+11
Original file line numberDiff line numberDiff line change
@@ -471,4 +471,15 @@ SELECT pgv_insert('package', 'errs',row(1), true);
471471
SELECT pgv_insert('vars4', 'r1', row('str1', 'str1'));
472472
SELECT pgv_select('vars4', 'r1', 0);
473473

474+
-- If variable created and removed in same transaction level,
475+
-- it should be totally removed and should not be present
476+
-- in changes list and cache.
477+
BEGIN;
478+
SELECT pgv_set('vars', 'any1', 'some value'::text, true);
479+
SAVEPOINT comm;
480+
SELECT pgv_remove('vars', 'any1');
481+
RELEASE comm;
482+
SELECT pgv_get('vars', 'any1',NULL::text);
483+
COMMIT;
484+
474485
SELECT pgv_free();

0 commit comments

Comments
 (0)