Commit c5a168cf authored by unknown's avatar unknown
Browse files

Merge neptunus.(none):/home/msvensson/mysql/bug15518/my50-bug15518

into  neptunus.(none):/home/msvensson/mysql/mysql-5.0-maint


client/mysqltest.c:
  Auto merged
libmysql/libmysql.c:
  Auto merged
tests/mysql_client_test.c:
  SCCS merged
parents a05e7354 7b965030
Loading
Loading
Loading
Loading
+21 −4
Original line number Diff line number Diff line
@@ -724,6 +724,20 @@ void close_connections()
}


void close_statements()
{
  struct st_connection *con;
  DBUG_ENTER("close_statements");
  for (con= connections; con < next_con; con++)
  {
    if (con->stmt)
      mysql_stmt_close(con->stmt);
    con->stmt= 0;
  }
  DBUG_VOID_RETURN;
}


void close_files()
{
  DBUG_ENTER("close_files");
@@ -2907,6 +2921,10 @@ void do_close_connection(struct st_command *command)
	}
      }
#endif
      if (next_con->stmt)
        mysql_stmt_close(next_con->stmt);
      next_con->stmt= 0;

      mysql_close(&con->mysql);
      if (con->util_mysql)
	mysql_close(con->util_mysql);
@@ -5112,10 +5130,7 @@ void run_query_stmt(MYSQL *mysql, struct st_command *command,
  */

  var_set_errno(mysql_stmt_errno(stmt));
#ifndef BUG15518_FIXED
  mysql_stmt_close(stmt);
  cur_con->stmt= NULL;
#endif

  DBUG_VOID_RETURN;
}

@@ -5902,6 +5917,8 @@ int main(int argc, char **argv)
	break;
      case Q_DISABLE_PS_PROTOCOL:
        ps_protocol_enabled= 0;
        /* Close any open statements */
        close_statements();
        break;
      case Q_ENABLE_PS_PROTOCOL:
        ps_protocol_enabled= ps_protocol;
+11 −3
Original line number Diff line number Diff line
@@ -2042,6 +2042,13 @@ mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query, ulong length)
    DBUG_RETURN(1);
  }

  /*
    Reset the last error in any case: that would clear the statement
    if the previous prepare failed.
  */
  stmt->last_errno= 0;
  stmt->last_error[0]= '\0';

  if ((int) stmt->state > (int) MYSQL_STMT_INIT_DONE)
  {
    /* This is second prepare with another statement */
@@ -2055,23 +2062,24 @@ mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query, ulong length)
    */
    stmt->bind_param_done= stmt->bind_result_done= FALSE;
    stmt->param_count= stmt->field_count= 0;
    stmt->last_errno= 0;
    stmt->last_error[0]= '\0';
    free_root(&stmt->mem_root, MYF(MY_KEEP_PREALLOC));

    int4store(buff, stmt->stmt_id);

    /*
      Close statement in server

      If there was a 'use' result from another statement, or from
      mysql_use_result it won't be freed in mysql_stmt_free_result and
      we should get 'Commands out of sync' here.
    */
    stmt->state= MYSQL_STMT_INIT_DONE;
    if (stmt_command(mysql, COM_STMT_CLOSE, buff, 4, stmt))
    {
      set_stmt_errmsg(stmt, mysql->net.last_error, mysql->net.last_errno,
                      mysql->net.sqlstate);
      DBUG_RETURN(1);
    }
    stmt->state= MYSQL_STMT_INIT_DONE;
  }

  if (stmt_command(mysql, COM_STMT_PREPARE, query, length, stmt))
+85 −8
Original line number Diff line number Diff line
@@ -11013,7 +11013,7 @@ static void test_view()
    rc= mysql_stmt_execute(stmt);
    check_execute(stmt, rc);
    rc= my_process_stmt_result(stmt);
    assert(1 == rc);
    DIE_UNLESS(1 == rc);
  }
  mysql_stmt_close(stmt);

@@ -11056,7 +11056,7 @@ static void test_view_where()
    rc= mysql_stmt_execute(stmt);
    check_execute(stmt, rc);
    rc= my_process_stmt_result(stmt);
    assert(4 == rc);
    DIE_UNLESS(4 == rc);
  }
  mysql_stmt_close(stmt);

@@ -11139,7 +11139,7 @@ static void test_view_2where()
  rc= mysql_stmt_execute(stmt);
  check_execute(stmt, rc);
  rc= my_process_stmt_result(stmt);
  assert(0 == rc);
  DIE_UNLESS(0 == rc);

  mysql_stmt_close(stmt);

@@ -11192,7 +11192,7 @@ static void test_view_star()
    rc= mysql_stmt_execute(stmt);
    check_execute(stmt, rc);
    rc= my_process_stmt_result(stmt);
    assert(0 == rc);
    DIE_UNLESS(0 == rc);
  }

  mysql_stmt_close(stmt);
@@ -11255,7 +11255,7 @@ static void test_view_insert()
    rc= mysql_stmt_execute(select_stmt);
    check_execute(select_stmt, rc);
    rowcount= (int)my_process_stmt_result(select_stmt);
    assert((i+1) == rowcount);
    DIE_UNLESS((i+1) == rowcount);
  }
  mysql_stmt_close(insert_stmt);
  mysql_stmt_close(select_stmt);
@@ -11296,7 +11296,7 @@ static void test_left_join_view()
    rc= mysql_stmt_execute(stmt);
    check_execute(stmt, rc);
    rc= my_process_stmt_result(stmt);
    assert(3 == rc);
    DIE_UNLESS(3 == rc);
  }
  mysql_stmt_close(stmt);

@@ -11372,7 +11372,7 @@ static void test_view_insert_fields()
  rc= mysql_stmt_execute(stmt);
  check_execute(stmt, rc);
  rc= my_process_stmt_result(stmt);
  assert(1 == rc);
  DIE_UNLESS(1 == rc);

  mysql_stmt_close(stmt);
  rc= mysql_query(mysql, "DROP VIEW v1");
@@ -12850,6 +12850,82 @@ static void test_bug7990()
  DIE_UNLESS(!mysql_errno(mysql));
}

/*
  Bug #15518 - Reusing a stmt that has failed during prepare
  does not clear error
*/

static void test_bug15518()
{
  MYSQL_STMT *stmt;
  MYSQL* mysql1;
  int rc;
  myheader("test_bug15518");

  mysql1= mysql_init(NULL);

  if (!mysql_real_connect(mysql1, opt_host, opt_user, opt_password,
                          opt_db ? opt_db : "test", opt_port, opt_unix_socket,
                          CLIENT_MULTI_STATEMENTS))
  {
    fprintf(stderr, "Failed to connect to the database\n");
    DIE_UNLESS(0);
  }

  stmt= mysql_stmt_init(mysql1);

  /*
    The prepare of foo should fail with errno 1064 since
    it's not a valid query
  */
  rc= mysql_stmt_prepare(stmt, "foo", 3);
  if (!opt_silent)
    fprintf(stdout, "rc: %d, mysql_stmt_errno: %d, mysql_errno: %d\n",
            rc, mysql_stmt_errno(stmt), mysql_errno(mysql1));
  DIE_UNLESS(rc && mysql_stmt_errno(stmt) && mysql_errno(mysql1));

  /*
    Use the same stmt and reprepare with another query that
    suceeds
  */
  rc= mysql_stmt_prepare(stmt, "SHOW STATUS", 12);
  if (!opt_silent)
    fprintf(stdout, "rc: %d, mysql_stmt_errno: %d, mysql_errno: %d\n",
            rc, mysql_stmt_errno(stmt), mysql_errno(mysql1));
  DIE_UNLESS(!rc || mysql_stmt_errno(stmt) || mysql_errno(mysql1));

  mysql_stmt_close(stmt);
  DIE_UNLESS(!mysql_errno(mysql1));

  /*
    part2, when connection to server has been closed
    after first prepare
  */
  stmt= mysql_stmt_init(mysql1);
  rc= mysql_stmt_prepare(stmt, "foo", 3);
  if (!opt_silent)
    fprintf(stdout, "rc: %d, mysql_stmt_errno: %d, mysql_errno: %d\n",
            rc, mysql_stmt_errno(stmt), mysql_errno(mysql1));
  DIE_UNLESS(rc && mysql_stmt_errno(stmt) && mysql_errno(mysql1));

  /* Close connection to server */
  mysql_close(mysql1);

  /*
    Use the same stmt and reprepare with another query that
    suceeds. The prepare should fail with error 2013 since
    connection to server has been closed.
  */
  rc= mysql_stmt_prepare(stmt, "SHOW STATUS", 12);
  if (!opt_silent)
    fprintf(stdout, "rc: %d, mysql_stmt_errno: %d\n",
            rc, mysql_stmt_errno(stmt));
  DIE_UNLESS(rc && mysql_stmt_errno(stmt));

  mysql_stmt_close(stmt);
  DIE_UNLESS(mysql_errno(mysql1));
}


static void test_view_sp_list_fields()
{
@@ -15008,7 +15084,7 @@ static void test_bug17667()
    }
    else
    {
      assert(0==1);
      DIE_UNLESS(0==1);
    }
  }

@@ -15732,6 +15808,7 @@ static struct my_tests_st my_tests[]= {
  { "test_bug15752", test_bug15752 },
  { "test_bug21206", test_bug21206 },
  { "test_bug21726", test_bug21726 },
  { "test_bug15518", test_bug15518 },
  { "test_bug23383", test_bug23383 },
  { "test_bug21635", test_bug21635 },
  { 0, 0 }