Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitd1d50bf

Browse files
committed
Minor refactoring of jsonb_util.c
The only caller of compareJsonbScalarValue that needed locale-sensitivecomparison of strings was also the only caller that didn't just check forequality. Separate the two cases for clarity: compareJsonbScalarValue nowdoes locale-sensitive comparison, and a new function,equalsJsonbScalarValue, just checks for equality.
1 parentb3e5cfd commitd1d50bf

File tree

1 file changed

+43
-30
lines changed

1 file changed

+43
-30
lines changed

‎src/backend/utils/adt/jsonb_util.c

Lines changed: 43 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@
3434

3535
staticvoidfillJsonbValue(JEntry*array,intindex,char*base_addr,
3636
JsonbValue*result);
37+
staticboolequalsJsonbScalarValue(JsonbValue*a,JsonbValue*b);
3738
staticintcompareJsonbScalarValue(JsonbValue*a,JsonbValue*b);
38-
staticintlexicalCompareJsonbStringValue(constvoid*a,constvoid*b);
3939
staticJsonb*convertToJsonb(JsonbValue*val);
4040
staticvoidconvertJsonbValue(StringInfobuffer,JEntry*header,JsonbValue*val,intlevel);
4141
staticvoidconvertJsonbArray(StringInfobuffer,JEntry*header,JsonbValue*val,intlevel);
@@ -161,8 +161,6 @@ compareJsonbContainers(JsonbContainer *a, JsonbContainer *b)
161161
switch (va.type)
162162
{
163163
casejbvString:
164-
res=lexicalCompareJsonbStringValue(&va,&vb);
165-
break;
166164
casejbvNull:
167165
casejbvNumeric:
168166
casejbvBool:
@@ -289,7 +287,7 @@ findJsonbValueFromContainer(JsonbContainer *container, uint32 flags,
289287

290288
if (key->type==result->type)
291289
{
292-
if (compareJsonbScalarValue(key,result)==0)
290+
if (equalsJsonbScalarValue(key,result))
293291
returnresult;
294292
}
295293
}
@@ -917,7 +915,7 @@ JsonbDeepContains(JsonbIterator **val, JsonbIterator **mContained)
917915
}
918916
elseif (IsAJsonbScalar(lhsVal))
919917
{
920-
if (compareJsonbScalarValue(lhsVal,&vcontained)!=0)
918+
if (!equalsJsonbScalarValue(lhsVal,&vcontained))
921919
return false;
922920
}
923921
else
@@ -1118,31 +1116,25 @@ JsonbHashScalarValue(const JsonbValue *scalarVal, uint32 *hash)
11181116

11191117
/*
11201118
* Are two scalar JsonbValues of the same type a and b equal?
1121-
*
1122-
* Does not use lexical comparisons. Therefore, it is essentially that this
1123-
* never be used against Strings for anything other than searching for values
1124-
* within a single jsonb.
11251119
*/
1126-
staticint
1127-
compareJsonbScalarValue(JsonbValue*aScalar,JsonbValue*bScalar)
1120+
staticbool
1121+
equalsJsonbScalarValue(JsonbValue*aScalar,JsonbValue*bScalar)
11281122
{
11291123
if (aScalar->type==bScalar->type)
11301124
{
11311125
switch (aScalar->type)
11321126
{
11331127
casejbvNull:
1134-
return0;
1128+
returntrue;
11351129
casejbvString:
1136-
returnlengthCompareJsonbStringValue(aScalar,bScalar);
1130+
returnlengthCompareJsonbStringValue(aScalar,bScalar)==0;
11371131
casejbvNumeric:
1138-
returnDatumGetInt32(DirectFunctionCall2(numeric_cmp,
1132+
returnDatumGetBool(DirectFunctionCall2(numeric_eq,
11391133
PointerGetDatum(aScalar->val.numeric),
11401134
PointerGetDatum(bScalar->val.numeric)));
11411135
casejbvBool:
1142-
if (aScalar->val.boolean!=bScalar->val.boolean)
1143-
return (aScalar->val.boolean>bScalar->val.boolean) ?1 :-1;
1144-
else
1145-
return0;
1136+
returnaScalar->val.boolean==bScalar->val.boolean;
1137+
11461138
default:
11471139
elog(ERROR,"invalid jsonb scalar type");
11481140
}
@@ -1152,22 +1144,43 @@ compareJsonbScalarValue(JsonbValue *aScalar, JsonbValue *bScalar)
11521144
}
11531145

11541146
/*
1155-
*Standard lexical qsort() comparator of jsonb strings.
1147+
*Compare two scalar JsonbValues, returning -1, 0, or 1.
11561148
*
1157-
*Sorts strings lexically, using the defaultdatabasecollation. Used by
1158-
*B-Treeoperators, where a lexical sort order is generally expected.
1149+
*Strings are compared using the default collation. Used by B-tree
1150+
* operators, where a lexical sort order is generally expected.
11591151
*/
11601152
staticint
1161-
lexicalCompareJsonbStringValue(constvoid*a,constvoid*b)
1153+
compareJsonbScalarValue(JsonbValue*aScalar,JsonbValue*bScalar)
11621154
{
1163-
constJsonbValue*va= (constJsonbValue*)a;
1164-
constJsonbValue*vb= (constJsonbValue*)b;
1165-
1166-
Assert(va->type==jbvString);
1167-
Assert(vb->type==jbvString);
1168-
1169-
returnvarstr_cmp(va->val.string.val,va->val.string.len,vb->val.string.val,
1170-
vb->val.string.len,DEFAULT_COLLATION_OID);
1155+
if (aScalar->type==bScalar->type)
1156+
{
1157+
switch (aScalar->type)
1158+
{
1159+
casejbvNull:
1160+
return0;
1161+
casejbvString:
1162+
returnvarstr_cmp(aScalar->val.string.val,
1163+
aScalar->val.string.len,
1164+
bScalar->val.string.val,
1165+
bScalar->val.string.len,
1166+
DEFAULT_COLLATION_OID);
1167+
casejbvNumeric:
1168+
returnDatumGetInt32(DirectFunctionCall2(numeric_cmp,
1169+
PointerGetDatum(aScalar->val.numeric),
1170+
PointerGetDatum(bScalar->val.numeric)));
1171+
casejbvBool:
1172+
if (aScalar->val.boolean==bScalar->val.boolean)
1173+
return0;
1174+
elseif (aScalar->val.boolean>bScalar->val.boolean)
1175+
return1;
1176+
else
1177+
return-1;
1178+
default:
1179+
elog(ERROR,"invalid jsonb scalar type");
1180+
}
1181+
}
1182+
elog(ERROR,"jsonb scalar type mismatch");
1183+
return-1;
11711184
}
11721185

11731186

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp