diff --git a/doc/src/release_notes.rst b/doc/src/release_notes.rst index d6e5e501..9b8928e8 100644 --- a/doc/src/release_notes.rst +++ b/doc/src/release_notes.rst @@ -67,6 +67,10 @@ Version 8.0 (TBD) `422 `__ and `423 `__). #) Documentation and test suite improvements. +#) Python objects bound to boolean variables are now converted to true or false + based on whether they would be considered true or false in a Python if + statement. (Previously, only True was treated as true and all other Python + values including 1, 1.0, and "foo" were treated as false.) Version 7.3 (December 2019) diff --git a/src/cxoTransform.c b/src/cxoTransform.c index 62566ee0..e77d4d4a 100644 --- a/src/cxoTransform.c +++ b/src/cxoTransform.c @@ -243,7 +243,7 @@ int cxoTransform_fromPython(cxoTransformNum transformNum, switch (transformNum) { case CXO_TRANSFORM_BOOLEAN: - dbValue->asBoolean = (pyValue == Py_True); + dbValue->asBoolean = PyObject_IsTrue(pyValue); return 0; case CXO_TRANSFORM_BINARY: case CXO_TRANSFORM_FIXED_CHAR: diff --git a/test/BooleanVar.py b/test/BooleanVar.py index bfbf0fb0..a86905c3 100644 --- a/test/BooleanVar.py +++ b/test/BooleanVar.py @@ -21,6 +21,32 @@ def testBindFalse(self): (False,)) self.assertEqual(result, "FALSE") + def testBindFloatAsBoolean(self): + "test binding in a float as a boolean" + var = self.cursor.var(bool) + var.setvalue(0, 0.0) + result = self.cursor.callfunc("pkg_TestBooleans.GetStringRep", str, + (var,)) + self.assertEqual(result, "FALSE") + var = self.cursor.var(bool) + var.setvalue(0, 1.0) + result = self.cursor.callfunc("pkg_TestBooleans.GetStringRep", str, + (var,)) + self.assertEqual(result, "TRUE") + + def testBindIntegerAsBoolean(self): + "test binding in an integer as a boolean" + var = self.cursor.var(bool) + var.setvalue(0, 0) + result = self.cursor.callfunc("pkg_TestBooleans.GetStringRep", str, + (var,)) + self.assertEqual(result, "FALSE") + var = self.cursor.var(bool) + var.setvalue(0, 1) + result = self.cursor.callfunc("pkg_TestBooleans.GetStringRep", str, + (var,)) + self.assertEqual(result, "TRUE") + def testBindNull(self): "test binding in a null value" self.cursor.setinputsizes(None, bool) @@ -40,6 +66,19 @@ def testBindOutTrue(self): (5,)) self.assertEqual(result, True) + def testBindStringAsBoolean(self): + "test binding in a string as a boolean" + var = self.cursor.var(bool) + var.setvalue(0, "") + result = self.cursor.callfunc("pkg_TestBooleans.GetStringRep", str, + (var,)) + self.assertEqual(result, "FALSE") + var = self.cursor.var(bool) + var.setvalue(0, "0") + result = self.cursor.callfunc("pkg_TestBooleans.GetStringRep", str, + (var,)) + self.assertEqual(result, "TRUE") + def testBindTrue(self): "test binding in a True value" result = self.cursor.callfunc("pkg_TestBooleans.GetStringRep", str,