@@ -152,6 +152,7 @@ typedef struct tagHtabToStat {
152
152
HASH_SEQ_STATUS * status ;
153
153
Variable * variable ;
154
154
Package * package ;
155
+ int level ;
155
156
} HtabToStat ;
156
157
157
158
/*
@@ -181,6 +182,12 @@ HtabToStat_eq_all(HtabToStat *entry, void *value)
181
182
return true;
182
183
}
183
184
185
+ static bool
186
+ HtabToStat_level_eq (HtabToStat * entry , void * value )
187
+ {
188
+ return entry -> level == * (int * ) value ;
189
+ }
190
+
184
191
/*
185
192
* Generic remove_if algorithm for HtabToStat.
186
193
*
@@ -192,6 +199,7 @@ HtabToStat_remove_if(List **l, void *value,
192
199
bool (* eq )(HtabToStat * , void * ),
193
200
bool match_first )
194
201
{
202
+ #if (PG_VERSION_NUM < 130000 )
195
203
ListCell * cell , * next , * prev = NULL ;
196
204
HtabToStat * entry = NULL ;
197
205
@@ -214,6 +222,23 @@ HtabToStat_remove_if(List **l, void *value,
214
222
prev = cell ;
215
223
}
216
224
}
225
+ #else
226
+ /*
227
+ * See https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=1cff1b95ab6ddae32faa3efe0d95a820dbfdc164
228
+ *
229
+ * Version > 13 have different lists interface.
230
+ */
231
+ ListCell * cell ;
232
+ HtabToStat * entry = NULL ;
233
+
234
+ foreach (cell , * l )
235
+ {
236
+ entry = (HtabToStat * ) lfirst (cell );
237
+
238
+ if (eq (entry , value ))
239
+ * l = foreach_delete_current (* l , cell );
240
+ }
241
+ #endif
217
242
}
218
243
219
244
/*
@@ -243,6 +268,15 @@ remove_variables_package(List **l, Package *package)
243
268
HtabToStat_remove_if (l , package , HtabToStat_package_eq , false);
244
269
}
245
270
271
+ /*
272
+ * Remove all the entrys for level.
273
+ */
274
+ static void
275
+ remove_variables_level (List * * l , int level )
276
+ {
277
+ HtabToStat_remove_if (l , & level , HtabToStat_level_eq , false);
278
+ }
279
+
246
280
/*
247
281
* Remove all.
248
282
*/
@@ -757,6 +791,7 @@ variable_select(PG_FUNCTION_ARGS)
757
791
htab_to_stat -> status = rstat ;
758
792
htab_to_stat -> variable = variable ;
759
793
htab_to_stat -> package = package ;
794
+ htab_to_stat -> level = GetCurrentTransactionNestLevel ();
760
795
variables_stats = lcons ((void * )htab_to_stat , variables_stats );
761
796
762
797
MemoryContextSwitchTo (oldcontext );
@@ -1356,7 +1391,6 @@ get_packages_stats(PG_FUNCTION_ARGS)
1356
1391
{
1357
1392
TupleDesc tupdesc ;
1358
1393
1359
- //elog(INFO, " >>> ");
1360
1394
funcctx = SRF_FIRSTCALL_INIT ();
1361
1395
oldcontext = MemoryContextSwitchTo (funcctx -> multi_call_memory_ctx );
1362
1396
@@ -1432,7 +1466,7 @@ get_packages_stats(PG_FUNCTION_ARGS)
1432
1466
else
1433
1467
{
1434
1468
packages_stats = list_delete (packages_stats , rstat );
1435
- // pfree(rstat);
1469
+ pfree (rstat );
1436
1470
SRF_RETURN_DONE (funcctx );
1437
1471
}
1438
1472
}
@@ -2312,6 +2346,8 @@ pgvSubTransCallback(SubXactEvent event, SubTransactionId mySubid,
2312
2346
break ;
2313
2347
}
2314
2348
}
2349
+
2350
+ remove_variables_level (& variables_stats , GetCurrentTransactionNestLevel ());
2315
2351
}
2316
2352
2317
2353
/*
0 commit comments