]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
Verbose regexp to parse placeholders
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Fri, 27 Mar 2020 06:38:35 +0000 (19:38 +1300)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Fri, 27 Mar 2020 06:38:35 +0000 (19:38 +1300)
psycopg3/utils/queries.py

index c91f5d4e0da246365372cfcd4f29923af62728ee..6088fb441ba669c8d019896c47f2972d97131eef 100644 (file)
@@ -68,13 +68,28 @@ def query2pg(query, vars, codec):
     return b"".join(rv), order
 
 
+_re_placeholder = re.compile(
+    rb"""(?x)
+        %                       # a literal %
+        (?:
+            (?:
+                \( ([^)]+) \)   # or a name in (braces)
+                .               # followed by a format
+            )
+            |
+            (?:.)               # or any char, really
+        )
+        """
+)
+
+
 def split_query(query, encoding="ascii"):
     parts = []
     cur = 0
 
     # pairs [(fragment, match)], with the last match None
     m = None
-    for m in re.finditer(rb"%(?:(?:[^(])|(?:\(([^)]+)\).)|(?:.))", query):
+    for m in _re_placeholder.finditer(query):
         pre = query[cur : m.span(0)[0]]
         parts.append([pre, m])
         cur = m.span(0)[1]