From 6392518c6943bfe9b1c0b378db4e2339dc56c634 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Wed, 2 Aug 2006 13:58:52 +0000
Subject: [PATCH] Add a HINT per suggestion from Michael Glaesemann.  Also,
 tweak OLD/NEW test to avoid expensive contain_vars_of_level() scan in the
 normal case where we're not inside a rule.

---
 src/backend/parser/analyze.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c
index 4f7001b6f1a..a9971604de9 100644
--- a/src/backend/parser/analyze.c
+++ b/src/backend/parser/analyze.c
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- *	$PostgreSQL: pgsql/src/backend/parser/analyze.c,v 1.341 2006/08/02 01:59:46 joe Exp $
+ *	$PostgreSQL: pgsql/src/backend/parser/analyze.c,v 1.342 2006/08/02 13:58:52 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -745,10 +745,12 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt,
 		 * construct to ensure that the values would be available while
 		 * evaluating the VALUES RTE.  This is a shame.  FIXME
 		 */
-		if (contain_vars_of_level((Node *) exprsLists, 0))
+		if (pstate->p_rtable != NIL &&
+			contain_vars_of_level((Node *) exprsLists, 0))
 			ereport(ERROR,
 					(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-					 errmsg("VALUES must not contain OLD or NEW references")));
+					 errmsg("VALUES must not contain OLD or NEW references"),
+					 errhint("Use SELECT ... UNION ALL ... instead.")));
 
 		/*
 		 * Generate the VALUES RTE
@@ -2264,10 +2266,12 @@ transformValuesClause(ParseState *pstate, SelectStmt *stmt)
 	 * construct to ensure that the values would be available while
 	 * evaluating the VALUES RTE.  This is a shame.  FIXME
 	 */
-	if (contain_vars_of_level((Node *) newExprsLists, 0))
+	if (list_length(pstate->p_rtable) != 1 &&
+		contain_vars_of_level((Node *) newExprsLists, 0))
 		ereport(ERROR,
 				(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-				 errmsg("VALUES must not contain OLD or NEW references")));
+				 errmsg("VALUES must not contain OLD or NEW references"),
+				 errhint("Use SELECT ... UNION ALL ... instead.")));
 
 	qry->rtable = pstate->p_rtable;
 	qry->jointree = makeFromExpr(pstate->p_joinlist, NULL);
-- 
GitLab