Re: coalesce view error - Mailing list pgsql-general

From mikeo
Subject Re: coalesce view error
Date
Msg-id 3.0.1.32.20000616101023.0091eb00@pop.spectrumtelecorp.com
Whole thread Raw
In response to Re: coalesce view error  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: coalesce view error  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-general
hi tom,
  thanks for the patch.  one of my coworkers came up with a working
  solution:

>Hi Mike, try adding ::text before the AS...
>
>create view mikeotest as
>       select
>coalesce(topflow_application.rpt_name,topflow_application.tfap_name)::text AS
>ipd_desc,
>       graphics_03.ipd_date,
>       graphics_03.day,
>       graphics_03.gr_bill_amt_total,
>       graphics_03.gr_byte_qty_total,
>       graphics_03.gr_ipd_sessions
>FROM graphics_03, topflow_application
>WHERE (graphics_03.ct_key = topflow_application.ib_ct_key
>   or  graphics_03.ct_key = topflow_application.ob_ct_key);

which results in the generated create statement:

SELECT (CASE WHEN (topflow_application.rpt_name NOTNULL)
                   THEN topflow_application.rpt_name
             WHEN (topflow_application.tfap_name NOTNULL)
                   THEN topflow_application.tfap_name
         ELSE NULL::unknown END)::text AS ipd_desc,
         graphics_03.ipd_date, graphics_03."day",
graphics_03.gr_bill_amt_total,
         graphics_03.gr_byte_qty_total, graphics_03.gr_ipd_sessions
  FROM graphics_03, topflow_application
 WHERE ((graphics_03.ct_key = topflow_application.ib_ct_key)
    OR  (graphics_03.ct_key = topflow_application.ob_ct_key));

this doesn't return that ERROR:
     Unable to identify an equality operator for type 'unknown'

my problem was that i was trying to cast the resulting case statement
instead of
the coalesce in my intial view definition.  casting the coalesce works fine.

mikeo

At 12:57 AM 6/16/00 -0400, Tom Lane wrote:
>mikeo <mikeo@spectrumtelecorp.com> writes:
>> hi, i have this view defined as:
>> create view mikeotest as select
>> coalesce(topflow_application.rpt_name,topflow_application.tfap_name) AS
>> ipd_desc,
>> [etc]
>> when i try to run this query against this view, i get the following:
>> select sum(gr_bill_amt_total), ipd_desc from mikeotest group by ipd_desc;
>> ERROR:  Unable to identify an equality operator for type 'unknown'
>
>Ugh.  You've dug up a pretty nasty bug.  If you write out the equivalent
>query as a single statement, it works fine --- it only fails when the
>CASE expression (expanded from COALESCE) is embedded in a view.
>
>The reason is that the representation of CaseExpr nodes stored in rules
>is a few bricks shy of a load --- it doesn't store the datatype field
>of the node!  So when the view's select rule is used to form a new
>query, the necessary type information is missing.  Somebody blew this
>pretty badly.
>
>The proper and straightforward fix is to expand the stored
>representation of CaseExpr to include the 'casetype' field.
>Unfortunately that breaks all existing stored rules that contain
>case expressions, so under the project's release rules I can't fix it
>that way before 7.1.  We don't change stored data representations in
>minor releases.
>
>As a short-term workaround I offer the attached hack.  I won't call
>it a patch, because I don't trust it very far, but it passes regress
>tests and it seems to fix your problem.  Give it a shot if this bug
>is getting in your way...
>
>            regards, tom lane
>
>
>*** src/backend/nodes/readfuncs.c.orig    Tue May 30 00:26:44 2000
>--- src/backend/nodes/readfuncs.c    Fri Jun 16 00:26:11 2000
>***************
>*** 32,37 ****
>--- 32,39 ----
>  #include "nodes/relation.h"
>  #include "utils/lsyscache.h"
>
>+ #include "parser/parse_expr.h"    /* short-term kluge only */
>+
>  /* ----------------
>   *        node creator declarations
>   * ----------------
>***************
>*** 765,770 ****
>--- 767,781 ----
>      local_node->args = nodeRead(true);
>      token = lsptok(NULL, &length);        /* eat :default */
>      local_node->defresult = nodeRead(true);
>+
>+     /* KLUGE --- use parser's transformExpr to set casetype correctly.
>+      * Hold your nose and stand back at least ten paces...
>+      *
>+      * This is just a workaround until we can change the stored
>+      * representation of CaseExpr nodes in the next major release.
>+      * What bozo omitted storing casetype in the first place?
>+      */
>+     transformExpr(NULL, (Node *) local_node, EXPR_COLUMN_FIRST);
>
>      return local_node;
>  }
>

pgsql-general by date:

Previous
From: Louis-David Mitterrand
Date:
Subject: Re: using max() aggregate
Next
From: Tom Lane
Date:
Subject: Re: coalesce view error