@@ -52,6 +52,13 @@ typedef enum /* type categories for datum_to_jsonb */
5252 JSONBTYPE_OTHER /* all else */
5353} JsonbTypeCategory ;
5454
55+ typedef enum
56+ {
57+ JsonFormatCanonical ,
58+ JsonFormatNormal ,
59+ JsonFormatIndented
60+ } JsonFormat ;
61+
5562typedef struct JsonbAggState
5663{
5764 JsonbInState * res ;
@@ -86,7 +93,8 @@ static void datum_to_jsonb(Datum val, bool is_null, JsonbInState *result,
8693 bool key_scalar );
8794static void add_jsonb (Datum val , bool is_null , JsonbInState * result ,
8895 Oid val_type , bool key_scalar );
89- static char * JsonbToCStringWorker (StringInfo out , JsonbContainer * in , int estimated_len , bool indent );
96+ static char * JsonbToCStringWorker (StringInfo out , JsonbContainer * in ,
97+ int estimated_len , JsonFormat format );
9098static void add_indent (StringInfo out , bool indent , int level );
9199
92100/*
@@ -431,7 +439,7 @@ jsonb_in_scalar(void *pstate, char *token, JsonTokenType tokentype)
431439char *
432440JsonbToCString (StringInfo out , JsonbContainer * in , int estimated_len )
433441{
434- return JsonbToCStringWorker (out , in , estimated_len , false );
442+ return JsonbToCStringWorker (out , in , estimated_len , JsonFormatNormal );
435443}
436444
437445/*
@@ -440,14 +448,21 @@ JsonbToCString(StringInfo out, JsonbContainer *in, int estimated_len)
440448char *
441449JsonbToCStringIndent (StringInfo out , JsonbContainer * in , int estimated_len )
442450{
443- return JsonbToCStringWorker (out , in , estimated_len , true);
451+ return JsonbToCStringWorker (out , in , estimated_len , JsonFormatIndented );
452+ }
453+
454+ char *
455+ JsonbToCStringCanonical (StringInfo out , JsonbContainer * in , int estimated_len )
456+ {
457+ return JsonbToCStringWorker (out , in , estimated_len , JsonFormatCanonical );
444458}
445459
446460/*
447461 * common worker for above two functions
448462 */
449463static char *
450- JsonbToCStringWorker (StringInfo out , JsonbContainer * in , int estimated_len , bool indent )
464+ JsonbToCStringWorker (StringInfo out , JsonbContainer * in , int estimated_len ,
465+ JsonFormat format )
451466{
452467 bool first = true;
453468 JsonbIterator * it ;
@@ -457,7 +472,8 @@ JsonbToCStringWorker(StringInfo out, JsonbContainer *in, int estimated_len, bool
457472 bool redo_switch = false;
458473
459474 /* If we are indenting, don't add a space after a comma */
460- int ispaces = indent ? 1 : 2 ;
475+ int ispaces = format == JsonFormatNormal ? 2 : 1 ;
476+ bool indent = format == JsonFormatIndented ;
461477
462478 /*
463479 * Don't indent the very first item. This gets set to the indent flag at
0 commit comments