From 213ea00afead415ca35ff17b8b0fa5f79e10361d Mon Sep 17 00:00:00 2001 From: Jenkins Automation Date: Fri, 18 Sep 2020 10:34:10 +0930 Subject: [PATCH] MDL-69726 calendar: fix raw event fetcher under postgres Without this, there's a code path that under the right circumstances is hit and results in a query with `FROM (mdl_event) ev` in it - which is not valid syntax under postgres. --- .../event/strategies/raw_event_retrieval_strategy.php | 4 ++-- calendar/tests/raw_event_retrieval_strategy_test.php | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/calendar/classes/local/event/strategies/raw_event_retrieval_strategy.php b/calendar/classes/local/event/strategies/raw_event_retrieval_strategy.php index f442a64a15c..46b42d7899c 100644 --- a/calendar/classes/local/event/strategies/raw_event_retrieval_strategy.php +++ b/calendar/classes/local/event/strategies/raw_event_retrieval_strategy.php @@ -281,7 +281,7 @@ class raw_event_retrieval_strategy implements raw_event_retrieval_strategy_inter $unionstartquery = "SELECT modulename, instance, eventtype, priority FROM {event} ev WHERE "; - $subqueryunion = $unionstartquery . implode(" UNION $unionstartquery ", $subqueryconditions); + $subqueryunion = '('.$unionstartquery . implode(" UNION $unionstartquery ", $subqueryconditions).')'; } else { $subqueryunion = '{event}'; } @@ -296,7 +296,7 @@ class raw_event_retrieval_strategy implements raw_event_retrieval_strategy_inter ev.instance, ev.eventtype, MIN(ev.priority) as priority - FROM ($subqueryunion) ev + FROM $subqueryunion ev GROUP BY ev.modulename, ev.instance, ev.eventtype"; // Build the main query. diff --git a/calendar/tests/raw_event_retrieval_strategy_test.php b/calendar/tests/raw_event_retrieval_strategy_test.php index 82cd7a8aeeb..b195eeaf6ea 100644 --- a/calendar/tests/raw_event_retrieval_strategy_test.php +++ b/calendar/tests/raw_event_retrieval_strategy_test.php @@ -447,4 +447,15 @@ class core_calendar_raw_event_retrieval_strategy_testcase extends advanced_testc array_column($events, 'name'), '', 0.0, 10, true); } + + /** + * Test retrieval strategy with empty filters. + * This covers a edge case not covered elsewhere to ensure its SQL is cross + * db compatible. The test is ensuring we don't get a DML Exception with + * the filters setup this way. + */ + public function test_get_raw_events_with_empty_user_and_category_lists() { + $retrievalstrategy = new raw_event_retrieval_strategy; + $retrievalstrategy->get_raw_events([], null, null, []); + } }