BUG #18520: Different results when analyze a relation with UDT. - Mailing list pgsql-bugs

From PG Bug reporting form
Subject BUG #18520: Different results when analyze a relation with UDT.
Date
Msg-id 18520-12e5636a81c059f2@postgresql.org
Whole thread Raw
Responses Re: BUG #18520: Different results when analyze a relation with UDT.
List pgsql-bugs
The following bug has been logged on the website:

Bug reference:      18520
Logged by:          zhou zhanghua
Email address:      2467882606@qq.com
PostgreSQL version: 17beta1
Operating system:   Ubuntu 22.04
Description:

When analyzing a relation with UDT, an error will be encountered if there is
a join before the analyze stmts. Error message is "ERROR:  missing support
function 1(16386,16386) in opfamily 16392".

to reproduce:
```
create type foo_type as (a float8, b float8);

CREATE FUNCTION foo_type_less(foo_type, foo_type) RETURNS bool
AS
$$
SELECT true::boolean;
$$ LANGUAGE SQL IMMUTABLE STRICT;

CREATE OPERATOR < (
   leftarg = foo_type, rightarg = foo_type,
   procedure = foo_type_less,
   commutator = >= 
);

CREATE FUNCTION foo_type_eq(foo_type, foo_type) RETURNS bool
AS
$$
SELECT false::boolean;
$$ LANGUAGE SQL IMMUTABLE STRICT;

CREATE OPERATOR = (
   leftarg = foo_type, rightarg = foo_type,
   procedure = foo_type_eq,
   commutator = = 
);


CREATE OPERATOR CLASS foo_type_btreeopclass
    DEFAULT FOR TYPE foo_type using btree as
    OPERATOR 1 <;

CREATE FUNCTION foo_type_hash(foo_type) RETURNS int4
AS
$$
SELECT 1;
$$ LANGUAGE SQL IMMUTABLE STRICT;


CREATE OPERATOR CLASS foo_type_hashopclass
    DEFAULT FOR TYPE foo_type using hash as
    operator 1 = ,
    function 1 foo_type_hash(foo_type);


create table foo_type_table(a foo_type);

insert into foo_type_table values ((1,2)),((3,4)),((5,6));


-- ERROR:  missing support function BTORDER_PROC(foo_type,foo_type) in
opfamily foo_type_btreeopclass
select * from foo_type_table a, foo_type_table b where a.a = b.a;
analyze foo_type_table;

-- another session
-- success
analyze foo_type_table;

```

I tried to debug this different behavior, compute_scalar_stats is used when
execute join before analyze, compute_trivial_stats is used when no join
before analyze.  This may because of the hash join load some thing into type
cache, leading std_typanalyze choose different functions.


pgsql-bugs by date:

Previous
From: Tender Wang
Date:
Subject: Re: BUG #18377: Assert false in "partdesc->nparts >= pinfo->nparts", fileName="execPartition.c", lineNumber=1943
Next
From: Sandeep Thakkar
Date:
Subject: Re: Postgresql 16.3 installation error (setup file) on Windows 11