Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit d1d50bf

Browse files
committed
Minor refactoring of jsonb_util.c
The only caller of compareJsonbScalarValue that needed locale-sensitive comparison of strings was also the only caller that didn't just check for equality. Separate the two cases for clarity: compareJsonbScalarValue now does locale-sensitive comparison, and a new function, equalsJsonbScalarValue, just checks for equality.
1 parent b3e5cfd commit d1d50bf

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
static void fillJsonbValue(JEntry *array, int index, char *base_addr,
3636
JsonbValue *result);
37+
static bool equalsJsonbScalarValue(JsonbValue *a, JsonbValue *b);
3738
static int compareJsonbScalarValue(JsonbValue *a, JsonbValue *b);
38-
static int lexicalCompareJsonbStringValue(const void *a, const void *b);
3939
static Jsonb *convertToJsonb(JsonbValue *val);
4040
static void convertJsonbValue(StringInfo buffer, JEntry *header, JsonbValue *val, int level);
4141
static void convertJsonbArray(StringInfo buffer, JEntry *header, JsonbValue *val, int level);
@@ -161,8 +161,6 @@ compareJsonbContainers(JsonbContainer *a, JsonbContainer *b)
161161
switch (va.type)
162162
{
163163
case jbvString:
164-
res = lexicalCompareJsonbStringValue(&va, &vb);
165-
break;
166164
case jbvNull:
167165
case jbvNumeric:
168166
case jbvBool:
@@ -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
return result;
294292
}
295293
}
@@ -917,7 +915,7 @@ JsonbDeepContains(JsonbIterator **val, JsonbIterator **mContained)
917915
}
918916
else if (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-
static int
1127-
compareJsonbScalarValue(JsonbValue *aScalar, JsonbValue *bScalar)
1120+
static bool
1121+
equalsJsonbScalarValue(JsonbValue *aScalar, JsonbValue *bScalar)
11281122
{
11291123
if (aScalar->type == bScalar->type)
11301124
{
11311125
switch (aScalar->type)
11321126
{
11331127
case jbvNull:
1134-
return 0;
1128+
return true;
11351129
case jbvString:
1136-
return lengthCompareJsonbStringValue(aScalar, bScalar);
1130+
return lengthCompareJsonbStringValue(aScalar, bScalar) == 0;
11371131
case jbvNumeric:
1138-
return DatumGetInt32(DirectFunctionCall2(numeric_cmp,
1132+
return DatumGetBool(DirectFunctionCall2(numeric_eq,
11391133
PointerGetDatum(aScalar->val.numeric),
11401134
PointerGetDatum(bScalar->val.numeric)));
11411135
case jbvBool:
1142-
if (aScalar->val.boolean != bScalar->val.boolean)
1143-
return (aScalar->val.boolean > bScalar->val.boolean) ? 1 : -1;
1144-
else
1145-
return 0;
1136+
return aScalar->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 default database collation. Used by
1158-
* B-Tree operators, 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
static int
1161-
lexicalCompareJsonbStringValue(const void *a, const void *b)
1153+
compareJsonbScalarValue(JsonbValue *aScalar, JsonbValue *bScalar)
11621154
{
1163-
const JsonbValue *va = (const JsonbValue *) a;
1164-
const JsonbValue *vb = (const JsonbValue *) b;
1165-
1166-
Assert(va->type == jbvString);
1167-
Assert(vb->type == jbvString);
1168-
1169-
return varstr_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+
case jbvNull:
1160+
return 0;
1161+
case jbvString:
1162+
return varstr_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+
case jbvNumeric:
1168+
return DatumGetInt32(DirectFunctionCall2(numeric_cmp,
1169+
PointerGetDatum(aScalar->val.numeric),
1170+
PointerGetDatum(bScalar->val.numeric)));
1171+
case jbvBool:
1172+
if (aScalar->val.boolean == bScalar->val.boolean)
1173+
return 0;
1174+
else if (aScalar->val.boolean > bScalar->val.boolean)
1175+
return 1;
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)