Add additional check for calling setinputsizes() with an empty dictionary in
order to avoid the error "cx_Oracle.ProgrammingError: positional and named binds cannot be intermixed" (https://github.com/oracle/python-cx_Oracle/issues/199).
This commit is contained in:
parent
b340771c37
commit
43a485042f
|
@ -1743,16 +1743,23 @@ static PyObject *cxoCursor_setInputSizes(cxoCursor *cursor, PyObject *args,
|
||||||
|
|
||||||
// eliminate existing bind variables
|
// eliminate existing bind variables
|
||||||
Py_CLEAR(cursor->bindVariables);
|
Py_CLEAR(cursor->bindVariables);
|
||||||
|
|
||||||
|
// if no values passed, do nothing further, but return an empty list or
|
||||||
|
// dictionary as appropriate
|
||||||
|
if (numKeywordArgs == 0 && numPositionalArgs == 0) {
|
||||||
|
if (keywordArgs)
|
||||||
|
return PyDict_New();
|
||||||
|
return PyList_New(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// retain bind variables
|
||||||
|
cursor->setInputSizes = 1;
|
||||||
if (numKeywordArgs > 0)
|
if (numKeywordArgs > 0)
|
||||||
cursor->bindVariables = PyDict_New();
|
cursor->bindVariables = PyDict_New();
|
||||||
else cursor->bindVariables = PyList_New(numPositionalArgs);
|
else cursor->bindVariables = PyList_New(numPositionalArgs);
|
||||||
if (!cursor->bindVariables)
|
if (!cursor->bindVariables)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
// retain bind variables if any were set
|
|
||||||
if (numKeywordArgs > 0 || numPositionalArgs > 0)
|
|
||||||
cursor->setInputSizes = 1;
|
|
||||||
|
|
||||||
// process each input
|
// process each input
|
||||||
if (numKeywordArgs > 0) {
|
if (numKeywordArgs > 0) {
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
|
@ -538,6 +538,22 @@ class TestCursor(BaseTestCase):
|
||||||
self.cursor.execute("select :val from dual", val = "Test Value")
|
self.cursor.execute("select :val from dual", val = "Test Value")
|
||||||
self.assertEqual(self.cursor.fetchall(), [("Test Value",)])
|
self.assertEqual(self.cursor.fetchall(), [("Test Value",)])
|
||||||
|
|
||||||
|
def testSetInputSizesEmptyDict(self):
|
||||||
|
"test setting input sizes with an empty dictionary"
|
||||||
|
emptyDict = {}
|
||||||
|
self.cursor.prepare("select 236 from dual")
|
||||||
|
self.cursor.setinputsizes(**emptyDict)
|
||||||
|
self.cursor.execute(None, emptyDict)
|
||||||
|
self.assertEqual(self.cursor.fetchall(), [(236,)])
|
||||||
|
|
||||||
|
def testSetInputSizesEmptyList(self):
|
||||||
|
"test setting input sizes with an empty list"
|
||||||
|
emptyList = {}
|
||||||
|
self.cursor.prepare("select 239 from dual")
|
||||||
|
self.cursor.setinputsizes(*emptyList)
|
||||||
|
self.cursor.execute(None, emptyList)
|
||||||
|
self.assertEqual(self.cursor.fetchall(), [(239,)])
|
||||||
|
|
||||||
def testSetInputSizesByPosition(self):
|
def testSetInputSizesByPosition(self):
|
||||||
"""test setting input sizes with positional args"""
|
"""test setting input sizes with positional args"""
|
||||||
var = self.cursor.var(cx_Oracle.STRING, 100)
|
var = self.cursor.var(cx_Oracle.STRING, 100)
|
||||||
|
|
Loading…
Reference in New Issue