Thread: Possible pl/pgsql bug

Possible pl/pgsql bug

From
"Peter Darley"
Date:
Friends,
    I don't know if this is a bug or not, but it does seem a bit weird.

    When I have a pl/pgsql trigger function it seems to cache the data types of
New.field and if the data type is different next time the function is called
(because it's being called from a different table) it gives a 'type of
<something> doesn't match that when preparing the plan' error.

    In my case the error I'm getting is: type of new.indicator doesn't match
that when preparing the plan

    I only get this error when I insert something into my answers_bool table
and my answers_text table in the same transaction.  Both tables and the
function are shown below.

    I've fixed my problem by changing answers_bool.indicator to text from a
varchar(255).

Thanks,
Peter Darley

    My function is very simple:

CREATE or replace FUNCTION "insert_time"() RETURNS "opaque" AS '
    BEGIN
    DELETE FROM answers_deleted WHERE SampleID=NEW.sampleid AND
Indicator=NEW.indicator;
    RETURN NULL;
    END;
' LANGUAGE 'plpgsql';


    My Tables:
                                   Table "answers_bool"
  Column   |           Type           |                     Modifiers
-----------+--------------------------+-------------------------------------
--------------
 id        | integer                  | not null default
nextval('all_answers_seq'::text)
 sampleid  | integer                  | not null
 value     | boolean                  |
 indicator | character varying(255)   | not null
 surveyid  | integer                  | not null
 time      | timestamp with time zone | not null default now()
Primary key: answers_bool_newer_pkey
Unique keys: a_b_surveyid_indicator_newer
Triggers: a_b_delete_new,
          a_b_insert_new,
          a_b_update_new


                                       Table "answers_text"
     Column     |            Type             |
Modifiers
----------------+-----------------------------+-----------------------------
----------------------
 id             | integer                     | not null default
nextval('all_answers_seq'::text)
 sampleid       | integer                     | not null
 value          | text                        |
 indicator      | text                        | not null
 surveyid       | integer                     | not null
 origionalvalue | text                        |
 coded          | boolean                     | default 'f'::bool
 time           | timestamp(0) with time zone | not null default now()
Indexes: a_t_indicator,
         a_t_sampleid,
         a_t_surveyid
Primary key: answers_text_new_pkey
Unique keys: a_t_sampleid_indicator
Triggers: a_t_delete,
          a_t_insert,
          a_t_update


Re: Possible pl/pgsql bug

From
Jan Wieck
Date:
Peter Darley wrote:
> Friends,
>    I don't know if this is a bug or not, but it does seem a bit weird.
>
>    When I have a pl/pgsql trigger function it seems to cache the data types of

    Indeed, it does.

    While  it  sometimes  does make sense to use one and the same
    function for multiple triggers, I don't see it in this  case.

    And IMHO it's a bit bogus anyway if attributes with different
    meaning and datatype in two tables have the same name.  Could
    be irritating at least.

    I suggest writing separate trigger functions.


Jan

--

#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me.                                  #
#================================================== JanWieck@Yahoo.com #



Re: Possible pl/pgsql bug

From
"Peter Darley"
Date:
Jan,
    I find it very useful to have tables that are basically identical except
for one field that holds a different type of data.  It allows me to automate
a lot of stuff in my application and not have to tell it weather it is going
to get back Boolean, text, date, interval etc. data.  Similarly it would be
nice to have as few objects in the db as possible, just so it's easier to
understand and manage.

    Anyway, I take it that this is not a bug and I'll create separate trigger
functions for each of my tables.  :)

    Thanks for getting back to me so quickly!

Peter Darley

-----Original Message-----
From: Jan Wieck [mailto:janwieck@yahoo.com]
Sent: Monday, April 22, 2002 1:23 PM
To: Peter Darley
Cc: Pgsql-General
Subject: Re: [GENERAL] Possible pl/pgsql bug


Peter Darley wrote:
> Friends,
>    I don't know if this is a bug or not, but it does seem a bit weird.
>
>    When I have a pl/pgsql trigger function it seems to cache the data
types of

    Indeed, it does.

    While  it  sometimes  does make sense to use one and the same
    function for multiple triggers, I don't see it in this  case.

    And IMHO it's a bit bogus anyway if attributes with different
    meaning and datatype in two tables have the same name.  Could
    be irritating at least.

    I suggest writing separate trigger functions.


Jan

--

#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me.                                  #
#================================================== JanWieck@Yahoo.com #