Skip to content

Add support of package removal rollback #11

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 15 commits into from
Jun 21, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 24 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -304,8 +304,8 @@ SELECT pgv_get('pack', 'var_text', NULL::text);
before transaction block
```

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

```sql
BEGIN;
Expand All @@ -324,15 +324,33 @@ ERROR: unrecognized variable "var_int"
COMMIT;
```

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

```sql
SELECT pgv_set('pack', 'var_int', 122, true);
SELECT pgv_set('pack', 'var_reg', 123);
SELECT pgv_set('pack', 'var_trans', 456, true);
BEGIN;
SELECT pgv_free();
SELECT * FROM pgv_list();
package | name | is_transactional
---------+------+------------------
(0 rows)

-- Memory is allocated yet
SELECT * FROM pgv_stats();
package | allocated_memory
---------+------------------
pack | 24576
(1 row)

ROLLBACK;
SELECT pgv_get('pack', 'var_int', NULL::int);
ERROR: unrecognized package "pack"
SELECT * FROM pgv_list();
package | name | is_transactional
---------+-----------+------------------
pack | var_trans | t
(1 row)

```

If you created transactional variable once, you should use flag `is_transactional`
Expand Down
242 changes: 241 additions & 1 deletion expected/pg_variables_trans.out
Original file line number Diff line number Diff line change
Expand Up @@ -1392,7 +1392,7 @@ SELECT pgv_free();

(1 row)

--Additional tests
-- Additional tests
SELECT pgv_insert('vars3', 'r1', tab, true) FROM tab;
pgv_insert
------------
Expand Down Expand Up @@ -1598,3 +1598,243 @@ BEGIN;
SELECT pgv_set('vars', 'any1', 'wrong type'::varchar, true);
ERROR: variable "any1" requires "text" value
COMMIT;
-- THE REMOVAL OF THE VARIABLE MUST BE CANCELED ON ROLLBACK
SELECT pgv_set('vars', 'any1', 'variable exists'::text, true);
pgv_set
---------

(1 row)

BEGIN;
SELECT pgv_remove('vars', 'any1');
pgv_remove
------------

(1 row)

SELECT pgv_exists('vars', 'any1');
pgv_exists
------------
f
(1 row)

ROLLBACK;
SELECT pgv_exists('vars', 'any1');
pgv_exists
------------
t
(1 row)

SELECT pgv_get('vars', 'any1',NULL::text);
pgv_get
-----------------
variable exists
(1 row)

BEGIN;
SELECT pgv_remove('vars', 'any1');
pgv_remove
------------

(1 row)

SELECT pgv_exists('vars', 'any1');
pgv_exists
------------
f
(1 row)

COMMIT;
SELECT pgv_exists('vars', 'any1');
pgv_exists
------------
f
(1 row)

SELECT pgv_get('vars', 'any1',NULL::text);
ERROR: unrecognized variable "any1"
SELECT * FROM pgv_list() ORDER BY package, name;
package | name | is_transactional
---------+------+------------------
vars3 | r1 | t
(1 row)

BEGIN;
SELECT pgv_free();
pgv_free
----------

(1 row)

ROLLBACK;
SELECT * FROM pgv_list() ORDER BY package, name;
package | name | is_transactional
---------+------+------------------
vars3 | r1 | t
(1 row)

BEGIN;
SELECT pgv_free();
pgv_free
----------

(1 row)

COMMIT;
SELECT * FROM pgv_list() ORDER BY package, name;
package | name | is_transactional
---------+------+------------------
(0 rows)

SELECT pgv_set('vars', 'regular', 'regular variable exists'::text);
pgv_set
---------

(1 row)

SELECT pgv_set('vars', 'trans1', 'trans1 variable exists'::text, true);
pgv_set
---------

(1 row)

BEGIN;
SELECT pgv_free();
pgv_free
----------

(1 row)

SELECT * FROM pgv_list() ORDER BY package, name;
package | name | is_transactional
---------+------+------------------
(0 rows)

SELECT pgv_set('vars', 'trans2', 'trans2 variable exists'::text, true);
pgv_set
---------

(1 row)

SELECT * FROM pgv_list() ORDER BY package, name;
package | name | is_transactional
---------+--------+------------------
vars | trans2 | t
(1 row)

SELECT pgv_remove('vars');
pgv_remove
------------

(1 row)

SELECT * FROM pgv_list() ORDER BY package, name;
package | name | is_transactional
---------+------+------------------
(0 rows)

ROLLBACK;
SELECT * FROM pgv_list() ORDER BY package, name;
package | name | is_transactional
---------+--------+------------------
vars | trans1 | t
(1 row)

BEGIN;
SAVEPOINT sp1;
SAVEPOINT sp2;
SAVEPOINT sp3;
SELECT pgv_set('vars2', 'trans2', 'trans2 variable exists'::text, true);
pgv_set
---------

(1 row)

SAVEPOINT sp4;
SAVEPOINT sp5;
SELECT pgv_free();
pgv_free
----------

(1 row)

SELECT package FROM pgv_stats();
package
---------
vars2
vars
(2 rows)

SELECT * FROM pgv_list() ORDER BY package, name;
package | name | is_transactional
---------+------+------------------
(0 rows)

RELEASE sp5;
SELECT package FROM pgv_stats();
package
---------
vars2
vars
(2 rows)

SELECT * FROM pgv_list() ORDER BY package, name;
package | name | is_transactional
---------+------+------------------
(0 rows)

RELEASE sp4;
SELECT package FROM pgv_stats();
package
---------
vars
(1 row)

SELECT * FROM pgv_list() ORDER BY package, name;
package | name | is_transactional
---------+------+------------------
(0 rows)

COMMIT;
SELECT package FROM pgv_stats();
package
---------
(0 rows)

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

(1 row)

SELECT pgv_remove('vars');
pgv_remove
------------

(1 row)

SELECT * FROM pgv_list() ORDER BY package, name;
package | name | is_transactional
---------+------+------------------
(0 rows)

SELECT pgv_set('vars', 'trans1', 'package restored'::text, true);
pgv_set
---------

(1 row)

SELECT * FROM pgv_list() ORDER BY package, name;
package | name | is_transactional
---------+--------+------------------
vars | trans1 | t
(1 row)

COMMIT;
SELECT pgv_remove('vars');
pgv_remove
------------

(1 row)

Loading