Rule 3

A string that's intended to identify a UTC offset is never resolved in pg_timezone_abbrevs.abbrev as the argument of set timezone but is resolved there as the argument of at time zone (and, equivalently, in timezone()) and as the argument of make_timestamptz() (and equivalently within a text literal for a timestamptz value).

You can discover, with ad hoc queries. that the string AZOT occurs uniquely in pg_timezone_names.abbrev. Use the function occurrences() to confirm it thus:

with c as (select occurrences('AZOT') as r)
select
  (c.r).names_name     ::text as "~names.name",
  (c.r).names_abbrev   ::text as "~names.abbrev",
  (c.r).abbrevs_abbrev ::text as "~abbrevs.abbrev"
from c;

This is the result:

 ~names.name | ~names.abbrev | ~abbrevs.abbrev
-------------+---------------+-----------------
 false       | false         | true

This means that the string AZOT can be used as a probe, using the function legal_scopes_for_syntax_context()_:

select x from legal_scopes_for_syntax_context('AZOT');

This is the result:

 AZOT:               names_name: false / names_abbrev: false / abbrevs_abbrev: true
 ------------------------------------------------------------------------------------------
 set timezone = 'AZOT';                                       > invalid_parameter_value
 select timezone('AZOT', '2021-06-07 12:00:00');              > OK
 select '2021-06-07 12:00:00 AZOT'::timestamptz;              > OK

You can copy-and-paste the offending expression and use it as the argument of a select to see the error occurring "live".

This outcome supports the formulation of the rule that this page addresses.