Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit80bcf2d

Browse files
committed
Bugfix. Choose memory context for a query environment piece in more safe way.
Sometimes someone can invent a queryEnv and use it with short-lived plans. So,anyone under the hood should create its queryEnv in the same memory context.
1 parenta33461d commit80bcf2d

File tree

1 file changed

+26
-8
lines changed

1 file changed

+26
-8
lines changed

‎postprocessing.c

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -913,11 +913,20 @@ StoreToQueryEnv(QueryDesc *queryDesc)
913913
MemoryContextoldCxt;
914914
boolnewentry= false;
915915

916-
oldCxt=MemoryContextSwitchTo(GetMemoryChunkContext(queryDesc->plannedstmt));
917-
918-
if (queryDesc->queryEnv==NULL)
919-
queryDesc->queryEnv=create_queryEnv();
916+
/*
917+
* Choose memory context for AQO parameters. Use pre-existed context if
918+
* someone earlier created queryEnv (usually, SPI), or base on the queryDesc
919+
* memory context.
920+
*/
921+
if (queryDesc->queryEnv!=NULL)
922+
oldCxt=MemoryContextSwitchTo(GetMemoryChunkContext(queryDesc->queryEnv));
923+
else
924+
{
925+
oldCxt=MemoryContextSwitchTo(GetMemoryChunkContext(queryDesc));
926+
queryDesc->queryEnv=create_queryEnv();
927+
}
920928

929+
Assert(queryDesc->queryEnv);
921930
enr=get_ENR(queryDesc->queryEnv,AQOPrivateData);
922931
if (enr==NULL)
923932
{
@@ -965,11 +974,20 @@ StorePlanInternals(QueryDesc *queryDesc)
965974
njoins=0;
966975
planstate_tree_walker(queryDesc->planstate,calculateJoinNum,&njoins);
967976

968-
oldCxt=MemoryContextSwitchTo(GetMemoryChunkContext(queryDesc->plannedstmt));
969-
970-
if (queryDesc->queryEnv==NULL)
971-
queryDesc->queryEnv=create_queryEnv();
977+
/*
978+
* Choose memory context for AQO parameters. Use pre-existed context if
979+
* someone earlier created queryEnv (usually, SPI), or base on the queryDesc
980+
* memory context.
981+
*/
982+
if (queryDesc->queryEnv!=NULL)
983+
oldCxt=MemoryContextSwitchTo(GetMemoryChunkContext(queryDesc->queryEnv));
984+
else
985+
{
986+
oldCxt=MemoryContextSwitchTo(GetMemoryChunkContext(queryDesc));
987+
queryDesc->queryEnv=create_queryEnv();
988+
}
972989

990+
Assert(queryDesc->queryEnv);
973991
enr=get_ENR(queryDesc->queryEnv,PlanStateInfo);
974992
if (enr==NULL)
975993
{

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp