MDL-38215 Fix cross-db support in workshop SQL queries
authorDavid Mudrák <david@moodle.com>
Wed, 13 Mar 2013 13:24:16 +0000 (14:24 +0100)
committerDavid Mudrák <david@moodle.com>
Wed, 13 Mar 2013 13:58:50 +0000 (14:58 +0100)
The $sql used in these methods may contain multiple parts glued
together by the UNION operator. Simply appending the ORDER BY statement
to the end of the query does not work in all DBs (failure reported at
Oracle). Following the pattern already applied in MDL-30051, we wrap the
SQL into yet another SELECT statement and perform ordering there.

Credit goes to Sara Cenni for suggesting the fix.

mod/workshop/locallib.php

index 3d77819..7cebddc 100644 (file)
@@ -418,8 +418,10 @@ class workshop {
             return array();
         }
 
-        list($sort, $sortparams) = users_order_by_sql('u');
-        $sql .= " ORDER BY $sort";
+        list($sort, $sortparams) = users_order_by_sql('tmp');
+        $sql = "SELECT *
+                  FROM ($sql) tmp
+              ORDER BY $sort";
 
         return $DB->get_records_sql($sql, array_merge($params, $sortparams), $limitfrom, $limitnum);
     }
@@ -467,8 +469,10 @@ class workshop {
             return array();
         }
 
-        list($sort, $sortparams) = users_order_by_sql('u');
-        $sql .= " ORDER BY $sort";
+        list($sort, $sortparams) = users_order_by_sql('tmp');
+        $sql = "SELECT *
+                  FROM ($sql) tmp
+              ORDER BY $sort";
 
         return $DB->get_records_sql($sql, array_merge($params, $sortparams), $limitfrom, $limitnum);
     }
@@ -518,8 +522,10 @@ class workshop {
             return array();
         }
 
-        list($sort, $sortparams) = users_order_by_sql();
-        $sql .= " ORDER BY $sort";
+        list($sort, $sortparams) = users_order_by_sql('tmp');
+        $sql = "SELECT *
+                  FROM ($sql) tmp
+              ORDER BY $sort";
 
         return $DB->get_records_sql($sql, array_merge($params, $sortparams), $limitfrom, $limitnum);
     }