From 0d6d9c149110fda22b3a8981cf92d7c2d04823e8 Mon Sep 17 00:00:00 2001 From: MarkReedZ Date: Sat, 29 Mar 2025 20:05:55 -0700 Subject: [PATCH] FIX: VALUES syntax deprecation regex --- asyncmy/cursors.pyx | 2 +- tests/test_cursor.py | 40 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/asyncmy/cursors.pyx b/asyncmy/cursors.pyx index 1c65b8f..7a1cd5e 100644 --- a/asyncmy/cursors.pyx +++ b/asyncmy/cursors.pyx @@ -11,7 +11,7 @@ from . import errors RE_INSERT_VALUES = re.compile( r"\s*((?:INSERT|REPLACE)\b.+\bVALUES?\s*)" + r"(\(\s*(?:%s|%\(.+\)s)\s*(?:,\s*(?:%s|%\(.+\)s)\s*)*\))" - + r"(\s*(?:ON DUPLICATE.*)?);?\s*\Z", + + r"(\s*(?:(?:AS|ON DUPLICATE).*)?);?\s*\Z", re.IGNORECASE | re.DOTALL, ) logger = logging.getLogger(__package__) diff --git a/tests/test_cursor.py b/tests/test_cursor.py index 185ff61..c476ed2 100644 --- a/tests/test_cursor.py +++ b/tests/test_cursor.py @@ -4,7 +4,7 @@ import pytest -from asyncmy.cursors import DictCursor +from asyncmy.cursors import DictCursor, RE_INSERT_VALUES @pytest.mark.asyncio @@ -140,3 +140,41 @@ async def test_insert_enum(connection): ), ) assert rows == 1 + + +def test_executemany_regex(): + query = "INSERT INTO foo (bar, baz) VALUES (%s, %s)" + match = RE_INSERT_VALUES.match(query) + assert match is not None + assert match.group(1) == "INSERT INTO foo (bar, baz) VALUES " + assert match.group(2) == "(%s, %s)" + assert match.group(3) == "" + + # Deprecated VALUES syntax + query = "INSERT INTO foo (bar, baz) VALUES (%s, %s) ON DUPLICATE KEY UPDATE baz=VALUES(baz)" + match = RE_INSERT_VALUES.match(query) + assert match is not None + assert match.group(1) == "INSERT INTO foo (bar, baz) VALUES " + assert match.group(2) == "(%s, %s)" + assert match.group(3) == " ON DUPLICATE KEY UPDATE baz=VALUES(baz)" + + # The new syntax + query = "INSERT INTO foo (bar, baz) VALUES (%s, %s) AS new ON DUPLICATE KEY UPDATE baz=new.baz" + match = RE_INSERT_VALUES.match(query) + assert match is not None + assert match.group(1) == "INSERT INTO foo (bar, baz) VALUES " + assert match.group(2) == "(%s, %s)" + assert match.group(3) == " AS new ON DUPLICATE KEY UPDATE baz=new.baz" + + # Test REPLACE VALUES + query = "REPLACE INTO foo (bar, baz, aa, bb) VALUES (%s, %s, %s, %s)" + match = RE_INSERT_VALUES.match(query) + assert match is not None + assert match.group(1) == "REPLACE INTO foo (bar, baz, aa, bb) VALUES " + assert match.group(2) == "(%s, %s, %s, %s)" + assert match.group(3) == "" + + # Test invalid queries + query = "INSERT INTO foo (bar, baz) VALUES (%s, %s), (%s, %s)" + match = RE_INSERT_VALUES.match(query) + assert match is None