On Tue, 2006-02-21 at 11:45 +1300, Mark Kirkwood wrote: > Simon Riggs wrote: > > A new parameter that allows the administrator to place sensible limits > > on the size of queries executed. > > > > This is useful for ad-hoc SQL access > > - when a very large table cannot realistically be sorted etc, so > > prevents general users from saying "SELECT * FROM TABLE ORDER BY 1" > > > > - for preventing poorly coded SQL with missing join conditions from > > causing impossibly huge cartesian joins which can tie up an important > > production system for the weekend etc.. > > > > Use EXPLAIN to find out what to set this to. > > > > Generally useful? > > Yes, sure does look useful to me!
e.g. statement_cost_limit = 10000000 This patch was discussed briefly on bizgres-general and is now being submitted for discussion on main -hackers list. Best Regards, Simon Riggs
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 */
---------------------------(end of broadcast)--------------------------- TIP 6: explain analyze is your friend