sqlmapproject/sqlmap · error · OracleUndecided

oracle could not decide

Error message

oracle could not decide: %s

What it means

OracleUndecided from _ask (quorum<=1 path): the single probe returned None (persistent error / unobservable condition). The oracle never manufactures False from an unobservable probe because that would corrupt blind bisection; absent a quorum this is fatal to the current decision.

Solutions

  1. Increase retries so transient errors are re-probed
  2. Raise quorum to enable majority voting
  3. Fix the underlying request failure (blocked request, timeout, WAF)
Defensive patterns

Strategy: retry

When it happens

Trigger: Thrown at extra/esperanto/oracle.py:88 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of sqlmapproject/sqlmap@0a35b20e39 (2026-08-26). Data as JSON: /api/errors/af73d69677b63c34. Report an issue: GitHub.

Appendix: source

Thrown at extra/esperanto/oracle.py:88

    def _ask(self, condition):
        # decided boolean, or raise OracleUndecided - NEVER manufacture False from an
        # unobservable probe (that would silently corrupt blind bisection). the oracle
        # must itself return False for unsupported/rejected SQL; a raised probe means
        # "could not observe" and, absent a quorum, is fatal.
        if self.quorum <= 1:
            r = self._probe(condition)
            if self.verbose:
                print("  [%s] %s" % ("T" if r else ("E" if r is None else "f"), condition))
            if r is None:
                # while laddering CANDIDATE rungs an undecidable/erroring probe (oracle
                # returned None OR raised - both surface here as None) means "this rung is
                # unusable", so read it as False and let the ladder move on; only OUTSIDE
                # probing (reading committed data) is it fatal, so a flaky read never
                # silently coerces to a definite bit
                if self._probing:
                    return False
                self._errors += 1
                raise OracleUndecided("oracle could not decide: %s" % condition)
            return r

        samples = 2 * self.quorum - 1
        yes = no = tries = 0
        while (yes + no) < samples and tries < samples + self.quorum + 2:
            tries += 1
            r = self._probe(condition)
            if r is None:
                self._errors += 1
                continue
            yes, no = (yes + 1, no) if r else (yes, no + 1)
            if yes >= self.quorum or no >= self.quorum:
                break
        if self.verbose:
            state = "T" if yes >= self.quorum else ("f" if no >= self.quorum else "E")
            print("  [%s %d:%d] %s" % (state, yes, no, condition))
        if yes >= self.quorum:
            return True

View on GitHub (pinned to 0a35b20e39)