Skip to content

Commit ab5b5da

Browse files
committed
Merge branch 'master' into stable
2 parents 43dbd76 + 497913b commit ab5b5da

11 files changed

+120
-29
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,4 @@ lib*.pc
4141
/tmp_install/
4242
Dockerfile
4343
pg_variables--1.1.sql
44+
pg_variables--1.2.sql

.travis.yml

+4-3
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,13 @@ notifications:
1818
on_failure: always
1919

2020
env:
21-
- PG_VERSION=10 LEVEL=nightmare
22-
- PG_VERSION=10 LEVEL=hardcore
21+
- PG_VERSION=11 LEVEL=nightmare
22+
- PG_VERSION=11 LEVEL=hardcore
23+
- PG_VERSION=11
2324
- PG_VERSION=10
2425
- PG_VERSION=9.6
2526
- PG_VERSION=9.5
2627

2728
matrix:
2829
allow_failures:
29-
- env: PG_VERSION=10 LEVEL=nightmare
30+
- env: PG_VERSION=11 LEVEL=nightmare

Makefile

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ MODULE_big = pg_variables
44
OBJS = pg_variables.o pg_variables_record.o $(WIN32RES)
55

66
EXTENSION = pg_variables
7-
EXTVERSION = 1.1
8-
DATA = pg_variables--1.0.sql pg_variables--1.0--1.1.sql
7+
EXTVERSION = 1.2
8+
DATA = pg_variables--1.0.sql pg_variables--1.0--1.1.sql pg_variables--1.1--1.2.sql
99
DATA_built = $(EXTENSION)--$(EXTVERSION).sql
1010

1111
PGFILEDESC = "pg_variables - sessional variables"

README.md

+17-2
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,13 @@ Function | Returns
9191
`pgv_set(package text, name text, value anynonarray, is_transactional bool default false)` | `void`
9292
`pgv_get(package text, name text, var_type anynonarray, strict bool default true)` | `anynonarray`
9393

94+
## Array variables functions
95+
96+
Function | Returns
97+
-------- | -------
98+
`pgv_set(package text, name text, value anyarray, is_transactional bool default false)` | `void`
99+
`pgv_get(package text, name text, var_type anyarray, strict bool default true)` | `anyarray`
100+
94101
## **Deprecated** scalar variables functions
95102

96103
### Integer variables
@@ -181,7 +188,7 @@ Note that **pgv_stats()** works only with the PostgreSQL 9.6 and newer.
181188

182189
## Examples
183190

184-
It is easy to use functions to work with scalar variables:
191+
It is easy to use functions to work with scalar and array variables:
185192

186193
```sql
187194
SELECT pgv_set('vars', 'int1', 101);
@@ -196,6 +203,13 @@ SELECT SELECT pgv_get('vars', 'text1', NULL::text);
196203
pgv_get
197204
---------------
198205
text variable
206+
207+
SELECT pgv_set('vars', 'arr1', '{101,102}'::int[]);
208+
209+
SELECT pgv_get('vars', 'arr1', NULL::int[]);
210+
pgv_get
211+
-----------
212+
{101,102}
199213
```
200214

201215
Let's assume we have a **tab** table:
@@ -246,6 +260,7 @@ You can list packages and variables:
246260
SELECT * FROM pgv_list() order by package, name;
247261
package | name | is_transactional
248262
---------+-------+------------------
263+
vars | arr1 | f
249264
vars | int1 | f
250265
vars | r1 | f
251266
vars | text1 | f
@@ -257,7 +272,7 @@ And get used memory in bytes:
257272
SELECT * FROM pgv_stats() order by package;
258273
package | allocated_memory
259274
---------+------------------
260-
vars | 32768
275+
vars | 49152
261276
```
262277

263278
You can delete variables or whole packages:

expected/pg_variables_trans.out

+22
Original file line numberDiff line numberDiff line change
@@ -1705,6 +1705,12 @@ SELECT pgv_free();
17051705

17061706
(1 row)
17071707

1708+
SELECT pgv_free(); -- Check sequential package removal in one subtransaction
1709+
pgv_free
1710+
----------
1711+
1712+
(1 row)
1713+
17081714
SELECT * FROM pgv_list() ORDER BY package, name;
17091715
package | name | is_transactional
17101716
---------+------+------------------
@@ -1838,3 +1844,19 @@ SELECT pgv_remove('vars');
18381844

18391845
(1 row)
18401846

1847+
-- REMOVED TRANSACTIONAL VARIABLE SHOULD BE NOT ACCESSIBLE THROUGH LastVariable
1848+
SELECT pgv_insert('package', 'errs',row(n), true)
1849+
FROM generate_series(1,5) AS gs(n) WHERE 1.0/(n-3)<>0;
1850+
ERROR: division by zero
1851+
SELECT pgv_insert('package', 'errs',row(1), true);
1852+
pgv_insert
1853+
------------
1854+
1855+
(1 row)
1856+
1857+
SELECT pgv_free();
1858+
pgv_free
1859+
----------
1860+
1861+
(1 row)
1862+

pg_variables--1.1--1.2.sql

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/* contrib/pg_variables/pg_variables--1.1--1.2.sql */
2+
3+
-- complain if script is sourced in psql, rather than via ALTER EXTENSION
4+
\echo Use "ALTER EXTENSION pg_variables UPDATE TO '1.2'" to load this file. \quit
5+
6+
-- Functions to work with arrays
7+
8+
CREATE FUNCTION pgv_set(package text, name text, value anyarray, is_transactional bool default false)
9+
RETURNS void
10+
AS 'MODULE_PATHNAME', 'variable_set_array'
11+
LANGUAGE C VOLATILE;
12+
13+
CREATE FUNCTION pgv_get(package text, name text, var_type anyarray, strict bool default true)
14+
RETURNS anyarray
15+
AS 'MODULE_PATHNAME', 'variable_get_array'
16+
LANGUAGE C VOLATILE;

pg_variables.c

+22-20
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@ VARIABLE_GET_TEMPLATE(0, 1, 2, jsonb, JSONBOID)
237237

238238
/* current API */
239239
VARIABLE_GET_TEMPLATE(0, 1, 3, any, get_fn_expr_argtype(fcinfo->flinfo, 2))
240+
VARIABLE_GET_TEMPLATE(0, 1, 3, array, get_fn_expr_argtype(fcinfo->flinfo, 2))
240241

241242

242243
#define VARIABLE_SET_TEMPLATE(type, typid) \
@@ -275,6 +276,7 @@ VARIABLE_SET_TEMPLATE(jsonb, JSONBOID)
275276

276277
/* current API */
277278
VARIABLE_SET_TEMPLATE(any, get_fn_expr_argtype(fcinfo->flinfo, 2))
279+
VARIABLE_SET_TEMPLATE(array, get_fn_expr_argtype(fcinfo->flinfo, 2))
278280

279281

280282
Datum
@@ -916,7 +918,11 @@ removePackageInternal(Package *package)
916918
TransObject *transObject;
917919

918920
/* All regular variables will be freed */
919-
MemoryContextDelete(package->hctxRegular);
921+
if (package->hctxRegular)
922+
{
923+
MemoryContextDelete(package->hctxRegular);
924+
package->hctxRegular = NULL;
925+
}
920926

921927
/* Add to changes list */
922928
transObject = &package->transObject;
@@ -1247,32 +1253,25 @@ ensurePackagesHashExists(void)
12471253
static void
12481254
makePackHTAB(Package *package, bool is_trans)
12491255
{
1250-
HASHCTL ctl;
1251-
char hash_name[BUFSIZ];
1256+
HASHCTL ctl;
1257+
char hash_name[BUFSIZ];
1258+
HTAB **htab;
1259+
MemoryContext *context;
12521260

1253-
if (is_trans)
1254-
package->hctxTransact = AllocSetContextCreate(ModuleContext,
1255-
PGV_MCXT_VARS,
1256-
ALLOCSET_DEFAULT_SIZES);
1257-
else
1258-
package->hctxRegular = AllocSetContextCreate(ModuleContext,
1259-
PGV_MCXT_VARS,
1260-
ALLOCSET_DEFAULT_SIZES);
1261+
htab = is_trans ? &package->varHashTransact : &package->varHashRegular;
1262+
context = is_trans ? &package->hctxTransact : &package->hctxRegular;
1263+
1264+
*context = AllocSetContextCreate(ModuleContext, PGV_MCXT_VARS,
1265+
ALLOCSET_DEFAULT_SIZES);
12611266

12621267
snprintf(hash_name, BUFSIZ, "%s variables hash for package \"%s\"",
12631268
is_trans ? "Transactional" : "Regular", GetName(package));
12641269
ctl.keysize = NAMEDATALEN;
12651270
ctl.entrysize = sizeof(Variable);
1266-
ctl.hcxt = (is_trans ? package->hctxTransact : package->hctxRegular);
1271+
ctl.hcxt = *context;
12671272

1268-
if (is_trans)
1269-
package->varHashTransact = hash_create(hash_name,
1270-
NUMVARIABLES, &ctl,
1271-
HASH_ELEM | HASH_CONTEXT);
1272-
else
1273-
package->varHashRegular = hash_create(hash_name,
1274-
NUMVARIABLES, &ctl,
1275-
HASH_ELEM | HASH_CONTEXT);
1273+
*htab = hash_create(hash_name, NUMVARIABLES, &ctl,
1274+
HASH_ELEM | HASH_CONTEXT);
12761275
}
12771276

12781277
static Package *
@@ -1632,6 +1631,9 @@ removeObject(TransObject *object, TransObjectType type)
16321631

16331632
/* Remove object from hash table */
16341633
hash_search(hash, object->name, HASH_REMOVE, &found);
1634+
1635+
LastPackage = NULL;
1636+
LastVariable = NULL;
16351637
}
16361638

16371639
/*

pg_variables.control

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# pg_variables extension
22
comment = 'session variables with various types'
3-
default_version = '1.1'
3+
default_version = '1.2'
44
module_pathname = '$libdir/pg_variables'
55
relocatable = true

pg_variables_record.c

+7-1
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,13 @@ init_record(RecordVar *record, TupleDesc tupdesc, Variable *variable)
101101
variable->package->hctxTransact :
102102
variable->package->hctxRegular;
103103

104-
#if PG_VERSION_NUM >= 110000
104+
#if PG_VERSION_NUM >= 120000
105+
record->hctx = AllocSetContextCreateInternal(topctx,
106+
hash_name,
107+
ALLOCSET_DEFAULT_MINSIZE,
108+
ALLOCSET_DEFAULT_INITSIZE,
109+
ALLOCSET_DEFAULT_MAXSIZE);
110+
#elif PG_VERSION_NUM >= 110000
105111
record->hctx = AllocSetContextCreateExtended(topctx,
106112
hash_name,
107113
ALLOCSET_DEFAULT_MINSIZE,

sql/pg_variables_any.sql

+20
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,26 @@ SELECT pgv_get('vars', 'd1', NULL::jsonb);
139139
SELECT pgv_set('vars', 'jNULL', NULL::jsonb);
140140
SELECT pgv_get('vars', 'jNULL', NULL::jsonb);
141141

142+
-- Array variables
143+
SELECT pgv_set('vars', 'arr1', '{1, 2, null}'::int[]);
144+
SELECT pgv_set('vars', 'arr2', '{"bar", "balance", "active"}'::text[]);
145+
SELECT pgv_set('vars2', 'j1', '{1, 2, null}'::int[]);
146+
147+
SELECT pgv_get('vars', 'arr1', NULL::int[]);
148+
SELECT pgv_get('vars', 'arr2', NULL::int[]);
149+
SELECT pgv_set('vars', 'arr1', '{"bar", "balance", "active"}'::text[]);
150+
SELECT pgv_set('vars', 'arr1', '{3, 4, 5}'::int[]);
151+
SELECT pgv_get('vars', 'arr1', NULL::int[]);
152+
153+
SELECT pgv_get('vars', 'arr3', NULL::int[]);
154+
SELECT pgv_get('vars', 'arr3', NULL::int[], false);
155+
SELECT pgv_exists('vars', 'arr3');
156+
SELECT pgv_exists('vars', 'arr1');
157+
SELECT pgv_get('vars2', 'j1', NULL::int[]);
158+
159+
SELECT pgv_set('vars', 'arrNULL', NULL::int[]);
160+
SELECT pgv_get('vars', 'arrNULL', NULL::int[]);
161+
142162
-- Manipulate variables
143163
SELECT * FROM pgv_list() order by package, name;
144164

sql/pg_variables_trans.sql

+8
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,7 @@ SELECT pgv_set('vars', 'regular', 'regular variable exists'::text);
425425
SELECT pgv_set('vars', 'trans1', 'trans1 variable exists'::text, true);
426426
BEGIN;
427427
SELECT pgv_free();
428+
SELECT pgv_free(); -- Check sequential package removal in one subtransaction
428429
SELECT * FROM pgv_list() ORDER BY package, name;
429430
SELECT pgv_set('vars', 'trans2', 'trans2 variable exists'::text, true);
430431
SELECT * FROM pgv_list() ORDER BY package, name;
@@ -460,3 +461,10 @@ SELECT pgv_set('vars', 'trans1', 'package restored'::text, true);
460461
SELECT * FROM pgv_list() ORDER BY package, name;
461462
COMMIT;
462463
SELECT pgv_remove('vars');
464+
465+
-- REMOVED TRANSACTIONAL VARIABLE SHOULD BE NOT ACCESSIBLE THROUGH LastVariable
466+
SELECT pgv_insert('package', 'errs',row(n), true)
467+
FROM generate_series(1,5) AS gs(n) WHERE 1.0/(n-3)<>0;
468+
SELECT pgv_insert('package', 'errs',row(1), true);
469+
470+
SELECT pgv_free();

0 commit comments

Comments
 (0)