• Tom Lane's avatar
    Avoid unnecessary use of pg_strcasecmp for already-downcased identifiers. · fb8697b3
    Tom Lane authored
    We have a lot of code in which option names, which from the user's
    viewpoint are logically keywords, are passed through the grammar as plain
    identifiers, and then matched to string literals during command execution.
    This approach avoids making words into lexer keywords unnecessarily.  Some
    places matched these strings using plain strcmp, some using pg_strcasecmp.
    But the latter should be unnecessary since identifiers would have been
    downcased on their way through the parser.  Aside from any efficiency
    concerns (probably not a big factor), the lack of consistency in this area
    creates a hazard of subtle bugs due to different places coming to different
    conclusions about whether two option names are the same or different.
    Hence, standardize on using strcmp() to match any option names that are
    expected to have been fed through the parser.
    
    This does create a user-visible behavioral change, which is that while
    formerly all of these would work:
    	alter table foo set (fillfactor = 50);
    	alter table foo set (FillFactor = 50);
    	alter table foo set ("fillfactor" = 50);
    	alter table foo set ("FillFactor" = 50);
    now the last case will fail because that double-quoted identifier is
    different from the others.  However, none of our documentation says that
    you can use a quoted identifier in such contexts at all, and we should
    discourage doing so since it would break if we ever decide to parse such
    constructs as true lexer keywords rather than poor man's substitutes.
    So this shouldn't create a significant compatibility issue for users.
    
    Daniel Gustafsson, reviewed by Michael Paquier, small changes by me
    
    Discussion: https://postgr.es/m/29405B24-564E-476B-98C0-677A29805B84@yesql.se
    fb8697b3
dict_ispell.c 3.09 KB