Subject: [Code: 0, SQL State: 0A000] when "typing" from pg_catalog

From: Thiemo Kellner <[email-masked]>
Date: Tue, 9 Apr 2024 16:59:38 +0200

Hi

I have the following function code. When trying to install, it gives me

[Code: 0, SQL State: 0A000]  FEHLER: Verweise auf andere Datenbanken 
sind nicht implementiert: pg_catalog.pg_roles.rolname
   Position: 298  [Script position: 334 - 361]

To the best of my knowledge, pg_catalog is a schema not a database, 
like information_schema. Am I missing something? And why is it not 
allowed to type from the catalogue?

I presume, this example is rather academic due to the name type.

Kind regards

Thiemo

create or replace function GRANT_SELECTS()
returns void
language plpgsql
as
$body$
     declare
         C_SCHEMA_NAME       constant 
INFORMATION_SCHEMA.SCHEMATA.SCHEMA_NAME%type :=
           'snowrunner';
--        C_ROLE_NAME         constant    name :=
         C_ROLE_NAME         constant    PG_CATALOG.PG_ROLES.ROLNAME :=
           'snowrunner_reader';
         V_SQL_STATEMENT                 text;
     begin
         -- Check the existance of the schema
         perform 1
             from INFORMATION_SCHEMA.SCHEMATA
             where SCHEMA_NAME = C_SCHEMA_NAME;
         if not found then
             raise exception 'Schema "%s" does not exist!', C_SCHEMA_NAME;
         end if;

         -- Check the existance of the role
         perform 1
         	from PG_CATALOG.PG_ROLES
         	where ROLNAME = C_ROLE_NAME;
         if not found then
             raise exception 'Role "%s" does not exist!', C_ROLE_NAME;
         end if;

         -- Issue grants
         V_SQL_STATEMENT := format('grant select on all tables in schema 
%i to %i', C_SCHEMA_NAME, C_ROLE_NAME);
         raise info '%', V_SQL_STATEMENT;
         execute V_SQL_STATEMENT;
         V_SQL_STATEMENT := format('grant select on all views in schema 
%i to %i', C_SCHEMA_NAME, C_ROLE_NAME);
         raise info '%', V_SQL_STATEMENT;
         execute V_SQL_STATEMENT;
         V_SQL_STATEMENT := format('grant select on all materialized 
views in schema %i to %i', C_SCHEMA_NAME, C_ROLE_NAME);
         raise info '%', V_SQL_STATEMENT;
         execute V_SQL_STATEMENT;
         commit;

         return;
     end;
$body$;

---

From: Adrian Klaver <[email-masked]>
Date: Tue, 9 Apr 2024 08:09:02 -0700

>    Position: 298  [Script position: 334 - 361]

[Code: 0, SQL State: 0A000] ERROR: References to other databases are not 
implemented: pg_catalog.pg_roles.rolname
    Position: 298 [Script position: 334 - 361]
> 
> To the best of my knowledge, pg_catalog is a schema not a database, like 
> information_schema. Am I missing something? And why is it not allowed to 
> type from the catalogue?
> 

PG_CATALOG.PG_ROLES.ROLNAME := 'snowrunner_reader';

Is being seen as DB_NAME.TABLE_NAME.COLUMN_NAME.

-- 
Adrian Klaver
[email-masked]

---

From: Thiemo Kellner <[email-masked]>
Date: Tue, 9 Apr 2024 17:12:02 +0200

Thanks for taking this up.

> Is being seen as DB_NAME.TABLE_NAME.COLUMN_NAME.

Yes, obviously, but why? With the information_schema view all is fine. 
And, I suppose, with all other objects in other schemas of the same 
database too.

---

From: Adrian Klaver <[email-masked]>
Date: Tue, 9 Apr 2024 08:18:48 -0700

On 4/9/24 08:12, Thiemo Kellner wrote:
>> [Code: 0, SQL State: 0A000] ERROR: References to other databases are 
>> not implemented: pg_catalog.pg_roles.rolname

Because you did not do?:

PG_CATALOG.PG_ROLES.ROLNAME%type
-- 
Adrian Klaver
[email-masked]

---

From: Thiemo Kellner <[email-masked]>
Date: Tue, 9 Apr 2024 18:48:44 +0200

> PG_CATALOG.PG_ROLES.ROLNAME%type

Oh, right. Sorry. What an oversight.

---

From: Thiemo Kellner <[email-masked]>
Date: Tue, 9 Apr 2024 18:49:25 +0200

> PG_CATALOG.PG_ROLES.ROLNAME%type

Thanks

---

From: Tom Lane <[email-masked]>
Date: Tue, 09 Apr 2024 13:09:35 -0400

>>> Is being seen as DB_NAME.TABLE_NAME.COLUMN_NAME.

No, it's being seen as DB_NAME.SCHEMA_NAME.TYPE_NAME.

> PG_CATALOG.PG_ROLES.ROLNAME%type

Exactly.  The %type bit is important.

			regards, tom lane