1 /*
2 Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
3 
4 The MySQL Connector/C is licensed under the terms of the GPLv2
5 <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>, like most
6 MySQL Connectors. There are special exceptions to the terms and
7 conditions of the GPLv2 as it is applied to this software, see the
8 FLOSS License Exception
9 <http://www.mysql.com/about/legal/licensing/foss-exception.html>.
10 
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published
13 by the Free Software Foundation; version 2 of the License.
14 
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
17 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 for more details.
19 
20 You should have received a copy of the GNU General Public License along
21 with this program; if not, write to the Free Software Foundation, Inc.,
22 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
23 */
24 /**
25   Some basic tests of the client API.
26 */
27 
28 #include "my_test.h"
29 
test_conc66(MYSQL * my)30 static int test_conc66(MYSQL *my)
31 {
32   MYSQL *mysql= mysql_init(NULL);
33   int rc;
34   FILE *fp;
35   char query[1024];
36 
37   SKIP_SKYSQL;
38   SKIP_MAXSCALE;
39 
40   if (!is_mariadb)
41     return SKIP;
42 
43   if (!(fp= fopen("./my-conc66-test.cnf", "w")))
44     return FAIL;
45 
46   fprintf(fp, "[notmygroup]\n");
47   fprintf(fp, "user=foo\n");
48   fprintf(fp, "[conc-66]\n");
49   fprintf(fp, "user=conc66\n");
50   fprintf(fp, "port=3306\n");
51   fprintf(fp, "enable-local-infile\n");
52   fprintf(fp, "password='test@A1\\\";#test'\n");
53 
54   fclose(fp);
55 
56   rc= mysql_options(mysql, MYSQL_READ_DEFAULT_GROUP, "conc-66");
57   check_mysql_rc(rc, mysql);
58   rc= mysql_options(mysql, MYSQL_READ_DEFAULT_FILE, "./my-conc66-test.cnf");
59   check_mysql_rc(rc, mysql);
60 
61   sprintf(query, "GRANT ALL ON %s.* TO 'conc66'@'%s' IDENTIFIED BY 'test@A1\";#test'", schema, this_host ? this_host : "localhost");
62   rc= mysql_query(my, query);
63   check_mysql_rc(rc, my);
64   rc= mysql_query(my, "FLUSH PRIVILEGES");
65   check_mysql_rc(rc, my);
66   if (!my_test_connect(mysql, hostname, NULL,
67                              NULL, schema, port, socketname, 0))
68   {
69     diag("user: %s", mysql->options.user);
70     diag("Error: %s", mysql_error(mysql));
71     return FAIL;
72   }
73     diag("user: %s", mysql->options.user);
74 
75   sprintf(query, "DROP user 'conc66'@'%s'", this_host ? this_host : "localhost");
76   rc= mysql_query(my, query);
77 
78   check_mysql_rc(rc, my);
79   mysql_close(mysql);
80   return OK;
81 }
82 
test_bug20023(MYSQL * mysql)83 static int test_bug20023(MYSQL *mysql)
84 {
85   int sql_big_selects_orig;
86   int max_join_size_orig;
87 
88   int sql_big_selects_2;
89   int sql_big_selects_3;
90   int sql_big_selects_4;
91   int sql_big_selects_5;
92   int rc;
93 
94   SKIP_SKYSQL;
95   SKIP_MAXSCALE;
96 
97   if (!is_mariadb)
98     return SKIP;
99 
100   if (mysql_get_server_version(mysql) < 50100) {
101     diag("Test requires MySQL Server version 5.1 or above");
102     return SKIP;
103   }
104 
105   /***********************************************************************
106     Remember original SQL_BIG_SELECTS, MAX_JOIN_SIZE values.
107   ***********************************************************************/
108 
109   query_int_variable(mysql,
110                      "@@session.sql_big_selects",
111                      &sql_big_selects_orig);
112 
113   query_int_variable(mysql,
114                      "@@global.max_join_size",
115                      &max_join_size_orig);
116 
117   /***********************************************************************
118     Test that COM_CHANGE_USER resets the SQL_BIG_SELECTS to the initial value.
119   ***********************************************************************/
120 
121   /* Issue COM_CHANGE_USER. */
122   rc= mysql_change_user(mysql, username, password, schema);
123   check_mysql_rc(rc, mysql);
124 
125   /* Query SQL_BIG_SELECTS. */
126 
127   query_int_variable(mysql,
128                      "@@session.sql_big_selects",
129                      &sql_big_selects_2);
130 
131   /* Check that SQL_BIG_SELECTS is reset properly. */
132 
133   FAIL_UNLESS(sql_big_selects_orig == sql_big_selects_2, "Different value for sql_big_select");
134 
135   /***********************************************************************
136     Test that if MAX_JOIN_SIZE set to non-default value,
137     SQL_BIG_SELECTS will be 0.
138   ***********************************************************************/
139 
140   /* Set MAX_JOIN_SIZE to some non-default value. */
141 
142   rc= mysql_query(mysql, "SET @@global.max_join_size = 10000");
143   check_mysql_rc(rc, mysql);
144   rc= mysql_query(mysql, "SET @@session.max_join_size = default");
145   check_mysql_rc(rc, mysql);
146 
147   /* Issue COM_CHANGE_USER. */
148 
149   rc= mysql_change_user(mysql, username, password, schema);
150   check_mysql_rc(rc, mysql);
151 
152   /* Query SQL_BIG_SELECTS. */
153 
154   query_int_variable(mysql,
155                      "@@session.sql_big_selects",
156                      &sql_big_selects_3);
157 
158   /* Check that SQL_BIG_SELECTS is 0. */
159 
160   FAIL_UNLESS(sql_big_selects_3 == 0, "big_selects != 0");
161 
162   /***********************************************************************
163     Test that if MAX_JOIN_SIZE set to default value,
164     SQL_BIG_SELECTS will be 1.
165   ***********************************************************************/
166 
167   /* Set MAX_JOIN_SIZE to the default value (-1). */
168 
169   rc= mysql_query(mysql, "SET @@global.max_join_size = cast(-1 as unsigned int)");
170   rc= mysql_query(mysql, "SET @@session.max_join_size = default");
171 
172   /* Issue COM_CHANGE_USER. */
173 
174   rc= mysql_change_user(mysql, username, password, schema);
175   check_mysql_rc(rc, mysql);
176 
177   /* Query SQL_BIG_SELECTS. */
178 
179   query_int_variable(mysql,
180                      "@@session.sql_big_selects",
181                      &sql_big_selects_4);
182 
183   /* Check that SQL_BIG_SELECTS is 1. */
184 
185   FAIL_UNLESS(sql_big_selects_4 == 1, "sql_big_select != 1");
186 
187   /***********************************************************************
188     Restore MAX_JOIN_SIZE.
189     Check that SQL_BIG_SELECTS will be the original one.
190   ***********************************************************************/
191 
192   rc= mysql_query(mysql, "SET @@global.max_join_size = cast(-1 as unsigned int)");
193   check_mysql_rc(rc, mysql);
194 
195   rc= mysql_query(mysql, "SET @@session.max_join_size = default");
196   check_mysql_rc(rc, mysql);
197 
198   /* Issue COM_CHANGE_USER. */
199 
200   rc= mysql_change_user(mysql, username, password, schema);
201   check_mysql_rc(rc, mysql);
202 
203   /* Query SQL_BIG_SELECTS. */
204 
205   query_int_variable(mysql,
206                      "@@session.sql_big_selects",
207                      &sql_big_selects_5);
208 
209   /* Check that SQL_BIG_SELECTS is 1. */
210 
211   FAIL_UNLESS(sql_big_selects_5 == sql_big_selects_orig, "big_select != 1");
212 
213   /***********************************************************************
214     That's it. Cleanup.
215   ***********************************************************************/
216 
217   return OK;
218 }
219 
test_change_user(MYSQL * mysql)220 static int test_change_user(MYSQL *mysql)
221 {
222   char buff[256];
223   const char *user_pw= "mysqltest_pw";
224   const char *user_no_pw= "mysqltest_no_pw";
225   const char *pw= "password";
226   const char *db= "mysqltest_user_test_database";
227   int rc;
228 
229   diag("Due to mysql_change_user security fix this test will not work anymore.");
230   return(SKIP);
231 
232   /* Prepare environment */
233   sprintf(buff, "drop database if exists %s", db);
234   rc= mysql_query(mysql, buff);
235   check_mysql_rc(rc, mysql);
236 
237   sprintf(buff, "create database %s", db);
238   rc= mysql_query(mysql, buff);
239   check_mysql_rc(rc, mysql);
240 
241   sprintf(buff,
242           "grant select on %s.* to %s@'%%' identified by '%s'",
243           db,
244           user_pw,
245           pw);
246   rc= mysql_query(mysql, buff);
247   check_mysql_rc(rc, mysql);
248 
249   sprintf(buff,
250           "grant select on %s.* to %s@'%%'",
251           db,
252           user_no_pw);
253   rc= mysql_query(mysql, buff);
254   check_mysql_rc(rc, mysql);
255 
256 
257   /* Try some combinations */
258   rc= mysql_change_user(mysql, NULL, NULL, NULL);
259   FAIL_UNLESS(rc, "Error expected");
260 
261 
262   rc= mysql_change_user(mysql, "", NULL, NULL);
263   FAIL_UNLESS(rc, "Error expected");
264 
265   rc= mysql_change_user(mysql, "", "", NULL);
266   FAIL_UNLESS(rc, "Error expected");
267 
268   rc= mysql_change_user(mysql, "", "", "");
269   FAIL_UNLESS(rc, "Error expected");
270 
271   rc= mysql_change_user(mysql, NULL, "", "");
272   FAIL_UNLESS(rc, "Error expected");
273 
274 
275   rc= mysql_change_user(mysql, NULL, NULL, "");
276   FAIL_UNLESS(rc, "Error expected");
277 
278   rc= mysql_change_user(mysql, "", NULL, "");
279   FAIL_UNLESS(rc, "Error expected");
280 
281   rc= mysql_change_user(mysql, user_pw, NULL, "");
282   FAIL_UNLESS(rc, "Error expected");
283 
284   rc= mysql_change_user(mysql, user_pw, "", "");
285   FAIL_UNLESS(rc, "Error expected");
286 
287   rc= mysql_change_user(mysql, user_pw, "", NULL);
288   FAIL_UNLESS(rc, "Error expected");
289 
290   rc= mysql_change_user(mysql, user_pw, NULL, NULL);
291   FAIL_UNLESS(rc, "Error expected");
292 
293   rc= mysql_change_user(mysql, user_pw, "", db);
294   FAIL_UNLESS(rc, "Error expected");
295 
296   rc= mysql_change_user(mysql, user_pw, NULL, db);
297   FAIL_UNLESS(rc, "Error expected");
298 
299   rc= mysql_change_user(mysql, user_pw, pw, db);
300   check_mysql_rc(rc, mysql);
301 
302   rc= mysql_change_user(mysql, user_pw, pw, NULL);
303   check_mysql_rc(rc, mysql);
304 
305   rc= mysql_change_user(mysql, user_pw, pw, "");
306   check_mysql_rc(rc, mysql);
307 
308   rc= mysql_change_user(mysql, user_no_pw, pw, db);
309   FAIL_UNLESS(rc, "Error expected");
310 
311   rc= mysql_change_user(mysql, user_no_pw, pw, "");
312   FAIL_UNLESS(rc, "Error expected");
313 
314   rc= mysql_change_user(mysql, user_no_pw, pw, NULL);
315   FAIL_UNLESS(rc, "Error expected");
316 
317   rc= mysql_change_user(mysql, user_no_pw, "", NULL);
318   check_mysql_rc(rc, mysql);
319 
320   rc= mysql_change_user(mysql, user_no_pw, "", "");
321   check_mysql_rc(rc, mysql);
322 
323   rc= mysql_change_user(mysql, user_no_pw, "", db);
324   check_mysql_rc(rc, mysql);
325 
326   rc= mysql_change_user(mysql, user_no_pw, NULL, db);
327   check_mysql_rc(rc, mysql);
328 
329   rc= mysql_change_user(mysql, "", pw, db);
330   FAIL_UNLESS(rc, "Error expected");
331 
332   rc= mysql_change_user(mysql, "", pw, "");
333   FAIL_UNLESS(rc, "Error expected");
334 
335   rc= mysql_change_user(mysql, "", pw, NULL);
336   FAIL_UNLESS(rc, "Error expected");
337 
338   rc= mysql_change_user(mysql, NULL, pw, NULL);
339   FAIL_UNLESS(rc, "Error expected");
340 
341   rc= mysql_change_user(mysql, NULL, NULL, db);
342   FAIL_UNLESS(rc, "Error expected");
343 
344   rc= mysql_change_user(mysql, NULL, "", db);
345   FAIL_UNLESS(rc, "Error expected");
346 
347   rc= mysql_change_user(mysql, "", "", db);
348   FAIL_UNLESS(rc, "Error expected");
349 
350   /* Cleanup the environment */
351 
352   rc= mysql_change_user(mysql, username, password, schema);
353   check_mysql_rc(rc, mysql);
354 
355   sprintf(buff, "drop database %s", db);
356   rc= mysql_query(mysql, buff);
357   check_mysql_rc(rc, mysql);
358 
359   sprintf(buff, "drop user %s@'%%'", user_pw);
360   rc= mysql_query(mysql, buff);
361   check_mysql_rc(rc, mysql);
362 
363   sprintf(buff, "drop user %s@'%%'", user_no_pw);
364   rc= mysql_query(mysql, buff);
365   check_mysql_rc(rc, mysql);
366 
367   return OK;
368 }
369 
370 /**
371   Bug#31669 Buffer overflow in mysql_change_user()
372 */
373 
374 #define LARGE_BUFFER_SIZE 2048
375 
test_bug31669(MYSQL * mysql)376 static int test_bug31669(MYSQL *mysql)
377 {
378   int rc;
379   static char buff[LARGE_BUFFER_SIZE+1];
380   static char user[USERNAME_CHAR_LENGTH+1];
381   static char db[NAME_CHAR_LEN+1];
382   static char query[LARGE_BUFFER_SIZE*2];
383 
384   diag("Due to mysql_change_user security fix this test will not work anymore.");
385   return(SKIP);
386 
387   rc= mysql_change_user(mysql, NULL, NULL, NULL);
388   FAIL_UNLESS(rc, "Error expected");
389 
390   rc= mysql_change_user(mysql, "", "", "");
391   FAIL_UNLESS(rc, "Error expected");
392 
393   memset(buff, 'a', sizeof(buff));
394 
395   rc= mysql_change_user(mysql, buff, buff, buff);
396   FAIL_UNLESS(rc, "Error expected");
397 
398   rc = mysql_change_user(mysql, username, password, schema);
399   check_mysql_rc(rc, mysql);
400 
401   memset(db, 'a', sizeof(db));
402   db[NAME_CHAR_LEN]= 0;
403   sprintf(query, "CREATE DATABASE IF NOT EXISTS %s", db);
404   rc= mysql_query(mysql, query);
405   check_mysql_rc(rc, mysql);
406 
407   memset(user, 'b', sizeof(user));
408   user[USERNAME_CHAR_LENGTH]= 0;
409   memset(buff, 'c', sizeof(buff));
410   buff[LARGE_BUFFER_SIZE]= 0;
411   sprintf(query, "GRANT ALL PRIVILEGES ON *.* TO '%s'@'%%' IDENTIFIED BY '%s' WITH GRANT OPTION", user, buff);
412   rc= mysql_query(mysql, query);
413   check_mysql_rc(rc, mysql);
414 
415   rc= mysql_query(mysql, "FLUSH PRIVILEGES");
416   check_mysql_rc(rc, mysql);
417 
418   rc= mysql_change_user(mysql, user, buff, db);
419   check_mysql_rc(rc, mysql);
420 
421   user[USERNAME_CHAR_LENGTH-1]= 'a';
422   rc= mysql_change_user(mysql, user, buff, db);
423   FAIL_UNLESS(rc, "Error expected");
424 
425   user[USERNAME_CHAR_LENGTH-1]= 'b';
426   buff[LARGE_BUFFER_SIZE-1]= 'd';
427   rc= mysql_change_user(mysql, user, buff, db);
428   FAIL_UNLESS(rc, "Error expected");
429 
430   buff[LARGE_BUFFER_SIZE-1]= 'c';
431   db[NAME_CHAR_LEN-1]= 'e';
432   rc= mysql_change_user(mysql, user, buff, db);
433   FAIL_UNLESS(rc, "Error expected");
434 
435   db[NAME_CHAR_LEN-1]= 'a';
436   rc= mysql_change_user(mysql, user, buff, db);
437   FAIL_UNLESS(!rc, "Error expected");
438 
439   rc= mysql_change_user(mysql, user + 1, buff + 1, db + 1);
440   FAIL_UNLESS(rc, "Error expected");
441 
442   rc = mysql_change_user(mysql, username, password, schema);
443   check_mysql_rc(rc, mysql);
444 
445   sprintf(query, "DROP DATABASE %s", db);
446   rc= mysql_query(mysql, query);
447   check_mysql_rc(rc, mysql);
448 
449   sprintf(query, "DELETE FROM mysql.user WHERE User='%s'", user);
450   rc= mysql_query(mysql, query);
451   check_mysql_rc(rc, mysql);
452   FAIL_UNLESS(mysql_affected_rows(mysql) == 1, "");
453 
454   return OK;
455 }
456 
457 /**
458      Bug# 33831 my_test_connect() should fail if
459      given an already connected MYSQL handle.
460 */
461 
test_bug33831(MYSQL * mysql)462 static int test_bug33831(MYSQL *mysql)
463 {
464   FAIL_IF(my_test_connect(mysql, hostname, username,
465                              password, schema, port, socketname, 0),
466          "Error expected");
467 
468   return OK;
469 }
470 
471 /* Test MYSQL_OPT_RECONNECT, Bug#15719 */
472 
test_opt_reconnect(MYSQL * mysql)473 static int test_opt_reconnect(MYSQL *mysql)
474 {
475   my_bool my_true= TRUE;
476   int rc;
477   my_bool reconnect;
478 
479   printf("true: %d\n", TRUE);
480 
481   mysql= mysql_init(NULL);
482   FAIL_IF(!mysql, "not enough memory");
483 
484   mysql_get_option(mysql, MYSQL_OPT_RECONNECT, &reconnect);
485   FAIL_UNLESS(reconnect == 0, "reconnect != 0");
486 
487   rc= mysql_options(mysql, MYSQL_OPT_RECONNECT, &my_true);
488   check_mysql_rc(rc, mysql);
489 
490   mysql_get_option(mysql, MYSQL_OPT_RECONNECT, &reconnect);
491   FAIL_UNLESS(reconnect == 1, "reconnect != 1");
492 
493   if (!(my_test_connect(mysql, hostname, username,
494                            password, schema, port,
495                            socketname, 0)))
496   {
497     diag("connection failed");
498     mysql_close(mysql);
499     return FAIL;
500   }
501 
502   mysql_get_option(mysql, MYSQL_OPT_RECONNECT, &reconnect);
503   FAIL_UNLESS(reconnect == 1, "reconnect != 1");
504 
505   mysql_close(mysql);
506 
507   mysql= mysql_init(NULL);
508   FAIL_IF(!mysql, "not enough memory");
509 
510   mysql_get_option(mysql, MYSQL_OPT_RECONNECT, &reconnect);
511   FAIL_UNLESS(reconnect == 0, "reconnect != 0");
512 
513   if (!(my_test_connect(mysql, hostname, username,
514                            password, schema, port,
515                            socketname, 0)))
516   {
517     diag("connection failed");
518     mysql_close(mysql);
519     return FAIL;
520   }
521 
522   mysql_get_option(mysql, MYSQL_OPT_RECONNECT, &reconnect);
523   FAIL_UNLESS(reconnect == 0, "reconnect != 0");
524 
525   mysql_close(mysql);
526   return OK;
527 }
528 
529 
test_compress(MYSQL * mysql)530 static int test_compress(MYSQL *mysql)
531 {
532   // maxscale doesn't support compression
533   MYSQL_RES *res;
534   MYSQL_ROW row;
535   int rc;
536   SKIP_MAXSCALE;
537 
538   mysql= mysql_init(NULL);
539   FAIL_IF(!mysql, "not enough memory");
540 
541   /* use compressed protocol */
542   rc= mysql_options(mysql, MYSQL_OPT_COMPRESS, NULL);
543 
544 
545 
546   if (!(my_test_connect(mysql, hostname, username,
547                            password, schema, port,
548                            socketname, 0)))
549   {
550     diag("connection failed");
551     return FAIL;
552   }
553 
554   rc= mysql_query(mysql, "SHOW STATUS LIKE 'compression'");
555   check_mysql_rc(rc, mysql);
556   res= mysql_store_result(mysql);
557   row= mysql_fetch_row(res);
558   FAIL_UNLESS(strcmp(row[1], "ON") == 0, "Compression off");
559   mysql_free_result(res);
560 
561   mysql_close(mysql);
562   return OK;
563 }
564 
test_reconnect(MYSQL * mysql)565 static int test_reconnect(MYSQL *mysql)
566 {
567   my_bool my_true= TRUE;
568   MYSQL *mysql1;
569   int rc;
570   my_bool reconnect;
571   SKIP_MAXSCALE;
572 
573   mysql1= mysql_init(NULL);
574   FAIL_IF(!mysql1, "not enough memory");
575 
576   mysql_get_option(mysql1, MYSQL_OPT_RECONNECT, &reconnect);
577   FAIL_UNLESS(reconnect == 0, "reconnect != 0");
578 
579   rc= mysql_options(mysql1, MYSQL_OPT_RECONNECT, &my_true);
580   check_mysql_rc(rc, mysql1);
581 
582   mysql_get_option(mysql1, MYSQL_OPT_RECONNECT, &reconnect);
583   FAIL_UNLESS(reconnect == 1, "reconnect != 1");
584 
585   if (!(my_test_connect(mysql1, hostname, username,
586                            password, schema, port,
587                            socketname, 0)))
588   {
589     diag("connection failed");
590     return FAIL;
591   }
592 
593   mysql_get_option(mysql1, MYSQL_OPT_RECONNECT, &reconnect);
594   FAIL_UNLESS(reconnect == 1, "reconnect != 1");
595 
596   diag("Thread_id before kill: %lu", mysql_thread_id(mysql1));
597   mysql_kill(mysql, mysql_thread_id(mysql1));
598 
599   mysql_ping(mysql1);
600 
601   rc= mysql_query(mysql1, "SELECT 1 FROM DUAL LIMIT 0");
602   check_mysql_rc(rc, mysql1);
603   diag("Thread_id after kill: %lu", mysql_thread_id(mysql1));
604 
605   mysql_get_option(mysql1, MYSQL_OPT_RECONNECT, &reconnect);
606   FAIL_UNLESS(reconnect == 1, "reconnect != 1");
607   mysql_close(mysql1);
608   return OK;
609 }
610 
test_conc21(MYSQL * mysql)611 int test_conc21(MYSQL *mysql)
612 {
613   int rc;
614   MYSQL_RES *res= NULL;
615   MYSQL_ROW row;
616   char tmp[256];
617   unsigned int check_server_version= 0;
618   int major=0, minor= 0, patch=0;
619   SKIP_MAXSCALE;
620 
621   rc= mysql_query(mysql, "SELECT @@version");
622   check_mysql_rc(rc, mysql);
623 
624   res= mysql_store_result(mysql);
625   FAIL_IF(res == NULL, "invalid result set");
626 
627   row= mysql_fetch_row(res);
628   strcpy(tmp, row[0]);
629   mysql_free_result(res);
630 
631   sscanf(tmp, "%d.%d.%d", &major, &minor, &patch);
632 
633   check_server_version= major * 10000 + minor * 100 + patch;
634 
635   FAIL_IF(mysql_get_server_version(mysql) != check_server_version, "Numeric server version mismatch");
636   FAIL_IF(strcmp(mysql_get_server_info(mysql), tmp) != 0, "String server version mismatch");
637   return OK;
638 }
639 
test_conc26(MYSQL * unused)640 int test_conc26(MYSQL *unused __attribute__((unused)))
641 {
642   MYSQL *mysql= mysql_init(NULL);
643   mysql_options(mysql, MYSQL_SET_CHARSET_NAME, "utf8");
644 
645   FAIL_IF(my_test_connect(mysql, hostname, "notexistinguser", "password", schema, port, NULL, CLIENT_REMEMBER_OPTIONS),
646           "Error expected");
647 
648   FAIL_IF(!mysql->options.charset_name || strcmp(mysql->options.charset_name, "utf8") != 0,
649           "expected charsetname=utf8");
650   mysql_close(mysql);
651 
652   mysql= mysql_init(NULL);
653   FAIL_IF(my_test_connect(mysql, hostname, "notexistinguser", "password", schema, port, NULL, 0),
654           "Error expected");
655   FAIL_IF(mysql->options.charset_name, "Error: options not freed");
656   mysql_close(mysql);
657 
658   return OK;
659 }
660 
test_connection_timeout(MYSQL * unused)661 int test_connection_timeout(MYSQL *unused __attribute__((unused)))
662 {
663   unsigned int timeout= 5;
664   time_t start, elapsed;
665   MYSQL *mysql= mysql_init(NULL);
666   mysql_options(mysql, MYSQL_OPT_CONNECT_TIMEOUT, (unsigned int *)&timeout);
667   start= time(NULL);
668   if (my_test_connect(mysql, "192.168.1.101", "notexistinguser", "password", schema, port, NULL, CLIENT_REMEMBER_OPTIONS))
669   {
670     diag("Error expected - maybe you have to change hostname");
671     return FAIL;
672   }
673   elapsed= time(NULL) - start;
674   diag("elapsed: %lu", (unsigned long)elapsed);
675   mysql_close(mysql);
676   FAIL_IF((unsigned int)elapsed > 2 * timeout, "timeout ignored");
677   return OK;
678 }
679 
test_connection_timeout2(MYSQL * unused)680 int test_connection_timeout2(MYSQL *unused __attribute__((unused)))
681 {
682   unsigned int timeout= 5;
683   time_t start, elapsed;
684   MYSQL *mysql;
685 
686   SKIP_SKYSQL;
687   SKIP_MAXSCALE;
688 
689   mysql= mysql_init(NULL);
690   mysql_options(mysql, MYSQL_OPT_CONNECT_TIMEOUT, (unsigned int *)&timeout);
691   mysql_options(mysql, MYSQL_INIT_COMMAND, "set @a:=SLEEP(6)");
692   start= time(NULL);
693   if (my_test_connect(mysql, hostname, username, password, schema, port, NULL, CLIENT_REMEMBER_OPTIONS))
694   {
695     diag("timeout error expected");
696     return FAIL;
697   }
698   elapsed= time(NULL) - start;
699   diag("elapsed: %lu", (unsigned long)elapsed);
700   mysql_close(mysql);
701   FAIL_IF((unsigned int)elapsed > 2 * timeout, "timeout ignored");
702   return OK;
703 }
704 
test_connection_timeout3(MYSQL * unused)705 int test_connection_timeout3(MYSQL *unused __attribute__((unused)))
706 {
707   unsigned int timeout= 5;
708   unsigned int read_write_timeout= 10;
709   int rc;
710   time_t start, elapsed;
711   MYSQL *mysql= mysql_init(NULL);
712   mysql_options(mysql, MYSQL_OPT_CONNECT_TIMEOUT, (unsigned int *)&timeout);
713   mysql_options(mysql, MYSQL_OPT_READ_TIMEOUT, (unsigned int *)&read_write_timeout);
714   mysql_options(mysql, MYSQL_OPT_WRITE_TIMEOUT, (unsigned int *)&read_write_timeout);
715   mysql_options(mysql, MYSQL_INIT_COMMAND, "set @a:=SLEEP(6)");
716   start= time(NULL);
717   if (my_test_connect(mysql, hostname, username, password, schema, port, socketname, CLIENT_REMEMBER_OPTIONS))
718   {
719     diag("timeout error expected");
720     elapsed= time(NULL) - start;
721     diag("elapsed: %lu", (unsigned long)elapsed);
722     return FAIL;
723   }
724   elapsed= time(NULL) - start;
725   diag("elapsed: %lu", (unsigned long)elapsed);
726   FAIL_IF((unsigned int)elapsed > timeout + 1, "timeout ignored");
727 
728   mysql_close(mysql);
729   mysql= mysql_init(NULL);
730   mysql_options(mysql, MYSQL_OPT_CONNECT_TIMEOUT, (unsigned int *)&timeout);
731   mysql_options(mysql, MYSQL_OPT_READ_TIMEOUT, (unsigned int *)&read_write_timeout);
732   mysql_options(mysql, MYSQL_OPT_WRITE_TIMEOUT, (unsigned int *)&read_write_timeout);
733 
734   if (!my_test_connect(mysql, hostname, username, password, schema, port, socketname, CLIENT_REMEMBER_OPTIONS))
735   {
736     diag("Error: %s", mysql_error(mysql));
737     return FAIL;
738   }
739 
740   start= time(NULL);
741   rc= mysql_query(mysql, "SET @a:=SLEEP(12)");
742   elapsed= time(NULL) - start;
743   diag("elapsed: %lu", (unsigned long)elapsed);
744   FAIL_IF(!rc, "timeout expected");
745   mysql_close(mysql);
746   return OK;
747 }
748 
749 
750 /* test should run with valgrind */
test_conc118(MYSQL * mysql)751 static int test_conc118(MYSQL *mysql)
752 {
753   int rc;
754   my_bool reconnect= 1;
755   SKIP_SKYSQL;
756   SKIP_MAXSCALE;
757 
758   mysql_options(mysql, MYSQL_OPT_RECONNECT, &reconnect);
759 
760   mysql->options.unused_1= 1;
761 
762   rc= mysql_kill(mysql, mysql_thread_id(mysql));
763 
764   mysql_ping(mysql);
765 
766   rc= mysql_query(mysql, "SET @a:=1");
767   check_mysql_rc(rc, mysql);
768 
769   FAIL_IF(mysql->options.unused_1 != 1, "options got lost");
770 
771   rc= mysql_kill(mysql, mysql_thread_id(mysql));
772 
773   mysql_ping(mysql);
774   rc= mysql_query(mysql, "SET @a:=1");
775   check_mysql_rc(rc, mysql);
776 
777   return OK;
778 }
779 
test_wrong_bind_address(MYSQL * unused)780 static int test_wrong_bind_address(MYSQL *unused __attribute__((unused)))
781 {
782   const char *bind_addr= "100.188.111.112";
783   MYSQL *mysql;
784 
785   if (!hostname || !strcmp(hostname, "localhost"))
786   {
787     diag("test doesn't work with unix sockets");
788     return SKIP;
789   }
790 
791   mysql=  mysql_init(NULL);
792 
793   mysql_options(mysql, MYSQL_OPT_BIND, bind_addr);
794   if (my_test_connect(mysql, hostname, username,
795                              password, schema, port, socketname, 0))
796   {
797     diag("Error expected");
798     mysql_close(mysql);
799     return FAIL;
800   }
801   diag("Error: %s", mysql_error(mysql));
802   mysql_close(mysql);
803   return OK;
804 }
805 
test_bind_address(MYSQL * my)806 static int test_bind_address(MYSQL *my)
807 {
808   MYSQL *mysql;
809   char *bind_addr= getenv("MYSQL_TEST_BINDADDR");
810   char query[128];
811   int rc;
812 
813   SKIP_SKYSQL;
814 
815   if (!hostname || !strcmp(hostname, "localhost"))
816   {
817     diag("test doesn't work with unix sockets");
818     return SKIP;
819   }
820 
821   sprintf(query, "DROP USER '%s'@'%s'", username, bind_addr);
822   rc= mysql_query(my, query);
823 
824   sprintf(query, "CREATE USER '%s'@'%s' IDENTIFIED BY '%s'", username, bind_addr, password);
825   rc= mysql_query(my, query);
826   check_mysql_rc(rc, my);
827 
828   sprintf(query, "GRANT ALL ON %s.* TO '%s'@'%s'", schema, username, bind_addr);
829   rc= mysql_query(my, query);
830   check_mysql_rc(rc, my);
831 
832   if (!bind_addr)
833   {
834     diag("No bind address specified");
835     return SKIP;
836   }
837 
838   mysql= mysql_init(NULL);
839   mysql_options(mysql, MYSQL_OPT_BIND, bind_addr);
840 
841   if (!my_test_connect(mysql, bind_addr, username,
842                              password, schema, port, socketname, 0))
843   {
844     diag("Error: %s\n", mysql_error(mysql));
845     mysql_close(mysql);
846     return FAIL;
847   }
848   diag("%s", mysql_get_host_info(mysql));
849   mysql_close(mysql);
850   return OK;
851 }
852 
test_get_options(MYSQL * unused)853 static int test_get_options(MYSQL *unused __attribute__((unused)))
854 {
855   MYSQL *mysql= mysql_init(NULL);
856   int options_int[]= {MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_LOCAL_INFILE,
857                       MYSQL_OPT_PROTOCOL, MYSQL_OPT_READ_TIMEOUT, MYSQL_OPT_WRITE_TIMEOUT, 0};
858   my_bool options_bool[]= {MYSQL_OPT_RECONNECT, MYSQL_REPORT_DATA_TRUNCATION,
859                            MYSQL_OPT_COMPRESS, MYSQL_OPT_SSL_VERIFY_SERVER_CERT, MYSQL_SECURE_AUTH,
860 #ifdef _WIN32
861     MYSQL_OPT_NAMED_PIPE,
862 #endif
863                           0};
864   int options_char[]= {MYSQL_READ_DEFAULT_FILE, MYSQL_READ_DEFAULT_GROUP, MYSQL_SET_CHARSET_NAME,
865                        MYSQL_OPT_SSL_KEY, MYSQL_OPT_SSL_CA, MYSQL_OPT_SSL_CERT, MYSQL_OPT_SSL_CAPATH,
866                        MYSQL_OPT_SSL_CIPHER, MYSQL_OPT_BIND, MARIADB_OPT_SSL_FP, MARIADB_OPT_SSL_FP_LIST,
867                        MARIADB_OPT_TLS_PASSPHRASE, 0};
868 
869   const char *init_command[3]= {"SET @a:=1", "SET @b:=2", "SET @c:=3"};
870   int elements= 0;
871   char **command;
872 
873 
874   int intval[2]= {1, 0};
875   my_bool boolval[2]= {1, 0};
876   const char *char1= "test";
877   char *char2;
878   int i;
879   MYSQL *userdata;
880   const char *attr_key[] = {"foo1", "foo2", "foo3"};
881   const char *attr_val[] = {"bar1", "bar2", "bar3"};
882   char **key, **val;
883 
884   for (i=0; i < (int)(sizeof(options_int)/sizeof(int)); i++)
885   {
886     mysql_options(mysql, options_int[i], &intval[0]);
887     intval[1]= 0;
888     mysql_get_optionv(mysql, options_int[i], &intval[1]);
889     FAIL_IF(intval[0] != intval[1], "mysql_get_optionv (int) failed");
890   }
891   for (i=0; options_bool[i]; i++)
892   {
893     mysql_options(mysql, options_bool[i], &boolval[0]);
894     intval[1]= 0;
895     mysql_get_optionv(mysql, options_bool[i], &boolval[1]);
896     FAIL_IF(boolval[0] != boolval[1], "mysql_get_optionv (my_bool) failed");
897   }
898   for (i=0; options_char[i]; i++)
899   {
900     mysql_options(mysql, options_char[i], char1);
901     char2= NULL;
902     mysql_get_optionv(mysql, options_char[i], (void *)&char2);
903     if (options_char[i] != MYSQL_SET_CHARSET_NAME)
904       FAIL_IF(strcmp(char1, char2), "mysql_get_optionv (char) failed");
905   }
906 
907   for (i=0; i < 3; i++)
908     mysql_options(mysql, MYSQL_INIT_COMMAND, init_command[i]);
909 
910   mysql_get_optionv(mysql, MYSQL_INIT_COMMAND, &command, &elements);
911   FAIL_IF(elements != 3, "expected 3 elements");
912   for (i=0; i < 3; i++)
913     FAIL_IF(strcmp(init_command[i], command[i]), "wrong init command");
914   for (i=0; i < 3; i++)
915     mysql_optionsv(mysql, MYSQL_OPT_CONNECT_ATTR_ADD, attr_key[i], attr_val[i]);
916 
917   mysql_get_optionv(mysql, MYSQL_OPT_CONNECT_ATTRS, NULL, NULL, &elements);
918   FAIL_IF(elements != 3, "expected 3 connection attributes");
919 
920   key= (char **)malloc(sizeof(char *) * elements);
921   val= (char **)malloc(sizeof(char *) * elements);
922 
923   mysql_get_optionv(mysql, MYSQL_OPT_CONNECT_ATTRS, &key, &val, &elements);
924   for (i=0; i < elements; i++)
925   {
926     diag("%s => %s", key[i], val[i]);
927   }
928 
929   free(key);
930   free(val);
931 
932   mysql_optionsv(mysql, MARIADB_OPT_USERDATA, "my_app", (void *)mysql);
933   mysql_get_optionv(mysql, MARIADB_OPT_USERDATA, (char *)"my_app", &userdata);
934 
935   FAIL_IF(mysql != userdata, "wrong userdata");
936   mysql_close(mysql);
937   return OK;
938 }
939 
test_sess_track_db(MYSQL * mysql)940 static int test_sess_track_db(MYSQL *mysql)
941 {
942   int rc;
943   const char *data;
944   size_t len;
945   char tmp_str[512];
946 
947 
948   if (!(mysql->server_capabilities & CLIENT_SESSION_TRACKING))
949   {
950     diag("Server doesn't support session tracking (cap=%lu)", mysql->server_capabilities);
951     return SKIP;
952   }
953 
954   rc= mysql_query(mysql, "USE mysql");
955   check_mysql_rc(rc, mysql);
956   FAIL_IF(strcmp(mysql->db, "mysql"), "Expected new schema 'mysql'");
957 
958   FAIL_IF(mysql_session_track_get_first(mysql, SESSION_TRACK_SCHEMA, &data, &len),
959           "session_track_get_first failed");
960   FAIL_IF(strncmp(data, "mysql", len), "Expected new schema 'mysql'");
961 
962   sprintf(tmp_str, "USE %s", schema);
963   rc= mysql_query(mysql, tmp_str);
964   check_mysql_rc(rc, mysql);
965 
966   sprintf(tmp_str, "Expected new schema '%s'.", schema);
967 
968   FAIL_IF(strcmp(mysql->db, schema), tmp_str);
969 
970   FAIL_IF(mysql_session_track_get_first(mysql, SESSION_TRACK_SCHEMA, &data, &len),
971           "session_track_get_first failed");
972   FAIL_IF(strncmp(data, schema, len), tmp_str);
973 
974   if (mysql_get_server_version(mysql) >= 100300)
975   {
976     diag("charset: %s", mysql->charset->csname);
977     rc= mysql_query(mysql, "SET NAMES utf8");
978     check_mysql_rc(rc, mysql);
979     if (!mysql_session_track_get_first(mysql, SESSION_TRACK_SYSTEM_VARIABLES, &data, &len))
980     do {
981       printf("# SESSION_TRACK_VARIABLES: %*.*s\n", (int)len, (int)len, data);
982     } while (!mysql_session_track_get_next(mysql, SESSION_TRACK_SYSTEM_VARIABLES, &data, &len));
983 
984     diag("charset: %s", mysql->charset->csname);
985     if (mariadb_connection(mysql) && mysql_get_server_version(mysql) >= 100600) {
986       diag("skipping since utf8mb3 isn't handled in 3.1");
987       return SKIP;
988     }
989 
990     FAIL_IF(strcmp(mysql->charset->csname, "utf8"), "Expected charset 'utf8'");
991     rc= mysql_query(mysql, "SET NAMES latin1");
992     check_mysql_rc(rc, mysql);
993     FAIL_IF(strcmp(mysql->charset->csname, "latin1"), "Expected charset 'latin1'");
994   }
995   rc= mysql_query(mysql, "CREATE PROCEDURE p1() "
996                          "BEGIN "
997                          "SET @@autocommit=0; "
998                          "SET NAMES utf8; "
999                          "SET session auto_increment_increment=2; "
1000                          "END ");
1001   check_mysql_rc(rc, mysql);
1002 
1003   rc= mysql_query(mysql, "CALL p1()");
1004   check_mysql_rc(rc, mysql);
1005 
1006   if (!mysql_session_track_get_first(mysql, SESSION_TRACK_SYSTEM_VARIABLES, &data, &len))
1007   do {
1008     printf("# SESSION_TRACK_VARIABLES: %*.*s\n", (int)len, (int)len, data);
1009   } while (!mysql_session_track_get_next(mysql, SESSION_TRACK_SYSTEM_VARIABLES, &data, &len));
1010 
1011   rc= mysql_query(mysql, "DROP PROCEDURE IF EXISTS p1");
1012   check_mysql_rc(rc, mysql);
1013 
1014   return OK;
1015 }
1016 
test_conc496(MYSQL * mysql)1017 static int test_conc496(MYSQL *mysql)
1018 {
1019   int rc;
1020   const char *data;
1021   size_t len;
1022 
1023   rc= mysql_query(mysql, "set @@session.session_track_transaction_info=STATE");
1024 
1025   if (rc && mysql_errno(mysql) == ER_UNKNOWN_SYSTEM_VARIABLE)
1026   {
1027     diag("session_track_transaction_info not supported");
1028     return SKIP;
1029   }
1030 
1031   check_mysql_rc(rc, mysql);
1032 
1033   rc= mysql_query(mysql, "BEGIN");
1034   check_mysql_rc(rc, mysql);
1035   if (!mysql_session_track_get_first(mysql, SESSION_TRACK_TRANSACTION_STATE, &data, &len))
1036   do {
1037     FAIL_IF(len != 8, "expected 8 bytes");
1038     FAIL_IF(data[0] != 'T', "expected transaction");
1039   } while (!mysql_session_track_get_next(mysql, SESSION_TRACK_TRANSACTION_STATE, &data, &len));
1040 
1041   rc= mysql_query(mysql, "CREATE TEMPORARY TABLE t1(a int) ENGINE=InnoDB");
1042   check_mysql_rc(rc, mysql);
1043   rc= mysql_query(mysql, "COMMIT");
1044 
1045   check_mysql_rc(rc, mysql);
1046 
1047   if (!mysql_session_track_get_first(mysql, SESSION_TRACK_TRANSACTION_STATE, &data, &len))
1048   do {
1049     FAIL_IF(len != 8, "expected 8 bytes");
1050     FAIL_IF(data[0] != '_', "expected underscore");
1051   } while (!mysql_session_track_get_next(mysql, SESSION_TRACK_TRANSACTION_STATE, &data, &len));
1052 
1053   return OK;
1054 }
1055 
1056 
test_unix_socket_close(MYSQL * unused)1057 static int test_unix_socket_close(MYSQL *unused __attribute__((unused)))
1058 {
1059 #ifdef _WIN32
1060   diag("test does not run on Windows");
1061   return SKIP;
1062 #else
1063   MYSQL *mysql= mysql_init(NULL);
1064   FILE *fp;
1065   int i;
1066 
1067   SKIP_SKYSQL;
1068   SKIP_TRAVIS();
1069 
1070   if (!(fp= fopen("./dummy_sock", "w")))
1071   {
1072     diag("couldn't create dummy socket");
1073     return FAIL;
1074   }
1075   fclose(fp);
1076 
1077   for (i=0; i < 10000; i++)
1078   {
1079     my_test_connect(mysql, "localhost", "user", "passwd", NULL, 0, "./dummy_sock", 0);
1080     /* check if we run out of sockets */
1081     if (mysql_errno(mysql) == 2001)
1082     {
1083       diag("out of sockets after %d attempts", i);
1084       mysql_close(mysql);
1085       return FAIL;
1086     }
1087   }
1088   mysql_close(mysql);
1089   return OK;
1090 #endif
1091 }
1092 
1093 
test_reset(MYSQL * mysql)1094 static int test_reset(MYSQL *mysql)
1095 {
1096   int rc;
1097   MYSQL_RES *res;
1098 
1099   if (mysql_get_server_version(mysql) < 100200)
1100     return SKIP;
1101 
1102   rc= mysql_query(mysql, "DROP TABLE IF EXISTS t1");
1103   check_mysql_rc(rc, mysql);
1104 
1105   rc= mysql_query(mysql, "CREATE TABLE t1 (a int)");
1106   check_mysql_rc(rc, mysql);
1107 
1108   rc= mysql_query(mysql, "INSERT INTO t1 VALUES (1),(2),(3)");
1109   check_mysql_rc(rc, mysql);
1110 
1111   FAIL_IF(mysql_affected_rows(mysql) != 3, "Expected 3 rows");
1112 
1113   rc= mysql_reset_connection(mysql);
1114   check_mysql_rc(rc, mysql);
1115 
1116   FAIL_IF(mysql_affected_rows(mysql) != ~(my_ulonglong)0, "Expected 0 rows");
1117 
1118   rc= mysql_query(mysql, "SELECT a FROM t1");
1119   check_mysql_rc(rc, mysql);
1120 
1121   rc= mysql_query(mysql, "SELECT 1 FROM DUAL");
1122   FAIL_IF(!rc, "Error expected");
1123 
1124   rc= mysql_reset_connection(mysql);
1125   check_mysql_rc(rc, mysql);
1126 
1127   res= mysql_store_result(mysql);
1128   FAIL_IF(res, "expected no result");
1129 
1130   rc= mysql_query(mysql, "SELECT a FROM t1");
1131   check_mysql_rc(rc, mysql);
1132 
1133   res= mysql_use_result(mysql);
1134   FAIL_IF(!res, "expected result");
1135 
1136   rc= mysql_reset_connection(mysql);
1137   check_mysql_rc(rc, mysql);
1138 
1139   FAIL_IF(mysql_fetch_row(res), "expected error");
1140 
1141   mysql_free_result(res);
1142 
1143   rc= mysql_query(mysql, "DROP TABLE t1");
1144   check_mysql_rc(rc, mysql);
1145 
1146   return OK;
1147 }
1148 
test_auth256(MYSQL * my)1149 static int test_auth256(MYSQL *my)
1150 {
1151   MYSQL *mysql= mysql_init(NULL);
1152   int rc;
1153   MYSQL_RES *res;
1154   my_ulonglong num_rows= 0;
1155   char query[1024];
1156   SKIP_MAXSCALE;
1157 
1158   if (IS_SKYSQL(hostname))
1159     return SKIP;
1160 
1161   if (!mysql_client_find_plugin(mysql, "sha256_password", MYSQL_CLIENT_AUTHENTICATION_PLUGIN))
1162   {
1163     diag("sha256_password plugin not available");
1164     mysql_close(mysql);
1165     return SKIP;
1166   }
1167 
1168   rc= mysql_query(my, "SELECT * FROM information_schema.plugins where plugin_name='sha256_password'");
1169   check_mysql_rc(rc, mysql);
1170 
1171   res= mysql_store_result(my);
1172   num_rows= mysql_num_rows(res);
1173   mysql_free_result(res);
1174 
1175   if (!num_rows)
1176   {
1177     diag("server doesn't support sha256 authentication");
1178     mysql_close(mysql);
1179     return SKIP;
1180   }
1181 
1182   rc= mysql_query(my, "DROP USER IF EXISTS sha256user@localhost");
1183   check_mysql_rc(rc, mysql);
1184 
1185   sprintf(query, "CREATE user 'sha256user'@'%s' identified with sha256_password by 'foo'", this_host);
1186   rc= mysql_query(my, query);
1187   check_mysql_rc(rc, my);
1188 
1189   if (!my_test_connect(mysql, hostname, "sha256user", "foo", NULL, port, socketname, 0))
1190   {
1191     diag("error: %s", mysql_error(mysql));
1192     mysql_close(mysql);
1193     return FAIL;
1194   }
1195   mysql_close(mysql);
1196 
1197   mysql= mysql_init(NULL);
1198   mysql_options(mysql, MYSQL_SERVER_PUBLIC_KEY, "rsa_public_key.pem");
1199   if (!my_test_connect(mysql, hostname, "sha256user", "foo", NULL, port, socketname, 0))
1200   {
1201     diag("error: %s", mysql_error(mysql));
1202     mysql_close(mysql);
1203     return FAIL;
1204   }
1205   mysql_close(mysql);
1206   sprintf(query, "DROP USER 'sha256user'@'%s'", this_host);
1207   rc= mysql_query(my, query);
1208   check_mysql_rc(rc, mysql);
1209   return OK;
1210 }
1211 
test_mdev13100(MYSQL * my)1212 static int test_mdev13100(MYSQL *my __attribute__((unused)))
1213 {
1214   MYSQL *mysql= mysql_init(NULL);
1215   int rc;
1216   FILE *fp;
1217 
1218   if (!(fp= fopen("./mdev13100.cnf", "w")))
1219     return FAIL;
1220 
1221    /* [client] group only */
1222   fprintf(fp, "[client]\n");
1223   fprintf(fp, "default-character-set=latin2\n");
1224 
1225   fclose(fp);
1226 
1227   rc= mysql_options(mysql, MYSQL_READ_DEFAULT_FILE, "./mdev13100.cnf");
1228   check_mysql_rc(rc, mysql);
1229 
1230   if (!my_test_connect(mysql, hostname, username,
1231                              password, schema, port, socketname, 0))
1232   {
1233     diag("Error: %s", mysql_error(mysql));
1234     return FAIL;
1235   }
1236   FAIL_IF(strcmp("latin2", mysql_character_set_name(mysql)), "Expected charset latin2");
1237   mysql_close(mysql);
1238 
1239   /* value from client-mariadb group */
1240   mysql= mysql_init(NULL);
1241   if (!(fp= fopen("./mdev13100.cnf", "w")))
1242     return FAIL;
1243 
1244   fprintf(fp, "[client]\n");
1245   fprintf(fp, "default-character-set=latin1\n");
1246   fprintf(fp, "[client-server]\n");
1247   fprintf(fp, "default-character-set=latin2\n");
1248 
1249   fclose(fp);
1250 
1251   rc= mysql_options(mysql, MYSQL_READ_DEFAULT_FILE, "./mdev13100.cnf");
1252   check_mysql_rc(rc, mysql);
1253 
1254   if (!my_test_connect(mysql, hostname, username,
1255                              password, schema, port, socketname, 0))
1256   {
1257     diag("Error: %s", mysql_error(mysql));
1258     return FAIL;
1259   }
1260   FAIL_IF(strcmp("latin2", mysql_character_set_name(mysql)), "Expected charset latin2");
1261   mysql_close(mysql);
1262 
1263 /* values from client-mariadb group */
1264   mysql= mysql_init(NULL);
1265 
1266 if (!(fp= fopen("./mdev13100.cnf", "w")))
1267     return FAIL;
1268 
1269   fprintf(fp, "[client]\n");
1270   fprintf(fp, "default-character-set=latin1\n");
1271   fprintf(fp, "[client-server]\n");
1272   fprintf(fp, "default-character-set=utf8\n");
1273   fprintf(fp, "[client-mariadb]\n");
1274   fprintf(fp, "default-character-set=latin2\n");
1275 
1276   fclose(fp);
1277 
1278   rc= mysql_options(mysql, MYSQL_READ_DEFAULT_FILE, "./mdev13100.cnf");
1279   check_mysql_rc(rc, mysql);
1280 
1281   if (!my_test_connect(mysql, hostname, username,
1282                              password, schema, port, socketname, 0))
1283   {
1284     diag("Error: %s", mysql_error(mysql));
1285     return FAIL;
1286   }
1287   FAIL_IF(strcmp("latin2", mysql_character_set_name(mysql)), "Expected charset latin2");
1288   mysql_close(mysql);
1289 
1290 /* values from mdev-13100 group */
1291   mysql= mysql_init(NULL);
1292   if (!(fp= fopen("./mdev13100.cnf", "w")))
1293     return FAIL;
1294 
1295   fprintf(fp, "[client]\n");
1296   fprintf(fp, "default-character-set=latin1\n");
1297   fprintf(fp, "[client-server]\n");
1298   fprintf(fp, "default-character-set=latin1\n");
1299   fprintf(fp, "[client-mariadb]\n");
1300   fprintf(fp, "default-character-set=utf8\n");
1301   fprintf(fp, "[mdev13100]\n");
1302   fprintf(fp, "default-character-set=latin2\n");
1303 
1304   fclose(fp);
1305 
1306   rc= mysql_options(mysql, MYSQL_READ_DEFAULT_FILE, "./mdev13100.cnf");
1307   check_mysql_rc(rc, mysql);
1308   rc= mysql_options(mysql, MYSQL_READ_DEFAULT_GROUP, "mdev13100");
1309   check_mysql_rc(rc, mysql);
1310 
1311   if (!my_test_connect(mysql, hostname, username,
1312                              password, schema, port, socketname, 0))
1313   {
1314     diag("Error: %s", mysql_error(mysql));
1315     return FAIL;
1316   }
1317   FAIL_IF(strcmp("latin2", mysql_character_set_name(mysql)), "Expected charset latin2");
1318   mysql_close(mysql);
1319 
1320 /* values from [programname] group */
1321   mysql= mysql_init(NULL);
1322   if (!(fp= fopen("./mdev13100.cnf", "w")))
1323     return FAIL;
1324 
1325   fprintf(fp, "[client]\n");
1326   fprintf(fp, "default-character-set=utf8\n");
1327   fprintf(fp, "[client-server]\n");
1328   fprintf(fp, "default-character-set=utf8\n");
1329   fprintf(fp, "[client-mariadb]\n");
1330   fprintf(fp, "default-character-set=latin2\n");
1331 
1332   fclose(fp);
1333 
1334   rc= mysql_options(mysql, MYSQL_READ_DEFAULT_FILE, "./mdev13100.cnf");
1335   check_mysql_rc(rc, mysql);
1336   rc= mysql_options(mysql, MYSQL_READ_DEFAULT_GROUP, "");
1337   check_mysql_rc(rc, mysql);
1338 
1339   if (!my_test_connect(mysql, hostname, username,
1340                              password, schema, port, socketname, 0))
1341   {
1342     diag("Error: %s", mysql_error(mysql));
1343     return FAIL;
1344   }
1345   diag("character set: %s", mysql_character_set_name(mysql));
1346   FAIL_IF(strcmp("latin2", mysql_character_set_name(mysql)), "Expected charset latin2");
1347   mysql_close(mysql);
1348 
1349   remove("./mdev13100.cnf");
1350 
1351   return OK;
1352 }
1353 
test_conc276(MYSQL * unused)1354 static int test_conc276(MYSQL *unused __attribute__((unused)))
1355 {
1356   MYSQL *mysql= mysql_init(NULL);
1357   int rc;
1358   my_bool val= 1;
1359 
1360   mysql_options(mysql, MYSQL_OPT_SSL_ENFORCE, &val);
1361   mysql_options(mysql, MYSQL_OPT_RECONNECT, &val);
1362 
1363   if (!my_test_connect(mysql, hostname, username, password, schema, port, socketname, 0))
1364   {
1365     diag("Connection failed. Error: %s", mysql_error(mysql));
1366     mysql_close(mysql);
1367     return FAIL;
1368   }
1369   diag("Cipher in use: %s", mysql_get_ssl_cipher(mysql));
1370 
1371   rc= mariadb_reconnect(mysql);
1372   check_mysql_rc(rc, mysql);
1373 
1374   diag("Cipher in use: %s", mysql_get_ssl_cipher(mysql));
1375   /* this shouldn't crash anymore */
1376   rc= mysql_query(mysql, "SET @a:=1");
1377   check_mysql_rc(rc, mysql);
1378 
1379   mysql_close(mysql);
1380   return OK;
1381 }
1382 
test_expired_pw(MYSQL * my)1383 static int test_expired_pw(MYSQL *my)
1384 {
1385   MYSQL *mysql;
1386   int rc;
1387   char query[512];
1388   unsigned char expire= 1;
1389 
1390   if (mariadb_connection(my) ||
1391      !(my->server_capabilities & CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS))
1392   {
1393     diag("Server doesn't support password expiration");
1394     return SKIP;
1395   }
1396   sprintf(query, "DROP USER 'foo'@'%s'", this_host);
1397   rc= mysql_query(my, query);
1398 
1399   sprintf(query, "CREATE USER 'foo'@'%s' IDENTIFIED BY 'foo'", this_host);
1400   rc= mysql_query(my, query);
1401   check_mysql_rc(rc, my);
1402 
1403   sprintf(query, "GRANT ALL ON *.* TO 'foo'@'%s'", this_host);
1404   rc= mysql_query(my, query);
1405   check_mysql_rc(rc, my);
1406 
1407   sprintf(query, "ALTER USER 'foo'@'%s' PASSWORD EXPIRE", this_host);
1408   rc= mysql_query(my, query);
1409   check_mysql_rc(rc, my);
1410 
1411   mysql= mysql_init(NULL);
1412 
1413   my_test_connect(mysql, hostname, "foo", "foo", schema,
1414                   port, socketname, 0);
1415 
1416   FAIL_IF(!mysql_errno(mysql), "Error expected");
1417   mysql_close(mysql);
1418 
1419   mysql= mysql_init(NULL);
1420   mysql_optionsv(mysql, MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS, &expire);
1421 
1422   my_test_connect(mysql, hostname, "foo", "foo", schema,
1423                   port, socketname, 0);
1424 
1425   /* we should be in sandbox mode now, only set commands should be allowed */
1426   rc= mysql_query(mysql, "DROP TABLE IF EXISTS t1");
1427   FAIL_IF(!rc, "Error expected (we are in sandbox mode");
1428 
1429   diag("error: %d %s", mysql_errno(mysql), mysql_error(mysql));
1430   FAIL_IF(mysql_errno(mysql) != ER_MUST_CHANGE_PASSWORD &&
1431           mysql_errno(mysql) != ER_MUST_CHANGE_PASSWORD_LOGIN, "Error 1820/1862 expected");
1432 
1433   mysql_close(mysql);
1434 
1435   sprintf(query, "DROP USER 'foo'@'%s'", this_host);
1436   rc= mysql_query(my, query);
1437   check_mysql_rc(rc, my);
1438 
1439   return OK;
1440 }
1441 
test_conc315(MYSQL * mysql)1442 static int test_conc315(MYSQL *mysql)
1443 {
1444   int rc;
1445   const char *csname;
1446   SKIP_SKYSQL;
1447   SKIP_MAXSCALE;
1448 
1449   if (!is_mariadb)
1450     return SKIP;
1451 
1452   mysql_get_optionv(mysql, MYSQL_SET_CHARSET_NAME, (void *)&csname);
1453   diag("csname=%s", csname);
1454   FAIL_UNLESS(strcmp(csname, MARIADB_DEFAULT_CHARSET) == 0, "Wrong default character set");
1455 
1456   rc= mysql_change_user(mysql, username, password, schema);
1457   check_mysql_rc(rc, mysql);
1458   mysql_get_optionv(mysql, MYSQL_SET_CHARSET_NAME, (void *)&csname);
1459   FAIL_UNLESS(strcmp(csname, MARIADB_DEFAULT_CHARSET) == 0, "Wrong default character set");
1460   return OK;
1461 }
1462 #ifndef WIN32
test_conc317(MYSQL * unused)1463 static int test_conc317(MYSQL *unused __attribute__((unused)))
1464 {
1465   MYSQL *mysql;
1466   my_bool reconnect = 0;
1467   FILE *fp= NULL;
1468   const char *env= getenv("MYSQL_TMP_DIR");
1469   char cnf_file1[FN_REFLEN + 1];
1470 
1471   SKIP_SKYSQL;
1472 
1473   if (travis_test)
1474     return SKIP;
1475 
1476   if (!env)
1477     env= "/tmp";
1478 
1479   setenv("HOME", env, 1);
1480 
1481   snprintf(cnf_file1, FN_REFLEN, "%s%c.my.cnf", env, FN_LIBCHAR);
1482 
1483   FAIL_IF(!access(cnf_file1, R_OK), "access");
1484 
1485   mysql= mysql_init(NULL);
1486   fp= fopen(cnf_file1, "w");
1487   FAIL_IF(!fp, "fopen");
1488 
1489   fprintf(fp, "[client]\ndefault-character-set = latin2\nreconnect= 1\n");
1490   fclose(fp);
1491 
1492   mysql_options(mysql, MYSQL_READ_DEFAULT_GROUP, "");
1493   my_test_connect(mysql, hostname, username, password,
1494                   schema, 0, socketname, 0);
1495 
1496   remove(cnf_file1);
1497 
1498   FAIL_IF(strcmp(mysql_character_set_name(mysql), "latin2"), "expected charset latin2");
1499   mysql_get_optionv(mysql, MYSQL_OPT_RECONNECT, &reconnect);
1500   FAIL_IF(reconnect != 1, "expected reconnect=1");
1501   mysql_close(mysql);
1502   return OK;
1503 }
1504 
test_conc327(MYSQL * unused)1505 static int test_conc327(MYSQL *unused __attribute__((unused)))
1506 {
1507   MYSQL *mysql;
1508   my_bool reconnect = 0;
1509   FILE *fp1= NULL, *fp2= NULL;
1510   const char *env= getenv("MYSQL_TMP_DIR");
1511   char cnf_file1[FN_REFLEN + 1];
1512   char cnf_file2[FN_REFLEN + 1];
1513 
1514   SKIP_SKYSQL;
1515 
1516   if (travis_test)
1517     return SKIP;
1518 
1519   if (!env)
1520     env= "/tmp";
1521 
1522   setenv("HOME", env, 1);
1523 
1524   snprintf(cnf_file1, FN_REFLEN, "%s%c.my.cnf", env, FN_LIBCHAR);
1525   snprintf(cnf_file2, FN_REFLEN, "%s%c.my.tmp", env, FN_LIBCHAR);
1526 
1527   FAIL_IF(!access(cnf_file1, R_OK), "access");
1528 
1529   fp1= fopen(cnf_file1, "w");
1530   fp2= fopen(cnf_file2, "w");
1531   FAIL_IF(!fp1 || !fp2, "fopen failed");
1532 
1533   fprintf(fp1, "!include %s\n", cnf_file2);
1534 
1535   fprintf(fp2, "[client]\ndefault-character-set = latin2\nreconnect= 1\n");
1536   fclose(fp1);
1537   fclose(fp2);
1538 
1539   mysql= mysql_init(NULL);
1540   mysql_options(mysql, MYSQL_READ_DEFAULT_GROUP, "");
1541   my_test_connect(mysql, hostname, username, password,
1542                   schema, 0, socketname, 0);
1543 
1544   remove(cnf_file1);
1545   remove(cnf_file2);
1546 
1547   FAIL_IF(strcmp(mysql_character_set_name(mysql), "latin2"), "expected charset latin2");
1548   mysql_get_optionv(mysql, MYSQL_OPT_RECONNECT, &reconnect);
1549   FAIL_IF(reconnect != 1, "expected reconnect=1");
1550   mysql_close(mysql);
1551 
1552   snprintf(cnf_file1, FN_REFLEN, "%s%cmy.cnf", env, FN_LIBCHAR);
1553   fp1= fopen(cnf_file1, "w");
1554   fp2= fopen(cnf_file2, "w");
1555   FAIL_IF(!fp1 || !fp2, "fopen failed");
1556 
1557   fprintf(fp2, "!includedir %s\n", env);
1558 
1559   fprintf(fp1, "[client]\ndefault-character-set = latin2\nreconnect= 1\n");
1560   fclose(fp1);
1561   fclose(fp2);
1562   mysql= mysql_init(NULL);
1563   mysql_options(mysql, MYSQL_READ_DEFAULT_FILE, cnf_file2);
1564   my_test_connect(mysql, hostname, username, password,
1565                   schema, 0, socketname, 0);
1566 
1567   remove(cnf_file1);
1568   remove(cnf_file2);
1569 
1570   FAIL_IF(strcmp(mysql_character_set_name(mysql), "latin2"), "expected charset latin2");
1571   mysql_get_optionv(mysql, MYSQL_OPT_RECONNECT, &reconnect);
1572   FAIL_IF(reconnect != 1, "expected reconnect=1");
1573   mysql_close(mysql);
1574 
1575   return OK;
1576 }
1577 #endif
1578 
test_conc332(MYSQL * unused)1579 static int test_conc332(MYSQL *unused __attribute__((unused)))
1580 {
1581   int rc;
1582   MYSQL *mysql= mysql_init(NULL);
1583   int server_status1, server_status2;
1584 
1585   SKIP_SKYSQL;
1586   SKIP_MAXSCALE;
1587 
1588   mysql_options(mysql, MYSQL_SET_CHARSET_NAME, "utf8mb4");
1589 
1590   my_test_connect(mysql, hostname, username, password, schema,
1591                   port, socketname, 0);
1592 
1593   FAIL_IF(mysql_errno(mysql), "Error during connect");
1594 
1595   mariadb_get_infov(mysql, MARIADB_CONNECTION_SERVER_STATUS, &server_status1);
1596   diag("server_status: %d", server_status1);
1597 
1598   if (server_status1 & SERVER_STATUS_AUTOCOMMIT)
1599     rc= mysql_query(mysql, "SET autocommit= 0");
1600   else
1601     rc= mysql_query(mysql, "SET autocommit= 1");
1602   check_mysql_rc(rc, mysql);
1603   mariadb_get_infov(mysql, MARIADB_CONNECTION_SERVER_STATUS, &server_status2);
1604   diag("server_status after changing autocommit: %d", server_status2);
1605 
1606   rc= mysql_change_user(mysql, username, password, schema);
1607   check_mysql_rc(rc, mysql);
1608 
1609   mariadb_get_infov(mysql, MARIADB_CONNECTION_SERVER_STATUS, &server_status2);
1610   diag("server_status after mysql_change_user: %d", server_status2);
1611   if (server_status1 != server_status2)
1612   {
1613     diag("Expected server_status %d instead of %d", server_status1, server_status2);
1614     mysql_close(mysql);
1615     return FAIL;
1616   }
1617   mysql_close(mysql);
1618   return OK;
1619 }
1620 
test_conc351(MYSQL * unused)1621 static int test_conc351(MYSQL *unused __attribute__((unused)))
1622 {
1623   int rc;
1624   const char *data;
1625   size_t len;
1626   MYSQL *mysql= mysql_init(NULL);
1627   ulong capabilities= 0;
1628 
1629   my_test_connect(mysql, hostname, username, password, schema,
1630                   port, socketname, 0);
1631 
1632   FAIL_IF(mysql_errno(mysql), "Error during connect");
1633 
1634   mariadb_get_infov(mysql, MARIADB_CONNECTION_SERVER_CAPABILITIES, &capabilities);
1635   if (!(capabilities & CLIENT_SESSION_TRACKING))
1636   {
1637     mysql_close(mysql);
1638     diag("Server doesn't support session tracking (cap=%lu)", mysql->server_capabilities);
1639     return SKIP;
1640   }
1641   rc= mysql_query(mysql, "USE mysql");
1642   check_mysql_rc(rc, mysql);
1643   FAIL_IF(strcmp(mysql->db, "mysql"), "Expected new schema 'mysql'");
1644 
1645   FAIL_IF(mysql_session_track_get_first(mysql, SESSION_TRACK_SCHEMA, &data, &len), "expected session track schema");
1646 
1647   rc= mysql_query(mysql, "SET @a:=1");
1648   check_mysql_rc(rc, mysql);
1649 
1650   FAIL_IF(!mysql_session_track_get_first(mysql, SESSION_TRACK_SCHEMA, &data, &len), "expected no schema tracking information");
1651 
1652   mysql_close(mysql);
1653   return OK;
1654 }
1655 
test_conc312(MYSQL * my)1656 static int test_conc312(MYSQL *my)
1657 {
1658   int rc;
1659   char query[1024];
1660   MYSQL *mysql;
1661 
1662   sprintf(query, "DROP USER 'foo'@'%s'", this_host);
1663   rc= mysql_query(my, query);
1664 
1665   sprintf(query, "CREATE USER 'foo'@'%s' IDENTIFIED WITH caching_sha2_password BY 'foo'", this_host);
1666   rc= mysql_query(my, query);
1667 
1668   if (rc)
1669   {
1670     diag("caching_sha256_password not supported");
1671     return SKIP;
1672   }
1673 
1674   sprintf(query, "GRANT ALL ON %s.* TO 'foo'@'%s'", schema, this_host);
1675   rc= mysql_query(my, query);
1676   check_mysql_rc(rc, my);
1677 
1678   mysql= mysql_init(NULL);
1679   if (!my_test_connect(mysql, hostname, "foo", "foo", schema, port, socketname, 0))
1680   {
1681     diag("Error: %s", mysql_error(mysql));
1682     return FAIL;
1683   }
1684 
1685   mysql_close(mysql);
1686 
1687   sprintf(query, "DROP USER 'foo'@'%s'", this_host);
1688   rc= mysql_query(my, query);
1689   check_mysql_rc(rc, mysql);
1690 
1691   return OK;
1692 }
1693 
test_conc366(MYSQL * mysql)1694 static int test_conc366(MYSQL *mysql)
1695 {
1696   char query[1024];
1697   int rc;
1698   MYSQL *my;
1699 
1700   SKIP_SKYSQL;
1701   SKIP_MAXSCALE;
1702 
1703   if (!is_mariadb)
1704   {
1705     diag("feature not supported by MySQL server");
1706     return SKIP;
1707   }
1708 
1709   /* check if ed25519 plugin is available */
1710   if (!mysql_client_find_plugin(mysql, "client_ed25519", MYSQL_CLIENT_AUTHENTICATION_PLUGIN))
1711   {
1712     diag("client_ed25519 plugin not available");
1713     return SKIP;
1714   }
1715 
1716   rc= mysql_query(mysql, "INSTALL SONAME 'auth_ed25519'");
1717   if (rc)
1718   {
1719     diag("feature not supported, ed25519 plugin not available");
1720     return SKIP;
1721   }
1722 
1723   if (mysql_get_server_version(mysql) < 100400) {
1724     sprintf(query, "CREATE OR REPLACE USER 'ede'@'%s' IDENTIFIED VIA ed25519 USING '6aW9C7ENlasUfymtfMvMZZtnkCVlcb1ssxOLJ0kj/AA'", this_host);
1725   } else {
1726     sprintf(query, "CREATE OR REPLACE USER 'ede'@'%s' IDENTIFIED VIA ed25519 USING PASSWORD('MySup8%%rPassw@ord')", this_host);
1727   }
1728   rc= mysql_query(mysql, query);
1729   check_mysql_rc(rc, mysql);
1730 
1731   sprintf(query, "GRANT ALL ON %s.* TO 'ede'@'%s'", schema, this_host);
1732   rc= mysql_query(mysql, query);
1733   check_mysql_rc(rc, mysql);
1734 
1735   my= mysql_init(NULL);
1736   if (plugindir)
1737     mysql_options(my, MYSQL_PLUGIN_DIR, plugindir);
1738   if (!my_test_connect(my, hostname, "ede", "MySup8%rPassw@ord", schema, port, socketname, 0))
1739   {
1740     diag("Error: %s", mysql_error(my));
1741     return FAIL;
1742   }
1743   mysql_close(my);
1744 
1745   sprintf(query, "DROP USER 'ede'@'%s'", this_host);
1746   rc= mysql_query(mysql, query);
1747   check_mysql_rc(rc, mysql);
1748 
1749   sprintf(query, "UNINSTALL SONAME 'auth_ed25519'");
1750   rc= mysql_query(mysql, query);
1751   check_mysql_rc(rc, mysql);
1752   return OK;
1753 }
1754 
test_conc392(MYSQL * mysql)1755 static int test_conc392(MYSQL *mysql)
1756 {
1757   int rc;
1758   const char *data;
1759   size_t len;
1760   ulong capabilities= 0;
1761 
1762   SKIP_MYSQL(mysql);
1763 
1764   mariadb_get_infov(mysql, MARIADB_CONNECTION_SERVER_CAPABILITIES, &capabilities);
1765   if (!(capabilities & CLIENT_SESSION_TRACKING))
1766   {
1767     diag("Server doesn't support session tracking (cap=%lu)", mysql->server_capabilities);
1768     return SKIP;
1769   }
1770 
1771   rc= mysql_query(mysql, "set session_track_state_change=1");
1772   check_mysql_rc(rc, mysql);
1773 
1774   if (mysql_session_track_get_first(mysql, SESSION_TRACK_STATE_CHANGE, &data, &len))
1775   {
1776     diag("session_track_get_first failed");
1777     return FAIL;
1778   }
1779 
1780   FAIL_IF(len != 1, "Expected length 1");
1781   return OK;
1782 }
1783 
test_conc443(MYSQL * my)1784 static int test_conc443(MYSQL *my __attribute__((unused)))
1785 {
1786   my_bool x= 1;
1787   unsigned long thread_id= 0;
1788   char query[128];
1789   MYSQL_RES *result;
1790   MYSQL_ROW row;
1791   int rc;
1792 
1793   MYSQL *mysql= mysql_init(NULL);
1794 
1795   SKIP_MAXSCALE;
1796 
1797   mysql_options(mysql, MYSQL_INIT_COMMAND, "set @a:=3");
1798   mysql_options(mysql, MYSQL_OPT_RECONNECT, &x);
1799 
1800   if (!my_test_connect(mysql, hostname, username, password, schema, port, socketname, CLIENT_REMEMBER_OPTIONS))
1801   {
1802     diag("Connection failed. Error: %s", mysql_error(mysql));
1803     mysql_close(mysql);
1804   }
1805 
1806   thread_id= mysql_thread_id(mysql);
1807 
1808   sprintf(query, "KILL %lu", thread_id);
1809   rc= mysql_query(mysql, query);
1810 
1811   sleep(3);
1812 
1813   rc= mysql_ping(mysql);
1814   check_mysql_rc(rc, mysql);
1815 
1816   rc= mysql_query(mysql, "SELECT @a");
1817   check_mysql_rc(rc, mysql);
1818 
1819   FAIL_IF(mysql_thread_id(mysql) == thread_id, "Expected different thread id");
1820 
1821   result= mysql_store_result(mysql);
1822   if (!result)
1823     return FAIL;
1824   row= mysql_fetch_row(result);
1825   FAIL_IF(strcmp(row[0],"3"), "Wrong result");
1826 
1827   mysql_free_result(result);
1828   mysql_close(mysql);
1829 
1830   return OK;
1831 }
1832 
test_default_auth(MYSQL * my)1833 static int test_default_auth(MYSQL *my __attribute__((unused)))
1834 {
1835   MYSQL *mysql;
1836 
1837   SKIP_SKYSQL;
1838   SKIP_MAXSCALE;
1839 
1840   if (!is_mariadb)
1841     return SKIP;
1842 
1843   mysql= mysql_init(NULL);
1844   mysql_options(mysql, MYSQL_DEFAULT_AUTH, "mysql_clear_password");
1845 
1846   if (!my_test_connect(mysql, hostname, username, password, schema, port, socketname, CLIENT_REMEMBER_OPTIONS))
1847   {
1848     diag("Connection failed. Error: %s", mysql_error(mysql));
1849     mysql_close(mysql);
1850     return FAIL;
1851   }
1852   mysql_close(mysql);
1853 
1854   mysql= mysql_init(NULL);
1855   mysql_options(mysql, MYSQL_DEFAULT_AUTH, "caching_sha2_password");
1856 
1857   if (!my_test_connect(mysql, hostname, username, password, schema, port, socketname, CLIENT_REMEMBER_OPTIONS))
1858   {
1859     diag("Connection failed. Error: %s", mysql_error(mysql));
1860     mysql_close(mysql);
1861     return FAIL;
1862 
1863   }
1864   mysql_close(mysql);
1865   return OK;
1866 }
1867 
test_gtid(MYSQL * mysql)1868 static int test_gtid(MYSQL *mysql)
1869 {
1870   int rc;
1871   const char *data;
1872   size_t len;
1873 
1874   if (is_mariadb)
1875     return SKIP;
1876 
1877   rc= mysql_query(mysql, "SET @@session.session_track_state_change=1");
1878   check_mysql_rc(rc, mysql);
1879 
1880   rc= mysql_query(mysql, "SET @@session.session_track_gtids=OWN_GTID");
1881   check_mysql_rc(rc, mysql);
1882 
1883   rc= mysql_query(mysql, "BEGIN");
1884   check_mysql_rc(rc, mysql);
1885 
1886   rc= mysql_query(mysql, "DROP TABLE IF EXISTS t1");
1887   check_mysql_rc(rc, mysql);
1888 
1889   if (!mysql_session_track_get_first(mysql, SESSION_TRACK_GTIDS, &data, &len))
1890   do {
1891     printf("# SESSION_TRACK_GTIDS: %*.*s\n", (int)len, (int)len, data);
1892   } while (!mysql_session_track_get_next(mysql, SESSION_TRACK_GTIDS, &data, &len));
1893 
1894   rc= mysql_query(mysql, "CREATE TABLE t1 (a int)");
1895   check_mysql_rc(rc, mysql);
1896 
1897   if (!mysql_session_track_get_first(mysql, SESSION_TRACK_GTIDS, &data, &len))
1898   do {
1899     printf("# SESSION_TRACK_GTIDS: %*.*s\n", (int)len, (int)len, data);
1900   } while (!mysql_session_track_get_next(mysql, SESSION_TRACK_GTIDS, &data, &len));
1901 
1902   rc= mysql_query(mysql, "COMMIT");
1903   check_mysql_rc(rc, mysql);
1904 
1905   return OK;
1906 }
1907 
test_conc490(MYSQL * my)1908 static int test_conc490(MYSQL *my __attribute__((unused)))
1909 {
1910   MYSQL *mysql= mysql_init(NULL);
1911 
1912   if (!my_test_connect(mysql, hostname, username,
1913                              password, NULL, port, socketname, CLIENT_CONNECT_WITH_DB))
1914   {
1915     diag("error: %s\n", mysql_error(mysql));
1916     return FAIL;
1917   }
1918   mysql_close(mysql);
1919   return OK;
1920 }
1921 
1922 struct my_tests_st my_tests[] = {
1923   {"test_conc490", test_conc490, TEST_CONNECTION_NONE, 0, NULL, NULL},
1924   {"test_gtid", test_gtid, TEST_CONNECTION_DEFAULT, 0, NULL, NULL},
1925   {"test_conc496", test_conc496, TEST_CONNECTION_DEFAULT, 0, NULL, NULL},
1926   {"test_default_auth", test_default_auth, TEST_CONNECTION_NONE, 0, NULL, NULL},
1927   {"test_conc443", test_conc443, TEST_CONNECTION_NONE, 0, NULL, NULL},
1928   {"test_conc366", test_conc366, TEST_CONNECTION_DEFAULT, 0, NULL, NULL},
1929   {"test_conc392", test_conc392, TEST_CONNECTION_DEFAULT, 0, NULL, NULL},
1930   {"test_conc312", test_conc312, TEST_CONNECTION_DEFAULT, 0, NULL, NULL},
1931   {"test_conc351", test_conc351, TEST_CONNECTION_NONE, 0, NULL, NULL},
1932   {"test_conc332", test_conc332, TEST_CONNECTION_NONE, 0, NULL, NULL},
1933 #ifndef WIN32
1934   {"test_conc327", test_conc327, TEST_CONNECTION_DEFAULT, 0, NULL, NULL},
1935   {"test_conc317", test_conc317, TEST_CONNECTION_DEFAULT, 0, NULL, NULL},
1936 #endif
1937   {"test_conc315", test_conc315, TEST_CONNECTION_NEW, 0, NULL,  NULL},
1938   {"test_expired_pw", test_expired_pw, TEST_CONNECTION_DEFAULT, 0, NULL,  NULL},
1939   {"test_conc276", test_conc276, TEST_CONNECTION_NONE, 0, NULL,  NULL},
1940   {"test_mdev13100", test_mdev13100, TEST_CONNECTION_DEFAULT, 0, NULL,  NULL},
1941   {"test_auth256", test_auth256, TEST_CONNECTION_DEFAULT, 0, NULL,  NULL},
1942   {"test_reset", test_reset, TEST_CONNECTION_DEFAULT, 0, NULL,  NULL},
1943   {"test_unix_socket_close", test_unix_socket_close, TEST_CONNECTION_NONE, 0, NULL,  NULL},
1944   {"test_sess_track_db", test_sess_track_db, TEST_CONNECTION_DEFAULT, 0, NULL,  NULL},
1945   {"test_get_options", test_get_options, TEST_CONNECTION_DEFAULT, 0, NULL,  NULL},
1946   {"test_wrong_bind_address", test_wrong_bind_address, TEST_CONNECTION_DEFAULT, 0, NULL,  NULL},
1947   {"test_bind_address", test_bind_address, TEST_CONNECTION_DEFAULT, 0, NULL,  NULL},
1948   {"test_conc118", test_conc118, TEST_CONNECTION_DEFAULT, 0, NULL,  NULL},
1949   {"test_conc66", test_conc66, TEST_CONNECTION_DEFAULT, 0, NULL,  NULL},
1950   {"test_bug20023", test_bug20023, TEST_CONNECTION_NEW, 0, NULL,  NULL},
1951   {"test_bug31669", test_bug31669, TEST_CONNECTION_NEW, 0, NULL,  NULL},
1952   {"test_bug33831", test_bug33831, TEST_CONNECTION_NEW, 0, NULL,  NULL},
1953   {"test_change_user", test_change_user, TEST_CONNECTION_NEW, 0, NULL,  NULL},
1954   {"test_opt_reconnect", test_opt_reconnect, TEST_CONNECTION_NONE, 0, NULL,  NULL},
1955   {"test_compress", test_compress, TEST_CONNECTION_NONE, 0, NULL,  NULL},
1956   {"test_reconnect", test_reconnect, TEST_CONNECTION_DEFAULT, 0, NULL, NULL},
1957   {"test_conc21", test_conc21, TEST_CONNECTION_DEFAULT, 0, NULL, NULL},
1958   {"test_conc26", test_conc26, TEST_CONNECTION_NONE, 0, NULL, NULL},
1959   {"test_connection_timeout", test_connection_timeout, TEST_CONNECTION_NONE, 0, NULL, NULL},
1960   {"test_connection_timeout2", test_connection_timeout2, TEST_CONNECTION_NONE, 0, NULL, NULL},
1961   {"test_connection_timeout3", test_connection_timeout3, TEST_CONNECTION_NONE, 0, NULL, NULL},
1962   {NULL, NULL, 0, 0, NULL, NULL}
1963 };
1964 
1965 
main(int argc,char ** argv)1966 int main(int argc, char **argv)
1967 {
1968   if (argc > 1)
1969     get_options(argc, argv);
1970 
1971   get_envvars();
1972 
1973   run_tests(my_tests);
1974 
1975   return(exit_status());
1976 }
1977