Index: includes/common.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/common.inc,v
retrieving revision 1.678
diff -u -p -r1.678 common.inc
--- includes/common.inc	23 Aug 2007 16:41:19 -0000	1.678
+++ includes/common.inc	26 Aug 2007 02:59:20 -0000
@@ -531,7 +531,7 @@ function drupal_http_request($url, $head
  *  0 = Log errors to database.
  *  1 = Log errors to database and to screen.
  */
-function drupal_error_handler($errno, $message, $filename, $line) {
+function drupal_error_handler($errno, $message, $filename, $line, $context) {
   // If the @ error suppression operator was used, error_reporting is temporarily set to 0
   if (error_reporting() == 0) {
     return;
@@ -539,6 +539,26 @@ function drupal_error_handler($errno, $m
 
   if ($errno & (E_ALL)) {
     $types = array(1 => 'error', 2 => 'warning', 4 => 'parse error', 8 => 'notice', 16 => 'core error', 32 => 'core warning', 64 => 'compile error', 128 => 'compile warning', 256 => 'user error', 512 => 'user warning', 1024 => 'user notice', 2048 => 'strict warning');
+
+    // For database errors, we want the line number/file name of the place that
+    // the query was originally called, not _db_query().
+    if (isset($context[DB_ERROR])) {
+      $backtrace = array_reverse(debug_backtrace());
+
+      // List of functions where SQL queries can originate.
+      $query_functions = array('db_query', 'pager_query', 'db_query_range', 'db_query_temporary', 'update_sql');
+
+      // Determine where query function was called, and adjust line/file
+      // accordingly.
+      foreach ($backtrace as $index => $function) {
+        if (in_array($function['function'], $query_functions)) {
+          $line = $backtrace[$index]['line'];
+          $filename = $backtrace[$index]['file'];
+          break;
+        }
+      }
+    }
+
     $entry = $types[$errno] .': '. $message .' in '. $filename .' on line '. $line .'.';
 
     // Force display of error messages in update.php
Index: includes/database.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/database.inc,v
retrieving revision 1.75
diff -u -p -r1.75 database.inc
--- includes/database.inc	6 Aug 2007 10:25:56 -0000	1.75
+++ includes/database.inc	26 Aug 2007 02:59:20 -0000
@@ -7,6 +7,13 @@
  */
 
 /**
+ * A hash value to check when outputting database errors, md5('DB_ERROR').
+ *
+ * @see drupal_error_handler
+ */
+define('DB_ERROR', 'a515ac9c2796ca0e23adbe92c68fc9fc');
+
+/**
  * @defgroup database Database abstraction layer
  * @{
  * Allow the use of different database servers using the same code base.
Index: includes/database.mysql.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/database.mysql.inc,v
retrieving revision 1.78
diff -u -p -r1.78 database.mysql.inc
--- includes/database.mysql.inc	12 Aug 2007 15:55:35 -0000	1.78
+++ includes/database.mysql.inc	26 Aug 2007 02:59:21 -0000
@@ -154,6 +154,8 @@ function _db_query($query, $debug = 0) {
     return $result;
   }
   else {
+    // Indicate to drupal_error_handler that this is a database error.
+    ${DB_ERROR} = TRUE;
     trigger_error(check_plain(mysql_error($active_db) ."\nquery: ". $query), E_USER_WARNING);
     return FALSE;
   }
Index: includes/database.mysqli.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/database.mysqli.inc,v
retrieving revision 1.42
diff -u -p -r1.42 database.mysqli.inc
--- includes/database.mysqli.inc	12 Aug 2007 15:55:35 -0000	1.42
+++ includes/database.mysqli.inc	26 Aug 2007 02:59:21 -0000
@@ -151,6 +151,8 @@ function _db_query($query, $debug = 0) {
     return $result;
   }
   else {
+    // Indicate to drupal_error_handler that this is a database error.
+    ${DB_ERROR} = TRUE;
     trigger_error(check_plain(mysqli_error($active_db) ."\nquery: ". $query), E_USER_WARNING);
     return FALSE;
   }
Index: includes/database.pgsql.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/database.pgsql.inc,v
retrieving revision 1.55
diff -u -p -r1.55 database.pgsql.inc
--- includes/database.pgsql.inc	12 Aug 2007 15:55:35 -0000	1.55
+++ includes/database.pgsql.inc	26 Aug 2007 02:59:21 -0000
@@ -171,6 +171,8 @@ function _db_query($query, $debug = 0) {
     return $last_result;
   }
   else {
+    // Indicate to drupal_error_handler that this is a database error.
+    ${DB_ERROR} = TRUE;
     trigger_error(check_plain(pg_last_error($active_db) ."\nquery: ". $query), E_USER_WARNING);
     return FALSE;
   }
