#include <mysql.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h> 
#include <limits.h>
#include <string.h>
#include <assert.h>

void excute_query(MYSQL *conn, const char *sql)
{
   if (mysql_query(conn, sql) == 0) 
   {
      MYSQL_RES *res = mysql_store_result(conn);
      mysql_free_result(res);
   }
}

void prepare_data(MYSQL *conn)
{
   excute_query(conn, "drop table if exists test_sub_execute;");
   excute_query(conn, "create table test_sub_execute(c1 decimal(10, 2));");
   excute_query(conn, "insert into test_sub_execute value(8)");
   sleep(1);
}

void create_idle_connection()
{
   MYSQL *conn = mysql_init(NULL);
   if (mysql_real_connect(conn, "127.0.0.1", "mxs", "123", 
          "testdb", 3012, NULL, 0) == NULL) 
   {
         fprintf(stderr, "%s\n", mysql_error(conn));
         mysql_close(conn);
         exit(1);
   }

   /*route to master */
   mysql_query(conn, "begin;select sleep(100);commit;");
}

int main(int argc, char **argv)
{  
  MYSQL *conn = mysql_init(NULL);
 
  MYSQL_BIND my_bind[1];
  char       data[30];
  int        rc;
  my_bool    is_null;

  if (mysql_real_connect(conn, "127.0.0.1", "mxs", "123", 
          "testdb", 3012, NULL, 0) == NULL) 
  {
      fprintf(stderr, "%s\n", mysql_error(conn));
      mysql_close(conn);
      exit(1);
  }

  /*Let normal reads go to slave */
  pthread_t tid_t;
  pthread_create(&tid_t, NULL, create_idle_connection, NULL);

  prepare_data(conn);

  MYSQL_STMT *stmt = mysql_stmt_init(conn);
  char *sql = "select c1 from test_sub_execute where c1= ?";
  rc = mysql_stmt_prepare(stmt, sql, strlen(sql));

  memset(my_bind, 0, sizeof(my_bind));
  my_bind[0].buffer_type= MYSQL_TYPE_NEWDECIMAL;
  my_bind[0].buffer= (void *)data;
  my_bind[0].buffer_length= 25;
  my_bind[0].is_null= &is_null;
  is_null= 0;

  excute_query(conn, "begin");
  rc = mysql_stmt_bind_param(stmt, my_bind);
  strcpy(data, "8.0");

  excute_query(conn, "begin");
  /* first execute go to master */
  rc = mysql_stmt_execute(stmt); //general_log:select c1 from test_sub_execute where c1= 8.0
  MYSQL_RES *res = mysql_stmt_store_result(stmt);
  mysql_free_result(res);
  excute_query(conn, "commit");

  /* second execute go to slave but new-params-bound-flag = 0 */
  rc = mysql_stmt_execute(stmt); // general_log:select c1 from test_sub_execute where c1= NULL
  mysql_stmt_store_result(stmt);
  int row_num = mysql_stmt_num_rows(stmt);
  printf("row_num:%d\n", row_num);
  assert(row_num > 0);

  mysql_close(conn);
}
