Thread: (record = record) inconsistent with record_eq(arg1, arg2)
hi.
not sure if it's a bug or I misunderstood.
select row(1,null::int) = (1,1::int); -- return null
select record_eq(row(1,null::int),(1,1::int)); --return false.
On Monday, July 31, 2023, jian he <jian.universality@gmail.com> wrote:
hi.not sure if it's a bug or I misunderstood.select row(1,null::int) = (1,1::int); -- return nullselect record_eq(row(1,null::int),(1,1::int)); --return false.
This isn’t a bug though I can’t point to the exact code where the difference manifests.
The SQL standard mandates the query behavior of the equals operator while internal indexing and hash details require that the equality function not return null.
Calling record_eq directly in SQL is unsupported so the claim that the second query is buggy is incorrect altogether. We don’t promise any particular result to the user in that situation, and could indeed remove the function and the query could produce an error and we’d be technically bug-free.
David J.
"David G. Johnston" <david.g.johnston@gmail.com> writes: > On Monday, July 31, 2023, jian he <jian.universality@gmail.com> wrote: >> select row(1,null::int) = (1,1::int); -- return null >> select record_eq(row(1,null::int),(1,1::int)); --return false. > This isn’t a bug though I can’t point to the exact code where the > difference manifests. Yeah, the difference in behavior is deliberate. See https://www.postgresql.org/docs/current/functions-comparisons.html#ROW-WISE-COMPARISON which documents the behavior of ROW(...) = ROW(...), and https://www.postgresql.org/docs/current/functions-comparisons.html#COMPOSITE-TYPE-COMPARISON which documents the behavior of record comparisons that are written in other ways, and explains the reason for the difference. The SQL standard governs the behavior of "ROW(...) = ROW(...)", but last I looked they don't really have a notion of composite-valued scalars, so the spec has nothing to say about what "row-valued-expression = row-valued-expression" should do. Even if it did, we would not change this, because it's too important to have a total ordering for composite columns. regards, tom lane