Re: Getting fancy errors when accessing information_schema on 10.5

Axel Rau <axel.rau@chaos1.de>

From: Axel Rau <Axel.Rau@Chaos1.DE>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Laurenz Albe <laurenz.albe@cybertec.at>, pgsql-admin@postgresql.org
Date: 2018-10-30T12:31:29Z
Lists: pgsql-hackers

> Am 30.10.2018 um 13:17 schrieb Tom Lane <tgl@sss.pgh.pa.us>:
> 
> Axel Rau <Axel.Rau@Chaos1.DE <mailto:Axel.Rau@Chaos1.DE>> writes:
>>> Am 30.10.2018 um 08:42 schrieb Laurenz Albe <laurenz.albe@cybertec.at <mailto:laurenz.albe@cybertec.at>>:
>>> Could you run EXPLAIN on the query and tell us the execution plan?
> 
>> EXPLAIN  SELECT sequence_name AS relname, sequence_schema AS schemaname
>> FROM information_schema.sequences
>> WHERE sequence_schema NOT LIKE 'pg\_%' AND sequence_schema != 'information_schema';
>> ...
>>                     ->  Seq Scan on pg_class c  (cost=0.00..28.56 rows=22 width=72)
>>                           Filter: ((pg_has_role(relowner, 'USAGE'::text) OR has_sequence_privilege(oid, 'SELECT, UPDATE, USAGE'::text)) AND (relkind = 'S'::"char"))
> 
> Well, there's the problem: for some reason the planner is deciding to
> execute the privilege test before the relkind check.
> 
>>> Perhaps this is some fancy kind of catalog corruption…
> 
>> Maybe, as this does not happen with another instance.
> 
> It doesn't happen for me either.  Looking at the planner code, it seems
> like the relkind check should happen first because it'd be cheaper than
> the OR condition.  Have you perhaps messed with the cost attributed to
> pg_has_role(), has_sequence_privilege(), or chareq()?

Not by intention. The instance has some history, it go back to 8.x I think.
>  You could
> investigate with, eg,
> 
> select oid::regprocedure, procost from pg_proc
>  where proname = 'has_sequence_privilege';

nextcloud=> select oid::regprocedure, procost from pg_proc
nextcloud->  where proname = 'has_sequence_privilege';
                  oid                   | procost 
----------------------------------------+---------
 has_sequence_privilege(name,text,text) |       1
 has_sequence_privilege(name,oid,text)  |       1
 has_sequence_privilege(oid,text,text)  |       1
 has_sequence_privilege(oid,oid,text)   |       1
 has_sequence_privilege(text,text)      |       1
 has_sequence_privilege(oid,text)       |       1
(6 rows)

Axel
---
PGP-Key:29E99DD6  ☀  computing @ chaos claudius