已关闭
[Bug]: ogsql Tab 列补全未按 FROM 表限定且空前缀系统列噪声过重 #290
wuchenlong创建于  7月27日关闭于  23 天前
wuchenlong
wuchenlong成员
7月27日 创建

测试类型

工具功能

测试版本

7.0.0-LTS

操作系统和硬件信息

openEuler 20.03 aarch64

测试环境

oGRAC双节点

被测功能

ogsql Readline Tab 列名补全(按 SQL 上下文)

预置条件

oGRAC 双节点 ONLINE;TTY 交互 ogsql / as sysdba;已创建业务表 rl_emp(emp_id,emp_name,…)rl_dept(dept_id,dept_name,dept_loc)。官方说明:连接后根据 FROM/JOIN/SELECT 等上下文补全列名;需求设计 COLUMN 语境查询当前用户表列。

操作步骤

-- 在 SQL> 下分别输入后按一次 Tab(不 Enter)

-- A. FROM 已指定 rl_dept,却用另一张表列前缀
select * from rl_dept where emp_

-- B. 尚无 FROM,直接列前缀
select emp_

-- C. WHERE 后空前缀
select * from rl_emp where 

预期输出

A. 候选应来自 rl_dept 列(dept_*),不应出现仅属于 rl_emp 的 emp_*
B. 尚无表上下文时,不应直接给出具体业务表列名(或需文档明确为「当前用户全局列」)
C. 空前缀应优先/主要展示当前 FROM 表列;不应被大量系统列(如 FROZEN_STATUS)淹没

与 #288(select * frofrozen_status)同源:列候选池过宽且未按语句表过滤。

实际输出

A. 候选出现 EMP_DEPT_ID EMP_SALARY EMP_HIRE_DATE EMP_NAME EMP_ID
   (rl_dept 并无这些列;对照 … where dept_ 则正确出现 DEPT_*)
B. select emp_ + Tab → 同样列出 EMP_*
C. where 后空格 + Tab → 刷出 THRESHOLD / PARENT_PART# / FROZEN_STATUS / OID / ARGUMENT_NAME 等大量系统列,业务列难见

日志信息

提单组织

测试团队

likedislike
wuchenlongwuchenlong成员
7月27日 添加了label:bug
opengauss_bot
opengauss_bot成员
7月27日 评论:

This issue requires an assignee. Since you haven't specified one, we've assigned TestManager as the default assignee for this issue.

likedislike
opengauss_botopengauss_bot成员
7月27日 将 TestManager 设为负责人
opengauss_botopengauss_bot成员
7月27日 添加了label:sig/StorageEngine
opengauss_bot
opengauss_bot成员
7月27日 评论:

Welcome To openGauss Community

Hey @wuchenlong , thanks for your contribution to the community.

Bot Usage Manual

I'm the Bot here serving you. You can find the instructions on how to interact with me at Here . That means you can comment below every pull request or issue to trigger Bot Commands.

Contact Guide

If you have any questions, please contact the SIG: StorageEngine ,
and any of the maintainers: @CarrotGo, @chendong76, @chenxiaobin19, @congzhou2603, @dodders, @hwworkholic, @jemappellehc, @muyulinzhong, @quemingjian, @shenzheng4, @shirley_zhengx, @superlchf, @totaj, @wlff234, @wofanzheng, @ywzq1161327784 ,
and any of the committers: @CityYard, @libiao2024, @lijieac, @theothersideofsea, @wang_bowen, @weithu, @xiong_xjun, @yuanyazhi, @zhangzq131 .

likedislike
wuchenlong
wuchenlong成员
7月27日 评论:

补充手工测试(用户 2026-07-27)

输入 + Tab ogsql 实测
限定表名列 select * from test1,sys_views where test1. 不补 test1 的列
JOIN ON 限定表 select * from test1 join sys_views on test1. 不补列

与 #290 列上下文未按 qualified table prefix 过滤同源;多行 WHERE 场景另见 #297

likedislike
wuchenlongwuchenlong成员
7月27日 修改了issue 的描述
此处折叠了8条事件消息 查看更多
leweiyangleweiyang成员
29 天前 关联了pull request:完善 SQL 对象上下文、类型及函数补全(#289、#290、#295、#299、#301)
leweiyang
leweiyang成员
26 天前 评论:

已修复,功能正常

image.png

-- 清理旧对象(如存在)
DROP TABLE IF EXISTS rl_emp CASCADE;
DROP TABLE IF EXISTS rl_dept CASCADE;

-- 创建员工表 rl_emp
CREATE TABLE rl_emp (
emp_id INT PRIMARY KEY,
emp_name VARCHAR(50),
emp_dept_id INT,
emp_salary DECIMAL(10,2),
emp_hire_date DATE
);

-- 创建部门表 rl_dept
CREATE TABLE rl_dept (
dept_id INT PRIMARY KEY,
dept_name VARCHAR(50),
dept_loc VARCHAR(100)
);

-- 插入少量数据(可选)
INSERT INTO rl_emp VALUES (1, 'Alice', 10, 5000, '2020-01-15');
INSERT INTO rl_emp VALUES (2, 'Bob', 20, 6000, '2019-03-20');
INSERT INTO rl_dept VALUES (10, 'HR', 'Building A');
INSERT INTO rl_dept VALUES (20, 'IT', 'Building B');
COMMIT;

-- 场景A,FROM已指定rl_dept,却用另一张表的列前缀。输入以下语句后,在 emp_ 处按一次 Tab
select * from rl_dept where emp_
image.png

-- 场景 B:尚无 FROM 子句,直接列前缀。输入以下语句后,在 emp_ 处按一次 Tab
select emp_
image.png

-- 场景 C:WHERE 后空前缀(无输入)。输入以下语句后,在 where 后的空格处按一次 Tab
select * from rl_emp where
image.png

likedislike
leweiyangleweiyang成员
24 天前 issue状态由 待办的 改变为 待回归
wuchenlong
wuchenlong成员
23 天前 评论:

回归版本:oGRAC Release 7.0.0-RC3 18ce0a2 build 2026-08-26 09:48:01
回归环境:oGRAC 双节点(20.20.20.104 / 20.20.20.106),db=ONLINE,节点 20.20.20.104 执行
结论:通过(列补全按 FROM 表限定;WHERE 空前缀不再刷出 FROZEN_STATUS

回归步骤ogsql / as sysdba,Linux TTY)

SQL> select * from rl_dept where emp_<Tab>   -- 不应出现 EMP_SALARY
SQL> select * from rl_dept where dept_<Tab> -- 应出现 dept_name
SQL> select * from test1 join rl_emp on test1.<Tab>
SQL> select * from rl_emp where <Tab>       -- 不应出现 FROZEN_STATUS

实际输出
他表列 EMP_SALARY 不再出现在 rl_dept 语境;本表列可补;WHERE 空前缀补到 EMP_*,未见系统列 FROZEN_STATUS

likedislike
wuchenlongwuchenlong成员
23 天前 issue状态由 待回归 改变为 已验收
wuchenlongwuchenlong成员
23 天前 关闭了 issue