{
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 */
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;
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;
const char *function_name;
HTAB *hash;
char *saved_scalar;
- char *save_json_start;
+ const char *save_json_start;
JsonTokenType saved_token_type;
} JHashState;
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;
{
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 */
{
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 */
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 */
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);
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);
_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);
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);
_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);
* 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);
* 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;
{
Datum res;
char *str = NULL;
- char *json = NULL;
+ const char *json = NULL;
if (jsv->is_json)
{
str[len] = '\0';
}
else
- str = json; /* string is already null-terminated */
+ {
+ /* string is already null-terminated */
+ str = unconstify(char *, json);
+ }
/* If converting to json/jsonb, make string into valid JSON literal */
if ((typid == JSONOID || typid == JSONBOID) &&
* 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;
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);
*/
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;
}
* cleanup.
*/
JsonLexContext *
-makeJsonLexContextCstringLen(JsonLexContext *lex, char *json,
+makeJsonLexContextCstringLen(JsonLexContext *lex, const char *json,
size_t len, int encoding, bool need_escapes)
{
if (lex == NULL)
JsonParseErrorType
pg_parse_json_incremental(JsonLexContext *lex,
JsonSemAction *sem,
- char *json,
+ const char *json,
size_t len,
bool is_last)
{
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)
break;
default:
{
- char *p;
+ const char *p;
/*
* We're not dealing with a string, number, legal
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 */
} 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)
}
else
{
- char *p = s;
+ const char *p = s;
if (hi_surrogate != -1)
FAIL_AT_CHAR_END(JSON_UNICODE_LOW_SURROGATE);
* 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;