mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Add min and max aggregates for inet/cidr data types.
Haribabu Kommi, reviewed by Muhammad Asif Naeem
This commit is contained in:
		@@ -12192,7 +12192,8 @@ NULL baz</literallayout>(3 rows)</entry>
 | 
				
			|||||||
       </indexterm>
 | 
					       </indexterm>
 | 
				
			||||||
       <function>max(<replaceable class="parameter">expression</replaceable>)</function>
 | 
					       <function>max(<replaceable class="parameter">expression</replaceable>)</function>
 | 
				
			||||||
      </entry>
 | 
					      </entry>
 | 
				
			||||||
      <entry>any array, numeric, string, or date/time type</entry>
 | 
					      <entry>any numeric, string, date/time, network, or enum type,
 | 
				
			||||||
 | 
					             or arrays of these types</entry>
 | 
				
			||||||
      <entry>same as argument type</entry>
 | 
					      <entry>same as argument type</entry>
 | 
				
			||||||
      <entry>
 | 
					      <entry>
 | 
				
			||||||
       maximum value of <replaceable
 | 
					       maximum value of <replaceable
 | 
				
			||||||
@@ -12208,7 +12209,8 @@ NULL baz</literallayout>(3 rows)</entry>
 | 
				
			|||||||
       </indexterm>
 | 
					       </indexterm>
 | 
				
			||||||
       <function>min(<replaceable class="parameter">expression</replaceable>)</function>
 | 
					       <function>min(<replaceable class="parameter">expression</replaceable>)</function>
 | 
				
			||||||
      </entry>
 | 
					      </entry>
 | 
				
			||||||
      <entry>any array, numeric, string, or date/time type</entry>
 | 
					      <entry>any numeric, string, date/time, network, or enum type,
 | 
				
			||||||
 | 
					             or arrays of these types</entry>
 | 
				
			||||||
      <entry>same as argument type</entry>
 | 
					      <entry>same as argument type</entry>
 | 
				
			||||||
      <entry>
 | 
					      <entry>
 | 
				
			||||||
       minimum value of <replaceable
 | 
					       minimum value of <replaceable
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -471,6 +471,33 @@ network_ne(PG_FUNCTION_ARGS)
 | 
				
			|||||||
	PG_RETURN_BOOL(network_cmp_internal(a1, a2) != 0);
 | 
						PG_RETURN_BOOL(network_cmp_internal(a1, a2) != 0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * MIN/MAX support functions.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					Datum
 | 
				
			||||||
 | 
					network_smaller(PG_FUNCTION_ARGS)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						inet	   *a1 = PG_GETARG_INET_PP(0);
 | 
				
			||||||
 | 
						inet	   *a2 = PG_GETARG_INET_PP(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (network_cmp_internal(a1, a2) < 0)
 | 
				
			||||||
 | 
							PG_RETURN_INET_P(a1);
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							PG_RETURN_INET_P(a2);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Datum
 | 
				
			||||||
 | 
					network_larger(PG_FUNCTION_ARGS)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						inet	   *a1 = PG_GETARG_INET_PP(0);
 | 
				
			||||||
 | 
						inet	   *a2 = PG_GETARG_INET_PP(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (network_cmp_internal(a1, a2) > 0)
 | 
				
			||||||
 | 
							PG_RETURN_INET_P(a1);
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							PG_RETURN_INET_P(a2);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Support function for hash indexes on inet/cidr.
 | 
					 * Support function for hash indexes on inet/cidr.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -53,6 +53,6 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*							yyyymmddN */
 | 
					/*							yyyymmddN */
 | 
				
			||||||
#define CATALOG_VERSION_NO	201408162
 | 
					#define CATALOG_VERSION_NO	201408281
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -164,6 +164,7 @@ DATA(insert ( 2050	n 0 array_larger	-				-				-				-				f f 1073	2277	0	0		0	_nu
 | 
				
			|||||||
DATA(insert ( 2244	n 0 bpchar_larger	-				-				-				-				f f 1060	1042	0	0		0	_null_ _null_ ));
 | 
					DATA(insert ( 2244	n 0 bpchar_larger	-				-				-				-				f f 1060	1042	0	0		0	_null_ _null_ ));
 | 
				
			||||||
DATA(insert ( 2797	n 0 tidlarger		-				-				-				-				f f 2800	27		0	0		0	_null_ _null_ ));
 | 
					DATA(insert ( 2797	n 0 tidlarger		-				-				-				-				f f 2800	27		0	0		0	_null_ _null_ ));
 | 
				
			||||||
DATA(insert ( 3526	n 0 enum_larger		-				-				-				-				f f 3519	3500	0	0		0	_null_ _null_ ));
 | 
					DATA(insert ( 3526	n 0 enum_larger		-				-				-				-				f f 3519	3500	0	0		0	_null_ _null_ ));
 | 
				
			||||||
 | 
					DATA(insert ( 3564	n 0 network_larger	-				-				-				-				f f 1205	869		0	0		0	_null_ _null_ ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* min */
 | 
					/* min */
 | 
				
			||||||
DATA(insert ( 2131	n 0 int8smaller		-				-				-				-				f f 412		20		0	0		0	_null_ _null_ ));
 | 
					DATA(insert ( 2131	n 0 int8smaller		-				-				-				-				f f 412		20		0	0		0	_null_ _null_ ));
 | 
				
			||||||
@@ -186,6 +187,7 @@ DATA(insert ( 2051	n 0 array_smaller	-				-				-				-				f f 1072	2277	0	0		0	_n
 | 
				
			|||||||
DATA(insert ( 2245	n 0 bpchar_smaller	-				-				-				-				f f 1058	1042	0	0		0	_null_ _null_ ));
 | 
					DATA(insert ( 2245	n 0 bpchar_smaller	-				-				-				-				f f 1058	1042	0	0		0	_null_ _null_ ));
 | 
				
			||||||
DATA(insert ( 2798	n 0 tidsmaller		-				-				-				-				f f 2799	27		0	0		0	_null_ _null_ ));
 | 
					DATA(insert ( 2798	n 0 tidsmaller		-				-				-				-				f f 2799	27		0	0		0	_null_ _null_ ));
 | 
				
			||||||
DATA(insert ( 3527	n 0 enum_smaller	-				-				-				-				f f 3518	3500	0	0		0	_null_ _null_ ));
 | 
					DATA(insert ( 3527	n 0 enum_smaller	-				-				-				-				f f 3518	3500	0	0		0	_null_ _null_ ));
 | 
				
			||||||
 | 
					DATA(insert ( 3565	n 0 network_smaller -				-				-				-				f f 1203	869		0	0		0	_null_ _null_ ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* count */
 | 
					/* count */
 | 
				
			||||||
DATA(insert ( 2147	n 0 int8inc_any		-				int8inc_any		int8dec_any		-				f f 0		20		0	20		0	"0" "0" ));
 | 
					DATA(insert ( 2147	n 0 int8inc_any		-				int8inc_any		int8dec_any		-				f f 0		20		0	20		0	"0" "0" ));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2122,6 +2122,10 @@ DATA(insert OID = 922 (  network_le			PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 1
 | 
				
			|||||||
DATA(insert OID = 923 (  network_gt			PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "869 869" _null_ _null_ _null_ _null_	network_gt _null_ _null_ _null_ ));
 | 
					DATA(insert OID = 923 (  network_gt			PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "869 869" _null_ _null_ _null_ _null_	network_gt _null_ _null_ _null_ ));
 | 
				
			||||||
DATA(insert OID = 924 (  network_ge			PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "869 869" _null_ _null_ _null_ _null_	network_ge _null_ _null_ _null_ ));
 | 
					DATA(insert OID = 924 (  network_ge			PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "869 869" _null_ _null_ _null_ _null_	network_ge _null_ _null_ _null_ ));
 | 
				
			||||||
DATA(insert OID = 925 (  network_ne			PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "869 869" _null_ _null_ _null_ _null_	network_ne _null_ _null_ _null_ ));
 | 
					DATA(insert OID = 925 (  network_ne			PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "869 869" _null_ _null_ _null_ _null_	network_ne _null_ _null_ _null_ ));
 | 
				
			||||||
 | 
					DATA(insert OID = 3562 (  network_larger	PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 869 "869 869" _null_ _null_ _null_ _null_	network_larger _null_ _null_ _null_ ));
 | 
				
			||||||
 | 
					DESCR("larger of two");
 | 
				
			||||||
 | 
					DATA(insert OID = 3563 (  network_smaller	PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 869 "869 869" _null_ _null_ _null_ _null_	network_smaller _null_ _null_ _null_ ));
 | 
				
			||||||
 | 
					DESCR("smaller of two");
 | 
				
			||||||
DATA(insert OID = 926 (  network_cmp		PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "869 869" _null_ _null_ _null_ _null_	network_cmp _null_ _null_ _null_ ));
 | 
					DATA(insert OID = 926 (  network_cmp		PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "869 869" _null_ _null_ _null_ _null_	network_cmp _null_ _null_ _null_ ));
 | 
				
			||||||
DESCR("less-equal-greater");
 | 
					DESCR("less-equal-greater");
 | 
				
			||||||
DATA(insert OID = 927 (  network_sub		PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "869 869" _null_ _null_ _null_ _null_	network_sub _null_ _null_ _null_ ));
 | 
					DATA(insert OID = 927 (  network_sub		PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "869 869" _null_ _null_ _null_ _null_	network_sub _null_ _null_ _null_ ));
 | 
				
			||||||
@@ -3163,6 +3167,8 @@ DATA(insert OID = 2244 (  max				PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1042 "
 | 
				
			|||||||
DESCR("maximum value of all bpchar input values");
 | 
					DESCR("maximum value of all bpchar input values");
 | 
				
			||||||
DATA(insert OID = 2797 (  max				PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 27 "27" _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));
 | 
					DATA(insert OID = 2797 (  max				PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 27 "27" _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));
 | 
				
			||||||
DESCR("maximum value of all tid input values");
 | 
					DESCR("maximum value of all tid input values");
 | 
				
			||||||
 | 
					DATA(insert OID = 3564 (  max				PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 869 "869" _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));
 | 
				
			||||||
 | 
					DESCR("maximum value of all inet input values");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DATA(insert OID = 2131 (  min				PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 20 "20" _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));
 | 
					DATA(insert OID = 2131 (  min				PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 20 "20" _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));
 | 
				
			||||||
DESCR("minimum value of all bigint input values");
 | 
					DESCR("minimum value of all bigint input values");
 | 
				
			||||||
@@ -3202,6 +3208,8 @@ DATA(insert OID = 2245 (  min				PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1042 "
 | 
				
			|||||||
DESCR("minimum value of all bpchar input values");
 | 
					DESCR("minimum value of all bpchar input values");
 | 
				
			||||||
DATA(insert OID = 2798 (  min				PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 27 "27" _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));
 | 
					DATA(insert OID = 2798 (  min				PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 27 "27" _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));
 | 
				
			||||||
DESCR("minimum value of all tid input values");
 | 
					DESCR("minimum value of all tid input values");
 | 
				
			||||||
 | 
					DATA(insert OID = 3565 (  min				PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 869 "869" _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));
 | 
				
			||||||
 | 
					DESCR("minimum value of all inet input values");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* count has two forms: count(any) and count(*) */
 | 
					/* count has two forms: count(any) and count(*) */
 | 
				
			||||||
DATA(insert OID = 2147 (  count				PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 20 "2276" _null_ _null_ _null_ _null_	aggregate_dummy _null_ _null_ _null_ ));
 | 
					DATA(insert OID = 2147 (  count				PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 20 "2276" _null_ _null_ _null_ _null_	aggregate_dummy _null_ _null_ _null_ ));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -908,6 +908,8 @@ extern Datum network_eq(PG_FUNCTION_ARGS);
 | 
				
			|||||||
extern Datum network_ge(PG_FUNCTION_ARGS);
 | 
					extern Datum network_ge(PG_FUNCTION_ARGS);
 | 
				
			||||||
extern Datum network_gt(PG_FUNCTION_ARGS);
 | 
					extern Datum network_gt(PG_FUNCTION_ARGS);
 | 
				
			||||||
extern Datum network_ne(PG_FUNCTION_ARGS);
 | 
					extern Datum network_ne(PG_FUNCTION_ARGS);
 | 
				
			||||||
 | 
					extern Datum network_smaller(PG_FUNCTION_ARGS);
 | 
				
			||||||
 | 
					extern Datum network_larger(PG_FUNCTION_ARGS);
 | 
				
			||||||
extern Datum hashinet(PG_FUNCTION_ARGS);
 | 
					extern Datum hashinet(PG_FUNCTION_ARGS);
 | 
				
			||||||
extern Datum network_sub(PG_FUNCTION_ARGS);
 | 
					extern Datum network_sub(PG_FUNCTION_ARGS);
 | 
				
			||||||
extern Datum network_subeq(PG_FUNCTION_ARGS);
 | 
					extern Datum network_subeq(PG_FUNCTION_ARGS);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -204,6 +204,18 @@ SELECT '' AS ten, i, c,
 | 
				
			|||||||
     | ::4.3.2.1/24     | ::ffff:1.2.3.4/128 | t  | t  | f  | f  | f  | t  | f  | f   | t   | t   | t
 | 
					     | ::4.3.2.1/24     | ::ffff:1.2.3.4/128 | t  | t  | f  | f  | f  | t  | f  | f   | t   | t   | t
 | 
				
			||||||
(17 rows)
 | 
					(17 rows)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SELECT max(i) AS max, min(i) AS min FROM INET_TBL;
 | 
				
			||||||
 | 
					     max     |    min    
 | 
				
			||||||
 | 
					-------------+-----------
 | 
				
			||||||
 | 
					 10:23::ffff | 9.1.2.3/8
 | 
				
			||||||
 | 
					(1 row)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SELECT max(c) AS max, min(c) AS min FROM INET_TBL;
 | 
				
			||||||
 | 
					       max       |    min     
 | 
				
			||||||
 | 
					-----------------+------------
 | 
				
			||||||
 | 
					 10:23::8000/113 | 10.0.0.0/8
 | 
				
			||||||
 | 
					(1 row)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- check the conversion to/from text and set_netmask
 | 
					-- check the conversion to/from text and set_netmask
 | 
				
			||||||
SELECT '' AS ten, set_masklen(inet(text(i)), 24) FROM INET_TBL;
 | 
					SELECT '' AS ten, set_masklen(inet(text(i)), 24) FROM INET_TBL;
 | 
				
			||||||
 ten |   set_masklen    
 | 
					 ten |   set_masklen    
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -56,6 +56,9 @@ SELECT '' AS ten, i, c,
 | 
				
			|||||||
  i && c AS ovr
 | 
					  i && c AS ovr
 | 
				
			||||||
  FROM INET_TBL;
 | 
					  FROM INET_TBL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SELECT max(i) AS max, min(i) AS min FROM INET_TBL;
 | 
				
			||||||
 | 
					SELECT max(c) AS max, min(c) AS min FROM INET_TBL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- check the conversion to/from text and set_netmask
 | 
					-- check the conversion to/from text and set_netmask
 | 
				
			||||||
SELECT '' AS ten, set_masklen(inet(text(i)), 24) FROM INET_TBL;
 | 
					SELECT '' AS ten, set_masklen(inet(text(i)), 24) FROM INET_TBL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user