Re: Fail Fast In CTAS/CMV If Relation Already Exists To Avoid Unnecessary Rewrite, Planning Costs - Mailing list pgsql-hackers
From | Bharath Rupireddy |
---|---|
Subject | Re: Fail Fast In CTAS/CMV If Relation Already Exists To Avoid Unnecessary Rewrite, Planning Costs |
Date | |
Msg-id | CALj2ACWmLq9xSytKWNqKeb0bgUe4DchnCGikXtGHviZ1ep0ymg@mail.gmail.com Whole thread Raw |
In response to | Re: Fail Fast In CTAS/CMV If Relation Already Exists To Avoid Unnecessary Rewrite, Planning Costs (Michael Paquier <michael@paquier.xyz>) |
Responses |
Re: Fail Fast In CTAS/CMV If Relation Already Exists To Avoid Unnecessary Rewrite, Planning Costs
|
List | pgsql-hackers |
On Fri, Dec 11, 2020 at 1:40 PM Michael Paquier <michael@paquier.xyz> wrote: > On Fri, Dec 11, 2020 at 12:48:49PM +0530, Bharath Rupireddy wrote: > > I'm not quite sure how other databases behave. If I go by the main > > intention of EXPLAIN without ANALYZE, that should do the planning, > > show it in the output and no execution of the query should happen. For > > EXPLAIN CTAS/CMV, only thing that gets planned is the SELECT part and > > no execution happens so no existence check for the CTAS/CMV relation > > that will get created if the CTAS/CMV is executed. Having said that, > > the existence of the relations that are in the SELECT part are anyways > > checked during planning for EXPLAIN without ANALYZE. > > I think that it is tricky to define IF NOT EXISTS for a CTAS with > EXPLAIN. How would you for example treat an EXPLAIN ANALYZE with a > query that includes an INSERT RETURNING in a WITH clause. Would you > say that we do nothing if the relation exists? Or would you execute > it, still insert nothing on the result relation because it already > exists, even if the inner query may have inserted something as part of > its execution on a different relation? I may not have got your above scenario correctly(it will be good if you can provide the use case in case I want to check something there). I tried the following way, all the involved relations are being checked for existence even though for EXPLAIN: postgres=# EXPLAIN WITH temp1 AS (SELECT * FROM t1) INSERT INTO t1_does_not_exit VALUES (1); ERROR: relation "t1_does_not_exit" does not exist LINE 1: ...LAIN WITH temp1 AS (SELECT * FROM t1) INSERT INTO t1_does_no... ^ IIUC, is it that we want the following behaviour in case the relation CTAS/CMV is trying to create does not exist? Note that the sample queries are run on latest master branch: EXPLAIN: throw an error, instead of the query showing select plan on master branch currently? postgres=# explain create table t2 as select * from t1; QUERY PLAN ---------------------------------------------------- Seq Scan on t1 (cost=0.00..2.00 rows=100 width=8) EXPLAIN ANALYZE: throw an error as it does on master branch? postgres=# explain analyze create table t2 as select * from t1; ERROR: relation "t2" already exists EXPLAIN with if-not-exists clause: throw a warning and an empty plan from ExplainOneUtility? If not an empty plan, we should be doing the relation existence check before we come to explain routines, maybe in gram.c? On the master branch it doesn't happen, the query shows the plan for select part as shown below. postgres=# explain create table if not exists t2 as select * from t1; QUERY PLAN ---------------------------------------------------- Seq Scan on t1 (cost=0.00..2.00 rows=100 width=8) EXPLAIN ANALYZE with if-not-exists clause: (ideally, for if-not-exists clause we expect a warning to be issued, but currently relation existence error is thrown) a warning and an empty plan from ExplainOneUtility? If not an empty plan, we should be doing the relation existence check before we come to explain routines, maybe in gram.c? On the master branch an ERROR is thrown. postgres=# explain analyze create table if not exists t2 as select * from t1; ERROR: relation "t2" already exists For plain CTAS -> throw an error as it happens on master branch. postgres=# create table t2 as select * from t1; ERROR: relation "t2" already exists For plain CTAS with if-not-exists clause -> a warning is issued as it happens on master branch. postgres=# create table if not exists t2 as select * from t1; NOTICE: relation "t2" already exists, skipping CREATE TABLE AS With Regards, Bharath Rupireddy. EnterpriseDB: http://www.enterprisedb.com
pgsql-hackers by date: