@@ -52,6 +52,13 @@ typedef enum /* type categories for datum_to_jsonb */
52
52
JSONBTYPE_OTHER /* all else */
53
53
} JsonbTypeCategory ;
54
54
55
+ typedef enum
56
+ {
57
+ JsonFormatCanonical ,
58
+ JsonFormatNormal ,
59
+ JsonFormatIndented
60
+ } JsonFormat ;
61
+
55
62
typedef struct JsonbAggState
56
63
{
57
64
JsonbInState * res ;
@@ -86,7 +93,8 @@ static void datum_to_jsonb(Datum val, bool is_null, JsonbInState *result,
86
93
bool key_scalar );
87
94
static void add_jsonb (Datum val , bool is_null , JsonbInState * result ,
88
95
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 );
90
98
static void add_indent (StringInfo out , bool indent , int level );
91
99
92
100
/*
@@ -431,7 +439,7 @@ jsonb_in_scalar(void *pstate, char *token, JsonTokenType tokentype)
431
439
char *
432
440
JsonbToCString (StringInfo out , JsonbContainer * in , int estimated_len )
433
441
{
434
- return JsonbToCStringWorker (out , in , estimated_len , false );
442
+ return JsonbToCStringWorker (out , in , estimated_len , JsonFormatNormal );
435
443
}
436
444
437
445
/*
@@ -440,14 +448,21 @@ JsonbToCString(StringInfo out, JsonbContainer *in, int estimated_len)
440
448
char *
441
449
JsonbToCStringIndent (StringInfo out , JsonbContainer * in , int estimated_len )
442
450
{
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 );
444
458
}
445
459
446
460
/*
447
461
* common worker for above two functions
448
462
*/
449
463
static char *
450
- JsonbToCStringWorker (StringInfo out , JsonbContainer * in , int estimated_len , bool indent )
464
+ JsonbToCStringWorker (StringInfo out , JsonbContainer * in , int estimated_len ,
465
+ JsonFormat format )
451
466
{
452
467
bool first = true;
453
468
JsonbIterator * it ;
@@ -457,7 +472,8 @@ JsonbToCStringWorker(StringInfo out, JsonbContainer *in, int estimated_len, bool
457
472
bool redo_switch = false;
458
473
459
474
/* 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 ;
461
477
462
478
/*
463
479
* Don't indent the very first item. This gets set to the indent flag at
0 commit comments