1
0
mirror of https://github.com/postgres/postgres.git synced 2025-12-21 05:21:08 +03:00

Expand virtual generated columns in constraint expressions

Virtual generated columns in constraint expressions need to be
expanded because the optimizer matches these expressions to qual
clauses.  Failing to do so can cause us to miss opportunities for
constraint exclusion.

Author: Richard Guo <guofenglinux@gmail.com>
Discussion: https://www.postgresql.org/message-id/flat/204804c0-798f-4c72-bd1f-36116024fda3%40eisentraut.org
This commit is contained in:
Peter Eisentraut
2025-09-15 16:27:50 +02:00
parent 38883916e4
commit e7a2bbdb52
3 changed files with 47 additions and 0 deletions

View File

@@ -42,6 +42,7 @@
#include "parser/parse_relation.h" #include "parser/parse_relation.h"
#include "parser/parsetree.h" #include "parser/parsetree.h"
#include "partitioning/partdesc.h" #include "partitioning/partdesc.h"
#include "rewrite/rewriteHandler.h"
#include "rewrite/rewriteManip.h" #include "rewrite/rewriteManip.h"
#include "statistics/statistics.h" #include "statistics/statistics.h"
#include "storage/bufmgr.h" #include "storage/bufmgr.h"
@@ -1392,6 +1393,14 @@ get_relation_constraints(PlannerInfo *root,
result = list_concat(result, rel->partition_qual); result = list_concat(result, rel->partition_qual);
} }
/*
* Expand virtual generated columns in the constraint expressions.
*/
if (result)
result = (List *) expand_generated_columns_in_expr((Node *) result,
relation,
varno);
table_close(relation, NoLock); table_close(relation, NoLock);
return result; return result;

View File

@@ -1614,3 +1614,26 @@ select * from gtest32 t group by grouping sets (a, b, c, d, e) having c = 20;
-- Ensure that the virtual generated columns in ALTER COLUMN TYPE USING expression are expanded -- Ensure that the virtual generated columns in ALTER COLUMN TYPE USING expression are expanded
alter table gtest32 alter column e type bigint using b; alter table gtest32 alter column e type bigint using b;
drop table gtest32; drop table gtest32;
-- Ensure that virtual generated columns in constraint expressions are expanded
create table gtest33 (a int, b int generated always as (a * 2) virtual not null, check (b > 10));
set constraint_exclusion to on;
-- should get a dummy Result, not a seq scan
explain (costs off)
select * from gtest33 where b < 10;
QUERY PLAN
--------------------------
Result
One-Time Filter: false
(2 rows)
-- should get a dummy Result, not a seq scan
explain (costs off)
select * from gtest33 where b is null;
QUERY PLAN
--------------------------
Result
One-Time Filter: false
(2 rows)
reset constraint_exclusion;
drop table gtest33;

View File

@@ -859,3 +859,18 @@ select * from gtest32 t group by grouping sets (a, b, c, d, e) having c = 20;
alter table gtest32 alter column e type bigint using b; alter table gtest32 alter column e type bigint using b;
drop table gtest32; drop table gtest32;
-- Ensure that virtual generated columns in constraint expressions are expanded
create table gtest33 (a int, b int generated always as (a * 2) virtual not null, check (b > 10));
set constraint_exclusion to on;
-- should get a dummy Result, not a seq scan
explain (costs off)
select * from gtest33 where b < 10;
-- should get a dummy Result, not a seq scan
explain (costs off)
select * from gtest33 where b is null;
reset constraint_exclusion;
drop table gtest33;