Tom Lane wrote:
"Dean Rasheed" <[EMAIL PROTECTED]> writes:
CREATE TABLE foo(a int, b int);
CREATE VIEW foo_v AS SELECT * FROM foo;
CREATE RULE foo_r AS ON INSERT TO foo_v DO INSTEAD INSERT INTO foo
VALUES(NEW.a, NEW.b);
INSERT INTO foo_v VALUES ((SELECT 1), (SELECT 2)), ((SELECT 3), (SELECT 4));

ERROR:  unrecognized node type: 313

It looks like the parser's code path for multi-row VALUES is neglecting
to detect sublinks and set pstate->p_hasSubLinks.  I'm too tired to look
closer tonight; anyone want to poke into it?

I think the parser is OK, but the p_hasSubLinks is lost in the rewrite phase. In ResolveNew, we set p_hasSubLinks whenever a Var with a SubLink is found. In case of Values RTE, however, there's no Vars, but plain SubLink nodes. This patch seems to fix it:

--- src/backend/rewrite/rewriteManip.c
+++ src/backend/rewrite/rewriteManip.c
@@ -1112,6 +1112,12 @@ ResolveNew_mutator(Node *node, ResolveNew_context *context)
                context->sublevels_up--;
                return (Node *) newnode;
        }
+       else if (IsA(node, SubLink))
+       {
+               /* Report it if we are adding a sublink to query */
+               context->inserted_sublink = true;
+               /* fall through to copy the expr normally */
+       }
        return expression_tree_mutator(node, ResolveNew_mutator,
                                                                   (void *) 
context);
 }

--
  Heikki Linnakangas
  EnterpriseDB   http://www.enterprisedb.com

--
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

Reply via email to