C++ 示例:从检查约束调用 UDSF
此示例显示了创建可由检查约束调用的 UDSF 所需的 C++ 代码。示例函数的名称是 LargestSquareBelow
。此示例函数确定其平方小于主题列中的数字的最大数字。例如,如果该列中的数字是 1000,则其平方 (961) 小于 1000 的最大数字是 31。
重要
在检查约束中使用的 UDSF 必须是不可变的,并且该约束必须能够正确处理 null 值。否则,检查约束可能无法按预期工作。此外,Vertica 还会评估在已加载或更新的每个行上启用的检查约束的谓词,因此请考虑编写函数时的性能。有关检查约束的信息,请参阅检查约束。
加载和使用示例
以下示例显示了如何使用 CREATE LIBRARY 创建和加载名为 MySqLib 的库。将此示例中的库路径调整为绝对路径,并将文件名调整为共享对象 LargestSquareBelow
保存到的位置。
创建库:
=> CREATE OR REPLACE LIBRARY MySqLib AS '/home/dbadmin/LargestSquareBelow.so';
- 创建并加载库之后,使用 CREATE FUNCTION(标量) 语句将函数添加到编录中:
=> CREATE OR REPLACE FUNCTION largestSqBelow AS LANGUAGE 'C++' NAME 'LargestSquareBelowInfo' LIBRARY MySqLib;
- 下一步,将 UDSF 包含到检查约束中。
=> CREATE TABLE squaretest(
ceiling INTEGER UNIQUE,
CONSTRAINT chk_sq CHECK (largestSqBelow(ceiling) < ceiling*ceiling)
);
- 将数据添加到表
squaretest
中:
=> COPY squaretest FROM stdin DELIMITER ','NULL'null';
-1
null
0
1
1000
1000000
1000001
\.
根据所使用的数据,输出应类似于以下示例:
SELECT ceiling, largestSqBelow(ceiling)
FROM squaretest ORDER BY ceiling;
ceiling | largestSqBelow
---------+----------------
|
-1 |
0 |
1 | 0
1000 | 31
1000000 | 999
1000001 | 1000
(7 rows)
ScalarFunction 实施
此 ScalarFunction
实施为 UDSF 执行处理工作,即确定其平方小于数字输入的最大数字。
ScalarFunctionFactory 实施
此 ScalarFunctionFactory
实施执行对输入和输出的处理工作,并将函数标记为不可变(如果计划在检查约束中使用 UDSF,则必须满足此要求)。
RegisterFactory 宏
使用 RegisterFactory
宏注册一个 ScalarFunctionFactory
子类。该宏将对工厂类进行实例化并将其包含的元数据供 Vertica 访问。要调用该宏,请将您的工厂类的名称传递给它。
RegisterFactory(LargestSquareBelowInfo);