On Tue, Sep 23, 2008 at 10:38 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
> "Dean Rasheed" <dean_rasheed@hotmail.com> 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?
>
> regards, tom lane
The below fixes it for me... Its probably in the wrong place, and
does not even try to do any detection... but here it is anyway
*** a/src/backend/parser/analyze.c
--- b/src/backend/parser/analyze.c
***************
*** 538,543 **** transformInsertStmt(ParseState *pstate, InsertStmt *stmt)
--- 538,545 ----
*/
List *valuesLists = selectStmt->valuesLists;
+ pstate->p_hasSubLinks = true;
+
Assert(list_length(valuesLists) == 1);
/* Do basic expression transformation (same as a ROW() expr) */