diff --git a/src/gausskernel/storage/access/gist/gistbuild.cpp b/src/gausskernel/storage/access/gist/gistbuild.cpp index 1e214fd93..64febf202 100644 --- a/src/gausskernel/storage/access/gist/gistbuild.cpp +++ b/src/gausskernel/storage/access/gist/gistbuild.cpp @@ -882,8 +882,11 @@ static void gistProcessEmptyingQueue(GISTBuildState *buildstate) break; } - /* Free all the memory allocated during index tuple processing */ - MemoryContextReset(buildstate->giststate->tempCxt); + /* + * MemoryContextReset will be called by caller, or caller of caller (for example, gistBuildCallback). + * Just reset after all utilities of relative pointers in buildstate->giststate->tempCxt is finished + * in case of memory leak. + */ } } } @@ -936,6 +939,7 @@ static void gistEmptyAllBuffers(GISTBuildState *buildstate) ereport(DEBUG2, (errmsg("emptied all buffers at level %d", i))); } (void)MemoryContextSwitchTo(oldCtx); + MemoryContextReset(buildstate->giststate->tempCxt); } /* diff --git a/src/test/regress/expected/create_index_gist.out b/src/test/regress/expected/create_index_gist.out index 5d2855fb8..df9a12305 100644 --- a/src/test/regress/expected/create_index_gist.out +++ b/src/test/regress/expected/create_index_gist.out @@ -501,6 +501,10 @@ SELECT * FROM point_tbl WHERE f1 <@ '(-10,-10),(10,10)':: box ORDER BY f1 <-> '0 (10,10) (4 rows) +-- test for gist index building when buffering=on +create table t(id int, c_point point); +insert into t select id, point'(1, 2)' from (select * from generate_series(1, 200000) as id) as x; +create index i on t using gist(c_point) with (buffering=on); RESET enable_seqscan; RESET enable_indexscan; diff --git a/src/test/regress/sql/create_index_gist.sql b/src/test/regress/sql/create_index_gist.sql index db7ed6b0b..b5d0cc825 100644 --- a/src/test/regress/sql/create_index_gist.sql +++ b/src/test/regress/sql/create_index_gist.sql @@ -181,6 +181,11 @@ EXPLAIN (NUM_NODES OFF, NODES OFF, COSTS OFF) SELECT * FROM point_tbl WHERE f1 <@ '(-10,-10),(10,10)':: box ORDER BY f1 <-> '0,1'; SELECT * FROM point_tbl WHERE f1 <@ '(-10,-10),(10,10)':: box ORDER BY f1 <-> '0,1'; +-- test for gist index building when buffering=on +create table t(id int, c_point point); +insert into t select id, point'(1, 2)' from (select * from generate_series(1, 200000) as id) as x; +create index i on t using gist(c_point) with (buffering=on); + RESET enable_seqscan; RESET enable_indexscan; RESET enable_bitmapscan; \ No newline at end of file