From a8293d0ac80fab6f1f48f3ef7643035046fc6b0b Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Thu, 21 Jul 2022 19:20:58 +0700
Subject: [PATCH v3 6/6] Revert "Remove null comparisons from sort comparators"

This reverts commit dcffc9c8e62682b8673da61a84b6baad6d27e5f5.
---
 src/include/utils/sortsupport.h | 85 +++++++++++++++++++++++++++++++++
 1 file changed, 85 insertions(+)

diff --git a/src/include/utils/sortsupport.h b/src/include/utils/sortsupport.h
index c9a3ae41be..8c36cf8d82 100644
--- a/src/include/utils/sortsupport.h
+++ b/src/include/utils/sortsupport.h
@@ -203,6 +203,23 @@ ApplySortComparator(Datum datum1, bool isNull1,
 {
 	int			compare;
 
+	if (isNull1)
+	{
+		if (isNull2)
+			compare = 0;		/* NULL "=" NULL */
+		else if (ssup->ssup_nulls_first)
+			compare = -1;		/* NULL "<" NOT_NULL */
+		else
+			compare = 1;		/* NULL ">" NOT_NULL */
+	}
+	else if (isNull2)
+	{
+		if (ssup->ssup_nulls_first)
+			compare = 1;		/* NOT_NULL ">" NULL */
+		else
+			compare = -1;		/* NOT_NULL "<" NULL */
+	}
+	else
 	{
 		compare = ssup->comparator(datum1, datum2, ssup);
 		if (ssup->ssup_reverse)
@@ -219,6 +236,23 @@ ApplyUnsignedSortComparator(Datum datum1, bool isNull1,
 {
 	int			compare;
 
+	if (isNull1)
+	{
+		if (isNull2)
+			compare = 0;		/* NULL "=" NULL */
+		else if (ssup->ssup_nulls_first)
+			compare = -1;		/* NULL "<" NOT_NULL */
+		else
+			compare = 1;		/* NULL ">" NOT_NULL */
+	}
+	else if (isNull2)
+	{
+		if (ssup->ssup_nulls_first)
+			compare = 1;		/* NOT_NULL ">" NULL */
+		else
+			compare = -1;		/* NOT_NULL "<" NULL */
+	}
+	else
 	{
 		compare = datum1 < datum2 ? -1 : datum1 > datum2 ? 1 : 0;
 		if (ssup->ssup_reverse)
@@ -236,6 +270,23 @@ ApplySignedSortComparator(Datum datum1, bool isNull1,
 {
 	int			compare;
 
+	if (isNull1)
+	{
+		if (isNull2)
+			compare = 0;		/* NULL "=" NULL */
+		else if (ssup->ssup_nulls_first)
+			compare = -1;		/* NULL "<" NOT_NULL */
+		else
+			compare = 1;		/* NULL ">" NOT_NULL */
+	}
+	else if (isNull2)
+	{
+		if (ssup->ssup_nulls_first)
+			compare = 1;		/* NOT_NULL ">" NULL */
+		else
+			compare = -1;		/* NOT_NULL "<" NULL */
+	}
+	else
 	{
 		compare = DatumGetInt64(datum1) < DatumGetInt64(datum2) ? -1 :
 			DatumGetInt64(datum1) > DatumGetInt64(datum2) ? 1 : 0;
@@ -254,6 +305,23 @@ ApplyInt32SortComparator(Datum datum1, bool isNull1,
 {
 	int			compare;
 
+	if (isNull1)
+	{
+		if (isNull2)
+			compare = 0;		/* NULL "=" NULL */
+		else if (ssup->ssup_nulls_first)
+			compare = -1;		/* NULL "<" NOT_NULL */
+		else
+			compare = 1;		/* NULL ">" NOT_NULL */
+	}
+	else if (isNull2)
+	{
+		if (ssup->ssup_nulls_first)
+			compare = 1;		/* NOT_NULL ">" NULL */
+		else
+			compare = -1;		/* NOT_NULL "<" NULL */
+	}
+	else
 	{
 		compare = DatumGetInt32(datum1) < DatumGetInt32(datum2) ? -1 :
 			DatumGetInt32(datum1) > DatumGetInt32(datum2) ? 1 : 0;
@@ -276,6 +344,23 @@ ApplySortAbbrevFullComparator(Datum datum1, bool isNull1,
 {
 	int			compare;
 
+	if (isNull1)
+	{
+		if (isNull2)
+			compare = 0;		/* NULL "=" NULL */
+		else if (ssup->ssup_nulls_first)
+			compare = -1;		/* NULL "<" NOT_NULL */
+		else
+			compare = 1;		/* NULL ">" NOT_NULL */
+	}
+	else if (isNull2)
+	{
+		if (ssup->ssup_nulls_first)
+			compare = 1;		/* NOT_NULL ">" NULL */
+		else
+			compare = -1;		/* NOT_NULL "<" NULL */
+	}
+	else
 	{
 		compare = ssup->abbrev_full_comparator(datum1, datum2, ssup);
 		if (ssup->ssup_reverse)
-- 
2.36.1

