Not really an answer, but I found a workaround.
Intentionally casting every single column as char will result in the Alias names being respected. My final query is as follows:
SELECT CAST(p.bf_description AS char(128)) AS ProjectName, CAST(s.bf_name AS CHAR(32)) AS ServerName, CAST(r.bf_result AS CHAR(1)) AS Result,
CAST(r.bf_description AS CHAR(128)) AS StepName, CAST(r.bf_seq AS CHAR(3)) AS StepNumber, CAST(FROM_UNIXTIME(r.bf_start) AS CHAR(64)) AS StartTime,
CAST(r.bf_duration AS CHAR(32)) AS Duration, commands.bf_text AS Commands, r.bf_log_id, r.bf_step_id, CAST(r.bf_modified AS CHAR(64)) AS Modified FROM bf_results r
LEFT JOIN bf_servers s
ON r.bf_server_id=s.bf_id
LEFT JOIN bf_builds b
ON r.bf_build_id=b.bf_id
LEFT JOIN bf_projects p
ON b.bf_project_id=p.bf_id
LEFT JOIN bf_store commands
ON r.bf_command_store=commands.bf_id
WHERE r.bf_modified > SUBDATE(NOW(), INTERVAL 1 HOUR)
... View more