profile-patch-for-master.txt

text/plain

Filename: profile-patch-for-master.txt
Type: text/plain
Part: 0
Message: Re: Making empty Bitmapsets always be NULL
diff --git a/src/backend/nodes/bitmapset.c b/src/backend/nodes/bitmapset.c
index 7ba3cf635b..cd3ec14cd0 100644
--- a/src/backend/nodes/bitmapset.c
+++ b/src/backend/nodes/bitmapset.c
@@ -84,6 +84,16 @@ bms_copy(const Bitmapset *a)
 	return result;
 }
 
+static long long total = 0;
+static long long loops = 0;
+
+void
+print_profile(void)
+{
+	elog(LOG, "[bms_equal] Total %lld calls, %lld loops executed",
+		 total, loops);
+}
+
 /*
  * bms_equal - are two bitmapsets equal?
  *
@@ -99,6 +109,20 @@ bms_equal(const Bitmapset *a, const Bitmapset *b)
 	int			longlen;
 	int			i;
 
+	total++;
+	if (total % 100000 == 0)
+	{
+		/*
+		 * Print what we are comparing. We prevent too many logs by logging
+		 * only when total % 100000 == 0.
+		 */
+		char   *a_str = nodeToString(a);
+		char   *b_str = nodeToString(b);
+		elog(LOG, "[bms_equal] Comparing %s and %s", a_str, b_str);
+		pfree(a_str);
+		pfree(b_str);
+	}
+
 	/* Handle cases where either input is NULL */
 	if (a == NULL)
 	{
@@ -108,6 +132,7 @@ bms_equal(const Bitmapset *a, const Bitmapset *b)
 	}
 	else if (b == NULL)
 		return false;
+	loops++;
 	/* Identify shorter and longer input */
 	if (a->nwords <= b->nwords)
 	{
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c
index 1e4dd27dba..d0c90ef0cf 100644
--- a/src/backend/optimizer/plan/planner.c
+++ b/src/backend/optimizer/plan/planner.c
@@ -279,6 +279,7 @@ planner(Query *parse, const char *query_string, int cursorOptions,
 		result = (*planner_hook) (parse, query_string, cursorOptions, boundParams);
 	else
 		result = standard_planner(parse, query_string, cursorOptions, boundParams);
+	print_profile();
 	return result;
 }
 
diff --git a/src/include/nodes/bitmapset.h b/src/include/nodes/bitmapset.h
index 14de6a9ff1..a28b3a77b0 100644
--- a/src/include/nodes/bitmapset.h
+++ b/src/include/nodes/bitmapset.h
@@ -79,6 +79,7 @@ typedef enum
  */
 
 extern Bitmapset *bms_copy(const Bitmapset *a);
+extern void print_profile(void);
 extern bool bms_equal(const Bitmapset *a, const Bitmapset *b);
 extern int	bms_compare(const Bitmapset *a, const Bitmapset *b);
 extern Bitmapset *bms_make_singleton(int x);