Index: src/backend/tcop/postgres.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/tcop/postgres.c,v
retrieving revision 1.474
diff -c -r1.474 postgres.c
*** src/backend/tcop/postgres.c	31 Dec 2005 16:50:44 -0000	1.474
--- src/backend/tcop/postgres.c	8 Jan 2006 21:45:16 -0000
***************
*** 84,89 ****
--- 84,90 ----
  /* GUC variable for maximum stack depth (measured in kilobytes) */
  int			max_stack_depth = 2048;
  
+ int         StatementCostLimit = 0;
  
  /* ----------------
   *		private variables
***************
*** 724,729 ****
--- 725,741 ----
  	/* call the optimizer */
  	plan = planner(querytree, false, 0, boundParams);
  
+     if (StatementCostLimit > 0 &&
+         plan->total_cost > StatementCostLimit)
+ 		ereport(ERROR,
+ 				(errcode(ERRCODE_STATEMENT_TOO_COMPLEX),
+ 				 errmsg("statement cost limit exceeded"),
+ 				 errhint("The plan for your query shows that it would likely "
+                          "have an excessive run time. This may be due to a "
+                          "logic error in the SQL, or it maybe just a very "
+                          "costly query. Rewrite your query or increase the "
+                          "configuration parameter \"statement_cost_limit\".")));
+ 
  	if (log_planner_stats)
  		ShowUsage("PLANNER STATISTICS");
  
Index: src/backend/utils/misc/guc.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/misc/guc.c,v
retrieving revision 1.305
diff -c -r1.305 guc.c
*** src/backend/utils/misc/guc.c	30 Dec 2005 00:13:50 -0000	1.305
--- src/backend/utils/misc/guc.c	8 Jan 2006 21:45:21 -0000
***************
*** 1270,1275 ****
--- 1270,1284 ----
  	},
  
  	{
+ 		{"statement_cost_limit", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ 			gettext_noop("Sets the maximum allowed plan cost for any query."),
+ 			gettext_noop("A value of 0 turns off the the cost limit.")
+ 		},
+ 		&StatementCostLimit,
+ 		0, 0, INT_MAX, NULL, NULL
+ 	},
+ 
+ 	{
  		{"max_fsm_relations", PGC_POSTMASTER, RESOURCES_FSM,
  			gettext_noop("Sets the maximum number of tables and indexes for which free space is tracked."),
  			NULL
Index: src/include/tcop/tcopprot.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/tcop/tcopprot.h,v
retrieving revision 1.78
diff -c -r1.78 tcopprot.h
*** src/include/tcop/tcopprot.h	15 Oct 2005 02:49:46 -0000	1.78
--- src/include/tcop/tcopprot.h	8 Jan 2006 21:45:22 -0000
***************
*** 28,33 ****
--- 28,34 ----
  extern CommandDest whereToSendOutput;
  extern DLLIMPORT const char *debug_query_string;
  extern int	max_stack_depth;
+ extern int StatementCostLimit;
  
  /* GUC-configurable parameters */
  
