@@ -753,6 +753,29 @@ void set_mysql_error(MYSQL *mysql, int errcode, const char *sqlstate)
753753 DBUG_VOID_RETURN ;
754754}
755755
756+
757+ static void set_mysql_extended_error (MYSQL * mysql , int errcode ,
758+ const char * sqlstate ,
759+ const char * format , ...)
760+ {
761+ NET * net ;
762+ va_list args ;
763+ DBUG_ENTER ("set_mysql_extended_error" );
764+ DBUG_PRINT ("enter" , ("error :%d '%s'" , errcode , format ));
765+ DBUG_ASSERT (mysql != 0 );
766+
767+ net = & mysql -> net ;
768+ net -> last_errno = errcode ;
769+ va_start (args , format );
770+ my_vsnprintf (net -> last_error , sizeof (net -> last_error )- 1 ,
771+ format , args );
772+ va_end (args );
773+ strmov (net -> sqlstate , sqlstate );
774+
775+ DBUG_VOID_RETURN ;
776+ }
777+
778+
756779/*
757780 Flush result set sent from server
758781*/
@@ -850,6 +873,7 @@ static int check_license(MYSQL *mysql)
850873
851874void end_server (MYSQL * mysql )
852875{
876+ int save_errno = errno ;
853877 DBUG_ENTER ("end_server" );
854878 if (mysql -> net .vio != 0 )
855879 {
@@ -862,6 +886,7 @@ void end_server(MYSQL *mysql)
862886 }
863887 net_end (& mysql -> net );
864888 free_old_query (mysql );
889+ errno = save_errno ;
865890 DBUG_VOID_RETURN ;
866891}
867892
@@ -2031,7 +2056,10 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
20312056 if (mysql -> options .connect_timeout &&
20322057 vio_poll_read (net -> vio , mysql -> options .connect_timeout ))
20332058 {
2034- set_mysql_error (mysql , CR_SERVER_LOST , unknown_sqlstate );
2059+ set_mysql_extended_error (mysql , CR_SERVER_LOST , unknown_sqlstate ,
2060+ ER (CR_SERVER_LOST_EXTENDED ),
2061+ "waiting for initial communication packet" ,
2062+ errno );
20352063 goto error ;
20362064 }
20372065
@@ -2040,8 +2068,14 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
20402068 */
20412069
20422070 if ((pkt_length = cli_safe_read (mysql )) == packet_error )
2071+ {
2072+ if (mysql -> net .last_errno == CR_SERVER_LOST )
2073+ set_mysql_extended_error (mysql , CR_SERVER_LOST , unknown_sqlstate ,
2074+ ER (CR_SERVER_LOST_EXTENDED ),
2075+ "reading initial communication packet" ,
2076+ errno );
20432077 goto error ;
2044-
2078+ }
20452079 /* Check if version of protocol matches current one */
20462080
20472081 mysql -> protocol_version = net -> read_pos [0 ];
@@ -2175,7 +2209,10 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
21752209 */
21762210 if (my_net_write (net ,buff ,(uint ) (end - buff )) || net_flush (net ))
21772211 {
2178- set_mysql_error (mysql , CR_SERVER_LOST , unknown_sqlstate );
2212+ set_mysql_extended_error (mysql , CR_SERVER_LOST , unknown_sqlstate ,
2213+ ER (CR_SERVER_LOST_EXTENDED ),
2214+ "sending connection information to server" ,
2215+ errno );
21792216 goto error ;
21802217 }
21812218
@@ -2254,7 +2291,10 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
22542291 /* Write authentication package */
22552292 if (my_net_write (net ,buff ,(ulong ) (end - buff )) || net_flush (net ))
22562293 {
2257- set_mysql_error (mysql , CR_SERVER_LOST , unknown_sqlstate );
2294+ set_mysql_extended_error (mysql , CR_SERVER_LOST , unknown_sqlstate ,
2295+ ER (CR_SERVER_LOST_EXTENDED ),
2296+ "sending authentication information" ,
2297+ errno );
22582298 goto error ;
22592299 }
22602300
@@ -2264,7 +2304,14 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
22642304 */
22652305
22662306 if ((pkt_length = cli_safe_read (mysql )) == packet_error )
2307+ {
2308+ if (mysql -> net .last_errno == CR_SERVER_LOST )
2309+ set_mysql_extended_error (mysql , CR_SERVER_LOST , unknown_sqlstate ,
2310+ ER (CR_SERVER_LOST_EXTENDED ),
2311+ "reading authorization packet" ,
2312+ errno );
22672313 goto error ;
2314+ }
22682315
22692316 if (pkt_length == 1 && net -> read_pos [0 ] == 254 &&
22702317 mysql -> server_capabilities & CLIENT_SECURE_CONNECTION )
@@ -2276,12 +2323,22 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
22762323 scramble_323 (buff , mysql -> scramble , passwd );
22772324 if (my_net_write (net , buff , SCRAMBLE_LENGTH_323 + 1 ) || net_flush (net ))
22782325 {
2279- set_mysql_error (mysql , CR_SERVER_LOST , unknown_sqlstate );
2326+ set_mysql_extended_error (mysql , CR_SERVER_LOST , unknown_sqlstate ,
2327+ ER (CR_SERVER_LOST_EXTENDED ),
2328+ "sending password information" ,
2329+ errno );
22802330 goto error ;
22812331 }
22822332 /* Read what server thinks about out new auth message report */
22832333 if (cli_safe_read (mysql ) == packet_error )
2334+ {
2335+ if (mysql -> net .last_errno == CR_SERVER_LOST )
2336+ set_mysql_extended_error (mysql , CR_SERVER_LOST , unknown_sqlstate ,
2337+ ER (CR_SERVER_LOST_EXTENDED ),
2338+ "reading final connect information" ,
2339+ errno );
22842340 goto error ;
2341+ }
22852342 }
22862343
22872344 if (client_flag & CLIENT_COMPRESS ) /* We will use compression */
@@ -2292,8 +2349,15 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
22922349 goto error ;
22932350#endif
22942351
2295- if (db && mysql_select_db (mysql ,db ))
2352+ if (db && mysql_select_db (mysql , db ))
2353+ {
2354+ if (mysql -> net .last_errno == CR_SERVER_LOST )
2355+ set_mysql_extended_error (mysql , CR_SERVER_LOST , unknown_sqlstate ,
2356+ ER (CR_SERVER_LOST_EXTENDED ),
2357+ "Setting intital database" ,
2358+ errno );
22962359 goto error ;
2360+ }
22972361
22982362 if (mysql -> options .init_commands )
22992363 {
0 commit comments