mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Fix ndistinct estimates with system attributes
When estimating the number of groups using extended statistics, the code
was discarding information about system attributes. This led to strange
situation that
    SELECT 1 FROM t GROUP BY ctid;
could have produced higher estimate (equal to pg_class.reltuples) than
    SELECT 1 FROM t GROUP BY a, b, ctid;
with extended statistics on (a,b). Fixed by retaining information about
the system attribute.
Backpatch all the way to 10, where extended statistics were introduced.
Author: Tomas Vondra
Backpatch-through: 10
			
			
This commit is contained in:
		@@ -3743,10 +3743,10 @@ estimate_multivariate_ndistinct(PlannerInfo *root, RelOptInfo *rel,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			attnum = ((Var *) varinfo->var)->varattno;
 | 
								attnum = ((Var *) varinfo->var)->varattno;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (!AttrNumberIsForUserDefinedAttr(attnum))
 | 
								if (AttrNumberIsForUserDefinedAttr(attnum) &&
 | 
				
			||||||
 | 
									bms_is_member(attnum, matched))
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (!bms_is_member(attnum, matched))
 | 
					 | 
				
			||||||
			newlist = lappend(newlist, varinfo);
 | 
								newlist = lappend(newlist, varinfo);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -222,7 +222,7 @@ SELECT s.stxkind, d.stxdndistinct
 | 
				
			|||||||
SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY ctid, a, b');
 | 
					SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY ctid, a, b');
 | 
				
			||||||
 estimated | actual 
 | 
					 estimated | actual 
 | 
				
			||||||
-----------+--------
 | 
					-----------+--------
 | 
				
			||||||
        11 |   1000
 | 
					      1000 |   1000
 | 
				
			||||||
(1 row)
 | 
					(1 row)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- Hash Aggregate, thanks to estimates improved by the statistic
 | 
					-- Hash Aggregate, thanks to estimates improved by the statistic
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user