【标题】(请简要描述下实现的内容)
修复UserVar无效collation的问题
【实现内容】:
修复UserVar无效collation的问题
【根因分析】:
问题用例的如下,实际上存在两个问题。

--在带dolphin的B库下执行
set enable_set_variable_b_format=on;
drop table if exists my_table_1162250;
-- 创建一个示例表
CREATE TABLE my_table_1162250 (
id INT,
name VARCHAR(50),
manager_id INT
);
-- 插入一些示例数据
INSERT INTO my_table_1162250 (id, name, manager_id) VALUES (1, 'Alice', NULL);
INSERT INTO my_table_1162250 (id, name, manager_id) VALUES (2, 'Bob', 1);
INSERT INTO my_table_1162250 (id, name, manager_id) VALUES (3, 'Charlie', 1);
INSERT INTO my_table_1162250 (id, name, manager_id) VALUES (4, 'David', 2);
INSERT INTO my_table_1162250 (id, name, manager_id) VALUES (5, 'Eve', 2);
--查询表数据
select* from my_table_1162250;

问题1:

set  @manager_id := 1;
SELECT FIND_IN_SET(manager_id, @manager_id) > 0 from my_table_1162250;

输入图片说明
find_in_set的第一个参数为Numeric,数字类型默认没有collation,第二个参数为UserVal,用例里是int8类型,而函数第二个参数为text,因此多了一层类型转换(代码如下),此时UserVal->value是FuncExpr类型了。
输入图片说明
而在获取UserVal的collation时,直接转成Const获取constcollid,导致取到了无效值0xFFFFFFFF。因此需要增加类型判断,转换成FuncExpr获取collation。但是改完之后用例仍然会报错,与问题2一致。
问题2:

SELECT
@manager_id := id AS employee_id,
name,
@level := @level + 1 AS level
FROM
my_table_1162250,
(SELECT @manager_id := 1, @level := 0) AS vars
WHERE
FIND_IN_SET(manager_id, @manager_id) > 0
ORDER BY
level;

输入图片说明
UserVal的类型是text类型,因此可以直接作为find_in_set的第二个参数,无需做类型转换。但是其constcollid没有赋值,导致获取到无效的collation,因此需要获取类型默认的collation。
【实现方案】:

【关联需求或issue】:
https://e.gitee.com/opengaussorg/dashboard?issue=I9IJDW
【开发自验报告】:

  1. 请附上自验结果(内容或者截图)
    输入图片说明
  2. 是否可以添加fastcheck测试用例,如是,请补充fastcheck用例
    用例需要在有dolphin的B库下执行,server用例无法看护
  3. 是否涉及资料修改,如是,在docs仓库补充资料
  4. 是否考虑升级场景(系统表修改、日志持久化以及修改执行态数据格式)
  5. 是否考虑在线扩容等扩展场景
  6. 是否考虑异常场景/并发场景/前向兼容/性能场景
  7. 是否对其他模块产生影响

【其他说明】: