Hello,

pg_get_ruledef cannot read the following rule:

test=# select version();
                               version
---------------------------------------------------------------------
 PostgreSQL 7.2b3 on i686-pc-linux-gnu, compiled by GCC egcs-2.91.66
(1 row)


With the following tables:

test=# \d rd
          Table "rd"
 Column |   Type   | Modifiers
--------+----------+-----------
 a      | smallint |
 b      | smallint |
 c      | text     |

            Table "ri"
 Column |   Type   |  Modifiers
--------+----------+--------------
 d      | smallint |
 e      | text     |
 a      | smallint | default 1000
 b      | smallint | default 2000


I create the following rule:

CREATE RULE ins_rd
AS ON INSERT TO ri
WHERE NEW.a IS NOT NULL 
	AND NEW.b IS NOT NULL
DO
        INSERT INTO rd (a,b)
        select distinct new.a,new.b


The rule works well. But when i select pg_rules:

test=# select * from pg_rules;
ERROR:  Invalid attnum 3 for rangetable entry *SELECT*


Thanks in advance

Sergio.

Sun, 25 Nov 2001 19:24:16 -0300
Sergio Pili <sergiop@sinectis.com.ar>
Bug in pg_get_ruledef?
Sergio Pili <sergiop@sinectis.com.ar> writes:
> test=# select * from pg_rules;
> ERROR:  Invalid attnum 3 for rangetable entry *SELECT*

Problem confirmed here.  Will look at it.

			regards, tom lane

Sun, 25 Nov 2001 18:05:37 -0500
Tom Lane <tgl@sss.pgh.pa.us>
Re: Bug in pg_get_ruledef? 
Sergio Pili <sergiop@sinectis.com.ar> writes:
> pg_get_ruledef cannot read the following rule:

Fix committed --- many thanks for the report!

Attached is the patch against current sources, if you need it.

			regards, tom lane


*** src/backend/utils/adt/ruleutils.c.orig	Mon Nov 19 14:51:20 2001
--- src/backend/utils/adt/ruleutils.c	Sun Nov 25 19:18:32 2001
***************
*** 769,775 ****
--- 769,788 ----
  		appendStringInfo(buf, " WHERE ");
  
  		qual = stringToNode(ev_qual);
+ 
+ 		/*
+ 		 * We need to make a context for recognizing any Vars in the qual
+ 		 * (which can only be references to OLD and NEW).  Use the rtable
+ 		 * of the first query in the action list for this purpose.
+ 		 */
  		query = (Query *) lfirst(actions);
+ 
+ 		/*
+ 		 * If the action is INSERT...SELECT, OLD/NEW have been pushed
+ 		 * down into the SELECT, and that's what we need to look at.
+ 		 * (Ugly kluge ... try to fix this when we redesign querytrees.)
+ 		 */
+ 		query = getInsertSelectQuery(query, NULL);
  
  		context.buf = buf;
  		context.namespaces = makeList1(&dpns);

Sun, 25 Nov 2001 19:30:59 -0500
Tom Lane <tgl@sss.pgh.pa.us>
Re: Bug in pg_get_ruledef? 