@@ -349,6 +349,7 @@ static Datum get_path_all(FunctionCallInfo fcinfo, bool as_text);
349
349
static text * get_worker (text * json , char * * tpath , int * ipath , int npath ,
350
350
bool normalize_results );
351
351
static Datum get_jsonb_path_all (FunctionCallInfo fcinfo , bool as_text );
352
+ static text * JsonbValueAsText (JsonbValue * v );
352
353
353
354
/* semantic action functions for json_array_length */
354
355
static void alen_object_start (void * state );
@@ -761,39 +762,9 @@ jsonb_object_field_text(PG_FUNCTION_ARGS)
761
762
VARDATA_ANY (key ),
762
763
VARSIZE_ANY_EXHDR (key ));
763
764
764
- if (v != NULL )
765
- {
766
- text * result = NULL ;
767
765
768
- switch (v -> type )
769
- {
770
- case jbvNull :
771
- break ;
772
- case jbvBool :
773
- result = cstring_to_text (v -> val .boolean ? "true" : "false" );
774
- break ;
775
- case jbvString :
776
- result = cstring_to_text_with_len (v -> val .string .val , v -> val .string .len );
777
- break ;
778
- case jbvNumeric :
779
- result = cstring_to_text (DatumGetCString (DirectFunctionCall1 (numeric_out ,
780
- PointerGetDatum (v -> val .numeric ))));
781
- break ;
782
- case jbvBinary :
783
- {
784
- StringInfo jtext = makeStringInfo ();
785
-
786
- (void ) JsonbToCString (jtext , v -> val .binary .data , -1 );
787
- result = cstring_to_text_with_len (jtext -> data , jtext -> len );
788
- }
789
- break ;
790
- default :
791
- elog (ERROR , "unrecognized jsonb type: %d" , (int ) v -> type );
792
- }
793
-
794
- if (result )
795
- PG_RETURN_TEXT_P (result );
796
- }
766
+ if (v != NULL && v -> type != jbvNull )
767
+ PG_RETURN_TEXT_P (JsonbValueAsText (v ));
797
768
798
769
PG_RETURN_NULL ();
799
770
}
@@ -878,39 +849,9 @@ jsonb_array_element_text(PG_FUNCTION_ARGS)
878
849
}
879
850
880
851
v = getIthJsonbValueFromContainer (& jb -> root , element );
881
- if (v != NULL )
882
- {
883
- text * result = NULL ;
884
-
885
- switch (v -> type )
886
- {
887
- case jbvNull :
888
- break ;
889
- case jbvBool :
890
- result = cstring_to_text (v -> val .boolean ? "true" : "false" );
891
- break ;
892
- case jbvString :
893
- result = cstring_to_text_with_len (v -> val .string .val , v -> val .string .len );
894
- break ;
895
- case jbvNumeric :
896
- result = cstring_to_text (DatumGetCString (DirectFunctionCall1 (numeric_out ,
897
- PointerGetDatum (v -> val .numeric ))));
898
- break ;
899
- case jbvBinary :
900
- {
901
- StringInfo jtext = makeStringInfo ();
902
852
903
- (void ) JsonbToCString (jtext , v -> val .binary .data , -1 );
904
- result = cstring_to_text_with_len (jtext -> data , jtext -> len );
905
- }
906
- break ;
907
- default :
908
- elog (ERROR , "unrecognized jsonb type: %d" , (int ) v -> type );
909
- }
910
-
911
- if (result )
912
- PG_RETURN_TEXT_P (result );
913
- }
853
+ if (v != NULL && v -> type != jbvNull )
854
+ PG_RETURN_TEXT_P (JsonbValueAsText (v ));
914
855
915
856
PG_RETURN_NULL ();
916
857
}
@@ -1548,6 +1489,53 @@ get_jsonb_path_all(FunctionCallInfo fcinfo, bool as_text)
1548
1489
}
1549
1490
}
1550
1491
1492
+ /*
1493
+ * Return the text representation of the given JsonbValue.
1494
+ */
1495
+ static text *
1496
+ JsonbValueAsText (JsonbValue * v )
1497
+ {
1498
+ switch (v -> type )
1499
+ {
1500
+ case jbvNull :
1501
+ return NULL ;
1502
+
1503
+ case jbvBool :
1504
+ return v -> val .boolean ?
1505
+ cstring_to_text_with_len ("true" , 4 ) :
1506
+ cstring_to_text_with_len ("false" , 5 );
1507
+
1508
+ case jbvString :
1509
+ return cstring_to_text_with_len (v -> val .string .val ,
1510
+ v -> val .string .len );
1511
+
1512
+ case jbvNumeric :
1513
+ {
1514
+ Datum cstr ;
1515
+
1516
+ cstr = DirectFunctionCall1 (numeric_out ,
1517
+ PointerGetDatum (v -> val .numeric ));
1518
+
1519
+ return cstring_to_text (DatumGetCString (cstr ));
1520
+ }
1521
+
1522
+ case jbvBinary :
1523
+ {
1524
+ StringInfoData jtext ;
1525
+
1526
+ initStringInfo (& jtext );
1527
+ (void ) JsonbToCString (& jtext , v -> val .binary .data ,
1528
+ v -> val .binary .len );
1529
+
1530
+ return cstring_to_text_with_len (jtext .data , jtext .len );
1531
+ }
1532
+
1533
+ default :
1534
+ elog (ERROR , "unrecognized jsonb type: %d" , (int ) v -> type );
1535
+ return NULL ;
1536
+ }
1537
+ }
1538
+
1551
1539
/*
1552
1540
* SQL function json_array_length(json) -> int
1553
1541
*/
@@ -1758,26 +1746,7 @@ each_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname, bool as_text)
1758
1746
values [1 ] = (Datum ) NULL ;
1759
1747
}
1760
1748
else
1761
- {
1762
- text * sv ;
1763
-
1764
- if (v .type == jbvString )
1765
- {
1766
- /* In text mode, scalar strings should be dequoted */
1767
- sv = cstring_to_text_with_len (v .val .string .val , v .val .string .len );
1768
- }
1769
- else
1770
- {
1771
- /* Turn anything else into a json string */
1772
- StringInfo jtext = makeStringInfo ();
1773
- Jsonb * jb = JsonbValueToJsonb (& v );
1774
-
1775
- (void ) JsonbToCString (jtext , & jb -> root , 0 );
1776
- sv = cstring_to_text_with_len (jtext -> data , jtext -> len );
1777
- }
1778
-
1779
- values [1 ] = PointerGetDatum (sv );
1780
- }
1749
+ values [1 ] = PointerGetDatum (JsonbValueAsText (& v ));
1781
1750
}
1782
1751
else
1783
1752
{
@@ -2053,13 +2022,7 @@ elements_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname,
2053
2022
/* use the tmp context so we can clean up after each tuple is done */
2054
2023
old_cxt = MemoryContextSwitchTo (tmp_cxt );
2055
2024
2056
- if (!as_text )
2057
- {
2058
- Jsonb * val = JsonbValueToJsonb (& v );
2059
-
2060
- values [0 ] = PointerGetDatum (val );
2061
- }
2062
- else
2025
+ if (as_text )
2063
2026
{
2064
2027
if (v .type == jbvNull )
2065
2028
{
@@ -2068,26 +2031,14 @@ elements_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname,
2068
2031
values [0 ] = (Datum ) NULL ;
2069
2032
}
2070
2033
else
2071
- {
2072
- text * sv ;
2073
-
2074
- if (v .type == jbvString )
2075
- {
2076
- /* in text mode scalar strings should be dequoted */
2077
- sv = cstring_to_text_with_len (v .val .string .val , v .val .string .len );
2078
- }
2079
- else
2080
- {
2081
- /* turn anything else into a json string */
2082
- StringInfo jtext = makeStringInfo ();
2083
- Jsonb * jb = JsonbValueToJsonb (& v );
2084
-
2085
- (void ) JsonbToCString (jtext , & jb -> root , 0 );
2086
- sv = cstring_to_text_with_len (jtext -> data , jtext -> len );
2087
- }
2034
+ values [0 ] = PointerGetDatum (JsonbValueAsText (& v ));
2035
+ }
2036
+ else
2037
+ {
2038
+ /* Not in text mode, just return the Jsonb */
2039
+ Jsonb * val = JsonbValueToJsonb (& v );
2088
2040
2089
- values [0 ] = PointerGetDatum (sv );
2090
- }
2041
+ values [0 ] = PointerGetDatum (val );
2091
2042
}
2092
2043
2093
2044
tuple = heap_form_tuple (ret_tdesc , values , nulls );
@@ -4430,7 +4381,6 @@ jsonb_delete_idx(PG_FUNCTION_ARGS)
4430
4381
4431
4382
/*
4432
4383
* SQL function jsonb_set(jsonb, text[], jsonb, boolean)
4433
- *
4434
4384
*/
4435
4385
Datum
4436
4386
jsonb_set (PG_FUNCTION_ARGS )
@@ -4522,7 +4472,6 @@ jsonb_delete_path(PG_FUNCTION_ARGS)
4522
4472
4523
4473
/*
4524
4474
* SQL function jsonb_insert(jsonb, text[], jsonb, boolean)
4525
- *
4526
4475
*/
4527
4476
Datum
4528
4477
jsonb_insert (PG_FUNCTION_ARGS )
0 commit comments