Skip to content

Commit fb8697b

Browse files
committed
Avoid unnecessary use of pg_strcasecmp for already-downcased identifiers.
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
1 parent 9fd8b7d commit fb8697b

37 files changed

+318
-143
lines changed

contrib/dict_int/dict_int.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,11 @@ dintdict_init(PG_FUNCTION_ARGS)
4242
{
4343
DefElem *defel = (DefElem *) lfirst(l);
4444

45-
if (pg_strcasecmp(defel->defname, "MAXLEN") == 0)
45+
if (strcmp(defel->defname, "maxlen") == 0)
4646
{
4747
d->maxlen = atoi(defGetString(defel));
4848
}
49-
else if (pg_strcasecmp(defel->defname, "REJECTLONG") == 0)
49+
else if (strcmp(defel->defname, "rejectlong") == 0)
5050
{
5151
d->rejectlong = defGetBoolean(defel);
5252
}

contrib/dict_xsyn/dict_xsyn.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -157,23 +157,23 @@ dxsyn_init(PG_FUNCTION_ARGS)
157157
{
158158
DefElem *defel = (DefElem *) lfirst(l);
159159

160-
if (pg_strcasecmp(defel->defname, "MATCHORIG") == 0)
160+
if (strcmp(defel->defname, "matchorig") == 0)
161161
{
162162
d->matchorig = defGetBoolean(defel);
163163
}
164-
else if (pg_strcasecmp(defel->defname, "KEEPORIG") == 0)
164+
else if (strcmp(defel->defname, "keeporig") == 0)
165165
{
166166
d->keeporig = defGetBoolean(defel);
167167
}
168-
else if (pg_strcasecmp(defel->defname, "MATCHSYNONYMS") == 0)
168+
else if (strcmp(defel->defname, "matchsynonyms") == 0)
169169
{
170170
d->matchsynonyms = defGetBoolean(defel);
171171
}
172-
else if (pg_strcasecmp(defel->defname, "KEEPSYNONYMS") == 0)
172+
else if (strcmp(defel->defname, "keepsynonyms") == 0)
173173
{
174174
d->keepsynonyms = defGetBoolean(defel);
175175
}
176-
else if (pg_strcasecmp(defel->defname, "RULES") == 0)
176+
else if (strcmp(defel->defname, "rules") == 0)
177177
{
178178
/* we can't read the rules before parsing all options! */
179179
filename = defGetString(defel);

contrib/unaccent/unaccent.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ unaccent_init(PG_FUNCTION_ARGS)
276276
{
277277
DefElem *defel = (DefElem *) lfirst(l);
278278

279-
if (pg_strcasecmp("Rules", defel->defname) == 0)
279+
if (strcmp(defel->defname, "rules") == 0)
280280
{
281281
if (fileloaded)
282282
ereport(ERROR,

doc/src/sgml/textsearch.sgml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1271,6 +1271,7 @@ ts_headline(<optional> <replaceable class="parameter">config</replaceable> <type
12711271
</listitem>
12721272
</itemizedlist>
12731273

1274+
These option names are recognized case-insensitively.
12741275
Any unspecified options receive these defaults:
12751276

12761277
<programlisting>

src/backend/access/common/reloptions.c

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -796,12 +796,12 @@ transformRelOptions(Datum oldOptions, List *defList, const char *namspace,
796796
}
797797
else if (def->defnamespace == NULL)
798798
continue;
799-
else if (pg_strcasecmp(def->defnamespace, namspace) != 0)
799+
else if (strcmp(def->defnamespace, namspace) != 0)
800800
continue;
801801

802802
kw_len = strlen(def->defname);
803803
if (text_len > kw_len && text_str[kw_len] == '=' &&
804-
pg_strncasecmp(text_str, def->defname, kw_len) == 0)
804+
strncmp(text_str, def->defname, kw_len) == 0)
805805
break;
806806
}
807807
if (!cell)
@@ -849,8 +849,7 @@ transformRelOptions(Datum oldOptions, List *defList, const char *namspace,
849849
{
850850
for (i = 0; validnsps[i]; i++)
851851
{
852-
if (pg_strcasecmp(def->defnamespace,
853-
validnsps[i]) == 0)
852+
if (strcmp(def->defnamespace, validnsps[i]) == 0)
854853
{
855854
valid = true;
856855
break;
@@ -865,7 +864,7 @@ transformRelOptions(Datum oldOptions, List *defList, const char *namspace,
865864
def->defnamespace)));
866865
}
867866

868-
if (ignoreOids && pg_strcasecmp(def->defname, "oids") == 0)
867+
if (ignoreOids && strcmp(def->defname, "oids") == 0)
869868
continue;
870869

871870
/* ignore if not in the same namespace */
@@ -876,7 +875,7 @@ transformRelOptions(Datum oldOptions, List *defList, const char *namspace,
876875
}
877876
else if (def->defnamespace == NULL)
878877
continue;
879-
else if (pg_strcasecmp(def->defnamespace, namspace) != 0)
878+
else if (strcmp(def->defnamespace, namspace) != 0)
880879
continue;
881880

882881
/*
@@ -1082,8 +1081,7 @@ parseRelOptions(Datum options, bool validate, relopt_kind kind,
10821081
int kw_len = reloptions[j].gen->namelen;
10831082

10841083
if (text_len > kw_len && text_str[kw_len] == '=' &&
1085-
pg_strncasecmp(text_str, reloptions[j].gen->name,
1086-
kw_len) == 0)
1084+
strncmp(text_str, reloptions[j].gen->name, kw_len) == 0)
10871085
{
10881086
parse_one_reloption(&reloptions[j], text_str, text_len,
10891087
validate);
@@ -1262,7 +1260,7 @@ fillRelOptions(void *rdopts, Size basesize,
12621260

12631261
for (j = 0; j < numelems; j++)
12641262
{
1265-
if (pg_strcasecmp(options[i].gen->name, elems[j].optname) == 0)
1263+
if (strcmp(options[i].gen->name, elems[j].optname) == 0)
12661264
{
12671265
relopt_string *optstring;
12681266
char *itempos = ((char *) rdopts) + elems[j].offset;
@@ -1556,9 +1554,9 @@ AlterTableGetRelOptionsLockLevel(List *defList)
15561554

15571555
for (i = 0; relOpts[i]; i++)
15581556
{
1559-
if (pg_strncasecmp(relOpts[i]->name,
1560-
def->defname,
1561-
relOpts[i]->namelen + 1) == 0)
1557+
if (strncmp(relOpts[i]->name,
1558+
def->defname,
1559+
relOpts[i]->namelen + 1) == 0)
15621560
{
15631561
if (lockmode < relOpts[i]->lockmode)
15641562
lockmode = relOpts[i]->lockmode;

src/backend/commands/aggregatecmds.c

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -127,37 +127,37 @@ DefineAggregate(ParseState *pstate, List *name, List *args, bool oldstyle, List
127127
* sfunc1, stype1, and initcond1 are accepted as obsolete spellings
128128
* for sfunc, stype, initcond.
129129
*/
130-
if (pg_strcasecmp(defel->defname, "sfunc") == 0)
130+
if (strcmp(defel->defname, "sfunc") == 0)
131131
transfuncName = defGetQualifiedName(defel);
132-
else if (pg_strcasecmp(defel->defname, "sfunc1") == 0)
132+
else if (strcmp(defel->defname, "sfunc1") == 0)
133133
transfuncName = defGetQualifiedName(defel);
134-
else if (pg_strcasecmp(defel->defname, "finalfunc") == 0)
134+
else if (strcmp(defel->defname, "finalfunc") == 0)
135135
finalfuncName = defGetQualifiedName(defel);
136-
else if (pg_strcasecmp(defel->defname, "combinefunc") == 0)
136+
else if (strcmp(defel->defname, "combinefunc") == 0)
137137
combinefuncName = defGetQualifiedName(defel);
138-
else if (pg_strcasecmp(defel->defname, "serialfunc") == 0)
138+
else if (strcmp(defel->defname, "serialfunc") == 0)
139139
serialfuncName = defGetQualifiedName(defel);
140-
else if (pg_strcasecmp(defel->defname, "deserialfunc") == 0)
140+
else if (strcmp(defel->defname, "deserialfunc") == 0)
141141
deserialfuncName = defGetQualifiedName(defel);
142-
else if (pg_strcasecmp(defel->defname, "msfunc") == 0)
142+
else if (strcmp(defel->defname, "msfunc") == 0)
143143
mtransfuncName = defGetQualifiedName(defel);
144-
else if (pg_strcasecmp(defel->defname, "minvfunc") == 0)
144+
else if (strcmp(defel->defname, "minvfunc") == 0)
145145
minvtransfuncName = defGetQualifiedName(defel);
146-
else if (pg_strcasecmp(defel->defname, "mfinalfunc") == 0)
146+
else if (strcmp(defel->defname, "mfinalfunc") == 0)
147147
mfinalfuncName = defGetQualifiedName(defel);
148-
else if (pg_strcasecmp(defel->defname, "finalfunc_extra") == 0)
148+
else if (strcmp(defel->defname, "finalfunc_extra") == 0)
149149
finalfuncExtraArgs = defGetBoolean(defel);
150-
else if (pg_strcasecmp(defel->defname, "mfinalfunc_extra") == 0)
150+
else if (strcmp(defel->defname, "mfinalfunc_extra") == 0)
151151
mfinalfuncExtraArgs = defGetBoolean(defel);
152-
else if (pg_strcasecmp(defel->defname, "finalfunc_modify") == 0)
152+
else if (strcmp(defel->defname, "finalfunc_modify") == 0)
153153
finalfuncModify = extractModify(defel);
154-
else if (pg_strcasecmp(defel->defname, "mfinalfunc_modify") == 0)
154+
else if (strcmp(defel->defname, "mfinalfunc_modify") == 0)
155155
mfinalfuncModify = extractModify(defel);
156-
else if (pg_strcasecmp(defel->defname, "sortop") == 0)
156+
else if (strcmp(defel->defname, "sortop") == 0)
157157
sortoperatorName = defGetQualifiedName(defel);
158-
else if (pg_strcasecmp(defel->defname, "basetype") == 0)
158+
else if (strcmp(defel->defname, "basetype") == 0)
159159
baseType = defGetTypeName(defel);
160-
else if (pg_strcasecmp(defel->defname, "hypothetical") == 0)
160+
else if (strcmp(defel->defname, "hypothetical") == 0)
161161
{
162162
if (defGetBoolean(defel))
163163
{
@@ -168,23 +168,23 @@ DefineAggregate(ParseState *pstate, List *name, List *args, bool oldstyle, List
168168
aggKind = AGGKIND_HYPOTHETICAL;
169169
}
170170
}
171-
else if (pg_strcasecmp(defel->defname, "stype") == 0)
171+
else if (strcmp(defel->defname, "stype") == 0)
172172
transType = defGetTypeName(defel);
173-
else if (pg_strcasecmp(defel->defname, "stype1") == 0)
173+
else if (strcmp(defel->defname, "stype1") == 0)
174174
transType = defGetTypeName(defel);
175-
else if (pg_strcasecmp(defel->defname, "sspace") == 0)
175+
else if (strcmp(defel->defname, "sspace") == 0)
176176
transSpace = defGetInt32(defel);
177-
else if (pg_strcasecmp(defel->defname, "mstype") == 0)
177+
else if (strcmp(defel->defname, "mstype") == 0)
178178
mtransType = defGetTypeName(defel);
179-
else if (pg_strcasecmp(defel->defname, "msspace") == 0)
179+
else if (strcmp(defel->defname, "msspace") == 0)
180180
mtransSpace = defGetInt32(defel);
181-
else if (pg_strcasecmp(defel->defname, "initcond") == 0)
181+
else if (strcmp(defel->defname, "initcond") == 0)
182182
initval = defGetString(defel);
183-
else if (pg_strcasecmp(defel->defname, "initcond1") == 0)
183+
else if (strcmp(defel->defname, "initcond1") == 0)
184184
initval = defGetString(defel);
185-
else if (pg_strcasecmp(defel->defname, "minitcond") == 0)
185+
else if (strcmp(defel->defname, "minitcond") == 0)
186186
minitval = defGetString(defel);
187-
else if (pg_strcasecmp(defel->defname, "parallel") == 0)
187+
else if (strcmp(defel->defname, "parallel") == 0)
188188
parallel = defGetString(defel);
189189
else
190190
ereport(WARNING,
@@ -420,11 +420,11 @@ DefineAggregate(ParseState *pstate, List *name, List *args, bool oldstyle, List
420420

421421
if (parallel)
422422
{
423-
if (pg_strcasecmp(parallel, "safe") == 0)
423+
if (strcmp(parallel, "safe") == 0)
424424
proparallel = PROPARALLEL_SAFE;
425-
else if (pg_strcasecmp(parallel, "restricted") == 0)
425+
else if (strcmp(parallel, "restricted") == 0)
426426
proparallel = PROPARALLEL_RESTRICTED;
427-
else if (pg_strcasecmp(parallel, "unsafe") == 0)
427+
else if (strcmp(parallel, "unsafe") == 0)
428428
proparallel = PROPARALLEL_UNSAFE;
429429
else
430430
ereport(ERROR,

src/backend/commands/collationcmds.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,17 +82,17 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e
8282
DefElem *defel = lfirst_node(DefElem, pl);
8383
DefElem **defelp;
8484

85-
if (pg_strcasecmp(defel->defname, "from") == 0)
85+
if (strcmp(defel->defname, "from") == 0)
8686
defelp = &fromEl;
87-
else if (pg_strcasecmp(defel->defname, "locale") == 0)
87+
else if (strcmp(defel->defname, "locale") == 0)
8888
defelp = &localeEl;
89-
else if (pg_strcasecmp(defel->defname, "lc_collate") == 0)
89+
else if (strcmp(defel->defname, "lc_collate") == 0)
9090
defelp = &lccollateEl;
91-
else if (pg_strcasecmp(defel->defname, "lc_ctype") == 0)
91+
else if (strcmp(defel->defname, "lc_ctype") == 0)
9292
defelp = &lcctypeEl;
93-
else if (pg_strcasecmp(defel->defname, "provider") == 0)
93+
else if (strcmp(defel->defname, "provider") == 0)
9494
defelp = &providerEl;
95-
else if (pg_strcasecmp(defel->defname, "version") == 0)
95+
else if (strcmp(defel->defname, "version") == 0)
9696
defelp = &versionEl;
9797
else
9898
{

src/backend/commands/operatorcmds.c

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -105,44 +105,44 @@ DefineOperator(List *names, List *parameters)
105105
{
106106
DefElem *defel = (DefElem *) lfirst(pl);
107107

108-
if (pg_strcasecmp(defel->defname, "leftarg") == 0)
108+
if (strcmp(defel->defname, "leftarg") == 0)
109109
{
110110
typeName1 = defGetTypeName(defel);
111111
if (typeName1->setof)
112112
ereport(ERROR,
113113
(errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
114114
errmsg("SETOF type not allowed for operator argument")));
115115
}
116-
else if (pg_strcasecmp(defel->defname, "rightarg") == 0)
116+
else if (strcmp(defel->defname, "rightarg") == 0)
117117
{
118118
typeName2 = defGetTypeName(defel);
119119
if (typeName2->setof)
120120
ereport(ERROR,
121121
(errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
122122
errmsg("SETOF type not allowed for operator argument")));
123123
}
124-
else if (pg_strcasecmp(defel->defname, "procedure") == 0)
124+
else if (strcmp(defel->defname, "procedure") == 0)
125125
functionName = defGetQualifiedName(defel);
126-
else if (pg_strcasecmp(defel->defname, "commutator") == 0)
126+
else if (strcmp(defel->defname, "commutator") == 0)
127127
commutatorName = defGetQualifiedName(defel);
128-
else if (pg_strcasecmp(defel->defname, "negator") == 0)
128+
else if (strcmp(defel->defname, "negator") == 0)
129129
negatorName = defGetQualifiedName(defel);
130-
else if (pg_strcasecmp(defel->defname, "restrict") == 0)
130+
else if (strcmp(defel->defname, "restrict") == 0)
131131
restrictionName = defGetQualifiedName(defel);
132-
else if (pg_strcasecmp(defel->defname, "join") == 0)
132+
else if (strcmp(defel->defname, "join") == 0)
133133
joinName = defGetQualifiedName(defel);
134-
else if (pg_strcasecmp(defel->defname, "hashes") == 0)
134+
else if (strcmp(defel->defname, "hashes") == 0)
135135
canHash = defGetBoolean(defel);
136-
else if (pg_strcasecmp(defel->defname, "merges") == 0)
136+
else if (strcmp(defel->defname, "merges") == 0)
137137
canMerge = defGetBoolean(defel);
138138
/* These obsolete options are taken as meaning canMerge */
139-
else if (pg_strcasecmp(defel->defname, "sort1") == 0)
139+
else if (strcmp(defel->defname, "sort1") == 0)
140140
canMerge = true;
141-
else if (pg_strcasecmp(defel->defname, "sort2") == 0)
141+
else if (strcmp(defel->defname, "sort2") == 0)
142142
canMerge = true;
143-
else if (pg_strcasecmp(defel->defname, "ltcmp") == 0)
143+
else if (strcmp(defel->defname, "ltcmp") == 0)
144144
canMerge = true;
145-
else if (pg_strcasecmp(defel->defname, "gtcmp") == 0)
145+
else if (strcmp(defel->defname, "gtcmp") == 0)
146146
canMerge = true;
147147
else
148148
{
@@ -420,12 +420,12 @@ AlterOperator(AlterOperatorStmt *stmt)
420420
else
421421
param = defGetQualifiedName(defel);
422422

423-
if (pg_strcasecmp(defel->defname, "restrict") == 0)
423+
if (strcmp(defel->defname, "restrict") == 0)
424424
{
425425
restrictionName = param;
426426
updateRestriction = true;
427427
}
428-
else if (pg_strcasecmp(defel->defname, "join") == 0)
428+
else if (strcmp(defel->defname, "join") == 0)
429429
{
430430
joinName = param;
431431
updateJoin = true;
@@ -435,13 +435,13 @@ AlterOperator(AlterOperatorStmt *stmt)
435435
* The rest of the options that CREATE accepts cannot be changed.
436436
* Check for them so that we can give a meaningful error message.
437437
*/
438-
else if (pg_strcasecmp(defel->defname, "leftarg") == 0 ||
439-
pg_strcasecmp(defel->defname, "rightarg") == 0 ||
440-
pg_strcasecmp(defel->defname, "procedure") == 0 ||
441-
pg_strcasecmp(defel->defname, "commutator") == 0 ||
442-
pg_strcasecmp(defel->defname, "negator") == 0 ||
443-
pg_strcasecmp(defel->defname, "hashes") == 0 ||
444-
pg_strcasecmp(defel->defname, "merges") == 0)
438+
else if (strcmp(defel->defname, "leftarg") == 0 ||
439+
strcmp(defel->defname, "rightarg") == 0 ||
440+
strcmp(defel->defname, "procedure") == 0 ||
441+
strcmp(defel->defname, "commutator") == 0 ||
442+
strcmp(defel->defname, "negator") == 0 ||
443+
strcmp(defel->defname, "hashes") == 0 ||
444+
strcmp(defel->defname, "merges") == 0)
445445
{
446446
ereport(ERROR,
447447
(errcode(ERRCODE_SYNTAX_ERROR),

src/backend/commands/tablecmds.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10536,7 +10536,7 @@ ATExecSetRelOptions(Relation rel, List *defList, AlterTableType operation,
1053610536
{
1053710537
DefElem *defel = (DefElem *) lfirst(cell);
1053810538

10539-
if (pg_strcasecmp(defel->defname, "check_option") == 0)
10539+
if (strcmp(defel->defname, "check_option") == 0)
1054010540
check_option = true;
1054110541
}
1054210542

0 commit comments

Comments
 (0)