changeset: 75121:789a3ea97083 branch: 2.7 parent: 75116:37c824c3efe8 user: Petri Lehtinen date: Tue Feb 21 13:58:40 2012 +0200 files: Lib/sqlite3/test/userfunctions.py Misc/ACKS Misc/NEWS Modules/_sqlite/connection.c description: sqlite3: Fix 64-bit integer handling in user functions on 32-bit architectures Closes #8033. diff -r 37c824c3efe8 -r 789a3ea97083 Lib/sqlite3/test/userfunctions.py --- a/Lib/sqlite3/test/userfunctions.py Tue Feb 21 09:22:16 2012 +0200 +++ b/Lib/sqlite3/test/userfunctions.py Tue Feb 21 13:58:40 2012 +0200 @@ -37,6 +37,8 @@ return None def func_returnblob(): return buffer("blob") +def func_returnlonglong(): + return 1<<31 def func_raiseexception(): 5 // 0 @@ -50,6 +52,8 @@ return type(v) is type(None) def func_isblob(v): return type(v) is buffer +def func_islonglong(v): + return isinstance(v, (int, long)) and v>= 1<<31 class AggrNoStep: def __init__(self): @@ -126,6 +130,7 @@ self.con.create_function("returnfloat", 0, func_returnfloat) self.con.create_function("returnnull", 0, func_returnnull) self.con.create_function("returnblob", 0, func_returnblob) + self.con.create_function("returnlonglong", 0, func_returnlonglong) self.con.create_function("raiseexception", 0, func_raiseexception) self.con.create_function("isstring", 1, func_isstring) @@ -133,6 +138,7 @@ self.con.create_function("isfloat", 1, func_isfloat) self.con.create_function("isnone", 1, func_isnone) self.con.create_function("isblob", 1, func_isblob) + self.con.create_function("islonglong", 1, func_islonglong) def tearDown(self): self.con.close() @@ -199,6 +205,12 @@ self.assertEqual(type(val), buffer) self.assertEqual(val, buffer("blob")) + def CheckFuncReturnLongLong(self): + cur = self.con.cursor() + cur.execute("select returnlonglong()") + val = cur.fetchone()[0] + self.assertEqual(val, 1<<31) + def CheckFuncException(self): cur = self.con.cursor() try: @@ -238,6 +250,12 @@ val = cur.fetchone()[0] self.assertEqual(val, 1) + def CheckParamLongLong(self): + cur = self.con.cursor() + cur.execute("select islonglong(?)", (1<<42,)) + val = cur.fetchone()[0] + self.assertEqual(val, 1) + class AggregateTests(unittest.TestCase): def setUp(self): self.con = sqlite.connect(":memory:") diff -r 37c824c3efe8 -r 789a3ea97083 Misc/ACKS --- a/Misc/ACKS Tue Feb 21 09:22:16 2012 +0200 +++ b/Misc/ACKS Tue Feb 21 13:58:40 2012 +0200 @@ -198,6 +198,7 @@ Erik Demaine John Dennis Roger Dev +Philippe Devalkeneer Raghuram Devarakonda Catherine Devlin Scott Dial diff -r 37c824c3efe8 -r 789a3ea97083 Misc/NEWS --- a/Misc/NEWS Tue Feb 21 09:22:16 2012 +0200 +++ b/Misc/NEWS Tue Feb 21 13:58:40 2012 +0200 @@ -98,6 +98,9 @@ Library ------- +- Issue #8033: sqlite3: Fix 64-bit integer handling in user functions + on 32-bit architectures. Initial patch by Philippe Devalkeneer. + - HTMLParser is now able to handle slashes in the start tag. - Issue #14001: CVE-2012-0845: xmlrpc: Fix an endless loop in diff -r 37c824c3efe8 -r 789a3ea97083 Modules/_sqlite/connection.c --- a/Modules/_sqlite/connection.c Tue Feb 21 09:22:16 2012 +0200 +++ b/Modules/_sqlite/connection.c Tue Feb 21 13:58:40 2012 +0200 @@ -540,7 +540,6 @@ void _pysqlite_set_result(sqlite3_context* context, PyObject* py_val) { - long longval; const char* buffer; Py_ssize_t buflen; PyObject* stringval; @@ -550,8 +549,9 @@ } else if (py_val == Py_None) { sqlite3_result_null(context); } else if (PyInt_Check(py_val)) { - longval = PyInt_AsLong(py_val); - sqlite3_result_int64(context, (PY_LONG_LONG)longval); + sqlite3_result_int64(context, (sqlite3_int64)PyInt_AsLong(py_val)); + } else if (PyLong_Check(py_val)) { + sqlite3_result_int64(context, PyLong_AsLongLong(py_val)); } else if (PyFloat_Check(py_val)) { sqlite3_result_double(context, PyFloat_AsDouble(py_val)); } else if (PyBuffer_Check(py_val)) { @@ -580,7 +580,7 @@ sqlite3_value* cur_value; PyObject* cur_py_value; const char* val_str; - PY_LONG_LONG val_int; + sqlite3_int64 val_int; Py_ssize_t buflen; void* raw_buffer; @@ -594,7 +594,10 @@ switch (sqlite3_value_type(argv[i])) { case SQLITE_INTEGER: val_int = sqlite3_value_int64(cur_value); - cur_py_value = PyInt_FromLong((long)val_int); + if(val_int < LONG_MIN || val_int> LONG_MAX) + cur_py_value = PyLong_FromLongLong(val_int); + else + cur_py_value = PyInt_FromLong((long)val_int); break; case SQLITE_FLOAT: cur_py_value = PyFloat_FromDouble(sqlite3_value_double(cur_value));

AltStyle によって変換されたページ (->オリジナル) /