instruções drop table causam um commit implícito, que não é permitido em uma função mysql. dropar tabela temporária não causa o commit. se você não estiver preocupado com tabelas regulares (não temporárias) chamadas months_between_dates ou filter_months existentes, você poderá alterar
DROP TABLE IF EXISTS months_between_dates;
DROP TABLE IF EXISTS filter_months;
para
DROP TEMPORARY TABLE IF EXISTS months_between_dates;
DROP TEMPORARY TABLE IF EXISTS filter_months;