[drupal-devel] [bug] IF in forum SQL not supported by postgresql

Zed Pobre drupal-devel at drupal.org
Mon Jan 17 07:46:59 UTC 2005


 Project:      Drupal
-Version:      4.5.1
+Version:      4.5.2
 Component:    forum.module
 Category:     bug reports
 Priority:     normal
 Assigned to:  Anonymous
 Reported by:  michaelemeyers
 Updated by:   Zed Pobre
-Status:       active
+Status:       patch
 Attachment:   http://drupal.org/files/issues/forum_3.patch (3.17 KB)

I'll chime in noting that it works for me as well.  I've attached the
above solution as an actual patch file to 4.5.2.


Zed Pobre



Previous comments:
------------------------------------------------------------------------

December 14, 2004 - 16:32 : michaelemeyers

postgresql 7.4.5 / drupal 4.5.1

forum module version information:
// $Id: forum.module,v 1.217 2004/11/24 22:56:21 dries Exp $

in the forum module, the IF statement in the SQL queries is not
postgresql compliant: 
IF(l.last_comment_uid, cu.name, l.last_comment_name) as
last_comment_name

needs to be a case statement (or an IF function in postgresql could be
written...):
CASE WHEN l.last_comment_uid = 1 THEN cu.name ELSE l.last_comment_name
END as last_comment_name

case statements are supported by both mySQL and postgresql...

--------------------------
IF results in errors:
--------------------------
warning: pg_query(): Query failed: ERROR:  invalid input syntax for
type boolean: "13" in
/usr/local/apache/htdocs/includes/database.pgsql.inc on line 45.

user error: 
query: SELECT DISTINCT(n.nid), l.last_comment_timestamp,
IF(l.last_comment_uid, cu.name, l.last_comment_name) as
last_comment_name, l.last_comment_uid FROM node n ,
node_comment_statistics l, users cu, term_node r WHERE  n.nid = r.nid
AND r.tid = 354 AND n.status = 1 AND n.type = 'forum' AND
l.last_comment_uid = cu.uid AND n.nid = l.nid AND '1' ORDER BY
l.last_comment_timestamp DESC LIMIT 1 OFFSET 0 in
/usr/local/apache/htdocs/includes/database.pgsql.inc on line 62.

warning: pg_query(): Query failed: ERROR:  invalid input syntax for
type boolean: "2" in
/usr/local/apache/htdocs/includes/database.pgsql.inc on line 45.

user error: 
query: SELECT DISTINCT(n.nid), l.last_comment_timestamp,
IF(l.last_comment_uid, cu.name, l.last_comment_name) as
last_comment_name, l.last_comment_uid FROM node n ,
node_comment_statistics l, users cu, term_node r WHERE  n.nid = r.nid
AND r.tid = 353 AND n.status = 1 AND n.type = 'forum' AND
l.last_comment_uid = cu.uid AND n.nid = l.nid AND '1' ORDER BY
l.last_comment_timestamp DESC LIMIT 1 OFFSET 0 in
/usr/local/apache/htdocs/includes/database.pgsql.inc on line 62.



--------------------------
suggested patch:
--------------------------
function forum_get_forums($tid = 0) { // ~at around line 380:
// remove:
-- $topic = db_fetch_object(db_query_range('SELECT DISTINCT(n.nid),
l.last_comment_timestamp, IF(l.last_comment_uid, cu.name,
l.last_comment_name) as last_comment_name, l.last_comment_uid FROM
{node} n ' . node_access_join_sql() . ", {node_comment_statistics} l
/*! USE INDEX (node_comment_timestamp) */, {users} cu, {term_node} r
WHERE  n.nid = r.nid AND r.tid = %d AND n.status = 1 AND n.type =
'forum' AND l.last_comment_uid = cu.uid AND n.nid = l.nid AND " .
node_access_where_sql() . ' ORDER BY l.last_comment_timestamp DESC',
$forum->tid, 0, 1));

// add:	
++ $topic = db_fetch_object(db_query_range('SELECT DISTINCT(n.nid),
l.last_comment_timestamp, CASE WHEN l.last_comment_uid = 1 THEN cu.name
ELSE l.last_comment_name END as last_comment_name, l.last_comment_uid
FROM {node} n ' . node_access_join_sql() . ", {node_comment_statistics}
l, {users} cu, {term_node} r WHERE  n.nid = r.nid AND r.tid = %d AND
n.status = 1 AND n.type = 'forum' AND l.last_comment_uid = cu.uid AND
n.nid = l.nid AND " . node_access_where_sql() . ' ORDER BY
l.last_comment_timestamp DESC', $forum->tid, 0, 1));


function _forum_topics_read($term, $uid) { // ~at around line 420:
// remove:
--  $sql = "SELECT DISTINCT(n.nid), f.tid, n.title, n.sticky, u.name,
u.uid, n.created AS timestamp, n.comment AS comment_mode,
l.last_comment_timestamp, IF(l.last_comment_uid, cu.name,
l.last_comment_name) as last_comment_name, l.last_comment_uid,
l.comment_count AS num_comments FROM {node} n ". node_access_join_sql()
.", {node_comment_statistics} l, {users} cu, {term_node} r, {users} u,
{forum} f WHERE n.status = 1 AND l.last_comment_uid = cu.uid AND n.nid
= l.nid AND n.nid = r.nid AND r.tid = $check_tid AND n.uid = u.uid AND
n.nid = f.nid AND ". node_access_where_sql();
  $sql .= tablesort_sql($forum_topic_list_header, 'n.sticky DESC,');

// add:
++  $sql = "SELECT DISTINCT(n.nid), f.tid, n.title, n.sticky, u.name,
u.uid, n.created AS timestamp, n.comment AS comment_mode,
l.last_comment_timestamp, CASE WHEN l.last_comment_uid = 1 THEN cu.name
ELSE l.last_comment_name END as last_comment_name, l.last_comment_uid,
l.comment_count AS num_comments FROM {node} n ". node_access_join_sql()
.", {node_comment_statistics} l, {users} cu, {term_node} r, {users} u,
{forum} f WHERE n.status = 1 AND l.last_comment_uid = cu.uid AND n.nid
= l.nid AND n.nid = r.nid AND r.tid = $check_tid AND n.uid = u.uid AND
n.nid = f.nid AND ". node_access_where_sql();
  $sql .= tablesort_sql($forum_topic_list_header, 'n.sticky DESC,');


------------------------------------------------------------------------

January 10, 2005 - 16:34 : Anonymous

just wanted to chime in... this patch works perfectly.

thanks,
aaron

-- 
View: http://drupal.org/node/14352
Edit: http://drupal.org/project/comments/add/14352





More information about the drupal-devel mailing list