I have to pre-check for an empty set before passing it to grep:

 

SAVED_RECORDs=($(sqlite3 -list -separator '/' files.db "SELECT FileName FROM Files WHERE ModTime > '2018-12-31'")) #Returns an empty set

NEW_RECs=($(ls * | grep -vf <(echo ${SAVED_RECORDs[@]} | tr ' ' '\n') #Returns an empty list because grep considers SAVED_RECORDs to be universal rather than null set

Workaround:

if [ ${#SAVED_RECORDs[@]} -gt 0 ]; then
  NEW_RECs=($(ls * | grep -vf <(echo ${SAVED_RECORDs[@]} | tr ' ' '\n') #Now returns the expected subtraction of SAVED_RECORDs from NEW_RECs
fi