I have this patch series that fixes up the types of the new incremental JSON API a bit. Specifically, it uses "const" throughout so that the top-level entry points such as pg_parse_json_incremental() can declare their arguments as const char * instead of just char *. This just works, it doesn't require any new casting tricks. In fact, it removes a few unconstify() calls.

Also, a few arguments and variables that relate to object sizes should be size_t rather than int. At this point, this mainly makes the API better self-documenting. I don't think it actually works to parse larger than 2 GB chunks (not tested).
From 24546d9043f0bbde185dafca74f9eb7225267a68 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Tue, 18 Jun 2024 13:42:23 +0200
Subject: [PATCH 1/3] jsonapi: Use size_t

Use size_t instead of int for object sizes in the jsonapi.  This makes
the API better self-documenting.
---
 src/common/jsonapi.c                | 24 ++++++++++++------------
 src/common/parse_manifest.c         |  2 +-
 src/include/common/jsonapi.h        |  8 ++++----
 src/include/common/parse_manifest.h |  2 +-
 4 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/src/common/jsonapi.c b/src/common/jsonapi.c
index 172310f6f19..f71c1c54b2a 100644
--- a/src/common/jsonapi.c
+++ b/src/common/jsonapi.c
@@ -85,7 +85,7 @@ struct JsonParserStack
 {
        int                     stack_size;
        char       *prediction;
-       int                     pred_index;
+       size_t          pred_index;
        /* these two are indexed by lex_level */
        char      **fnames;
        bool       *fnull;
@@ -212,7 +212,7 @@ static char JSON_PROD_GOAL[] = {JSON_TOKEN_END, 
JSON_NT_JSON, 0};
 
 static inline JsonParseErrorType json_lex_string(JsonLexContext *lex);
 static inline JsonParseErrorType json_lex_number(JsonLexContext *lex, char *s,
-                                                                               
                 bool *num_err, int *total_len);
+                                                                               
                 bool *num_err, size_t *total_len);
 static inline JsonParseErrorType parse_scalar(JsonLexContext *lex, 
JsonSemAction *sem);
 static JsonParseErrorType parse_object_field(JsonLexContext *lex, 
JsonSemAction *sem);
 static JsonParseErrorType parse_object(JsonLexContext *lex, JsonSemAction 
*sem);
@@ -269,10 +269,10 @@ lex_expect(JsonParseContext ctx, JsonLexContext *lex, 
JsonTokenType token)
  * str is of length len, and need not be null-terminated.
  */
 bool
-IsValidJsonNumber(const char *str, int len)
+IsValidJsonNumber(const char *str, size_t len)
 {
        bool            numeric_error;
-       int                     total_len;
+       size_t          total_len;
        JsonLexContext dummy_lex;
 
        if (len <= 0)
@@ -324,7 +324,7 @@ IsValidJsonNumber(const char *str, int len)
  */
 JsonLexContext *
 makeJsonLexContextCstringLen(JsonLexContext *lex, char *json,
-                                                        int len, int encoding, 
bool need_escapes)
+                                                        size_t len, int 
encoding, bool need_escapes)
 {
        if (lex == NULL)
        {
@@ -650,7 +650,7 @@ JsonParseErrorType
 pg_parse_json_incremental(JsonLexContext *lex,
                                                  JsonSemAction *sem,
                                                  char *json,
-                                                 int len,
+                                                 size_t len,
                                                  bool is_last)
 {
        JsonTokenType tok;
@@ -888,7 +888,7 @@ pg_parse_json_incremental(JsonLexContext *lex,
                                                        }
                                                        else
                                                        {
-                                                               int             
        tlen = (lex->token_terminator - lex->token_start);
+                                                               ptrdiff_t       
tlen = (lex->token_terminator - lex->token_start);
 
                                                                
pstack->scalar_val = palloc(tlen + 1);
                                                                
memcpy(pstack->scalar_val, lex->token_start, tlen);
@@ -1332,7 +1332,7 @@ json_lex(JsonLexContext *lex)
                 * recursive call
                 */
                StringInfo      ptok = &(lex->inc_state->partial_token);
-               int                     added = 0;
+               size_t          added = 0;
                bool            tok_done = false;
                JsonLexContext dummy_lex;
                JsonParseErrorType partial_result;
@@ -1354,7 +1354,7 @@ json_lex(JsonLexContext *lex)
                                        break;
                        }
 
-                       for (int i = 0; i < lex->input_length; i++)
+                       for (size_t i = 0; i < lex->input_length; i++)
                        {
                                char            c = lex->input[i];
 
@@ -1382,7 +1382,7 @@ json_lex(JsonLexContext *lex)
 
                                bool            numend = false;
 
-                               for (int i = 0; i < lex->input_length && 
!numend; i++)
+                               for (size_t i = 0; i < lex->input_length && 
!numend; i++)
                                {
                                        char            cc = lex->input[i];
 
@@ -1418,7 +1418,7 @@ json_lex(JsonLexContext *lex)
                         * {null, false, true} literals as well as any trailing
                         * alphanumeric junk on non-string tokens.
                         */
-                       for (int i = added; i < lex->input_length; i++)
+                       for (size_t i = added; i < lex->input_length; i++)
                        {
                                char            cc = lex->input[i];
 
@@ -1941,7 +1941,7 @@ json_lex_string(JsonLexContext *lex)
  */
 static inline JsonParseErrorType
 json_lex_number(JsonLexContext *lex, char *s,
-                               bool *num_err, int *total_len)
+                               bool *num_err, size_t *total_len)
 {
        bool            error = false;
        int                     len = s - lex->input;
diff --git a/src/common/parse_manifest.c b/src/common/parse_manifest.c
index 821fba3967a..373a4f6c00f 100644
--- a/src/common/parse_manifest.c
+++ b/src/common/parse_manifest.c
@@ -183,7 +183,7 @@ 
json_parse_manifest_incremental_shutdown(JsonManifestParseIncrementalState *incs
 
 void
 json_parse_manifest_incremental_chunk(
-                                                                         
JsonManifestParseIncrementalState *incstate, char *chunk, int size,
+                                                                         
JsonManifestParseIncrementalState *incstate, char *chunk, size_t size,
                                                                          bool 
is_last)
 {
        JsonParseErrorType res,
diff --git a/src/include/common/jsonapi.h b/src/include/common/jsonapi.h
index f1ab17fc9f2..5d3ae4e09b8 100644
--- a/src/include/common/jsonapi.h
+++ b/src/include/common/jsonapi.h
@@ -89,7 +89,7 @@ typedef struct JsonIncrementalState JsonIncrementalState;
 typedef struct JsonLexContext
 {
        char       *input;
-       int                     input_length;
+       size_t          input_length;
        int                     input_encoding;
        char       *token_start;
        char       *token_terminator;
@@ -158,7 +158,7 @@ extern JsonParseErrorType pg_parse_json(JsonLexContext *lex,
 extern JsonParseErrorType pg_parse_json_incremental(JsonLexContext *lex,
                                                                                
                        JsonSemAction *sem,
                                                                                
                        char *json,
-                                                                               
                        int len,
+                                                                               
                        size_t len,
                                                                                
                        bool is_last);
 
 /* the null action object used for pure validation */
@@ -193,7 +193,7 @@ extern JsonParseErrorType 
json_count_array_elements(JsonLexContext *lex,
  */
 extern JsonLexContext *makeJsonLexContextCstringLen(JsonLexContext *lex,
                                                                                
                        char *json,
-                                                                               
                        int len,
+                                                                               
                        size_t len,
                                                                                
                        int encoding,
                                                                                
                        bool need_escapes);
 
@@ -219,6 +219,6 @@ extern char *json_errdetail(JsonParseErrorType error, 
JsonLexContext *lex);
  *
  * str argument does not need to be nul-terminated.
  */
-extern bool IsValidJsonNumber(const char *str, int len);
+extern bool IsValidJsonNumber(const char *str, size_t len);
 
 #endif                                                 /* JSONAPI_H */
diff --git a/src/include/common/parse_manifest.h 
b/src/include/common/parse_manifest.h
index 0d04239c38d..2777b1e9d22 100644
--- a/src/include/common/parse_manifest.h
+++ b/src/include/common/parse_manifest.h
@@ -51,7 +51,7 @@ extern void json_parse_manifest(JsonManifestParseContext 
*context,
                                                                char *buffer, 
size_t size);
 extern JsonManifestParseIncrementalState 
*json_parse_manifest_incremental_init(JsonManifestParseContext *context);
 extern void json_parse_manifest_incremental_chunk(
-                                                                               
                  JsonManifestParseIncrementalState *incstate, char *chunk, int 
size,
+                                                                               
                  JsonManifestParseIncrementalState *incstate, char *chunk, 
size_t size,
                                                                                
                  bool is_last);
 extern void 
json_parse_manifest_incremental_shutdown(JsonManifestParseIncrementalState 
*incstate);
 

base-commit: ae482a7ec521e09bb0dbfc261da6e6170a5ac29f
-- 
2.45.2

From 919929c2aa6f78d50866484db6552cb3db381056 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Tue, 18 Jun 2024 13:42:23 +0200
Subject: [PATCH 2/3] jsonapi: Use const char *

Apply const qualifiers to char * arguments and fields throughout the
jsonapi.  This allows the top-level APIs such as
pg_parse_json_incremental() to declare their input argument as const.
It also gets rid of a few unconstify() calls.
---
 src/backend/utils/adt/jsonfuncs.c | 37 ++++++++++++++++---------------
 src/common/jsonapi.c              | 26 +++++++++++-----------
 src/include/common/jsonapi.h      | 14 ++++++------
 3 files changed, 39 insertions(+), 38 deletions(-)

diff --git a/src/backend/utils/adt/jsonfuncs.c 
b/src/backend/utils/adt/jsonfuncs.c
index 83125b06a43..2d7fe687d67 100644
--- a/src/backend/utils/adt/jsonfuncs.c
+++ b/src/backend/utils/adt/jsonfuncs.c
@@ -86,7 +86,7 @@ typedef struct GetState
 {
        JsonLexContext *lex;
        text       *tresult;
-       char       *result_start;
+       const char *result_start;
        bool            normalize_results;
        bool            next_scalar;
        int                     npath;                  /* length of each 
path-related array */
@@ -111,7 +111,7 @@ typedef struct EachState
        Tuplestorestate *tuple_store;
        TupleDesc       ret_tdesc;
        MemoryContext tmp_cxt;
-       char       *result_start;
+       const char *result_start;
        bool            normalize_results;
        bool            next_scalar;
        char       *normalized_scalar;
@@ -125,7 +125,7 @@ typedef struct ElementsState
        Tuplestorestate *tuple_store;
        TupleDesc       ret_tdesc;
        MemoryContext tmp_cxt;
-       char       *result_start;
+       const char *result_start;
        bool            normalize_results;
        bool            next_scalar;
        char       *normalized_scalar;
@@ -138,7 +138,7 @@ typedef struct JHashState
        const char *function_name;
        HTAB       *hash;
        char       *saved_scalar;
-       char       *save_json_start;
+       const char *save_json_start;
        JsonTokenType saved_token_type;
 } JHashState;
 
@@ -247,7 +247,7 @@ typedef struct PopulateRecordsetState
        const char *function_name;
        HTAB       *json_hash;
        char       *saved_scalar;
-       char       *save_json_start;
+       const char *save_json_start;
        JsonTokenType saved_token_type;
        Tuplestorestate *tuple_store;
        HeapTupleHeader rec;
@@ -273,7 +273,7 @@ typedef struct PopulateArrayState
 {
        JsonLexContext *lex;            /* json lexer */
        PopulateArrayContext *ctx;      /* context */
-       char       *element_start;      /* start of the current array element */
+       const char *element_start;      /* start of the current array element */
        char       *element_scalar; /* current array element token if it is a
                                                                 * scalar */
        JsonTokenType element_type; /* current array element type */
@@ -295,7 +295,7 @@ typedef struct JsValue
        {
                struct
                {
-                       char       *str;        /* json string */
+                       const char *str;        /* json string */
                        int                     len;    /* json string length 
or -1 if null-terminated */
                        JsonTokenType type; /* json type */
                }                       json;           /* json value */
@@ -390,7 +390,7 @@ static JsonParseErrorType elements_array_element_end(void 
*state, bool isnull);
 static JsonParseErrorType elements_scalar(void *state, char *token, 
JsonTokenType tokentype);
 
 /* turn a json object into a hash table */
-static HTAB *get_json_object_as_hash(char *json, int len, const char *funcname,
+static HTAB *get_json_object_as_hash(const char *json, int len, const char 
*funcname,
                                                                         Node 
*escontext);
 
 /* semantic actions for populate_array_json */
@@ -456,7 +456,7 @@ static Datum populate_record_field(ColumnIOData *col, Oid 
typid, int32 typmod,
 static RecordIOData *allocate_record_info(MemoryContext mcxt, int ncolumns);
 static bool JsObjectGetField(JsObject *obj, char *field, JsValue *jsv);
 static void populate_recordset_record(PopulateRecordsetState *state, JsObject 
*obj);
-static bool populate_array_json(PopulateArrayContext *ctx, char *json, int 
len);
+static bool populate_array_json(PopulateArrayContext *ctx, const char *json, 
int len);
 static bool populate_array_dim_jsonb(PopulateArrayContext *ctx, JsonbValue 
*jbv,
                                                                         int 
ndim);
 static void populate_array_report_expected_array(PopulateArrayContext *ctx, 
int ndim);
@@ -1181,7 +1181,7 @@ get_object_end(void *state)
        if (lex_level == 0 && _state->npath == 0)
        {
                /* Special case: return the entire object */
-               char       *start = _state->result_start;
+               const char *start = _state->result_start;
                int                     len = 
_state->lex->prev_token_terminator - start;
 
                _state->tresult = cstring_to_text_with_len(start, len);
@@ -1275,7 +1275,7 @@ get_object_field_end(void *state, char *fname, bool 
isnull)
                        _state->tresult = (text *) NULL;
                else
                {
-                       char       *start = _state->result_start;
+                       const char *start = _state->result_start;
                        int                     len = 
_state->lex->prev_token_terminator - start;
 
                        _state->tresult = cstring_to_text_with_len(start, len);
@@ -1337,7 +1337,7 @@ get_array_end(void *state)
        if (lex_level == 0 && _state->npath == 0)
        {
                /* Special case: return the entire array */
-               char       *start = _state->result_start;
+               const char *start = _state->result_start;
                int                     len = 
_state->lex->prev_token_terminator - start;
 
                _state->tresult = cstring_to_text_with_len(start, len);
@@ -1426,7 +1426,7 @@ get_array_element_end(void *state, bool isnull)
                        _state->tresult = (text *) NULL;
                else
                {
-                       char       *start = _state->result_start;
+                       const char *start = _state->result_start;
                        int                     len = 
_state->lex->prev_token_terminator - start;
 
                        _state->tresult = cstring_to_text_with_len(start, len);
@@ -1463,7 +1463,7 @@ get_scalar(void *state, char *token, JsonTokenType 
tokentype)
                         * scalar token, but not whitespace before it.  
Probably not worth
                         * doing our own space-skipping to avoid that.
                         */
-                       char       *start = _state->lex->input;
+                       const char *start = _state->lex->input;
                        int                     len = 
_state->lex->prev_token_terminator - start;
 
                        _state->tresult = cstring_to_text_with_len(start, len);
@@ -2782,7 +2782,7 @@ populate_array_scalar(void *_state, char *token, 
JsonTokenType tokentype)
  * Returns false if an error occurs when parsing.
  */
 static bool
-populate_array_json(PopulateArrayContext *ctx, char *json, int len)
+populate_array_json(PopulateArrayContext *ctx, const char *json, int len)
 {
        PopulateArrayState state;
        JsonSemAction sem;
@@ -3123,7 +3123,7 @@ populate_scalar(ScalarIOData *io, Oid typid, int32 
typmod, JsValue *jsv,
 {
        Datum           res;
        char       *str = NULL;
-       char       *json = NULL;
+       const char *json = NULL;
 
        if (jsv->is_json)
        {
@@ -3139,7 +3139,8 @@ populate_scalar(ScalarIOData *io, Oid typid, int32 
typmod, JsValue *jsv,
                        str[len] = '\0';
                }
                else
-                       str = json;                     /* string is already 
null-terminated */
+                       str = unconstify(char *, json); /* string is already
+                                                                               
         * null-terminated */
 
                /* If converting to json/jsonb, make string into valid JSON 
literal */
                if ((typid == JSONOID || typid == JSONBOID) &&
@@ -3784,7 +3785,7 @@ populate_record_worker(FunctionCallInfo fcinfo, const 
char *funcname,
  * Returns the hash table if the json is parsed successfully, NULL otherwise.
  */
 static HTAB *
-get_json_object_as_hash(char *json, int len, const char *funcname,
+get_json_object_as_hash(const char *json, int len, const char *funcname,
                                                Node *escontext)
 {
        HASHCTL         ctl;
diff --git a/src/common/jsonapi.c b/src/common/jsonapi.c
index f71c1c54b2a..0c6374b0fc2 100644
--- a/src/common/jsonapi.c
+++ b/src/common/jsonapi.c
@@ -211,7 +211,7 @@ static td_entry 
td_parser_table[JSON_NUM_NONTERMINALS][JSON_NUM_TERMINALS] =
 static char JSON_PROD_GOAL[] = {JSON_TOKEN_END, JSON_NT_JSON, 0};
 
 static inline JsonParseErrorType json_lex_string(JsonLexContext *lex);
-static inline JsonParseErrorType json_lex_number(JsonLexContext *lex, char *s,
+static inline JsonParseErrorType json_lex_number(JsonLexContext *lex, const 
char *s,
                                                                                
                 bool *num_err, size_t *total_len);
 static inline JsonParseErrorType parse_scalar(JsonLexContext *lex, 
JsonSemAction *sem);
 static JsonParseErrorType parse_object_field(JsonLexContext *lex, 
JsonSemAction *sem);
@@ -290,12 +290,12 @@ IsValidJsonNumber(const char *str, size_t len)
         */
        if (*str == '-')
        {
-               dummy_lex.input = unconstify(char *, str) + 1;
+               dummy_lex.input = str + 1;
                dummy_lex.input_length = len - 1;
        }
        else
        {
-               dummy_lex.input = unconstify(char *, str);
+               dummy_lex.input = str;
                dummy_lex.input_length = len;
        }
 
@@ -323,7 +323,7 @@ IsValidJsonNumber(const char *str, size_t len)
  * cleanup.
  */
 JsonLexContext *
-makeJsonLexContextCstringLen(JsonLexContext *lex, char *json,
+makeJsonLexContextCstringLen(JsonLexContext *lex, const char *json,
                                                         size_t len, int 
encoding, bool need_escapes)
 {
        if (lex == NULL)
@@ -649,7 +649,7 @@ json_count_array_elements(JsonLexContext *lex, int 
*elements)
 JsonParseErrorType
 pg_parse_json_incremental(JsonLexContext *lex,
                                                  JsonSemAction *sem,
-                                                 char *json,
+                                                 const char *json,
                                                  size_t len,
                                                  bool is_last)
 {
@@ -1308,8 +1308,8 @@ parse_array(JsonLexContext *lex, JsonSemAction *sem)
 JsonParseErrorType
 json_lex(JsonLexContext *lex)
 {
-       char       *s;
-       char       *const end = lex->input + lex->input_length;
+       const char *s;
+       const char *const end = lex->input + lex->input_length;
        JsonParseErrorType result;
 
        if (lex->incremental && lex->inc_state->partial_completed)
@@ -1593,7 +1593,7 @@ json_lex(JsonLexContext *lex)
                                break;
                        default:
                                {
-                                       char       *p;
+                                       const char *p;
 
                                        /*
                                         * We're not dealing with a string, 
number, legal
@@ -1671,8 +1671,8 @@ json_lex(JsonLexContext *lex)
 static inline JsonParseErrorType
 json_lex_string(JsonLexContext *lex)
 {
-       char       *s;
-       char       *const end = lex->input + lex->input_length;
+       const char *s;
+       const char *const end = lex->input + lex->input_length;
        int                     hi_surrogate = -1;
 
        /* Convenience macros for error exits */
@@ -1689,7 +1689,7 @@ json_lex_string(JsonLexContext *lex)
        } while (0)
 #define FAIL_AT_CHAR_END(code) \
        do { \
-               char       *term = s + pg_encoding_mblen(lex->input_encoding, 
s); \
+               const char         *term = s + 
pg_encoding_mblen(lex->input_encoding, s); \
                lex->token_terminator = (term <= end) ? term : end; \
                return code; \
        } while (0)
@@ -1854,7 +1854,7 @@ json_lex_string(JsonLexContext *lex)
                }
                else
                {
-                       char       *p = s;
+                       const char *p = s;
 
                        if (hi_surrogate != -1)
                                FAIL_AT_CHAR_END(JSON_UNICODE_LOW_SURROGATE);
@@ -1940,7 +1940,7 @@ json_lex_string(JsonLexContext *lex)
  * the distance from lex->input to the token end+1 is returned to *total_len.
  */
 static inline JsonParseErrorType
-json_lex_number(JsonLexContext *lex, char *s,
+json_lex_number(JsonLexContext *lex, const char *s,
                                bool *num_err, size_t *total_len)
 {
        bool            error = false;
diff --git a/src/include/common/jsonapi.h b/src/include/common/jsonapi.h
index 5d3ae4e09b8..71a491d72dc 100644
--- a/src/include/common/jsonapi.h
+++ b/src/include/common/jsonapi.h
@@ -88,18 +88,18 @@ typedef struct JsonIncrementalState JsonIncrementalState;
 #define JSONLEX_FREE_STRVAL                    (1 << 1)
 typedef struct JsonLexContext
 {
-       char       *input;
+       const char *input;
        size_t          input_length;
        int                     input_encoding;
-       char       *token_start;
-       char       *token_terminator;
-       char       *prev_token_terminator;
+       const char *token_start;
+       const char *token_terminator;
+       const char *prev_token_terminator;
        bool            incremental;
        JsonTokenType token_type;
        int                     lex_level;
        bits32          flags;
        int                     line_number;    /* line number, starting from 1 
*/
-       char       *line_start;         /* where that line starts within input 
*/
+       const char *line_start;         /* where that line starts within input 
*/
        JsonParserStack *pstack;
        JsonIncrementalState *inc_state;
        StringInfo      strval;
@@ -157,7 +157,7 @@ extern JsonParseErrorType pg_parse_json(JsonLexContext *lex,
 
 extern JsonParseErrorType pg_parse_json_incremental(JsonLexContext *lex,
                                                                                
                        JsonSemAction *sem,
-                                                                               
                        char *json,
+                                                                               
                        const char *json,
                                                                                
                        size_t len,
                                                                                
                        bool is_last);
 
@@ -192,7 +192,7 @@ extern JsonParseErrorType 
json_count_array_elements(JsonLexContext *lex,
  * cleanup.
  */
 extern JsonLexContext *makeJsonLexContextCstringLen(JsonLexContext *lex,
-                                                                               
                        char *json,
+                                                                               
                        const char *json,
                                                                                
                        size_t len,
                                                                                
                        int encoding,
                                                                                
                        bool need_escapes);
-- 
2.45.2

From 4df85cb93e0f98e3079ec7224817fcd0f6af4d08 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Tue, 18 Jun 2024 13:42:23 +0200
Subject: [PATCH 3/3] parse_manifest: Use const char *

This adapts the manifest parsing code to take advantage of the
const-ified jsonapi.
---
 src/backend/backup/basebackup_incremental.c |  4 ++--
 src/bin/pg_combinebackup/load_manifest.c    |  6 +++---
 src/bin/pg_combinebackup/load_manifest.h    |  4 ++--
 src/bin/pg_verifybackup/pg_verifybackup.c   | 16 ++++++++--------
 src/common/parse_manifest.c                 | 12 ++++++------
 src/include/common/parse_manifest.h         |  6 +++---
 6 files changed, 24 insertions(+), 24 deletions(-)

diff --git a/src/backend/backup/basebackup_incremental.c 
b/src/backend/backup/basebackup_incremental.c
index b6cfeb6926a..a8691b680df 100644
--- a/src/backend/backup/basebackup_incremental.c
+++ b/src/backend/backup/basebackup_incremental.c
@@ -132,7 +132,7 @@ static void 
manifest_process_version(JsonManifestParseContext *context,
 static void manifest_process_system_identifier(JsonManifestParseContext 
*context,
                                                                                
           uint64 manifest_system_identifier);
 static void manifest_process_file(JsonManifestParseContext *context,
-                                                                 char 
*pathname,
+                                                                 const char 
*pathname,
                                                                  size_t size,
                                                                  
pg_checksum_type checksum_type,
                                                                  int 
checksum_length,
@@ -1043,7 +1043,7 @@ 
manifest_process_system_identifier(JsonManifestParseContext *context,
  */
 static void
 manifest_process_file(JsonManifestParseContext *context,
-                                         char *pathname, size_t size,
+                                         const char *pathname, size_t size,
                                          pg_checksum_type checksum_type,
                                          int checksum_length,
                                          uint8 *checksum_payload)
diff --git a/src/bin/pg_combinebackup/load_manifest.c 
b/src/bin/pg_combinebackup/load_manifest.c
index d857ea00066..a7bb72d16c1 100644
--- a/src/bin/pg_combinebackup/load_manifest.c
+++ b/src/bin/pg_combinebackup/load_manifest.c
@@ -46,7 +46,7 @@
  */
 #define SH_PREFIX              manifest_files
 #define SH_ELEMENT_TYPE        manifest_file
-#define SH_KEY_TYPE            char *
+#define SH_KEY_TYPE            const char *
 #define        SH_KEY                  pathname
 #define SH_HASH_KEY(tb, key)   hash_string(key)
 #define SH_EQUAL(tb, a, b)             (strcmp(a, b) == 0)
@@ -60,7 +60,7 @@ static void combinebackup_version_cb(JsonManifestParseContext 
*context,
 static void combinebackup_system_identifier_cb(JsonManifestParseContext 
*context,
                                                                                
           uint64 manifest_system_identifier);
 static void combinebackup_per_file_cb(JsonManifestParseContext *context,
-                                                                         char 
*pathname, size_t size,
+                                                                         const 
char *pathname, size_t size,
                                                                          
pg_checksum_type checksum_type,
                                                                          int 
checksum_length,
                                                                          uint8 
*checksum_payload);
@@ -267,7 +267,7 @@ combinebackup_system_identifier_cb(JsonManifestParseContext 
*context,
  */
 static void
 combinebackup_per_file_cb(JsonManifestParseContext *context,
-                                                 char *pathname, size_t size,
+                                                 const char *pathname, size_t 
size,
                                                  pg_checksum_type 
checksum_type,
                                                  int checksum_length, uint8 
*checksum_payload)
 {
diff --git a/src/bin/pg_combinebackup/load_manifest.h 
b/src/bin/pg_combinebackup/load_manifest.h
index 8a5a70e4477..a96ae12eb8e 100644
--- a/src/bin/pg_combinebackup/load_manifest.h
+++ b/src/bin/pg_combinebackup/load_manifest.h
@@ -22,7 +22,7 @@
 typedef struct manifest_file
 {
        uint32          status;                 /* hash status */
-       char       *pathname;
+       const char *pathname;
        size_t          size;
        pg_checksum_type checksum_type;
        int                     checksum_length;
@@ -31,7 +31,7 @@ typedef struct manifest_file
 
 #define SH_PREFIX              manifest_files
 #define SH_ELEMENT_TYPE        manifest_file
-#define SH_KEY_TYPE            char *
+#define SH_KEY_TYPE            const char *
 #define        SH_SCOPE                extern
 #define SH_RAW_ALLOCATOR       pg_malloc0
 #define SH_DECLARE
diff --git a/src/bin/pg_verifybackup/pg_verifybackup.c 
b/src/bin/pg_verifybackup/pg_verifybackup.c
index fd610c20a65..d77e70fbe38 100644
--- a/src/bin/pg_verifybackup/pg_verifybackup.c
+++ b/src/bin/pg_verifybackup/pg_verifybackup.c
@@ -52,7 +52,7 @@
 typedef struct manifest_file
 {
        uint32          status;                 /* hash status */
-       char       *pathname;
+       const char *pathname;
        size_t          size;
        pg_checksum_type checksum_type;
        int                     checksum_length;
@@ -70,7 +70,7 @@ typedef struct manifest_file
  */
 #define SH_PREFIX              manifest_files
 #define SH_ELEMENT_TYPE        manifest_file
-#define SH_KEY_TYPE            char *
+#define SH_KEY_TYPE            const char *
 #define        SH_KEY                  pathname
 #define SH_HASH_KEY(tb, key)   hash_string(key)
 #define SH_EQUAL(tb, a, b)             (strcmp(a, b) == 0)
@@ -123,7 +123,7 @@ static void 
verifybackup_version_cb(JsonManifestParseContext *context,
 static void verifybackup_system_identifier(JsonManifestParseContext *context,
                                                                                
   uint64 manifest_system_identifier);
 static void verifybackup_per_file_cb(JsonManifestParseContext *context,
-                                                                        char 
*pathname, size_t size,
+                                                                        const 
char *pathname, size_t size,
                                                                         
pg_checksum_type checksum_type,
                                                                         int 
checksum_length,
                                                                         uint8 
*checksum_payload);
@@ -155,7 +155,7 @@ static void report_backup_error(verifier_context *context,
                        pg_attribute_printf(2, 3);
 static void report_fatal_error(const char *pg_restrict fmt,...)
                        pg_attribute_printf(1, 2) pg_attribute_noreturn();
-static bool should_ignore_relpath(verifier_context *context, char *relpath);
+static bool should_ignore_relpath(verifier_context *context, const char 
*relpath);
 
 static void progress_report(bool finished);
 static void usage(void);
@@ -546,7 +546,7 @@ verifybackup_system_identifier(JsonManifestParseContext 
*context,
  */
 static void
 verifybackup_per_file_cb(JsonManifestParseContext *context,
-                                                char *pathname, size_t size,
+                                                const char *pathname, size_t 
size,
                                                 pg_checksum_type checksum_type,
                                                 int checksum_length, uint8 
*checksum_payload)
 {
@@ -852,7 +852,7 @@ verify_file_checksum(verifier_context *context, 
manifest_file *m,
                                         char *fullpath, uint8 *buffer)
 {
        pg_checksum_context checksum_ctx;
-       char       *relpath = m->pathname;
+       const char *relpath = m->pathname;
        int                     fd;
        int                     rc;
        size_t          bytes_read = 0;
@@ -1016,13 +1016,13 @@ report_fatal_error(const char *pg_restrict fmt,...)
  * "aa/bb" is not a prefix of "aa/bbb", but it is a prefix of "aa/bb/cc".
  */
 static bool
-should_ignore_relpath(verifier_context *context, char *relpath)
+should_ignore_relpath(verifier_context *context, const char *relpath)
 {
        SimpleStringListCell *cell;
 
        for (cell = context->ignore_list.head; cell != NULL; cell = cell->next)
        {
-               char       *r = relpath;
+               const char *r = relpath;
                char       *v = cell->val;
 
                while (*v != '\0' && *r == *v)
diff --git a/src/common/parse_manifest.c b/src/common/parse_manifest.c
index 373a4f6c00f..612e120b17a 100644
--- a/src/common/parse_manifest.c
+++ b/src/common/parse_manifest.c
@@ -112,7 +112,7 @@ static void 
json_manifest_finalize_system_identifier(JsonManifestParseState *par
 static void json_manifest_finalize_file(JsonManifestParseState *parse);
 static void json_manifest_finalize_wal_range(JsonManifestParseState *parse);
 static void verify_manifest_checksum(JsonManifestParseState *parse,
-                                                                        char 
*buffer, size_t size,
+                                                                        const 
char *buffer, size_t size,
                                                                         
pg_cryptohash_ctx *incr_ctx);
 static void json_manifest_parse_failure(JsonManifestParseContext *context,
                                                                                
char *msg);
@@ -183,7 +183,7 @@ 
json_parse_manifest_incremental_shutdown(JsonManifestParseIncrementalState *incs
 
 void
 json_parse_manifest_incremental_chunk(
-                                                                         
JsonManifestParseIncrementalState *incstate, char *chunk, size_t size,
+                                                                         
JsonManifestParseIncrementalState *incstate, const char *chunk, size_t size,
                                                                          bool 
is_last)
 {
        JsonParseErrorType res,
@@ -206,7 +206,7 @@ json_parse_manifest_incremental_chunk(
        if (!is_last)
        {
                if (pg_cryptohash_update(incstate->manifest_ctx,
-                                                                (uint8 *) 
chunk, size) < 0)
+                                                                (const uint8 
*) chunk, size) < 0)
                        context->error_cb(context, "could not update checksum 
of manifest");
        }
        else
@@ -225,7 +225,7 @@ json_parse_manifest_incremental_chunk(
  * invoked and is expected not to return.
  */
 void
-json_parse_manifest(JsonManifestParseContext *context, char *buffer,
+json_parse_manifest(JsonManifestParseContext *context, const char *buffer,
                                        size_t size)
 {
        JsonLexContext *lex;
@@ -810,7 +810,7 @@ json_manifest_finalize_wal_range(JsonManifestParseState 
*parse)
  * parse incr_ctx will be NULL.
  */
 static void
-verify_manifest_checksum(JsonManifestParseState *parse, char *buffer,
+verify_manifest_checksum(JsonManifestParseState *parse, const char *buffer,
                                                 size_t size, pg_cryptohash_ctx 
*incr_ctx)
 {
        JsonManifestParseContext *context = parse->context;
@@ -858,7 +858,7 @@ verify_manifest_checksum(JsonManifestParseState *parse, 
char *buffer,
        {
                manifest_ctx = incr_ctx;
        }
-       if (pg_cryptohash_update(manifest_ctx, (uint8 *) buffer, 
penultimate_newline + 1) < 0)
+       if (pg_cryptohash_update(manifest_ctx, (const uint8 *) buffer, 
penultimate_newline + 1) < 0)
                context->error_cb(context, "could not update checksum of 
manifest");
        if (pg_cryptohash_final(manifest_ctx, manifest_checksum_actual,
                                                        
sizeof(manifest_checksum_actual)) < 0)
diff --git a/src/include/common/parse_manifest.h 
b/src/include/common/parse_manifest.h
index 2777b1e9d22..ee571a568a1 100644
--- a/src/include/common/parse_manifest.h
+++ b/src/include/common/parse_manifest.h
@@ -27,7 +27,7 @@ typedef void (*json_manifest_version_callback) 
(JsonManifestParseContext *,
 typedef void (*json_manifest_system_identifier_callback) 
(JsonManifestParseContext *,
                                                                                
                                  uint64 manifest_system_identifier);
 typedef void (*json_manifest_per_file_callback) (JsonManifestParseContext *,
-                                                                               
                 char *pathname,
+                                                                               
                 const char *pathname,
                                                                                
                 size_t size, pg_checksum_type checksum_type,
                                                                                
                 int checksum_length, uint8 *checksum_payload);
 typedef void (*json_manifest_per_wal_range_callback) (JsonManifestParseContext 
*,
@@ -48,10 +48,10 @@ struct JsonManifestParseContext
 };
 
 extern void json_parse_manifest(JsonManifestParseContext *context,
-                                                               char *buffer, 
size_t size);
+                                                               const char 
*buffer, size_t size);
 extern JsonManifestParseIncrementalState 
*json_parse_manifest_incremental_init(JsonManifestParseContext *context);
 extern void json_parse_manifest_incremental_chunk(
-                                                                               
                  JsonManifestParseIncrementalState *incstate, char *chunk, 
size_t size,
+                                                                               
                  JsonManifestParseIncrementalState *incstate, const char 
*chunk, size_t size,
                                                                                
                  bool is_last);
 extern void 
json_parse_manifest_incremental_shutdown(JsonManifestParseIncrementalState 
*incstate);
 
-- 
2.45.2

Reply via email to