--- includes/Block.php~ 2005-02-03 22:07:20.000000000 +0100 +++ includes/Block.php 2005-02-03 22:07:20.000000000 +0100 @@ -81,10 +81,17 @@ $sql = "SELECT * FROM $ipblocks WHERE ipb_user={$user} $options"; } elseif ($user=="") { $sql = "SELECT * FROM $ipblocks WHERE ipb_address='" . $db->strencode( $address ) . "' $options"; - } else { - $sql = "SELECT * FROM $ipblocks WHERE (ipb_address='" . $db->strencode( $address ) . - "' OR ipb_user={$user}) $options"; - } + } elseif ( $options=='' ) { + # If there are no options (e.g. FOR UPDATE), use a UNION + # so that the query can make efficient use of indices + $sql = "SELECT * FROM $ipblocks WHERE ipb_address='" . $db->strencode( $address ) . + "' UNION SELECT * FROM $ipblocks WHERE ipb_user={$user}"; + } else { + # If there are options, a UNION can not be used, use one + # SELECT instead. Will do a full table scan. + $sql = "SELECT * FROM $ipblocks WHERE (ipb_address='" . $db->strencode( $address ) . + "' OR ipb_user={$user}) $options"; + } $res = $db->query( $sql, $fname ); if ( 0 == $db->numRows( $res ) ) {