🌐 AI搜索 & 代理 主页
Skip to content

Commit f68597e

Browse files
Improve error messages of input functions for pg_dependencies and pg_ndistinct
The error details updated in this commit can be reached in the regression tests. They did not follow the project style, and they should be written them as full sentences. Some of the errors are switched to use an elog(), for cases that involve paths that cannot be reached based on the previous state of the parser processing the input data (array start, object end, etc.). The error messages for these cases use now a more consistent style across the board, with the state of the parser reported for debugging. Reported-by: Tom Lane <tgl@sss.pgh.pa.us> Author: Michael Paquier <michael@paquier.xyz> Co-authored-by: Corey Huinker <corey.huinker@gmail.com> Discussion: https://postgr.es/m/1353179.1764901790@sss.pgh.pa.us
1 parent 4eda42e commit f68597e

File tree

4 files changed

+227
-241
lines changed

4 files changed

+227
-241
lines changed

src/backend/utils/adt/pg_dependencies.c

Lines changed: 26 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ dependencies_object_start(void *state)
8585
errsave(parse->escontext,
8686
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
8787
errmsg("malformed pg_dependencies: \"%s\"", parse->str),
88-
errdetail("Expected an object key."));
88+
errdetail("A key was expected."));
8989
break;
9090

9191
case DEPS_EXPECT_ATTNUM_LIST:
@@ -124,10 +124,9 @@ dependencies_object_start(void *state)
124124
break;
125125

126126
default:
127-
errsave(parse->escontext,
128-
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
129-
errmsg("malformed pg_dependencies: \"%s\"", parse->str),
130-
errdetail("Unexpected parse state: %d", (int) parse->state));
127+
elog(ERROR,
128+
"object start of \"%s\" found in unexpected parse state: %d.",
129+
"pg_dependencies", (int) parse->state);
131130
break;
132131
}
133132

@@ -149,20 +148,16 @@ dependencies_object_end(void *state)
149148
int natts = 0;
150149

151150
if (parse->state != DEPS_EXPECT_KEY)
152-
{
153-
errsave(parse->escontext,
154-
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
155-
errmsg("malformed pg_dependencies: \"%s\"", parse->str),
156-
errdetail("Unexpected parse state: %d", (int) parse->state));
157-
return JSON_SEM_ACTION_FAILED;
158-
}
151+
elog(ERROR,
152+
"object end of \"%s\" found in unexpected parse state: %d.",
153+
"pg_dependencies", (int) parse->state);
159154

160155
if (!parse->found_attributes)
161156
{
162157
errsave(parse->escontext,
163158
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
164159
errmsg("malformed pg_dependencies: \"%s\"", parse->str),
165-
errdetail("Item must contain \"%s\" key",
160+
errdetail("Item must contain \"%s\" key.",
166161
PG_DEPENDENCIES_KEY_ATTRIBUTES));
167162
return JSON_SEM_ACTION_FAILED;
168163
}
@@ -226,7 +221,7 @@ dependencies_object_end(void *state)
226221
errsave(parse->escontext,
227222
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
228223
errmsg("malformed pg_dependencies: \"%s\"", parse->str),
229-
errdetail("Item \"%s\" value %d found in the \"%s\" list.",
224+
errdetail("Item \"%s\" with value %d has been found in the \"%s\" list.",
230225
PG_DEPENDENCIES_KEY_DEPENDENCY, parse->dependency,
231226
PG_DEPENDENCIES_KEY_ATTRIBUTES));
232227
return JSON_SEM_ACTION_FAILED;
@@ -274,7 +269,7 @@ dependencies_array_start(void *state)
274269
errsave(parse->escontext,
275270
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
276271
errmsg("malformed pg_dependencies: \"%s\"", parse->str),
277-
errdetail("Array found in unexpected place."));
272+
errdetail("Array has been found at an unexpected location."));
278273
return JSON_SEM_ACTION_FAILED;
279274
}
280275

@@ -326,10 +321,9 @@ dependencies_array_end(void *state)
326321
* This can only happen if a case was missed in
327322
* dependencies_array_start().
328323
*/
329-
errsave(parse->escontext,
330-
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
331-
errmsg("malformed pg_dependencies: \"%s\"", parse->str),
332-
errdetail("Array found in unexpected place."));
324+
elog(ERROR,
325+
"array end of \"%s\" found in unexpected parse state: %d.",
326+
"pg_dependencies", (int) parse->state);
333327
break;
334328
}
335329
return JSON_SEM_ACTION_FAILED;
@@ -443,10 +437,9 @@ dependencies_array_element_start(void *state, bool isnull)
443437
break;
444438

445439
default:
446-
errsave(parse->escontext,
447-
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
448-
errmsg("malformed pg_dependencies: \"%s\"", parse->str),
449-
errdetail("Unexpected array element."));
440+
elog(ERROR,
441+
"array element start of \"%s\" found in unexpected parse state: %d.",
442+
"pg_dependencies", (int) parse->state);
450443
break;
451444
}
452445

@@ -499,7 +492,7 @@ dependencies_scalar(void *state, char *token, JsonTokenType tokentype)
499492
errsave(parse->escontext,
500493
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
501494
errmsg("malformed pg_dependencies: \"%s\"", parse->str),
502-
errdetail("Invalid \"%s\" value.", PG_DEPENDENCIES_KEY_ATTRIBUTES));
495+
errdetail("Key \"%s\" has an incorrect value.", PG_DEPENDENCIES_KEY_ATTRIBUTES));
503496
return JSON_SEM_ACTION_FAILED;
504497
}
505498

@@ -512,7 +505,7 @@ dependencies_scalar(void *state, char *token, JsonTokenType tokentype)
512505
errsave(parse->escontext,
513506
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
514507
errmsg("malformed pg_dependencies: \"%s\"", parse->str),
515-
errdetail("Invalid \"%s\" element: %d.",
508+
errdetail("Invalid \"%s\" element has been found: %d.",
516509
PG_DEPENDENCIES_KEY_ATTRIBUTES, attnum));
517510
return JSON_SEM_ACTION_FAILED;
518511
}
@@ -526,7 +519,7 @@ dependencies_scalar(void *state, char *token, JsonTokenType tokentype)
526519
errsave(parse->escontext,
527520
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
528521
errmsg("malformed pg_dependencies: \"%s\"", parse->str),
529-
errdetail("Invalid \"%s\" element: %d cannot follow %d.",
522+
errdetail("Invalid \"%s\" element has been found: %d cannot follow %d.",
530523
PG_DEPENDENCIES_KEY_ATTRIBUTES, attnum, prev));
531524
return JSON_SEM_ACTION_FAILED;
532525
}
@@ -544,7 +537,7 @@ dependencies_scalar(void *state, char *token, JsonTokenType tokentype)
544537
errsave(parse->escontext,
545538
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
546539
errmsg("malformed pg_dependencies: \"%s\"", parse->str),
547-
errdetail("Invalid \"%s\" value.", PG_DEPENDENCIES_KEY_DEPENDENCY));
540+
errdetail("Key \"%s\" has an incorrect value.", PG_DEPENDENCIES_KEY_DEPENDENCY));
548541
return JSON_SEM_ACTION_FAILED;
549542
}
550543

@@ -557,7 +550,7 @@ dependencies_scalar(void *state, char *token, JsonTokenType tokentype)
557550
errsave(parse->escontext,
558551
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
559552
errmsg("malformed pg_dependencies: \"%s\"", parse->str),
560-
errdetail("Invalid \"%s\" value: %d.",
553+
errdetail("Key \"%s\" has an incorrect value: %d.",
561554
PG_DEPENDENCIES_KEY_DEPENDENCY, parse->dependency));
562555
return JSON_SEM_ACTION_FAILED;
563556
}
@@ -574,7 +567,7 @@ dependencies_scalar(void *state, char *token, JsonTokenType tokentype)
574567
errsave(parse->escontext,
575568
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
576569
errmsg("malformed pg_dependencies: \"%s\"", parse->str),
577-
errdetail("Invalid \"%s\" value.", PG_DEPENDENCIES_KEY_DEGREE));
570+
errdetail("Key \"%s\" has an incorrect value.", PG_DEPENDENCIES_KEY_DEGREE));
578571
return JSON_SEM_ACTION_FAILED;
579572
}
580573

@@ -585,7 +578,7 @@ dependencies_scalar(void *state, char *token, JsonTokenType tokentype)
585578
errsave(parse->escontext,
586579
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
587580
errmsg("malformed pg_dependencies: \"%s\"", parse->str),
588-
errdetail("Unexpected scalar."));
581+
errdetail("Unexpected scalar has been found."));
589582
break;
590583
}
591584

@@ -686,7 +679,7 @@ build_mvdependencies(DependenciesParseState *parse, char *str)
686679
errsave(parse->escontext,
687680
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
688681
errmsg("malformed pg_dependencies: \"%s\"", str),
689-
errdetail("Unexpected end state %d.", parse->state));
682+
errdetail("Unexpected end state has been found: %d.", parse->state));
690683
return NULL;
691684
}
692685

@@ -721,7 +714,7 @@ build_mvdependencies(DependenciesParseState *parse, char *str)
721714
errsave(parse->escontext,
722715
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
723716
errmsg("malformed pg_dependencies: \"%s\"", str),
724-
errdetail("Duplicate \"%s\" array: [%s] with \"%s\": %d.",
717+
errdetail("Duplicated \"%s\" array has been found: [%s] for key \"%s\" and value %d.",
725718
PG_DEPENDENCIES_KEY_ATTRIBUTES, attnum_list,
726719
PG_DEPENDENCIES_KEY_DEPENDENCY, attnum_dep));
727720
pfree(mvdeps);
@@ -808,7 +801,7 @@ pg_dependencies_in(PG_FUNCTION_ARGS)
808801
errsave(parse_state.escontext,
809802
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
810803
errmsg("malformed pg_dependencies: \"%s\"", str),
811-
errdetail("Must be valid JSON."));
804+
errdetail("Input data must be valid JSON."));
812805

813806
PG_RETURN_NULL();
814807
}

src/backend/utils/adt/pg_ndistinct.c

Lines changed: 23 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ ndistinct_object_start(void *state)
8181
errsave(parse->escontext,
8282
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
8383
errmsg("malformed pg_ndistinct: \"%s\"", parse->str),
84-
errdetail("Expected an object key."));
84+
errdetail("A key was expected."));
8585
break;
8686

8787
case NDIST_EXPECT_ATTNUM_LIST:
@@ -111,10 +111,9 @@ ndistinct_object_start(void *state)
111111
break;
112112

113113
default:
114-
errsave(parse->escontext,
115-
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
116-
errmsg("malformed pg_ndistinct: \"%s\"", parse->str),
117-
errdetail("Unexpected parse state: %d", (int) parse->state));
114+
elog(ERROR,
115+
"object start of \"%s\" found in unexpected parse state: %d.",
116+
"pg_ndistinct", (int) parse->state);
118117
break;
119118
}
120119

@@ -136,13 +135,9 @@ ndistinct_object_end(void *state)
136135
MVNDistinctItem *item;
137136

138137
if (parse->state != NDIST_EXPECT_KEY)
139-
{
140-
errsave(parse->escontext,
141-
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
142-
errmsg("malformed pg_ndistinct: \"%s\"", parse->str),
143-
errdetail("Unexpected parse state: %d", (int) parse->state));
144-
return JSON_SEM_ACTION_FAILED;
145-
}
138+
elog(ERROR,
139+
"object end of \"%s\" found in unexpected parse state: %d.",
140+
"pg_ndistinct", (int) parse->state);
146141

147142
if (!parse->found_attributes)
148143
{
@@ -228,7 +223,7 @@ ndistinct_array_start(void *state)
228223
errsave(parse->escontext,
229224
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
230225
errmsg("malformed pg_ndistinct: \"%s\"", parse->str),
231-
errdetail("Array found in unexpected place."));
226+
errdetail("Array has been found at an unexpected location."));
232227
return JSON_SEM_ACTION_FAILED;
233228
}
234229

@@ -286,10 +281,9 @@ ndistinct_array_end(void *state)
286281
* This can only happen if a case was missed in
287282
* ndistinct_array_start().
288283
*/
289-
errsave(parse->escontext,
290-
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
291-
errmsg("malformed pg_ndistinct: \"%s\"", parse->str),
292-
errdetail("Array found in unexpected place."));
284+
elog(ERROR,
285+
"array end of \"%s\" found in unexpected parse state: %d.",
286+
"pg_ndistinct", (int) parse->state);
293287
break;
294288
}
295289

@@ -384,10 +378,9 @@ ndistinct_array_element_start(void *state, bool isnull)
384378
break;
385379

386380
default:
387-
errsave(parse->escontext,
388-
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
389-
errmsg("malformed pg_ndistinct: \"%s\"", parse->str),
390-
errdetail("Unexpected array element."));
381+
elog(ERROR,
382+
"array element start of \"%s\" found in unexpected parse state: %d.",
383+
"pg_ndistinct", (int) parse->state);
391384
break;
392385
}
393386

@@ -440,7 +433,7 @@ ndistinct_scalar(void *state, char *token, JsonTokenType tokentype)
440433
errsave(parse->escontext,
441434
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
442435
errmsg("malformed pg_ndistinct: \"%s\"", parse->str),
443-
errdetail("Invalid \"%s\" value.", PG_NDISTINCT_KEY_ATTRIBUTES));
436+
errdetail("Key \"%s\" has an incorrect value.", PG_NDISTINCT_KEY_ATTRIBUTES));
444437
return JSON_SEM_ACTION_FAILED;
445438
}
446439

@@ -453,7 +446,7 @@ ndistinct_scalar(void *state, char *token, JsonTokenType tokentype)
453446
errsave(parse->escontext,
454447
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
455448
errmsg("malformed pg_ndistinct: \"%s\"", parse->str),
456-
errdetail("Invalid \"%s\" element: %d.",
449+
errdetail("Invalid \"%s\" element has been found: %d.",
457450
PG_NDISTINCT_KEY_ATTRIBUTES, attnum));
458451
return JSON_SEM_ACTION_FAILED;
459452
}
@@ -467,7 +460,7 @@ ndistinct_scalar(void *state, char *token, JsonTokenType tokentype)
467460
errsave(parse->escontext,
468461
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
469462
errmsg("malformed pg_ndistinct: \"%s\"", parse->str),
470-
errdetail("Invalid \"%s\" element: %d cannot follow %d.",
463+
errdetail("Invalid \"%s\" element has been found: %d cannot follow %d.",
471464
PG_NDISTINCT_KEY_ATTRIBUTES, attnum, prev));
472465
return JSON_SEM_ACTION_FAILED;
473466
}
@@ -494,15 +487,15 @@ ndistinct_scalar(void *state, char *token, JsonTokenType tokentype)
494487
errsave(parse->escontext,
495488
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
496489
errmsg("malformed pg_ndistinct: \"%s\"", parse->str),
497-
errdetail("Invalid \"%s\" value.",
490+
errdetail("Key \"%s\" has an incorrect value.",
498491
PG_NDISTINCT_KEY_NDISTINCT));
499492
break;
500493

501494
default:
502495
errsave(parse->escontext,
503496
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
504497
errmsg("malformed pg_ndistinct: \"%s\"", parse->str),
505-
errdetail("Unexpected scalar."));
498+
errdetail("Unexpected scalar has been found."));
506499
break;
507500
}
508501

@@ -627,7 +620,7 @@ build_mvndistinct(NDistinctParseState *parse, char *str)
627620
errsave(parse->escontext,
628621
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
629622
errmsg("malformed pg_ndistinct: \"%s\"", str),
630-
errdetail("Unexpected end state %d.", parse->state));
623+
errdetail("Unexpected end state has been found: %d.", parse->state));
631624
return NULL;
632625
}
633626

@@ -655,7 +648,7 @@ build_mvndistinct(NDistinctParseState *parse, char *str)
655648
errsave(parse->escontext,
656649
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
657650
errmsg("malformed pg_ndistinct: \"%s\"", str),
658-
errdetail("Duplicated \"%s\" array found: [%s]",
651+
errdetail("Duplicated \"%s\" array has been found: [%s].",
659652
PG_NDISTINCT_KEY_ATTRIBUTES, s));
660653
pfree(s);
661654
return NULL;
@@ -705,7 +698,7 @@ build_mvndistinct(NDistinctParseState *parse, char *str)
705698
errsave(parse->escontext,
706699
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
707700
errmsg("malformed pg_ndistinct: \"%s\"", str),
708-
errdetail("\"%s\" array: [%s] must be a subset of array: [%s]",
701+
errdetail("\"%s\" array [%s] must be a subset of array [%s].",
709702
PG_NDISTINCT_KEY_ATTRIBUTES,
710703
item_list, refitem_list));
711704
pfree(item_list);
@@ -784,7 +777,7 @@ pg_ndistinct_in(PG_FUNCTION_ARGS)
784777
errsave(parse_state.escontext,
785778
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
786779
errmsg("malformed pg_ndistinct: \"%s\"", str),
787-
errdetail("Must be valid JSON."));
780+
errdetail("Input data must be valid JSON."));
788781

789782
PG_RETURN_NULL();
790783
}

0 commit comments

Comments
 (0)