HI There, 

Maybe I should not post this in the dev group, but I think it has some relationship on the Python core.

I'm using MySQLdb as the MySQL client. Recently I got a weird problem of this library. After looking into it, I suspect the problem may related to the conversion from unsigned long to PyLongObject. 

Here is the detail, If you are familiar with MySQLdb, the following snippet is a way to query the data from MySQL: 


connection = MySQLdb.connect(...) 

connection.autocommit(True) 
try: 
    cursor = connection.cursor() 
    if not cursor.execute(sql, values) > 0: 
            return None 
    row = cursor.fetchone() 
finally: 
    connection.close() 
return row[0] 


Sometimes the return value of execute method would be 18446744073709552000 even there is no matched data available. I checked the source code of the library, the underlying implementation is https://github.com/farcepest/MySQLdb1/blob/master/_mysql.c#L835

static PyObject * 
_mysql_ConnectionObject_affected_rows( 
        _mysql_ConnectionObject *self, 
        PyObject *args) 

        if (!PyArg_ParseTuple(args, "")) return NULL; 
        check_connection(self)
        return PyLong_FromUnsignedLongLong(mysql_affected_rows(&(self->connection))); 


And here is the official doc for mysql_affected_rows http://dev.mysql.com/doc/refman/5.7/en/mysql-affected-rows.html

Let me give a superficial understanding, please correct me if I were wrong. 

In a 64-bit system, the mysql_affected_rows is supposed to return a number of unsigned long, which means the range should be 0 ~ 2^64 (18446744073709551616), How could it be possible the function PyLong_FromUnsignedLongLong return a converted value larger than 2^64, that's what I don't understand. 

Does anyone have some ideas of it? 


The versions of the components I used: 

Python: 2.7.6 
MySQL 5.7.11 
MySQLdb 1.2.5 


Thanks