From 2631ebab7b18bdc079fd86107c47d6104a6b3c6e Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 10 Jul 2023 10:46:54 +0200 Subject: [PATCH] Message wording improvements --- src/backend/access/common/reloptions.c | 2 +- src/backend/backup/basebackup_zstd.c | 4 ++-- src/backend/commands/copyfromparse.c | 8 ++++---- src/backend/commands/tablecmds.c | 6 +++--- src/backend/libpq/auth.c | 2 +- .../replication/libpqwalreceiver/libpqwalreceiver.c | 2 +- src/backend/replication/walsender.c | 2 +- src/backend/storage/ipc/procarray.c | 4 +++- src/backend/tcop/postgres.c | 2 +- src/backend/tcop/utility.c | 1 + src/backend/utils/adt/jsonpath_scan.l | 10 +++++----- src/backend/utils/adt/pg_locale.c | 6 ++++-- src/backend/utils/misc/guc_tables.c | 8 ++++---- src/test/regress/expected/alter_table.out | 2 +- src/test/regress/expected/collate.icu.utf8.out | 4 ++-- src/test/regress/expected/copy2.out | 8 ++++---- src/test/regress/expected/create_table.out | 2 +- src/test/regress/expected/foreign_key.out | 4 ++-- src/test/regress/expected/jsonpath_encoding.out | 12 ++++++------ src/test/regress/expected/jsonpath_encoding_1.out | 12 ++++++------ 20 files changed, 53 insertions(+), 48 deletions(-) diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c index 11cc431677..469de9bb49 100644 --- a/src/backend/access/common/reloptions.c +++ b/src/backend/access/common/reloptions.c @@ -1989,7 +1989,7 @@ partitioned_table_reloptions(Datum reloptions, bool validate) ereport(ERROR, errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("cannot specify storage parameters for a partitioned table"), - errhint("Specify storage parameters for its leaf partitions, instead.")); + errhint("Specify storage parameters for its leaf partitions instead.")); return NULL; } diff --git a/src/backend/backup/basebackup_zstd.c b/src/backend/backup/basebackup_zstd.c index 1bb5820c88..6a078cdf48 100644 --- a/src/backend/backup/basebackup_zstd.c +++ b/src/backend/backup/basebackup_zstd.c @@ -126,8 +126,8 @@ bbsink_zstd_begin_backup(bbsink *sink) if (ZSTD_isError(ret)) ereport(ERROR, errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("could not set compression flag for %s: %s", - "long", ZSTD_getErrorName(ret))); + errmsg("could not enable long-distance mode: %s", + ZSTD_getErrorName(ret))); } /* diff --git a/src/backend/commands/copyfromparse.c b/src/backend/commands/copyfromparse.c index 3853902a16..d2e8c74402 100644 --- a/src/backend/commands/copyfromparse.c +++ b/src/backend/commands/copyfromparse.c @@ -1703,8 +1703,8 @@ CopyReadAttributesText(CopyFromState cstate) ereport(ERROR, (errcode(ERRCODE_BAD_COPY_FILE_FORMAT), - errmsg("unexpected DEFAULT in COPY data"), - errdetail("Column \"%s\" has no DEFAULT value.", + errmsg("unexpected default marker in COPY data"), + errdetail("Column \"%s\" has no default value.", NameStr(att->attname)))); } } @@ -1918,8 +1918,8 @@ endfield: ereport(ERROR, (errcode(ERRCODE_BAD_COPY_FILE_FORMAT), - errmsg("unexpected DEFAULT in COPY data"), - errdetail("Column \"%s\" has no DEFAULT value.", + errmsg("unexpected default marker in COPY data"), + errdetail("Column \"%s\" has no default value.", NameStr(att->attname)))); } } diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 313e058482..b2acf03c7c 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -10911,7 +10911,7 @@ ATExecAlterConstraint(Relation rel, AlterTableCmd *cmd, bool recurse, ancestorname && ancestortable ? errdetail("Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\".", cmdcon->conname, ancestorname, ancestortable) : 0, - errhint("You may alter the constraint it derives from, instead."))); + errhint("You may alter the constraint it derives from instead."))); } /* @@ -13860,7 +13860,7 @@ ATExecChangeOwner(Oid relationOid, Oid newOwnerId, bool recursing, LOCKMODE lock (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("cannot change owner of index \"%s\"", NameStr(tuple_class->relname)), - errhint("Change the ownership of the index's table, instead."))); + errhint("Change the ownership of the index's table instead."))); /* quick hack to exit via the no-op path */ newOwnerId = tuple_class->relowner; } @@ -13872,7 +13872,7 @@ ATExecChangeOwner(Oid relationOid, Oid newOwnerId, bool recursing, LOCKMODE lock (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("cannot change owner of index \"%s\"", NameStr(tuple_class->relname)), - errhint("Change the ownership of the index's table, instead."))); + errhint("Change the ownership of the index's table instead."))); break; case RELKIND_SEQUENCE: if (!recursing && diff --git a/src/backend/libpq/auth.c b/src/backend/libpq/auth.c index a98b934a8e..e7571aaddb 100644 --- a/src/backend/libpq/auth.c +++ b/src/backend/libpq/auth.c @@ -312,7 +312,7 @@ auth_failed(Port *port, int status, const char *logdetail) break; } - cdetail = psprintf(_("Connection matched %s line %d: \"%s\""), + cdetail = psprintf(_("Connection matched file \"%s\" line %d: \"%s\""), port->hba->sourcefile, port->hba->linenumber, port->hba->rawline); if (logdetail) diff --git a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c index dc9c5c82d9..60d5c1fc40 100644 --- a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c +++ b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c @@ -196,7 +196,7 @@ libpqrcv_connect(const char *conninfo, bool logical, bool must_use_password, (errcode(ERRCODE_S_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED), errmsg("password is required"), errdetail("Non-superuser cannot connect if the server does not request a password."), - errhint("Target server's authentication method must be changed. or set password_required=false in the subscription attributes."))); + errhint("Target server's authentication method must be changed, or set password_required=false in the subscription parameters."))); } if (logical) diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index d3a136b6f5..4c53de08b9 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -1113,7 +1113,7 @@ CreateReplicationSlot(CreateReplicationSlotCmd *cmd) if (!XactReadOnly) ereport(ERROR, /*- translator: %s is a CREATE_REPLICATION_SLOT statement */ - (errmsg("%s must be called in a read only transaction", + (errmsg("%s must be called in a read-only transaction", "CREATE_REPLICATION_SLOT ... (SNAPSHOT 'use')"))); if (FirstSnapshotSet) diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c index 8c8d728ba8..2a3da49b8f 100644 --- a/src/backend/storage/ipc/procarray.c +++ b/src/backend/storage/ipc/procarray.c @@ -3825,7 +3825,9 @@ TerminateOtherDBBackends(Oid databaseId) if (superuser_arg(proc->roleId) && !superuser()) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("must be a superuser to terminate superuser process"))); + errmsg("permission denied to terminate process"), + errdetail("Only roles with the %s attribute may terminate processes of roles with the %s attribute.", + "SUPERUSER", "SUPERUSER"))); /* Users can signal backends they have role membership in. */ if (!has_privs_of_role(GetUserId(), proc->roleId) && diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 01b6cc1f7d..b46b0551f9 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -2527,7 +2527,7 @@ errdetail_recovery_conflict(void) errdetail("User query might have needed to see row versions that must be removed."); break; case PROCSIG_RECOVERY_CONFLICT_LOGICALSLOT: - errdetail("User was using a logical slot that must be invalidated."); + errdetail("User was using a logical replication slot that must be invalidated."); break; case PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK: errdetail("User transaction caused buffer deadlock with recovery."); diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index 30b51bf4d3..866b294318 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -950,6 +950,7 @@ standard_ProcessUtility(PlannedStmt *pstmt, if (!has_privs_of_role(GetUserId(), ROLE_PG_CHECKPOINT)) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + /* translator: %s is name of a SQL command, eg CHECKPOINT */ errmsg("permission denied to execute %s command", "CHECKPOINT"), errdetail("Only roles with privileges of the \"%s\" role may execute this command.", diff --git a/src/backend/utils/adt/jsonpath_scan.l b/src/backend/utils/adt/jsonpath_scan.l index 0916fc1027..29c26af444 100644 --- a/src/backend/utils/adt/jsonpath_scan.l +++ b/src/backend/utils/adt/jsonpath_scan.l @@ -171,13 +171,13 @@ hex_fail \\x{hexdigit}{0,1} {unicode}*{unicodefail} { jsonpath_yyerror(NULL, escontext, - "invalid unicode sequence"); + "invalid Unicode escape sequence"); yyterminate(); } {hex_fail} { jsonpath_yyerror(NULL, escontext, - "invalid hex character sequence"); + "invalid hexadecimal character sequence"); yyterminate(); } @@ -198,7 +198,7 @@ hex_fail \\x{hexdigit}{0,1} <> { jsonpath_yyerror(NULL, escontext, - "unexpected end of quoted string"); + "unterminated quoted string"); yyterminate(); } @@ -554,7 +554,7 @@ parsejsonpath(const char *str, int len, struct Node *escontext) jsonpath_scanner_init(str, len); if (jsonpath_yyparse((void *) &parseresult, escontext) != 0) - jsonpath_yyerror(NULL, escontext, "bogus input"); /* shouldn't happen */ + jsonpath_yyerror(NULL, escontext, "invalid input"); /* shouldn't happen */ jsonpath_scanner_finish(); @@ -611,7 +611,7 @@ addUnicodeChar(int ch, struct Node *escontext) else if (!pg_unicode_to_server_noerror(ch, (unsigned char *) cbuf)) ereturn(escontext, false, (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("could not convert unicode to server encoding"))); + errmsg("could not convert Unicode to server encoding"))); addstring(false, cbuf, strlen(cbuf)); } return true; diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c index c8b36f3af2..c2342e6448 100644 --- a/src/backend/utils/adt/pg_locale.c +++ b/src/backend/utils/adt/pg_locale.c @@ -2862,7 +2862,8 @@ icu_validate_locale(const char *loc_str) ereport(elevel, (errmsg("could not get language from ICU locale \"%s\": %s", loc_str, u_errorName(status)), - errhint("To disable ICU locale validation, set parameter icu_validation_level to DISABLED."))); + errhint("To disable ICU locale validation, set the parameter \"%s\" to \"%s\".", + "icu_validation_level", "disabled"))); return; } @@ -2890,7 +2891,8 @@ icu_validate_locale(const char *loc_str) ereport(elevel, (errmsg("ICU locale \"%s\" has unknown language \"%s\"", loc_str, lang), - errhint("To disable ICU locale validation, set parameter icu_validation_level to DISABLED."))); + errhint("To disable ICU locale validation, set the parameter \"%s\" to \"%s\".", + "icu_validation_level", "disabled"))); /* check that it can be opened */ collator = pg_ucol_open(loc_str); diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c index 71e27f8eb0..15b51f2c5b 100644 --- a/src/backend/utils/misc/guc_tables.c +++ b/src/backend/utils/misc/guc_tables.c @@ -994,10 +994,10 @@ struct config_bool ConfigureNamesBool[] = }, { {"enable_presorted_aggregate", PGC_USERSET, QUERY_TUNING_METHOD, - gettext_noop("Enables the planner's ability to produce plans which " + gettext_noop("Enables the planner's ability to produce plans that " "provide presorted input for ORDER BY / DISTINCT aggregate " "functions."), - gettext_noop("Allows the query planner to build plans which provide " + gettext_noop("Allows the query planner to build plans that provide " "presorted input for aggregate functions with an ORDER BY / " "DISTINCT clause. When disabled, implicit sorts are always " "performed during execution."), @@ -4890,8 +4890,8 @@ struct config_enum ConfigureNamesEnum[] = {"debug_parallel_query", PGC_USERSET, DEVELOPER_OPTIONS, gettext_noop("Forces the planner's use parallel query nodes."), gettext_noop("This can be useful for testing the parallel query infrastructure " - "by forcing the planner to generate plans which contains nodes " - "which perform tuple communication between workers and the main process."), + "by forcing the planner to generate plans that contain nodes " + "that perform tuple communication between workers and the main process."), GUC_NOT_IN_SAMPLE | GUC_EXPLAIN }, &debug_parallel_query, diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index 3b708c7976..05351cb1a4 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -3855,7 +3855,7 @@ ERROR: cannot alter column "b" because it is part of the partition key of relat -- specifying storage parameters for partitioned tables is not supported ALTER TABLE partitioned SET (fillfactor=100); ERROR: cannot specify storage parameters for a partitioned table -HINT: Specify storage parameters for its leaf partitions, instead. +HINT: Specify storage parameters for its leaf partitions instead. -- partitioned table cannot participate in regular inheritance CREATE TABLE nonpartitioned ( a int, diff --git a/src/test/regress/expected/collate.icu.utf8.out b/src/test/regress/expected/collate.icu.utf8.out index 78a9cb38fa..97bbe53b64 100644 --- a/src/test/regress/expected/collate.icu.utf8.out +++ b/src/test/regress/expected/collate.icu.utf8.out @@ -1042,7 +1042,7 @@ ERROR: parameter "locale" must be specified SET icu_validation_level = ERROR; CREATE COLLATION testx (provider = icu, locale = 'nonsense-nowhere'); -- fails ERROR: ICU locale "nonsense-nowhere" has unknown language "nonsense" -HINT: To disable ICU locale validation, set parameter icu_validation_level to DISABLED. +HINT: To disable ICU locale validation, set the parameter "icu_validation_level" to "disabled". CREATE COLLATION testx (provider = icu, locale = '@colStrength=primary;nonsense=yes'); -- fails ERROR: could not convert locale name "@colStrength=primary;nonsense=yes" to language tag: U_ILLEGAL_ARGUMENT_ERROR RESET icu_validation_level; @@ -1050,7 +1050,7 @@ CREATE COLLATION testx (provider = icu, locale = '@colStrength=primary;nonsense= WARNING: could not convert locale name "@colStrength=primary;nonsense=yes" to language tag: U_ILLEGAL_ARGUMENT_ERROR CREATE COLLATION testx (provider = icu, locale = 'nonsense-nowhere'); DROP COLLATION testx; WARNING: ICU locale "nonsense-nowhere" has unknown language "nonsense" -HINT: To disable ICU locale validation, set parameter icu_validation_level to DISABLED. +HINT: To disable ICU locale validation, set the parameter "icu_validation_level" to "disabled". CREATE COLLATION test4 FROM nonsense; ERROR: collation "nonsense" for encoding "UTF8" does not exist CREATE COLLATION test5 FROM test0; diff --git a/src/test/regress/expected/copy2.out b/src/test/regress/expected/copy2.out index 8e33eee719..faf1a4d1b0 100644 --- a/src/test/regress/expected/copy2.out +++ b/src/test/regress/expected/copy2.out @@ -726,12 +726,12 @@ copy copy_default from stdin with (default '\N'); ERROR: NULL specification and DEFAULT specification cannot be the same -- cannot use DEFAULT marker in column that has no DEFAULT value copy copy_default from stdin with (default '\D'); -ERROR: unexpected DEFAULT in COPY data -DETAIL: Column "id" has no DEFAULT value. +ERROR: unexpected default marker in COPY data +DETAIL: Column "id" has no default value. CONTEXT: COPY copy_default, line 1: "\D value '2022-07-04'" copy copy_default from stdin with (format csv, default '\D'); -ERROR: unexpected DEFAULT in COPY data -DETAIL: Column "id" has no DEFAULT value. +ERROR: unexpected default marker in COPY data +DETAIL: Column "id" has no default value. CONTEXT: COPY copy_default, line 1: "\D,value,2022-07-04" -- The DEFAULT marker must be unquoted and unescaped or it's not recognized copy copy_default from stdin with (default '\D'); diff --git a/src/test/regress/expected/create_table.out b/src/test/regress/expected/create_table.out index 5eace915a7..1c3ef2b05a 100644 --- a/src/test/regress/expected/create_table.out +++ b/src/test/regress/expected/create_table.out @@ -990,7 +990,7 @@ DROP TABLE parted_col_comment; -- specifying storage parameters for partitioned tables is not supported CREATE TABLE parted_col_comment (a int, b text) PARTITION BY LIST (a) WITH (fillfactor=100); ERROR: cannot specify storage parameters for a partitioned table -HINT: Specify storage parameters for its leaf partitions, instead. +HINT: Specify storage parameters for its leaf partitions instead. -- list partitioning on array type column CREATE TABLE arrlp (a int[]) PARTITION BY LIST (a); CREATE TABLE arrlp12 PARTITION OF arrlp FOR VALUES IN ('{1}', '{2}'); diff --git a/src/test/regress/expected/foreign_key.out b/src/test/regress/expected/foreign_key.out index 55f7158c1a..12e523c737 100644 --- a/src/test/regress/expected/foreign_key.out +++ b/src/test/regress/expected/foreign_key.out @@ -2498,7 +2498,7 @@ ALTER TABLE ref22 ALTER CONSTRAINT ref_f1_f2_fkey DEFERRABLE INITIALLY IMMEDIATE; -- fails ERROR: cannot alter constraint "ref_f1_f2_fkey" on relation "ref22" DETAIL: Constraint "ref_f1_f2_fkey" is derived from constraint "ref_f1_f2_fkey" of relation "ref". -HINT: You may alter the constraint it derives from, instead. +HINT: You may alter the constraint it derives from instead. ALTER TABLE ref ALTER CONSTRAINT ref_f1_f2_fkey DEFERRABLE INITIALLY DEFERRED; BEGIN; @@ -2534,7 +2534,7 @@ ALTER TABLE ref ALTER CONSTRAINT ref_f1_f2_fkey1 DEFERRABLE INITIALLY DEFERRED; -- fails ERROR: cannot alter constraint "ref_f1_f2_fkey1" on relation "ref" DETAIL: Constraint "ref_f1_f2_fkey1" is derived from constraint "ref_f1_f2_fkey" of relation "ref". -HINT: You may alter the constraint it derives from, instead. +HINT: You may alter the constraint it derives from instead. ALTER TABLE ref ALTER CONSTRAINT ref_f1_f2_fkey DEFERRABLE INITIALLY DEFERRED; INSERT INTO pt VALUES(1,2,3); diff --git a/src/test/regress/expected/jsonpath_encoding.out b/src/test/regress/expected/jsonpath_encoding.out index 7cbfb6abcf..d53affe364 100644 --- a/src/test/regress/expected/jsonpath_encoding.out +++ b/src/test/regress/expected/jsonpath_encoding.out @@ -17,15 +17,15 @@ SELECT getdatabaseencoding(); -- just to label the results files -- checks for double-quoted values -- basic unicode input SELECT '"\u"'::jsonpath; -- ERROR, incomplete escape -ERROR: invalid unicode sequence at or near "\u" of jsonpath input +ERROR: invalid Unicode escape sequence at or near "\u" of jsonpath input LINE 1: SELECT '"\u"'::jsonpath; ^ SELECT '"\u00"'::jsonpath; -- ERROR, incomplete escape -ERROR: invalid unicode sequence at or near "\u00" of jsonpath input +ERROR: invalid Unicode escape sequence at or near "\u00" of jsonpath input LINE 1: SELECT '"\u00"'::jsonpath; ^ SELECT '"\u000g"'::jsonpath; -- ERROR, g is not a hex digit -ERROR: invalid unicode sequence at or near "\u000" of jsonpath input +ERROR: invalid Unicode escape sequence at or near "\u000" of jsonpath input LINE 1: SELECT '"\u000g"'::jsonpath; ^ SELECT '"\u0000"'::jsonpath; -- OK, legal escape @@ -99,15 +99,15 @@ select '"null \\u0000 escape"'::jsonpath as not_an_escape; -- checks for quoted key names -- basic unicode input SELECT '$."\u"'::jsonpath; -- ERROR, incomplete escape -ERROR: invalid unicode sequence at or near "\u" of jsonpath input +ERROR: invalid Unicode escape sequence at or near "\u" of jsonpath input LINE 1: SELECT '$."\u"'::jsonpath; ^ SELECT '$."\u00"'::jsonpath; -- ERROR, incomplete escape -ERROR: invalid unicode sequence at or near "\u00" of jsonpath input +ERROR: invalid Unicode escape sequence at or near "\u00" of jsonpath input LINE 1: SELECT '$."\u00"'::jsonpath; ^ SELECT '$."\u000g"'::jsonpath; -- ERROR, g is not a hex digit -ERROR: invalid unicode sequence at or near "\u000" of jsonpath input +ERROR: invalid Unicode escape sequence at or near "\u000" of jsonpath input LINE 1: SELECT '$."\u000g"'::jsonpath; ^ SELECT '$."\u0000"'::jsonpath; -- OK, legal escape diff --git a/src/test/regress/expected/jsonpath_encoding_1.out b/src/test/regress/expected/jsonpath_encoding_1.out index 005136c965..287324f015 100644 --- a/src/test/regress/expected/jsonpath_encoding_1.out +++ b/src/test/regress/expected/jsonpath_encoding_1.out @@ -17,15 +17,15 @@ SELECT getdatabaseencoding(); -- just to label the results files -- checks for double-quoted values -- basic unicode input SELECT '"\u"'::jsonpath; -- ERROR, incomplete escape -ERROR: invalid unicode sequence at or near "\u" of jsonpath input +ERROR: invalid Unicode escape sequence at or near "\u" of jsonpath input LINE 1: SELECT '"\u"'::jsonpath; ^ SELECT '"\u00"'::jsonpath; -- ERROR, incomplete escape -ERROR: invalid unicode sequence at or near "\u00" of jsonpath input +ERROR: invalid Unicode escape sequence at or near "\u00" of jsonpath input LINE 1: SELECT '"\u00"'::jsonpath; ^ SELECT '"\u000g"'::jsonpath; -- ERROR, g is not a hex digit -ERROR: invalid unicode sequence at or near "\u000" of jsonpath input +ERROR: invalid Unicode escape sequence at or near "\u000" of jsonpath input LINE 1: SELECT '"\u000g"'::jsonpath; ^ SELECT '"\u0000"'::jsonpath; -- OK, legal escape @@ -93,15 +93,15 @@ select '"null \\u0000 escape"'::jsonpath as not_an_escape; -- checks for quoted key names -- basic unicode input SELECT '$."\u"'::jsonpath; -- ERROR, incomplete escape -ERROR: invalid unicode sequence at or near "\u" of jsonpath input +ERROR: invalid Unicode escape sequence at or near "\u" of jsonpath input LINE 1: SELECT '$."\u"'::jsonpath; ^ SELECT '$."\u00"'::jsonpath; -- ERROR, incomplete escape -ERROR: invalid unicode sequence at or near "\u00" of jsonpath input +ERROR: invalid Unicode escape sequence at or near "\u00" of jsonpath input LINE 1: SELECT '$."\u00"'::jsonpath; ^ SELECT '$."\u000g"'::jsonpath; -- ERROR, g is not a hex digit -ERROR: invalid unicode sequence at or near "\u000" of jsonpath input +ERROR: invalid Unicode escape sequence at or near "\u000" of jsonpath input LINE 1: SELECT '$."\u000g"'::jsonpath; ^ SELECT '$."\u0000"'::jsonpath; -- OK, legal escape