Skip to content

Commit 21df5c3

Browse files
CherkashinSergeyza-arthur
authored andcommitted
Optimize objects removal in subtransaction rollback
1 parent b53645f commit 21df5c3

File tree

3 files changed

+42
-13
lines changed

3 files changed

+42
-13
lines changed

Diff for: expected/pg_variables_trans.out

+27-1
Original file line numberDiff line numberDiff line change
@@ -1881,7 +1881,7 @@ RELEASE comm;
18811881
SELECT pgv_get('vars', 'any1',NULL::text);
18821882
ERROR: unrecognized variable "any1"
18831883
COMMIT;
1884-
-- Test for PGPRO-2440
1884+
-- Tests for PGPRO-2440
18851885
SELECT pgv_insert('vars3', 'r3', row(1 :: integer, NULL::varchar), true);
18861886
pgv_insert
18871887
------------
@@ -1909,6 +1909,32 @@ SELECT pgv_delete('vars3', 'r3', 3);
19091909
t
19101910
(1 row)
19111911

1912+
BEGIN;
1913+
SELECT pgv_set('vars1', 't1', ''::text);
1914+
pgv_set
1915+
---------
1916+
1917+
(1 row)
1918+
1919+
SELECT pgv_set('vars2', 't2', ''::text, true);
1920+
pgv_set
1921+
---------
1922+
1923+
(1 row)
1924+
1925+
SAVEPOINT sp1;
1926+
SAVEPOINT sp2;
1927+
SELECT pgv_free();
1928+
pgv_free
1929+
----------
1930+
1931+
(1 row)
1932+
1933+
ERROR;
1934+
ERROR: syntax error at or near "ERROR"
1935+
LINE 1: ERROR;
1936+
^
1937+
COMMIT;
19121938
SELECT pgv_free();
19131939
pgv_free
19141940
----------

Diff for: pg_variables.c

+5-11
Original file line numberDiff line numberDiff line change
@@ -1672,7 +1672,6 @@ removeObject(TransObject *object, TransObjectType type)
16721672
package = (Package *) object;
16731673

16741674
/* Regular variables had already removed */
1675-
//Here we should think, when regular HTAB should be removed
16761675
if (package->hctxRegular)
16771676
MemoryContextDelete(package->hctxRegular);
16781677
if (package->hctxTransact)
@@ -1696,10 +1695,11 @@ removeObject(TransObject *object, TransObjectType type)
16961695
hash_search(hash, object->name, HASH_REMOVE, &found);
16971696

16981697
/* Remove package if it became empty */
1699-
if (type == TRANS_VARIABLE &&
1700-
isObjectChangedInCurrentTrans(&package->transObject) &&
1701-
isPackageEmpty(package))
1698+
if (type == TRANS_VARIABLE && isPackageEmpty(package))
1699+
{
1700+
Assert(isObjectChangedInCurrentTrans(&package->transObject));
17021701
GetActualState(&package->transObject)->is_valid = false;
1702+
}
17031703

17041704
resetVariablesCache(true);
17051705
}
@@ -1740,14 +1740,8 @@ rollbackSavepoint(TransObject *object, TransObjectType type)
17401740
state = GetActualState(object);
17411741
if (type == TRANS_PACKAGE)
17421742
{
1743-
if (!state->is_valid)
1743+
if (!state->is_valid && !isPackageEmpty((Package *)object))
17441744
{
1745-
if (isPackageEmpty((Package *)object))
1746-
{
1747-
removeObject(object, TRANS_PACKAGE);
1748-
return;
1749-
}
1750-
17511745
if (dlist_has_next(&object->states, &state->node))
17521746
{
17531747
dlist_pop_head_node(&object->states);

Diff for: sql/pg_variables_trans.sql

+10-1
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,7 @@ RELEASE comm;
482482
SELECT pgv_get('vars', 'any1',NULL::text);
483483
COMMIT;
484484

485-
-- Test for PGPRO-2440
485+
-- Tests for PGPRO-2440
486486
SELECT pgv_insert('vars3', 'r3', row(1 :: integer, NULL::varchar), true);
487487
BEGIN;
488488
SELECT pgv_insert('vars3', 'r3', row(2 :: integer, NULL::varchar), true);
@@ -491,4 +491,13 @@ SELECT pgv_insert('vars3', 'r3', row(3 :: integer, NULL::varchar), true);
491491
COMMIT;
492492
SELECT pgv_delete('vars3', 'r3', 3);
493493

494+
BEGIN;
495+
SELECT pgv_set('vars1', 't1', ''::text);
496+
SELECT pgv_set('vars2', 't2', ''::text, true);
497+
SAVEPOINT sp1;
498+
SAVEPOINT sp2;
499+
SELECT pgv_free();
500+
ERROR;
501+
COMMIT;
502+
494503
SELECT pgv_free();

0 commit comments

Comments
 (0)