Skip to content

Commit a764b70

Browse files
committed
WL#15651: FB contribution: Add new C API to query the mysql_real_connect_nonblocking state
Implemented a new C API: mysql_get_connect_nonblocking_stage() Added some doxygen formatting Bumped the libmysql client minor version Added stage names to the test Change-Id: I0198adf58f48d44b7538c980d4e7082797032b1b
1 parent 431a782 commit a764b70

File tree

7 files changed

+330
-1
lines changed

7 files changed

+330
-1
lines changed

cmake/mysql_version.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
#
2626

2727
SET(SHARED_LIB_MAJOR_VERSION "21")
28-
SET(SHARED_LIB_MINOR_VERSION "2")
28+
SET(SHARED_LIB_MINOR_VERSION "3")
2929
SET(PROTOCOL_VERSION "10")
3030

3131
# Generate "something" to trigger cmake rerun when MYSQL_VERSION changes

include/mysql.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -807,6 +807,8 @@ MYSQL *STDCALL mysql_real_connect_dns_srv(MYSQL *mysql,
807807
const char *db,
808808
unsigned long client_flag);
809809

810+
enum connect_stage STDCALL mysql_get_connect_nonblocking_stage(MYSQL *mysql);
811+
810812
#ifdef __cplusplus
811813
}
812814
#endif

include/mysql.h.pp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,32 @@
284284
unsigned char *net_store_length(unsigned char *pkg, unsigned long long length);
285285
unsigned int net_length_size(unsigned long long num);
286286
unsigned int net_field_length_size(const unsigned char *pos);
287+
enum connect_stage {
288+
CONNECT_STAGE_INVALID = 0,
289+
CONNECT_STAGE_NOT_STARTED,
290+
CONNECT_STAGE_NET_BEGIN_CONNECT,
291+
CONNECT_STAGE_NET_WAIT_CONNECT,
292+
CONNECT_STAGE_NET_COMPLETE_CONNECT,
293+
CONNECT_STAGE_READ_GREETING,
294+
CONNECT_STAGE_PARSE_HANDSHAKE,
295+
CONNECT_STAGE_ESTABLISH_SSL,
296+
CONNECT_STAGE_AUTHENTICATE,
297+
CONNECT_STAGE_AUTH_BEGIN,
298+
CONNECT_STAGE_AUTH_RUN_FIRST_AUTHENTICATE_USER,
299+
CONNECT_STAGE_AUTH_HANDLE_FIRST_AUTHENTICATE_USER,
300+
CONNECT_STAGE_AUTH_READ_CHANGE_USER_RESULT,
301+
CONNECT_STAGE_AUTH_HANDLE_CHANGE_USER_REQUEST,
302+
CONNECT_STAGE_AUTH_RUN_SECOND_AUTHENTICATE_USER,
303+
CONNECT_STAGE_AUTH_INIT_MULTI_AUTH,
304+
CONNECT_STAGE_AUTH_FINISH_AUTH,
305+
CONNECT_STAGE_AUTH_HANDLE_SECOND_AUTHENTICATE_USER,
306+
CONNECT_STAGE_AUTH_DO_MULTI_PLUGIN_AUTH,
307+
CONNECT_STAGE_AUTH_HANDLE_MULTI_AUTH_RESPONSE,
308+
CONNECT_STAGE_PREP_SELECT_DATABASE,
309+
CONNECT_STAGE_PREP_INIT_COMMANDS,
310+
CONNECT_STAGE_SEND_ONE_INIT_COMMAND,
311+
CONNECT_STAGE_COMPLETE
312+
};
287313
#include "mysql/client_plugin.h"
288314
struct st_mysql_client_plugin {
289315
int type; unsigned int interface_version; const char *name; const char *author; const char *desc; unsigned int version[3]; const char *license; void *mysql_api; int (*init)(char *, size_t, int, va_list); int (*deinit)(void); int (*options)(const char *option, const void *); int (*get_options)(const char *option, void *);
@@ -823,3 +849,4 @@
823849
const char *user, const char *passwd,
824850
const char *db,
825851
unsigned long client_flag);
852+
enum connect_stage mysql_get_connect_nonblocking_stage(MYSQL *mysql);

include/mysql_com.h

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1193,4 +1193,141 @@ unsigned int net_field_length_size(const unsigned char *pos);
11931193
#define NULL_LENGTH ((unsigned long)~0) /**< For ::net_store_length() */
11941194
#define MYSQL_STMT_HEADER 4
11951195
#define MYSQL_LONG_DATA_HEADER 6
1196+
1197+
/* clang-format off */
1198+
/**
1199+
Describes the current state of Asynchronous connection phase state machine
1200+
1201+
@startuml
1202+
[*] --> CONNECT_STAGE_INVALID
1203+
[*] --> CONNECT_STAGE_NOT_STARTED
1204+
1205+
CONNECT_STAGE_NOT_STARTED --> CONNECT_STAGE_NET_BEGIN_CONNECT
1206+
CONNECT_STAGE_NOT_STARTED --> CONNECT_STAGE_COMPLETE
1207+
1208+
CONNECT_STAGE_NET_BEGIN_CONNECT --> CONNECT_STAGE_NET_WAIT_CONNECT
1209+
CONNECT_STAGE_NET_BEGIN_CONNECT --> CONNECT_STAGE_NET_COMPLETE_CONNECT
1210+
CONNECT_STAGE_NET_BEGIN_CONNECT --> STATE_MACHINE_FAILED
1211+
1212+
CONNECT_STAGE_NET_WAIT_CONNECT --> CONNECT_STAGE_NET_COMPLETE_CONNECT
1213+
CONNECT_STAGE_NET_WAIT_CONNECT --> STATE_MACHINE_FAILED
1214+
1215+
CONNECT_STAGE_NET_COMPLETE_CONNECT --> STATE_MACHINE_FAILED
1216+
CONNECT_STAGE_NET_COMPLETE_CONNECT --> CONNECT_STAGE_READ_GREETING
1217+
1218+
CONNECT_STAGE_READ_GREETING --> STATE_MACHINE_FAILED
1219+
CONNECT_STAGE_READ_GREETING --> CONNECT_STAGE_PARSE_HANDSHAKE
1220+
1221+
CONNECT_STAGE_PARSE_HANDSHAKE --> STATE_MACHINE_FAILED
1222+
CONNECT_STAGE_PARSE_HANDSHAKE --> CONNECT_STAGE_ESTABLISH_SSL
1223+
1224+
CONNECT_STAGE_ESTABLISH_SSL --> STATE_MACHINE_FAILED
1225+
CONNECT_STAGE_ESTABLISH_SSL --> CONNECT_STAGE_AUTHENTICATE
1226+
1227+
CONNECT_STAGE_AUTHENTICATE --> STATE_MACHINE_FAILED
1228+
CONNECT_STAGE_AUTHENTICATE --> CONNECT_STAGE_AUTH_BEGIN
1229+
1230+
CONNECT_STAGE_AUTH_BEGIN --> STATE_MACHINE_FAILED
1231+
CONNECT_STAGE_AUTH_BEGIN --> CONNECT_STAGE_AUTH_RUN_FIRST_AUTHENTICATE_USER
1232+
1233+
CONNECT_STAGE_AUTH_RUN_FIRST_AUTHENTICATE_USER --> CONNECT_STAGE_AUTH_HANDLE_FIRST_AUTHENTICATE_USER
1234+
1235+
CONNECT_STAGE_AUTH_HANDLE_FIRST_AUTHENTICATE_USER --> STATE_MACHINE_FAILED
1236+
CONNECT_STAGE_AUTH_HANDLE_FIRST_AUTHENTICATE_USER --> CONNECT_STAGE_AUTH_READ_CHANGE_USER_RESULT
1237+
1238+
CONNECT_STAGE_AUTH_READ_CHANGE_USER_RESULT --> CONNECT_STAGE_AUTH_HANDLE_CHANGE_USER_REQUEST
1239+
1240+
CONNECT_STAGE_AUTH_HANDLE_CHANGE_USER_REQUEST --> STATE_MACHINE_FAILED
1241+
CONNECT_STAGE_AUTH_HANDLE_CHANGE_USER_REQUEST --> CONNECT_STAGE_AUTH_RUN_SECOND_AUTHENTICATE_USER
1242+
CONNECT_STAGE_AUTH_HANDLE_CHANGE_USER_REQUEST --> CONNECT_STAGE_AUTH_INIT_MULTI_AUTH
1243+
CONNECT_STAGE_AUTH_HANDLE_CHANGE_USER_REQUEST --> CONNECT_STAGE_AUTH_FINISH_AUTH
1244+
1245+
CONNECT_STAGE_AUTH_RUN_SECOND_AUTHENTICATE_USER --> STATE_MACHINE_FAILED
1246+
CONNECT_STAGE_AUTH_RUN_SECOND_AUTHENTICATE_USER --> CONNECT_STAGE_AUTH_HANDLE_SECOND_AUTHENTICATE_USER
1247+
1248+
CONNECT_STAGE_AUTH_HANDLE_SECOND_AUTHENTICATE_USER --> STATE_MACHINE_FAILED
1249+
CONNECT_STAGE_AUTH_HANDLE_SECOND_AUTHENTICATE_USER --> CONNECT_STAGE_AUTH_INIT_MULTI_AUTH
1250+
CONNECT_STAGE_AUTH_HANDLE_SECOND_AUTHENTICATE_USER --> CONNECT_STAGE_AUTH_FINISH_AUTH
1251+
1252+
CONNECT_STAGE_AUTH_INIT_MULTI_AUTH --> STATE_MACHINE_FAILED
1253+
CONNECT_STAGE_AUTH_INIT_MULTI_AUTH --> CONNECT_STAGE_AUTH_DO_MULTI_PLUGIN_AUTH
1254+
1255+
CONNECT_STAGE_AUTH_DO_MULTI_PLUGIN_AUTH --> STATE_MACHINE_FAILED
1256+
CONNECT_STAGE_AUTH_DO_MULTI_PLUGIN_AUTH --> CONNECT_STAGE_AUTH_HANDLE_MULTI_AUTH_RESPONSE
1257+
1258+
CONNECT_STAGE_AUTH_HANDLE_MULTI_AUTH_RESPONSE --> STATE_MACHINE_FAILED
1259+
CONNECT_STAGE_AUTH_HANDLE_MULTI_AUTH_RESPONSE --> CONNECT_STAGE_AUTH_INIT_MULTI_AUTH
1260+
CONNECT_STAGE_AUTH_HANDLE_MULTI_AUTH_RESPONSE --> CONNECT_STAGE_AUTH_FINISH_AUTH
1261+
1262+
CONNECT_STAGE_AUTH_FINISH_AUTH --> STATE_MACHINE_FAILED
1263+
CONNECT_STAGE_AUTH_FINISH_AUTH --> CONNECT_STAGE_PREP_SELECT_DATABASE
1264+
1265+
CONNECT_STAGE_PREP_SELECT_DATABASE --> CONNECT_STAGE_COMPLETE
1266+
CONNECT_STAGE_PREP_SELECT_DATABASE --> CONNECT_STAGE_PREP_INIT_COMMANDS
1267+
1268+
CONNECT_STAGE_PREP_INIT_COMMANDS --> CONNECT_STAGE_COMPLETE
1269+
CONNECT_STAGE_PREP_INIT_COMMANDS --> CONNECT_STAGE_SEND_ONE_INIT_COMMAND
1270+
1271+
CONNECT_STAGE_SEND_ONE_INIT_COMMAND --> CONNECT_STAGE_SEND_ONE_INIT_COMMAND
1272+
CONNECT_STAGE_SEND_ONE_INIT_COMMAND --> STATE_MACHINE_FAILED
1273+
CONNECT_STAGE_SEND_ONE_INIT_COMMAND --> CONNECT_STAGE_COMPLETE
1274+
1275+
STATE_MACHINE_FAILED --> [*]
1276+
CONNECT_STAGE_COMPLETE --> [*]
1277+
CONNECT_STAGE_INVALID --> [*]
1278+
@enduml
1279+
*/
1280+
/* clang-format on */
1281+
enum connect_stage {
1282+
/** MYSQL not valid or an unknown state */
1283+
CONNECT_STAGE_INVALID = 0,
1284+
/** not connected */
1285+
CONNECT_STAGE_NOT_STARTED,
1286+
/** begin connection to the server */
1287+
CONNECT_STAGE_NET_BEGIN_CONNECT,
1288+
/** wait for connection to be established */
1289+
CONNECT_STAGE_NET_WAIT_CONNECT,
1290+
/** init the local data structures post connect */
1291+
CONNECT_STAGE_NET_COMPLETE_CONNECT,
1292+
/** read the first packet */
1293+
CONNECT_STAGE_READ_GREETING,
1294+
/** parse the first packet */
1295+
CONNECT_STAGE_PARSE_HANDSHAKE,
1296+
/** tls establishment */
1297+
CONNECT_STAGE_ESTABLISH_SSL,
1298+
/** authentication phase */
1299+
CONNECT_STAGE_AUTHENTICATE,
1300+
/** determine the plugin to use */
1301+
CONNECT_STAGE_AUTH_BEGIN,
1302+
/** run first auth plugin */
1303+
CONNECT_STAGE_AUTH_RUN_FIRST_AUTHENTICATE_USER,
1304+
/** handle the result of the first auth plugin run */
1305+
CONNECT_STAGE_AUTH_HANDLE_FIRST_AUTHENTICATE_USER,
1306+
/** read the implied changed user auth, if any */
1307+
CONNECT_STAGE_AUTH_READ_CHANGE_USER_RESULT,
1308+
/** Check if server asked to use a different authentication plugin */
1309+
CONNECT_STAGE_AUTH_HANDLE_CHANGE_USER_REQUEST,
1310+
/** Start the authentication process again with the plugin which
1311+
server asked for */
1312+
CONNECT_STAGE_AUTH_RUN_SECOND_AUTHENTICATE_USER,
1313+
/** Start multi factor authentication */
1314+
CONNECT_STAGE_AUTH_INIT_MULTI_AUTH,
1315+
/** Final cleanup */
1316+
CONNECT_STAGE_AUTH_FINISH_AUTH,
1317+
/** Now read the results of the second plugin run */
1318+
CONNECT_STAGE_AUTH_HANDLE_SECOND_AUTHENTICATE_USER,
1319+
/** Invoke client plugins multi-auth authentication method */
1320+
CONNECT_STAGE_AUTH_DO_MULTI_PLUGIN_AUTH,
1321+
/** Handle response from client plugins authentication method */
1322+
CONNECT_STAGE_AUTH_HANDLE_MULTI_AUTH_RESPONSE,
1323+
/** Authenticated, set initial database if specified */
1324+
CONNECT_STAGE_PREP_SELECT_DATABASE,
1325+
/** Prepare to send a sequence of init commands. */
1326+
CONNECT_STAGE_PREP_INIT_COMMANDS,
1327+
/** Send an init command. This is called once per init command until
1328+
they've all been run (or a failure occurs) */
1329+
CONNECT_STAGE_SEND_ONE_INIT_COMMAND,
1330+
/** Connected or no async connect in progress */
1331+
CONNECT_STAGE_COMPLETE
1332+
};
11961333
#endif

libmysql/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ SET(CLIENT_API_NONBLOCKING_FUNCTIONS
175175
mysql_real_query_nonblocking
176176
mysql_send_query_nonblocking
177177
mysql_store_result_nonblocking
178+
mysql_get_connect_nonblocking_stage
178179

179180
CACHE INTERNAL "Nonblocking functions exported by client API"
180181
)

sql-common/client.cc

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4774,6 +4774,73 @@ int mysql_get_socket_descriptor(MYSQL *mysql) {
47744774
return -1;
47754775
}
47764776

4777+
connect_stage STDCALL mysql_get_connect_nonblocking_stage(MYSQL *mysql) {
4778+
static const std::map<csm_function, connect_stage> stages = {
4779+
{csm_begin_connect, CONNECT_STAGE_NET_BEGIN_CONNECT},
4780+
{csm_complete_connect, CONNECT_STAGE_NET_COMPLETE_CONNECT},
4781+
{csm_wait_connect, CONNECT_STAGE_NET_WAIT_CONNECT},
4782+
{csm_read_greeting, CONNECT_STAGE_READ_GREETING},
4783+
{csm_parse_handshake, CONNECT_STAGE_PARSE_HANDSHAKE},
4784+
{csm_establish_ssl, CONNECT_STAGE_ESTABLISH_SSL},
4785+
{csm_authenticate, CONNECT_STAGE_AUTHENTICATE},
4786+
{csm_prep_select_database, CONNECT_STAGE_PREP_SELECT_DATABASE},
4787+
#if !defined(MYSQL_SERVER)
4788+
{csm_prep_init_commands, CONNECT_STAGE_PREP_INIT_COMMANDS},
4789+
{csm_send_one_init_command, CONNECT_STAGE_SEND_ONE_INIT_COMMAND},
4790+
#endif
4791+
};
4792+
4793+
static const std::map<authsm_function, connect_stage> auth_stages = {
4794+
{authsm_begin_plugin_auth, CONNECT_STAGE_AUTH_BEGIN},
4795+
{authsm_run_first_authenticate_user,
4796+
CONNECT_STAGE_AUTH_RUN_FIRST_AUTHENTICATE_USER},
4797+
{authsm_handle_first_authenticate_user,
4798+
CONNECT_STAGE_AUTH_HANDLE_FIRST_AUTHENTICATE_USER},
4799+
{authsm_read_change_user_result,
4800+
CONNECT_STAGE_AUTH_READ_CHANGE_USER_RESULT},
4801+
{authsm_handle_change_user_result,
4802+
CONNECT_STAGE_AUTH_HANDLE_CHANGE_USER_REQUEST},
4803+
{authsm_run_second_authenticate_user,
4804+
CONNECT_STAGE_AUTH_RUN_SECOND_AUTHENTICATE_USER},
4805+
{authsm_init_multi_auth, CONNECT_STAGE_AUTH_INIT_MULTI_AUTH},
4806+
{authsm_finish_auth, CONNECT_STAGE_AUTH_FINISH_AUTH},
4807+
{authsm_handle_second_authenticate_user,
4808+
CONNECT_STAGE_AUTH_HANDLE_SECOND_AUTHENTICATE_USER},
4809+
{authsm_do_multi_plugin_auth, CONNECT_STAGE_AUTH_DO_MULTI_PLUGIN_AUTH},
4810+
{authsm_handle_multi_auth_response,
4811+
CONNECT_STAGE_AUTH_HANDLE_MULTI_AUTH_RESPONSE}};
4812+
4813+
if (mysql) {
4814+
NET *net = &mysql->net;
4815+
if (!net->vio) {
4816+
/* Seems the first stage hasn't started yet or it was unsuccessful, and
4817+
needs to be restarted so return the 1st stage */
4818+
return CONNECT_STAGE_NOT_STARTED;
4819+
}
4820+
4821+
mysql_async_connect *ctx = ASYNC_DATA(mysql)->connect_context;
4822+
if (!ctx) {
4823+
// If context is null and vio->net is set, means connection is complete
4824+
return CONNECT_STAGE_COMPLETE;
4825+
}
4826+
4827+
// Do the more detailed authentication stage
4828+
if (ctx->state_function == csm_authenticate &&
4829+
ctx->auth_context != nullptr &&
4830+
ctx->auth_context->state_function != nullptr) {
4831+
auto search = auth_stages.find(ctx->auth_context->state_function);
4832+
assert(search != auth_stages.end());
4833+
if (search != auth_stages.end()) return search->second;
4834+
}
4835+
4836+
auto search = stages.find(ctx->state_function);
4837+
assert(search != stages.end());
4838+
if (search != stages.end()) {
4839+
return search->second;
4840+
}
4841+
}
4842+
return CONNECT_STAGE_INVALID;
4843+
}
47774844
/* clang-format off */
47784845
/**
47794846
@page page_protocol_connection_phase_packets_protocol_handshake_response Protocol::HandshakeResponse:

testclients/mysql_client_test.cc

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23536,6 +23536,100 @@ static void test_bug34869076() {
2353623536
mysql_close(lmysql);
2353723537
}
2353823538

23539+
static void test_wl15651() {
23540+
MYSQL *mysql_async = NULL, *mysql_sync = NULL;
23541+
net_async_status status;
23542+
MYSQL *ret;
23543+
23544+
static const char *stage_names[CONNECT_STAGE_COMPLETE + 1] = {
23545+
"CONNECT_STAGE_INVALID",
23546+
"CONNECT_STAGE_NOT_STARTED",
23547+
"CONNECT_STAGE_NET_BEGIN_CONNECT",
23548+
"CONNECT_STAGE_NET_WAIT_CONNECT",
23549+
"CONNECT_STAGE_NET_COMPLETE_CONNECT",
23550+
"CONNECT_STAGE_READ_GREETING",
23551+
"CONNECT_STAGE_PARSE_HANDSHAKE",
23552+
"CONNECT_STAGE_ESTABLISH_SSL",
23553+
"CONNECT_STAGE_AUTHENTICATE",
23554+
"CONNECT_STAGE_AUTH_BEGIN",
23555+
"CONNECT_STAGE_AUTH_RUN_FIRST_AUTHENTICATE_USER",
23556+
"CONNECT_STAGE_AUTH_HANDLE_FIRST_AUTHENTICATE_USER",
23557+
"CONNECT_STAGE_AUTH_READ_CHANGE_USER_RESULT",
23558+
"CONNECT_STAGE_AUTH_HANDLE_CHANGE_USER_REQUEST",
23559+
"CONNECT_STAGE_AUTH_RUN_SECOND_AUTHENTICATE_USER",
23560+
"CONNECT_STAGE_AUTH_INIT_MULTI_AUTH",
23561+
"CONNECT_STAGE_AUTH_FINISH_AUTH",
23562+
"CONNECT_STAGE_AUTH_HANDLE_SECOND_AUTHENTICATE_USER",
23563+
"CONNECT_STAGE_AUTH_DO_MULTI_PLUGIN_AUTH",
23564+
"CONNECT_STAGE_AUTH_HANDLE_MULTI_AUTH_RESPONSE",
23565+
"CONNECT_STAGE_PREP_SELECT_DATABASE",
23566+
"CONNECT_STAGE_PREP_INIT_COMMANDS",
23567+
"CONNECT_STAGE_SEND_ONE_INIT_COMMAND",
23568+
"CONNECT_STAGE_COMPLETE"};
23569+
23570+
myheader("test_wl15651");
23571+
23572+
enum connect_stage cs = mysql_get_connect_nonblocking_stage(mysql_async);
23573+
DIE_UNLESS(cs == CONNECT_STAGE_INVALID);
23574+
23575+
/* test stages for a nonblocking conneciton */
23576+
mysql_async = mysql_client_init(NULL);
23577+
DIE_UNLESS(mysql_async != nullptr);
23578+
23579+
cs = mysql_get_connect_nonblocking_stage(mysql_async);
23580+
DIE_UNLESS(cs == CONNECT_STAGE_NOT_STARTED);
23581+
23582+
enum connect_stage cs_prev = cs;
23583+
do {
23584+
status = mysql_real_connect_nonblocking(
23585+
mysql_async, opt_host, opt_user, opt_password, current_db, opt_port,
23586+
opt_unix_socket, CLIENT_MULTI_STATEMENTS);
23587+
cs = mysql_get_connect_nonblocking_stage(mysql_async);
23588+
if (cs != cs_prev) {
23589+
if (!opt_silent)
23590+
fprintf(stdout,
23591+
"\n Nonblocking connect made transition from stage %s(%d) to "
23592+
"%s(%d)",
23593+
stage_names[cs_prev], cs_prev, stage_names[cs], cs);
23594+
cs_prev = cs;
23595+
}
23596+
} while (status == NET_ASYNC_NOT_READY);
23597+
DIE_UNLESS(status != NET_ASYNC_ERROR);
23598+
23599+
cs = mysql_get_connect_nonblocking_stage(mysql_async);
23600+
DIE_UNLESS(cs == CONNECT_STAGE_COMPLETE);
23601+
23602+
if (!opt_silent)
23603+
fprintf(stdout, "\n Nonblocking connect successful. Final stage %s(%d)",
23604+
stage_names[cs], cs);
23605+
23606+
mysql_close(mysql_async);
23607+
23608+
/* test stages for a blocking conneciton */
23609+
mysql_sync = mysql_client_init(NULL);
23610+
DIE_UNLESS(mysql_sync != nullptr);
23611+
23612+
cs = mysql_get_connect_nonblocking_stage(mysql_sync);
23613+
DIE_UNLESS(cs == CONNECT_STAGE_NOT_STARTED);
23614+
23615+
if (!opt_silent)
23616+
fprintf(stdout, "\n Starting blocking connect. Starting stage %s(%d)",
23617+
stage_names[cs], cs);
23618+
23619+
ret = mysql_real_connect(mysql_sync, opt_host, opt_user, opt_password,
23620+
current_db, opt_port, opt_unix_socket, 0);
23621+
DIE_UNLESS(ret == mysql_sync);
23622+
23623+
cs = mysql_get_connect_nonblocking_stage(mysql_sync);
23624+
DIE_UNLESS(cs == CONNECT_STAGE_COMPLETE);
23625+
23626+
if (!opt_silent)
23627+
fprintf(stdout, "\n Blocking connect successful. Final stage %s(%d)",
23628+
stage_names[cs], cs);
23629+
23630+
mysql_close(mysql_sync);
23631+
}
23632+
2353923633
static struct my_tests_st my_tests[] = {
2354023634
{"test_bug5194", test_bug5194},
2354123635
{"disable_query_logs", disable_query_logs},
@@ -23854,6 +23948,7 @@ static struct my_tests_st my_tests[] = {
2385423948
{"test_bug25584097", test_bug25584097},
2385523949
{"test_34556764", test_34556764},
2385623950
{"test_bug34869076", test_bug34869076},
23951+
{"test_wl15651", test_wl15651},
2385723952
{nullptr, nullptr}};
2385823953

2385923954
static struct my_tests_st *get_my_tests() { return my_tests; }

0 commit comments

Comments
 (0)