def _execute_statement()

in awswrangler/data_api/rds.py [0:0]


    def _execute_statement(self, sql: str, database: Optional[str] = None) -> str:
        if database is None:
            database = self.database

        sleep: float = self.wait_config.sleep
        total_tries: int = 0
        total_sleep: float = 0
        response: Optional[Dict[str, Any]] = None
        last_exception: Optional[Exception] = None
        while total_tries < self.wait_config.retries:
            try:
                response = self.client.execute_statement(
                    resourceArn=self.resource_arn,
                    database=database,
                    sql=sql,
                    secretArn=self.secret_arn,
                    includeResultMetadata=True,
                )
                self.logger.debug(
                    "Response received after %s tries and sleeping for a total of %s seconds", total_tries, total_sleep
                )
                break
            except self.client.exceptions.BadRequestException as exception:
                last_exception = exception
                total_sleep += sleep
                self.logger.debug("BadRequestException occurred: %s", exception)
                self.logger.debug(
                    "Cluster may be paused - sleeping for %s seconds for a total of %s before retrying",
                    sleep,
                    total_sleep,
                )
                time.sleep(sleep)
                total_tries += 1
                sleep *= self.wait_config.backoff

        if response is None:
            self.logger.exception("Maximum BadRequestException retries reached for query %s", sql)
            raise self.client.exceptions.BadRequestException(
                f"Query failed - BadRequestException received after {total_tries} tries and sleeping {total_sleep}s"
            ) from last_exception

        request_id: str = uuid.uuid4().hex
        self.results[request_id] = response
        return request_id