diff --git a/includes/database/pgsql/query.inc b/includes/database/pgsql/query.inc
index 9902b16..0852fdb 100644
--- a/includes/database/pgsql/query.inc
+++ b/includes/database/pgsql/query.inc
@@ -174,6 +174,13 @@ class UpdateQuery_pgsql extends UpdateQuery {
           $stmt->bindParam($placeholder, $data['arguments'][$placeholder]);
         }
       }
+      if ($data['expression'] instanceof SelectQueryInterface) {
+        $data['expression']->compile($this->connection, $this);
+        $select_query_arguments = $data['expression']->arguments();
+        foreach ($selectQueryArguments as $placeholder => $argument ){
+          $stmt->bindParam($placeholder, $select_query_arguments[$placeholder]);
+        }
+      }
       unset($fields[$field]);
     }
 
diff --git a/includes/database/query.inc b/includes/database/query.inc
index 8af91c2..0ba9802 100644
--- a/includes/database/query.inc
+++ b/includes/database/query.inc
@@ -1159,6 +1159,10 @@ class UpdateQuery extends Query implements QueryConditionInterface {
       if (!empty($data['arguments'])) {
         $update_values += $data['arguments'];
       }
+      if ($data['expression'] instanceof SelectQueryInterface) {
+        $data['expression']->compile($this->connection, $this);
+        $update_values += $data['expression']->arguments();
+      }
       unset($fields[$field]);
     }
 
@@ -1192,6 +1196,11 @@ class UpdateQuery extends Query implements QueryConditionInterface {
     $fields = $this->fields;
     $update_fields = array();
     foreach ($this->expressionFields as $field => $data) {
+      if ($data['expression'] instanceof SelectQueryInterface) {
+        // Compile and cast expression subquery to a string.
+        $data['expression']->compile($this->connection, $this);
+        $data['expression'] = ' (' . $data['expression'] . ')';
+      }
       $update_fields[] = $field . '=' . $data['expression'];
       unset($fields[$field]);
     }
diff --git a/modules/simpletest/tests/database_test.test b/modules/simpletest/tests/database_test.test
index dba04b2..b17d592 100644
--- a/modules/simpletest/tests/database_test.test
+++ b/modules/simpletest/tests/database_test.test
@@ -1011,6 +1011,29 @@ class DatabaseUpdateComplexTestCase extends DatabaseTestCase {
     $after_age = db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'Ringo'))->fetchField();
     $this->assertEqual($before_age + 4, $after_age, 'Age updated correctly');
   }
+
+  /**
+   * Test UPDATE with a subselect value.
+   */
+  function testSubSelectUpdate() {
+    $subselect = db_select('test_task', 't');
+    $subselect->addExpression('MAX(priority) + :increment', 'max_priority', array(':increment' => 30));
+    // Clone this to make sure we are running a different query when
+    // asserting.
+    $select = clone $subselect;
+    $query = db_update('test')
+      ->expression('age', $subselect)
+      ->condition('name', 'Ringo');
+    // Save the query for a __toString test later.
+    $string_test = $query;
+    $query->execute();
+    $after_age = db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'Ringo'))->fetchField();
+    $expected_age = $select->execute()->fetchField();
+    $this->assertEqual($after_age, $expected_age);
+    // Replace whitespace with a single space.
+    $query_string = preg_replace('/\s+/', ' ', $string_test);
+    $this->assertIdentical('UPDATE {test} SET age= (SELECT MAX(priority) + :increment AS max_priority FROM {test_task} t) WHERE (name = :db_condition_placeholder_0)', trim($query_string));
+  }
 }
 
 /**
