Skip to content

Commit 45b3848

Browse files
jianhe-funCommitfest Bot
authored andcommitted
error safe for casting character varying to other types per pg_cast
select castsource::regtype, casttarget::regtype, castfunc, castcontext,castmethod, pp.prosrc, pp.proname from pg_cast pc join pg_proc pp on pp.oid = pc.castfunc and pc.castfunc > 0 and (castsource::regtype = 'character varying'::regtype) order by castsource::regtype; castsource | casttarget | castfunc | castcontext | castmethod | prosrc | proname -------------------+-------------------+----------+-------------+------------+---------------+---------- character varying | regclass | 1079 | i | f | text_regclass | regclass character varying | "char" | 944 | a | f | text_char | char character varying | name | 1400 | i | f | text_name | name character varying | xml | 2896 | e | f | texttoxml | xml character varying | character varying | 669 | i | f | varchar | varchar (5 rows) texttoxml, text_regclass was refactored as error safe in prior patch. text_char, text_name is already error safe. so here we only need handle function "varchar". discussion: https://postgr.es/m/CADkLM=fv1JfY4Ufa-jcwwNbjQixNViskQ8jZu3Tz_p656i_4hQ@mail.gmail.com
1 parent 3b874ec commit 45b3848

File tree

1 file changed

+5
-1
lines changed

1 file changed

+5
-1
lines changed

src/backend/utils/adt/varchar.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -638,10 +638,14 @@ varchar(PG_FUNCTION_ARGS)
638638
{
639639
for (i = maxmblen; i < len; i++)
640640
if (s_data[i] != ' ')
641-
ereport(ERROR,
641+
{
642+
ereturn(fcinfo->context, (Datum) 0,
642643
(errcode(ERRCODE_STRING_DATA_RIGHT_TRUNCATION),
643644
errmsg("value too long for type character varying(%d)",
644645
maxlen)));
646+
647+
PG_RETURN_NULL();
648+
}
645649
}
646650

647651
PG_RETURN_VARCHAR_P((VarChar *) cstring_to_text_with_len(s_data,

0 commit comments

Comments
 (0)