Certain operators, such as hash join, hash agg, and sort, consume all of their input before producing any output. For these, once they start working on their input, they don't check to see if the request has been cancelled. If another fragment fails (causing the overall query to be cancelled), or if the user requests a cancellation, these operators continue working because they never check.
We need to add checks (e.g., ask FragmentContext.isCancelled() or something like that) to these at periodic points. We don't want to check after every row, but it should be checked every so often (mimicing other operations, which generally get notified at batch boundaries).