Skip to content

Commit 26c5328

Browse files
authoredJun 21, 2018
Merge pull request #11 from CherkashinSergey/add_xact_support
Add support of package removal rollback
2 parents 9d3e182 + 4194f40 commit 26c5328

File tree

6 files changed

+1175
-592
lines changed

6 files changed

+1175
-592
lines changed
 

‎README.md

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -304,8 +304,8 @@ SELECT pgv_get('pack', 'var_text', NULL::text);
304304
before transaction block
305305
```
306306

307-
If you create variable after `BEGIN` or `SAVEPOINT` statements and than rollback
308-
to previous state - variable will not be exist:
307+
If you create a transactional variable after `BEGIN` or `SAVEPOINT` statements
308+
and then rollback to previous state - variable will not be exist:
309309

310310
```sql
311311
BEGIN;
@@ -324,15 +324,33 @@ ERROR: unrecognized variable "var_int"
324324
COMMIT;
325325
```
326326

327-
Also you cannot undo removing variable by `ROLLBACK`:
327+
You can undo removal of a transactional variable by `ROLLBACK`, but if you remove
328+
a whole package, all regular variables will be removed permanently:
328329

329330
```sql
330-
SELECT pgv_set('pack', 'var_int', 122, true);
331+
SELECT pgv_set('pack', 'var_reg', 123);
332+
SELECT pgv_set('pack', 'var_trans', 456, true);
331333
BEGIN;
332334
SELECT pgv_free();
335+
SELECT * FROM pgv_list();
336+
package | name | is_transactional
337+
---------+------+------------------
338+
(0 rows)
339+
340+
-- Memory is allocated yet
341+
SELECT * FROM pgv_stats();
342+
package | allocated_memory
343+
---------+------------------
344+
pack | 24576
345+
(1 row)
346+
333347
ROLLBACK;
334-
SELECT pgv_get('pack', 'var_int', NULL::int);
335-
ERROR: unrecognized package "pack"
348+
SELECT * FROM pgv_list();
349+
package | name | is_transactional
350+
---------+-----------+------------------
351+
pack | var_trans | t
352+
(1 row)
353+
336354
```
337355

338356
If you created transactional variable once, you should use flag `is_transactional`

‎expected/pg_variables_trans.out

Lines changed: 241 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1392,7 +1392,7 @@ SELECT pgv_free();
13921392

13931393
(1 row)
13941394

1395-
--Additional tests
1395+
-- Additional tests
13961396
SELECT pgv_insert('vars3', 'r1', tab, true) FROM tab;
13971397
pgv_insert
13981398
------------
@@ -1598,3 +1598,243 @@ BEGIN;
15981598
SELECT pgv_set('vars', 'any1', 'wrong type'::varchar, true);
15991599
ERROR: variable "any1" requires "text" value
16001600
COMMIT;
1601+
-- THE REMOVAL OF THE VARIABLE MUST BE CANCELED ON ROLLBACK
1602+
SELECT pgv_set('vars', 'any1', 'variable exists'::text, true);
1603+
pgv_set
1604+
---------
1605+
1606+
(1 row)
1607+
1608+
BEGIN;
1609+
SELECT pgv_remove('vars', 'any1');
1610+
pgv_remove
1611+
------------
1612+
1613+
(1 row)
1614+
1615+
SELECT pgv_exists('vars', 'any1');
1616+
pgv_exists
1617+
------------
1618+
f
1619+
(1 row)
1620+
1621+
ROLLBACK;
1622+
SELECT pgv_exists('vars', 'any1');
1623+
pgv_exists
1624+
------------
1625+
t
1626+
(1 row)
1627+
1628+
SELECT pgv_get('vars', 'any1',NULL::text);
1629+
pgv_get
1630+
-----------------
1631+
variable exists
1632+
(1 row)
1633+
1634+
BEGIN;
1635+
SELECT pgv_remove('vars', 'any1');
1636+
pgv_remove
1637+
------------
1638+
1639+
(1 row)
1640+
1641+
SELECT pgv_exists('vars', 'any1');
1642+
pgv_exists
1643+
------------
1644+
f
1645+
(1 row)
1646+
1647+
COMMIT;
1648+
SELECT pgv_exists('vars', 'any1');
1649+
pgv_exists
1650+
------------
1651+
f
1652+
(1 row)
1653+
1654+
SELECT pgv_get('vars', 'any1',NULL::text);
1655+
ERROR: unrecognized variable "any1"
1656+
SELECT * FROM pgv_list() ORDER BY package, name;
1657+
package | name | is_transactional
1658+
---------+------+------------------
1659+
vars3 | r1 | t
1660+
(1 row)
1661+
1662+
BEGIN;
1663+
SELECT pgv_free();
1664+
pgv_free
1665+
----------
1666+
1667+
(1 row)
1668+
1669+
ROLLBACK;
1670+
SELECT * FROM pgv_list() ORDER BY package, name;
1671+
package | name | is_transactional
1672+
---------+------+------------------
1673+
vars3 | r1 | t
1674+
(1 row)
1675+
1676+
BEGIN;
1677+
SELECT pgv_free();
1678+
pgv_free
1679+
----------
1680+
1681+
(1 row)
1682+
1683+
COMMIT;
1684+
SELECT * FROM pgv_list() ORDER BY package, name;
1685+
package | name | is_transactional
1686+
---------+------+------------------
1687+
(0 rows)
1688+
1689+
SELECT pgv_set('vars', 'regular', 'regular variable exists'::text);
1690+
pgv_set
1691+
---------
1692+
1693+
(1 row)
1694+
1695+
SELECT pgv_set('vars', 'trans1', 'trans1 variable exists'::text, true);
1696+
pgv_set
1697+
---------
1698+
1699+
(1 row)
1700+
1701+
BEGIN;
1702+
SELECT pgv_free();
1703+
pgv_free
1704+
----------
1705+
1706+
(1 row)
1707+
1708+
SELECT * FROM pgv_list() ORDER BY package, name;
1709+
package | name | is_transactional
1710+
---------+------+------------------
1711+
(0 rows)
1712+
1713+
SELECT pgv_set('vars', 'trans2', 'trans2 variable exists'::text, true);
1714+
pgv_set
1715+
---------
1716+
1717+
(1 row)
1718+
1719+
SELECT * FROM pgv_list() ORDER BY package, name;
1720+
package | name | is_transactional
1721+
---------+--------+------------------
1722+
vars | trans2 | t
1723+
(1 row)
1724+
1725+
SELECT pgv_remove('vars');
1726+
pgv_remove
1727+
------------
1728+
1729+
(1 row)
1730+
1731+
SELECT * FROM pgv_list() ORDER BY package, name;
1732+
package | name | is_transactional
1733+
---------+------+------------------
1734+
(0 rows)
1735+
1736+
ROLLBACK;
1737+
SELECT * FROM pgv_list() ORDER BY package, name;
1738+
package | name | is_transactional
1739+
---------+--------+------------------
1740+
vars | trans1 | t
1741+
(1 row)
1742+
1743+
BEGIN;
1744+
SAVEPOINT sp1;
1745+
SAVEPOINT sp2;
1746+
SAVEPOINT sp3;
1747+
SELECT pgv_set('vars2', 'trans2', 'trans2 variable exists'::text, true);
1748+
pgv_set
1749+
---------
1750+
1751+
(1 row)
1752+
1753+
SAVEPOINT sp4;
1754+
SAVEPOINT sp5;
1755+
SELECT pgv_free();
1756+
pgv_free
1757+
----------
1758+
1759+
(1 row)
1760+
1761+
SELECT package FROM pgv_stats();
1762+
package
1763+
---------
1764+
vars2
1765+
vars
1766+
(2 rows)
1767+
1768+
SELECT * FROM pgv_list() ORDER BY package, name;
1769+
package | name | is_transactional
1770+
---------+------+------------------
1771+
(0 rows)
1772+
1773+
RELEASE sp5;
1774+
SELECT package FROM pgv_stats();
1775+
package
1776+
---------
1777+
vars2
1778+
vars
1779+
(2 rows)
1780+
1781+
SELECT * FROM pgv_list() ORDER BY package, name;
1782+
package | name | is_transactional
1783+
---------+------+------------------
1784+
(0 rows)
1785+
1786+
RELEASE sp4;
1787+
SELECT package FROM pgv_stats();
1788+
package
1789+
---------
1790+
vars
1791+
(1 row)
1792+
1793+
SELECT * FROM pgv_list() ORDER BY package, name;
1794+
package | name | is_transactional
1795+
---------+------+------------------
1796+
(0 rows)
1797+
1798+
COMMIT;
1799+
SELECT package FROM pgv_stats();
1800+
package
1801+
---------
1802+
(0 rows)
1803+
1804+
BEGIN;
1805+
SELECT pgv_set('vars', 'trans1', 'package created'::text, true);
1806+
pgv_set
1807+
---------
1808+
1809+
(1 row)
1810+
1811+
SELECT pgv_remove('vars');
1812+
pgv_remove
1813+
------------
1814+
1815+
(1 row)
1816+
1817+
SELECT * FROM pgv_list() ORDER BY package, name;
1818+
package | name | is_transactional
1819+
---------+------+------------------
1820+
(0 rows)
1821+
1822+
SELECT pgv_set('vars', 'trans1', 'package restored'::text, true);
1823+
pgv_set
1824+
---------
1825+
1826+
(1 row)
1827+
1828+
SELECT * FROM pgv_list() ORDER BY package, name;
1829+
package | name | is_transactional
1830+
---------+--------+------------------
1831+
vars | trans1 | t
1832+
(1 row)
1833+
1834+
COMMIT;
1835+
SELECT pgv_remove('vars');
1836+
pgv_remove
1837+
------------
1838+
1839+
(1 row)
1840+

0 commit comments

Comments
 (0)