Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitc00cfed

Browse files
committed
Fix release procedure of QueryDesc object from stack
The global state variable that denotes a stack of currently executingqueries requires a special care on supporting. The mechanism of addingand removing of current stack frame in Executor hooks is kept fromauto_explain extension for nesting_level variable. The current stackframe is added to stack before ExecutorRun and ExecutorFinish routinesand is released after them
1 parent272816f commitc00cfed

File tree

1 file changed

+19
-54
lines changed

1 file changed

+19
-54
lines changed

‎pg_query_state.c

Lines changed: 19 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ bool pg_qs_buffers = false;
5050
staticExecutorStart_hook_typeprev_ExecutorStart=NULL;
5151
staticExecutorRun_hook_typeprev_ExecutorRun=NULL;
5252
staticExecutorFinish_hook_typeprev_ExecutorFinish=NULL;
53-
staticExecutorEnd_hook_typeprev_ExecutorEnd=NULL;
5453
staticshmem_startup_hook_typeprev_shmem_startup_hook=NULL;
5554

5655
void_PG_init(void);
@@ -65,7 +64,6 @@ static void qs_ExecutorRun(QueryDesc *queryDesc, ScanDirection direction,
6564
uint64count,boolexecute_once);
6665
#endif
6766
staticvoidqs_ExecutorFinish(QueryDesc*queryDesc);
68-
staticvoidqs_ExecutorEnd(QueryDesc*queryDesc);
6967

7068
/* Global variables */
7169
List*QueryDescStack=NIL;
@@ -249,8 +247,6 @@ _PG_init(void)
249247
ExecutorRun_hook=qs_ExecutorRun;
250248
prev_ExecutorFinish=ExecutorFinish_hook;
251249
ExecutorFinish_hook=qs_ExecutorFinish;
252-
prev_ExecutorEnd=ExecutorEnd_hook;
253-
ExecutorEnd_hook=qs_ExecutorEnd;
254250
prev_shmem_startup_hook=shmem_startup_hook;
255251
shmem_startup_hook=pg_qs_shmem_startup;
256252
}
@@ -271,7 +267,6 @@ _PG_fini(void)
271267
ExecutorStart_hook=prev_ExecutorStart;
272268
ExecutorRun_hook=prev_ExecutorRun;
273269
ExecutorFinish_hook=prev_ExecutorFinish;
274-
ExecutorEnd_hook=prev_ExecutorEnd;
275270
shmem_startup_hook=prev_shmem_startup_hook;
276271
}
277272

@@ -283,32 +278,20 @@ _PG_fini(void)
283278
staticvoid
284279
qs_ExecutorStart(QueryDesc*queryDesc,inteflags)
285280
{
286-
PG_TRY();
281+
/* Enable per-node instrumentation */
282+
if (pg_qs_enable&& ((eflags&EXEC_FLAG_EXPLAIN_ONLY)==0))
287283
{
288-
/* Enable per-node instrumentation */
289-
if (pg_qs_enable&& ((eflags&EXEC_FLAG_EXPLAIN_ONLY)==0))
290-
{
291-
queryDesc->instrument_options |=INSTRUMENT_ROWS;
292-
if (pg_qs_timing)
293-
queryDesc->instrument_options |=INSTRUMENT_TIMER;
294-
if (pg_qs_buffers)
295-
queryDesc->instrument_options |=INSTRUMENT_BUFFERS;
296-
}
297-
298-
if (prev_ExecutorStart)
299-
prev_ExecutorStart(queryDesc,eflags);
300-
else
301-
standard_ExecutorStart(queryDesc,eflags);
302-
303-
/* push structure about current query in global stack */
304-
QueryDescStack=lcons(queryDesc,QueryDescStack);
284+
queryDesc->instrument_options |=INSTRUMENT_ROWS;
285+
if (pg_qs_timing)
286+
queryDesc->instrument_options |=INSTRUMENT_TIMER;
287+
if (pg_qs_buffers)
288+
queryDesc->instrument_options |=INSTRUMENT_BUFFERS;
305289
}
306-
PG_CATCH();
307-
{
308-
QueryDescStack=NIL;
309-
PG_RE_THROW();
310-
}
311-
PG_END_TRY();
290+
291+
if (prev_ExecutorStart)
292+
prev_ExecutorStart(queryDesc,eflags);
293+
else
294+
standard_ExecutorStart(queryDesc,eflags);
312295
}
313296

314297
/*
@@ -323,6 +306,8 @@ qs_ExecutorRun(QueryDesc *queryDesc, ScanDirection direction, uint64 count,
323306
boolexecute_once)
324307
#endif
325308
{
309+
QueryDescStack=lcons(queryDesc,QueryDescStack);
310+
326311
PG_TRY();
327312
{
328313
if (prev_ExecutorRun)
@@ -335,10 +320,11 @@ qs_ExecutorRun(QueryDesc *queryDesc, ScanDirection direction, uint64 count,
335320
else
336321
standard_ExecutorRun(queryDesc,direction,count,execute_once);
337322
#endif
323+
QueryDescStack=list_delete_first(QueryDescStack);
338324
}
339325
PG_CATCH();
340326
{
341-
QueryDescStack=NIL;
327+
QueryDescStack=list_delete_first(QueryDescStack);
342328
PG_RE_THROW();
343329
}
344330
PG_END_TRY();
@@ -351,40 +337,19 @@ qs_ExecutorRun(QueryDesc *queryDesc, ScanDirection direction, uint64 count,
351337
staticvoid
352338
qs_ExecutorFinish(QueryDesc*queryDesc)
353339
{
340+
QueryDescStack=lcons(queryDesc,QueryDescStack);
341+
354342
PG_TRY();
355343
{
356344
if (prev_ExecutorFinish)
357345
prev_ExecutorFinish(queryDesc);
358346
else
359347
standard_ExecutorFinish(queryDesc);
360-
}
361-
PG_CATCH();
362-
{
363-
QueryDescStack=NIL;
364-
PG_RE_THROW();
365-
}
366-
PG_END_TRY();
367-
}
368-
369-
/*
370-
* ExecutorEnd hook:
371-
* pop current query description from global stack
372-
*/
373-
staticvoid
374-
qs_ExecutorEnd(QueryDesc*queryDesc)
375-
{
376-
PG_TRY();
377-
{
378348
QueryDescStack=list_delete_first(QueryDescStack);
379-
380-
if (prev_ExecutorEnd)
381-
prev_ExecutorEnd(queryDesc);
382-
else
383-
standard_ExecutorEnd(queryDesc);
384349
}
385350
PG_CATCH();
386351
{
387-
QueryDescStack=NIL;
352+
QueryDescStack=list_delete_first(QueryDescStack);
388353
PG_RE_THROW();
389354
}
390355
PG_END_TRY();

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp