diff --git a/Solr_Base_Query.php b/Solr_Base_Query.php
index 5f9cebc..31984d9 100644
--- a/Solr_Base_Query.php
+++ b/Solr_Base_Query.php
@@ -150,10 +150,11 @@ class SolrFilterSubQuery {
    * @return boolean
    */
   public static function validFilterValue($filter) {
-    $opening = 0;
-    $closing = 0;
     $name = NULL;
     $value = NULL;
+    $matches = array();
+    $datefields = array();
+    $datefield_match = array();
 
     if (preg_match('/(?P<name>[^:]+):(?P<value>.+)?$/', $filter, $matches)) {
       foreach ($matches as $match_id => $match) {
@@ -183,13 +184,15 @@ class SolrFilterSubQuery {
       $valid_brackets = TRUE;
       $brackets['opening']['{'] = substr_count($value, '{');
       $brackets['closing']['}'] = substr_count($value, '}');
-      $valid_brackets = ($brackets['opening']['{'] != $brackets['closing']['}']) ? FALSE : TRUE;
+
+      $valid_brackets = $valid_brackets && ($brackets['opening']['{'] == $brackets['closing']['}']);
       $brackets['opening']['['] = substr_count($value, '[');
       $brackets['closing'][']'] = substr_count($value, ']');
-      $valid_brackets = ($brackets['opening']['['] != $brackets['closing'][']']) ? FALSE : TRUE;
+      $valid_brackets = $valid_brackets && ($brackets['opening']['['] == $brackets['closing'][']']);
       $brackets['opening']['('] = substr_count($value, '(');
       $brackets['closing'][')'] = substr_count($value, ')');
-      $valid_brackets = ($brackets['opening']['('] != $brackets['closing'][')']) ? FALSE : TRUE;
+      $valid_brackets = $valid_brackets && ($brackets['opening']['('] == $brackets['closing'][')']);
+
       if (!$valid_brackets) {
         return FALSE;
       }
@@ -436,6 +439,7 @@ class SolrBaseQuery extends SolrFilterSubQuery implements DrupalSolrQueryInterfa
     $exclude = FALSE;
     $name = NULL;
     $value = NULL;
+    $matches = array();
 
     // Check if we are dealing with an exclude
     if (preg_match('/^-(.*)/', $string, $matches)) {
@@ -566,7 +570,13 @@ class SolrBaseQuery extends SolrFilterSubQuery implements DrupalSolrQueryInterfa
     }
     else {
       // Validate and set sort parameter
-      $fields = implode('|', array_keys($this->available_sorts));
+      $fields = array_keys($this->available_sorts);
+      // Loop through available sorts and escape them, to allow for function sorts like geodist() in the preg_match() below
+      foreach ($fields as $key => $field) {
+        $fields[$key] = preg_quote($field);
+      }
+      // Implode the escaped available sorts together, then preg_match() against the sort string
+      $fields = implode('|', $fields);
       if (preg_match('/^(?:(' . $fields . ') (asc|desc),?)+$/', $sortstring, $matches)) {
         // We only use the last match.
         $this->solrsort['#name'] = $matches[1];
@@ -574,12 +584,7 @@ class SolrBaseQuery extends SolrFilterSubQuery implements DrupalSolrQueryInterfa
         $this->params['sort'] = array($sortstring);
       }
       else {
-        watchdog(
-          'Apache Solr',
-          t('Ignoring sort %sort as it is not available to this query'),
-          array('%sort' => $sortstring),
-          WATCHDOG_WARNING
-        );
+        return FALSE;
       }
     }
   }
diff --git a/tests/solr_base_query.test b/tests/solr_base_query.test
index fec3521..47f588e 100644
--- a/tests/solr_base_query.test
+++ b/tests/solr_base_query.test
@@ -47,12 +47,24 @@ class SolrBaseQueryTests extends DrupalUnitTestCase {
     $fq = array('tid:3', 'sort_label:hello', 'tid:11', 'tid:1', 'tid:12', 'label:hello');
     // Setup dummy Solr object.
     $query = $this->_apachesolr_drupal_query("apachesolr_tests", array('q' => 'mykeys', 'fq' => $fq), 'sort_label asc', 'search/test');
-    // Check sortsort
+    // Check setSolrSort().
     $this->assertEqual(array('solrsort' => 'sort_label asc'), $query->getSolrsortUrlQuery());
     $query->setSolrsort('sort_name', 'desc');
     $this->assertEqual(array('solrsort' => 'sort_name desc'), $query->getSolrsortUrlQuery());
     $query->setSolrsort('score', 'desc');
     $this->assertEqual(array(), $query->getSolrsortUrlQuery());
+
+    // We cannot set a sort if the sort was not made available.
+    $query->setSolrsort('geodist()', 'asc');
+    $this->assertNotEqual(array('solrsort' => 'geodist() asc'), $query->getSolrsortUrlQuery(), t('Sort was not applied as it was not available'));
+
+    // Set the sort after it was made available.
+    $query->setAvailableSort('geodist()', array('title' => 'Distance', 'default' => 'asc'));
+    $query->setSolrsort('geodist()', 'asc');
+
+    $this->assertEqual(array('solrsort' => 'geodist() asc'), $query->getSolrsortUrlQuery());
+
+    // Check escaping of the setSolrSort functinality
     // Check getPath() functionality
     $this->assertEqual('search/test/mykeys', $query->getPath());
     $this->assertEqual('search/test/newkeys', $query->getPath('newkeys'));
