AW: AW: Cast INTEGER to BIT confusion - Mailing list pgsql-general

From [Quipsy] Markus Karg
Subject AW: AW: Cast INTEGER to BIT confusion
Date
Msg-id 015a3586e6dc40e0b1c3a4a1f3b1e44c@quipsy.de
Whole thread Raw
In response to Re: AW: Cast INTEGER to BIT confusion  (Erik Wienhold <ewie@ewie.name>)
Responses Re: AW: AW: Cast INTEGER to BIT confusion
Re: AW: AW: Cast INTEGER to BIT confusion
List pgsql-general
I am giving up. While even `SELECT current_schemas(true)` correctly prints `xxx, pg_catalog` it still uses the original
bittype. This is completely NOT as described in the documentation, where it is clearly told that pg_catalog only is
searchedimmediately if NOT found in the search path. It seems it is simply impossible to run this application on
PostgreSQL,and we have to stick with a different RDBMS. Very sad.
 
-Markus


-----Ursprüngliche Nachricht-----
Von: Erik Wienhold <ewie@ewie.name> 
Gesendet: Dienstag, 15. August 2023 16:28
An: [Quipsy] Markus Karg <karg@quipsy.de>; pgsql-general@lists.postgresql.org
Betreff: Re: AW: Cast INTEGER to BIT confusion

> On 15/08/2023 14:02 CEST [Quipsy] Markus Karg <karg@quipsy.de> wrote:
>
> I just tried out your proposal on PostgreSQL 15.3 and this is the result:
>
> ERROR:  column "c" is of type bit but expression is of type integer
> LINE 5:   INSERT INTO t VALUES (1);
>                                 ^
> HINT:  You will need to rewrite or cast the expression.
>
> Apparently the search path is ignored?!
>
> -----Ursprüngliche Nachricht-----
> Von: Erik Wienhold <ewie@ewie.name>
> Gesendet: Dienstag, 15. August 2023 13:48
> An: [Quipsy] Markus Karg <karg@quipsy.de>; 
> pgsql-general@lists.postgresql.org
> Betreff: Re: Cast INTEGER to BIT confusion
>
> You could create a custom domain if you're only interested in values 0 
> and 1 and don't use bit string functions.  The search path must be 
> changed so that domain bit overrides pg_catalog.bit:
> 
>     =# CREATE SCHEMA xxx;
>     =# CREATE DOMAIN xxx.bit AS int;
>     =# SET search_path = xxx, pg_catalog;
>     =# CREATE TABLE t (c bit);
>     =# INSERT INTO t VALUES (1);
>     INSERT 0 1
>
> But I would do that only if the third-party code cannot be tweaked 
> because the custom domain could be confusing.  It's also prone to 
> errors as it relies on a specific search path order.  Also make sure 
> that regular users cannot create objects in schema xxx that would override objects in pg_catalog.

Hmm, I thought that Postgres resolves all types through the search path, but apparently that is not the case for
built-intypes.  I never used this to override built-in types so this is a surprise to me.  (And obviously I haven't
testedthe search path feature before posting.)
 

Neither [1] or [2] mention that special (?) case or if there's a distinction between built-in types and user-defined
types. The USAGE privilege is required according to [2] but I was testing as superuser anyway.
 

[1] https://www.postgresql.org/docs/15/ddl-schemas.html
[2] https://www.postgresql.org/docs/15/runtime-config-client.html#GUC-SEARCH-PATH

--
Erik

pgsql-general by date:

Previous
From: Adrian Klaver
Date:
Subject: Re: Converting sql anywhere to postgres
Next
From: rihad
Date:
Subject: Why doesn't autovacuum/analyze run in due time after calling pg_stat_reset?