Hi all, I have reported this problem before, but I raise it again, since I still get this problem with 5.7.17
See attached code: I want to interrupt a long running statement with CTRL-C by starting a new connect to make a KILL QUERY. I am using the same technique as the mysql client code. The difference here is that my code is using PREPARED STATEMENTS with mysql_stmt_prepare() etc. Problem: After interrupting the first query with CTRL-C, the call to mysql_stmt_close() hangs... Maybe I am missing some new connection or statement option...?!? IMPORTANT: This problem appeared in a 5.7.x, same code is working fine with 5.6(.16) !!!! Please can someone from MySQL C API team try to reproduce and confirm? Thanks! Seb
#include <stdio.h> #include <string.h> #include <ctype.h> #include <signal.h> #include <mysql.h> #include <mysqld_error.h> static char * c_host = "orion"; static char * c_user = "mysuser"; static char * c_auth = "fourjs"; static int c_port = 3308; static char * c_sock = NULL; static char * c_dbnm = "test1"; static int executing_query; static unsigned long thread_id; static void kill_query(void) { char cmd[50]; MYSQL *h; h = mysql_init(NULL); if (!mysql_real_connect(h, c_host, c_user, c_auth, c_dbnm, c_port, c_sock, CLIENT_FOUND_ROWS)) { fprintf(stderr, "kill_query: Could not connect (err=%d)\n", mysql_errno(h)); return; } sprintf(cmd, "KILL QUERY %ld", thread_id); if (mysql_query(h, cmd) != 0) { fprintf(stderr, "Could not execute %s.", cmd); } mysql_close(h); } static void handle_ctrlc_signal(int sig) { fprintf(stdout, "SIGINT caught! executing_query = %d\n", executing_query); if (executing_query) { executing_query = 0; kill_query(); } return; } int main(int argc, char ** argv) { MYSQL * conn; MYSQL_STMT * stmt; int i, s; unsigned long ct = (unsigned long) CURSOR_TYPE_READ_ONLY; const char * sqlstmt = "select benchmark(1000000000, md5('when will it end?'))"; signal(SIGINT, handle_ctrlc_signal); conn = mysql_init(NULL); if (!mysql_real_connect(conn, c_host, c_user, c_auth, c_dbnm, c_port, c_sock, CLIENT_FOUND_ROWS)) { fprintf(stderr, "Could not connect (err=%d)\n", mysql_errno(conn)); return -1; } thread_id = mysql_thread_id(conn); fprintf(stdout, "MySQL thread ID: %ld\n", thread_id); for (i=0; i<3; i++) { fprintf(stdout, "\nRound %d:\n", i+1); fprintf(stdout, "Allocating statement handle..."); stmt = mysql_stmt_init(conn); if (stmt==NULL) { fprintf(stderr, "Could not create statement handle (err=%d)\n", mysql_errno(conn)); return -1; } fprintf(stdout, " handle = %p\n", (void*) stmt); fprintf(stdout, "Preparing statement %p ...\n", (void*) stmt); s = mysql_stmt_prepare(stmt, sqlstmt, (unsigned long) strlen(sqlstmt)); if (s!=0) { fprintf(stderr, "Could not prepare statement (err=%d)\n", mysql_errno(conn)); return -1; } fprintf(stdout, "Setting cursor type to read only for %p ...\n", (void*) stmt); s = mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, (const void *) &ct); if (s!=0) { fprintf(stderr, "Could not set cursor type (err=%d)\n", mysql_errno(conn)); return -1; } fprintf(stdout, "Executing statement %p ...\n", (void*) stmt); executing_query = 1; s = mysql_stmt_execute(stmt); if (s!=0) { if (mysql_errno(conn) == 1317) { fprintf(stdout, "Statement interrupted by user...\n"); } else { fprintf(stderr, "Could not execute the query (err=%d)\n", mysql_errno(conn)); return -1; } } fprintf(stdout, "Closing/freeing statement handle %p ...\n", (void*) stmt); s = mysql_stmt_close(stmt); if (s!=0) { fprintf(stderr, "Could not close statement handle (err=%d)\n", mysql_errno(conn)); return -1; } fprintf(stdout, "Round done.\n"); } return 0; }
-- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe: http://lists.mysql.com/mysql