From 076d69533d83caddf172759efcef9da23582745f Mon Sep 17 00:00:00 2001 From: Denis Laxalde Date: Mon, 18 Oct 2021 11:31:33 +0200 Subject: [PATCH] Add a check_results() method to PrepareManager --- psycopg/psycopg/_preparing.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/psycopg/psycopg/_preparing.py b/psycopg/psycopg/_preparing.py index c90512e32..63b84e62a 100644 --- a/psycopg/psycopg/_preparing.py +++ b/psycopg/psycopg/_preparing.py @@ -113,6 +113,20 @@ class PrepareManager: value: Value = name if prep is Prepare.SHOULD else 1 return key, value + @staticmethod + def check_results(results: Sequence["PGresult"]) -> bool: + """Return False if 'results' are invalid for prepared statement cache.""" + if len(results) != 1: + # We cannot prepare a multiple statement + return False + + status = results[0].status + if ExecStatus.COMMAND_OK != status != ExecStatus.TUPLES_OK: + # We don't prepare failed queries or other weird results + return False + + return True + def maintain( self, query: PostgresQuery, @@ -134,13 +148,7 @@ class PrepareManager: return None # The query is not in cache. Let's see if we must add it - if len(results) != 1: - # We cannot prepare a multiple statement - return None - - status = results[0].status - if ExecStatus.COMMAND_OK != status != ExecStatus.TUPLES_OK: - # We don't prepare failed queries or other weird results + if not self.check_results(results): return None # Ok, we got to the conclusion that this query is genuinely to prepare -- 2.47.2