Skip to content

Commit f8db76e

Browse files
committed
Editorialize a bit on new ProcessUtility() API.
Choose a saner ordering of parameters (adding a new input param after the output params seemed a bit random), update the function's header comment to match reality (cmon folks, is this really that hard?), get rid of useless and sloppily-defined distinction between PROCESS_UTILITY_SUBCOMMAND and PROCESS_UTILITY_GENERATED.
1 parent 5525e6c commit f8db76e

File tree

10 files changed

+80
-68
lines changed

10 files changed

+80
-68
lines changed

contrib/pg_stat_statements/pg_stat_statements.c

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -239,10 +239,9 @@ static void pgss_ExecutorRun(QueryDesc *queryDesc,
239239
long count);
240240
static void pgss_ExecutorFinish(QueryDesc *queryDesc);
241241
static void pgss_ExecutorEnd(QueryDesc *queryDesc);
242-
static void pgss_ProcessUtility(Node *parsetree,
243-
const char *queryString, ParamListInfo params,
244-
DestReceiver *dest, char *completionTag,
245-
ProcessUtilityContext context);
242+
static void pgss_ProcessUtility(Node *parsetree, const char *queryString,
243+
ProcessUtilityContext context, ParamListInfo params,
244+
DestReceiver *dest, char *completionTag);
246245
static uint32 pgss_hash_fn(const void *key, Size keysize);
247246
static int pgss_match_fn(const void *key1, const void *key2, Size keysize);
248247
static uint32 pgss_hash_string(const char *str);
@@ -786,8 +785,8 @@ pgss_ExecutorEnd(QueryDesc *queryDesc)
786785
*/
787786
static void
788787
pgss_ProcessUtility(Node *parsetree, const char *queryString,
789-
ParamListInfo params, DestReceiver *dest,
790-
char *completionTag, ProcessUtilityContext context)
788+
ProcessUtilityContext context, ParamListInfo params,
789+
DestReceiver *dest, char *completionTag)
791790
{
792791
/*
793792
* If it's an EXECUTE statement, we don't track it and don't increment the
@@ -819,11 +818,13 @@ pgss_ProcessUtility(Node *parsetree, const char *queryString,
819818
PG_TRY();
820819
{
821820
if (prev_ProcessUtility)
822-
prev_ProcessUtility(parsetree, queryString, params,
823-
dest, completionTag, context);
821+
prev_ProcessUtility(parsetree, queryString,
822+
context, params,
823+
dest, completionTag);
824824
else
825-
standard_ProcessUtility(parsetree, queryString, params,
826-
dest, completionTag, context);
825+
standard_ProcessUtility(parsetree, queryString,
826+
context, params,
827+
dest, completionTag);
827828
nested_level--;
828829
}
829830
PG_CATCH();
@@ -880,11 +881,13 @@ pgss_ProcessUtility(Node *parsetree, const char *queryString,
880881
else
881882
{
882883
if (prev_ProcessUtility)
883-
prev_ProcessUtility(parsetree, queryString, params,
884-
dest, completionTag, context);
884+
prev_ProcessUtility(parsetree, queryString,
885+
context, params,
886+
dest, completionTag);
885887
else
886-
standard_ProcessUtility(parsetree, queryString, params,
887-
dest, completionTag, context);
888+
standard_ProcessUtility(parsetree, queryString,
889+
context, params,
890+
dest, completionTag);
888891
}
889892
}
890893

contrib/sepgsql/hooks.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -299,10 +299,10 @@ sepgsql_exec_check_perms(List *rangeTabls, bool abort)
299299
static void
300300
sepgsql_utility_command(Node *parsetree,
301301
const char *queryString,
302+
ProcessUtilityContext context,
302303
ParamListInfo params,
303304
DestReceiver *dest,
304-
char *completionTag,
305-
ProcessUtilityContext context)
305+
char *completionTag)
306306
{
307307
sepgsql_context_info_t saved_context_info = sepgsql_context_info;
308308
ListCell *cell;
@@ -362,11 +362,13 @@ sepgsql_utility_command(Node *parsetree,
362362
}
363363

364364
if (next_ProcessUtility_hook)
365-
(*next_ProcessUtility_hook) (parsetree, queryString, params,
366-
dest, completionTag, context);
365+
(*next_ProcessUtility_hook) (parsetree, queryString,
366+
context, params,
367+
dest, completionTag);
367368
else
368-
standard_ProcessUtility(parsetree, queryString, params,
369-
dest, completionTag, context);
369+
standard_ProcessUtility(parsetree, queryString,
370+
context, params,
371+
dest, completionTag);
370372
}
371373
PG_CATCH();
372374
{

src/backend/commands/extension.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -750,10 +750,10 @@ execute_sql_string(const char *sql, const char *filename)
750750
{
751751
ProcessUtility(stmt,
752752
sql,
753+
PROCESS_UTILITY_QUERY,
753754
NULL,
754755
dest,
755-
NULL,
756-
PROCESS_UTILITY_QUERY);
756+
NULL);
757757
}
758758

759759
PopActiveSnapshot();

src/backend/commands/schemacmds.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,10 @@ CreateSchemaCommand(CreateSchemaStmt *stmt, const char *queryString)
151151
/* do this step */
152152
ProcessUtility(stmt,
153153
queryString,
154+
PROCESS_UTILITY_SUBCOMMAND,
154155
NULL,
155156
None_Receiver,
156-
NULL,
157-
PROCESS_UTILITY_SUBCOMMAND);
157+
NULL);
158158
/* make sure later steps can see the object created here */
159159
CommandCounterIncrement();
160160
}

src/backend/commands/trigger.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1014,7 +1014,8 @@ ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid)
10141014
/* ... and execute it */
10151015
ProcessUtility((Node *) atstmt,
10161016
"(generated ALTER TABLE ADD FOREIGN KEY command)",
1017-
NULL, None_Receiver, NULL, PROCESS_UTILITY_GENERATED);
1017+
PROCESS_UTILITY_SUBCOMMAND, NULL,
1018+
None_Receiver, NULL);
10181019

10191020
/* Remove the matched item from the list */
10201021
info_list = list_delete_ptr(info_list, info);

src/backend/executor/functions.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -831,10 +831,10 @@ postquel_getnext(execution_state *es, SQLFunctionCachePtr fcache)
831831
(Node *) es->qd->plannedstmt :
832832
es->qd->utilitystmt),
833833
fcache->src,
834+
PROCESS_UTILITY_QUERY,
834835
es->qd->params,
835836
es->qd->dest,
836-
NULL,
837-
PROCESS_UTILITY_QUERY);
837+
NULL);
838838
result = true; /* never stops early */
839839
}
840840
else

src/backend/executor/spi.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2093,10 +2093,10 @@ _SPI_execute_plan(SPIPlanPtr plan, ParamListInfo paramLI,
20932093

20942094
ProcessUtility(stmt,
20952095
plansource->query_string,
2096+
PROCESS_UTILITY_QUERY,
20962097
paramLI,
20972098
dest,
2098-
completionTag,
2099-
PROCESS_UTILITY_QUERY);
2099+
completionTag);
21002100

21012101
/* Update "processed" if stmt returned tuples */
21022102
if (_SPI_current->tuptable)

src/backend/tcop/pquery.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1184,11 +1184,10 @@ PortalRunUtility(Portal portal, Node *utilityStmt, bool isTopLevel,
11841184

11851185
ProcessUtility(utilityStmt,
11861186
portal->sourceText,
1187+
isTopLevel ? PROCESS_UTILITY_TOPLEVEL : PROCESS_UTILITY_QUERY,
11871188
portal->portalParams,
11881189
dest,
1189-
completionTag,
1190-
isTopLevel ?
1191-
PROCESS_UTILITY_TOPLEVEL : PROCESS_UTILITY_QUERY);
1190+
completionTag);
11921191

11931192
/* Some utility statements may change context on us */
11941193
MemoryContextSwitchTo(PortalGetHeapMemory(portal));

src/backend/tcop/utility.c

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,10 @@ ProcessUtility_hook_type ProcessUtility_hook = NULL;
7171
/* local function declarations */
7272
static void ProcessUtilitySlow(Node *parsetree,
7373
const char *queryString,
74+
ProcessUtilityContext context,
7475
ParamListInfo params,
7576
DestReceiver *dest,
76-
char *completionTag,
77-
ProcessUtilityContext context);
77+
char *completionTag);
7878
static void ExecDropStmt(DropStmt *stmt, bool isTopLevel);
7979

8080

@@ -314,8 +314,9 @@ CheckRestrictedOperation(const char *cmdname)
314314
*
315315
* parsetree: the parse tree for the utility statement
316316
* queryString: original source text of command
317+
* context: identifies source of statement (toplevel client command,
318+
* non-toplevel client command, subcommand of a larger utility command)
317319
* params: parameters to use during execution
318-
* isTopLevel: true if executing a "top level" (interactively issued) command
319320
* dest: where to send results
320321
* completionTag: points to a buffer of size COMPLETION_TAG_BUFSIZE
321322
* in which to store a command completion status string.
@@ -331,10 +332,10 @@ CheckRestrictedOperation(const char *cmdname)
331332
void
332333
ProcessUtility(Node *parsetree,
333334
const char *queryString,
335+
ProcessUtilityContext context,
334336
ParamListInfo params,
335337
DestReceiver *dest,
336-
char *completionTag,
337-
ProcessUtilityContext context)
338+
char *completionTag)
338339
{
339340
Assert(queryString != NULL); /* required as of 8.4 */
340341

@@ -344,11 +345,13 @@ ProcessUtility(Node *parsetree,
344345
* call standard_ProcessUtility().
345346
*/
346347
if (ProcessUtility_hook)
347-
(*ProcessUtility_hook) (parsetree, queryString, params,
348-
dest, completionTag, context);
348+
(*ProcessUtility_hook) (parsetree, queryString,
349+
context, params,
350+
dest, completionTag);
349351
else
350-
standard_ProcessUtility(parsetree, queryString, params,
351-
dest, completionTag, context);
352+
standard_ProcessUtility(parsetree, queryString,
353+
context, params,
354+
dest, completionTag);
352355
}
353356

354357
/*
@@ -365,10 +368,10 @@ ProcessUtility(Node *parsetree,
365368
void
366369
standard_ProcessUtility(Node *parsetree,
367370
const char *queryString,
371+
ProcessUtilityContext context,
368372
ParamListInfo params,
369373
DestReceiver *dest,
370-
char *completionTag,
371-
ProcessUtilityContext context)
374+
char *completionTag)
372375
{
373376
bool isTopLevel = (context == PROCESS_UTILITY_TOPLEVEL);
374377

@@ -817,8 +820,9 @@ standard_ProcessUtility(Node *parsetree,
817820
DropStmt *stmt = (DropStmt *) parsetree;
818821

819822
if (EventTriggerSupportsObjectType(stmt->removeType))
820-
ProcessUtilitySlow(parsetree, queryString, params,
821-
dest, completionTag, context);
823+
ProcessUtilitySlow(parsetree, queryString,
824+
context, params,
825+
dest, completionTag);
822826
else
823827
ExecDropStmt(stmt, isTopLevel);
824828
}
@@ -829,8 +833,9 @@ standard_ProcessUtility(Node *parsetree,
829833
RenameStmt *stmt = (RenameStmt *) parsetree;
830834

831835
if (EventTriggerSupportsObjectType(stmt->renameType))
832-
ProcessUtilitySlow(parsetree, queryString, params,
833-
dest, completionTag, context);
836+
ProcessUtilitySlow(parsetree, queryString,
837+
context, params,
838+
dest, completionTag);
834839
else
835840
ExecRenameStmt(stmt);
836841
}
@@ -841,8 +846,9 @@ standard_ProcessUtility(Node *parsetree,
841846
AlterObjectSchemaStmt *stmt = (AlterObjectSchemaStmt *) parsetree;
842847

843848
if (EventTriggerSupportsObjectType(stmt->objectType))
844-
ProcessUtilitySlow(parsetree, queryString, params,
845-
dest, completionTag, context);
849+
ProcessUtilitySlow(parsetree, queryString,
850+
context, params,
851+
dest, completionTag);
846852
else
847853
ExecAlterObjectSchemaStmt(stmt);
848854
}
@@ -853,17 +859,19 @@ standard_ProcessUtility(Node *parsetree,
853859
AlterOwnerStmt *stmt = (AlterOwnerStmt *) parsetree;
854860

855861
if (EventTriggerSupportsObjectType(stmt->objectType))
856-
ProcessUtilitySlow(parsetree, queryString, params,
857-
dest, completionTag, context);
862+
ProcessUtilitySlow(parsetree, queryString,
863+
context, params,
864+
dest, completionTag);
858865
else
859866
ExecAlterOwnerStmt(stmt);
860867
}
861868
break;
862869

863870
default:
864871
/* All other statement types have event trigger support */
865-
ProcessUtilitySlow(parsetree, queryString, params,
866-
dest, completionTag, context);
872+
ProcessUtilitySlow(parsetree, queryString,
873+
context, params,
874+
dest, completionTag);
867875
break;
868876
}
869877
}
@@ -876,10 +884,10 @@ standard_ProcessUtility(Node *parsetree,
876884
static void
877885
ProcessUtilitySlow(Node *parsetree,
878886
const char *queryString,
887+
ProcessUtilityContext context,
879888
ParamListInfo params,
880889
DestReceiver *dest,
881-
char *completionTag,
882-
ProcessUtilityContext context)
890+
char *completionTag)
883891
{
884892
bool isTopLevel = (context == PROCESS_UTILITY_TOPLEVEL);
885893
bool isCompleteQuery = (context <= PROCESS_UTILITY_QUERY);
@@ -966,10 +974,10 @@ ProcessUtilitySlow(Node *parsetree,
966974
/* Recurse for anything else */
967975
ProcessUtility(stmt,
968976
queryString,
977+
PROCESS_UTILITY_SUBCOMMAND,
969978
params,
970979
None_Receiver,
971-
NULL,
972-
PROCESS_UTILITY_GENERATED);
980+
NULL);
973981
}
974982

975983
/* Need CCI between commands */
@@ -1017,10 +1025,10 @@ ProcessUtilitySlow(Node *parsetree,
10171025
/* Recurse for anything else */
10181026
ProcessUtility(stmt,
10191027
queryString,
1028+
PROCESS_UTILITY_SUBCOMMAND,
10201029
params,
10211030
None_Receiver,
1022-
NULL,
1023-
PROCESS_UTILITY_GENERATED);
1031+
NULL);
10241032
}
10251033

10261034
/* Need CCI between commands */

src/include/tcop/utility.h

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,22 @@ typedef enum
2020
{
2121
PROCESS_UTILITY_TOPLEVEL, /* toplevel interactive command */
2222
PROCESS_UTILITY_QUERY, /* a complete query, but not toplevel */
23-
PROCESS_UTILITY_SUBCOMMAND, /* a piece of a query */
24-
PROCESS_UTILITY_GENERATED /* internally generated node query node */
23+
PROCESS_UTILITY_SUBCOMMAND /* a portion of a query */
2524
} ProcessUtilityContext;
2625

2726
/* Hook for plugins to get control in ProcessUtility() */
2827
typedef void (*ProcessUtility_hook_type) (Node *parsetree,
29-
const char *queryString, ParamListInfo params,
30-
DestReceiver *dest, char *completionTag,
31-
ProcessUtilityContext context);
28+
const char *queryString, ProcessUtilityContext context,
29+
ParamListInfo params,
30+
DestReceiver *dest, char *completionTag);
3231
extern PGDLLIMPORT ProcessUtility_hook_type ProcessUtility_hook;
3332

3433
extern void ProcessUtility(Node *parsetree, const char *queryString,
35-
ParamListInfo params, DestReceiver *dest, char *completionTag,
36-
ProcessUtilityContext context);
34+
ProcessUtilityContext context, ParamListInfo params,
35+
DestReceiver *dest, char *completionTag);
3736
extern void standard_ProcessUtility(Node *parsetree, const char *queryString,
38-
ParamListInfo params, DestReceiver *dest,
39-
char *completionTag, ProcessUtilityContext context);
37+
ProcessUtilityContext context, ParamListInfo params,
38+
DestReceiver *dest, char *completionTag);
4039

4140
extern bool UtilityReturnsTuples(Node *parsetree);
4241

0 commit comments

Comments
 (0)