34
34
35
35
static void fillJsonbValue (JEntry * array , int index , char * base_addr ,
36
36
JsonbValue * result );
37
+ static bool equalsJsonbScalarValue (JsonbValue * a , JsonbValue * b );
37
38
static int compareJsonbScalarValue (JsonbValue * a , JsonbValue * b );
38
- static int lexicalCompareJsonbStringValue (const void * a , const void * b );
39
39
static Jsonb * convertToJsonb (JsonbValue * val );
40
40
static void convertJsonbValue (StringInfo buffer , JEntry * header , JsonbValue * val , int level );
41
41
static void convertJsonbArray (StringInfo buffer , JEntry * header , JsonbValue * val , int level );
@@ -161,8 +161,6 @@ compareJsonbContainers(JsonbContainer *a, JsonbContainer *b)
161
161
switch (va .type )
162
162
{
163
163
case jbvString :
164
- res = lexicalCompareJsonbStringValue (& va , & vb );
165
- break ;
166
164
case jbvNull :
167
165
case jbvNumeric :
168
166
case jbvBool :
@@ -289,7 +287,7 @@ findJsonbValueFromContainer(JsonbContainer *container, uint32 flags,
289
287
290
288
if (key -> type == result -> type )
291
289
{
292
- if (compareJsonbScalarValue (key , result ) == 0 )
290
+ if (equalsJsonbScalarValue (key , result ))
293
291
return result ;
294
292
}
295
293
}
@@ -917,7 +915,7 @@ JsonbDeepContains(JsonbIterator **val, JsonbIterator **mContained)
917
915
}
918
916
else if (IsAJsonbScalar (lhsVal ))
919
917
{
920
- if (compareJsonbScalarValue (lhsVal , & vcontained ) != 0 )
918
+ if (! equalsJsonbScalarValue (lhsVal , & vcontained ))
921
919
return false;
922
920
}
923
921
else
@@ -1118,31 +1116,25 @@ JsonbHashScalarValue(const JsonbValue *scalarVal, uint32 *hash)
1118
1116
1119
1117
/*
1120
1118
* 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.
1125
1119
*/
1126
- static int
1127
- compareJsonbScalarValue (JsonbValue * aScalar , JsonbValue * bScalar )
1120
+ static bool
1121
+ equalsJsonbScalarValue (JsonbValue * aScalar , JsonbValue * bScalar )
1128
1122
{
1129
1123
if (aScalar -> type == bScalar -> type )
1130
1124
{
1131
1125
switch (aScalar -> type )
1132
1126
{
1133
1127
case jbvNull :
1134
- return 0 ;
1128
+ return true ;
1135
1129
case jbvString :
1136
- return lengthCompareJsonbStringValue (aScalar , bScalar );
1130
+ return lengthCompareJsonbStringValue (aScalar , bScalar ) == 0 ;
1137
1131
case jbvNumeric :
1138
- return DatumGetInt32 (DirectFunctionCall2 (numeric_cmp ,
1132
+ return DatumGetBool (DirectFunctionCall2 (numeric_eq ,
1139
1133
PointerGetDatum (aScalar -> val .numeric ),
1140
1134
PointerGetDatum (bScalar -> val .numeric )));
1141
1135
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
+
1146
1138
default :
1147
1139
elog (ERROR , "invalid jsonb scalar type" );
1148
1140
}
@@ -1152,22 +1144,43 @@ compareJsonbScalarValue(JsonbValue *aScalar, JsonbValue *bScalar)
1152
1144
}
1153
1145
1154
1146
/*
1155
- * Standard lexical qsort() comparator of jsonb strings .
1147
+ * Compare two scalar JsonbValues, returning -1, 0, or 1 .
1156
1148
*
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.
1159
1151
*/
1160
1152
static int
1161
- lexicalCompareJsonbStringValue ( const void * a , const void * b )
1153
+ compareJsonbScalarValue ( JsonbValue * aScalar , JsonbValue * bScalar )
1162
1154
{
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 ;
1171
1184
}
1172
1185
1173
1186
0 commit comments