I reckon that the problem here is that case sensitivity is not working as you'd like.
Try replacing UPPER
with BINARY UPPER
to force case sensitivity. Hence:
DELIMITER $$
CREATE FUNCTION SpaceBeforeCapital (str NVARCHAR(8000))
RETURNS NVARCHAR(8000)
DETERMINISTIC
BEGIN
DECLARE i INT;
DECLARE j INT;
DECLARE cp NCHAR;
DECLARE c0 NCHAR;
DECLARE c1 NCHAR;
DECLARE result NVARCHAR(8000);
SET i = 1;
SET j = CHAR_LENGTH(str);
SET result = '';
WHILE (i <= j) DO
SET cp = SUBSTRING(str,(i-1),1);
SET c0 = SUBSTRING(str,i,1);
SET c1 = SUBSTRING(str,(i+1),1);
-- IF c0 = UPPER(c0) THEN
-- IF c0 = UPPER(CONVERT(c0 USING latin1)) AND (cp != UPPER(CONVERT(cp USING latin1)) OR c1 != UPPER(CONVERT(c1 USING latin1)))
IF c0 = BINARY UPPER(CONVERT(c0 USING latin1)) THEN
IF cp != BINARY UPPER(CONVERT(cp USING latin1)) OR c1 != BINARY UPPER(CONVERT(c1 USING latin1)) THEN
IF cp != ' ' AND c0 != ' ' THEN
SET result = CONCAT(result,' ');
END IF;
END IF;
END IF;
-- END IF;
SET result = CONCAT(result,c0);
SET i = i + 1;
END WHILE;
RETURN result;
END$$
DELIMITER ;