OSDN Git Service

Properly free all elements in a list
author褚华兴 <15381158111@163.com>
Wed, 19 Jan 2022 02:37:57 +0000 (11:37 +0900)
committerKyotaro Horiguchi <horikyota.ntt@gmail.com>
Wed, 19 Jan 2022 02:37:57 +0000 (11:37 +0900)
HintStateDelete tried to free the elements of hstate->all_hints[] but
actually it only freed part of them.  Correct the code as it intended.

Some other palloced blocks are being hanged under the struct but we
don't bother trying to be perfect at cleaning up the whole struct
since it will be freed up at query end.

pg_hint_plan.c

index 766aa2a..8534cea 100644 (file)
@@ -1081,12 +1081,18 @@ HintStateDelete(HintState *hstate)
        if (hstate->hint_str)
                pfree(hstate->hint_str);
 
-       for (i = 0; i < hstate->num_hints[HINT_TYPE_SCAN_METHOD]; i++)
+       for (i = 0; i < hstate->nall_hints ; i++)
                hstate->all_hints[i]->delete_func(hstate->all_hints[i]);
        if (hstate->all_hints)
                pfree(hstate->all_hints);
        if (hstate->parent_index_infos)
                list_free(hstate->parent_index_infos);
+
+       /*
+        * We have another few or dozen of palloced block in the struct, but don't
+        * bother completely clean up all of them since they will be cleaned-up at
+        * the end of this query.
+        */
 }
 
 /*