? .completion.db
? .git
? drushrc.php
? mw.patch
? tmp.patch
? modules/aggregator/aggregator.fetcher.inc
? modules/aggregator/aggregator.parser.inc
? modules/aggregator/aggregator.processor.inc
? modules/menu/menu.js
? modules/node/node.diff.inc
? modules/node/node.js
? modules/node/node.pages-diff.inc
? modules/path/path.js
? modules/simpletest/tests/hook_url_rewrite.info
? modules/simpletest/tests/hook_url_rewrite.module
? modules/simpletest/tests/path.test
? modules/upload/upload.js
? scripts/mw.patch
Index: includes/database/select.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/database/select.inc,v
retrieving revision 1.11
diff -u -F^f -p -r1.11 select.inc
--- includes/database/select.inc	20 Dec 2008 18:24:33 -0000	1.11
+++ includes/database/select.inc	24 Dec 2008 01:05:02 -0000
@@ -291,7 +291,13 @@ class SelectQuery extends Query implemen
   }
 
   public function execute() {
+    // Modules may alter all queries or only those having a particular tag.
     drupal_alter('query', $this);
+    if (isset($this->alterTags)) {
+      foreach ($this->alterTags as $tag => $value) {
+        drupal_alter("query_$tag", $this);
+      }
+    }
 
     $args = $this->getArguments();
 
Index: modules/simpletest/tests/database_test.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/database_test.module,v
retrieving revision 1.4
diff -u -F^f -p -r1.4 database_test.module
--- modules/simpletest/tests/database_test.module	12 Dec 2008 16:21:58 -0000	1.4
+++ modules/simpletest/tests/database_test.module	24 Dec 2008 01:05:02 -0000
@@ -4,16 +4,12 @@
 /**
  * Implementation of hook_query_alter().
  */
-function database_test_query_alter(SelectQuery $query) {
+function database_test_query_alter(QueryAlterableInterface $query) {
 
   if ($query->hasTag('database_test_alter_add_range')) {
     $query->range(0, 2);
   }
 
-  if ($query->hasTag('database_test_alter_remove_range')) {
-    $query->range();
-  }
-
   if ($query->hasTag('database_test_alter_add_join')) {
     $people_alias = $query->join('test', 'people', "test_task.pid=people.id");
     $name_field = $query->addField('people', 'name', 'name');
@@ -36,6 +32,14 @@ function database_test_query_alter(Selec
   }
 }
 
+
+/**
+ * Implementation of hook_query_TAG_alter(). Called by DatabaseTestCase::testAlterRemoveRange.
+ */
+function database_test_query_database_test_alter_remove_range_alter(QueryAlterableInterface $query) {
+  $query->range();
+}
+
 /**
  * Implementation of hook_menu().
  */
Index: modules/simpletest/tests/database_test.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/database_test.test,v
retrieving revision 1.28
diff -u -F^f -p -r1.28 database_test.test
--- modules/simpletest/tests/database_test.test	23 Dec 2008 07:48:24 -0000	1.28
+++ modules/simpletest/tests/database_test.test	24 Dec 2008 01:05:03 -0000
@@ -1675,7 +1675,7 @@ class DatabaseAlter2TestCase extends Dat
   }
 
   /**
-   * Test that we can remove a range() value from a query.
+   * Test that we can remove a range() value from a query. This also tests hook_query_TAG_alter().
    */
   function testAlterRemoveRange() {
     $query = db_select('test');
Index: modules/system/system.api.php
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.api.php,v
retrieving revision 1.5
diff -u -F^f -p -r1.5 system.api.php
--- modules/system/system.api.php	20 Dec 2008 18:24:40 -0000	1.5
+++ modules/system/system.api.php	24 Dec 2008 01:05:03 -0000
@@ -1372,6 +1372,37 @@ function hook_schema_alter(&$schema) {
 }
 
 /**
+ * Perform alterations to a structured query.
+ *
+ * Structured (aka dynamic) queries that have tags associated may be altered by any module
+ * before the query is executed.
+ *
+ * @see hook_query_TAG_alter()
+ * 
+ * @param $query
+ *   A Query object describing the composite parts of a SQL query.
+ * @return
+ *   None.
+ */
+function hook_query_alter(QueryAlterableInterface $query) {
+  
+}
+
+/**
+ * Perform alterations to a structured query for a given tag.
+ *
+ * @see hook_query_alter()
+ * 
+ * @param $query
+ *   An Query object describing the composite parts of a SQL query.
+ * @return
+ *   None.
+ */
+function hook_query_TAG_alter(QueryAlterableInterface $query) {
+  
+}
+
+/**
  * Install the current version of the database schema, and any other setup tasks.
  *
  * The hook will be called the first time a module is installed, and the
