Skip to content

Commit 2742ff7

Browse files
committed
repeat dbgapi call to other extension
1 parent be61bff commit 2742ff7

File tree

4 files changed

+135
-0
lines changed

4 files changed

+135
-0
lines changed

src/check_function.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,8 @@ plpgsql_check_on_func_beg(PLpgSQL_execstate *estate, PLpgSQL_function *func)
309309
int closing;
310310
List *exceptions;
311311

312+
plpgsql_check_profiler_func_beg(estate, func);
313+
312314
if (plpgsql_check_tracer)
313315
plpgsql_check_tracer_on_func_beg(estate, func);
314316

src/plpgsql_check.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ PG_MODULE_MAGIC;
3636
#endif
3737

3838
PLpgSQL_plugin **plpgsql_check_plugin_var_ptr;
39+
PLpgSQL_plugin *prev_plpgsql_plugin;
3940

4041
static PLpgSQL_plugin plugin_funcs = { plpgsql_check_profiler_func_init,
4142
plpgsql_check_on_func_beg,
@@ -167,6 +168,7 @@ _PG_init(void)
167168
LOAD_EXTERNAL_FUNCTION("$libdir/plpgsql", "plpgsql_ns_lookup");
168169

169170
plpgsql_check_plugin_var_ptr = (PLpgSQL_plugin **) find_rendezvous_variable( "PLpgSQL_plugin");
171+
prev_plpgsql_plugin = *plpgsql_check_plugin_var_ptr;
170172
*plpgsql_check_plugin_var_ptr = &plugin_funcs;
171173

172174
DefineCustomBoolVariable("plpgsql_check.regress_test_mode",

src/plpgsql_check.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,7 @@ extern Size plpgsql_check_shmem_size(void);
330330
extern void plpgsql_check_profiler_init_hash_tables(void);
331331

332332
extern void plpgsql_check_profiler_func_init(PLpgSQL_execstate *estate, PLpgSQL_function *func);
333+
extern void plpgsql_check_profiler_func_beg(PLpgSQL_execstate *estate, PLpgSQL_function *func);
333334
extern void plpgsql_check_profiler_func_end(PLpgSQL_execstate *estate, PLpgSQL_function *func);
334335
extern void plpgsql_check_profiler_stmt_beg(PLpgSQL_execstate *estate, PLpgSQL_stmt *stmt);
335336
extern void plpgsql_check_profiler_stmt_end(PLpgSQL_execstate *estate, PLpgSQL_stmt *stmt);
@@ -395,6 +396,7 @@ extern shmem_request_hook_type prev_shmem_request_hook;
395396
extern shmem_startup_hook_type prev_shmem_startup_hook;
396397

397398
extern PLpgSQL_plugin **plpgsql_check_plugin_var_ptr;
399+
extern PLpgSQL_plugin *prev_plpgsql_plugin;
398400

399401
#if PG_VERSION_NUM > 110005
400402

src/profiler.c

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,8 @@ typedef struct profiler_info
222222

223223
#endif
224224

225+
void *prev_plugin_info;
226+
225227
} profiler_info;
226228

227229
typedef struct profiler_iterator
@@ -2805,6 +2807,34 @@ plpgsql_check_profiler_func_init(PLpgSQL_execstate *estate, PLpgSQL_function *fu
28052807
{
28062808
profiler_info *pinfo = NULL;
28072809

2810+
if (prev_plpgsql_plugin)
2811+
{
2812+
prev_plpgsql_plugin->error_callback = (*plpgsql_check_plugin_var_ptr)->error_callback;
2813+
prev_plpgsql_plugin->assign_expr = (*plpgsql_check_plugin_var_ptr)->assign_expr;
2814+
prev_plpgsql_plugin->assign_value = (*plpgsql_check_plugin_var_ptr)->assign_value;
2815+
prev_plpgsql_plugin->eval_datum = (*plpgsql_check_plugin_var_ptr)->eval_datum;
2816+
prev_plpgsql_plugin->cast_value = (*plpgsql_check_plugin_var_ptr)->cast_value;
2817+
2818+
pinfo = init_profiler_info(pinfo, func);
2819+
2820+
PG_TRY();
2821+
{
2822+
if ((prev_plpgsql_plugin)->func_setup)
2823+
(prev_plpgsql_plugin->func_setup) (estate, func);
2824+
2825+
pinfo->prev_plugin_info = estate->plugin_info;
2826+
estate->plugin_info = pinfo;
2827+
}
2828+
PG_CATCH();
2829+
{
2830+
pinfo->prev_plugin_info = estate->plugin_info;
2831+
estate->plugin_info = pinfo;
2832+
2833+
PG_RE_THROW();
2834+
}
2835+
PG_END_TRY();
2836+
}
2837+
28082838
if (plpgsql_check_tracer)
28092839
{
28102840

@@ -2876,13 +2906,66 @@ plpgsql_check_profiler_func_init(PLpgSQL_execstate *estate, PLpgSQL_function *fu
28762906
}
28772907
}
28782908

2909+
void
2910+
plpgsql_check_profiler_func_beg(PLpgSQL_execstate *estate, PLpgSQL_function *func)
2911+
{
2912+
if (prev_plpgsql_plugin && prev_plpgsql_plugin->func_beg)
2913+
{
2914+
profiler_info *pinfo = estate->plugin_info;
2915+
2916+
PG_TRY();
2917+
{
2918+
2919+
Assert(pinfo);
2920+
2921+
estate->plugin_info = pinfo->prev_plugin_info;
2922+
(prev_plpgsql_plugin->func_beg) (estate, func);
2923+
2924+
pinfo->prev_plugin_info = estate->plugin_info;
2925+
estate->plugin_info = pinfo;
2926+
}
2927+
PG_CATCH();
2928+
{
2929+
pinfo->prev_plugin_info = estate->plugin_info;
2930+
estate->plugin_info = pinfo;
2931+
2932+
PG_RE_THROW();
2933+
}
2934+
PG_END_TRY();
2935+
}
2936+
}
2937+
28792938
void
28802939
plpgsql_check_profiler_func_end(PLpgSQL_execstate *estate, PLpgSQL_function *func)
28812940
{
28822941
profiler_info *pinfo = NULL;
28832942

28842943
if (estate)
2944+
{
28852945
pinfo = (profiler_info *) estate->plugin_info;
2946+
2947+
if (prev_plpgsql_plugin && prev_plpgsql_plugin->func_end)
2948+
{
2949+
PG_TRY();
2950+
{
2951+
Assert(pinfo);
2952+
2953+
estate->plugin_info = pinfo->prev_plugin_info;
2954+
(prev_plpgsql_plugin->func_end) (estate, func);
2955+
2956+
pinfo->prev_plugin_info = estate->plugin_info;
2957+
estate->plugin_info = pinfo;
2958+
}
2959+
PG_CATCH();
2960+
{
2961+
pinfo->prev_plugin_info = estate->plugin_info;
2962+
estate->plugin_info = pinfo;
2963+
2964+
PG_RE_THROW();
2965+
}
2966+
PG_END_TRY();
2967+
}
2968+
}
28862969
else if (top_pinfo)
28872970
pinfo = top_pinfo->pinfo;
28882971

@@ -2949,6 +3032,28 @@ plpgsql_check_profiler_stmt_beg(PLpgSQL_execstate *estate, PLpgSQL_stmt *stmt)
29493032
{
29503033
profiler_info *pinfo = (profiler_info *) estate->plugin_info;
29513034

3035+
if (prev_plpgsql_plugin && prev_plpgsql_plugin->stmt_beg)
3036+
{
3037+
PG_TRY();
3038+
{
3039+
Assert(pinfo);
3040+
3041+
estate->plugin_info = pinfo->prev_plugin_info;
3042+
(prev_plpgsql_plugin->stmt_beg) (estate, stmt);
3043+
3044+
pinfo->prev_plugin_info = estate->plugin_info;
3045+
estate->plugin_info = pinfo;
3046+
}
3047+
PG_CATCH();
3048+
{
3049+
pinfo->prev_plugin_info = estate->plugin_info;
3050+
estate->plugin_info = pinfo;
3051+
3052+
PG_RE_THROW();
3053+
}
3054+
PG_END_TRY();
3055+
}
3056+
29523057
if (top_pinfo && top_pinfo->pinfo)
29533058
{
29543059
if (estate->eval_econtext != curr_eval_econtext)
@@ -3080,8 +3185,32 @@ plpgsql_check_profiler_stmt_end(PLpgSQL_execstate *estate, PLpgSQL_stmt *stmt)
30803185
cleaning_mode = true;
30813186
}
30823187
else
3188+
{
30833189
pinfo = (profiler_info *) estate->plugin_info;
30843190

3191+
if (prev_plpgsql_plugin && prev_plpgsql_plugin->stmt_end)
3192+
{
3193+
PG_TRY();
3194+
{
3195+
Assert(pinfo);
3196+
3197+
estate->plugin_info = pinfo->prev_plugin_info;
3198+
(prev_plpgsql_plugin->stmt_end) (estate, stmt);
3199+
3200+
pinfo->prev_plugin_info = estate->plugin_info;
3201+
estate->plugin_info = pinfo;
3202+
}
3203+
PG_CATCH();
3204+
{
3205+
pinfo->prev_plugin_info = estate->plugin_info;
3206+
estate->plugin_info = pinfo;
3207+
3208+
PG_RE_THROW();
3209+
}
3210+
PG_END_TRY();
3211+
}
3212+
}
3213+
30853214
if (top_pinfo && top_pinfo->pinfo && !cleaning_mode)
30863215
{
30873216
int i;

0 commit comments

Comments
 (0)