Skip to content

Commit b6408ba

Browse files
laurenzCommitfest Bot
authored andcommitted
plpgsql tests
set of plpgsql related tests: * check session variables and plpgsql variables are not in collision ever * check correct plpgsql plan cache invalidation when session variable is dropped * check so the value of session variable is not corrupted, when the variable is modified inside nested called functions
1 parent ce81fbf commit b6408ba

File tree

4 files changed

+410
-1
lines changed

4 files changed

+410
-1
lines changed

src/pl/plpgsql/src/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ REGRESS_OPTS = --dbname=$(PL_TESTDB)
3535
REGRESS = plpgsql_array plpgsql_cache plpgsql_call plpgsql_control \
3636
plpgsql_copy plpgsql_domain plpgsql_misc \
3737
plpgsql_record plpgsql_simple plpgsql_transaction \
38-
plpgsql_trap plpgsql_trigger plpgsql_varprops
38+
plpgsql_trap plpgsql_trigger plpgsql_varprops \
39+
plpgsql_session_variable
3940

4041
# where to find gen_keywordlist.pl and subsidiary files
4142
TOOLSDIR = $(top_srcdir)/src/tools
Lines changed: 239 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,239 @@
1+
-- variables are not checked in compile time
2+
CREATE OR REPLACE FUNCTION svartest_plpgsql_func00_01()
3+
RETURNS void AS $$
4+
BEGIN
5+
RAISE NOTICE '%', VARIABLE(this_variable_doesnt_exists);
6+
END;
7+
$$ LANGUAGE plpgsql;
8+
CREATE OR REPLACE FUNCTION svartest_plpgsql_func00_02()
9+
RETURNS void AS $$
10+
BEGIN
11+
LET this_variable_doesnt_exists = 10;
12+
END;
13+
$$ LANGUAGE plpgsql;
14+
CREATE OR REPLACE FUNCTION svartest_plpgsql_func00_03()
15+
RETURNS void AS $$
16+
BEGIN
17+
LET this_variable_doesnt_exists[10] = 'Hello';
18+
END;
19+
$$ LANGUAGE plpgsql;
20+
-- should fail
21+
SELECT svartest_plpgsql_func00_01();
22+
ERROR: session variable "this_variable_doesnt_exists" doesn't exist
23+
LINE 1: VARIABLE(this_variable_doesnt_exists)
24+
^
25+
QUERY: VARIABLE(this_variable_doesnt_exists)
26+
CONTEXT: PL/pgSQL function svartest_plpgsql_func00_01() line 3 at RAISE
27+
SELECT svartest_plpgsql_func00_02();
28+
ERROR: session variable "this_variable_doesnt_exists" doesn't exist
29+
LINE 1: LET this_variable_doesnt_exists = 10
30+
^
31+
QUERY: LET this_variable_doesnt_exists = 10
32+
CONTEXT: PL/pgSQL function svartest_plpgsql_func00_02() line 3 at SQL statement
33+
SELECT svartest_plpgsql_func00_03();
34+
ERROR: session variable "this_variable_doesnt_exists" doesn't exist
35+
LINE 1: LET this_variable_doesnt_exists[10] = 'Hello'
36+
^
37+
QUERY: LET this_variable_doesnt_exists[10] = 'Hello'
38+
CONTEXT: PL/pgSQL function svartest_plpgsql_func00_03() line 3 at SQL statement
39+
DROP FUNCTION svartest_plpgsql_func00_01();
40+
DROP FUNCTION svartest_plpgsql_func00_02();
41+
DROP FUNCTION svartest_plpgsql_func00_03();
42+
-- check of correct plan cache invalidation
43+
CREATE VARIABLE plpgsql_sesvar01 AS int;
44+
CREATE VARIABLE plpgsql_sesvar02 AS int[];
45+
-- plpgsql variables and session variables are not in collision ever
46+
CREATE OR REPLACE FUNCTION svartest_plpgsql_func01_01()
47+
RETURNS void AS $$
48+
DECLARE plpgsql_sesvar01 int;
49+
BEGIN
50+
plpgsql_sesvar01 := 100;
51+
LET plpgsql_sesvar01 = 1000;
52+
RAISE NOTICE 'plpgsql var: %, session var: %',
53+
plpgsql_sesvar01, VARIABLE(plpgsql_sesvar01);
54+
END;
55+
$$ LANGUAGE plpgsql;
56+
SELECT svartest_plpgsql_func01_01();
57+
NOTICE: plpgsql var: 100, session var: 1000
58+
svartest_plpgsql_func01_01
59+
----------------------------
60+
61+
(1 row)
62+
63+
CREATE OR REPLACE FUNCTION svartest_plpgsql_func01_02()
64+
RETURNS void AS $$
65+
DECLARE __plpgsql_sesvar01 int;
66+
BEGIN
67+
__plpgsql_sesvar01 := 100;
68+
LET __plpgsql_sesvar01 = 1000;
69+
RAISE NOTICE 'plpgsql var: %, session var: %',
70+
__plpgsql_sesvar01, VARIABLE(__plpgsql_sesvar01);
71+
END;
72+
$$ LANGUAGE plpgsql;
73+
-- should fail
74+
SELECT svartest_plpgsql_func01_02();
75+
ERROR: session variable "__plpgsql_sesvar01" doesn't exist
76+
LINE 1: LET __plpgsql_sesvar01 = 1000
77+
^
78+
QUERY: LET __plpgsql_sesvar01 = 1000
79+
CONTEXT: PL/pgSQL function svartest_plpgsql_func01_02() line 5 at SQL statement
80+
-- should fail
81+
CREATE OR REPLACE FUNCTION svartest_plpgsql_func01_03()
82+
RETURNS void AS $$
83+
BEGIN
84+
plpgsql_sesvar01 := 100;
85+
LET plpgsql_sesvar01 = 1000;
86+
RAISE NOTICE 'plpgsql var: %, session var: %',
87+
plpgsql_sesvar01, VARIABLE(plpgsql_sesvar01);
88+
END;
89+
$$ LANGUAGE plpgsql;
90+
ERROR: "plpgsql_sesvar01" is not a known variable
91+
LINE 4: plpgsql_sesvar01 := 100;
92+
^
93+
DROP FUNCTION svartest_plpgsql_func01_01();
94+
DROP FUNCTION svartest_plpgsql_func01_02();
95+
CREATE OR REPLACE FUNCTION svartest_plpgsql_func02()
96+
RETURNS void AS $$
97+
DECLARE v int[] DEFAULT '{}';
98+
BEGIN
99+
LET plpgsql_sesvar01 = 1;
100+
v[VARIABLE(plpgsql_sesvar01)] = 100;
101+
RAISE NOTICE '%', v;
102+
LET plpgsql_sesvar02 = v;
103+
LET plpgsql_sesvar02[VARIABLE(plpgsql_sesvar01)] = -1;
104+
RAISE NOTICE '%', VARIABLE(plpgsql_sesvar02);
105+
END;
106+
$$ LANGUAGE plpgsql;
107+
SELECT svartest_plpgsql_func02();
108+
NOTICE: {100}
109+
NOTICE: {-1}
110+
svartest_plpgsql_func02
111+
-------------------------
112+
113+
(1 row)
114+
115+
DROP VARIABLE plpgsql_sesvar01, plpgsql_sesvar02;
116+
CREATE VARIABLE plpgsql_sesvar01 AS int;
117+
CREATE VARIABLE plpgsql_sesvar02 AS int[];
118+
SELECT svartest_plpgsql_func02();
119+
NOTICE: {100}
120+
NOTICE: {-1}
121+
svartest_plpgsql_func02
122+
-------------------------
123+
124+
(1 row)
125+
126+
DROP FUNCTION svartest_plpgsql_func02();
127+
DROP VARIABLE plpgsql_sesvar01, plpgsql_sesvar02;
128+
-- returns updated value
129+
CREATE VARIABLE plpgsql_sesvar01 AS int;
130+
CREATE OR REPLACE FUNCTION svartest_plpgsql_inc(int)
131+
RETURNS int AS $$
132+
BEGIN
133+
LET plpgsql_sesvar01 = COALESCE(VARIABLE(plpgsql_sesvar01) + $1, $1);
134+
RETURN VARIABLE(plpgsql_sesvar01);
135+
END;
136+
$$ LANGUAGE plpgsql;
137+
SELECT svartest_plpgsql_inc(1);
138+
svartest_plpgsql_inc
139+
----------------------
140+
1
141+
(1 row)
142+
143+
SELECT svartest_plpgsql_inc(1);
144+
svartest_plpgsql_inc
145+
----------------------
146+
2
147+
(1 row)
148+
149+
SELECT svartest_plpgsql_inc(1);
150+
svartest_plpgsql_inc
151+
----------------------
152+
3
153+
(1 row)
154+
155+
SELECT svartest_plpgsql_inc(1) FROM generate_series(1,10);
156+
svartest_plpgsql_inc
157+
----------------------
158+
4
159+
5
160+
6
161+
7
162+
8
163+
9
164+
10
165+
11
166+
12
167+
13
168+
(10 rows)
169+
170+
CREATE VARIABLE plpgsql_sesvar02 AS numeric;
171+
LET plpgsql_sesvar02 = 0.0;
172+
CREATE OR REPLACE FUNCTION svartest_plpgsql_inc(numeric)
173+
RETURNS int AS $$
174+
BEGIN
175+
LET plpgsql_sesvar02 = COALESCE(VARIABLE(plpgsql_sesvar02) + $1, $1);
176+
RETURN VARIABLE(plpgsql_sesvar02);
177+
END;
178+
$$ LANGUAGE plpgsql;
179+
SELECT svartest_plpgsql_inc(1.0);
180+
svartest_plpgsql_inc
181+
----------------------
182+
1
183+
(1 row)
184+
185+
SELECT svartest_plpgsql_inc(1.0);
186+
svartest_plpgsql_inc
187+
----------------------
188+
2
189+
(1 row)
190+
191+
SELECT svartest_plpgsql_inc(1.0);
192+
svartest_plpgsql_inc
193+
----------------------
194+
3
195+
(1 row)
196+
197+
SELECT svartest_plpgsql_inc(1.0) FROM generate_series(1,10);
198+
svartest_plpgsql_inc
199+
----------------------
200+
4
201+
5
202+
6
203+
7
204+
8
205+
9
206+
10
207+
11
208+
12
209+
13
210+
(10 rows)
211+
212+
DROP VARIABLE plpgsql_sesvar01, plpgsql_sesvar02;
213+
DROP FUNCTION svartest_plpgsql_inc(int);
214+
DROP FUNCTION svartest_plpgsql_inc(numeric);
215+
-- the value should not be corrupted
216+
CREATE VARIABLE plpgsql_sesvar03 text;
217+
LET plpgsql_sesvar03 = 'abc';
218+
CREATE FUNCTION svartest_plpgsql_func03()
219+
RETURNS text AS $$
220+
BEGIN
221+
RETURN svartest_plpgsql_func_nested(VARIABLE(plpgsql_sesvar03));
222+
END
223+
$$ LANGUAGE plpgsql;
224+
CREATE FUNCTION svartest_plpgsql_func_nested(t text)
225+
RETURNS text AS $$
226+
BEGIN
227+
LET plpgsql_sesvar03 = 'BOOM!';
228+
RETURN t;
229+
END;
230+
$$ LANGUAGE plpgsql;
231+
SELECT svartest_plpgsql_func03();
232+
svartest_plpgsql_func03
233+
-------------------------
234+
abc
235+
(1 row)
236+
237+
DROP FUNCTION svartest_plpgsql_func03();
238+
DROP FUNCTION svartest_plpgsql_func_nested(text);
239+
DROP VARIABLE plpgsql_sesvar03;

src/pl/plpgsql/src/meson.build

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ tests += {
8888
'plpgsql_trap',
8989
'plpgsql_trigger',
9090
'plpgsql_varprops',
91+
'plpgsql_session_variable',
9192
],
9293
},
9394
}

0 commit comments

Comments
 (0)