> Currently, for CTAS or CREATE MATERIALIZED VIEW(CMV) without if-not-exists
> clause, the existence of the relation gets checked during the execution
> of the select part and an error is thrown there.
> All the unnecessary rewrite and planning for the select part would have
> happened just to fail later. However, if if-not-exists clause is present,
> then a notice is issued and returned immediately without any further rewrite
> or planning for . This seems somewhat inconsistent to me.
>
> I propose to check the relation existence early in ExecCreateTableAs() as
> well as in ExplainOneUtility() and throw an error in case it exists already
> to avoid unnecessary rewrite, planning and execution of the select part.
>
> Attaching a patch. Note that I have not added any test cases as the existing
> test cases in create_table.sql and matview.sql would cover the code.
>
> Thoughts?
Personally, I think it make sense, as other CMD(such as create extension/index ...) throw that error
before any further operation too.
I am just a little worried about the behavior change of [explain CTAS].
May be someone will complain the change from normal explaininfo to error output.
And I took a look into the patch.
+ StringInfoData emsg;
+
+ initStringInfo(&emsg);
+
+ if (level == NOTICE)
+ appendStringInfo(&emsg,
Using variable emsg and level seems a little complicated to me.
How about just:
if (!is_explain && ctas->if_not_exists)
ereport(NOTICE,xxx
else
ereport(ERROR,xxx
Best regards,
houzj