105105InternalError = pglib .InternalError
106106ProgrammingError = pglib .ProgrammingError
107107OperationalError = pglib .OperationalError
108- DatabaseError = pglib .DatabaseError
109108
110109
111110class ProcessProxy (object ):
@@ -653,7 +652,7 @@ def get_control_data(self):
653652
654653return out_dict
655654
656- def slow_start (self ,replica = False ,dbname = 'template1' ,username = 'dev' ):
655+ def slow_start (self ,replica = False ,dbname = 'template1' ,username = default_username () ):
657656"""
658657 Starts the PostgreSQL instance and then polls the instance
659658 until it reaches the expected state (primary or replica). The state is checked
@@ -673,14 +672,12 @@ def slow_start(self, replica=False, dbname='template1', username='dev'):
673672query = 'SELECT not pg_is_in_recovery()'
674673# Call poll_query_until until the expected value is returned
675674self .poll_query_until (query = query ,
676- expected = False ,
677675dbname = dbname ,
678676username = username ,
679677suppress = {InternalError ,
680678QueryException ,
681679ProgrammingError ,
682- OperationalError ,
683- DatabaseError })
680+ OperationalError })
684681
685682def start (self ,params = [],wait = True ):
686683"""
@@ -970,7 +967,7 @@ def psql(self,
970967return process .returncode ,out ,err
971968
972969@method_decorator (positional_args_hack (['dbname' ,'query' ]))
973- def safe_psql (self ,query = None ,** kwargs ):
970+ def safe_psql (self ,query = None ,expect_error = False , ** kwargs ):
974971"""
975972 Execute a query using psql.
976973
@@ -980,6 +977,8 @@ def safe_psql(self, query=None, **kwargs):
980977 dbname: database name to connect to.
981978 username: database user name.
982979 input: raw input to be passed.
980+ expect_error: if True - fail if we didn't get ret
981+ if False - fail if we got ret
983982
984983 **kwargs are passed to psql().
985984
@@ -992,7 +991,12 @@ def safe_psql(self, query=None, **kwargs):
992991
993992ret ,out ,err = self .psql (query = query ,** kwargs )
994993if ret :
995- raise QueryException ((err or b'' ).decode ('utf-8' ),query )
994+ if expect_error :
995+ out = (err or b'' ).decode ('utf-8' )
996+ else :
997+ raise QueryException ((err or b'' ).decode ('utf-8' ),query )
998+ elif expect_error :
999+ assert False ,f"Exception was expected, but query finished successfully: `{ query } ` "
9961000
9971001return out
9981002
@@ -1139,7 +1143,7 @@ def poll_query_until(self,
11391143elif expected is None :
11401144return # done
11411145
1142- except tuple (suppress or []):
1146+ except tuple (suppress or [])as e :
11431147pass # we're suppressing them
11441148
11451149time .sleep (sleep_time )