]> granicus.if.org Git - postgresql/commitdiff
Support min/max index optimizations on boolean columns.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 8 Feb 2012 17:41:48 +0000 (12:41 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 8 Feb 2012 17:41:48 +0000 (12:41 -0500)
Since bool_and() is equivalent to min(), and bool_or() to max(), we might
as well let them be index-optimized in the same way.  The practical value
of this is debatable at best, but it seems nearly cost-free to enable it.
Code-wise, we need only adjust the entries in pg_aggregate.  There is a
measurable planning speed penalty for a query involving one of these
aggregates, but it is only a few percent in simple cases, so that seems
acceptable.

Marti Raudsepp, reviewed by Abhijit Menon-Sen

src/include/catalog/catversion.h
src/include/catalog/pg_aggregate.h
src/test/regress/expected/opr_sanity.out
src/test/regress/sql/opr_sanity.sql

index ea941447f547603688e827efd2afc817a2162b8e..78c3c9e81c9331770ecd2a8e8c0cb95871ace1bb 100644 (file)
@@ -53,6 +53,6 @@
  */
 
 /*                                                     yyyymmddN */
-#define CATALOG_VERSION_NO     201202082
+#define CATALOG_VERSION_NO     201202083
 
 #endif
index 0c8a20c0056a37a5440a776f22a6e721f7f6912d..adda07c6c4bd4b27c634b22234157c187afd0518 100644 (file)
@@ -205,9 +205,9 @@ DATA(insert ( 2828  float8_regr_accum       float8_covar_samp               0       1022    "{0,0,0,0,0,0}" )
 DATA(insert ( 2829     float8_regr_accum       float8_corr                             0       1022    "{0,0,0,0,0,0}" ));
 
 /* boolean-and and boolean-or */
-DATA(insert ( 2517     booland_statefunc       -                             16              _null_ ));
-DATA(insert ( 2518     boolor_statefunc        -                             16              _null_ ));
-DATA(insert ( 2519     booland_statefunc       -                             16              _null_ ));
+DATA(insert ( 2517     booland_statefunc       -                       58      16              _null_ ));
+DATA(insert ( 2518     boolor_statefunc        -                       59      16              _null_ ));
+DATA(insert ( 2519     booland_statefunc       -                       58      16              _null_ ));
 
 /* bitwise integer */
 DATA(insert ( 2236 int2and               -                                     0       21              _null_ ));
index 51ab6e5e36bf9f91e082b7c054a408e79b6a51e2..7815b0d7be4f41c329eb255f1221195360eac242 100644 (file)
@@ -774,16 +774,19 @@ WHERE a.aggfnoid = p.oid AND
 (0 rows)
 
 -- Cross-check aggsortop (if present) against pg_operator.
--- We expect to find only "<" for "min" and ">" for "max".
+-- We expect to find entries for bool_and, bool_or, every, max, and min.
 SELECT DISTINCT proname, oprname
 FROM pg_operator AS o, pg_aggregate AS a, pg_proc AS p
 WHERE a.aggfnoid = p.oid AND a.aggsortop = o.oid
-ORDER BY 1;
- proname | oprname 
----------+---------
- max     | >
- min     | <
-(2 rows)
+ORDER BY 1, 2;
+ proname  | oprname 
+----------+---------
+ bool_and | <
+ bool_or  | >
+ every    | <
+ max      | >
+ min      | <
+(5 rows)
 
 -- Check datatypes match
 SELECT a.aggfnoid::oid, o.oid
@@ -816,11 +819,14 @@ WHERE a.aggfnoid = p.oid AND a.aggsortop = o.oid AND
     amopopr = o.oid AND
     amopmethod = (SELECT oid FROM pg_am WHERE amname = 'btree')
 ORDER BY 1, 2;
- proname | oprname | amopstrategy 
----------+---------+--------------
- max     | >       |            5
- min     | <       |            1
-(2 rows)
+ proname  | oprname | amopstrategy 
+----------+---------+--------------
+ bool_and | <       |            1
+ bool_or  | >       |            5
+ every    | <       |            1
+ max      | >       |            5
+ min      | <       |            1
+(5 rows)
 
 -- Check that there are not aggregates with the same name and different
 -- numbers of arguments.  While not technically wrong, we have a project policy
index e29148fd5bd700eecb84e73fa9b37269e288286c..3ed6366bfc0e0e2ee54a93f11689eacb4d4a0ea6 100644 (file)
@@ -626,12 +626,12 @@ WHERE a.aggfnoid = p.oid AND
     NOT binary_coercible(p.proargtypes[0], a.aggtranstype);
 
 -- Cross-check aggsortop (if present) against pg_operator.
--- We expect to find only "<" for "min" and ">" for "max".
+-- We expect to find entries for bool_and, bool_or, every, max, and min.
 
 SELECT DISTINCT proname, oprname
 FROM pg_operator AS o, pg_aggregate AS a, pg_proc AS p
 WHERE a.aggfnoid = p.oid AND a.aggsortop = o.oid
-ORDER BY 1;
+ORDER BY 1, 2;
 
 -- Check datatypes match