1010 *
1111 *
1212 * IDENTIFICATION
13- * $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.298 2008/09/01 20:42:45 tgl Exp $
13+ * $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.299 2008/10/10 13:48:05 tgl Exp $
1414 *
1515 *-------------------------------------------------------------------------
1616 */
@@ -147,7 +147,8 @@ check_xact_readonly(Node *parsetree)
147147
148148/*
149149 * Note: Commands that need to do more complicated checking are handled
150- * elsewhere.
150+ * elsewhere, in particular COPY and plannable statements do their
151+ * own checking.
151152 */
152153
153154switch (nodeTag (parsetree ))
@@ -2015,10 +2016,6 @@ GetCommandLogLevel(Node *parsetree)
20152016lev = LOGSTMT_ALL ;
20162017break ;
20172018
2018- case T_CreateDomainStmt :
2019- lev = LOGSTMT_DDL ;
2020- break ;
2021-
20222019case T_CreateSchemaStmt :
20232020lev = LOGSTMT_DDL ;
20242021break ;
@@ -2054,6 +2051,33 @@ GetCommandLogLevel(Node *parsetree)
20542051lev = LOGSTMT_ALL ;
20552052break ;
20562053
2054+ case T_PrepareStmt :
2055+ {
2056+ PrepareStmt * stmt = (PrepareStmt * )parsetree ;
2057+
2058+ /* Look through a PREPARE to the contained stmt */
2059+ lev = GetCommandLogLevel (stmt -> query );
2060+ }
2061+ break ;
2062+
2063+ case T_ExecuteStmt :
2064+ {
2065+ ExecuteStmt * stmt = (ExecuteStmt * )parsetree ;
2066+ PreparedStatement * ps ;
2067+
2068+ /* Look through an EXECUTE to the referenced stmt */
2069+ ps = FetchPreparedStatement (stmt -> name , false);
2070+ if (ps )
2071+ lev = GetCommandLogLevel (ps -> plansource -> raw_parse_tree );
2072+ else
2073+ lev = LOGSTMT_ALL ;
2074+ }
2075+ break ;
2076+
2077+ case T_DeallocateStmt :
2078+ lev = LOGSTMT_ALL ;
2079+ break ;
2080+
20572081case T_RenameStmt :
20582082lev = LOGSTMT_DDL ;
20592083break ;
@@ -2074,10 +2098,6 @@ GetCommandLogLevel(Node *parsetree)
20742098lev = LOGSTMT_DDL ;
20752099break ;
20762100
2077- case T_AlterFunctionStmt :
2078- lev = LOGSTMT_DDL ;
2079- break ;
2080-
20812101case T_GrantStmt :
20822102lev = LOGSTMT_DDL ;
20832103break ;
@@ -2106,6 +2126,10 @@ GetCommandLogLevel(Node *parsetree)
21062126lev = LOGSTMT_DDL ;
21072127break ;
21082128
2129+ case T_AlterFunctionStmt :
2130+ lev = LOGSTMT_DDL ;
2131+ break ;
2132+
21092133case T_IndexStmt :
21102134lev = LOGSTMT_DDL ;
21112135break ;
@@ -2186,6 +2210,10 @@ GetCommandLogLevel(Node *parsetree)
21862210lev = LOGSTMT_ALL ;
21872211break ;
21882212
2213+ case T_DiscardStmt :
2214+ lev = LOGSTMT_ALL ;
2215+ break ;
2216+
21892217case T_CreateTrigStmt :
21902218lev = LOGSTMT_DDL ;
21912219break ;
@@ -2202,6 +2230,10 @@ GetCommandLogLevel(Node *parsetree)
22022230lev = LOGSTMT_DDL ;
22032231break ;
22042232
2233+ case T_CreateDomainStmt :
2234+ lev = LOGSTMT_DDL ;
2235+ break ;
2236+
22052237case T_CreateRoleStmt :
22062238lev = LOGSTMT_DDL ;
22072239break ;
@@ -2282,33 +2314,6 @@ GetCommandLogLevel(Node *parsetree)
22822314lev = LOGSTMT_DDL ;
22832315break ;
22842316
2285- case T_PrepareStmt :
2286- {
2287- PrepareStmt * stmt = (PrepareStmt * )parsetree ;
2288-
2289- /* Look through a PREPARE to the contained stmt */
2290- lev = GetCommandLogLevel (stmt -> query );
2291- }
2292- break ;
2293-
2294- case T_ExecuteStmt :
2295- {
2296- ExecuteStmt * stmt = (ExecuteStmt * )parsetree ;
2297- PreparedStatement * ps ;
2298-
2299- /* Look through an EXECUTE to the referenced stmt */
2300- ps = FetchPreparedStatement (stmt -> name , false);
2301- if (ps )
2302- lev = GetCommandLogLevel (ps -> plansource -> raw_parse_tree );
2303- else
2304- lev = LOGSTMT_ALL ;
2305- }
2306- break ;
2307-
2308- case T_DeallocateStmt :
2309- lev = LOGSTMT_ALL ;
2310- break ;
2311-
23122317/* already-planned queries */
23132318case T_PlannedStmt :
23142319{