From: Daniele Varrazzo Date: Fri, 27 Mar 2020 06:38:35 +0000 (+1300) Subject: Verbose regexp to parse placeholders X-Git-Tag: 3.0.dev0~670 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e7889d4e0f1060c4dd5731f20a57f21c84a0e65f;p=thirdparty%2Fpsycopg.git Verbose regexp to parse placeholders --- diff --git a/psycopg3/utils/queries.py b/psycopg3/utils/queries.py index c91f5d4e0..6088fb441 100644 --- a/psycopg3/utils/queries.py +++ b/psycopg3/utils/queries.py @@ -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]