0002-Utilize-memory-in-scalararraysel-in-more-optimal-man.diff.txt

text/plain

Filename: 0002-Utilize-memory-in-scalararraysel-in-more-optimal-man.diff.txt
Type: text/plain
Part: 0
Message: Re: Optimize planner memory consumption for huge arrays
diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c
index edc25d712e9..ac560b1605e 100644
--- a/src/backend/optimizer/util/clauses.c
+++ b/src/backend/optimizer/util/clauses.c
@@ -2915,7 +2915,7 @@ eval_const_expressions_mutator(Node *node,
 			 * XXX should we ereport() here instead?  Probably this routine
 			 * should never be invoked after SubPlan creation.
 			 */
-			return node;
+			return CopyObject(node);
 		case T_RelabelType:
 			{
 				RelabelType *relabel = (RelabelType *) node;
diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index cea777e9d40..e5bad75ec1c 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -281,6 +281,7 @@ eqsel_internal(PG_FUNCTION_ARGS, bool negate)
 		selec = var_eq_non_const(&vardata, operator, collation, other,
 								 varonleft, negate);
 
+	pfree(other);
 	ReleaseVariableStats(vardata);
 
 	return selec;
@@ -1961,15 +1962,15 @@ scalararraysel(PlannerInfo *root,
 		{
 			List	   *args;
 			Selectivity s2;
-
-			args = list_make2(leftop,
-							  makeConst(nominal_element_type,
-										-1,
-										nominal_element_collation,
-										elmlen,
-										elem_values[i],
-										elem_nulls[i],
-										elmbyval));
+			Const *c = makeConst(nominal_element_type,
+								-1,
+								nominal_element_collation,
+								elmlen,
+								elem_values[i],
+								elem_nulls[i],
+								elmbyval);
+
+			args = list_make2(leftop, c);
 			if (is_join_clause)
 				s2 = DatumGetFloat8(FunctionCall5Coll(&oprselproc,
 													  clause->inputcollid,
@@ -1985,7 +1986,8 @@ scalararraysel(PlannerInfo *root,
 													  ObjectIdGetDatum(operator),
 													  PointerGetDatum(args),
 													  Int32GetDatum(varRelid)));
-
+			list_free(args);
+			pfree(c);
 			if (useOr)
 			{
 				s1 = s1 + s2 - s1 * s2;
@@ -2004,6 +2006,9 @@ scalararraysel(PlannerInfo *root,
 		if ((useOr ? isEquality : isInequality) &&
 			s1disjoint >= 0.0 && s1disjoint <= 1.0)
 			s1 = s1disjoint;
+
+		pfree(elem_values);
+		pfree(elem_nulls);
 	}
 	else if (rightop && IsA(rightop, ArrayExpr) &&
 			 !((ArrayExpr *) rightop)->multidims)
@@ -2052,6 +2057,7 @@ scalararraysel(PlannerInfo *root,
 													  ObjectIdGetDatum(operator),
 													  PointerGetDatum(args),
 													  Int32GetDatum(varRelid)));
+			list_free(args);
 
 			if (useOr)
 			{