Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion lib/mysql/connector/cursor.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@
b''';(?=(?:[^"'`]*["'`][^"'`]*["'`])*[^"'`]*$)''')
RE_SQL_FIND_PARAM = re.compile(
b'''%s(?=(?:[^"'`]*["'`][^"'`]*["'`])*[^"'`]*$)''')
RE_SQL_PYTHON_REPLACE_PARAM = re.compile('%\(.*?\)s')
RE_SQL_PYTHON_CAPTURE_PARAM_NAME = re.compile('%\((.*?)\)s')

ERR_NO_RESULT_TO_FETCH = "No result set to fetch from"

Expand Down Expand Up @@ -1076,7 +1078,7 @@ def _handle_result(self, res):
self._connection.unread_result = True
self._have_result = True

def execute(self, operation, params=(), multi=False): # multi is unused
def execute(self, operation, params=None, multi=False): # multi is unused
"""Prepare and execute a MySQL Prepared Statement

This method will preare the given operation and execute it using
Expand All @@ -1085,6 +1087,16 @@ def execute(self, operation, params=(), multi=False): # multi is unused
If the cursor instance already had a prepared statement, it is
first closed.
"""
if type(params) == dict:
query_replacement_keys = re.findall(RE_SQL_PYTHON_CAPTURE_PARAM_NAME, operation)
operation = re.sub(RE_SQL_PYTHON_REPLACE_PARAM, '?', operation)
if len(params) != len(query_replacement_keys):
raise errors.ProgrammingError(
"Not all parameters were used in the SQL statement")

#Replace params dict with params tuple in correct order.
params = tuple([ params[key] for key in query_replacement_keys])

if operation is not self._executed:
if self._prepared:
self._connection.cmd_stmt_close(self._prepared['statement_id'])
Expand Down