Hi, here we go again...

As you know there is a problem executing something like:

create table foo (
    col1 serial,
    col2 int
);

create view v_foo as select * from foo;

create rule ins_rule as on insert to v_foo do instead
insert into foo(col1, col2) values (new.col1, new.col2);

insert into v_foo(col2) values (1);

this give an error like:
psql:f:/views.sql:13: ERROR:  null value in column "col1" violates
not-null constraint

----

There is a workaround about this creating default values to the view.
Now, for updateable views we need this happen automatically, attached
there is a solution to this.
The only problem i have found until now is that
update v_foo set col1 = DEFAULT; execute nextval twice per every record.
so there will be a gasp between numbers, but AFAIK nextval has no guarantee
of returning sequential numbers.

Any comments on this?


-- 
regards,
Jaime Casanova
(DBA: DataBase Aniquilator ;)
*** ../pgsql_head/src/backend/rewrite/rewriteHandler.c  2005-05-27 
02:38:08.000000000 -0500
--- src/backend/rewrite/rewriteHandler.c        2005-05-27 14:36:58.000000000 
-0500
***************
*** 376,381 ****
--- 376,389 ----
                        new_expr = build_column_default(target_relation, 
attrno);
  
                        /*
+                        * I will do this only in case of relkind == 
RELKIND_VIEW.
+                        * This is the last attempt to get a value for new_expr 
before we
+                        * consider that new_expr must be NULL.
+                        */
+                       if (!new_expr && target_relation->rd_rel->relkind == 
RELKIND_VIEW)
+                               new_expr = (Expr *) makeNode(SetToDefault);
+ 
+                       /*
                         * If there is no default (ie, default is effectively 
NULL),
                         * we can omit the tlist entry in the INSERT case, 
since the
                         * planner can insert a NULL for itself, and there's no 
point
---------------------------(end of broadcast)---------------------------
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]

Reply via email to