Re: [HACKERS] 8.3 PLpgSQL Can't Compare Records?

2009-07-07 Thread Albe Laurenz
David E. Wheeler wrote:
 This code:
 
  CREATE OR REPLACE FUNCTION foo() returns boolean as $$
  DECLARE
  have_rec record;
  want_rec record;
  BEGIN
  have_rec := row(1, 2);
  want_rec := row(3, 5);
  RETURN have_rec IS DISTINCT FROM want_rec;
  END;
  $$ language plpgsql;
 
  SELECT ROW(1, 2) IS DISTINCT FROM ROW(3, 5);
 
  SELECT foo();
  DROP FUNCTION foo();
 
 Works as expected on 8.4, outputting:
 
[...]
 
 On 8.3, however, the row comparisons in the SQL statement works, but  
 fails in the PL/pgSQL function, with this output:
 
   ?column?
  --
   t
  (1 row)
 
  psql:huh.sql:14: ERROR:  operator does not exist: record = record
  LINE 1: SELECT   $1  IS DISTINCT FROM  $2
   ^
  HINT:  No operator matches the given name and argument type(s).  You 
 might need to add explicit type casts.
  QUERY:  SELECT   $1  IS DISTINCT FROM  $2
  CONTEXT:  PL/pgSQL function foo line 7 at RETURN
 
 
 Is this a known issue in 8.3? If so, is there a known workaround?

The change is probably here:
http://archives.postgresql.org/pgsql-committers/2008-10/msg00110.php

So I think it is safe to argue that this is not a bug in 8.3, but an 
improvement in 8.4.

Yours,
Laurenz Albe

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] 8.3 PLpgSQL Can't Compare Records?

2009-07-07 Thread David E. Wheeler

On Jul 7, 2009, at 12:49 AM, Albe Laurenz wrote:


Is this a known issue in 8.3? If so, is there a known workaround?


The change is probably here:
http://archives.postgresql.org/pgsql-committers/2008-10/msg00110.php

So I think it is safe to argue that this is not a bug in 8.3, but an  
improvement in 8.4.


Right, good find, thanks.

David

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


[HACKERS] 8.3 PLpgSQL Can't Compare Records?

2009-07-01 Thread David E. Wheeler

This code:

CREATE OR REPLACE FUNCTION foo() returns boolean as $$
DECLARE
have_rec record;
want_rec record;
BEGIN
have_rec := row(1, 2);
want_rec := row(3, 5);
RETURN have_rec IS DISTINCT FROM want_rec;
END;
$$ language plpgsql;

SELECT ROW(1, 2) IS DISTINCT FROM ROW(3, 5);

SELECT foo();
DROP FUNCTION foo();

Works as expected on 8.4, outputting:

 ?column?
--
 t
(1 row)

Time: 48.626 ms
 foo
-
 t
(1 row)

On 8.3, however, the row comparisons in the SQL statement works, but  
fails in the PL/pgSQL function, with this output:


 ?column?
--
 t
(1 row)

psql:huh.sql:14: ERROR:  operator does not exist: record = record
LINE 1: SELECT   $1  IS DISTINCT FROM  $2
 ^
HINT:  No operator matches the given name and argument type(s).  
You might need to add explicit type casts.

QUERY:  SELECT   $1  IS DISTINCT FROM  $2
CONTEXT:  PL/pgSQL function foo line 7 at RETURN


Is this a known issue in 8.3? If so, is there a known workaround?

Thanks,

David

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] 8.3 PLpgSQL Can't Compare Records?

2009-07-01 Thread Merlin Moncure
On Wed, Jul 1, 2009 at 1:35 PM, David E. Wheelerda...@kineticode.com wrote:
 This code:

    CREATE OR REPLACE FUNCTION foo() returns boolean as $$
    DECLARE
        have_rec record;
        want_rec record;
    BEGIN
        have_rec := row(1, 2);
        want_rec := row(3, 5);
        RETURN have_rec IS DISTINCT FROM want_rec;
    END;
    $$ language plpgsql;

    SELECT ROW(1, 2) IS DISTINCT FROM ROW(3, 5);

    SELECT foo();
    DROP FUNCTION foo();

 Works as expected on 8.4, outputting:

     ?column?
    --
     t
    (1 row)

    Time: 48.626 ms
     foo
    -
     t
    (1 row)

 On 8.3, however, the row comparisons in the SQL statement works, but fails
 in the PL/pgSQL function, with this output:

     ?column?
    --
     t
    (1 row)

    psql:huh.sql:14: ERROR:  operator does not exist: record = record
    LINE 1: SELECT   $1  IS DISTINCT FROM  $2
                         ^
    HINT:  No operator matches the given name and argument type(s). You might
 need to add explicit type casts.
    QUERY:  SELECT   $1  IS DISTINCT FROM  $2
    CONTEXT:  PL/pgSQL function foo line 7 at RETURN


 Is this a known issue in 8.3? If so, is there a known workaround?


fyi: works in 8.4, as part of a broad fix of composite type comparison ops

merlin

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] 8.3 PLpgSQL Can't Compare Records?

2009-07-01 Thread Merlin Moncure
On Wed, Jul 1, 2009 at 2:45 PM, Merlin Moncuremmonc...@gmail.com wrote:
 On Wed, Jul 1, 2009 at 1:35 PM, David E. Wheelerda...@kineticode.com wrote:
 This code:

    CREATE OR REPLACE FUNCTION foo() returns boolean as $$
    DECLARE
        have_rec record;
        want_rec record;
    BEGIN
        have_rec := row(1, 2);
        want_rec := row(3, 5);
        RETURN have_rec IS DISTINCT FROM want_rec;
    END;
    $$ language plpgsql;

    SELECT ROW(1, 2) IS DISTINCT FROM ROW(3, 5);

    SELECT foo();
    DROP FUNCTION foo();

 Works as expected on 8.4, outputting:

     ?column?
    --
     t
    (1 row)

    Time: 48.626 ms
     foo
    -
     t
    (1 row)

 On 8.3, however, the row comparisons in the SQL statement works, but fails
 in the PL/pgSQL function, with this output:

     ?column?
    --
     t
    (1 row)

    psql:huh.sql:14: ERROR:  operator does not exist: record = record
    LINE 1: SELECT   $1  IS DISTINCT FROM  $2
                         ^
    HINT:  No operator matches the given name and argument type(s). You might
 need to add explicit type casts.
    QUERY:  SELECT   $1  IS DISTINCT FROM  $2
    CONTEXT:  PL/pgSQL function foo line 7 at RETURN


 Is this a known issue in 8.3? If so, is there a known workaround?


 fyi: works in 8.4, as part of a broad fix of composite type comparison ops

whoops, you knew that already :-).  one possible workaround is:

select $1::text is distinct from $2::text;

merlin

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] 8.3 PLpgSQL Can't Compare Records?

2009-07-01 Thread David E. Wheeler

On Jul 1, 2009, at 11:47 AM, Merlin Moncure wrote:

fyi: works in 8.4, as part of a broad fix of composite type  
comparison ops


whoops, you knew that already :-).  one possible workaround is:

select $1::text is distinct from $2::text


Yes, and that's what I'm doing, although it is significantly less  
precise, in that:


* Columns with different types may successfully compare (e.g., NULL  
and '')

* No (easy) way to tell if two records have different numbers of columns

But it's good enough for 8.3 if there is no other workaround.

Thanks,

David

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers