Alexander Korotkov <aekorot...@gmail.com> 于2025年7月16日周三 05:56写道:
> On Wed, Jun 4, 2025 at 11:52 PM Alexander Korotkov <aekorot...@gmail.com> > wrote: > > On Wed, Jun 4, 2025 at 6:15 PM Alexander Pyhalov > > <a.pyha...@postgrespro.ru> wrote: > > > Alexander Korotkov писал(а) 2025-06-04 14:29: > > > > On Wed, Jan 29, 2025 at 11:59 AM Maxim Orlov <orlo...@gmail.com> > wrote: > > > >> > > > >> One important note here. This patch will change cast behaviour in > case > > > >> of local and foreign types are mismatched. > > > >> The problem is if we cannot convert types locally, this does not > mean > > > >> that it is also true for a foreign wrapped data. > > > >> In any case, it's up to the committer to decide whether this change > is > > > >> needed or not. > > > > > > > > I have two question regarding this aspect. > > > > 1) Is it the same with regular type conversion? > > > > > > Yes, it's the same. > > > > > > CREATE TYPE enum_of_int_like AS enum('1', '2', '3', '4'); > > > CREATE TABLE conversions(id int, d enum_of_int_like); > > > CREATE FOREIGN TABLE ft_conversions (id int, d char(1)) > > > SERVER loopback options (table_name 'conversions'); > > > SET plan_cache_mode = force_generic_plan; > > > PREPARE s(varchar) AS SELECT count(*) FROM ft_conversions where d=$1; > > > EXPLAIN (VERBOSE, COSTS OFF) > > > EXECUTE s('1'); > > > QUERY PLAN > > > > ------------------------------------------------------------------------------------------- > > > Foreign Scan > > > Output: (count(*)) > > > Relations: Aggregate on (public.ft_conversions) > > > Remote SQL: SELECT count(*) FROM public.conversions WHERE ((d = > > > $1::character varying)) > > > (4 rows) > > > > > > EXECUTE s('1'); > > > ERROR: operator does not exist: public.enum_of_int_like = character > > > varying > > > HINT: No operator matches the given name and argument types. You might > > > need to add explicit type casts. > > > > > > > 2) Can we fallback to remote type conversion in local type conversion > > > > fails? > > > > > > It's the opposite - we've already planned (and deparsed) statement, > > > using remote type conversion. > > > When plan execution fails, there's nothing we can do. > > > We'll get > > > > > > PREPARE s(varchar[]) AS SELECT count(*) FROM ft_conversions where > > > d=ANY($1); > > > EXPLAIN (VERBOSE, COSTS OFF) > > > EXECUTE s(ARRAY['1','2']); > > > QUERY PLAN > > > > --------------------------------------------------------------------------------------------------- > > > Foreign Scan > > > Output: (count(*)) > > > Relations: Aggregate on (public.ft_conversions) > > > Remote SQL: SELECT count(*) FROM public.conversions WHERE ((d = ANY > > > ($1::character varying[]))) > > > (4 rows) > > > > > > EXECUTE s(ARRAY['1','2']); > > > ERROR: operator does not exist: public.enum_of_int_like = character > > > varying > > > HINT: No operator matches the given name and argument types. You might > > > need to add explicit type casts. > > > > Got it, thank you for the explanation. I thin it's fair that array > > coercion works the same way as a regular cast. > > I've written a commit message for this patch. I'm going to push this > if no objections. > Hi Alexander, I found a little typo in this commit. Other places use "an" before ArrayCoerceExpr. To be consistent may be better. So, please take a look at the attached patch. -- Thanks, Tender Wang
From f348498cf70e68cfdaf8df3a1bed66e6a0bb7f09 Mon Sep 17 00:00:00 2001 From: Tender Wang <tndrw...@gmail.com> Date: Fri, 18 Jul 2025 22:26:56 +0800 Subject: [PATCH v1] Fix a typo. --- contrib/postgres_fdw/deparse.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/postgres_fdw/deparse.c b/contrib/postgres_fdw/deparse.c index d761d076dc8..e5b5e1a5f51 100644 --- a/contrib/postgres_fdw/deparse.c +++ b/contrib/postgres_fdw/deparse.c @@ -3540,7 +3540,7 @@ deparseRelabelType(RelabelType *node, deparse_expr_cxt *context) } /* - * Deparse a ArrayCoerceExpr (array-type conversion) node. + * Deparse an ArrayCoerceExpr (array-type conversion) node. */ static void deparseArrayCoerceExpr(ArrayCoerceExpr *node, deparse_expr_cxt *context) -- 2.34.1