Re: [BUGS] Failure to coerce unknown type to specific type - Mailing list pgsql-hackers

From Kyotaro HORIGUCHI
Subject Re: [BUGS] Failure to coerce unknown type to specific type
Date
Msg-id 20150423.171808.150348710.horiguchi.kyotaro@lab.ntt.co.jp
Whole thread Raw
In response to Re: [BUGS] Failure to coerce unknown type to specific type  (Kyotaro HORIGUCHI <horiguchi.kyotaro@lab.ntt.co.jp>)
Responses Re: [BUGS] Failure to coerce unknown type to specific type
List pgsql-hackers
Sorry, the patch had obvious bug..

-+                                              Int32GetDatum(inputTypeMod),
++                                              Int32GetDatum(targetTypeMod),

regards,


> Hello, I think this is a bug.
> 
> The core of this problem is that coerce_type() fails for Var of
> type UNKNOWNOID.
> 
> The comment for the function says that,
> 
> > * The caller should already have determined that the coercion is possible;
> > * see can_coerce_type.
> 
> But can_coerce_type() should say it's possible to convert from
> unknown to any type as it doesn't see the target node type. I
> think this as an inconsistency between can_coerce_type and
> coerce_type. So making this consistent would be right way.
> 
> Concerning only this issue, putting on-the-fly conversion for
> unkown nonconstant as attached patch worked for me. I'm not so
> confident on this, though..
> 
> regards,
> 
> At Wed, 22 Apr 2015 23:26:43 -0700, Jeff Davis <pgsql@j-davis.com> wrote in <1429770403.4604.22.camel@jeff-desktop>
> > On Wed, 2015-04-22 at 20:35 -0700, David G. Johnston wrote:
> > 
> > > But the fact that column "b" has the data type "unknown" is only a
> > > warning - not an error.
> > > 
> > I get an error:
> > 
> > postgres=# SELECT '  '::text = 'a';
> >  ?column? 
> > ----------
> >  f
> > (1 row)
> > 
> > postgres=# SELECT a=b FROM (SELECT ''::text, '  ') x(a,b);
> > ERROR:  failed to find conversion function from unknown to text

-- 
Kyotaro Horiguchi
NTT Open Source Software Center
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index a4e494b..2e3a43c 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -221,7 +221,7 @@ coerce_type(ParseState *pstate, Node *node,            return node;        }    }
-    if (inputTypeId == UNKNOWNOID && IsA(node, Const))
+    if (inputTypeId == UNKNOWNOID)    {        /*         * Input is a string constant with previously undetermined
type.Apply
 
@@ -275,6 +275,29 @@ coerce_type(ParseState *pstate, Node *node,        targetType = typeidType(baseTypeId);
+        /* Perform on the fly conversion for non-constants */
+        if(!IsA(node, Const))
+        {
+            Form_pg_type typform = (Form_pg_type) GETSTRUCT(targetType);
+            Node *result = 
+                (Node*) makeFuncExpr(typform->typinput,
+                         targetTypeId,
+                         list_make3(node,
+                                    makeConst(OIDOID, -1, InvalidOid,
+                                              sizeof(Oid),
+                                              ObjectIdGetDatum(InvalidOid),
+                                              false, true),
+                                    makeConst(INT4OID, -1, InvalidOid,
+                                              sizeof(uint32),
+                                              Int32GetDatum(targetTypeMod),
+                                              false, true)),
+                          InvalidOid, InvalidOid,
+                          COERCE_IMPLICIT_CAST);
+            ReleaseSysCache(targetType);
+
+            return result;
+        }
+        newcon->consttype = baseTypeId;        newcon->consttypmod = inputTypeMod;        newcon->constcollid =
typeTypeCollation(targetType);

pgsql-hackers by date:

Previous
From: Heikki Linnakangas
Date:
Subject: Re: Streaming replication and WAL archive interactions
Next
From: Simon Riggs
Date:
Subject: Re: Freeze avoidance of very large table.