diff --git a/includes/database/database.inc b/includes/database/database.inc
index fc94e55e7a94dcd5eea1f57779b8fe8585b974a3..f05a712428fc1fea02372297db6d96d613ec2760 100644
--- a/includes/database/database.inc
+++ b/includes/database/database.inc
@@ -210,6 +210,13 @@ abstract class DatabaseConnection extends PDO {
    */
   protected $transactionClass = NULL;
 
+  /**
+   * The name of the Statement class for this connection.
+   *
+   * @var string
+   */
+  protected $statementClass = NULL;
+
   /**
    * The schema object for this connection.
    *
@@ -219,8 +226,9 @@ abstract class DatabaseConnection extends PDO {
 
   function __construct($dsn, $username, $password, $driver_options = array()) {
     // Fallback to DatabaseStatementBase if the driver has not specified one.
-    $statement_class = isset($driver_options['statement_class']) ? $driver_options['statement_class'] : 'DatabaseStatementBase';
-    unset($driver_options['statement_class']);
+    if (empty($this->statementClass)) {
+      $this->statementClass = 'DatabaseStatementBase';
+    }
 
     // Because the other methods don't seem to work right.
     $driver_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
@@ -229,8 +237,8 @@ function __construct($dsn, $username, $password, $driver_options = array()) {
     parent::__construct($dsn, $username, $password, $driver_options);
 
     // Set a specific PDOStatement class if the driver requires that.
-    if (!empty($statement_class)) {
-      $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array($statement_class, array($this)));
+    if ($this->statementClass != 'PDOStatement') {
+      $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array($this->statementClass, array($this)));
     }
   }
 
diff --git a/includes/database/mysql/database.inc b/includes/database/mysql/database.inc
index 23470abc3e236fce36b94c1a7123efcb1f50dbd9..82c96292929648d99d7877b68ea4a2ef6b577d89 100644
--- a/includes/database/mysql/database.inc
+++ b/includes/database/mysql/database.inc
@@ -13,15 +13,11 @@
 
 class DatabaseConnection_mysql extends DatabaseConnection {
 
-  protected $transactionSupport;
+  protected $transactionSupport = FALSE;
 
   public function __construct(Array $connection_options = array()) {
-
-    $connection_options += array(
-      'transactions' => FALSE,
-      'port' => 3306,
-    );
-    $this->transactionSupport = $connection_options['transactions'];
+    $this->transactionSupport = isset($connection_options['transactions']) ? $connection_options['transactions'] : FALSE;
+    $connection_options['port'] = !empty($connection_options['port']) ? $connection_options['port'] : 3306;
 
     $dsn = 'mysql:host=' . $connection_options['host'] . ';port=' . $connection_options['port'] . ';dbname=' . $connection_options['database'];
     parent::__construct($dsn, $connection_options['username'], $connection_options['password'], array(
diff --git a/includes/database/pgsql/database.inc b/includes/database/pgsql/database.inc
index 04e40322275102ceaadadd3b0c584829bd4ab6fd..6fd15b2e70bf0b21afd1017de7f6c24799bff7bf 100644
--- a/includes/database/pgsql/database.inc
+++ b/includes/database/pgsql/database.inc
@@ -13,20 +13,13 @@
 
 class DatabaseConnection_pgsql extends DatabaseConnection {
 
-  protected $transactionSupport;
+  protected $transactionSupport = TRUE;
 
   public function __construct(Array $connection_options = array()) {
+    $this->transactionSupport = isset($connection_options['transactions']) ? $connection_options['transactions'] : TRUE;
+    $connection_options['port'] = !empty($connection_options['port']) ? $connection_options['port'] : 5432;
 
-    $connection_options += array(
-      'transactions' => TRUE,
-    );
-    $this->transactionSupport = $connection_options['transactions'];
-
-    $dsn = 'pgsql:host=' . $connection_options['host'] . ' dbname=' . $connection_options['database'];
-    if (!empty($connection_options['port'])) {
-      $dsn .= ' port=' . $connection_options['port'];
-    }
-
+    $dsn = 'pgsql:host=' . $connection_options['host'] . ' dbname=' . $connection_options['database'] . ' port=' . $connection_options['port'];
     parent::__construct($dsn, $connection_options['username'], $connection_options['password'], array(
       // Convert numeric values to strings when fetching.
       PDO::ATTR_STRINGIFY_FETCHES => TRUE,
diff --git a/includes/database/sqlite/database.inc b/includes/database/sqlite/database.inc
index 7f3d521cfa14db1f6a26db26bbfd3fbcedff4ed6..2a69e131faa077c459148e7afb5a3e28dc91352a 100644
--- a/includes/database/sqlite/database.inc
+++ b/includes/database/sqlite/database.inc
@@ -27,11 +27,11 @@ class DatabaseConnection_sqlite extends DatabaseConnection {
 
   public function __construct(Array $connection_options = array()) {
     // We don't need a specific PDOStatement class here, we simulate it below.
-    $connection_options['statement_class'] = FALSE;
-
+    $this->statementClass = 'PDOStatement';
     $this->transactionSupport = isset($connection_options['transactions']) ? $connection_options['transactions'] : TRUE;
 
-    parent::__construct('sqlite:'. $connection_options['database'], '', '', array(
+    $dns = 'sqlite:'. $connection_options['database'];
+    parent::__construct($dns, '', '', array(
       // Force column names to lower case.
       PDO::ATTR_CASE => PDO::CASE_LOWER,
     ));