diff --git a/wp-includes/query.php b/wp-includes/query.php
index 04286aa..1a03834 100644
--- a/wp-includes/query.php
+++ b/wp-includes/query.php
@@ -2039,7 +2039,18 @@ class WP_Query {
 				$fields = "$wpdb->posts.ID, $wpdb->posts.post_parent";
 				break;
 			default:
-				$fields = "$wpdb->posts.*";
+				if ( is_array( $q['fields'] ) ) {
+					$_fields = array();
+					foreach ( $q['fields'] as $field ) {
+						if ( false === strpos( $field, '.' ) )
+							$_fields[] = "$wpdb->posts.$field";
+						else
+							$_fields[] = $field;
+					}
+					$fields = join( ', ', $_fields );
+				} else {	
+					$fields = "$wpdb->posts.*";
+				}
 		}
 
 		if ( '' !== $q['menu_order'] )
@@ -2667,6 +2678,14 @@ class WP_Query {
 			return $r;
 		}
 
+		if ( is_array( $q['fields'] ) ) {
+			$this->posts = $wpdb->get_results( $this->request );
+			$this->post_count = count( $this->posts );
+			$this->set_found_posts( $q, $limits );
+			
+			return $this->posts;
+		}
+		
 		$split_the_query = ( $old_request == $this->request && "$wpdb->posts.*" == $fields && !empty( $limits ) && $q['posts_per_page'] < 500 );
 		$split_the_query = apply_filters( 'split_the_query', $split_the_query, $this );
 
