@@ -200,8 +200,8 @@ add_gin_entry(GinEntries *entries, Datum entry)
200200 *
201201 */
202202
203- Datum
204- gin_compare_jsonb ( PG_FUNCTION_ARGS )
203+ static Datum
204+ gin_compare_json_internal ( FunctionCallInfo fcinfo )
205205{
206206 text * arg1 = PG_GETARG_TEXT_PP (0 );
207207 text * arg2 = PG_GETARG_TEXT_PP (1 );
@@ -227,10 +227,20 @@ gin_compare_jsonb(PG_FUNCTION_ARGS)
227227}
228228
229229Datum
230- gin_extract_jsonb (PG_FUNCTION_ARGS )
230+ gin_compare_jsonb (PG_FUNCTION_ARGS )
231+ {
232+ return gin_compare_json_internal (fcinfo );
233+ }
234+
235+ Datum
236+ gin_compare_json (PG_FUNCTION_ARGS ) /* XXX remove */
237+ {
238+ return gin_compare_json_internal (fcinfo );
239+ }
240+
241+ static Datum *
242+ gin_extract_json_internal (Json * jb , int32 * nentries )
231243{
232- Jsonb * jb = (Jsonb * ) PG_GETARG_JSONB_P (0 );
233- int32 * nentries = (int32 * ) PG_GETARG_POINTER (1 );
234244 int total = JB_ROOT_COUNT (jb );
235245 JsonbIterator * it ;
236246 JsonbValue v ;
@@ -241,7 +251,7 @@ gin_extract_jsonb(PG_FUNCTION_ARGS)
241251 if (total == 0 )
242252 {
243253 * nentries = 0 ;
244- PG_RETURN_POINTER ( NULL ) ;
254+ return NULL ;
245255 }
246256
247257 if (total < 0 )
@@ -274,7 +284,21 @@ gin_extract_jsonb(PG_FUNCTION_ARGS)
274284
275285 * nentries = entries .count ;
276286
277- PG_RETURN_POINTER (entries .buf );
287+ return entries .buf ;
288+ }
289+
290+ Datum
291+ gin_extract_jsonb (PG_FUNCTION_ARGS )
292+ {
293+ PG_RETURN_POINTER (gin_extract_json_internal (PG_GETARG_JSONB_P (0 ),
294+ (int32 * ) PG_GETARG_POINTER (1 )));
295+ }
296+
297+ Datum
298+ gin_extract_json (PG_FUNCTION_ARGS )
299+ {
300+ PG_RETURN_POINTER (gin_extract_json_internal (PG_GETARG_JSONT_P (0 ),
301+ (int32 * ) PG_GETARG_POINTER (1 )));
278302}
279303
280304/* Append JsonPathGinPathItem to JsonPathGinPath (jsonb_ops) */
@@ -848,8 +872,8 @@ execute_jsp_gin_node(JsonPathGinNode *node, void *check, bool ternary)
848872 }
849873}
850874
851- Datum
852- gin_extract_jsonb_query ( PG_FUNCTION_ARGS )
875+ static Datum
876+ gin_extract_json_query_internal ( FunctionCallInfo fcinfo , bool is_jsonb )
853877{
854878 int32 * nentries = (int32 * ) PG_GETARG_POINTER (1 );
855879 StrategyNumber strategy = PG_GETARG_UINT16 (2 );
@@ -860,7 +884,9 @@ gin_extract_jsonb_query(PG_FUNCTION_ARGS)
860884 {
861885 /* Query is a jsonb, so just apply gin_extract_jsonb... */
862886 entries = (Datum * )
863- DatumGetPointer (DirectFunctionCall2 (gin_extract_jsonb ,
887+ DatumGetPointer (DirectFunctionCall2 (is_jsonb ?
888+ gin_extract_jsonb :
889+ gin_extract_json ,
864890 PG_GETARG_DATUM (0 ),
865891 PointerGetDatum (nentries )));
866892 /* ...although "contains {}" requires a full index scan */
@@ -931,7 +957,19 @@ gin_extract_jsonb_query(PG_FUNCTION_ARGS)
931957}
932958
933959Datum
934- gin_consistent_jsonb (PG_FUNCTION_ARGS )
960+ gin_extract_jsonb_query (PG_FUNCTION_ARGS )
961+ {
962+ return gin_extract_json_query_internal (fcinfo , true);
963+ }
964+
965+ Datum
966+ gin_extract_json_query (PG_FUNCTION_ARGS )
967+ {
968+ return gin_extract_json_query_internal (fcinfo , false);
969+ }
970+
971+ static Datum
972+ gin_consistent_json_internal (FunctionCallInfo fcinfo )
935973{
936974 bool * check = (bool * ) PG_GETARG_POINTER (0 );
937975 StrategyNumber strategy = PG_GETARG_UINT16 (1 );
@@ -1015,7 +1053,19 @@ gin_consistent_jsonb(PG_FUNCTION_ARGS)
10151053}
10161054
10171055Datum
1018- gin_triconsistent_jsonb (PG_FUNCTION_ARGS )
1056+ gin_consistent_jsonb (PG_FUNCTION_ARGS )
1057+ {
1058+ return gin_consistent_json_internal (fcinfo );
1059+ }
1060+
1061+ Datum
1062+ gin_consistent_json (PG_FUNCTION_ARGS )
1063+ {
1064+ return gin_consistent_json_internal (fcinfo );
1065+ }
1066+
1067+ static Datum
1068+ gin_triconsistent_json_internal (FunctionCallInfo fcinfo )
10191069{
10201070 GinTernaryValue * check = (GinTernaryValue * ) PG_GETARG_POINTER (0 );
10211071 StrategyNumber strategy = PG_GETARG_UINT16 (1 );
@@ -1079,6 +1129,18 @@ gin_triconsistent_jsonb(PG_FUNCTION_ARGS)
10791129 PG_RETURN_GIN_TERNARY_VALUE (res );
10801130}
10811131
1132+ Datum
1133+ gin_triconsistent_jsonb (PG_FUNCTION_ARGS )
1134+ {
1135+ return gin_triconsistent_json_internal (fcinfo );
1136+ }
1137+
1138+ Datum
1139+ gin_triconsistent_json (PG_FUNCTION_ARGS )
1140+ {
1141+ return gin_triconsistent_json_internal (fcinfo );
1142+ }
1143+
10821144/*
10831145 *
10841146 * jsonb_path_ops GIN opclass support functions
@@ -1091,11 +1153,9 @@ gin_triconsistent_jsonb(PG_FUNCTION_ARGS)
10911153 *
10921154 */
10931155
1094- Datum
1095- gin_extract_jsonb_path ( PG_FUNCTION_ARGS )
1156+ static Datum *
1157+ gin_extract_json_path_internal ( Json * jb , int32 * nentries )
10961158{
1097- Jsonb * jb = PG_GETARG_JSONB_P (0 );
1098- int32 * nentries = (int32 * ) PG_GETARG_POINTER (1 );
10991159 int total = JB_ROOT_COUNT (jb );
11001160 JsonbIterator * it ;
11011161 JsonbValue v ;
@@ -1108,7 +1168,7 @@ gin_extract_jsonb_path(PG_FUNCTION_ARGS)
11081168 if (total == 0 )
11091169 {
11101170 * nentries = 0 ;
1111- PG_RETURN_POINTER ( NULL ) ;
1171+ return NULL ;
11121172 }
11131173
11141174 if (total < 0 )
@@ -1181,11 +1241,25 @@ gin_extract_jsonb_path(PG_FUNCTION_ARGS)
11811241
11821242 * nentries = entries .count ;
11831243
1184- PG_RETURN_POINTER ( entries .buf ) ;
1244+ return entries .buf ;
11851245}
11861246
11871247Datum
1188- gin_extract_jsonb_query_path (PG_FUNCTION_ARGS )
1248+ gin_extract_jsonb_path (PG_FUNCTION_ARGS )
1249+ {
1250+ PG_RETURN_POINTER (gin_extract_json_path_internal (PG_GETARG_JSONB_P (0 ),
1251+ (int32 * ) PG_GETARG_POINTER (1 )));
1252+ }
1253+
1254+ Datum
1255+ gin_extract_json_path (PG_FUNCTION_ARGS )
1256+ {
1257+ PG_RETURN_POINTER (gin_extract_json_path_internal (PG_GETARG_JSONT_P (0 ),
1258+ (int32 * ) PG_GETARG_POINTER (1 )));
1259+ }
1260+
1261+ static Datum
1262+ gin_extract_json_query_path_internal (FunctionCallInfo fcinfo , bool is_jsonb )
11891263{
11901264 int32 * nentries = (int32 * ) PG_GETARG_POINTER (1 );
11911265 StrategyNumber strategy = PG_GETARG_UINT16 (2 );
@@ -1196,7 +1270,9 @@ gin_extract_jsonb_query_path(PG_FUNCTION_ARGS)
11961270 {
11971271 /* Query is a jsonb, so just apply gin_extract_jsonb_path ... */
11981272 entries = (Datum * )
1199- DatumGetPointer (DirectFunctionCall2 (gin_extract_jsonb_path ,
1273+ DatumGetPointer (DirectFunctionCall2 (is_jsonb ?
1274+ gin_extract_jsonb_path :
1275+ gin_extract_json_path ,
12001276 PG_GETARG_DATUM (0 ),
12011277 PointerGetDatum (nentries )));
12021278
@@ -1225,7 +1301,19 @@ gin_extract_jsonb_query_path(PG_FUNCTION_ARGS)
12251301}
12261302
12271303Datum
1228- gin_consistent_jsonb_path (PG_FUNCTION_ARGS )
1304+ gin_extract_jsonb_query_path (PG_FUNCTION_ARGS )
1305+ {
1306+ return gin_extract_json_query_path_internal (fcinfo , true);
1307+ }
1308+
1309+ Datum
1310+ gin_extract_json_query_path (PG_FUNCTION_ARGS )
1311+ {
1312+ return gin_extract_json_query_path_internal (fcinfo , false);
1313+ }
1314+
1315+ static Datum
1316+ gin_consistent_json_path_internal (FunctionCallInfo fcinfo )
12291317{
12301318 bool * check = (bool * ) PG_GETARG_POINTER (0 );
12311319 StrategyNumber strategy = PG_GETARG_UINT16 (1 );
@@ -1277,7 +1365,19 @@ gin_consistent_jsonb_path(PG_FUNCTION_ARGS)
12771365}
12781366
12791367Datum
1280- gin_triconsistent_jsonb_path (PG_FUNCTION_ARGS )
1368+ gin_consistent_jsonb_path (PG_FUNCTION_ARGS )
1369+ {
1370+ return gin_consistent_json_path_internal (fcinfo );
1371+ }
1372+
1373+ Datum
1374+ gin_consistent_json_path (PG_FUNCTION_ARGS )
1375+ {
1376+ return gin_consistent_json_path_internal (fcinfo );
1377+ }
1378+
1379+ static Datum
1380+ gin_triconsistent_json_path_internal (FunctionCallInfo fcinfo )
12811381{
12821382 GinTernaryValue * check = (GinTernaryValue * ) PG_GETARG_POINTER (0 );
12831383 StrategyNumber strategy = PG_GETARG_UINT16 (1 );
@@ -1324,6 +1424,18 @@ gin_triconsistent_jsonb_path(PG_FUNCTION_ARGS)
13241424 PG_RETURN_GIN_TERNARY_VALUE (res );
13251425}
13261426
1427+ Datum
1428+ gin_triconsistent_jsonb_path (PG_FUNCTION_ARGS )
1429+ {
1430+ return gin_triconsistent_json_path_internal (fcinfo );
1431+ }
1432+
1433+ Datum
1434+ gin_triconsistent_json_path (PG_FUNCTION_ARGS )
1435+ {
1436+ return gin_triconsistent_json_path_internal (fcinfo );
1437+ }
1438+
13271439/*
13281440 * Construct a jsonb_ops GIN key from a flag byte and a textual representation
13291441 * (which need not be null-terminated). This function is responsible
0 commit comments