#include "access/htup_details.h"
#include "catalog/pg_type.h"
+#include "common/jsonapi.h"
#include "funcapi.h"
#include "hstore.h"
#include "lib/stringinfo.h"
#include "libpq/pqformat.h"
#include "utils/builtins.h"
#include "utils/json.h"
-#include "utils/jsonapi.h"
#include "utils/jsonb.h"
#include "utils/lsyscache.h"
#include "utils/memutils.h"
*/
#include "postgres.h"
+#include "common/jsonapi.h"
#include "tsearch/ts_cache.h"
#include "tsearch/ts_utils.h"
#include "utils/builtins.h"
-#include "utils/jsonapi.h"
#include "utils/jsonfuncs.h"
#include "catalog/namespace.h"
#include "catalog/pg_type.h"
#include "commands/defrem.h"
+#include "common/jsonapi.h"
#include "funcapi.h"
#include "tsearch/ts_cache.h"
#include "tsearch/ts_utils.h"
#include "utils/builtins.h"
-#include "utils/jsonapi.h"
#include "utils/jsonfuncs.h"
#include "utils/varlena.h"
int.o \
int8.o \
json.o \
- jsonapi.o \
jsonb.o \
jsonb_gin.o \
jsonb_op.o \
str = pq_getmsgtext(buf, buf->len - buf->cursor, &nbytes);
/* Validate it. */
- lex = makeJsonLexContextCstringLen(str, nbytes, false);
+ lex = makeJsonLexContextCstringLen(str, nbytes, GetDatabaseEncoding(), false);
pg_parse_json_or_ereport(lex, &nullSemAction);
PG_RETURN_TEXT_P(cstring_to_text_with_len(str, nbytes));
memset(&state, 0, sizeof(state));
memset(&sem, 0, sizeof(sem));
- lex = makeJsonLexContextCstringLen(json, len, true);
+ lex = makeJsonLexContextCstringLen(json, len, GetDatabaseEncoding(), true);
sem.semstate = (void *) &state;
#include "catalog/pg_collation.h"
#include "catalog/pg_type.h"
+#include "common/jsonapi.h"
#include "miscadmin.h"
#include "utils/builtins.h"
#include "utils/datetime.h"
#include "utils/hashutils.h"
#include "utils/json.h"
-#include "utils/jsonapi.h"
#include "utils/jsonb.h"
#include "utils/memutils.h"
#include "utils/varlena.h"
#include "access/htup_details.h"
#include "catalog/pg_type.h"
+#include "common/jsonapi.h"
#include "fmgr.h"
#include "funcapi.h"
#include "lib/stringinfo.h"
#include "utils/builtins.h"
#include "utils/hsearch.h"
#include "utils/json.h"
-#include "utils/jsonapi.h"
#include "utils/jsonb.h"
#include "utils/jsonfuncs.h"
#include "utils/lsyscache.h"
{
return makeJsonLexContextCstringLen(VARDATA_ANY(json),
VARSIZE_ANY_EXHDR(json),
+ GetDatabaseEncoding(),
need_escapes);
}
PopulateArrayState state;
JsonSemAction sem;
- state.lex = makeJsonLexContextCstringLen(json, len, true);
+ state.lex = makeJsonLexContextCstringLen(json, len, GetDatabaseEncoding(), true);
state.ctx = ctx;
memset(&sem, 0, sizeof(sem));
HASHCTL ctl;
HTAB *tab;
JHashState *state;
- JsonLexContext *lex = makeJsonLexContextCstringLen(json, len, true);
+ JsonLexContext *lex = makeJsonLexContextCstringLen(json, len, GetDatabaseEncoding(), true);
JsonSemAction *sem;
memset(&ctl, 0, sizeof(ctl));
f2s.o \
file_perm.o \
ip.o \
+ jsonapi.o \
keywords.o \
kwlookup.o \
link-canary.o \
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * src/backend/utils/adt/jsonapi.c
+ * src/common/jsonapi.c
*
*-------------------------------------------------------------------------
*/
+#ifndef FRONTEND
#include "postgres.h"
+#else
+#include "postgres_fe.h"
+#endif
+#include "common/jsonapi.h"
#include "mb/pg_wchar.h"
+
+#ifdef FRONTEND
+#include "common/logging.h"
+#else
#include "miscadmin.h"
-#include "utils/jsonapi.h"
+#endif
+
+#ifdef FRONTEND
+#define check_stack_depth()
+#define json_log_and_abort(...) \
+ do { pg_log_fatal(__VA_ARGS__); exit(1); } while(0)
+#else
+#define json_log_and_abort(...) elog(ERROR, __VA_ARGS__)
+#endif
/*
* The context of the parser is maintained by the recursive descent
* if really required.
*/
JsonLexContext *
-makeJsonLexContextCstringLen(char *json, int len, bool need_escapes)
+makeJsonLexContextCstringLen(char *json, int len, int encoding, bool need_escapes)
{
JsonLexContext *lex = palloc0(sizeof(JsonLexContext));
lex->input = lex->token_terminator = lex->line_start = json;
lex->line_number = 1;
lex->input_length = len;
+ lex->input_encoding = encoding;
if (need_escapes)
lex->strval = makeStringInfo();
return lex;
ch = (ch * 16) + (*s - 'A') + 10;
else
{
- lex->token_terminator = s + pg_mblen(s);
+ lex->token_terminator = s + pg_encoding_mblen(lex->input_encoding, s);
return JSON_UNICODE_ESCAPE_FORMAT;
}
}
/* We can't allow this, since our TEXT type doesn't */
return JSON_UNICODE_CODE_POINT_ZERO;
}
- else if (GetDatabaseEncoding() == PG_UTF8)
+ else if (lex->input_encoding == PG_UTF8)
{
unicode_to_utf8(ch, (unsigned char *) utf8str);
utf8len = pg_utf_mblen((unsigned char *) utf8str);
default:
/* Not a valid string escape, so signal error. */
lex->token_start = s;
- lex->token_terminator = s + pg_mblen(s);
+ lex->token_terminator = s + pg_encoding_mblen(lex->input_encoding, s);
return JSON_ESCAPING_INVALID;
}
}
* shown it's not a performance win.
*/
lex->token_start = s;
- lex->token_terminator = s + pg_mblen(s);
+ lex->token_terminator = s + pg_encoding_mblen(lex->input_encoding, s);
return JSON_ESCAPING_INVALID;
}
* unhandled enum values. But this needs to be here anyway to cover the
* possibility of an incorrect input.
*/
- elog(ERROR, "unexpected json parse state: %d", (int) ctx);
+ json_log_and_abort("unexpected json parse state: %d", (int) ctx);
return JSON_SUCCESS; /* silence stupider compilers */
}
* unhandled enum values. But this needs to be here anyway to cover the
* possibility of an incorrect input.
*/
- elog(ERROR, "unexpected json parse error type: %d", (int) error);
+ json_log_and_abort("unexpected json parse error type: %d", (int) error);
return NULL; /* silence stupider compilers */
}
{
char *input;
int input_length;
+ int input_encoding;
char *token_start;
char *token_terminator;
char *prev_token_terminator;
*/
extern JsonLexContext *makeJsonLexContextCstringLen(char *json,
int len,
+ int encoding,
bool need_escapes);
/* lex one token */
#ifndef JSONFUNCS_H
#define JSONFUNCS_H
-#include "utils/jsonapi.h"
+#include "common/jsonapi.h"
#include "utils/jsonb.h"
/*