ports/90066: [PATCH] PostgreSQL-8.1 "unplanned sub-select" bug
Roman Neuhauser
neuhauser at sigpipe.cz
Wed Dec 7 12:50:10 UTC 2005
>Number: 90066
>Category: ports
>Synopsis: [PATCH] PostgreSQL-8.1 "unplanned sub-select" bug
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Wed Dec 07 12:50:08 GMT 2005
>Closed-Date:
>Last-Modified:
>Originator: Roman Neuhauser
>Release: FreeBSD 4.10-STABLE i386
>Organization:
>Environment:
System: FreeBSD isis.sigpipe.cz 4.10-STABLE FreeBSD 4.10-STABLE #3: Sat Aug 7 16:06:48 CEST 2004 roman at isis.wad.cz:/usr/obj/usr/src/sys/FREEPUPPY2_6 i386
>Description:
Hello,
PostgreSQL 8.1 has a new bug where an insert into a view with a subquery
in the table value constructor ("VALUES (...)") causes an abort with
"ERROR: cannot handle unplanned sub-select". [1]
The bug has been confirmed by Tom Lane[2], PostgreSQL head developer;
he also produced a patch, which is now committed in their cvs tree. [3]
[1] http://archives.postgresql.org/pgsql-sql/2005-11/msg00209.php
[2] http://archives.postgresql.org/pgsql-sql/2005-11/msg00226.php
[3] http://developer.postgresql.org/cvsweb.cgi/pgsql/src/backend/rewrite/rewriteHandler.c.diff?r1=1.158.2.1;r2=1.158.2.2
http://developer.postgresql.org/cvsweb.cgi/pgsql/src/backend/rewrite/rewriteManip.c.diff?r1=1.92.2.1;r2=1.92.2.2
>How-To-Repeat:
>Fix:
Index: databases/postgresql81-server/files/patch-src-backend-rewriteHandler.c
===================================================================
RCS file: databases/postgresql81-server/files/patch-src-backend-rewriteHandler.c
diff -N databases/postgresql81-server/files/patch-src-backend-rewriteHandler.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ databases/postgresql81-server/files/patch-src-backend-rewriteHandler.c 7 Dec 2005 12:45:40 -0000
@@ -0,0 +1,26 @@
+--- src/backend/rewrite/rewriteHandler.c 2005/11/22 18:23:16 1.158.2.1
++++ src/backend/rewrite/rewriteHandler.c 2005/11/23 17:21:22 1.158.2.2
+@@ -7,7 +7,7 @@
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+- * $PostgreSQL: pgsql/src/backend/rewrite/rewriteHandler.c,v 1.158 2005/10/15 02:49:24 momjian Exp $
++ * $PostgreSQL: pgsql/src/backend/rewrite/rewriteHandler.c,v 1.158.2.1 2005/11/22 18:23:16 momjian Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+@@ -374,6 +374,14 @@ rewriteRuleAction(Query *parsetree,
+
+ sub_action->jointree->fromlist =
+ list_concat(newjointree, sub_action->jointree->fromlist);
++
++ /*
++ * There could have been some SubLinks in newjointree, in which
++ * case we'd better mark the sub_action correctly.
++ */
++ if (parsetree->hasSubLinks && !sub_action->hasSubLinks)
++ sub_action->hasSubLinks =
++ checkExprHasSubLink((Node *) newjointree);
+ }
+ }
+
Index: databases/postgresql81-server/files/patch-src-backend-rewriteManip.c
===================================================================
RCS file: databases/postgresql81-server/files/patch-src-backend-rewriteManip.c
diff -N databases/postgresql81-server/files/patch-src-backend-rewriteManip.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ databases/postgresql81-server/files/patch-src-backend-rewriteManip.c 7 Dec 2005 12:45:40 -0000
@@ -0,0 +1,45 @@
+--- src/backend/rewrite/rewriteManip.c 2005/11/22 18:23:16 1.92.2.1
++++ src/backend/rewrite/rewriteManip.c 2005/11/23 17:21:22 1.92.2.2
+@@ -7,7 +7,7 @@
+ *
+ *
+ * IDENTIFICATION
+- * $PostgreSQL: pgsql/src/backend/rewrite/rewriteManip.c,v 1.92 2005/10/15 02:49:24 momjian Exp $
++ * $PostgreSQL: pgsql/src/backend/rewrite/rewriteManip.c,v 1.92.2.1 2005/11/22 18:23:16 momjian Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+@@ -930,6 +930,7 @@ ResolveNew(Node *node, int target_varno,
+ RangeTblEntry *target_rte,
+ List *targetlist, int event, int update_varno)
+ {
++ Node *result;
+ ResolveNew_context context;
+
+ context.target_varno = target_varno;
+@@ -944,8 +945,21 @@ ResolveNew(Node *node, int target_varno,
+ * Must be prepared to start with a Query or a bare expression tree; if
+ * it's a Query, we don't want to increment sublevels_up.
+ */
+- return query_or_expression_tree_mutator(node,
+- ResolveNew_mutator,
+- (void *) &context,
+- 0);
++ result = query_or_expression_tree_mutator(node,
++ ResolveNew_mutator,
++ (void *) &context,
++ 0);
++
++ if (context.inserted_sublink)
++ {
++ if (IsA(result, Query))
++ ((Query *) result)->hasSubLinks = true;
++ /*
++ * Note: if we're called on a non-Query node then it's the caller's
++ * responsibility to update hasSubLinks in the ancestor Query.
++ * This is pretty fragile and perhaps should be rethought ...
++ */
++ }
++
++ return result;
+ }
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list