Re: Wrong result when enable_partitionwise_join is on if collation of PartitionKey and Column is different.
Tender Wang <tndrwang@gmail.com>
From: Tender Wang <tndrwang@gmail.com>
To: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Cc: Amit Langote <amitlangote09@gmail.com>,
jian he <jian.universality@gmail.com>
Date: 2024-10-24T02:10:38Z
Lists: pgsql-hackers
Tender Wang <tndrwang@gmail.com> 于2024年10月23日周三 21:48写道: > Hi all, > > > I think the root cause of this thread and [1] are same. We don't use the > Partition Key collation but column's > collation to fill the RelOptInfo partexprs field in > set_baserel_partition_key_exprs(). > If the Partition Key definition is same as column definition, which most > times is, > that will be ok. But if it's not, this thread issue will arise. > > As far as I know, only partition pruning logic considers not only call > equal(), but also check collation match. > Other codes only call equal() to check if the exprs match the partition > key. > For example, in this thread case, match_expr_to_partition_keys() think the > expr match the partition key: > if (equal(lfirst(lc), expr)) > return cnt; > > Although We can fix this issue like [1], I think why not directly use the > partkey->partcollation[cnt], which its value is > same with pg_partitioned_table's partcollation. I tried this to fix [1], > but at that time, I was unsure if it was the correct fix. > > Until I find this thread issue, I think we should do it this way. > In the attached patch, I include this thread test and [1] test case. > > Hi In the last email, I proposed to use partcollation directly. But I ignore the case that partkey is not a simple column reference. for expample: create table coll_pruning_multi (a text) partition by range (substr(a, 1) collate "POSIX", substr(a, 1) collate "C"); The partexprs in RelOptInfo store substr(a,1), a FuncExpr, and its collation is same with column a not collate "posix". I'm now thinking how we can use a uniform solution to fix this thread issue and issue in [1] [1] https://www.postgresql.org/message-id/18568-2a9afb6b9f7e6ed3%40postgresql.org -- Thanks, Tender Wang
Commits
-
Disallow partitionwise join when collations don't match
- 075acdd93388 18.0 landed
- a0cdfc889367 17.1 landed
- f734b6b4d0cc 16.5 landed
- 33040b1715c7 15.9 landed
- 62df5484f976 14.14 landed
- 054701a2b77a 13.17 landed
- 9c4757491683 12.21 landed
-
Disallow partitionwise grouping when collations don't match
- 90fe6251c816 18.0 landed
- b6484ca9535e 17.1 landed
- dd2f8ebee221 16.5 landed
- 0a620659c549 15.9 landed
- 96f9b29a3e1e 14.14 landed
- ff65f695c0d3 13.17 landed
- 46d9be5efb1a 12.21 landed