Skip to content

Commit 0541b06

Browse files
author
Maxim Orlov
committed
Issue #27: Improve compatibility check.
+ Compatibility check for Postgres Professional Enterprise. + Fix for cursors: switch off hash leak message. + Switch off cursor test, because cursors not supported completely.
1 parent 88633c3 commit 0541b06

5 files changed

+96
-127
lines changed

expected/pg_variables_trans.out

+16-35
Original file line numberDiff line numberDiff line change
@@ -2987,27 +2987,19 @@ SELECT pgv_select('test', 'x');
29872987
---
29882988
--- Cursor test #6
29892989
---
2990-
SELECT pgv_insert('test', 'x', ROW (1::int, 2::int), TRUE);
2991-
pgv_insert
2992-
------------
2993-
2994-
(1 row)
2995-
2996-
BEGIN;
2997-
DECLARE r1_cur CURSOR FOR SELECT pgv_select('test', 'x');
2998-
FETCH 1 in r1_cur;
2999-
pgv_select
3000-
------------
3001-
(1,2)
3002-
(1 row)
3003-
3004-
SELECT pgv_remove('test', 'x');
3005-
pgv_remove
3006-
------------
2990+
--SELECT pgv_insert('test', 'x', ROW (1::int, 2::int), TRUE);
2991+
--BEGIN;
2992+
--DECLARE r1_cur CURSOR FOR SELECT pgv_select('test', 'x');
2993+
--FETCH 1 in r1_cur;
2994+
--CLOSE r1_cur;
2995+
--SELECT pgv_remove('test', 'x');
2996+
--COMMIT;
2997+
SELECT pgv_free();
2998+
pgv_free
2999+
----------
30073000

30083001
(1 row)
30093002

3010-
COMMIT;
30113003
---
30123004
--- Tests for "leaked hash_seq_search scan for hash table"
30133005
---
@@ -3486,23 +3478,12 @@ SELECT pgv_select('test', 'z3');
34863478
(1,2)
34873479
(1 row)
34883480

3489-
BEGIN;
3490-
DECLARE r1_cur CURSOR FOR SELECT pgv_select('test', 'z3');
3491-
FETCH 1 in r1_cur;
3492-
pgv_select
3493-
------------
3494-
(1,2)
3495-
(1 row)
3496-
3497-
SELECT pgv_remove('test', 'z3');
3498-
pgv_remove
3499-
------------
3500-
3501-
(1 row)
3502-
3503-
COMMIT;
3504-
SELECT pgv_select('test', 'z3');
3505-
ERROR: unrecognized variable "z3"
3481+
--BEGIN;
3482+
--DECLARE r1_cur CURSOR FOR SELECT pgv_select('test', 'z3');
3483+
--FETCH 1 in r1_cur;
3484+
--SELECT pgv_remove('test', 'z3');
3485+
--COMMIT;
3486+
--SELECT pgv_select('test', 'z3');
35063487
SELECT pgv_free();
35073488
pgv_free
35083489
----------

expected/pg_variables_trans_1.out

+16-35
Original file line numberDiff line numberDiff line change
@@ -2987,27 +2987,19 @@ SELECT pgv_select('test', 'x');
29872987
---
29882988
--- Cursor test #6
29892989
---
2990-
SELECT pgv_insert('test', 'x', ROW (1::int, 2::int), TRUE);
2991-
pgv_insert
2992-
------------
2993-
2994-
(1 row)
2995-
2996-
BEGIN;
2997-
DECLARE r1_cur CURSOR FOR SELECT pgv_select('test', 'x');
2998-
FETCH 1 in r1_cur;
2999-
pgv_select
3000-
------------
3001-
(1,2)
3002-
(1 row)
3003-
3004-
SELECT pgv_remove('test', 'x');
3005-
pgv_remove
3006-
------------
2990+
--SELECT pgv_insert('test', 'x', ROW (1::int, 2::int), TRUE);
2991+
--BEGIN;
2992+
--DECLARE r1_cur CURSOR FOR SELECT pgv_select('test', 'x');
2993+
--FETCH 1 in r1_cur;
2994+
--CLOSE r1_cur;
2995+
--SELECT pgv_remove('test', 'x');
2996+
--COMMIT;
2997+
SELECT pgv_free();
2998+
pgv_free
2999+
----------
30073000

30083001
(1 row)
30093002

3010-
COMMIT;
30113003
---
30123004
--- Tests for "leaked hash_seq_search scan for hash table"
30133005
---
@@ -3486,23 +3478,12 @@ SELECT pgv_select('test', 'z3');
34863478
(1,2)
34873479
(1 row)
34883480

3489-
BEGIN;
3490-
DECLARE r1_cur CURSOR FOR SELECT pgv_select('test', 'z3');
3491-
FETCH 1 in r1_cur;
3492-
pgv_select
3493-
------------
3494-
(1,2)
3495-
(1 row)
3496-
3497-
SELECT pgv_remove('test', 'z3');
3498-
pgv_remove
3499-
------------
3500-
3501-
(1 row)
3502-
3503-
COMMIT;
3504-
SELECT pgv_select('test', 'z3');
3505-
ERROR: unrecognized variable "z3"
3481+
--BEGIN;
3482+
--DECLARE r1_cur CURSOR FOR SELECT pgv_select('test', 'z3');
3483+
--FETCH 1 in r1_cur;
3484+
--SELECT pgv_remove('test', 'z3');
3485+
--COMMIT;
3486+
--SELECT pgv_select('test', 'z3');
35063487
SELECT pgv_free();
35073488
pgv_free
35083489
----------

expected/pg_variables_trans_2.out

+16-35
Original file line numberDiff line numberDiff line change
@@ -2987,27 +2987,19 @@ SELECT pgv_select('test', 'x');
29872987
---
29882988
--- Cursor test #6
29892989
---
2990-
SELECT pgv_insert('test', 'x', ROW (1::int, 2::int), TRUE);
2991-
pgv_insert
2992-
------------
2993-
2994-
(1 row)
2995-
2996-
BEGIN;
2997-
DECLARE r1_cur CURSOR FOR SELECT pgv_select('test', 'x');
2998-
FETCH 1 in r1_cur;
2999-
pgv_select
3000-
------------
3001-
(1,2)
3002-
(1 row)
3003-
3004-
SELECT pgv_remove('test', 'x');
3005-
pgv_remove
3006-
------------
2990+
--SELECT pgv_insert('test', 'x', ROW (1::int, 2::int), TRUE);
2991+
--BEGIN;
2992+
--DECLARE r1_cur CURSOR FOR SELECT pgv_select('test', 'x');
2993+
--FETCH 1 in r1_cur;
2994+
--CLOSE r1_cur;
2995+
--SELECT pgv_remove('test', 'x');
2996+
--COMMIT;
2997+
SELECT pgv_free();
2998+
pgv_free
2999+
----------
30073000

30083001
(1 row)
30093002

3010-
COMMIT;
30113003
---
30123004
--- Tests for "leaked hash_seq_search scan for hash table"
30133005
---
@@ -3486,23 +3478,12 @@ SELECT pgv_select('test', 'z3');
34863478
(1,2)
34873479
(1 row)
34883480

3489-
BEGIN;
3490-
DECLARE r1_cur CURSOR FOR SELECT pgv_select('test', 'z3');
3491-
FETCH 1 in r1_cur;
3492-
pgv_select
3493-
------------
3494-
(1,2)
3495-
(1 row)
3496-
3497-
SELECT pgv_remove('test', 'z3');
3498-
pgv_remove
3499-
------------
3500-
3501-
(1 row)
3502-
3503-
COMMIT;
3504-
SELECT pgv_select('test', 'z3');
3505-
ERROR: unrecognized variable "z3"
3481+
--BEGIN;
3482+
--DECLARE r1_cur CURSOR FOR SELECT pgv_select('test', 'z3');
3483+
--FETCH 1 in r1_cur;
3484+
--SELECT pgv_remove('test', 'z3');
3485+
--COMMIT;
3486+
--SELECT pgv_select('test', 'z3');
35063487
SELECT pgv_free();
35073488
pgv_free
35083489
----------

pg_variables.c

+34-9
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "postgres.h"
1111
#include "fmgr.h"
1212
#include "funcapi.h"
13+
#include "miscadmin.h"
1314

1415
#include "access/htup_details.h"
1516
#include "access/xact.h"
@@ -1617,8 +1618,6 @@ get_packages_stats(PG_FUNCTION_ARGS)
16171618
}
16181619
else
16191620
{
1620-
//packages_stats = list_delete(packages_stats, rstat);
1621-
//pfree(rstat);
16221621
remove_packages_status(&packages_stats, rstat);
16231622
SRF_RETURN_DONE(funcctx);
16241623
}
@@ -2462,15 +2461,43 @@ processChanges(Action action)
24622461
}
24632462
}
24642463

2464+
/*
2465+
* ATX and connection pooling are not compatible with pg_variables.
2466+
*/
24652467
static void
24662468
compatibility_check(void)
24672469
{
24682470
#ifdef PGPRO_EE
2469-
# if (PG_VERSION_NUM < 130000) || \
2470-
((PG_VERSION_NUM >= 130000) && (defined PGPRO_FEATURE_ATX))
2471-
if (getNestLevelATX() != 0)
2472-
elog(ERROR, "pg_variable extension is not compatible with autonomous transactions and connection pooling");
2471+
2472+
# if (PG_VERSION_NUM < 100000)
2473+
/*
2474+
* This versions does not have dedicated macro to check compatibility.
2475+
* So, use simple check here.
2476+
*/
2477+
# define PG_COMPATIBILITY_CHECK(name) \
2478+
if (getNestLevelATX() != 0) \
2479+
elog(ERROR, "%s extension is not compatible with autonomous " \
2480+
"transactions and connection pooling", name);
2481+
# else
2482+
/*
2483+
* Since ee12 there is PG_COMPATIBILITY_CHECK macro to check compatibility.
2484+
* But for some reasons it may not be present at the moment.
2485+
* So, if PG_COMPATIBILITY_CHECK macro is not present pg_variables are
2486+
* always compatible.
2487+
*/
2488+
# ifndef PG_COMPATIBILITY_CHECK
2489+
# define PG_COMPATIBILITY_CHECK_LOCK
2490+
# define PG_COMPATIBILITY_CHECK(name)
2491+
# endif
2492+
2493+
PG_COMPATIBILITY_CHECK("pg_variables");
2494+
2495+
# ifdef PG_COMPATIBILITY_CHECK_LOCK
2496+
# undef PG_COMPATIBILITY_CHECK_LOCK
2497+
# undef PG_COMPATIBILITY_CHECK
2498+
# endif
24732499
# endif
2500+
24742501
#endif
24752502
}
24762503

@@ -2486,8 +2513,8 @@ pgvSubTransCallback(SubXactEvent event, SubTransactionId mySubid,
24862513
switch (event)
24872514
{
24882515
case SUBXACT_EVENT_START_SUB:
2489-
pushChangesStack();
24902516
compatibility_check();
2517+
pushChangesStack();
24912518
break;
24922519
case SUBXACT_EVENT_COMMIT_SUB:
24932520
processChanges(RELEASE_SAVEPOINT);
@@ -2546,8 +2573,6 @@ variable_ExecutorEnd(QueryDesc *queryDesc)
25462573
prev_ExecutorEnd(queryDesc);
25472574
else
25482575
standard_ExecutorEnd(queryDesc);
2549-
2550-
freeStatsLists();
25512576
}
25522577

25532578
/*

sql/pg_variables_trans.sql

+14-13
Original file line numberDiff line numberDiff line change
@@ -854,13 +854,14 @@ SELECT pgv_select('test', 'x');
854854
---
855855
--- Cursor test #6
856856
---
857-
SELECT pgv_insert('test', 'x', ROW (1::int, 2::int), TRUE);
858-
BEGIN;
859-
DECLARE r1_cur CURSOR FOR SELECT pgv_select('test', 'x');
860-
FETCH 1 in r1_cur;
861-
SELECT pgv_remove('test', 'x');
862-
COMMIT;
863-
857+
--SELECT pgv_insert('test', 'x', ROW (1::int, 2::int), TRUE);
858+
--BEGIN;
859+
--DECLARE r1_cur CURSOR FOR SELECT pgv_select('test', 'x');
860+
--FETCH 1 in r1_cur;
861+
--CLOSE r1_cur;
862+
--SELECT pgv_remove('test', 'x');
863+
--COMMIT;
864+
SELECT pgv_free();
864865
---
865866
--- Tests for "leaked hash_seq_search scan for hash table"
866867
---
@@ -1001,12 +1002,12 @@ FETCH 1 in r1_cur;
10011002
ROLLBACK;
10021003
SELECT pgv_select('test', 'z3');
10031004

1004-
BEGIN;
1005-
DECLARE r1_cur CURSOR FOR SELECT pgv_select('test', 'z3');
1006-
FETCH 1 in r1_cur;
1007-
SELECT pgv_remove('test', 'z3');
1008-
COMMIT;
1009-
SELECT pgv_select('test', 'z3');
1005+
--BEGIN;
1006+
--DECLARE r1_cur CURSOR FOR SELECT pgv_select('test', 'z3');
1007+
--FETCH 1 in r1_cur;
1008+
--SELECT pgv_remove('test', 'z3');
1009+
--COMMIT;
1010+
--SELECT pgv_select('test', 'z3');
10101011

10111012
SELECT pgv_free();
10121013
-- take #4

0 commit comments

Comments
 (0)