Inconsistent Errors on Row Comparisons - Mailing list pgsql-hackers

From David E. Wheeler
Subject Inconsistent Errors on Row Comparisons
Date
Msg-id 0283DC74-A952-400B-9C04-109E0DBC8664@kineticode.com
Whole thread Raw
Responses Re: Inconsistent Errors on Row Comparisons  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
Howdy,

I'm working on functions to compare result sets for pgTAP. In the
process, I found what appears to be an inconsistency in error handling
when comparing incomparable results. I'm testing in 8.4RC2, but the
issue may go back for all I know. Perhaps it's intentional?

This is what I see. This query:

     VALUES (1, 2), (3, 4) EXCEPT VALUES (1, 'foo'), (3, 'bar');

Throws 42804 DATATYPE MISMATCH. Meanwhile, this query:

     VALUES (1, 2), (3, 4) EXCEPT VALUES (1), (3);

Throws 42601 SYNTAX ERROR. It'd be nice if the error was a bit more
specific (maybe tell me that there are different numbers of columns,
perhaps 54011?), but at least it's distinct from the data type mismatch.

However, when I do a row-by-row comparison of rows in cursors, I get a
different behavior. The attached test case has the details, but
assuming a function `restults_eq(refcursor, refcursor)` that does the
row-by-row comparison, this code:

     DECLARE cwant CURSOR FOR VALUES (1, 2), (3, 4);
     DECLARE chave CURSOR FOR VALUES (1, 'foo'), (3, 'bar');
     SELECT results_eq( 'cwant'::refcursor, 'chave'::refcursor );

Throws 42804 DATATYPE MISMATCH, as expected. On the other hand, this
code:

     DECLARE cwant2 CURSOR FOR VALUES (1, 2), (3, 4);
     DECLARE chave2 CURSOR FOR VALUES (1), (3);
     SELECT results_eq( 'cwant2'::refcursor, 'chave2'::refcursor );

Also throws Throws 42804 DATATYPE MISMATCH. For consistency with the
row comparisons done by EXCEPT and friends, should it not throw 42601
SYNTAX ERROR?

Thanks,

David






Attachment

pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: 8.5 development schedule
Next
From: Tom Lane
Date:
Subject: Re: 8.5 development schedule