Thread: Re: MY PATCH

Re: MY PATCH

From
Chris Bitmead
Date:
The regression results are correct. It's just that they're different
than what they used to be because of the SQL3 ONLY incompatibility. I
wasn't sure if people wanted to change the regression tests to give the
old results, or just insert the new results.

Also, I don't get any core dump. Are you sure you did a full clean and
initdb?

Tom Lane wrote:
>
> Bruce Momjian <pgman@candle.pha.pa.us> writes:
> > No.  I assume the users do that before submitting the patch.
> > I can back it out.
>
> Well, let's brace him about it first.
>
> Chris, your patch is showing six regression test failures including
> a coredump.  Please show cause why it shouldn't be reversed out
> forthwith.  This is not good enough to be applied to CVS, not even
> early in a development cycle --- you've just made it impossible for
> other developers to tell whether *their* work is OK or not.
>
>                         regards, tom lane
>
> >> Not looking good.  Did you not bother to run regression tests
> >> before committing?
> >>
> >> =============== running regression queries...         =================
> >> boolean ..  ok
> >> char ..  ok
> >> name ..  ok
> >> varchar ..  ok
> >> text ..  ok
> >> int2 ..  ok
> >> int4 ..  ok
> >> int8 ..  ok
> >> oid ..  ok
> >> float4 ..  ok
> >> float8 ..  ok
> >> numeric ..  ok
> >> strings ..  ok
> >> numerology ..  ok
> >> point ..  ok
> >> lseg ..  ok
> >> box ..  ok
> >> path ..  ok
> >> polygon ..  ok
> >> circle ..  ok
> >> interval ..  ok
> >> timestamp ..  ok
> >> reltime ..  ok
> >> tinterval ..  ok
> >> inet ..  ok
> >> comments ..  ok
> >> oidjoins ..  ok
> >> type_sanity ..  ok
> >> opr_sanity ..  ok
> >> abstime ..  ok
> >> geometry ..  ok
> >> horology ..  ok
> >> create_function_1 ..  ok
> >> create_type ..  ok
> >> create_table ..  ok
> >> create_function_2 ..  ok
> >> copy ..  ok
> >> constraints ..
> >> Pid 17071 received a SIGSEGV for stack growth failure.
> >> Possible causes: insufficient memory or swap space,
> >> or stack size exceeded maxssiz.
> >> failed
> >> triggers ..  ok
> >> create_misc ..  ok
> >> create_aggregate ..  ok
> >> create_operator ..  ok
> >> create_index ..  ok
> >> inherit ..  ./regress.sh[126]: sql/inherit.sql: Cannot find or open the file.
> >> diff: expected/inherit.out: No such file or directory
> >> diff: results/inherit.out: No such file or directory
> >> ok
> >> create_view ..  ok
> >> sanity_check ..  ok
> >> errors ..  ok
> >> select ..  ok
> >> select_into ..  ok
> >> select_distinct ..  ok
> >> select_distinct_on ..  ok
> >> select_implicit ..  ok
> >> select_having ..  ok
> >> subselect ..  ok
> >> union ..  ok
> >> case ..  ok
> >> join ..  ok
> >> aggregates ..  failed
> >> transactions ..  ok
> >> random ..  ok
> >> portals ..  ok
> >> arrays ..  ok
> >> btree_index ..  ok
> >> hash_index ..  ok
> >> misc ..  failed
> >> select_views ..  failed
> >> alter_table ..  ok
> >> portals_p2 ..  ok
> >> rules ..  failed
> >> foreign_key ..  ok
> >> limit ..  ok
> >> plpgsql ..  ok
> >> temp ..  ok
> >>
> >>
> >> regards, tom lane
> >>
>
> > --
> >   Bruce Momjian                        |  http://www.op.net/~candle
> >   pgman@candle.pha.pa.us               |  (610) 853-3000
> >   +  If your life is a hard drive,     |  830 Blythe Avenue
> >   +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

--
Chris Bitmead
mailto:chris@bitmead.com

Re: [CORE] Re: MY PATCH

From
Bruce Momjian
Date:
>
> The regression results are correct. It's just that they're different
> than what they used to be because of the SQL3 ONLY incompatibility. I
> wasn't sure if people wanted to change the regression tests to give the
> old results, or just insert the new results.
>
> Also, I don't get any core dump. Are you sure you did a full clean and
> initdb?

I am seeing a backend crash in the inherit regression test:

    SELECT * FROM ONLY d;
        aa    | bb | cc | dd
    ----------+----+----+----
     ddd      |    |    |
     dddd     |    |    |
     ddddd    |    |    |
     dddddd   |    |    |
     ddddddd  |    |    |
     dddddddd |    |    |
    (6 rows)

    UPDATE a SET aa='zzzz' WHERE aa='aaaa';
    pqReadData() -- backend closed the channel unexpectedly.
            This probably means the backend terminated abnormally
            before or while processing the request.
    connection to server was lost

Should I send you a backtrace?

--
  Bruce Momjian                        |  http://www.op.net/~candle
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

Re: Re: MY PATCH

From
Bruce Momjian
Date:
>
> The regression results are correct. It's just that they're different
> than what they used to be because of the SQL3 ONLY incompatibility. I
> wasn't sure if people wanted to change the regression tests to give the
> old results, or just insert the new results.
>
> Also, I don't get any core dump. Are you sure you did a full clean and
> initdb?

OK, I have attached my regression diffs.  I fixed a small regression
difference this morning for a patch I applied yesterday.

Certainly, the crash is not expected.  Also, the other differences don't
seem reasonable for an inheritance patch.  Are all the changes correct,
and the old results wrong?  If so, we can update the expected files.

e.g.

      SELECT sum(gpa) AS avg_6_8 FROM student;
       avg_6_8
      ---------
    !      6.8
      (1 row)

    --- 46,52 ----
      SELECT sum(gpa) AS avg_6_8 FROM student;
       avg_6_8
      ---------
    !     16.6
      (1 row)

Oh, I see now:

    CREATE TABLE student (
            gpa             float8
    ) INHERITS (person);

So it seems some of these new results are caused by the new inherit
code.  Good.

Can you confirm the other changes are correct?

--
  Bruce Momjian                        |  http://www.op.net/~candle
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
======   inherit   ======
151,534c151,154
< UPDATE ONLY a SET aa='zzzzz' WHERE aa='aaaaa';
< UPDATE b SET aa='zzz' WHERE aa='aaa';
< UPDATE ONLY b SET aa='zzz' WHERE aa='aaa';
< UPDATE a SET aa='zzzzzz' WHERE aa LIKE 'aaa%';
< SELECT * FROM a;
<     aa
< ----------
<  zzzz
<  zzzzz
<  zzzzzz
<  zzzzzz
<  zzzzzz
<  zzzzzz
<  bbb
<  bbbb
<  bbbbb
<  bbbbbb
<  bbbbbbb
<  bbbbbbbb
<  ccc
<  cccc
<  ccccc
<  cccccc
<  ccccccc
<  cccccccc
<  ddd
<  dddd
<  ddddd
<  dddddd
<  ddddddd
<  dddddddd
< (24 rows)
<
< SELECT * FROM b;
<     aa    | bb
< ----------+----
<  bbb      |
<  bbbb     |
<  bbbbb    |
<  bbbbbb   |
<  bbbbbbb  |
<  bbbbbbbb |
<  ddd      |
<  dddd     |
<  ddddd    |
<  dddddd   |
<  ddddddd  |
<  dddddddd |
< (12 rows)
<
< SELECT * FROM c;
<     aa    | cc
< ----------+----
<  ccc      |
<  cccc     |
<  ccccc    |
<  cccccc   |
<  ccccccc  |
<  cccccccc |
<  ddd      |
<  dddd     |
<  ddddd    |
<  dddddd   |
<  ddddddd  |
<  dddddddd |
< (12 rows)
<
< SELECT * FROM d;
<     aa    | bb | cc | dd
< ----------+----+----+----
<  ddd      |    |    |
<  dddd     |    |    |
<  ddddd    |    |    |
<  dddddd   |    |    |
<  ddddddd  |    |    |
<  dddddddd |    |    |
< (6 rows)
<
< SELECT * FROM ONLY a;
<    aa
< --------
<  zzzz
<  zzzzz
<  zzzzzz
<  zzzzzz
<  zzzzzz
<  zzzzzz
< (6 rows)
<
< SELECT * FROM ONLY b;
<     aa    | bb
< ----------+----
<  bbb      |
<  bbbb     |
<  bbbbb    |
<  bbbbbb   |
<  bbbbbbb  |
<  bbbbbbbb |
< (6 rows)
<
< SELECT * FROM ONLY c;
<     aa    | cc
< ----------+----
<  ccc      |
<  cccc     |
<  ccccc    |
<  cccccc   |
<  ccccccc  |
<  cccccccc |
< (6 rows)
<
< SELECT * FROM ONLY d;
<     aa    | bb | cc | dd
< ----------+----+----+----
<  ddd      |    |    |
<  dddd     |    |    |
<  ddddd    |    |    |
<  dddddd   |    |    |
<  ddddddd  |    |    |
<  dddddddd |    |    |
< (6 rows)
<
< UPDATE b SET aa='new';
< SELECT * FROM a;
<     aa
< ----------
<  zzzz
<  zzzzz
<  zzzzzz
<  zzzzzz
<  zzzzzz
<  zzzzzz
<  new
<  new
<  new
<  new
<  new
<  new
<  ccc
<  cccc
<  ccccc
<  cccccc
<  ccccccc
<  cccccccc
<  new
<  new
<  new
<  new
<  new
<  new
< (24 rows)
<
< SELECT * FROM b;
<  aa  | bb
< -----+----
<  new |
<  new |
<  new |
<  new |
<  new |
<  new |
<  new |
<  new |
<  new |
<  new |
<  new |
<  new |
< (12 rows)
<
< SELECT * FROM c;
<     aa    | cc
< ----------+----
<  ccc      |
<  cccc     |
<  ccccc    |
<  cccccc   |
<  ccccccc  |
<  cccccccc |
<  new      |
<  new      |
<  new      |
<  new      |
<  new      |
<  new      |
< (12 rows)
<
< SELECT * FROM d;
<  aa  | bb | cc | dd
< -----+----+----+----
<  new |    |    |
<  new |    |    |
<  new |    |    |
<  new |    |    |
<  new |    |    |
<  new |    |    |
< (6 rows)
<
< SELECT * FROM ONLY a;
<    aa
< --------
<  zzzz
<  zzzzz
<  zzzzzz
<  zzzzzz
<  zzzzzz
<  zzzzzz
< (6 rows)
<
< SELECT * FROM ONLY b;
<  aa  | bb
< -----+----
<  new |
<  new |
<  new |
<  new |
<  new |
<  new |
< (6 rows)
<
< SELECT * FROM ONLY c;
<     aa    | cc
< ----------+----
<  ccc      |
<  cccc     |
<  ccccc    |
<  cccccc   |
<  ccccccc  |
<  cccccccc |
< (6 rows)
<
< SELECT * FROM ONLY d;
<  aa  | bb | cc | dd
< -----+----+----+----
<  new |    |    |
<  new |    |    |
<  new |    |    |
<  new |    |    |
<  new |    |    |
<  new |    |    |
< (6 rows)
<
< UPDATE a SET aa='new';
< DELETE FROM ONLY c WHERE aa='new';
< SELECT * FROM a;
<  aa
< -----
<  new
<  new
<  new
<  new
<  new
<  new
<  new
<  new
<  new
<  new
<  new
<  new
<  new
<  new
<  new
<  new
<  new
<  new
< (18 rows)
<
< SELECT * FROM b;
<  aa  | bb
< -----+----
<  new |
<  new |
<  new |
<  new |
<  new |
<  new |
<  new |
<  new |
<  new |
<  new |
<  new |
<  new |
< (12 rows)
<
< SELECT * FROM c;
<  aa  | cc
< -----+----
<  new |
<  new |
<  new |
<  new |
<  new |
<  new |
< (6 rows)
<
< SELECT * FROM d;
<  aa  | bb | cc | dd
< -----+----+----+----
<  new |    |    |
<  new |    |    |
<  new |    |    |
<  new |    |    |
<  new |    |    |
<  new |    |    |
< (6 rows)
<
< SELECT * FROM ONLY a;
<  aa
< -----
<  new
<  new
<  new
<  new
<  new
<  new
< (6 rows)
<
< SELECT * FROM ONLY b;
<  aa  | bb
< -----+----
<  new |
<  new |
<  new |
<  new |
<  new |
<  new |
< (6 rows)
<
< SELECT * FROM ONLY c;
<  aa | cc
< ----+----
< (0 rows)
<
< SELECT * FROM ONLY d;
<  aa  | bb | cc | dd
< -----+----+----+----
<  new |    |    |
<  new |    |    |
<  new |    |    |
<  new |    |    |
<  new |    |    |
<  new |    |    |
< (6 rows)
<
< DELETE FROM a;
< SELECT * FROM a;
<  aa
< ----
< (0 rows)
<
< SELECT * FROM b;
<  aa | bb
< ----+----
< (0 rows)
<
< SELECT * FROM c;
<  aa | cc
< ----+----
< (0 rows)
<
< SELECT * FROM d;
<  aa | bb | cc | dd
< ----+----+----+----
< (0 rows)
<
< SELECT * FROM ONLY a;
<  aa
< ----
< (0 rows)
<
< SELECT * FROM ONLY b;
<  aa | bb
< ----+----
< (0 rows)
<
< SELECT * FROM ONLY c;
<  aa | cc
< ----+----
< (0 rows)
<
< SELECT * FROM ONLY d;
<  aa | bb | cc | dd
< ----+----+----+----
< (0 rows)
<
---
> pqReadData() -- backend closed the channel unexpectedly.
>     This probably means the backend terminated abnormally
>     before or while processing the request.
> connection to server was lost
======   aggregates   ======
25c25
<      3.4
---
>     3.32
49c49
<      6.8
---
>     16.6
======   misc   ======
281c281,305
< (1 row)
---
>  b     |   3
>  b     |   4
>  c     |   5
>  c     |   6
>  d     |   7
>  d     |   8
>  d     |   9
>  d     |  10
>  d     |  11
>  d     |  12
>  d     |  13
>  d     |  14
>  e     |  15
>  e     |  16
>  e     |  17
>  e     |  18
>  f     |  19
>  f     |  20
>  f     |  21
>  f     |  22
>  f     |  24
>  f     |  25
>  f     |  26
>  f     |  27
> (25 rows)
425c449,450
< (3 rows)
---
>  jeff  | posthacking
> (4 rows)
476c501,503
< (4 rows)
---
>  jeff  | posthacking | advil
>  jeff  | posthacking | peet's coffee
> (6 rows)
503c530,532
< (4 rows)
---
>  advil         | jeff  | posthacking
>  peet's coffee | jeff  | posthacking
> (6 rows)
523c552,554
< (4 rows)
---
>  advil         | posthacking | jeff
>  peet's coffee | posthacking | jeff
> (6 rows)
539a571
>  a
543a576
>  b
550a584
>  c
558a593
>  d
626c661
< (86 rows)
---
> (90 rows)
======   select_views   ======
290c290,361
< (282 rows)
---
>  I- 580                             | [(-121.9322,37.989),(-121.9243,37.006),(-121.9217,37.014)]


                                                                                                          | Oakland 
>  I- 580                             |
[(-122.018,37.019),(-122.0009,37.032),(-121.9787,37.983),(-121.958,37.984),(-121.9571,37.986)]


                                                                 | Oakland 
>  I- 580                        Ramp |
[(-121.8521,37.011),(-121.8479,37.999),(-121.8476,37.999),(-121.8456,37.01),(-121.8455,37.011)]


                                                                 | Oakland 
>  I- 580                        Ramp | [(-121.8743,37.014),(-121.8722,37.999),(-121.8714,37.999)]


                                                                                                          | Oakland 
>  I- 580                        Ramp |
[(-121.9043,37.998),(-121.9036,37.013),(-121.902632,37.0174),(-121.9025,37.018)]


                                                                 | Oakland 
>  I- 580                        Ramp |
[(-121.9368,37.986),(-121.936483,37.98832),(-121.9353,37.997),(-121.93504,37.00035),(-121.9346,37.006),(-121.933764,37.00031),(-121.9333,37.997),(-121.9322,37.989)]


                     | Oakland 
>  I- 580/I-680                  Ramp | ((-121.9207,37.988),(-121.9192,37.016))


                                                                                                          | Oakland 
>  I- 680                             |
((-121.939,37.15),(-121.9387,37.145),(-121.9373,37.125),(-121.934242,37.07643),(-121.933886,37.0709),(-121.9337,37.068),(-121.933122,37.06139),(-121.932736,37.05698),(-121.93222,37.05108),(-121.931844,37.04678),(-121.930113,37.027),(-121.926829,37),(-121.9265,37.998),(-121.9217,37.96),(-121.9203,37.949),(-121.9184,37.934))
                                                                                                       | Oakland 
>  I- 680                             |
[(-121.9101,37.715),(-121.911269,37.74682),(-121.9119,37.764),(-121.9124,37.776),(-121.9174,37.905),(-121.9194,37.957),(-121.9207,37.988)]


                                               | Oakland 
>  I- 680                             | [(-121.9184,37.934),(-121.917,37.913),(-121.9122,37.83),(-121.9052,37.702)]


                                                                                                          | Oakland 
>  I- 680                        Ramp |
[(-121.8833,37.376),(-121.8833,37.392),(-121.883,37.4),(-121.8835,37.402),(-121.8852,37.422)]


                                                                 | Oakland 
>  I- 680                        Ramp | [(-121.92,37.438),(-121.9218,37.424),(-121.9238,37.408),(-121.9252,37.392)]


                                                                                                          | Oakland 
>  I- 680                        Ramp | [(-121.9238,37.402),(-121.9234,37.395),(-121.923,37.399)]


                                                                                                          | Oakland 
>  I- 880                             |
((-121.9669,37.075),(-121.9663,37.071),(-121.9656,37.065),(-121.9618,37.037),(-121.95689,37),(-121.948,37.933))


                                                                 | Oakland 
>  I- 880                             |
[(-121.948,37.933),(-121.9471,37.925),(-121.9467,37.923),(-121.946,37.918),(-121.9452,37.912),(-121.937,37.852)]


                                                                 | Oakland 
>  I- 580                             |
[(-121.727,37.074),(-121.7229,37.093),(-121.722301,37.09522),(-121.721001,37.10005),(-121.7194,37.106),(-121.7188,37.109),(-121.7168,37.12),(-121.7163,37.123),(-121.7145,37.127),(-121.7096,37.148),(-121.707731,37.1568),(-121.7058,37.166),(-121.7055,37.168),(-121.7044,37.174),(-121.7038,37.172),(-121.7037,37.172),(-121.7027,37.175),(-121.7001,37.181),(-121.6957,37.191),(-121.6948,37.192),(-121.6897,37.204),(-121.6697,37.185)]
|Oakland 
>  I- 680                             |
((-121.939,37.15),(-121.9387,37.145),(-121.9373,37.125),(-121.934242,37.07643),(-121.933886,37.0709),(-121.9337,37.068),(-121.933122,37.06139),(-121.932736,37.05698),(-121.93222,37.05108),(-121.931844,37.04678),(-121.930113,37.027),(-121.926829,37),(-121.9265,37.998),(-121.9217,37.96),(-121.9203,37.949),(-121.9184,37.934))
                                                                                                       | Oakland 
>  I- 880                             |
((-121.9669,37.075),(-121.9663,37.071),(-121.9656,37.065),(-121.9618,37.037),(-121.95689,37),(-121.948,37.933))


                                                                 | Oakland 
>  I- 880                             |
[(-122.0612,37.003),(-122.0604,37.991),(-122.0596,37.982),(-122.0585,37.967),(-122.0583,37.961),(-122.0553,37.918),(-122.053635,37.89475),(-122.050759,37.8546),(-122.05,37.844),(-122.0485,37.817),(-122.0483,37.813),(-122.0482,37.811)]

                                                                        | Oakland 
>  I- 880                             |
[(-122.0831,37.312),(-122.0819,37.296),(-122.081,37.285),(-122.0786,37.248),(-122.078,37.24),(-122.077642,37.23496),(-122.076983,37.22567),(-122.076599,37.22026),(-122.076229,37.21505),(-122.0758,37.209)]

                                                                                                      | Oakland 
>  I- 880                        Ramp | [(-122.0019,37.301),(-122.002,37.293)]


                                                                                                          | Oakland 
>  I- 880                        Ramp |
[(-122.0041,37.313),(-122.0018,37.315),(-122.0007,37.315),(-122.0005,37.313),(-122.0002,37.308),(-121.9995,37.289)]


                                                                 | Oakland 
>  I- 880                        Ramp |
[(-122.0041,37.313),(-122.0038,37.308),(-122.0039,37.284),(-122.0013,37.287),(-121.9995,37.289)]


                                                                 | Oakland 
>  I- 880                        Ramp | [(-122.059,37.982),(-122.0577,37.984),(-122.0612,37.003)]


                                                                                                          | Oakland 
>  I- 880                        Ramp | [(-122.0618,37.011),(-122.0631,37.982),(-122.0585,37.967)]


                                                                                                          | Oakland 
>  I- 880                        Ramp | [(-122.085,37.34),(-122.0801,37.316),(-122.081,37.285)]


                                                                                                          | Oakland 
>  I- 880                        Ramp | [(-122.085,37.34),(-122.0866,37.316),(-122.0819,37.296)]


                                                                                                          | Oakland 
>  I- 580                             |
[(-122.1108,37.023),(-122.1101,37.02),(-122.108103,37.00764),(-122.108,37.007),(-122.1069,37.998),(-122.1064,37.994),(-122.1053,37.982),(-122.1048,37.977),(-122.1032,37.958),(-122.1026,37.953),(-122.1013,37.938),(-122.0989,37.911),(-122.0984,37.91),(-122.098,37.908)]

                                       | Oakland 
>  I- 580                             |
[(-122.1543,37.703),(-122.1535,37.694),(-122.1512,37.655),(-122.1475,37.603),(-122.1468,37.583),(-122.1472,37.569),(-122.149044,37.54874),(-122.1493,37.546),(-122.1501,37.532),(-122.1506,37.509),(-122.1495,37.482),(-122.1487,37.467),(-122.1477,37.447),(-122.1414,37.383),(-122.1404,37.376),(-122.1398,37.372),(-122.139,37.356),(-122.1388,37.353),(-122.1385,37.34),(-122.1382,37.33),(-122.1378,37.316)]
                          | Oakland 
>  I- 580                        Ramp | [(-122.1086,37.003),(-122.1068,37.993),(-122.1066,37.992),(-122.1053,37.982)]


                                                                                                          | Oakland 
>  I- 580                        Ramp | [(-122.1414,37.383),(-122.1407,37.376),(-122.1403,37.372),(-122.139,37.356)]


                                                                                                          | Oakland 
>  I- 880                             |
[(-122.0375,37.632),(-122.0359,37.619),(-122.0358,37.616),(-122.034514,37.60409),(-122.031876,37.57965),(-122.031193,37.57332),(-122.03016,37.56375),(-122.02943,37.55698),(-122.028689,37.54929),(-122.027833,37.53908),(-122.025979,37.51698),(-122.0238,37.491)]

                                               | Oakland 
>  I- 880                             |
[(-122.0612,37.003),(-122.0604,37.991),(-122.0596,37.982),(-122.0585,37.967),(-122.0583,37.961),(-122.0553,37.918),(-122.053635,37.89475),(-122.050759,37.8546),(-122.05,37.844),(-122.0485,37.817),(-122.0483,37.813),(-122.0482,37.811)]

                                                                        | Oakland 
>  I- 880                             |
[(-122.0978,37.528),(-122.096,37.496),(-122.0931,37.453),(-122.09277,37.4496),(-122.090189,37.41442),(-122.0896,37.405),(-122.085,37.34)]


                                                | Oakland 
>  I- 880                             |
[(-122.1755,37.185),(-122.1747,37.178),(-122.1742,37.173),(-122.1692,37.126),(-122.167792,37.11594),(-122.16757,37.11435),(-122.1671,37.111),(-122.1655,37.1),(-122.165169,37.09811),(-122.1641,37.092),(-122.1596,37.061),(-122.158381,37.05275),(-122.155991,37.03657),(-122.1531,37.017),(-122.1478,37.98),(-122.1407,37.932),(-122.1394,37.924),(-122.1389,37.92),(-122.1376,37.91)]
                                                   | Oakland 
>  I- 880                        Ramp | [(-122.059,37.982),(-122.0577,37.984),(-122.0612,37.003)]


                                                                                                          | Oakland 
>  I- 880                        Ramp | [(-122.0618,37.011),(-122.0631,37.982),(-122.0585,37.967)]


                                                                                                          | Oakland 
>  I- 580                             |
[(-122.1108,37.023),(-122.1101,37.02),(-122.108103,37.00764),(-122.108,37.007),(-122.1069,37.998),(-122.1064,37.994),(-122.1053,37.982),(-122.1048,37.977),(-122.1032,37.958),(-122.1026,37.953),(-122.1013,37.938),(-122.0989,37.911),(-122.0984,37.91),(-122.098,37.908)]

                                       | Berkeley 
>  I- 580                             |
[(-122.1543,37.703),(-122.1535,37.694),(-122.1512,37.655),(-122.1475,37.603),(-122.1468,37.583),(-122.1472,37.569),(-122.149044,37.54874),(-122.1493,37.546),(-122.1501,37.532),(-122.1506,37.509),(-122.1495,37.482),(-122.1487,37.467),(-122.1477,37.447),(-122.1414,37.383),(-122.1404,37.376),(-122.1398,37.372),(-122.139,37.356),(-122.1388,37.353),(-122.1385,37.34),(-122.1382,37.33),(-122.1378,37.316)]
                          | Berkeley 
>  I- 580                             |
[(-122.2197,37.99),(-122.22,37.99),(-122.222092,37.99523),(-122.2232,37.998),(-122.224146,37.99963),(-122.2261,37.003),(-122.2278,37.007),(-122.2302,37.026),(-122.2323,37.043),(-122.2344,37.059),(-122.235405,37.06427),(-122.2365,37.07)]

                                                                      | Berkeley 
>  I- 580                        Ramp | [(-122.093241,37.90351),(-122.09364,37.89634),(-122.093788,37.89212)]


                                                                                                          | Berkeley 
>  I- 580                        Ramp | [(-122.0934,37.896),(-122.09257,37.89961),(-122.0911,37.906)]


                                                                                                          | Berkeley 
>  I- 580                        Ramp | [(-122.0941,37.897),(-122.0943,37.902)]


                                                                                                          | Berkeley 
>  I- 580                        Ramp | [(-122.096,37.888),(-122.0962,37.891),(-122.0964,37.9)]


                                                                                                          | Berkeley 
>  I- 580                        Ramp | [(-122.101,37.898),(-122.1005,37.902),(-122.0989,37.911)]


                                                                                                          | Berkeley 
>  I- 580                        Ramp | [(-122.1086,37.003),(-122.1068,37.993),(-122.1066,37.992),(-122.1053,37.982)]


                                                                                                          | Berkeley 
>  I- 880                             |
[(-122.0375,37.632),(-122.0359,37.619),(-122.0358,37.616),(-122.034514,37.60409),(-122.031876,37.57965),(-122.031193,37.57332),(-122.03016,37.56375),(-122.02943,37.55698),(-122.028689,37.54929),(-122.027833,37.53908),(-122.025979,37.51698),(-122.0238,37.491)]

                                               | Berkeley 
>  I- 880                             |
[(-122.0612,37.003),(-122.0604,37.991),(-122.0596,37.982),(-122.0585,37.967),(-122.0583,37.961),(-122.0553,37.918),(-122.053635,37.89475),(-122.050759,37.8546),(-122.05,37.844),(-122.0485,37.817),(-122.0483,37.813),(-122.0482,37.811)]

                                                                        | Berkeley 
>  I- 880                             |
[(-122.1365,37.902),(-122.1358,37.898),(-122.1333,37.881),(-122.1323,37.874),(-122.1311,37.866),(-122.1308,37.865),(-122.1307,37.864),(-122.1289,37.851),(-122.1277,37.843),(-122.1264,37.834),(-122.1231,37.812),(-122.1165,37.766),(-122.1104,37.72),(-122.109695,37.71094),(-122.109,37.702),(-122.108312,37.69168),(-122.1076,37.681)]
                                                                                                 | Berkeley 
>  I- 880                             |
[(-122.1755,37.185),(-122.1747,37.178),(-122.1742,37.173),(-122.1692,37.126),(-122.167792,37.11594),(-122.16757,37.11435),(-122.1671,37.111),(-122.1655,37.1),(-122.165169,37.09811),(-122.1641,37.092),(-122.1596,37.061),(-122.158381,37.05275),(-122.155991,37.03657),(-122.1531,37.017),(-122.1478,37.98),(-122.1407,37.932),(-122.1394,37.924),(-122.1389,37.92),(-122.1376,37.91)]
                                                   | Berkeley 
>  I- 880                             |
[(-122.2214,37.711),(-122.2202,37.699),(-122.2199,37.695),(-122.219,37.682),(-122.2184,37.672),(-122.2173,37.652),(-122.2159,37.638),(-122.2144,37.616),(-122.2138,37.612),(-122.2135,37.609),(-122.212,37.592),(-122.2116,37.586),(-122.2111,37.581)]

                                                            | Berkeley 
>  I- 880                             |
[(-122.2707,37.975),(-122.2693,37.972),(-122.2681,37.966),(-122.267,37.962),(-122.2659,37.957),(-122.2648,37.952),(-122.2636,37.946),(-122.2625,37.935),(-122.2617,37.927),(-122.2607,37.921),(-122.2593,37.916),(-122.258,37.911),(-122.2536,37.898),(-122.2432,37.858),(-122.2408,37.845),(-122.2386,37.827),(-122.2374,37.811)]
                                                                                                         | Berkeley 
>  I- 880                        Ramp | [(-122.059,37.982),(-122.0577,37.984),(-122.0612,37.003)]


                                                                                                          | Berkeley 
>  I- 880                        Ramp | [(-122.0618,37.011),(-122.0631,37.982),(-122.0585,37.967)]


                                                                                                          | Berkeley 
>  I- 880                        Ramp | [(-122.1029,37.61),(-122.1013,37.587),(-122.0999,37.569)]


                                                                                                          | Berkeley 
>  I- 880                        Ramp | [(-122.1379,37.891),(-122.1383,37.897),(-122.1377,37.902)]


                                                                                                          | Berkeley 
>  I- 880                        Ramp |
[(-122.1379,37.931),(-122.137597,37.92736),(-122.1374,37.925),(-122.1373,37.924),(-122.1369,37.914),(-122.1358,37.905),(-122.1365,37.908),(-122.1358,37.898)]


                            | Berkeley 
>  I- 880                        Ramp | [(-122.2536,37.898),(-122.254,37.902)]


                                                                                                          | Berkeley 
>  I- 580                             |
[(-122.2197,37.99),(-122.22,37.99),(-122.222092,37.99523),(-122.2232,37.998),(-122.224146,37.99963),(-122.2261,37.003),(-122.2278,37.007),(-122.2302,37.026),(-122.2323,37.043),(-122.2344,37.059),(-122.235405,37.06427),(-122.2365,37.07)]

                                                                      | Lafayette 
>  I- 80                         Ramp | [(-122.2962,37.413),(-122.2959,37.382),(-122.2951,37.372)]


                                                                                                          | Lafayette 
>  I- 880                        Ramp | [(-122.2771,37.002),(-122.278,37)]


                                                                                                          | Lafayette 
>  State Hwy 84                       |
[(-121.9565,37.898),(-121.956589,37.89911),(-121.9569,37.903),(-121.956,37.91),(-121.9553,37.919)]


                                                                 | Oakland 
>  State Hwy 92                       |
[(-122.1085,37.326),(-122.1095,37.322),(-122.1111,37.316),(-122.1119,37.313),(-122.1125,37.311),(-122.1131,37.308),(-122.1167,37.292),(-122.1187,37.285),(-122.12,37.28)]


                | Oakland 
>  State Hwy 92                  Ramp | [(-122.1086,37.321),(-122.1089,37.315),(-122.1111,37.316)]


                                                                                                          | Oakland 
>  State Hwy 238                      |
((-122.098,37.908),(-122.0983,37.907),(-122.099,37.905),(-122.101,37.898),(-122.101535,37.89711),(-122.103173,37.89438),(-122.1046,37.892),(-122.106,37.89))


                             | Berkeley 
>  State Hwy 238                 Ramp | [(-122.1288,37.9),(-122.1293,37.895),(-122.1296,37.906)]


                                                                                                          | Berkeley 
>  State Hwy 123                      |
[(-122.3004,37.986),(-122.2998,37.969),(-122.2995,37.962),(-122.2992,37.952),(-122.299,37.942),(-122.2987,37.935),(-122.2984,37.924),(-122.2982,37.92),(-122.2976,37.904),(-122.297,37.88),(-122.2966,37.869),(-122.2959,37.848),(-122.2961,37.843)]

                                                              | Berkeley 
>  State Hwy 13                       |
[(-122.1797,37.943),(-122.179871,37.91849),(-122.18,37.9),(-122.179023,37.86615),(-122.1787,37.862),(-122.1781,37.851),(-122.1777,37.845),(-122.1773,37.839),(-122.177,37.833)]


          | Berkeley 
>  State Hwy 24                       |
[(-122.2674,37.246),(-122.2673,37.248),(-122.267,37.261),(-122.2668,37.271),(-122.2663,37.298),(-122.2659,37.315),(-122.2655,37.336),(-122.265007,37.35882),(-122.264443,37.37286),(-122.2641,37.381),(-122.2638,37.388),(-122.2631,37.396),(-122.2617,37.405),(-122.2615,37.407),(-122.2605,37.412)]

             | Lafayette 
>  State Hwy 13                       |
[(-122.2049,37.2),(-122.20328,37.17975),(-122.1989,37.125),(-122.198078,37.11641),(-122.1975,37.11)]


                                                                 | Lafayette 
>  State Hwy 13                  Ramp | [(-122.2244,37.427),(-122.223,37.414),(-122.2214,37.396),(-122.2213,37.388)]


                                                                                                          | Lafayette 
> (353 rows)
======   rules   ======
1166,1186c1166,1186
<
--------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
<  iexit              | SELECT ih.name, ih.thepath, interpt_pp(ih.thepath, r.thepath) AS exit FROM ihighway ih, ramp r
WHERE(ih.thepath ## r.thepath); 
<  pg_indexes         | SELECT c.relname AS tablename, i.relname AS indexname, pg_get_indexdef(x.indexrelid) AS
indexdefFROM pg_index x, pg_class c, pg_class i WHERE ((c.oid = x.indrelid) AND (i.oid = x.indexrelid)); 
<  pg_rules           | SELECT c.relname AS tablename, r.rulename, pg_get_ruledef(r.rulename) AS definition FROM
pg_rewriter, pg_class c WHERE ((r.rulename !~ '^_RET'::text) AND (c.oid = r.ev_class)); 
<  pg_tables          | SELECT c.relname AS tablename, pg_get_userbyid(c.relowner) AS tableowner, c.relhasindex AS
hasindexes,c.relhasrules AS hasrules, (c.reltriggers > 0) AS hastriggers FROM pg_class c WHERE (((c.relkind =
'r'::"char")OR (c.relkind = 's'::"char")) AND (NOT (EXISTS (SELECT pg_rewrite.rulename FROM pg_rewrite WHERE
((pg_rewrite.ev_class= c.oid) AND (pg_rewrite.ev_type = '1'::"char")))))); 
<  pg_user            | SELECT pg_shadow.usename, pg_shadow.usesysid, pg_shadow.usecreatedb, pg_shadow.usetrace,
pg_shadow.usesuper,pg_shadow.usecatupd, '********'::text AS passwd, pg_shadow.valuntil FROM pg_shadow; 
<  pg_views           | SELECT c.relname AS viewname, pg_get_userbyid(c.relowner) AS viewowner,
pg_get_viewdef(c.relname)AS definition FROM pg_class c WHERE (c.relhasrules AND (EXISTS (SELECT r.rulename FROM
pg_rewriter WHERE ((r.ev_class = c.oid) AND (r.ev_type = '1'::"char"))))); 
<  rtest_v1           | SELECT rtest_t1.a, rtest_t1.b FROM rtest_t1;
<  rtest_vcomp        | SELECT x.part, (x.size * y.factor) AS size_in_cm FROM rtest_comp x, rtest_unitfact y WHERE
(x.unit= y.unit); 
<  rtest_vview1       | SELECT x.a, x.b FROM rtest_view1 x WHERE (0 < (SELECT count(*) AS count FROM rtest_view2 y
WHERE(y.a = x.a))); 
<  rtest_vview2       | SELECT rtest_view1.a, rtest_view1.b FROM rtest_view1 WHERE rtest_view1.v;
<  rtest_vview3       | SELECT x.a, x.b FROM rtest_vview2 x WHERE (0 < (SELECT count(*) AS count FROM rtest_view2 y
WHERE(y.a = x.a))); 
<  rtest_vview4       | SELECT x.a, x.b, count(y.a) AS refcount FROM rtest_view1 x, rtest_view2 y WHERE (x.a = y.a)
GROUPBY x.a, x.b; 
<  rtest_vview5       | SELECT rtest_view1.a, rtest_view1.b, rtest_viewfunc1(rtest_view1.a) AS refcount FROM
rtest_view1;
<  shoe               | SELECT sh.shoename, sh.sh_avail, sh.slcolor, sh.slminlen, (sh.slminlen * un.un_fact) AS
slminlen_cm,sh.slmaxlen, (sh.slmaxlen * un.un_fact) AS slmaxlen_cm, sh.slunit FROM shoe_data sh, unit un WHERE
(sh.slunit= un.un_name); 
<  shoe_ready         | SELECT rsh.shoename, rsh.sh_avail, rsl.sl_name, rsl.sl_avail, int4smaller(rsh.sh_avail,
rsl.sl_avail)AS total_avail FROM shoe rsh, shoelace rsl WHERE (((rsl.sl_color = rsh.slcolor) AND (rsl.sl_len_cm >=
rsh.slminlen_cm))AND (rsl.sl_len_cm <= rsh.slmaxlen_cm)); 
<  shoelace           | SELECT s.sl_name, s.sl_avail, s.sl_color, s.sl_len, s.sl_unit, (s.sl_len * u.un_fact) AS
sl_len_cmFROM shoelace_data s, unit u WHERE (s.sl_unit = u.un_name); 
<  shoelace_candelete | SELECT shoelace_obsolete.sl_name, shoelace_obsolete.sl_avail, shoelace_obsolete.sl_color,
shoelace_obsolete.sl_len,shoelace_obsolete.sl_unit, shoelace_obsolete.sl_len_cm FROM shoelace_obsolete WHERE
(shoelace_obsolete.sl_avail= 0); 
<  shoelace_obsolete  | SELECT shoelace.sl_name, shoelace.sl_avail, shoelace.sl_color, shoelace.sl_len,
shoelace.sl_unit,shoelace.sl_len_cm FROM shoelace WHERE (NOT (EXISTS (SELECT shoe.shoename FROM shoe WHERE
(shoe.slcolor= shoelace.sl_color)))); 
<  street             | SELECT r.name, r.thepath, c.cname FROM road r, real_city c WHERE (c.outline ## r.thepath);
<  toyemp             | SELECT emp.name, emp.age, emp."location", (12 * emp.salary) AS annualsal FROM emp;
---
>
--------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>  iexit              | SELECT ih.name, ih.thepath, interpt_pp(ih.thepath, r.thepath) AS exit FROM ihighway* ih, ramp*
rWHERE (ih.thepath ## r.thepath); 
>  pg_indexes         | SELECT c.relname AS tablename, i.relname AS indexname, pg_get_indexdef(x.indexrelid) AS
indexdefFROM pg_index* x, pg_class* c, pg_class* i WHERE ((c.oid = x.indrelid) AND (i.oid = x.indexrelid)); 
>  pg_rules           | SELECT c.relname AS tablename, r.rulename, pg_get_ruledef(r.rulename) AS definition FROM
pg_rewrite*r, pg_class* c WHERE ((r.rulename !~ '^_RET'::text) AND (c.oid = r.ev_class)); 
>  pg_tables          | SELECT c.relname AS tablename, pg_get_userbyid(c.relowner) AS tableowner, c.relhasindex AS
hasindexes,c.relhasrules AS hasrules, (c.reltriggers > 0) AS hastriggers FROM pg_class* c WHERE (((c.relkind =
'r'::"char")OR (c.relkind = 's'::"char")) AND (NOT (EXISTS (SELECT pg_rewrite.rulename FROM pg_rewrite* WHERE
((pg_rewrite.ev_class= c.oid) AND (pg_rewrite.ev_type = '1'::"char")))))); 
>  pg_user            | SELECT pg_shadow.usename, pg_shadow.usesysid, pg_shadow.usecreatedb, pg_shadow.usetrace,
pg_shadow.usesuper,pg_shadow.usecatupd, '********'::text AS passwd, pg_shadow.valuntil FROM pg_shadow*; 
>  pg_views           | SELECT c.relname AS viewname, pg_get_userbyid(c.relowner) AS viewowner,
pg_get_viewdef(c.relname)AS definition FROM pg_class* c WHERE (c.relhasrules AND (EXISTS (SELECT r.rulename FROM
pg_rewrite*r WHERE ((r.ev_class = c.oid) AND (r.ev_type = '1'::"char"))))); 
>  rtest_v1           | SELECT rtest_t1.a, rtest_t1.b FROM rtest_t1*;
>  rtest_vcomp        | SELECT x.part, (x.size * y.factor) AS size_in_cm FROM rtest_comp* x, rtest_unitfact* y WHERE
(x.unit= y.unit); 
>  rtest_vview1       | SELECT x.a, x.b FROM rtest_view1* x WHERE (0 < (SELECT count(*) AS count FROM rtest_view2* y
WHERE(y.a = x.a))); 
>  rtest_vview2       | SELECT rtest_view1.a, rtest_view1.b FROM rtest_view1* WHERE rtest_view1.v;
>  rtest_vview3       | SELECT x.a, x.b FROM rtest_vview2* x WHERE (0 < (SELECT count(*) AS count FROM rtest_view2* y
WHERE(y.a = x.a))); 
>  rtest_vview4       | SELECT x.a, x.b, count(y.a) AS refcount FROM rtest_view1* x, rtest_view2* y WHERE (x.a = y.a)
GROUPBY x.a, x.b; 
>  rtest_vview5       | SELECT rtest_view1.a, rtest_view1.b, rtest_viewfunc1(rtest_view1.a) AS refcount FROM
rtest_view1*;
>  shoe               | SELECT sh.shoename, sh.sh_avail, sh.slcolor, sh.slminlen, (sh.slminlen * un.un_fact) AS
slminlen_cm,sh.slmaxlen, (sh.slmaxlen * un.un_fact) AS slmaxlen_cm, sh.slunit FROM shoe_data* sh, unit* un WHERE
(sh.slunit= un.un_name); 
>  shoe_ready         | SELECT rsh.shoename, rsh.sh_avail, rsl.sl_name, rsl.sl_avail, int4smaller(rsh.sh_avail,
rsl.sl_avail)AS total_avail FROM shoe* rsh, shoelace* rsl WHERE (((rsl.sl_color = rsh.slcolor) AND (rsl.sl_len_cm >=
rsh.slminlen_cm))AND (rsl.sl_len_cm <= rsh.slmaxlen_cm)); 
>  shoelace           | SELECT s.sl_name, s.sl_avail, s.sl_color, s.sl_len, s.sl_unit, (s.sl_len * u.un_fact) AS
sl_len_cmFROM shoelace_data* s, unit* u WHERE (s.sl_unit = u.un_name); 
>  shoelace_candelete | SELECT shoelace_obsolete.sl_name, shoelace_obsolete.sl_avail, shoelace_obsolete.sl_color,
shoelace_obsolete.sl_len,shoelace_obsolete.sl_unit, shoelace_obsolete.sl_len_cm FROM shoelace_obsolete* WHERE
(shoelace_obsolete.sl_avail= 0); 
>  shoelace_obsolete  | SELECT shoelace.sl_name, shoelace.sl_avail, shoelace.sl_color, shoelace.sl_len,
shoelace.sl_unit,shoelace.sl_len_cm FROM shoelace* WHERE (NOT (EXISTS (SELECT shoe.shoename FROM shoe* WHERE
(shoe.slcolor= shoelace.sl_color)))); 
>  street             | SELECT r.name, r.thepath, c.cname FROM road* r, real_city* c WHERE (c.outline ## r.thepath);
>  toyemp             | SELECT emp.name, emp.age, emp."location", (12 * emp.salary) AS annualsal FROM emp*;
1192c1192
<
---------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
---
>
---------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1204,1207c1204,1207
<  rtest_person  | rtest_pers_del  | CREATE RULE rtest_pers_del AS ON DELETE TO rtest_person DO DELETE FROM rtest_admin
WHERE(rtest_admin.pname = old.pname); 
<  rtest_person  | rtest_pers_upd  | CREATE RULE rtest_pers_upd AS ON UPDATE TO rtest_person DO UPDATE rtest_admin SET
pname= new.pname WHERE (rtest_admin.pname = old.pname); 
<  rtest_system  | rtest_sys_del   | CREATE RULE rtest_sys_del AS ON DELETE TO rtest_system DO (DELETE FROM
rtest_interfaceWHERE (rtest_interface.sysname = old.sysname); DELETE FROM rtest_admin WHERE (rtest_admin.sysname =
old.sysname);); 
<  rtest_system  | rtest_sys_upd   | CREATE RULE rtest_sys_upd AS ON UPDATE TO rtest_system DO (UPDATE rtest_interface
SETsysname = new.sysname WHERE (rtest_interface.sysname = old.sysname); UPDATE rtest_admin SET sysname = new.sysname
WHERE(rtest_admin.sysname = old.sysname); ); 
---
>  rtest_person  | rtest_pers_del  | CREATE RULE rtest_pers_del AS ON DELETE TO rtest_person DO DELETE FROM
rtest_admin*WHERE (rtest_admin.pname = old.pname); 
>  rtest_person  | rtest_pers_upd  | CREATE RULE rtest_pers_upd AS ON UPDATE TO rtest_person DO UPDATE rtest_admin* SET
pname= new.pname WHERE (rtest_admin.pname = old.pname); 
>  rtest_system  | rtest_sys_del   | CREATE RULE rtest_sys_del AS ON DELETE TO rtest_system DO (DELETE FROM
rtest_interface*WHERE (rtest_interface.sysname = old.sysname); DELETE FROM rtest_admin* WHERE (rtest_admin.sysname =
old.sysname);); 
>  rtest_system  | rtest_sys_upd   | CREATE RULE rtest_sys_upd AS ON UPDATE TO rtest_system DO (UPDATE rtest_interface*
SETsysname = new.sysname WHERE (rtest_interface.sysname = old.sysname); UPDATE rtest_admin* SET sysname = new.sysname
WHERE(rtest_admin.sysname = old.sysname); ); 
1212c1212
<  rtest_v1      | rtest_v1_del    | CREATE RULE rtest_v1_del AS ON DELETE TO rtest_v1 DO INSTEAD DELETE FROM rtest_t1
WHERE(rtest_t1.a = old.a); 
---
>  rtest_v1      | rtest_v1_del    | CREATE RULE rtest_v1_del AS ON DELETE TO rtest_v1 DO INSTEAD DELETE FROM rtest_t1*
WHERE(rtest_t1.a = old.a); 
1214,1215c1214,1215
<  rtest_v1      | rtest_v1_upd    | CREATE RULE rtest_v1_upd AS ON UPDATE TO rtest_v1 DO INSTEAD UPDATE rtest_t1 SET a
=new.a, b = new.b WHERE (rtest_t1.a = old.a); 
<  shoelace      | shoelace_del    | CREATE RULE shoelace_del AS ON DELETE TO shoelace DO INSTEAD DELETE FROM
shoelace_dataWHERE (shoelace_data.sl_name = old.sl_name); 
---
>  rtest_v1      | rtest_v1_upd    | CREATE RULE rtest_v1_upd AS ON UPDATE TO rtest_v1 DO INSTEAD UPDATE rtest_t1* SET
a= new.a, b = new.b WHERE (rtest_t1.a = old.a); 
>  shoelace      | shoelace_del    | CREATE RULE shoelace_del AS ON DELETE TO shoelace DO INSTEAD DELETE FROM
shoelace_data*WHERE (shoelace_data.sl_name = old.sl_name); 
1217c1217
<  shoelace      | shoelace_upd    | CREATE RULE shoelace_upd AS ON UPDATE TO shoelace DO INSTEAD UPDATE shoelace_data
SETsl_name = new.sl_name, sl_avail = new.sl_avail, sl_color = new.sl_color, sl_len = new.sl_len, sl_unit = new.sl_unit
WHERE(shoelace_data.sl_name = old.sl_name); 
---
>  shoelace      | shoelace_upd    | CREATE RULE shoelace_upd AS ON UPDATE TO shoelace DO INSTEAD UPDATE shoelace_data*
SETsl_name = new.sl_name, sl_avail = new.sl_avail, sl_color = new.sl_color, sl_len = new.sl_len, sl_unit = new.sl_unit
WHERE(shoelace_data.sl_name = old.sl_name); 
1219c1219
<  shoelace_ok   | shoelace_ok_ins | CREATE RULE shoelace_ok_ins AS ON INSERT TO shoelace_ok DO INSTEAD UPDATE shoelace
SETsl_avail = (shoelace.sl_avail + new.ok_quant) WHERE (shoelace.sl_name = new.ok_name); 
---
>  shoelace_ok   | shoelace_ok_ins | CREATE RULE shoelace_ok_ins AS ON INSERT TO shoelace_ok DO INSTEAD UPDATE
shoelace*SET sl_avail = (shoelace.sl_avail + new.ok_quant) WHERE (shoelace.sl_name = new.ok_name); 

Re: Re: [CORE] Re: MY PATCH

From
Chris Bitmead
Date:
>         UPDATE a SET aa='zzzz' WHERE aa='aaaa';
>         pqReadData() -- backend closed the channel unexpectedly.
>                 This probably means the backend terminated abnormally
>                 before or while processing the request.
>         connection to server was lost
>
> Should I send you a backtrace?

I guess so. I'm definitely not seeing it.

Re: Re: [CORE] Re: MY PATCH

From
Bruce Momjian
Date:
>
> >         UPDATE a SET aa='zzzz' WHERE aa='aaaa';
> >         pqReadData() -- backend closed the channel unexpectedly.
> >                 This probably means the backend terminated abnormally
> >                 before or while processing the request.
> >         connection to server was lost
> >
> > Should I send you a backtrace?
>
> I guess so. I'm definitely not seeing it.
>

Sure:

#0  0x281e9d65 in kill ()
#1  0x28235a5d in abort ()
#2  0x81492d8 in ExcAbort (excP=0x819f8fc, detail=0, data=0x0,
    message=0x8195bd6 "!((relation)->rd_refcnt > 0)") at excabort.c:27
#3  0x8149227 in ExcUnCaught (excP=0x819f8fc, detail=0, data=0x0,
    message=0x8195bd6 "!((relation)->rd_refcnt > 0)") at exc.c:170
#4  0x814927f in ExcRaise (excP=0x819f8fc, detail=0, data=0x0,
    message=0x8195bd6 "!((relation)->rd_refcnt > 0)") at exc.c:187
#5  0x81487bf in ExceptionalCondition (
    conditionName=0x8195bd6 "!((relation)->rd_refcnt > 0)",
    exceptionP=0x819f8fc, detail=0x0, fileName=0x8195a21 "relcache.c",
    lineNumber=1337) at assert.c:73
#6  0x81457e2 in RelationClose (relation=0x8243268) at relcache.c:1337
#7  0x8072803 in heap_close (relation=0x8243268, lockmode=0) at heapam.c:620
#8  0x80ae9e2 in EndPlan (plan=0x824bf90, estate=0x824cc18) at execMain.c:958
#9  0x80ae2b0 in ExecutorEnd (queryDesc=0x824cc00, estate=0x824cc18)
    at execMain.c:358
#10 0x810db6c in ProcessQueryDesc (queryDesc=0x824cc00, limoffset=0x0,
    limcount=0x0) at pquery.c:336
#11 0x810dbce in ProcessQuery (parsetree=0x8234288, plan=0x824bf90,
    dest=Remote) at pquery.c:369
#12 0x810c5df in pg_exec_query_dest (
    query_string=0x81cd368 "UPDATE a SET aa='zzzz' WHERE aa='aaaa';",
    dest=Remote, aclOverride=0) at postgres.c:642
#13 0x810c4c4 in pg_exec_query (
    query_string=0x81cd368 "UPDATE a SET aa='zzzz' WHERE aa='aaaa';")
    at postgres.c:539
#14 0x810d56d in PostgresMain (argc=6, argv=0x804725c, real_argc=5,
    real_argv=0x8047998) at postgres.c:1528
#15 0x80f20cc in DoBackend (port=0x81d7000) at postmaster.c:1951
#16 0x80f1c52 in BackendStartup (port=0x81d7000) at postmaster.c:1738
#17 0x80f0e86 in ServerLoop () at postmaster.c:983
#18 0x80f090c in PostmasterMain (argc=5, argv=0x8047998) at postmaster.c:676
#19 0x80c0ae7 in main (argc=5, argv=0x8047998) at main.c:93
#20 0x806373c in __start ()

I can let you login in and poke around.
--
  Bruce Momjian                        |  http://www.op.net/~candle
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

Re: Re: [CORE] Re: MY PATCH

From
Bruce Momjian
Date:
My guess is that you are closing something you are not opening.  I know,
run configure with --enable-cassert, and you will see the crash too.


> >
> > >         UPDATE a SET aa='zzzz' WHERE aa='aaaa';
> > >         pqReadData() -- backend closed the channel unexpectedly.
> > >                 This probably means the backend terminated abnormally
> > >                 before or while processing the request.
> > >         connection to server was lost
> > >
> > > Should I send you a backtrace?
> >
> > I guess so. I'm definitely not seeing it.
> >
>
> Sure:
>
> #0  0x281e9d65 in kill ()
> #1  0x28235a5d in abort ()
> #2  0x81492d8 in ExcAbort (excP=0x819f8fc, detail=0, data=0x0,
>     message=0x8195bd6 "!((relation)->rd_refcnt > 0)") at excabort.c:27
> #3  0x8149227 in ExcUnCaught (excP=0x819f8fc, detail=0, data=0x0,
>     message=0x8195bd6 "!((relation)->rd_refcnt > 0)") at exc.c:170
> #4  0x814927f in ExcRaise (excP=0x819f8fc, detail=0, data=0x0,
>     message=0x8195bd6 "!((relation)->rd_refcnt > 0)") at exc.c:187
> #5  0x81487bf in ExceptionalCondition (
>     conditionName=0x8195bd6 "!((relation)->rd_refcnt > 0)",
>     exceptionP=0x819f8fc, detail=0x0, fileName=0x8195a21 "relcache.c",
>     lineNumber=1337) at assert.c:73
> #6  0x81457e2 in RelationClose (relation=0x8243268) at relcache.c:1337
> #7  0x8072803 in heap_close (relation=0x8243268, lockmode=0) at heapam.c:620
> #8  0x80ae9e2 in EndPlan (plan=0x824bf90, estate=0x824cc18) at execMain.c:958
> #9  0x80ae2b0 in ExecutorEnd (queryDesc=0x824cc00, estate=0x824cc18)
>     at execMain.c:358
> #10 0x810db6c in ProcessQueryDesc (queryDesc=0x824cc00, limoffset=0x0,
>     limcount=0x0) at pquery.c:336
> #11 0x810dbce in ProcessQuery (parsetree=0x8234288, plan=0x824bf90,
>     dest=Remote) at pquery.c:369
> #12 0x810c5df in pg_exec_query_dest (
>     query_string=0x81cd368 "UPDATE a SET aa='zzzz' WHERE aa='aaaa';",
>     dest=Remote, aclOverride=0) at postgres.c:642
> #13 0x810c4c4 in pg_exec_query (
>     query_string=0x81cd368 "UPDATE a SET aa='zzzz' WHERE aa='aaaa';")
>     at postgres.c:539
> #14 0x810d56d in PostgresMain (argc=6, argv=0x804725c, real_argc=5,
>     real_argv=0x8047998) at postgres.c:1528
> #15 0x80f20cc in DoBackend (port=0x81d7000) at postmaster.c:1951
> #16 0x80f1c52 in BackendStartup (port=0x81d7000) at postmaster.c:1738
> #17 0x80f0e86 in ServerLoop () at postmaster.c:983
> #18 0x80f090c in PostmasterMain (argc=5, argv=0x8047998) at postmaster.c:676
> #19 0x80c0ae7 in main (argc=5, argv=0x8047998) at main.c:93
> #20 0x806373c in __start ()
>
> I can let you login in and poke around.
> --
>   Bruce Momjian                        |  http://www.op.net/~candle
>   pgman@candle.pha.pa.us               |  (610) 853-3000
>   +  If your life is a hard drive,     |  830 Blythe Avenue
>   +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
>


--
  Bruce Momjian                        |  http://www.op.net/~candle
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

Re: Re: [CORE] Re: MY PATCH

From
Chris Bitmead
Date:
Bruce Momjian wrote:

> My guess is that you are closing something you are not opening.  I know,
> run configure with --enable-cassert, and you will see the crash too.

The only place I'm doing that is inside setRelhassubclassInRelation in
commands/creatinh.c. Is the heap_close in there appropriate?


>
> > >
> > > >         UPDATE a SET aa='zzzz' WHERE aa='aaaa';
> > > >         pqReadData() -- backend closed the channel unexpectedly.
> > > >                 This probably means the backend terminated abnormally
> > > >                 before or while processing the request.
> > > >         connection to server was lost
> > > >
> > > > Should I send you a backtrace?
> > >
> > > I guess so. I'm definitely not seeing it.
> > >
> >
> > Sure:
> >
> > #0  0x281e9d65 in kill ()
> > #1  0x28235a5d in abort ()
> > #2  0x81492d8 in ExcAbort (excP=0x819f8fc, detail=0, data=0x0,
> >     message=0x8195bd6 "!((relation)->rd_refcnt > 0)") at excabort.c:27
> > #3  0x8149227 in ExcUnCaught (excP=0x819f8fc, detail=0, data=0x0,
> >     message=0x8195bd6 "!((relation)->rd_refcnt > 0)") at exc.c:170
> > #4  0x814927f in ExcRaise (excP=0x819f8fc, detail=0, data=0x0,
> >     message=0x8195bd6 "!((relation)->rd_refcnt > 0)") at exc.c:187
> > #5  0x81487bf in ExceptionalCondition (
> >     conditionName=0x8195bd6 "!((relation)->rd_refcnt > 0)",
> >     exceptionP=0x819f8fc, detail=0x0, fileName=0x8195a21 "relcache.c",
> >     lineNumber=1337) at assert.c:73
> > #6  0x81457e2 in RelationClose (relation=0x8243268) at relcache.c:1337
> > #7  0x8072803 in heap_close (relation=0x8243268, lockmode=0) at heapam.c:620
> > #8  0x80ae9e2 in EndPlan (plan=0x824bf90, estate=0x824cc18) at execMain.c:958
> > #9  0x80ae2b0 in ExecutorEnd (queryDesc=0x824cc00, estate=0x824cc18)
> >     at execMain.c:358
> > #10 0x810db6c in ProcessQueryDesc (queryDesc=0x824cc00, limoffset=0x0,
> >     limcount=0x0) at pquery.c:336
> > #11 0x810dbce in ProcessQuery (parsetree=0x8234288, plan=0x824bf90,
> >     dest=Remote) at pquery.c:369
> > #12 0x810c5df in pg_exec_query_dest (
> >     query_string=0x81cd368 "UPDATE a SET aa='zzzz' WHERE aa='aaaa';",
> >     dest=Remote, aclOverride=0) at postgres.c:642
> > #13 0x810c4c4 in pg_exec_query (
> >     query_string=0x81cd368 "UPDATE a SET aa='zzzz' WHERE aa='aaaa';")
> >     at postgres.c:539
> > #14 0x810d56d in PostgresMain (argc=6, argv=0x804725c, real_argc=5,
> >     real_argv=0x8047998) at postgres.c:1528
> > #15 0x80f20cc in DoBackend (port=0x81d7000) at postmaster.c:1951
> > #16 0x80f1c52 in BackendStartup (port=0x81d7000) at postmaster.c:1738
> > #17 0x80f0e86 in ServerLoop () at postmaster.c:983
> > #18 0x80f090c in PostmasterMain (argc=5, argv=0x8047998) at postmaster.c:676
> > #19 0x80c0ae7 in main (argc=5, argv=0x8047998) at main.c:93
> > #20 0x806373c in __start ()
> >
> > I can let you login in and poke around.
> > --
> >   Bruce Momjian                        |  http://www.op.net/~candle
> >   pgman@candle.pha.pa.us               |  (610) 853-3000
> >   +  If your life is a hard drive,     |  830 Blythe Avenue
> >   +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
> >
>
> --
>   Bruce Momjian                        |  http://www.op.net/~candle
>   pgman@candle.pha.pa.us               |  (610) 853-3000
>   +  If your life is a hard drive,     |  830 Blythe Avenue
>   +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

--
Chris Bitmead
mailto:chris@bitmead.com
http://www.techphoto.org - Photography News, Stuff that Matters

Re: Re: [CORE] Re: MY PATCH

From
Bruce Momjian
Date:
> Bruce Momjian wrote:
>
> > My guess is that you are closing something you are not opening.  I know,
> > run configure with --enable-cassert, and you will see the crash too.
>
> The only place I'm doing that is inside setRelhassubclassInRelation in
> commands/creatinh.c. Is the heap_close in there appropriate?

Looks fine.  It seems the executor code is closing a relation it never
opened.

From my backtrace, I see it as relation d.  My guess is that your
inheritance scanning is opening/closing the wrong relations sometimes.

(gdb) frame 7
#7  0x8072803 in heap_close (relation=0x8246270, lockmode=0) at heapam.c:620
620             RelationClose(relation);
(gdb) print relation[0]
$1 = {rd_fd = 33, rd_nblocks = 1, rd_refcnt = 0, rd_myxactonly = 0 '\000',
  rd_isnailed = 0 '\000', rd_isnoname = 0 '\000', rd_unlinked = 0 '\000',
  rd_am = 0x0, rd_rel = 0x8246f50, rd_id = 390177, rd_lockInfo = {lockRelId = {
      relId = 390177, dbId = 269920}}, rd_att = 0x8246fd8, rd_rules = 0x0,
  rd_istrat = 0x0, rd_support = 0x0, trigdesc = 0x0}
(gdb) print relation[0].rd_rel
$2 = (FormData_pg_class *) 0x8246f50
(gdb) print relation[0].rd_rel[0]
$3 = {relname = {data = "d", '\000' <repeats 30 times>, alignmentDummy = 100},
  reltype = 0, relowner = 139, relam = 0, relpages = 1, reltuples = 6,
  rellongrelid = 0, relhasindex = 0 '\000', relisshared = 0 '\000',
  relkind = 114 'r', relnatts = 4, relchecks = 0, reltriggers = 0,
  relukeys = 0, relfkeys = 0, relrefs = 0, relhaspkey = 0 '\000',
  relhasrules = 0 '\000', relhassubclass = 0 '\000', relacl = {0}}


>
>
> >
> > > >
> > > > >         UPDATE a SET aa='zzzz' WHERE aa='aaaa';
> > > > >         pqReadData() -- backend closed the channel unexpectedly.
> > > > >                 This probably means the backend terminated abnormally
> > > > >                 before or while processing the request.
> > > > >         connection to server was lost
> > > > >
> > > > > Should I send you a backtrace?
> > > >
> > > > I guess so. I'm definitely not seeing it.
> > > >
> > >
> > > Sure:
> > >
> > > #0  0x281e9d65 in kill ()
> > > #1  0x28235a5d in abort ()
> > > #2  0x81492d8 in ExcAbort (excP=0x819f8fc, detail=0, data=0x0,
> > >     message=0x8195bd6 "!((relation)->rd_refcnt > 0)") at excabort.c:27
> > > #3  0x8149227 in ExcUnCaught (excP=0x819f8fc, detail=0, data=0x0,
> > >     message=0x8195bd6 "!((relation)->rd_refcnt > 0)") at exc.c:170
> > > #4  0x814927f in ExcRaise (excP=0x819f8fc, detail=0, data=0x0,
> > >     message=0x8195bd6 "!((relation)->rd_refcnt > 0)") at exc.c:187
> > > #5  0x81487bf in ExceptionalCondition (
> > >     conditionName=0x8195bd6 "!((relation)->rd_refcnt > 0)",
> > >     exceptionP=0x819f8fc, detail=0x0, fileName=0x8195a21 "relcache.c",
> > >     lineNumber=1337) at assert.c:73
> > > #6  0x81457e2 in RelationClose (relation=0x8243268) at relcache.c:1337
> > > #7  0x8072803 in heap_close (relation=0x8243268, lockmode=0) at heapam.c:620
> > > #8  0x80ae9e2 in EndPlan (plan=0x824bf90, estate=0x824cc18) at execMain.c:958
> > > #9  0x80ae2b0 in ExecutorEnd (queryDesc=0x824cc00, estate=0x824cc18)
> > >     at execMain.c:358
> > > #10 0x810db6c in ProcessQueryDesc (queryDesc=0x824cc00, limoffset=0x0,
> > >     limcount=0x0) at pquery.c:336
> > > #11 0x810dbce in ProcessQuery (parsetree=0x8234288, plan=0x824bf90,
> > >     dest=Remote) at pquery.c:369
> > > #12 0x810c5df in pg_exec_query_dest (
> > >     query_string=0x81cd368 "UPDATE a SET aa='zzzz' WHERE aa='aaaa';",
> > >     dest=Remote, aclOverride=0) at postgres.c:642
> > > #13 0x810c4c4 in pg_exec_query (
> > >     query_string=0x81cd368 "UPDATE a SET aa='zzzz' WHERE aa='aaaa';")
> > >     at postgres.c:539
> > > #14 0x810d56d in PostgresMain (argc=6, argv=0x804725c, real_argc=5,
> > >     real_argv=0x8047998) at postgres.c:1528
> > > #15 0x80f20cc in DoBackend (port=0x81d7000) at postmaster.c:1951
> > > #16 0x80f1c52 in BackendStartup (port=0x81d7000) at postmaster.c:1738
> > > #17 0x80f0e86 in ServerLoop () at postmaster.c:983
> > > #18 0x80f090c in PostmasterMain (argc=5, argv=0x8047998) at postmaster.c:676
> > > #19 0x80c0ae7 in main (argc=5, argv=0x8047998) at main.c:93
> > > #20 0x806373c in __start ()
> > >
> > > I can let you login in and poke around.
> > > --
> > >   Bruce Momjian                        |  http://www.op.net/~candle
> > >   pgman@candle.pha.pa.us               |  (610) 853-3000
> > >   +  If your life is a hard drive,     |  830 Blythe Avenue
> > >   +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
> > >
> >
> > --
> >   Bruce Momjian                        |  http://www.op.net/~candle
> >   pgman@candle.pha.pa.us               |  (610) 853-3000
> >   +  If your life is a hard drive,     |  830 Blythe Avenue
> >   +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
>
> --
> Chris Bitmead
> mailto:chris@bitmead.com
> http://www.techphoto.org - Photography News, Stuff that Matters
>


--
  Bruce Momjian                        |  http://www.op.net/~candle
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

Re: Re: [CORE] Re: MY PATCH

From
Chris Bitmead
Date:
I guess it's a real bug then. I wasn't aware of that cassert thing. You
may want to back it out until I have a fix.

Re: Re: [CORE] Re: MY PATCH

From
Bruce Momjian
Date:
We can leave it in for a day or two, unless someone objects.  Having it
in allows others to help you debug it.

>
> I guess it's a real bug then. I wasn't aware of that cassert thing. You
> may want to back it out until I have a fix.
>


--
  Bruce Momjian                        |  http://www.op.net/~candle
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

Re: Re: [CORE] Re: MY PATCH

From
Tom Lane
Date:
Bruce Momjian <pgman@candle.pha.pa.us> writes:
> #5  0x81487bf in ExceptionalCondition (
>     conditionName=0x8195bd6 "!((relation)->rd_refcnt > 0)",
>     exceptionP=0x819f8fc, detail=0x0, fileName=0x8195a21 "relcache.c",
>     lineNumber=1337) at assert.c:73
> #6  0x81457e2 in RelationClose (relation=0x8243268) at relcache.c:1337
> #7  0x8072803 in heap_close (relation=0x8243268, lockmode=0) at heapam.c:620
> #8  0x80ae9e2 in EndPlan (plan=0x824bf90, estate=0x824cc18) at execMain.c:958
> #9  0x80ae2b0 in ExecutorEnd (queryDesc=0x824cc00, estate=0x824cc18)
>     at execMain.c:358
> #10 0x810db6c in ProcessQueryDesc (queryDesc=0x824cc00, limoffset=0x0,
>     limcount=0x0) at pquery.c:336
> #11 0x810dbce in ProcessQuery (parsetree=0x8234288, plan=0x824bf90,
>     dest=Remote) at pquery.c:369
> #12 0x810c5df in pg_exec_query_dest (
>     query_string=0x81cd368 "UPDATE a SET aa='zzzz' WHERE aa='aaaa';",
>     dest=Remote, aclOverride=0) at postgres.c:642

I'll betcha this is the same situation that I guessed at in my crash
report: the executor is probably trying to shut down the same plan node
twice.

BTW, the reason I didn't see this particular crash is that I don't
*have* an 'inherit' regression test:

$ ls pgsql/src/test/regress/*inherit*
pgsql/src/test/regress/*inherit* not found

Did you forget to commit some files, Bruce?

Note to Chris: --enable-cassert is an absolute requirement for
testing backend changes, and personally I like to build with
-DCLOBBER_FREED_MEMORY as well.

            regards, tom lane

Re: Re: [CORE] Re: MY PATCH

From
Chris Bitmead
Date:
Tom Lane wrote:

> Note to Chris: --enable-cassert is an absolute requirement for
> testing backend changes, and personally I like to build with
> -DCLOBBER_FREED_MEMORY as well.

Is there a configure option for CLOBBER_FREED_MEMORY?

Re: Re: [CORE] Re: MY PATCH

From
Bruce Momjian
Date:
I think you can just manually define it in config.h or in the Makefile.


> Tom Lane wrote:
>
> > Note to Chris: --enable-cassert is an absolute requirement for
> > testing backend changes, and personally I like to build with
> > -DCLOBBER_FREED_MEMORY as well.
>
> Is there a configure option for CLOBBER_FREED_MEMORY?
>


--
  Bruce Momjian                        |  http://www.op.net/~candle
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

Re: Re: [CORE] Re: MY PATCH

From
Tom Lane
Date:
OK, I see at least one of the problems here.

UPDATE/DELETE with an Append plan have never worked --- not in recent
memory anyway --- because execMain's InitPlan() creates a result
RelationInfo that EndPlan() is expecting to close.  But if the top plan
node is an Append then nodeAppend.c scribbles on
estate->es_result_relation_info.  This leaves the originally created
RelationInfo unreachable ... which is bad enough, since that means a
leaked rel refcount, but there's worse to come.  nodeAppend.c creates
its own set of RelationInfo nodes for the relation(s) it will scan.
At query end, it's left estate->es_result_relation_info pointing at a
random one of these.  nodeAppend.c closes *and deletes* all its
RelationInfos.  Now estate->es_result_relation_info is pointing at a
closed-and-deleted RelationInfo that EndPlan() will then try to close
again.  Oops.

I believe the correct fix is
  (a) ExecInitAppend() must incorporate the RelationInfo already
      created by InitPlan() into its list of RelationInfos, rather
      than creating a second RelationInfo (= extra relcache refcount)
      for that relation.
  (b) ExecEndAppend() must reset estate->es_result_relation_info to
      NULL, so it won't be left pointing to a deleted RelationInfo.
  (c) EndPlan() must not examine estate->es_result_relation_info until
      after it has called the node-type-specific end routine; otherwise
      change (b) will not be able to prevent EndPlan() from doing the
      wrong thing.

On it now...

            regards, tom lane