注册

DM8中CTAS临时表的CLOB列参与RANK排序时,不同值被错误判断为相等

Xy.Xie_WHU 2026/07/12 348 1

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:
DM Database Server 64 V8
DB Version: 0x7000d
03134284552-20260414-322369-20221
Msg Version: 1
Gsu level(5) cnt: 102
DM 管理工具
【操作系统】:
Windows 11 64 位
【CPU】:
Intel x86_64
【问题描述】*:
在 DM8 中,JSON_QUERY 的结果经过 CTAS 物化到全局临时表后,列类型为 CLOB。

对该临时表的 CLOB 列直接执行:
RANK() OVER (ORDER BY VC_0 NULLS LAST)
时,8个内容不同的 JSON 文本被错误判断为相同排序键,导致8行的排名全部为1。

相同数据通过视图或 CTE 直接执行 RANK() 时,排名为1~8,结果正确。

在临时表查询中,将 CLOB 显式转换为 VARCHAR(1000) 后再排序,排名也恢复为1~8。

实际结果对比如下:
视图: 8个不同JSON值,排名为1~8
CTE: 8个不同JSON值,排名为1~8
CTAS临时表: 8个不同JSON值,排名全部为1

该问题会改变窗口函数结果,属于查询结果正确性问题。

复现脚本
CREATE SCHEMA database0;
SET SCHEMA database0;
drop table if EXISTS T_DM_21190;
drop view if EXISTS V_DM_21190;
drop table if EXISTS TEMP_DM_21190;
drop table if EXISTS TEMPOCPR_DM_21190;

CREATE TABLE T_DM_21190 (C0 BIGINT, C1 VARCHAR2(1), C2 DECIMAL(28,12), C3 VARBINARY(8), C4 JSONB, C5 DATE, C6 TINYINT, C7 VARCHAR(16), DM_ROW_ID BIGINT NOT NULL);

INSERT INTO T_DM_21190 (C0, C1, C2, C3, C4, C5, C6, C7, DM_ROW_ID) VALUES (NULL, '', -587833531759.878811601469, 0xc68c2e4ba9316219, '{"a":6,"b":""}', DATE '2000-02-29', 114, 'GREEN', 1);
INSERT INTO T_DM_21190 (C0, C1, C2, C3, C4, C5, C6, C7, DM_ROW_ID) VALUES (293081233809, 'Y', -212673455103.036057087470, NULL, '{"nested":{"x":false}}', DATE '2000-02-29', -22, 'RED', 2);
INSERT INTO T_DM_21190 (C0, C1, C2, C3, C4, C5, C6, C7, DM_ROW_ID) VALUES (0, NULL, 420145559598.338341128421, 0xcef0c048, '[-1,null,"wSZs_"]', DATE '2035-12-31', -33, 'GREEN', 3);
INSERT INTO T_DM_21190 (C0, C1, C2, C3, C4, C5, C6, C7, DM_ROW_ID) VALUES (-20492233307, NULL, -222183176878.469876972461, 0xbe3481c5b8, '{"a":-3,"b":"F"}', DATE '2012-01-15', NULL, '', 4);
INSERT INTO T_DM_21190 (C0, C1, C2, C3, C4, C5, C6, C7, DM_ROW_ID) VALUES (252079854817, 'Y', 555778164968.956205517547, 0xa4f911b3a7ee60, '[-4,null,"wqK"]', DATE '1972-03-29', 85, NULL, 5);
INSERT INTO T_DM_21190 (C0, C1, C2, C3, C4, C5, C6, C7, DM_ROW_ID) VALUES (-576323140767, 'd', -40160179811.794435509773, 0x53, '{"nested":{"x":null}}', DATE '1983-02-27', 127, 'red', 6);
INSERT INTO T_DM_21190 (C0, C1, C2, C3, C4, C5, C6, C7, DM_ROW_ID) VALUES (0, '', NULL, 0x0e0854, '[-5,null,"1K"]', DATE '2035-12-31', 80, '', 7);
INSERT INTO T_DM_21190 (C0, C1, C2, C3, C4, C5, C6, C7, DM_ROW_ID) VALUES (-1, 'h', 475493043180.563505135763, 0x88b4ef0cb6, '[-4,null,"GBWO6"]', DATE '1999-05-05', 59, 'red', 8);
INSERT INTO T_DM_21190 (C0, C1, C2, C3, C4, C5, C6, C7, DM_ROW_ID) VALUES (NULL, '', -610064059140.540966516442, 0x5d5d42, '{"a":6,"b":"RvLe"}', DATE '2000-02-29', -114, NULL, 9);
INSERT INTO T_DM_21190 (C0, C1, C2, C3, C4, C5, C6, C7, DM_ROW_ID) VALUES (240164825865, 'P', -14335062078.478771014696, 0xddfaaf89, '{"a":10,"b":"eHtb"}', DATE '2011-05-11', -128, 'BLUE', 10);
INSERT INTO T_DM_21190 (C0, C1, C2, C3, C4, C5, C6, C7, DM_ROW_ID) VALUES (-570746747229, '', 983785313225.710527881977, 0x2b13e2fc, '{"nested":{"x":true}}', DATE '2000-02-29', 65, NULL, 11);
INSERT INTO T_DM_21190 (C0, C1, C2, C3, C4, C5, C6, C7, DM_ROW_ID) VALUES (0, NULL, 249631460310.750003410592, 0x78d68e36, '{"nested":{"x":null}}', DATE '1970-01-01', NULL, 'BLUE', 12);
INSERT INTO T_DM_21190 (C0, C1, C2, C3, C4, C5, C6, C7, DM_ROW_ID) VALUES (-924156998642, '', -987656063069.216257441949, 0x00ff, '{"a":-7,"b":".Npja3"}', NULL, NULL, 'red', 13);
INSERT INTO T_DM_21190 (C0, C1, C2, C3, C4, C5, C6, C7, DM_ROW_ID) VALUES (-940150126192, ' ', -995736871420.619096585051, 0xe5b1, '{"nested":{"x":null}}', DATE '2014-05-30', NULL, 'red', 14);
INSERT INTO T_DM_21190 (C0, C1, C2, C3, C4, C5, C6, C7, DM_ROW_ID) VALUES (-9223372036854775808, '', 428498301251.874637777553, 0x63, '{"a":-2,"b":"FxF"}', DATE '2019-06-28', -77, 'BLUE', 15);

CREATE VIEW V_DM_21190 (VC_0) AS SELECT D.VC_0 AS VC_0 FROM (SELECT JSON_QUERY(C4, '$') AS VC_0 FROM T_DM_21190 WHERE COALESCE(C0, 0) >= 0) D;
SELECT VC_0, RANK() OVER (ORDER BY VC_0 NULLS LAST) AS RK FROM V_DM_21190;

WITH CTE AS (SELECT D.VC_0 AS VC_0 FROM (SELECT JSON_QUERY(C4, '$') AS VC_0 FROM T_DM_21190 WHERE COALESCE(C0, 0) >= 0) D) SELECT VC_0, RANK() OVER (ORDER BY VC_0 NULLS LAST) AS RK FROM CTE;

CREATE GLOBAL TEMPORARY TABLE TEMP_DM_21190 ON COMMIT PRESERVE ROWS AS SELECT D.VC_0 AS VC_0 FROM (SELECT JSON_QUERY(C4, '$') AS VC_0 FROM T_DM_21190 WHERE COALESCE(C0, 0) >= 0) D;
SELECT VC_0, RANK() OVER (ORDER BY VC_0 NULLS LAST) AS RK FROM TEMP_DM_21190;

回答 0
暂无回答
扫一扫
联系客服