We currently require the RHS of AT TIME ZONE operator to be a string literal, but in postgres, it's allowed to be an expression. For example, an expression such as <timestamp> AT TIME ZONE ('America/' || some_column) is accepted. This change would make Expr::AtTimeZone isomorphic to Expr::BinaryOp, so when implementing this I suggest we eliminate Expr::AtTimeZone and add BinaryOperator::AtTimeZone.
We'll need to be careful to get the precedence right. In <timestamp> AT TIME ZONE 'America/Los Angeles'::text the cast is on the time zone string literal, but in <timestamp> AT TIME ZONE 'America/Los Angeles' || 'foo' it's concatenating the result of the entirely AT TIME ZONE binop (which is implicitly casted into text).