https://bugzilla.wikimedia.org/show_bug.cgi?id=21196

           Summary: $wgMaxCredits breaks MW on PostgreSQL (with solution)
           Product: MediaWiki
           Version: 1.15.1
          Platform: All
        OS/Version: All
            Status: NEW
          Keywords: need-review, patch, postgresql, testme
          Severity: major
          Priority: Normal
         Component: Database
        AssignedTo: [email protected]
        ReportedBy: [email protected]


Hello, all,

I was recently installing MW at a site after a long time again.

Platform: CentOS
MediaWiki: 1.15.1
Database: PostgreSQL 8.1.11

While configuring it, it choke when I set $wgMaxCredits to 3 in
LocalSettings.php. The exact error is attached below.

The PostgreSQL error message made it apparent immediately that GROUP BY was not
going to be the thing to solve what getCredits() was supposed to do, so I fixed
the query to use DISTINCT ON. Here's the patch:

                $hideBit = Revision::DELETED_USER; // username hidden?

-               $sql = "SELECT {$userTable}.*, MAX(rev_timestamp) as timestamp
+               $sql = "SELECT
+                               DISTINCT ON (user_id)
+                               {$userTable}.*,
+                               rev_timestamp as timestamp
                        FROM $revTable LEFT JOIN $userTable ON rev_user =
user_id
                        WHERE rev_page = $pageId
                        AND rev_user != $user
                        AND rev_deleted & $hideBit = 0
-                       GROUP BY rev_user, rev_user_text, user_real_name
-                       ORDER BY timestamp DESC";
+                       ORDER BY user_id, timestamp DESC";

                if($limit > 0) { $sql .= ' LIMIT '.$limit; }
                if($offset > 0) { $sql .= ' OFFSET '.$offset; }

The sad thing is, it won't work with MySQL, of course, and I have no idea on
how you MW guys circumvent such stuff.

This is the original error message:

A database error has occurred
Query: SELECT mwuser.*, MAX(rev_timestamp) as timestamp
FROM revision LEFT JOIN mwuser ON rev_user = user_id
WHERE rev_page = 6
AND rev_user != 2
AND rev_deleted & 4 = 0
GROUP BY rev_user, rev_user_text, user_real_name
ORDER BY timestamp DESC
Function: Article::getContributors
Error: 1 ERROR: column "mwuser.user_id" must appear in the GROUP BY clause or
be used in an aggregate function

Backtrace:

#0 /var/www/wiki/includes/db/Database.php(616):
DatabasePostgres->reportQueryError('ERROR: column ...', 1, 'SELECT
mwuser.*...', 'Article::getCon...', false)
#1 /var/www/wiki/includes/Article.php(715): Database->query('SELECT
mwuser.*...', 'Article::getCon...')
#2 /var/www/wiki/includes/Credits.php(103): Article->getContributors()
#3 /var/www/wiki/includes/Credits.php(65):
Credits::getContributors(Object(Article), 2, true)
#4 /var/www/wiki/includes/SkinTemplate.php(371):
Credits::getCredits(Object(Article), 3, true)
#5 /var/www/wiki/includes/OutputPage.php(968):
SkinTemplate->outputPage(Object(OutputPage))
#6 /var/www/wiki/includes/Wiki.php(345): OutputPage->output()
#7 /var/www/wiki/index.php(117): MediaWiki->finalCleanup(Array,
Object(OutputPage))
#8 {main}


-- 
Configure bugmail: https://bugzilla.wikimedia.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.
You are on the CC list for the bug.

_______________________________________________
Wikibugs-l mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/wikibugs-l

Reply via email to