回复: BUG #18892: When the view already exists, CREATE OR REPLACE VIEW does not check whether the table exists. - Mailing list pgsql-bugs

From Gang Chen
Subject 回复: BUG #18892: When the view already exists, CREATE OR REPLACE VIEW does not check whether the table exists.
Date
Msg-id KL1PR03MB80701C89409607AF0B339330E5B32@KL1PR03MB8070.apcprd03.prod.outlook.com
Whole thread Raw
In response to Re: BUG #18892: When the view already exists, CREATE OR REPLACE VIEW does not check whether the table exists.  ("David G. Johnston" <david.g.johnston@gmail.com>)
Responses Re: 回复: BUG #18892: When the view already exists, CREATE OR REPLACE VIEW does not check whether the table exists.
List pgsql-bugs
Hello,

But isn't that kind of strange? If it's just a very simple view, first of all, referencing itself would result in an infinite recursion error. Also, it doesn't seem to have any practical use. Secondly, during pg_upgrade or backup and restore processes, it might introduce unnecessary errors and additional handling procedures.

Regards,
Gavin

发件人: David G. Johnston <david.g.johnston@gmail.com>
发送时间: 2025年4月13日 3:32
收件人: Gang Chen <gchen@s2now.com>; pgsql-bugs@lists.postgresql.org <pgsql-bugs@lists.postgresql.org>
主题: Re: BUG #18892: When the view already exists, CREATE OR REPLACE VIEW does not check whether the table exists.
 
You don't often get email from david.g.johnston@gmail.com. Learn why this is important
On Sat, Apr 12, 2025 at 11:59 AM PG Bug reporting form <noreply@postgresql.org> wrote:
The following bug has been logged on the website:

Bug reference:      18892
Logged by:          Gavin
Email address:      gchen@s2now.com
PostgreSQL version: 16.8
Operating system:   Red Hat Enterprise Linux release 9.5
Description:       

 
However, as demonstrated in my test demo, when
the view already exists, running CREATE OR REPLACE VIEW does not check
whether the table exists.

Because of the whole shared namespace setup it would be impossible for a table of that name to exist when executing the "or replace" branch since the view being replaced occupies that name within the namespace.  Any check for an actual table would return false.  And "or replace" only happens if a view of that name exists.

Kirill's answer is correct; though it is a bit annoying that "create view" cannot detect the infinite recursion inherent in its body.

David J.

pgsql-bugs by date:

Previous
From: PG Bug reporting form
Date:
Subject: BUG #18894: values of JLC_COLLATE and LC_CTYPE in the database have changed from Japanese_Japan.932 to ja-jp
Next
From: Robins Tharakan
Date:
Subject: Re: BUG #18893: Segfault during analyze pg_database