背景
- 数据库版本------ 3.1.0
- 模式------------- A
问题
指定分区查询时,报 ERROR: column “xx” does not exist:
select * from xxxx.xxxx_xxxxxxxxx parttion(p_20250531) where record_id = 123456789;
SQL 错误 [9092] [42703]: ERROR: column "record_id" does not exist
Position: 69
分析
复现
改写客户提供的例子,发现以下语句可复现问题:
CREATE TABLE test_0529 (
id int,
name text,
created_date DATE
)
PARTITION BY RANGE (created_date) (
PARTITION p1 VALUES LESS THAN (TO_DATE('2023-01-01', 'YYYY-MM-DD')),
PARTITION p2 VALUES LESS THAN (MAXVALUE)
);
zc_test=# select * from test_0529 parttion(p1) where id=1;
ERROR: column "id" does not exist
LINE 1: select * from test_0529 parttion(p1) where id=1;
^
同时发现,只有 where 条件里是第一列时,才会报错:
zc_test=# select * from test_0529 parttion(p1) where name=1;
p1 | name | created_date
----+------+--------------
(0 rows)
拿到 Oracle 上运行,也报错,不过报错内容不一样,发现 partition 关键字被写错为 parttion:
SQL> select * from test_0529 parttion(p1) where id=1;
select * from test_0529 parttion(p1) where id=1
*
ERROR at line 1:
ORA-00933: SQL command not properly ended
修改后语句正常执行。在磐维执行,报错也消失,可见问题根因为拼写错误:
zc_test=# select * from test_0529 partition(p1) where id=1;
id | name | created_date
----+------+--------------
(0 rows)
为何 partition 拼写错误时,报错内容为列不存在?
select 语句在 pg 文档中的部分定义:
where _`from_item`_ can be one of:
[ ONLY ] _`table_name`_ [ * ] [ [ AS ] _`alias`_ [ ( _`column_alias`_ [, ...] ) ] ]
以下方语句为例,t1 是表别名,t2 是 id 列的别名:
create table t_0530(
id int,
name varchar(50)
);
insert into t_0530 values (1, 'a');
insert into t_0530 values (2, 'b');
zc_test=# select * from t_0530 t1(t2);
t2 | name
----+------
1 | a
2 | b
(2 rows)
可见,在原始语句中,当 partition 关键字被写错为 parttion 时,实际 parttion 被解析为表别名,而不是关键字,同时 p1 被解析为 id 列的别名,所以在where 条件中找不到 id 列:
select * from test_0529 parttion(p1) where id=1;
插入数据(p1, p2各两条),去掉where条件再次执行,结果为全表而非p1分区的数据,可以印证结论:
zc_test=# select * from test_0529 parttion(p1);
p1 | name | created_date
----+------+---------------------
1 | a | 2021-01-01 00:00:00
2 | b | 2022-01-01 00:00:00
3 | c | 2024-01-01 00:00:00
4 | d | 2025-01-01 00:00:00
(4 rows)
在 Oracle 中,不支持这种语法,所以报了其他错误:
SQL> select * from t_0530 t1(t2);
select * from t_0530 t1(t2)
*
ERROR at line 1:
ORA-00933: SQL command not properly ended
解决
partition 关键字写错为 parttion 导致,修改后解决。
其他
从上面的分析可以看出,如果 partition 关键字写错,则很有可能会从指定分区查询变成全表查询,为社区issue:https://gitee.com/opengauss/openGauss-server/issues/I92ZYR
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




