This is being done for 8.3, right?

---------------------------------------------------------------------------

Zoltan Boszormenyi wrote:
> Hi,
> 
> here's the next version. Changes:
> - Extended documentation
> - Extending permissions to new sequences
>   ALTER TABLE tab ADD col type GENERATED  AS IDENTITY
>   didn't work as advertised, now it seems to.
> - Test case was also extended.
> - Previously introduced memory leaks were plugged. Really.
> 
> Now the only feature missing is the previously discussed
> GENERATED ALWAYS AS ( expr ) so it can be used like this:
> 
> CREATE TABLE tab (
>     c1 double,
>     c2 integer,
>     c3 double GENERATED ALWAYS AS ( col1 + col2),
>     c4 SMALLINT GENERATED ALWAYS AS
>                 (CASE WHEN c1 > c2 THEN 1 ELSE NULL END)
> );
> 
> What should the following code produce as a result?
> 
> INSERT INTO tab (c1, c2, c3, c4) VALUES (1.1, 2, 0, 0);
> 
> This should insert (1.1, 2, 3.1, NULL)
> 
> UPDATE tab SET c2 = 1;
> 
> Only c2 changes, so: (1.1, 1, 3.1, NULL)
> Or should it change to (1.1, 1, 2.1, 1),
> e.g. recompute all columns that depend on
> changed columns?
> 
> UPDATE tab SET c4 = DEFAULT, c3 = DEFAULT, c2 = 2, c1 = 3.5;
> 
> Now what? It should be (3.5, 2, 5.5, 1)
> But based on current UPDATE behaviour,
> e.g. values gets computed based on previous
> values, it becomes (3.5, 2, 2.1, 1)
> 
> That would really need changing the behaviour of UPDATE.
> Currently, if I do an
> 
> UPDATE tab SET c1 = 3.5, c2 = 2, c3 = c1 + c2;
> 
> then c3 gets its value based on the previous content
> of the record. For the above GENERATED ALWAYS
> AS (expr) construct to work, UPDATE have to compute
> the column values in multipass, something like this:
> 
> constant values are computed;
> while (is there any non-computed columns)
> {
>     newly_computed = 0;
>     foreach (column, non-computed-columns)
>     {
>        if (column value depends only on computed columns)
>        {
>           compute it;
>           newly_computed++;
>        }
>     }
>     if (newly_computed == 0)
>        elog(ERROR, "circular dependency");
> }
> 
> This behaviour change would enable something like this:
> CREATE tab2 (c1 integer, c2 integer, c3 integer);
> INSERT INTO tab2 (c1,c2,c3) VALUES (1, 2, c1 + c2);
> 
> Does this described behaviour have any precedent or
> standard compliance?
> 
> Best regards,
> Zolt?n B?sz?rm?nyi
> 

[ application/x-tar is not supported, skipping... ]

> 
> ---------------------------(end of broadcast)---------------------------
> TIP 5: don't forget to increase your free space map settings

-- 
  Bruce Momjian   [EMAIL PROTECTED]
  EnterpriseDB    http://www.enterprisedb.com

  + If your life is a hard drive, Christ can be your backup. +

---------------------------(end of broadcast)---------------------------
TIP 6: explain analyze is your friend

Reply via email to