暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【实战干货】磐维数据库_指定分区查询时报列不存在的问题解决

原创 磐维数据库 2025-05-30
243

背景

  • 数据库版本------ 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论