? sites/default/files
? sites/default/settings.php
Index: includes/database/database.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/database/database.inc,v
retrieving revision 1.34
diff -u -p -r1.34 database.inc
--- includes/database/database.inc	12 Dec 2008 16:21:58 -0000	1.34
+++ includes/database/database.inc	20 Dec 2008 04:15:16 -0000
@@ -309,7 +309,7 @@ abstract class DatabaseConnection extend
    * Queries sent to Drupal should wrap all table names in curly brackets. This
    * function searches for this syntax and adds Drupal's table prefix to all
    * tables, allowing Drupal to coexist with other systems in the same database
-   * if necessary.
+   * and/or schema if necessary.
    *
    * @param $sql
    *   A string containing a partial or entire SQL query.
@@ -353,7 +353,7 @@ abstract class DatabaseConnection extend
    *   A PDO prepared statement ready for its execute() method.
    */
   protected function prepareQuery($query) {
-    $query = self::prefixTables($query);
+    $query = $this->prefixTables($query);
     if (empty($this->preparedStatements[$query])) {
       // Call PDO::prepare.
       $this->preparedStatements[$query] = parent::prepare($query);
Index: includes/database/schema.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/database/schema.inc,v
retrieving revision 1.5
diff -u -p -r1.5 schema.inc
--- includes/database/schema.inc	3 Dec 2008 16:32:21 -0000	1.5
+++ includes/database/schema.inc	20 Dec 2008 04:15:17 -0000
@@ -125,14 +125,66 @@ abstract class DatabaseSchema {
   }
 
   /**
+   * Build a condition to match a table name against a standard information_schema.
+   *
+   * @param $table_name
+   *   The name of the table to explode.
+   * @param $operator
+   *   The operator to apply on the 'table' part of the condition.
+   * @return
+   *   A DatabaseCondition object.
+   */
+  protected function buildTableNameCondition($table_name, $operator = '=') {
+    $info = Database::getConnectionInfo();
+
+    if (strpos($table_name, '.')) {
+      list($schema, $table_name) = explode('.', $table_name);
+    }
+    else {
+      $schema = 'public';
+    }
+
+    $condition = db_and()
+      ->condition('table_catalog', $info['default']['database'])
+      ->condition('table_schema', $schema)
+      ->condition('table_name', $table_name, $operator);
+    return $condition;
+  }
+
+  /**
    * Check if a table exists.
    */
-  abstract public function tableExists($table);
+  public function tableExists($table) {
+    $condition = $this->buildTableNameCondition($this->connection->prefixTables('{' . $table . '}'));
+    $condition->compile($this->connection);
+    return db_query("SELECT table_name FROM information_schema.tables WHERE " . (string) $condition, $condition->arguments())->fetchField();
+  }
+
+  /**
+   * Find all tables that are like the specified base table name.
+   *
+   * @param $table_expression
+   *   An SQL expression, for example "simpletest%" (without the quotes).
+   *   BEWARE: this is not prefixed, the caller should take care of that.
+   * @return
+   *   Array, both the keys and the values are the matching tables.
+   */
+  public function findTables($table_expression) {
+    $condition = $this->buildTableNameCondition($table_expression, 'LIKE');
+    $condition->compile($this->connection);
+    return db_query("SELECT table_name FROM information_schema.tables WHERE " . (string) $condition, $condition->arguments())->fetchAllKeyed(0, 0);
+  }
 
   /**
    * Check if a column exists in the given table.
    */
-  abstract public function columnExists($table, $column);
+  public function columnExists($table, $column) {
+    $condition = $this->buildTableNameCondition($this->connection->prefixTables('{' . $table . '}'));
+    $condition->condition('column_name', $column);
+    $condition->compile($this->connection);
+
+    return db_query("SELECT column_name FROM information_schema.columns WHERE " . (string) $condition, $condition->arguments())->fetchAllKeyed(0, 0);
+  }
 
   /**
    * This maps a generic data type in combination with its data size
@@ -404,25 +456,6 @@ abstract class DatabaseSchema {
     }
     return $ret;
   }
-
-  /**
-   * Find all tables that are like the specified base table name.
-   *
-   * @param $table_expression
-   *   An SQL expression, for example "simpletest%" (without the quotes).
-   *   BEWARE: this is not prefixed, the caller should take care of that.
-   * @return
-   *   Array, both the keys and the values are the matching tables.
-   */
-  public function findTables($table_expression) {
-    global $db_prefix;
-    $info = Database::getConnectionInfo();
-    $result = db_query("SELECT table_name FROM information_schema.tables WHERE table_schema = :database AND table_name LIKE :table_name", array(
-      ':database' => $info['default']['database'],
-      ':table_name' => $table_expression,
-    ));
-    return $result->fetchAllKeyed(0, 0);
-  }
 }
 
 /**
Index: includes/database/mysql/schema.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/database/mysql/schema.inc,v
retrieving revision 1.7
diff -u -p -r1.7 schema.inc
--- includes/database/mysql/schema.inc	2 Dec 2008 19:45:01 -0000	1.7
+++ includes/database/mysql/schema.inc	20 Dec 2008 04:15:17 -0000
@@ -14,14 +14,21 @@
 
 class DatabaseSchema_mysql extends DatabaseSchema {
 
-  public function tableExists($table) {
-    return (bool) $this->connection->query("SHOW TABLES LIKE '{" . $table . "}'", array(), array())->fetchField();
-  }
+  protected function buildTableNameCondition($table_name, $operator = '=') {
+    $info = Database::getConnectionInfo();
 
-  public function columnExists($table, $column) {
-    return (bool) $this->connection->query("SHOW COLUMNS FROM {" . $this->connection->escapeTable($table) . "} LIKE '" . $this->connection->escapeTable($column) . "'", array(), array())->fetchField();
-  }
+    if (strpos($table_name, '.')) {
+      list($schema, $table_name) = explode('.', $table_name);
+    }
+    else {
+      $schema = $info['default']['database'];
+    }
 
+    $condition = db_and()
+      ->condition('table_schema', $schema)
+      ->condition('table_name', $table_name), $operator);
+    return $condition;
+  }
 
   /**
    * Generate SQL to create a new table from a Drupal schema definition.
Index: includes/database/pgsql/schema.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/database/pgsql/schema.inc,v
retrieving revision 1.3
diff -u -p -r1.3 schema.inc
--- includes/database/pgsql/schema.inc	26 Nov 2008 13:42:25 -0000	1.3
+++ includes/database/pgsql/schema.inc	20 Dec 2008 04:15:18 -0000
@@ -13,14 +13,6 @@
 
 class DatabaseSchema_pgsql extends DatabaseSchema {
 
-  public function tableExists($table) {
-    return (bool) db_result(db_query("SELECT COUNT(*) FROM pg_class WHERE relname = '{" . db_escape_table($table) . "}'"));
-  }
-
-  public function columnExists($table, $column) {
-    return (bool) db_result(db_query("SELECT COUNT(pg_attribute.attname) FROM pg_class, pg_attribute WHERE pg_attribute.attrelid = pg_class.oid AND pg_class.relname = '{" . db_escape_table($table) . "}' AND attname = '" . db_escape_table($column) . "'"));
-  }
-
   /**
    * Generate SQL to create a new table from a Drupal schema definition.
    *
