Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Convert from unsigned long long to PyLong

37 views
Skip to first unread message

Tian JiaLin

unread,
Jul 22, 2016, 2:01:39 AM7/22/16
to
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


Thanks

MRAB

unread,
Jul 22, 2016, 10:46:41 AM7/22/16
to
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.

INADA Naoki

unread,
Jul 24, 2016, 2:59:56 PM7/24/16
to
Thank you for reporting this issue.

I'll fix it in next release of mysqlclient

(MySQL-python has not been maintained for these years. Please use mysqlclient.
It supports Python 3.)
> --
> https://mail.python.org/mailman/listinfo/python-list



--
INADA Naoki <songof...@gmail.com>
0 new messages