Index: wp-includes/query.php
===================================================================
--- wp-includes/query.php	(revision 18616)
+++ wp-includes/query.php	(working copy)
@@ -1940,6 +1940,7 @@
 		$fields = '';
 		$post_status_join = false;
 		$page = 1;
+		$expand_ids = false;
 
 		if ( isset( $q['caller_get_posts'] ) ) {
 			_deprecated_argument( 'WP_Query', '3.1', __( '"caller_get_posts" is deprecated. Use "ignore_sticky_posts" instead.' ) );
@@ -2026,7 +2027,8 @@
 				$fields = "$wpdb->posts.ID, $wpdb->posts.post_parent";
 				break;
 			default:
-				$fields = "$wpdb->posts.*";
+				$fields = "$wpdb->posts.ID";
+				$expand_ids = true;
 		}
 
 		// If a month is specified in the querystring, load that month
@@ -2606,11 +2608,20 @@
 
 		if ( 'ids' == $q['fields'] ) {
 			$this->posts = $wpdb->get_col($this->request);
-
 			return $this->posts;
-		}
+		} elseif($expand_ids) {
+			$ids = $wpdb->get_col($this->request);
 
-		if ( 'id=>parent' == $q['fields'] ) {
+			if ( !$q['no_found_rows'] && !empty($limits) ) {
+				$found_posts_query = apply_filters_ref_array( 'found_posts_query', array( 'SELECT FOUND_ROWS()', &$this ) );
+				$this->found_posts = $wpdb->get_var( $found_posts_query );
+				$this->found_posts = apply_filters_ref_array( 'found_posts', array( $this->found_posts, &$this ) );
+				$this->max_num_pages = ceil($this->found_posts / $q['posts_per_page']);
+			}
+
+			$query = sprintf("SELECT $wpdb->posts.* FROM $wpdb->posts WHERE ID IN (%s) $orderby", join(",", $ids));
+			$this->posts = $wpdb->get_results($query);			
+		} elseif ( 'id=>parent' == $q['fields'] ) {
 			$this->posts = $wpdb->get_results($this->request);
 
 			$r = array();
@@ -2618,10 +2629,10 @@
 				$r[ $post->ID ] = $post->post_parent;
 
 			return $r;
+		} else {
+			$this->posts = $wpdb->get_results($this->request);
 		}
 
-		$this->posts = $wpdb->get_results($this->request);
-
 		// Raw results filter.  Prior to status checks.
 		if ( !$q['suppress_filters'] )
 			$this->posts = apply_filters_ref_array('posts_results', array( $this->posts, &$this ) );
@@ -2639,7 +2650,7 @@
 			$this->comment_count = count($this->comments);
 		}
 
-		if ( !$q['no_found_rows'] && !empty($limits) ) {
+		if ( !$q['no_found_rows'] && !empty($limits) && !$expand_ids ) {
 			$found_posts_query = apply_filters_ref_array( 'found_posts_query', array( 'SELECT FOUND_ROWS()', &$this ) );
 			$this->found_posts = $wpdb->get_var( $found_posts_query );
 			$this->found_posts = apply_filters_ref_array( 'found_posts', array( $this->found_posts, &$this ) );
