@@ -59,9 +59,9 @@ static void array_dim_to_jsonb(JsonbInState *result, int dim, int ndims, int *di
59
59
Datum * vals , bool * nulls , int * valcount ,
60
60
JsonTypeCategory tcategory , Oid outfuncoid );
61
61
static void array_to_jsonb_internal (Datum array , JsonbInState * result );
62
- static void datum_to_jsonb (Datum val , bool is_null , JsonbInState * result ,
63
- JsonTypeCategory tcategory , Oid outfuncoid ,
64
- bool key_scalar );
62
+ static void datum_to_jsonb_internal (Datum val , bool is_null , JsonbInState * result ,
63
+ JsonTypeCategory tcategory , Oid outfuncoid ,
64
+ bool key_scalar );
65
65
static void add_jsonb (Datum val , bool is_null , JsonbInState * result ,
66
66
Oid val_type , bool key_scalar );
67
67
static JsonbParseState * clone_parse_state (JsonbParseState * state );
@@ -141,6 +141,19 @@ jsonb_send(PG_FUNCTION_ARGS)
141
141
PG_RETURN_BYTEA_P (pq_endtypsend (& buf ));
142
142
}
143
143
144
+ /*
145
+ * jsonb_from_text
146
+ *
147
+ * Turns json text string into a jsonb Datum.
148
+ */
149
+ Datum
150
+ jsonb_from_text (text * js )
151
+ {
152
+ return jsonb_from_cstring (VARDATA_ANY (js ),
153
+ VARSIZE_ANY_EXHDR (js ),
154
+ NULL );
155
+ }
156
+
144
157
/*
145
158
* Get the type name of a jsonb container.
146
159
*/
@@ -622,9 +635,9 @@ add_indent(StringInfo out, bool indent, int level)
622
635
* will be thrown.
623
636
*/
624
637
static void
625
- datum_to_jsonb (Datum val , bool is_null , JsonbInState * result ,
626
- JsonTypeCategory tcategory , Oid outfuncoid ,
627
- bool key_scalar )
638
+ datum_to_jsonb_internal (Datum val , bool is_null , JsonbInState * result ,
639
+ JsonTypeCategory tcategory , Oid outfuncoid ,
640
+ bool key_scalar )
628
641
{
629
642
char * outputstr ;
630
643
bool numeric_error ;
@@ -859,8 +872,8 @@ array_dim_to_jsonb(JsonbInState *result, int dim, int ndims, int *dims, Datum *v
859
872
{
860
873
if (dim + 1 == ndims )
861
874
{
862
- datum_to_jsonb (vals [* valcount ], nulls [* valcount ], result , tcategory ,
863
- outfuncoid , false);
875
+ datum_to_jsonb_internal (vals [* valcount ], nulls [* valcount ], result , tcategory ,
876
+ outfuncoid , false);
864
877
(* valcount )++ ;
865
878
}
866
879
else
@@ -982,7 +995,8 @@ composite_to_jsonb(Datum composite, JsonbInState *result)
982
995
json_categorize_type (att -> atttypid , true, & tcategory ,
983
996
& outfuncoid );
984
997
985
- datum_to_jsonb (val , isnull , result , tcategory , outfuncoid , false);
998
+ datum_to_jsonb_internal (val , isnull , result , tcategory , outfuncoid ,
999
+ false);
986
1000
}
987
1001
988
1002
result -> res = pushJsonbValue (& result -> parseState , WJB_END_OBJECT , NULL );
@@ -1018,9 +1032,11 @@ add_jsonb(Datum val, bool is_null, JsonbInState *result,
1018
1032
json_categorize_type (val_type , true,
1019
1033
& tcategory , & outfuncoid );
1020
1034
1021
- datum_to_jsonb (val , is_null , result , tcategory , outfuncoid , key_scalar );
1035
+ datum_to_jsonb_internal (val , is_null , result , tcategory , outfuncoid ,
1036
+ key_scalar );
1022
1037
}
1023
1038
1039
+
1024
1040
/*
1025
1041
* Is the given type immutable when coming out of a JSONB context?
1026
1042
*
@@ -1072,7 +1088,6 @@ to_jsonb(PG_FUNCTION_ARGS)
1072
1088
{
1073
1089
Datum val = PG_GETARG_DATUM (0 );
1074
1090
Oid val_type = get_fn_expr_argtype (fcinfo -> flinfo , 0 );
1075
- JsonbInState result ;
1076
1091
JsonTypeCategory tcategory ;
1077
1092
Oid outfuncoid ;
1078
1093
@@ -1084,11 +1099,25 @@ to_jsonb(PG_FUNCTION_ARGS)
1084
1099
json_categorize_type (val_type , true,
1085
1100
& tcategory , & outfuncoid );
1086
1101
1102
+ PG_RETURN_DATUM (datum_to_jsonb (val , tcategory , outfuncoid ));
1103
+ }
1104
+
1105
+ /*
1106
+ * Turn a Datum into jsonb.
1107
+ *
1108
+ * tcategory and outfuncoid are from a previous call to json_categorize_type.
1109
+ */
1110
+ Datum
1111
+ datum_to_jsonb (Datum val , JsonTypeCategory tcategory , Oid outfuncoid )
1112
+ {
1113
+ JsonbInState result ;
1114
+
1087
1115
memset (& result , 0 , sizeof (JsonbInState ));
1088
1116
1089
- datum_to_jsonb (val , false, & result , tcategory , outfuncoid , false);
1117
+ datum_to_jsonb_internal (val , false, & result , tcategory , outfuncoid ,
1118
+ false);
1090
1119
1091
- PG_RETURN_POINTER (JsonbValueToJsonb (result .res ));
1120
+ return JsonbPGetDatum (JsonbValueToJsonb (result .res ));
1092
1121
}
1093
1122
1094
1123
Datum
@@ -1525,8 +1554,8 @@ jsonb_agg_transfn_worker(FunctionCallInfo fcinfo, bool absent_on_null)
1525
1554
1526
1555
memset (& elem , 0 , sizeof (JsonbInState ));
1527
1556
1528
- datum_to_jsonb (val , PG_ARGISNULL (1 ), & elem , state -> val_category ,
1529
- state -> val_output_func , false);
1557
+ datum_to_jsonb_internal (val , PG_ARGISNULL (1 ), & elem , state -> val_category ,
1558
+ state -> val_output_func , false);
1530
1559
1531
1560
jbelem = JsonbValueToJsonb (elem .res );
1532
1561
@@ -1726,17 +1755,17 @@ jsonb_object_agg_transfn_worker(FunctionCallInfo fcinfo,
1726
1755
1727
1756
memset (& elem , 0 , sizeof (JsonbInState ));
1728
1757
1729
- datum_to_jsonb (val , false, & elem , state -> key_category ,
1730
- state -> key_output_func , true);
1758
+ datum_to_jsonb_internal (val , false, & elem , state -> key_category ,
1759
+ state -> key_output_func , true);
1731
1760
1732
1761
jbkey = JsonbValueToJsonb (elem .res );
1733
1762
1734
1763
val = PG_ARGISNULL (2 ) ? (Datum ) 0 : PG_GETARG_DATUM (2 );
1735
1764
1736
1765
memset (& elem , 0 , sizeof (JsonbInState ));
1737
1766
1738
- datum_to_jsonb (val , PG_ARGISNULL (2 ), & elem , state -> val_category ,
1739
- state -> val_output_func , false);
1767
+ datum_to_jsonb_internal (val , PG_ARGISNULL (2 ), & elem , state -> val_category ,
1768
+ state -> val_output_func , false);
1740
1769
1741
1770
jbval = JsonbValueToJsonb (elem .res );
1742
1771
0 commit comments