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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy