本文介绍PolarDB兼容Oracle数据库数据类型隐式转换规则。

图 1. 隐式转换规则表
隐式转换规则表
  • NA:表示不支持隐式类型转换,例如:
        explain verbose select CAST(c1 as timestamp) from t_smallint;
        ERROR:  cannot cast type smallint to timestamp without time zone
  • e : 表示仅支持通过CAST::语法进行显示类型转换,例如:
        create table t_int(c1 integer);
        insert into t_int values(2);
        select CAST(c1 as boolean) from t_int;
         c1
        ----
         t
        insert into t_int values('true'::boolean);
        ERROR:  column "c1" is of type integer but expression is of type boolean
  • a : 表示除支持e外,还支持隐式向目标列类型赋值(通常指INSERT VALUES赋值或UPDATE SET赋值)。例如:
        create table t_int(c1 integer);
        insert into t_int values(2);
        select cast(c1 as smallint) from t_int;  -- ok
         c1
        ----
          2
        insert into t_int values(3::smallint);  -- ok
  • i : 表示除支持以上a和e外,还支持其他隐式转换,包括如表达式参数等。例如:
        -- case 1
        CREATE OR REPLACE FUNCTION F_VARCHAR(arg1 VarChar) RETURN void
        IS
        BEGIN
           dbms_output.put_line(arg1);
           RETURN;
        END;
    
        SELECT F_VARCHAR(cast('10' as INTEGER)) FROM DUAL;   -- fail
        SELECT F_VARCHAR(cast('10' as CHAR(10))) FROM DUAL;  -- ok
        -- case 2
        create table t_varchar(c1 varchar(10));
        insert into t_varchar values(2);
        explain verbose select sum(c1) from t_varchar;
                                    QUERY PLAN
        ---------------------------------------------------------------------------
        Aggregate  (cost=43.95..43.96 rows=1 width=32)
          Output: sum((c1)::numeric)
          ->  Seq Scan on public.t_varchar  (cost=0.00..29.40 rows=1940 width=14)
               Output: c1
说明

DATE类型在PolarDB兼容Oracle数据库中实际存储类型受参数edb_redwood_date控制:

  • edb_redwood_date=on(默认情况):其类型为TIMESTAMP WITHOUT TIME ZONE类型,兼容Oracle模式,隐式类型转换关系请参见隐式转换规则表
  • edb_redwood_date=off:其类型为DATE类型,兼容PostgreSQL模式,除以下隐式类型转换关系外,其他情况请参见隐式转换规则表
    • 当源数据类型为DATE类型,目标数据类型为TIME WITHOUT TIME ZONE类型时,隐式转换为NA。
    • 当源数据类型为TIMESTAMP WITHOUT TIME ZONE类型,目标数据类型为DATE类型时,隐式转换为a。
    • 当源数据类型为TIMESTAMP WITH TIME ZONE类型(TIMESTAMPTZ),目标数据类型为DATE类型时,隐式转换为a。
    • 当源数据类型为TIMESTAMP WITHOUT TIME ZONE类型(TIMESTAMP),目标数据类型为DATE类型时,隐式转换为a。