]> granicus.if.org Git - postgresql/blob - src/test/regress/sql/guc.sql
a7b795af47d6660c405093b5a61d42808ee054b9
[postgresql] / src / test / regress / sql / guc.sql
1 -- pg_regress should ensure that this default value applies; however
2 -- we can't rely on any specific default value of vacuum_cost_delay
3 SHOW datestyle;
4
5 -- SET to some nondefault value
6 SET vacuum_cost_delay TO 40;
7 SET datestyle = 'ISO, YMD';
8 SHOW vacuum_cost_delay;
9 SHOW datestyle;
10 SELECT '2006-08-13 12:34:56'::timestamptz;
11
12 -- SET LOCAL has no effect outside of a transaction
13 SET LOCAL vacuum_cost_delay TO 50;
14 SHOW vacuum_cost_delay;
15 SET LOCAL datestyle = 'SQL';
16 SHOW datestyle;
17 SELECT '2006-08-13 12:34:56'::timestamptz;
18
19 -- SET LOCAL within a transaction that commits
20 BEGIN;
21 SET LOCAL vacuum_cost_delay TO 50;
22 SHOW vacuum_cost_delay;
23 SET LOCAL datestyle = 'SQL';
24 SHOW datestyle;
25 SELECT '2006-08-13 12:34:56'::timestamptz;
26 COMMIT;
27 SHOW vacuum_cost_delay;
28 SHOW datestyle;
29 SELECT '2006-08-13 12:34:56'::timestamptz;
30
31 -- SET should be reverted after ROLLBACK
32 BEGIN;
33 SET vacuum_cost_delay TO 60;
34 SHOW vacuum_cost_delay;
35 SET datestyle = 'German';
36 SHOW datestyle;
37 SELECT '2006-08-13 12:34:56'::timestamptz;
38 ROLLBACK;
39 SHOW vacuum_cost_delay;
40 SHOW datestyle;
41 SELECT '2006-08-13 12:34:56'::timestamptz;
42
43 -- Some tests with subtransactions
44 BEGIN;
45 SET vacuum_cost_delay TO 70;
46 SET datestyle = 'MDY';
47 SHOW datestyle;
48 SELECT '2006-08-13 12:34:56'::timestamptz;
49 SAVEPOINT first_sp;
50 SET vacuum_cost_delay TO 80;
51 SHOW vacuum_cost_delay;
52 SET datestyle = 'German, DMY';
53 SHOW datestyle;
54 SELECT '2006-08-13 12:34:56'::timestamptz;
55 ROLLBACK TO first_sp;
56 SHOW datestyle;
57 SELECT '2006-08-13 12:34:56'::timestamptz;
58 SAVEPOINT second_sp;
59 SET vacuum_cost_delay TO 90;
60 SET datestyle = 'SQL, YMD';
61 SHOW datestyle;
62 SELECT '2006-08-13 12:34:56'::timestamptz;
63 SAVEPOINT third_sp;
64 SET vacuum_cost_delay TO 100;
65 SHOW vacuum_cost_delay;
66 SET datestyle = 'Postgres, MDY';
67 SHOW datestyle;
68 SELECT '2006-08-13 12:34:56'::timestamptz;
69 ROLLBACK TO third_sp;
70 SHOW vacuum_cost_delay;
71 SHOW datestyle;
72 SELECT '2006-08-13 12:34:56'::timestamptz;
73 ROLLBACK TO second_sp;
74 SHOW vacuum_cost_delay;
75 SHOW datestyle;
76 SELECT '2006-08-13 12:34:56'::timestamptz;
77 ROLLBACK;
78 SHOW vacuum_cost_delay;
79 SHOW datestyle;
80 SELECT '2006-08-13 12:34:56'::timestamptz;
81
82 -- SET LOCAL with Savepoints
83 BEGIN;
84 SHOW vacuum_cost_delay;
85 SHOW datestyle;
86 SELECT '2006-08-13 12:34:56'::timestamptz;
87 SAVEPOINT sp;
88 SET LOCAL vacuum_cost_delay TO 30;
89 SHOW vacuum_cost_delay;
90 SET LOCAL datestyle = 'Postgres, MDY';
91 SHOW datestyle;
92 SELECT '2006-08-13 12:34:56'::timestamptz;
93 ROLLBACK TO sp;
94 SHOW vacuum_cost_delay;
95 SHOW datestyle;
96 SELECT '2006-08-13 12:34:56'::timestamptz;
97 ROLLBACK;
98 SHOW vacuum_cost_delay;
99 SHOW datestyle;
100 SELECT '2006-08-13 12:34:56'::timestamptz;
101
102 -- SET LOCAL persists through RELEASE (which was not true in 8.0-8.2)
103 BEGIN;
104 SHOW vacuum_cost_delay;
105 SHOW datestyle;
106 SELECT '2006-08-13 12:34:56'::timestamptz;
107 SAVEPOINT sp;
108 SET LOCAL vacuum_cost_delay TO 30;
109 SHOW vacuum_cost_delay;
110 SET LOCAL datestyle = 'Postgres, MDY';
111 SHOW datestyle;
112 SELECT '2006-08-13 12:34:56'::timestamptz;
113 RELEASE SAVEPOINT sp;
114 SHOW vacuum_cost_delay;
115 SHOW datestyle;
116 SELECT '2006-08-13 12:34:56'::timestamptz;
117 ROLLBACK;
118 SHOW vacuum_cost_delay;
119 SHOW datestyle;
120 SELECT '2006-08-13 12:34:56'::timestamptz;
121
122 -- SET followed by SET LOCAL
123 BEGIN;
124 SET vacuum_cost_delay TO 40;
125 SET LOCAL vacuum_cost_delay TO 50;
126 SHOW vacuum_cost_delay;
127 SET datestyle = 'ISO, DMY';
128 SET LOCAL datestyle = 'Postgres, MDY';
129 SHOW datestyle;
130 SELECT '2006-08-13 12:34:56'::timestamptz;
131 COMMIT;
132 SHOW vacuum_cost_delay;
133 SHOW datestyle;
134 SELECT '2006-08-13 12:34:56'::timestamptz;
135
136 --
137 -- Test RESET.  We use datestyle because the reset value is forced by
138 -- pg_regress, so it doesn't depend on the installation's configuration.
139 --
140 SET datestyle = iso, ymd;
141 SHOW datestyle;
142 SELECT '2006-08-13 12:34:56'::timestamptz;
143 RESET datestyle;
144 SHOW datestyle;
145 SELECT '2006-08-13 12:34:56'::timestamptz;
146
147 --
148 -- Test DISCARD TEMP
149 --
150 CREATE TEMP TABLE reset_test ( data text ) ON COMMIT DELETE ROWS;
151 SELECT relname FROM pg_class WHERE relname = 'reset_test';
152 DISCARD TEMP;
153 SELECT relname FROM pg_class WHERE relname = 'reset_test';
154
155 --
156 -- Test DISCARD ALL
157 --
158
159 -- do changes
160 DECLARE foo CURSOR WITH HOLD FOR SELECT 1;
161 PREPARE foo AS SELECT 1;
162 LISTEN foo_event;
163 SET vacuum_cost_delay = 13;
164 CREATE TEMP TABLE tmp_foo (data text) ON COMMIT DELETE ROWS;
165 CREATE ROLE temp_reset_user;
166 SET SESSION AUTHORIZATION temp_reset_user;
167 -- look changes
168 SELECT relname FROM pg_listener;
169 SELECT name FROM pg_prepared_statements;
170 SELECT name FROM pg_cursors;
171 SHOW vacuum_cost_delay;
172 SELECT relname from pg_class where relname = 'tmp_foo';
173 SELECT current_user = 'temp_reset_user';
174 -- discard everything
175 DISCARD ALL;
176 -- look again
177 SELECT relname FROM pg_listener;
178 SELECT name FROM pg_prepared_statements;
179 SELECT name FROM pg_cursors;
180 SHOW vacuum_cost_delay;
181 SELECT relname from pg_class where relname = 'tmp_foo';
182 SELECT current_user = 'temp_reset_user';
183 DROP ROLE temp_reset_user;
184
185 --
186 -- Tests for function-local GUC settings
187 --
188
189 set work_mem = '3MB';
190
191 create function report_guc(text) returns text as
192 $$ select current_setting($1) $$ language sql
193 set work_mem = '1MB';
194
195 select report_guc('work_mem'), current_setting('work_mem');
196
197 -- this should draw only a warning
198 alter function report_guc(text) set search_path = no_such_schema;
199
200 -- with error occurring here
201 select report_guc('work_mem'), current_setting('work_mem');
202
203 alter function report_guc(text) reset search_path set work_mem = '2MB';
204
205 select report_guc('work_mem'), current_setting('work_mem');
206
207 alter function report_guc(text) reset all;
208
209 select report_guc('work_mem'), current_setting('work_mem');
210
211 -- SET LOCAL is restricted by a function SET option
212 create or replace function myfunc(int) returns text as $$
213 begin
214   set local work_mem = '2MB';
215   return current_setting('work_mem');
216 end $$
217 language plpgsql
218 set work_mem = '1MB';
219
220 select myfunc(0), current_setting('work_mem');
221
222 alter function myfunc(int) reset all;
223
224 select myfunc(0), current_setting('work_mem');
225
226 set work_mem = '3MB';
227
228 -- but SET isn't
229 create or replace function myfunc(int) returns text as $$
230 begin
231   set work_mem = '2MB';
232   return current_setting('work_mem');
233 end $$
234 language plpgsql
235 set work_mem = '1MB';
236
237 select myfunc(0), current_setting('work_mem');
238
239 set work_mem = '3MB';
240
241 -- it should roll back on error, though
242 create or replace function myfunc(int) returns text as $$
243 begin
244   set work_mem = '2MB';
245   perform 1/$1;
246   return current_setting('work_mem');
247 end $$
248 language plpgsql
249 set work_mem = '1MB';
250
251 select myfunc(0);
252 select current_setting('work_mem');
253 select myfunc(1), current_setting('work_mem');