//gcc bug37671.c -Wall -g -o bug37671 -L/home/sbester/mysql/5.0/mysql-5.0.64-linux-i686/lib -I/home/sbester/mysql/5.0/mysql-5.0.64-linux-i686/include -lmysqlclient_r -lz -lpthread #include #include #include #include #include #include #include char host[]="127.0.0.1"; int port=3306; char username[]="root"; char password[]=""; char database[]="test"; char* alocmem(size_t num); int ps_func_0000(MYSQL *db); int main(int argc, const char *argv[]) { MYSQL *dbc=NULL; int i=0; my_init(); if (!(dbc = mysql_init(NULL))) { printf("mysql_init\n"); goto threadexit; } else { if (!mysql_real_connect(dbc,host,username,password,database,port, NULL, CLIENT_FOUND_ROWS|CLIENT_MULTI_STATEMENTS|CLIENT_MULTI_RESULTS)) { printf("mysql_real_connect failed: %s (%d)", mysql_error(dbc),mysql_errno(dbc)); goto threadexit; } } for(i=0;i<100000;i++) { ps_func_0000 (dbc); } exit(0); threadexit: exit(-1); } char* alocmem(size_t num) { char *r=(char*)calloc(num,1); if(NULL == r) { printf("cannot calloc %I64u bytes of memory\n",num); exit(1); } return r; } int ps_func_0000(MYSQL *db) { char *query="select GeomFromText('POINT(1 1)')"; MYSQL_STMT *stmt=NULL; unsigned int val=0; int i=0; MYSQL_BIND bind_result[1]; unsigned long length_result[1]; my_bool is_null_result[1]; my_bool error_result[1]; memset(bind_result, 0, sizeof(bind_result)); stmt= mysql_stmt_init(db); if (NULL == stmt) { printf("mysql_stmt_init failed: %s (%d)\n",mysql_error(db),mysql_errno(db)); return 0; } if(mysql_stmt_prepare(stmt,query,(unsigned long)strlen(query))) { printf("mysql_stmt_prepare failed: %s (%d)\n",mysql_stmt_error(stmt),mysql_stmt_errno(stmt)); return 0; } /* val=1; if(mysql_stmt_attr_set(stmt, STMT_ATTR_UPDATE_MAX_LENGTH, (void *)&val)) { printf("mysql_stmt_attr_set: %s (%d)\n",mysql_stmt_error(stmt),mysql_stmt_errno(stmt)); return 0; } */ val=CURSOR_TYPE_READ_ONLY; if(mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, (void *)&val)) { printf("mysql_stmt_attr_set: %s (%d)\n",mysql_stmt_error(stmt),mysql_stmt_errno(stmt)); return 0; } val=5000; if(mysql_stmt_attr_set(stmt, STMT_ATTR_PREFETCH_ROWS, (void *)&val)) { printf("mysql_stmt_attr_set: %s (%d)\n",mysql_stmt_error(stmt),mysql_stmt_errno(stmt)); return 0; } bind_result[0].buffer_type=255; bind_result[0].buffer=alocmem(10240); bind_result[0].buffer_length=10240; bind_result[0].length=&length_result[0]; bind_result[0].is_null=&is_null_result[0]; bind_result[0].error=&error_result[0]; for(i=0;i<1;i++) { if(mysql_stmt_execute(stmt)) { printf("mysql_stmt_execute failed: %s (%d)\n",mysql_stmt_error(stmt),mysql_stmt_errno(stmt)); return 0; } if(mysql_stmt_bind_result(stmt,bind_result)) { //printf("mysql_stmt_bind_result failed: %s (%d)\n",mysql_stmt_error(stmt),mysql_stmt_errno(stmt)); return 0; } if(mysql_stmt_store_result(stmt)) { printf("mysql_stmt_store_result failed: %s (%d)\n",mysql_stmt_error(stmt),mysql_stmt_errno(stmt)); return 0; } while (!mysql_stmt_fetch(stmt)) { } } /* intentionally leave this out to allow more open filez... if(mysql_stmt_close(stmt)) { printf("mysql_stmt_close failed: %s (%d)\n",mysql_stmt_error(stmt),mysql_stmt_errno(stmt)); return 0; } */ if(NULL!=bind_result[0].buffer) free(bind_result[0].buffer); return 1; }