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