@@ -222,6 +222,8 @@ typedef struct profiler_info
222222
223223#endif
224224
225+ void * prev_plugin_info ;
226+
225227} profiler_info ;
226228
227229typedef 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+
28792938void
28802939plpgsql_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