@@ -72,7 +72,6 @@ static void update_query_stat_row(double *et, int *et_size,
72
72
static void StoreToQueryEnv (QueryDesc * queryDesc );
73
73
static void StorePlanInternals (QueryDesc * queryDesc );
74
74
static bool ExtractFromQueryEnv (QueryDesc * queryDesc );
75
- static void RemoveFromQueryEnv (QueryDesc * queryDesc );
76
75
77
76
78
77
/*
@@ -542,9 +541,16 @@ update_query_stat_row(double *et, int *et_size,
542
541
void
543
542
aqo_ExecutorStart (QueryDesc * queryDesc , int eflags )
544
543
{
545
- instr_time now ;
544
+ instr_time now ;
546
545
bool use_aqo ;
547
546
547
+ /*
548
+ * If the plan pulled from a plan cache, planning don't needed. Restore
549
+ * query context from the query environment.
550
+ */
551
+ if (ExtractFromQueryEnv (queryDesc ))
552
+ Assert (INSTR_TIME_IS_ZERO (query_context .start_planning_time ));
553
+
548
554
if (IsQueryDisabled ())
549
555
/* Fast path */
550
556
use_aqo = false;
@@ -713,8 +719,6 @@ aqo_ExecutorEnd(QueryDesc *queryDesc)
713
719
714
720
cur_classes = list_delete_int (cur_classes , query_context .query_hash );
715
721
716
- RemoveFromQueryEnv (queryDesc );
717
-
718
722
end :
719
723
if (prev_ExecutorEnd_hook )
720
724
prev_ExecutorEnd_hook (queryDesc );
@@ -728,9 +732,11 @@ aqo_ExecutorEnd(QueryDesc *queryDesc)
728
732
}
729
733
730
734
/*
731
- * Store into query environment field AQO data related to the query.
735
+ * Store into a query environment field an AQO data related to the query.
732
736
* We introduce this machinery to avoid problems with subqueries, induced by
733
737
* top-level query.
738
+ * If such enr exists, routine will replace it with current value of the
739
+ * query context.
734
740
*/
735
741
static void
736
742
StoreToQueryEnv (QueryDesc * queryDesc )
@@ -740,16 +746,20 @@ StoreToQueryEnv(QueryDesc *queryDesc)
740
746
MemoryContext oldCxt ;
741
747
742
748
oldCxt = MemoryContextSwitchTo (AQOMemoryContext );
743
- enr = palloc0 ( sizeof ( EphemeralNamedRelationData ));
749
+
744
750
if (queryDesc -> queryEnv == NULL )
745
- queryDesc -> queryEnv = create_queryEnv ();
751
+ queryDesc -> queryEnv = create_queryEnv ();
752
+
753
+ enr = get_ENR (queryDesc -> queryEnv , AQOPrivateData );
754
+ if (enr == NULL )
755
+ /* If such query environment don't exists, allocate new. */
756
+ enr = palloc0 (sizeof (EphemeralNamedRelationData ));
746
757
747
758
enr -> md .name = AQOPrivateData ;
748
759
enr -> md .enrtuples = 0 ;
749
760
enr -> md .enrtype = 0 ;
750
761
enr -> md .reliddesc = InvalidOid ;
751
762
enr -> md .tupdesc = NULL ;
752
-
753
763
enr -> reldata = palloc0 (qcsize );
754
764
memcpy (enr -> reldata , & query_context , qcsize );
755
765
@@ -782,10 +792,15 @@ StorePlanInternals(QueryDesc *queryDesc)
782
792
planstate_tree_walker (queryDesc -> planstate , calculateJoinNum , & njoins );
783
793
784
794
oldCxt = MemoryContextSwitchTo (AQOMemoryContext );
785
- enr = palloc0 ( sizeof ( EphemeralNamedRelationData ));
795
+
786
796
if (queryDesc -> queryEnv == NULL )
787
797
queryDesc -> queryEnv = create_queryEnv ();
788
798
799
+ enr = get_ENR (queryDesc -> queryEnv , PlanStateInfo );
800
+ if (enr == NULL )
801
+ /* If such query environment don't exists, allocate new. */
802
+ enr = palloc0 (sizeof (EphemeralNamedRelationData ));
803
+
789
804
enr -> md .name = PlanStateInfo ;
790
805
enr -> md .enrtuples = 0 ;
791
806
enr -> md .enrtype = 0 ;
@@ -823,21 +838,6 @@ ExtractFromQueryEnv(QueryDesc *queryDesc)
823
838
return true;
824
839
}
825
840
826
- static void
827
- RemoveFromQueryEnv (QueryDesc * queryDesc )
828
- {
829
- EphemeralNamedRelation enr = get_ENR (queryDesc -> queryEnv , AQOPrivateData );
830
- unregister_ENR (queryDesc -> queryEnv , AQOPrivateData );
831
- pfree (enr -> reldata );
832
- pfree (enr );
833
-
834
- /* Remove the plan state internals */
835
- enr = get_ENR (queryDesc -> queryEnv , PlanStateInfo );
836
- unregister_ENR (queryDesc -> queryEnv , PlanStateInfo );
837
- pfree (enr -> reldata );
838
- pfree (enr );
839
- }
840
-
841
841
void
842
842
print_node_explain (ExplainState * es , PlanState * ps , Plan * plan )
843
843
{
0 commit comments