Description:
MySQL STMT will sometimes return 1 row sometimes for the following query. It should return 2 rows. Sometimes it returns 2, sometimes 1.
Code:
--------------
std::vector<holdplex::string> list_of_services;
list_of_services.push_back("test");
list_of_services.push_back("test2");
std::string select_service_sql = "SELECT * FROM services WHERE name_id=? OR name_id=?";
...(STMT Functions)
--------------
(First Parameter = 'test')
(Second Parameter = 'test2')
How to repeat:
MYSQL* mysql = mysql_init(NULL);
try
{
if(mysql == NULL)
{
throw (int)1;
}
if(mysql_real_connect(mysql, DATABASE_HOST, DATABASE_USERNAME, DATABASE_PASSWORD, "databasename", 0, NULL, 0) == NULL)
{
throw (int)2;
}
MYSQL_STMT* stmt = mysql_stmt_init(mysql);
if(stmt == NULL)
{
throw (int)3;
}
unsigned long pref = std::numeric_limits<unsigned long>::max();
mysql_stmt_attr_set(stmt, STMT_ATTR_PREFETCH_ROWS, (void*)&pref);
std::vector<holdplex::string> list_of_services;
list_of_services.push_back("test");
list_of_services.push_back("test2");
std::string select_service_sql = "SELECT * FROM services WHERE name_id=?";
for(size_t i = 1; i < list_of_services.size(); i++)
{
select_service_sql += " OR name_id=?";
}
mysql_stmt_prepare(stmt, select_service_sql.c_str(), select_service_sql.size());
std::vector<MYSQL_BIND> param;
param.resize(list_of_services.size());
memset(¶m[0], 0, sizeof(param[0]) * param.size());
for(size_t i = 0; i < list_of_services.size(); i++)
{
std::string str_key = list_of_services[i].conststring();
param[i].buffer_type = MYSQL_TYPE_STRING;
param[i].buffer = (char*)str_key.c_str();
param[i].buffer_length = str_key.size();
param[i].is_null = 0;
param[i].length = ¶m[i].buffer_length;
}
mysql_stmt_bind_param(stmt, ¶m[0]);
MYSQL_RES* result = mysql_stmt_result_metadata(stmt);
if (result == NULL)
{
throw (int)0;
}
size_t fieldnum = mysql_num_fields(result);
std::vector<MYSQL_FIELD*> field;
field.resize(fieldnum);
memset(&field[0], 0, sizeof(field[0]) * field.size());
for(size_t i = 0; i < fieldnum; i++)
{
field[i] = mysql_fetch_field(result);
}
if(mysql_stmt_execute(stmt))
{
throw (int)0;
}
param.resize(fieldnum);
memset(¶m[0], 0, sizeof(param[0]) * param.size());
for(size_t i = 0; i < fieldnum; i++)
{
param[i].buffer_type = MYSQL_TYPE_STRING;
param[i].buffer = new char[field[i]->length];
param[i].buffer_length = field[i]->length;
param[i].is_null = new my_bool(0);
param[i].length = new unsigned long(0);
param[i].error = new my_bool(0);
}
if(mysql_stmt_bind_result(stmt, ¶m[0]))
{
for(size_t i = 0; i < fieldnum; i++)
{
delete[] param[i].buffer;
delete param[i].is_null;
delete param[i].length;
delete param[i].error;
}
throw (int)0;
}
if (mysql_stmt_store_result(stmt))
{
for(size_t i = 0; i < fieldnum; i++)
{
delete[] param[i].buffer;
delete param[i].is_null;
delete param[i].length;
delete param[i].error;
}
throw (int)0;
}
size_t totalrows = 0;
while(!mysql_stmt_fetch(stmt))
{
totalrows++;
}
for(size_t i = 0; i < fieldnum; i++)
{
delete[] param[i].buffer;
delete param[i].is_null;
delete param[i].length;
delete param[i].error;
}
mysql_free_result(result);
mysql_stmt_close(stmt);
mysql_close(mysql);
std::cout<<totalrows<<std::endl;
}
catch(int a)
{
if(a == 404)
{
//404
return 0;
}
//Internal Error
return 0;
}