MDL-50851 core_tag: fix db query failure on oracle
authorMarina Glancy <marina@moodle.com>
Thu, 14 Jan 2016 05:19:12 +0000 (13:19 +0800)
committerMarina Glancy <marina@moodle.com>
Thu, 14 Jan 2016 05:19:12 +0000 (13:19 +0800)
blog/locallib.php
tag/classes/area.php

index 5e31f8e..af1b72e 100644 (file)
@@ -631,7 +631,7 @@ class blog_listing {
 
         $allnamefields = \user_picture::fields('u', null, 'useridalias');
         // The query used to locate blog entries is complicated.  It will be built from the following components:
-        $requiredfields = "p.*, $allnamefields, u.email";  // The SELECT clause.
+        $requiredfields = "p.*, $allnamefields";  // The SELECT clause.
         $tables = array('p' => 'post', 'u' => 'user');   // Components of the FROM clause (table_id => table_name).
         // Components of the WHERE clause (conjunction).
         $conditions = array('u.deleted = 0', 'p.userid = u.id', '(p.module = \'blog\' OR p.module = \'blog_external\')');
index 49ed67e..f085393 100644 (file)
@@ -401,13 +401,15 @@ class core_tag_area {
         $result->close();
 
         // Find all tags that are used for this itemtype/component and are not present in the target tag collection.
-        $sql = "SELECT DISTINCT t.id, t.name, t.rawname, t.description, t.descriptionformat,
-                    t.userid, t.tagtype, t.flag
+        // This query is a little complicated because Oracle does not allow to run SELECT DISTINCT on CLOB fields.
+        $sql = "SELECT id, name, rawname, description, descriptionformat, userid, tagtype, flag
+                FROM {tag} WHERE id IN
+                (SELECT t.id
                 FROM {tag_instance} ti
                 JOIN {tag} t ON t.id = ti.tagid AND t.tagcollid <> :tagcollid1
                 LEFT JOIN {tag} tt ON tt.name = t.name AND tt.tagcollid = :tagcollid2
                 WHERE ti.itemtype = :itemtype2 AND ti.component = :component2
-                    AND tt.id IS NULL";
+                    AND tt.id IS NULL)";
         $todelete = array();
         $result = $DB->get_records_sql($sql, $params);
         foreach ($result as $tag) {