SQL general: Changes to error messages for subqueries (Pending)¶
子查询的错误消息表现如下:
- 变更前:
当子查询返回错误时,错误消息不包含有关 SQL 代码或对象的特定信息。
- 变更后:
当某些子查询返回错误时,错误消息包含特定信息,例如以下详细信息:
子查询中不受支持的代码所在的行号和位置。
包含不受支持子查询的对象的名称(例如视图或函数)。当对象嵌套时,返回最外层对象的名称。例如,如果包含不受支持子查询的视图嵌套在安全视图中,则错误消息会显示该安全视图的名称。
包含不受支持子查询的对象类型的名称,例如掩码策略。
与子查询相关的错误代码没有变化。
备注
此行为变更不适用于横向联接或用户定义表函数 (UDTFs) 中的子查询。
示例¶
以下示例显示了子查询错误消息的变更。
创建三个表并向其中每个表插入数据:
CREATE TABLE testsub1(a INT, b INT)
AS SELECT * FROM VALUES
(1, 1),
(2, 2),
(NULL, NULL);
CREATE TABLE testsub2(x INT, y INT)
AS SELECT * FROM VALUES
(1, 1),
(2, 2),
(NULL, NULL);
CREATE TABLE testsub3(u INT, v INT)
AS SELECT * FROM VALUES
(1, 1),
(2, 2),
(NULL, NULL);
这些表用于以下示例:
不支持的子查询¶
运行返回错误的不受支持的子查询:
SELECT *
FROM testsub1
WHERE a IN(
SELECT x FROM testsub2 LEFT JOIN testsub3 ON x+a = u
);
此查询返回错误,因为相关列 a 位于左联接的 ON 子句中。
在行为变更之前,将返回以下错误:
002031 (42601): SQL compilation error:
Unsupported subquery type cannot be evaluated
行为变更后,将返回以下错误:
002031 (42601): SQL compilation error:
Unsupported subquery type cannot be evaluated at line 4, position 4
具有不受支持子查询的安全视图¶
使用不受支持的子查询创建安全视图,然后查询该视图:
CREATE SECURE VIEW svw
AS SELECT *
FROM testsub1
WHERE a IN (
SELECT x FROM testsub2 LEFT JOIN testsub3 ON x+a = u);
SELECT * FROM svw;
在行为变更之前,将返回以下错误:
002031 (42601): SQL compilation error:
Unsupported subquery type cannot be evaluated
行为变更后,将返回以下错误:
002031 (42601): SQL compilation error:
Unsupported subquery type cannot be evaluated inside VIEW object: SVW
具有不受支持子查询的掩码策略¶
使用不受支持的子查询创建掩码策略,更改表以应用该掩码策略,然后查询表:
CREATE MASKING POLICY mp AS
(i INT) RETURNS INT -> IFF(i < (SELECT MAX(a) FROM svw), i, -1);
CREATE TABLE masked_testsub1(a INT, b INT)
AS SELECT * FROM VALUES
(1, 1),
(2, 2),
(NULL, NULL);
ALTER TABLE masked_testsub1
ALTER COLUMN a SET MASKING POLICY mp;
SELECT * FROM masked_testsub1;
在行为变更之前,将返回以下错误:
002031 (42601): SQL compilation error:
Unsupported subquery type cannot be evaluated
行为变更后,将返回以下错误:
002031 (42601): SQL compilation error:
Unsupported subquery type cannot be evaluated inside MASKING POLICY
参考:2140