VastbaseE100

基于开源技术的HTAP数据库管理系统。性能优异,稳定可靠,提供诸多专属领域特性。

Menu

CREATE CAST

CREATE CAST - 定义一个新的强制转换

语法格式

CREATE CAST (source_type AS target_type)
    WITH FUNCTION function_name [ (argument_type [, ...]) ]
    [ AS ASSIGNMENT | AS IMPLICIT ]

CREATE CAST (source_type AS target_type)
    WITHOUT FUNCTION
    [ AS ASSIGNMENT | AS IMPLICIT ]

CREATE CAST (source_type AS target_type)
    WITH INOUT
    [ AS ASSIGNMENT | AS IMPLICIT ]

说明

CREATE CAST定义一种强制转换。 指定如何在两种数据类型之间执行转换。例如,

SELECT CAST(42 AS float8);

通过调用先前指定的函数(在本例中为 float8(int4) )将整数常量42转换为类型float8 。 (如果未定义合适的强制转换,则转换失败。)

两种类型可以是二进制可强制的,这意味着可以”免费”执行转换而无需调用任何函数。这要求相应的值使用相同的内部表示。例如,类型text 和 varchar两种方式都是二进制可强制的。二元强制性不一定是对称关系。例如,在本实现中可以免费执行从xml 到 text 的强制转换,但是反向需要至少执行语法检查的函数。(两种方式都是二进制可强制的两种类型也称为二进制兼容。)

您可以使用 WITH INOUT 语法将强制转换定义为I /O转换强制转换。通过调用源数据类型的输出函数并将结果字符串传递给目标数据类型的输入函数来执行I/O转换转换。在许多常见情况下,此功能避免了为转换编写单独的强制转换函数的需要。I / O转换强制转换与基于函数的常规强制转换相同;只有实施是不同的。

默认情况下,只能通过显式强制转换请求调用强制转换,即显式 CAST(x AS typename) 或 x :: typename 构造。

如果强制转换标记为 AS ASSIGNMENT,则在为目标数据类型的列分配值时可以隐式调用它。例如,假设 foo.f1 是text 类型的列,则:

INSERT INTO foo (f1) VALUES (42);

如果从类型 integer 到类型 text 的强制转换被标记为 AS ASSIGNMENT,则将被允许,否则不被允许。(我们通常使用术语赋值转换来描述这种类型的演员。)

如果强制转换标记为 AS IMPLICIT,则可以在任何上下文中隐式调用它,无论是赋值还是内部表达式。(我们通常使用术语隐式转换来描述这种类型的转换。)例如,考虑以下查询:

SELECT 2 + 4.0;

解析器最初将常量标记为类型 integer 和 numeric 。系统目录中没有 integer +numeric 运算符,但有一个 numeric + numeric 运算符。因此,如果从 integer到 numeric 的强制转换可用且标记为 AS IMPLICIT ,则查询将成功 -实际上它是。解析器将应用隐式转换并解析查询,就像它已被写入一样

SELECT CAST ( 2 AS numeric ) + 4.0;

现在,目录还提供从 numeric 到 integer 的强制转换。如果该演员被标记为 ASIMPLICIT - 它不是 - 那么解析器将面临在上述解释和将 numeric 常量转换为integer 并应用 integer + integer运算符的替代方案之间进行选择。由于缺乏任何选择的知识,它会放弃并声明查询不明确。事实上两个演员中只有一个是隐含的我们教导解析器更喜欢将numeric - 和 integer 混合表达式解析为 numeric 的方式;没有内置的知识。

保守标记演员是隐含的是明智的。过多的隐式转换路径可能会导致Vastbase E100选择令人惊讶的命令解释,或者根本无法解析命令,因为有多种可能的解释。一个好的经验法则是,只允许在同一类型类别中的类型之间保留信息的隐式调用。例如,从int2 到 int4 的强制转换可以合理地隐含,但是从 float8 到 int4的强制转换应该只是赋值。跨类型类型转换,例如 text 到 int4 ,最好只显示。

注意

有时,由于可用性或符合标准的原因,在一组类型中提供多个隐式转换是必要的,从而导致如上所述无法避免的模糊性。解析器具有基于类型类别和优选类型的回退启发式,可以帮助在这种情况下提供所需的行为。有关更多信息,请参阅CREATE TYPE。

为了能够创建强制转换,您必须拥有源或目标数据类型,并且对另一种类型具有USAGE 特权。要创建二进制可强制转换,您必须是超级用户。(这种限制是因为错误的二进制可强制转换转换很容易使服务器崩溃。)

参数说明

  • source_type

    该造型的源数据类型的名称。

  • target_type

    该造型的目标数据类型的名称。

  • function_name[(argument_type [, …])]

    被用于执行该造型的函数。函数名称可以用模式限定。如果没有被限定, 将在模式搜索路径中查找该函数。函数的结果数据类型必须是该造型的 目标数据类型。它的参数讨论如下。 如果没有指定参数列表,则该函数名称在其模式中必须是唯一的。

  • WITHOUT FUNCTION

    指示源类型可以二进制强制到目标类型,因此执行该造型不需要函数。

  • WITH INOUT

    指示该造型是一种 I/O 转换造型,执行需要调用源数据类型的输出函数, 并且把结果字符串传递给目标数据类型的输入函数。

  • AS ASSIGNMENT

    指示该造型可以在赋值的情况下被隐式调用。

  • AS IMPLICIT

    指示该造型可以在任何上下文中被隐式调用。

Cast实现函数可以有一到三个参数说明。第一个参数说明类型必须与cast的源类型相同或二元可强制。第二个参数说明(如果存在)必须是integer ;它接收与目标类型关联的类型修饰符,如果没有则接收 -1。第三个参数说明(如果存在)必须是 boolean;如果演员阵容是一个显式演员阵容,它会收到 true ,否则收到 false 。(奇怪的是,在某些情况下,SQL标准要求显式和隐式转换的不同行为。这个参数说明是为必须实现这种转换的函数提供的。不建议您设计自己的数据类型,这一点很重要。)

转换函数的返回类型必须与转换的目标类型相同或二元可强制转换。

通常,强制转换必须具有不同的源和目标数据类型。但是,如果具有包含多个参数说明的强制转换实现函数,则允许声明具有相同源和目标类型的强制转换。这用于表示系统目录中特定于类型的长度强制函数。命名函数用于将类型的值强制转换为其第二个参数说明给定的类型修饰符值。

当转换具有不同的源和目标类型以及具有多个参数说明的函数时,它支持从一种类型转换为另一种类型并在一个步骤中应用长度强制。当没有这样的条目可用时,强制使用类型修饰符的类型涉及两个强制转换步骤,一个用于在数据类型之间进行转换,另一个用于应用修饰符。

当前对域类型的强制转换无效。转换到域或从域转换使用与其基础类型关联的转换。

注意事项

使用 DROP CAST删除用户定义的强制转换。

请记住,如果您希望能够以两种方式转换类型,则需要明确声明两种方式。

通常不需要在用户定义的类型和标准字符串类型( text , varchar 和 char(n),以及定义为字符串类别的用户定义类型)之间创建强制类型转换。 Vastbase E100为此提供自动I /O转换转换。自动转换为字符串类型被视为赋值转换,而字符串类型的自动转换仅为显式转换。您可以通过覆盖此行为声明自己的强制转换替换自动强制转换,但通常唯一的理由是,如果您希望转换比标准的仅赋值或仅显式设置更容易调用。另一个可能的原因是您希望转换的行为与类型的I/ O功能不同;但这是令人惊讶的,你应该三思而后行是否是一个好主意。(少数内置类型确实具有不同的转换行为,主要是因为SQL标准的要求。)

虽然不是必需的,但建议您继续遵循目标数据类型之后命名强制转换实现函数的旧约定。许多用户习惯于使用函数式表示法来转换数据类型,即typename ( x)。事实上,这种表示法不仅仅是对演员实现函数的调用;它不是特别对待演员。如果您的转换函数未命名为支持此约定,那么您将会感到惊讶。由于Vastbase E100允许使用不同的参数说明类型重载相同的函数名,因此使用目标类型名称的不同类型的多个转换函数没有任何困难。

注意

实际上前一段过于简化了:有两种情况中一个函数调用结构在没有被匹配到 一个实际函数时将被当作一次造型请求。如果函数调用 name(x)没有正好匹配任何现有函数, 但name是一种数据类型的名称并且 pg_cast提供了一种从x的类型到这种 类型的二进制可强制造型,那么该调用将被翻译为一次二进制可强制造型。 通过这种例外,二进制可强制造型能够以函数语法调用,即便没有该函数。 同样的,如果没有pg_cast项,但是该造型是要造型到一种 字符串类型或者是要从一种字符串类型造型,调用将被翻译成一次 I/O 转换 造型。这种例外允许以函数语法调用 I/O 转换造型。

注意

异常还有一个例外:从复合类型到字符串类型的I /O转换强制转换不能使用函数语法调用,但必须使用显式强制转换语法( CAST 或:: 表示法)编写。添加此异常是因为在引入自动提供的I /O转换强制转换后,发现在想要函数或列引用时,很容易意外地调用此类强制转换。

示例

要使用函数 int4(bigint) 创建从类型 bigint 转换为类型 int4 的赋值:

CREATE CAST (bigint AS int4) WITH FUNCTION int4(bigint) AS ASSIGNMENT;