Thread

  1. possible mis-handling of nulls in views in 7.0.2

    Mark Stosberg <mark@summersault.com> — 2001-03-07T20:36:09Z

    Hello,
    
       I'm running Postgres 7.0.2 and have run into a curious situation. I
    got a back a null value in a select on VIEW that is defined as not
    allowing that column to be null. Here's a screenshot:
    
    marvel=> \d shipments;
    View    = shipments
    Query   = SELECT "web_data"."shipment_id", "web_data"."order_id",
    "web_data"."customer_id", "web_data"."purchase_order_num", "web_data"."actual_ship
    _date", "web_data"."pro_num", "sum"("web_data"."qt_ordered") AS
    "qt_ordered", "sum"("web_data"."qt_shipped") AS "qt_shipped" FROM
    "web_data" WHERE (
    "web_data"."shipment_id" NOTNULL) GROUP BY "web_data"."shipment_id",
    "web_data"."order_id", "web_data"."customer_id", "web_data"."actual_ship_date",
     "web_data"."pro_num", "web_data"."purchase_order_num";
    +----------------------------------+----------------------------------+-------+
    |              Field               |              Type                | Length|
    +----------------------------------+----------------------------------+-------+
    | shipment_id                      | varchar()                        | 
      32 |
    | order_id                         | varchar()                        | 
     100 |
    | customer_id                      | varchar()                        | 
      10 |
    | purchase_order_num               | varchar()                        | 
     100 |
    | actual_ship_date                 | date                             | 
       4 |
    | pro_num                          | varchar()                        | 
     100 |
    | qt_ordered                       | float8                           | 
       8 |
    | qt_shipped                       | float8                           | 
       8 |
    +----------------------------------+----------------------------------+-------+
    marvel=>
    
    ### Notice that the shipment_id is NOTNULL
    ### now watch:
    
    marvel=> select * from shipments where shipment_id is null;
    shipment_id|order_id|customer_id|purchase_order_num|actual_ship_date|pro_num|qt_ordered|qt_shipped
    -----------+--------+-----------+------------------+----------------+-------+----------+----------
               |        |           |                  |                |   
       |          |
    (1 row)
    #############
    It returns a row with a null shipment id!
    
    I'm not sure what's happening here-- I tried to simplify this to a
    simple case, but I couldn't reproduce the bug. Oddly, this null row
    doesn't seem to appear in the table web_data that the view references. I
    think it's easy enough to work around, but I'm curious what might be
    happening here. 
    
    Thanks,
    
      -mark
    
    personal website             }      Summersault Website Development
    http://mark.stosberg.com/    {      http://www.summersault.com/
    
    
  2. Re: possible mis-handling of nulls in views in 7.0.2

    Tom Lane <tgl@sss.pgh.pa.us> — 2001-03-13T00:09:11Z

    Mark Stosberg <mark@summersault.com> writes:
    >    I'm running Postgres 7.0.2 and have run into a curious situation. I
    > got a back a null value in a select on VIEW that is defined as not
    > allowing that column to be null.
    
    I think this is an artifact of the curious (not to say broken)
    implementation of views pre-7.1.  However, it's hard to tell for sure
    because I can't reproduce your problem.  Are you sure you are running
    7.0.2 and not something older?  Can you provide a self-contained
    example?  My test went like this:
    
    play=> select version();
                                 version
    ------------------------------------------------------------------
     PostgreSQL 7.0.2 on hppa2.0-hp-hpux10.20, compiled by gcc 2.95.2
    (1 row)
    
    play=> create table foo (f1 int, f2 int);
    CREATE
    play=> insert into foo values(1,2);
    INSERT 873546 1
    play=> insert into foo values(1,3);
    INSERT 873547 1
    play=> insert into foo values(2,4);
    INSERT 873548 1
    play=> insert into foo values(2,5);
    INSERT 873549 1
    play=> create view v2 as select f1,sum(f2) from foo where f1 notnull group by f1;
    CREATE 873571 1
    play=> select * from v2 ;
     f1 | sum
    ----+-----
      1 |   5
      2 |   9
    (2 rows)
    
    play=> select * from v2 where f1 isnull;
     f1 | sum
    ----+-----
    (0 rows)
    
    			regards, tom lane
    
    
  3. Re: possible mis-handling of nulls in views in 7.0.2

    Mark Stosberg <mark@summersault.com> — 2001-03-13T02:02:21Z

    Tom,
    
      I tried to build a simple test case and I couldn't reproduce either.
    I'm still actively working with that database, though-- If I run into it
    again, and can reproduce a condensed case, I'll definitely submit it. It
    sounds like views are being improved a good deal in 7.1, so perhaps my
    oddity would be repaired anyway. Thanks for checking it out.
    
       -mark
    
    http://mark.stosberg.com/
    
    
    Tom Lane wrote:
    > 
    > Mark Stosberg <mark@summersault.com> writes:
    > >    I'm running Postgres 7.0.2 and have run into a curious situation. I
    > > got a back a null value in a select on VIEW that is defined as not
    > > allowing that column to be null.
    > 
    > I think this is an artifact of the curious (not to say broken)
    > implementation of views pre-7.1.  However, it's hard to tell for sure
    > because I can't reproduce your problem.  Are you sure you are running
    > 7.0.2 and not something older?  Can you provide a self-contained
    > example?  My test went like this:
    > 
    > play=> select version();
    >                              version
    > ------------------------------------------------------------------
    >  PostgreSQL 7.0.2 on hppa2.0-hp-hpux10.20, compiled by gcc 2.95.2
    > (1 row)
    > 
    > play=> create table foo (f1 int, f2 int);
    > CREATE
    > play=> insert into foo values(1,2);
    > INSERT 873546 1
    > play=> insert into foo values(1,3);
    > INSERT 873547 1
    > play=> insert into foo values(2,4);
    > INSERT 873548 1
    > play=> insert into foo values(2,5);
    > INSERT 873549 1
    > play=> create view v2 as select f1,sum(f2) from foo where f1 notnull group by f1;
    > CREATE 873571 1
    > play=> select * from v2 ;
    >  f1 | sum
    > ----+-----
    >   1 |   5
    >   2 |   9
    > (2 rows)
    > 
    > play=> select * from v2 where f1 isnull;
    >  f1 | sum
    > ----+-----
    > (0 rows)
    > 
    >                         regards, tom lane
    
    -- 
    
    http://mark.stosberg.com/