Defer type assignment when performing executemany() until the last possible
moment if the value being bound in is null as suggested by Dragos Dociu.
This commit is contained in:
parent
31ad9cd9c6
commit
236e494456
23
Cursor.c
23
Cursor.c
@ -828,7 +828,8 @@ static int Cursor_SetBindVariableHelper(
|
|||||||
unsigned arrayPos, // array position to set
|
unsigned arrayPos, // array position to set
|
||||||
PyObject *value, // value to bind
|
PyObject *value, // value to bind
|
||||||
udt_Variable *origVar, // original variable bound
|
udt_Variable *origVar, // original variable bound
|
||||||
udt_Variable **newVar) // new variable to be bound
|
udt_Variable **newVar, // new variable to be bound
|
||||||
|
int deferTypeAssignment) // defer type assignment if null?
|
||||||
{
|
{
|
||||||
int isValueVar;
|
int isValueVar;
|
||||||
|
|
||||||
@ -887,8 +888,9 @@ static int Cursor_SetBindVariableHelper(
|
|||||||
Py_XDECREF((*newVar)->boundName);
|
Py_XDECREF((*newVar)->boundName);
|
||||||
(*newVar)->boundName = NULL;
|
(*newVar)->boundName = NULL;
|
||||||
|
|
||||||
// otherwise, create a new variable
|
// otherwise, create a new variable, unless the value is None and
|
||||||
} else {
|
// we wish to defer type assignment
|
||||||
|
} else if (value != Py_None || !deferTypeAssignment) {
|
||||||
*newVar = Variable_NewByValue(self, value, numElements);
|
*newVar = Variable_NewByValue(self, value, numElements);
|
||||||
if (!*newVar)
|
if (!*newVar)
|
||||||
return -1;
|
return -1;
|
||||||
@ -910,7 +912,8 @@ static int Cursor_SetBindVariables(
|
|||||||
udt_Cursor *self, // cursor to perform binds on
|
udt_Cursor *self, // cursor to perform binds on
|
||||||
PyObject *parameters, // parameters to bind
|
PyObject *parameters, // parameters to bind
|
||||||
unsigned numElements, // number of elements to create
|
unsigned numElements, // number of elements to create
|
||||||
unsigned arrayPos) // array position to set
|
unsigned arrayPos, // array position to set
|
||||||
|
int deferTypeAssignment) // defer type assignment if null?
|
||||||
{
|
{
|
||||||
int i, origBoundByPos, origNumParams, boundByPos, numParams;
|
int i, origBoundByPos, origNumParams, boundByPos, numParams;
|
||||||
PyObject *key, *value, *origVar;
|
PyObject *key, *value, *origVar;
|
||||||
@ -957,7 +960,8 @@ static int Cursor_SetBindVariables(
|
|||||||
origVar = NULL;
|
origVar = NULL;
|
||||||
} else origVar = NULL;
|
} else origVar = NULL;
|
||||||
if (Cursor_SetBindVariableHelper(self, numElements, arrayPos,
|
if (Cursor_SetBindVariableHelper(self, numElements, arrayPos,
|
||||||
value, (udt_Variable*) origVar, &newVar) < 0)
|
value, (udt_Variable*) origVar, &newVar,
|
||||||
|
deferTypeAssignment) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
if (newVar) {
|
if (newVar) {
|
||||||
if (i < PyList_GET_SIZE(self->bindVariables)) {
|
if (i < PyList_GET_SIZE(self->bindVariables)) {
|
||||||
@ -983,7 +987,8 @@ static int Cursor_SetBindVariables(
|
|||||||
while (PyDict_Next(parameters, &pos, &key, &value)) {
|
while (PyDict_Next(parameters, &pos, &key, &value)) {
|
||||||
origVar = PyDict_GetItem(self->bindVariables, key);
|
origVar = PyDict_GetItem(self->bindVariables, key);
|
||||||
if (Cursor_SetBindVariableHelper(self, numElements, arrayPos,
|
if (Cursor_SetBindVariableHelper(self, numElements, arrayPos,
|
||||||
value, (udt_Variable*) origVar, &newVar) < 0)
|
value, (udt_Variable*) origVar, &newVar,
|
||||||
|
deferTypeAssignment) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
if (newVar) {
|
if (newVar) {
|
||||||
if (PyDict_SetItem(self->bindVariables, key,
|
if (PyDict_SetItem(self->bindVariables, key,
|
||||||
@ -1472,7 +1477,8 @@ static PyObject *Cursor_Execute(
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
// perform binds
|
// perform binds
|
||||||
if (executeArgs && Cursor_SetBindVariables(self, executeArgs, 1, 0) < 0)
|
if (executeArgs && Cursor_SetBindVariables(self, executeArgs, 1, 0,
|
||||||
|
0) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (Cursor_PerformBind(self) < 0)
|
if (Cursor_PerformBind(self) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -1547,7 +1553,8 @@ static PyObject *Cursor_ExecuteMany(
|
|||||||
"expecting a list of dictionaries or sequences");
|
"expecting a list of dictionaries or sequences");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (Cursor_SetBindVariables(self, arguments, numRows, i) < 0)
|
if (Cursor_SetBindVariables(self, arguments, numRows, i,
|
||||||
|
(i < numRows - 1)) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (Cursor_PerformBind(self) < 0)
|
if (Cursor_PerformBind(self) < 0)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user