1# Save the initial number of concurrent sessions
2--disable_ps_protocol
3--source include/not_embedded.inc
4--source include/count_sessions.inc
5
6if ( !$VERSION_TOKEN ) {
7  skip Locking service plugin requires the environment variable \$VERSION_TOKEN to be set (normally done by mtr);
8}
9
10--echo #
11--echo # Bug #23210850: VERSION_TOKEN better protected
12--echo #
13
14--echo # Define a UDF before installing the plugin
15--replace_regex /\.dll/.so/
16eval create function version_tokens_show returns string soname '$VERSION_TOKEN';
17--error ER_CANT_INITIALIZE_UDF
18SELECT version_tokens_show();
19
20--echo # Testing installing the plugin twice while there's a UDF defined
21
22--replace_regex /\.dll/.so/
23eval INSTALL PLUGIN version_tokens SONAME '$VERSION_TOKEN';
24UNINSTALL PLUGIN version_tokens;
25--source include/disconnect_connections.inc
26
27--replace_regex /\.dll/.so/
28eval INSTALL PLUGIN version_tokens SONAME '$VERSION_TOKEN';
29UNINSTALL PLUGIN version_tokens;
30--source include/disconnect_connections.inc
31
32--echo # Should not crash when unloading the so through removing the UDF
33drop function version_tokens_show;
34
35
36--replace_regex /\.dll/.so/
37eval INSTALL PLUGIN version_tokens SONAME '$VERSION_TOKEN';
38--replace_regex /\.dll/.so/
39eval create function version_tokens_set returns string soname '$VERSION_TOKEN';
40--replace_regex /\.dll/.so/
41eval create function version_tokens_show returns string soname '$VERSION_TOKEN';
42--replace_regex /\.dll/.so/
43eval create function version_tokens_edit returns string soname '$VERSION_TOKEN';
44--replace_regex /\.dll/.so/
45eval create function version_tokens_delete returns string soname '$VERSION_TOKEN';
46--replace_regex /\.dll/.so/
47eval create function version_tokens_lock_shared returns int soname '$VERSION_TOKEN';
48--replace_regex /\.dll/.so/
49eval create function version_tokens_lock_exclusive returns int soname '$VERSION_TOKEN';
50--replace_regex /\.dll/.so/
51eval create function version_tokens_unlock returns int soname '$VERSION_TOKEN';
52
53
54-- echo
55-- echo # Error checks for UDFs
56--error ER_CANT_INITIALIZE_UDF
57select version_tokens_set("token1    =     abc;token2=       def",123);
58--error ER_CANT_INITIALIZE_UDF
59select version_tokens_edit("token1= 123;         token3     =         asdf",123);
60--error ER_CANT_INITIALIZE_UDF
61select version_tokens_delete("token1;token3",123);
62--error ER_CANT_INITIALIZE_UDF
63select version_tokens_show("123");
64--error ER_CANT_INITIALIZE_UDF
65select version_tokens_set(123);
66--error ER_CANT_INITIALIZE_UDF
67select version_tokens_edit(123);
68--error ER_CANT_INITIALIZE_UDF
69select version_tokens_delete(123);
70--error ER_CANT_INITIALIZE_UDF
71select version_tokens_lock_shared("Less arguments");
72--error ER_CANT_INITIALIZE_UDF
73select version_tokens_lock_shared(1,"Wrong argument type");
74--error ER_CANT_INITIALIZE_UDF
75select version_tokens_lock_exclusive("Less arguments");
76--error ER_CANT_INITIALIZE_UDF
77select version_tokens_lock_exclusive(1,"Wrong argument type");
78--error ER_CANT_INITIALIZE_UDF
79select version_tokens_unlock("Takes no arguments");
80
81--error ER_DATA_OUT_OF_RANGE
82select version_tokens_lock_shared("gizmo", -1);
83
84--error ER_DATA_OUT_OF_RANGE
85select version_tokens_lock_exclusive("gizmo", -1);
86
87-- echo
88CREATE USER vbhagi@localhost;
89
90-- echo
91select version_tokens_set("token1    =     abc;token2=       def");
92select version_tokens_show();
93
94-- echo
95select version_tokens_set("");
96select version_tokens_show();
97
98-- echo
99select version_tokens_set("token1    =     abc;token2=       def");
100select version_tokens_show();
101
102-- echo
103select version_tokens_edit("token1= 123;         token3     =         asdf");
104select version_tokens_show();
105
106-- echo
107do version_tokens_set("token1    =     def;;;;      ;invalid_token; token2= abc;;");
108select version_tokens_show();
109
110-- echo
111do version_tokens_set("token1    =     def;; token111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111=123;;      ;invalid_token; token2= abc;;");
112select version_tokens_show();
113
114-- echo
115do version_tokens_set("token1    =     none;;;;      ;invalid_token; token2= 123;;");
116select version_tokens_show();
117
118-- echo
119do version_tokens_set("token1=def;token2= abc;          ;token3=ghi");
120select version_tokens_show();
121
122-- echo
123select version_tokens_delete("invalid=token");
124select version_tokens_show();
125
126-- echo
127select version_tokens_delete("token1;token3");
128select version_tokens_show();
129
130-- echo
131select version_tokens_delete("*");
132select version_tokens_show();
133
134-- echo
135do version_tokens_set("token1=def;token2= abc;token3=111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111112");
136select version_tokens_show();
137
138-- echo
139connect (con1,localhost,vbhagi,,test);
140connection con1;
141-- echo # Connection: con1
142-- echo
143-- echo # The UDFs fail due to lack of privileges.
144--error ER_CANT_INITIALIZE_UDF
145select version_tokens_set("token1    =     abc;token2=       def");
146--error ER_CANT_INITIALIZE_UDF
147select version_tokens_edit("token1= 123;         token3     =         asdf");
148--error ER_CANT_INITIALIZE_UDF
149select version_tokens_delete("token1;token3");
150--error ER_CANT_INITIALIZE_UDF
151select version_tokens_show();
152set @@version_tokens_session= "token1=def";
153
154-- echo
155select 1;
156select 1;
157
158-- echo
159set @@version_tokens_session= "token3=abc";
160
161-- echo
162--error ER_VTOKEN_PLUGIN_TOKEN_MISMATCH
163select 1;
164
165-- echo
166disconnect con1;
167--source include/wait_until_disconnected.inc
168-- echo # Connection: con1 refreshed
169connect (con1,localhost,vbhagi,,test);
170connection con1;
171-- echo
172-- echo # Next statement goes through as the connection is refreshed.
173select @@version_tokens_session;
174
175--echo
176set @@version_tokens_session= "token111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111=abc;;";
177--error ER_ACCESS_DENIED_ERROR
178set @@old_passwords= 0;
179-- echo
180disconnect con1;
181--source include/wait_until_disconnected.inc
182-- echo # Connection: con1 refreshed
183connect (con1,localhost,vbhagi,,test);
184connection con1;
185-- echo
186-- echo # Next statement goes through as the connection is refreshed.
187select @@version_tokens_session;
188
189-- echo
190set @@version_tokens_session= ";;";
191set @@version_tokens_session= NULL;
192set @@version_tokens_session= "token1=def;;;;;;;;";
193set @@version_tokens_session= "token1=def;;;      token2  =   abc    ;   =  ;;;;";
194
195disconnect con1;
196--source include/wait_until_disconnected.inc
197
198connect (con1,localhost,vbhagi,,test);
199-- echo
200-- echo # Connection: con1 refreshed
201-- echo
202connection con1;
203set @@version_tokens_session= "token1=def;;;      token2  =   abc    ;  sdf =  ;;;;";
204--error ER_ACCESS_DENIED_ERROR
205set @@old_passwords= 0;
206
207disconnect con1;
208--source include/wait_until_disconnected.inc
209
210connect (con1,localhost,vbhagi,,test);
211-- echo
212-- echo # Connection: con1 refreshed
213-- echo
214connection con1;
215set @@version_tokens_session= "token1=def;;        ;      token2  =   abc    ;;;;;";
216-- echo # Next queries get through as the session tokens are valid
217use test;
218create table t1 (c1 int);
219drop table t1;
220set @@version_tokens_session= "token1=def;;;      token2  =   abc    ;   = sdf ;;;;";
221-- echo # This query fails as " = sdf" is not a valid token.
222--error ER_ACCESS_DENIED_ERROR
223create table t1 (c1 int);
224
225disconnect con1;
226--source include/wait_until_disconnected.inc
227
228connect (con1,localhost,vbhagi,,test);
229-- echo
230-- echo # Connection: con1 refreshed
231-- echo
232connection con1;
233set @@version_tokens_session= "token100=def;;;      token2  =   abc    ;;;;;";
234--error ER_VTOKEN_PLUGIN_TOKEN_NOT_FOUND
235create table t1 (c1 int);
236disconnect con1;
237
238-- echo
239-- echo # Connection: default
240connection default;
241
242--echo # Next statement goes through as it is from a different connection.
243select 1;
244
245--echo # Tests related to locking
246CONNECT (vtcon1, localhost, root,,);
247CONNECT (vtcon2, localhost, root,,);
248CONNECT (vtcon3, localhost, root,,);
249
250-- echo # Connection: vtcon1
251CONNECTION vtcon1;
252SELECT version_tokens_set("a=aa;b=bb;c=cc");
253set @@version_tokens_session= "a=aa";
254--let $t1_vtcon1 = `SELECT sysdate()`
255--send SELECT sleep(6); # sleep for 6 seconds in background.
256
257-- echo # Connection: vtcon2
258CONNECTION vtcon2;
259--let $t1_vtcon2 = `SELECT sysdate()`
260SELECT version_tokens_lock_exclusive("b",20);
261--let $t2_vtcon2 = `SELECT sysdate()`
262--let $t3_vtcon2 = `SELECT time_format(timediff("$t2_vtcon2","$t1_vtcon2"),'%S')`
263if ($t3_vtcon2 >= "03") {
264--echo vtcon2 - Time difference should not be there or very close to max 3 seconds because no waiting time required to acquire lock on b
265}
266
267-- echo # Connection: vtcon3
268CONNECTION vtcon3;
269let $wait_condition= SELECT COUNT(*) > 0 FROM information_schema.processlist
270                     WHERE info like '%select sleep%' AND state='User sleep';
271source include/wait_condition.inc;
272SELECT version_tokens_lock_exclusive("a",20);
273--let $t2_vtcon3 = `SELECT sysdate()`
274--let $t3_vtcon3 = `SELECT time_format(timediff("$t2_vtcon3","$t1_vtcon1"),'%S')`
275if ($t3_vtcon3 < "05") {
276--echo vtcon2 - Time difference should be not less than 5 seconds, waited till lock on a is released by vtcon1. Actual wait time is : $t3_vtcon3
277}
278SELECT version_tokens_unlock();
279-- echo # Connection: vtcon1
280CONNECTION vtcon1;
281--reap
282disconnect vtcon1;
283disconnect vtcon2;
284disconnect vtcon3;
285connection default;
286
287
288-- echo
289UNINSTALL PLUGIN version_tokens;
290--source include/disconnect_connections.inc
291
292--disable_result_log
293--disable_query_log
294let $mysql_errno = 0;
295# 1123=ER_CANT_INITIALIZE_UDF
296while ($mysql_errno != 1123)
297{
298  --error 0,1123
299  SELECT version_tokens_set("token1=abc;token2=def");
300  --sleep 0.1
301}
302--enable_query_log
303--enable_result_log
304
305-- echo
306-- echo # The UDFs fail as the plugin is uninstalled.
307--error ER_CANT_INITIALIZE_UDF
308select version_tokens_set("token1    =     abc;token2=       def");
309--error ER_CANT_INITIALIZE_UDF
310select version_tokens_edit("token1= 123;         token3     =         asdf");
311--error ER_CANT_INITIALIZE_UDF
312select version_tokens_delete("token1;token3");
313--error ER_CANT_INITIALIZE_UDF
314select version_tokens_show();
315
316--echo
317drop function version_tokens_set;
318drop function version_tokens_show;
319drop function version_tokens_edit;
320drop function version_tokens_delete;
321drop function version_tokens_lock_shared;
322drop function version_tokens_lock_exclusive;
323drop function version_tokens_unlock;
324drop user vbhagi@localhost;
325