@@ -786,7 +786,7 @@ jsonAnalyzePathFetch(VacAttrStatsP stats, int rownum, bool *isnull)
786
786
*/
787
787
static void
788
788
jsonAnalyzePathValues (JsonAnalyzeContext * ctx , JsonScalarStats * sstats ,
789
- Oid typid , double freq )
789
+ Oid typid , double freq , bool use_anl_context )
790
790
{
791
791
JsonValues * values = & sstats -> values ;
792
792
VacAttrStats * stats = & sstats -> stats ;
@@ -805,7 +805,7 @@ jsonAnalyzePathValues(JsonAnalyzeContext *ctx, JsonScalarStats *sstats,
805
805
stats -> attrtypid = typid ;
806
806
stats -> attrtypmod = -1 ;
807
807
stats -> attrtype = & type ;
808
- stats -> anl_context = ctx -> stats -> anl_context ;
808
+ stats -> anl_context = use_anl_context ? ctx -> stats -> anl_context : CurrentMemoryContext ;
809
809
810
810
stats -> exprvals = values -> buf ;
811
811
@@ -1064,23 +1064,25 @@ jsonAnalyzePath(JsonAnalyzeContext *ctx, JsonPathAnlStats *pstats,
1064
1064
jsonAnalyzeCalcPathFreq (ctx , pstats , parent_stats );
1065
1065
1066
1066
/* values combining all object types */
1067
- jsonAnalyzePathValues (ctx , & vstats -> jsons , JSONBOID , pstats -> freq );
1067
+ jsonAnalyzePathValues (ctx , & vstats -> jsons , JSONBOID , pstats -> freq ,
1068
+ /* store root stats in analyze context */
1069
+ !parent_stats );
1068
1070
1069
1071
/*
1070
1072
* Lengths and array lengths. We divide counts by the total number of json
1071
1073
* values to compute correct nullfrac (i.e. not all jsons have lengths).
1072
1074
*/
1073
1075
jsonAnalyzePathValues (ctx , & vstats -> arrlens , INT4OID ,
1074
1076
pstats -> freq * vstats -> arrlens .values .count /
1075
- vstats -> jsons .values .count );
1077
+ vstats -> jsons .values .count , false );
1076
1078
jsonAnalyzePathValues (ctx , & vstats -> objlens , INT4OID ,
1077
1079
pstats -> freq * vstats -> objlens .values .count /
1078
- vstats -> jsons .values .count );
1080
+ vstats -> jsons .values .count , false );
1079
1081
1080
1082
#ifdef JSON_ANALYZE_SCALARS
1081
1083
/* stats for values of string/numeric types only */
1082
- jsonAnalyzePathValues (ctx , & vstats -> strings , TEXTOID , pstats -> freq );
1083
- jsonAnalyzePathValues (ctx , & vstats -> numerics , NUMERICOID , pstats -> freq );
1084
+ jsonAnalyzePathValues (ctx , & vstats -> strings , TEXTOID , pstats -> freq , false );
1085
+ jsonAnalyzePathValues (ctx , & vstats -> numerics , NUMERICOID , pstats -> freq , false );
1084
1086
#endif
1085
1087
1086
1088
/* Build jsonb with path stats */
0 commit comments