diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2021-03-01 16:44:17 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2021-03-01 16:44:17 -0500 |
commit | ffd3944ab9d481906137bc7d20f5325a2bd68acc (patch) | |
tree | 6c9b03abc608dc3ea73d8baf9179e9426016ca5d /src/backend/utils/adt/jsonfuncs.c | |
parent | bd69ddfcdbf650f11af4317f3f6686c012cf66d0 (diff) | |
download | postgresql-ffd3944ab9d481906137bc7d20f5325a2bd68acc.tar.gz postgresql-ffd3944ab9d481906137bc7d20f5325a2bd68acc.zip |
Improve reporting for syntax errors in multi-line JSON data.
Point to the specific line where the error was detected; the
previous code tended to include several preceding lines as well.
Avoid re-scanning the entire input to recompute which line that
was. Simplify the logic a bit. Add test cases.
Simon Riggs and Hamid Akhtar, reviewed by Daniel Gustafsson and myself
Discussion: https://postgr.es/m/CANbhV-EPBnXm3MF_TTWBwwqgn1a1Ghmep9VHfqmNBQ8BT0f+_g@mail.gmail.com
Diffstat (limited to 'src/backend/utils/adt/jsonfuncs.c')
-rw-r--r-- | src/backend/utils/adt/jsonfuncs.c | 23 |
1 files changed, 6 insertions, 17 deletions
diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c index f194ff911b0..511467280f2 100644 --- a/src/backend/utils/adt/jsonfuncs.c +++ b/src/backend/utils/adt/jsonfuncs.c @@ -641,30 +641,19 @@ report_json_context(JsonLexContext *lex) const char *context_start; const char *context_end; const char *line_start; - int line_number; char *ctxt; int ctxtlen; const char *prefix; const char *suffix; /* Choose boundaries for the part of the input we will display */ - context_start = lex->input; + line_start = lex->line_start; + context_start = line_start; context_end = lex->token_terminator; - line_start = context_start; - line_number = 1; - for (;;) + + /* Advance until we are close enough to context_end */ + while (context_end - context_start >= 50 && context_start < context_end) { - /* Always advance over newlines */ - if (context_start < context_end && *context_start == '\n') - { - context_start++; - line_start = context_start; - line_number++; - continue; - } - /* Otherwise, done as soon as we are close enough to context_end */ - if (context_end - context_start < 50) - break; /* Advance to next multibyte character */ if (IS_HIGHBIT_SET(*context_start)) context_start += pg_mblen(context_start); @@ -694,7 +683,7 @@ report_json_context(JsonLexContext *lex) suffix = (lex->token_type != JSON_TOKEN_END && context_end - lex->input < lex->input_length && *context_end != '\n' && *context_end != '\r') ? "..." : ""; return errcontext("JSON data, line %d: %s%s%s", - line_number, prefix, ctxt, suffix); + lex->line_number, prefix, ctxt, suffix); } |