  A relational database is said to be uncertain if primary key constraints can
possibly be violated. A repair (or possible world) of an uncertain database is
obtained by selecting a maximal number of tuples without ever selecting two
distinct tuples with the same primary key value. For any Boolean query q,
CERTAINTY(q) is the problem that takes an uncertain database db on input, and
asks whether q is true in every repair of db. The complexity of this problem
has been particularly studied for q ranging over the class of self-join-free
Boolean conjunctive queries. A research challenge is to determine, given q,
whether CERTAINTY(q) belongs to complexity classes FO, P, or coNP-complete. In
this paper, we combine existing techniques for studying the above complexity
classification task. We show that for any self-join-free Boolean conjunctive
query q, it can be decided whether or not CERTAINTY(q) is in FO. Further, for
any self-join-free Boolean conjunctive query q, CERTAINTY(q) is either in P or
coNP-complete, and the complexity dichotomy is effective. This settles a
research question that has been open for ten years, since [9].
