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