=== modified file 'includes/database.pgsql.inc'
--- includes/database.pgsql.inc	2007-10-17 12:47:28 +0000
+++ includes/database.pgsql.inc	2007-11-12 14:34:23 +0000
@@ -106,6 +106,30 @@ function db_connect($url) {
 }
 
 /**
+ * Apply module specific replaments and prefix a query string.
+ *
+ * @param $query
+ *   The query to be prepared. If the current database has a replacement,
+ *   that will be executed, @see drupal_install_query_replacements. Also,
+ *   db_prefix_tables will be called.
+ * @return
+ *   The prefixed, replaced query.
+ */
+function db_prepare_query($query) {
+  global $db_type;
+  // We cache this variable because db_prepare_query is called for every single query.
+  static $db_query_replacements;
+  if (!isset($db_query_replacements)) {
+    $db_query_replacements = variable_get('db_query_replacements_pgsql', array());
+  }
+  if (isset($db_query_replacements[$query])) {
+    $query = $db_query_replacements[$query]['replacement'];
+  }
+  $query = db_prefix_tables($query);
+  return $query;
+}
+
+/**
  * Runs a basic query in the active database.
  *
  * User-supplied arguments to the query should be passed in as separate
@@ -132,11 +156,11 @@ function db_connect($url) {
 function db_query($query) {
   $args = func_get_args();
   array_shift($args);
-  $query = db_prefix_tables($query);
   if (isset($args[0]) and is_array($args[0])) { // 'All arguments in one array' syntax
     $args = $args[0];
   }
   _db_query_callback($args, TRUE);
+  $query = db_prepare_query($query);
   $query = preg_replace_callback(DB_QUERY_REGEXP, '_db_query_callback', $query);
   return _db_query($query);
 }
@@ -291,11 +315,11 @@ function db_query_range($query) {
   $from = array_pop($args);
   array_shift($args);
 
-  $query = db_prefix_tables($query);
   if (isset($args[0]) and is_array($args[0])) { // 'All arguments in one array' syntax
     $args = $args[0];
   }
   _db_query_callback($args, TRUE);
+  $query = db_prepare_query($query);
   $query = preg_replace_callback(DB_QUERY_REGEXP, '_db_query_callback', $query);
   $query .= ' LIMIT '. (int)$count .' OFFSET '. (int)$from;
   return _db_query($query);
@@ -338,7 +362,7 @@ function db_query_temporary($query) {
   $tablename = array_pop($args);
   array_shift($args);
 
-  $query = preg_replace('/^SELECT/i', 'CREATE TEMPORARY TABLE '. $tablename .' AS SELECT', db_prefix_tables($query));
+  $query = preg_replace('/^SELECT/i', 'CREATE TEMPORARY TABLE '. $tablename .' AS SELECT', db_prepare_query($query));
   if (isset($args[0]) and is_array($args[0])) { // 'All arguments in one array' syntax
     $args = $args[0];
   }

=== modified file 'includes/install.inc'
--- includes/install.inc	2007-11-11 16:14:45 +0000
+++ includes/install.inc	2007-11-12 14:37:53 +0000
@@ -338,6 +338,13 @@ function drupal_install_modules($module_
       $versions = drupal_get_schema_versions($module);
       drupal_set_installed_schema_version($module, $versions ? max($versions) : SCHEMA_INSTALLED);
       $enable_modules[] = $module;
+      foreach (drupal_detect_database_types() as $db_type) {
+        if (substr($db_type, 0, 5) != 'mysql' && ($replacements = module_invoke($module, 'db_query_replacements', $db_type)) {
+          foreach ($replacements as $query => $replacement) {
+            $db_query_replacements[$db_type][$query] = array('replacement' => $replacement, 'module' => $module);
+          }
+        }
+      }
     }
   }
 
@@ -380,6 +387,20 @@ function drupal_uninstall_module($module
   }
 
   drupal_set_installed_schema_version($module, SCHEMA_UNINSTALLED);
+
+  // Remove query replacements.
+  foreach (drupal_detect_database_types() as $db_type) {
+    if (substr($db_type, 0, 5) != 'mysql') {
+      $name = 'db_query_replacements_'. $db_type;
+      $db_query_replacements = variable_get($name, array());
+      foreach ($db_query_replacements as $query => $replacement) {
+        if ($replacement['module'] == $module) {
+          unset($db_query_replacements[$db_type][$query]);
+        }
+      }
+      variable_set($name, $db_query_replacements);
+    }
+  }
 }
 
 /**

