Index: wp-includes/query.php
===================================================================
--- wp-includes/query.php	(revision 15513)
+++ wp-includes/query.php	(working copy)
@@ -2301,10 +2301,25 @@
 		if ( ! empty($q['meta_key']) )
 			$where .= $wpdb->prepare(" AND $wpdb->postmeta.meta_key = %s ", $q['meta_key']);
 		if ( ! empty($q['meta_value']) ) {
-			if ( empty($q['meta_compare']) || ! in_array($q['meta_compare'], array('=', '!=', '>', '>=', '<', '<=')) )
+			$q['meta_compare'] = strtoupper($q['meta_compare']);
+			if ( empty($q['meta_compare']) || ! in_array($q['meta_compare'], array('=', '!=', '>', '>=', '<', '<=', 'IN', 'BETWEEN')) )
 				$q['meta_compare'] = '=';
-
-			$where .= $wpdb->prepare("AND $wpdb->postmeta.meta_value {$q['meta_compare']} %s ", $q['meta_value']);
+			if ( in_array($q['meta_compare'], array('IN', 'BETWEEN') ) ) {
+				if ( !is_array($q['meta_value']) )
+					$q['meta_value'] = preg_split('/[,\s]+/', $q['meta_value']);
+			}
+			if ( 'IN' ==  $q['meta_compare'] ) {
+				$meta_field_types = substr(str_repeat(',%s', count($q['meta_value'])), 1);
+				$meta_compare_string = "($meta_field_types)";
+				unset($meta_field_types);
+			} elseif ( 'BETWEEN' ==  $q['meta_compare'] ) {
+				$q['meta_value'] = array_slice( $q['meta_value'], 0, 2 );
+				$meta_compare_string = '%s AND %s';
+			} else {
+				$meta_compare_string = '%s';
+			}
+			$where .= $wpdb->prepare("AND $wpdb->postmeta.meta_value {$q['meta_compare']} {$meta_compare_string} ", $q['meta_value']);
+			unset($meta_compare_string);
 		}
 
 		// Apply filters on where and join prior to paging so that any
