On 2016-07-22 07:01, Tian JiaLin wrote:
HI There,

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


The function returns an unsigned value, but it will return -1 (i.e. ~0) if there's an error, so check for an error with ~result == 0.

--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to