From ae811ddb6cc4932291cf73ce7768789eb39a33fd Mon Sep 17 00:00:00 2001 From: Jeff Janes Date: Tue, 8 Jul 2014 13:09:25 -0700 Subject: [PATCH] PostgreSQL: Fix ORDER BY NULL MySQL automatically orders by the GROUP BY columns if no ORDER BY is specified. You can countermand this by specifying ORDER BY NULL, which can give speed improvements in some cases, for example if the GROUP BY was implemented by hashing then a sort is unneeded and wastes time. PostgreSQL does not tolerate the ORDER BY NULL syntax, and does not need an analgous hint because it never does gratuitious sorting of the nature just discussed. This patch makes PostgreSQL ignore the ORDER BY NULL clause. It might be a better approach to find a way to add this clause specifically to MySQL, rather than to drop it specifically from other database engines. SQLite seems to tolerate the MySQL syntax. Oracle and MSSQL were not evaluated. Bug: 65794 Change-Id: Ia9666136edd25e1e0d0728a8b28a92e44d00abc6 --- includes/db/DatabasePostgres.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/includes/db/DatabasePostgres.php b/includes/db/DatabasePostgres.php index 3d7267aba4..fe5fa1f4e7 100644 --- a/includes/db/DatabasePostgres.php +++ b/includes/db/DatabasePostgres.php @@ -827,6 +827,8 @@ __INDEXATTR__; * In Postgres when using FOR UPDATE, only the main table and tables that are inner joined * can be locked. That means tables in an outer join cannot be FOR UPDATE locked. Trying to do * so causes a DB error. This wrapper checks which tables can be locked and adjusts it accordingly. + * + * MySQL uses "ORDER BY NULL" as an optimization hint, but that syntax is illegal in PostgreSQL. */ function selectSQLText( $table, $vars, $conds = '', $fname = __METHOD__, $options = array(), $join_conds = array() @@ -842,6 +844,10 @@ __INDEXATTR__; } } } + + if ( isset( $options['ORDER BY'] ) && $options['ORDER BY'] == 'NULL' ) { + unset( $options['ORDER BY'] ); + } } return parent::selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds ); -- 2.20.1