防止 UDF 命名冲突
通过在实施前考虑您的 UDF 命名约定,可以避免潜在的冲突和意外结果。由于可以重载函数名称,因此它们可能会与现有和将来的 Amazon Redshift 函数名称发生冲突。本主题讨论重载并介绍一种避免冲突的策略。
重载函数名称
函数由其名称和签名 标识,后者是输入参数的数目和参数的数据类型。同一 schema 中的两个函数可具有相同的名称,前提是它们的签名不同。换句话说,函数名称可以重载。
在执行查询时,查询引擎将根据您提供的参数数目和参数的数据类型来确定要调用哪个函数。您可以使用重载来模拟具有可变数量(不超过 CREATE FUNCTION 命令允许的限制)的参数的函数。
避免与内置的 Amazon Redshift 函数冲突
我们建议您使用前缀 f_
对所有 UDF 进行命名。Amazon Redshift 保留 f_
前缀专供 UDF 名称使用。通过使用 f_
为您的 UDF 名称添加前缀,您可以确保您的 UDF 名称不会与现有或未来的 Amazon Redshift 内置 SQL 函数名称冲突。例如,通过将新 UDF 命名为 f_sum
,可以避免与 Amazon Redshift SUM 函数发生冲突。同样,如果您将新函数命名为 f_fibonacci
,则当 Amazon Redshift 在将来版本中添加名为 FIBONACCI 的函数时可避免发生冲突。
您可以创建与现有 Amazon Redshift 内置 SQL 函数具有相同名称和签名的 UDF,而无需重载函数名,前提是该 UDF 和内置函数存在于不同的 schema 中。由于内置函数存在于系统目录 schema pg_catalog 中,因此您可以在另一个 schema(例如公共或用户定义的 schema)中创建具有相同名称的 UDF。在某些情况下,您可能会调用未显式限定 schema 名称的函数。如果是这样,预设情况下,Amazon Redshift 会首先搜索 pg_catalog schema。因此,内置函数在具有相同名称的新 UDF 之前运行。
您可以通过设置搜索路径以将 pg_catalog 置于结尾处来更改此行为。如果这样做,您的 UDF 会优先于内置函数,但这样做可能会导致意外结果。采用唯一命名策略(例如,使用预留前缀 f_
)是更可靠的做法。有关更多信息,请参阅SET 和search_path。