Is db_query() limited to MySQL? I know db_select and Drupal's Database Abstraction Layer work across database implementations as long as there is a driver (mysql, postgresql and sqlite drivers included in core). But what about db_query? Should I patch contributed modules to make sure they work with sqlite?
Any function that is part of the database abstraction layer in Drupal 7 works with every database engine for which there are the necessary classes to work with that database engine.

If you look at the code of db_query(), you will notice it is generic enough to work with every database engine.

function db_query($query, array $args = array(), array $options = array()) {
  if (empty($options['target'])) {
    $options['target'] = 'default';
  }

  return Database::getConnection($options['target'])-&gt;query($query, $args, $options);
}


This code is not different from the code executed by db_select().

function db_select($table, $alias = NULL, array $options = array()) {
  if (empty($options['target'])) {
    $options['target'] = 'default';
  }
  return Database::getConnection($options['target'])-&gt;select($table, $alias, $options);
}


If you compare those functions with the code executed from db_delete(), you will notice the functions are essentially wrappers around Database::getConnection().

function db_delete($table, array $options = array()) {
  if (empty($options['target']) || $options['target'] == 'slave') {
    $options['target'] = 'default';
  }
  return Database::getConnection($options['target'])-&gt;delete($table, $options);
}


It is Database::getConnection() that, indirectly, builds the object necessary to execute the queries in the database engine, using the following code.

  $driver_class = 'DatabaseConnection_' . $driver;
  require_once DRUPAL_ROOT . '/includes/database/' . $driver . '/database.inc';
  $new_connection = new $driver_class(self::$databaseInfo[$key][$target]);
  $new_connection-&gt;setTarget($target);
  $new_connection-&gt;setKey($key);


As SQLite is supported in Drupal 7, db_query() doesn't need to be altered to execute optimized code for SQLite, as the code that it is optimized for that database engine is already contained in the DatabaseConnection_sqlite.