When "ON SELECT" rule is created on a table without columns, it successfully converts a table into the view. However, when the same is done using CREATE VIEW command, it fails with an error saying: "view must have at least one column". Here is what I'm trying to say:
-- create table t1 without columns create table t1();
-- create table t2 without columns create table t2();
-- create ON SELECT rule on t1 - this would convert t1 from table to view create rule "_RETURN" as on select to t1 do instead select * from t2;
The output of "\d+ t1" shows the definition of converted view t1 which doesn't have any columns in the select query.
Now, when i try creating another view with the same definition using CREATE VIEW command, it fails with the error -> ERROR: view must have at least one column. See below
postgres=# create view v1 as select from t2; ERROR: view must have at least one column
OR,
postgres=# create view v1 as select * from t2; ERROR: view must have at least one column
Isn't that a bug in create rule command or am i missing something here ?
Yes, it's looks like a bug to me.
If it is a bug, then, attached is the patch that fixes it.
I had quick glance to the patch - here are few commits:
1)
+ if (event_relation->rd_rel->relnatts == 0)
Can't use direct relnatts - as need to consider attisdropped.
2) I think you may like to change the error message to be in-line with the other error message in the similar code area.
May be something like: "could not convert table \"%s\" to a view because table does not have any column"