@@ -42,7 +42,12 @@ typedef struct
42
42
static double cardinality_sum_errors ;
43
43
static int cardinality_num_objects ;
44
44
45
- /* It is needed to recognize stored Query-related aqo data in the query
45
+ /*
46
+ * Store an AQO-related query data into the Query Environment structure.
47
+ *
48
+ * It is very sad that we have to use such unsuitable field, but alternative is
49
+ * to introduce a private field in a PlannedStmt struct.
50
+ * It is needed to recognize stored Query-related aqo data in the query
46
51
* environment field.
47
52
*/
48
53
static char * AQOPrivateData = "AQOPrivateData" ;
@@ -751,16 +756,20 @@ StoreToQueryEnv(QueryDesc *queryDesc)
751
756
EphemeralNamedRelation enr ;
752
757
int qcsize = sizeof (QueryContextData );
753
758
MemoryContext oldCxt ;
759
+ bool newentry = false;
754
760
755
- oldCxt = MemoryContextSwitchTo (GetMemoryChunkContext (queryDesc ));
761
+ oldCxt = MemoryContextSwitchTo (GetMemoryChunkContext (queryDesc -> plannedstmt ));
756
762
757
763
if (queryDesc -> queryEnv == NULL )
758
764
queryDesc -> queryEnv = create_queryEnv ();
759
765
760
766
enr = get_ENR (queryDesc -> queryEnv , AQOPrivateData );
761
767
if (enr == NULL )
768
+ {
762
769
/* If such query environment don't exists, allocate new. */
763
770
enr = palloc0 (sizeof (EphemeralNamedRelationData ));
771
+ newentry = true;
772
+ }
764
773
765
774
enr -> md .name = AQOPrivateData ;
766
775
enr -> md .enrtuples = 0 ;
@@ -770,7 +779,9 @@ StoreToQueryEnv(QueryDesc *queryDesc)
770
779
enr -> reldata = palloc0 (qcsize );
771
780
memcpy (enr -> reldata , & query_context , qcsize );
772
781
773
- register_ENR (queryDesc -> queryEnv , enr );
782
+ if (newentry )
783
+ register_ENR (queryDesc -> queryEnv , enr );
784
+
774
785
MemoryContextSwitchTo (oldCxt );
775
786
}
776
787
@@ -794,19 +805,23 @@ StorePlanInternals(QueryDesc *queryDesc)
794
805
{
795
806
EphemeralNamedRelation enr ;
796
807
MemoryContext oldCxt ;
808
+ bool newentry = false;
797
809
798
810
njoins = 0 ;
799
811
planstate_tree_walker (queryDesc -> planstate , calculateJoinNum , & njoins );
800
812
801
- oldCxt = MemoryContextSwitchTo (GetMemoryChunkContext (queryDesc ));
813
+ oldCxt = MemoryContextSwitchTo (GetMemoryChunkContext (queryDesc -> plannedstmt ));
802
814
803
815
if (queryDesc -> queryEnv == NULL )
804
816
queryDesc -> queryEnv = create_queryEnv ();
805
817
806
818
enr = get_ENR (queryDesc -> queryEnv , PlanStateInfo );
807
819
if (enr == NULL )
808
- /* If such query environment don't exists, allocate new. */
820
+ {
821
+ /* If such query environment field doesn't exist, allocate new. */
809
822
enr = palloc0 (sizeof (EphemeralNamedRelationData ));
823
+ newentry = true;
824
+ }
810
825
811
826
enr -> md .name = PlanStateInfo ;
812
827
enr -> md .enrtuples = 0 ;
@@ -815,7 +830,10 @@ StorePlanInternals(QueryDesc *queryDesc)
815
830
enr -> md .tupdesc = NULL ;
816
831
enr -> reldata = palloc0 (sizeof (int ));
817
832
memcpy (enr -> reldata , & njoins , sizeof (int ));
818
- register_ENR (queryDesc -> queryEnv , enr );
833
+
834
+ if (newentry )
835
+ register_ENR (queryDesc -> queryEnv , enr );
836
+
819
837
MemoryContextSwitchTo (oldCxt );
820
838
}
821
839
0 commit comments