文档中心MogDBMogDB StackUqbar
v5.0

文档:v5.0

支持的版本:

其他版本:

平台和客户端兼容性

很多平台都使用数据库系统,数据库系统的对外兼容性给平台提供了很大的方便。

convert_string_to_digit

参数说明: 设置隐式转换优先级,是否优先将字符串转为数字。

该参数属于USERSET类型参数,请参考表GUC参数分类中对应设置方法进行设置。

取值范围: 布尔型

  • on表示优先将字符串转为数字。
  • off表示不优先将字符串转为数字。

默认值: on

img 须知: 该参数调整会修改内部数据类型转换规则,导致不可预期的行为,请谨慎操作。

nls_timestamp_format

参数说明: 设置时间戳默认格式。

该参数属于USERSET类型参数,请参考表GUC参数分类中对应设置方法进行设置。

取值范围: 字符串

默认值: DD-Mon-YYYY HH:MI:SS.FF AM

group_concat_max_len

参数说明:搭配函数GROUP_CONCAT使用,限制其返回值长度,超长截断。

该参数属于USERSET类型参数,请参考表GUC参数分类中对应设置方法进行设置。

取值范围:0-9223372036854775807

默认值:1024

img 说明: 目前能返回的最大长度是1073741823,超出此长度后会有out of memory的报错。

max_function_args

参数说明: 函数参数最大个数。

该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。

取值范围: 整型

默认值: 8192

transform_null_equals

参数说明: 控制表达式expr = NULL(或NULL = expr)当做expr IS NULL处理。如果expr得出NULL值则返回真,否则返回假。

  • 正确的SQL标准兼容的expr = NULL总是返回NULL(未知)。
  • Microsoft Access里的过滤表单生成的查询使用expr = NULL来测试空值。打开这个选项,可以使用该接口来访问数据库。

该参数属于USERSET类型参数,请参考表GUC参数分类中对应设置方法进行设置。

取值范围: 布尔型

  • on表示控制表达式expr = NULL(或NULL = expr)当做expr IS NULL处理。
  • off表示不控制,即expr = NULL总是返回NULL(未知)。

默认值: off

img 说明: 新用户经常在涉及NULL的表达式上语义混淆,故默认值设为off。

support_extended_features

参数说明: 控制是否支持数据库的扩展特性。

该参数属于POSTMASTER类型参数,请参考表GUC参数分类中对应设置方法进行设置。

取值范围: 布尔型

  • on表示支持数据库的扩展特性。
  • off表示不支持数据库的扩展特性。

默认值: off

sql_compatibility

参数说明: 控制数据库的SQL语法和语句行为同哪一个主流数据库兼容。

该参数属于INTERNAL类型参数,用户无法修改,只能查看。

取值范围: 枚举型

  • A表示同O数据库兼容。
  • B表示同MY数据库兼容。
  • C表示同TD数据库兼容。
  • PG表示同POSTGRES数据库兼容。

默认值: A

img 须知:

  • 该参数只能在执行CREATE DATABASE命令创建数据库的时候设置。
  • 在数据库中,该参数只能是确定的一个值,要么始终设置为A,要么始终设置为B,请勿任意改动,否则会导致数据库行为不一致。

b_format_behavior_compat_options

参数说明:数据库B模式兼容性行为配置项,该参数的值由若干个配置项用逗号隔开构成。

该参数属于USERSET类型参数,请参考GUC参数分类中对应设置方法进行设置。

取值范围:字符串

默认值:""

img 说明:

  • 当前只支持表1 兼容性B模式配置项
  • 配置多个兼容性配置项时,相邻配置项用逗号隔开,例如:set b_format_behavior_compat_options='enable_set_variables,set_session_transaction';

表 1 兼容性B模式配置项

兼容性配置项 兼容性行为控制
enable_set_variables set语法增强控制开关。
- 不设置此配置时,不支持set自定义变量、set [global | session]语法。
- 设置此配置时,支持B兼容模式下使用上述语法,比如 set @v1 = 1;
set_session_transaction set session transaction控制开关。
- 不设置此配置时,set session transaction等效于set local transaction。
- 设置此配置时,支持B兼容模式下使用上述语法,修改当前会话事务特性。
enable_modify_column ALTER TABLE MODIFY语义控制开关。
- 不设置此配置时,“ALTER TABLE table_name MODIFY column_name data_type;”只修改列的数据类型。
- 设置此配置时,“ALTER TABLE table_name MODIFY column_name data_type;”修改整个列定义。
default_collation 默认字符序前向兼容开关。
- 不设置此配置时,在未显式指定字符类型字段的字符集或字符序且表级字符序也为空时,字段为default字符序。
- 设置此配置时,字符类型字段的字符序当表级字符序不为空时继承表级字符序,为空时设置为数据库编码对应的默认字符序。

enable_set_variables_b_format

参数说明:在MY数据库模式下是否支持自定义用户变量的功能。

该参数属于USERSET类型参数,请参考GUC参数分类中对应设置方法进行设置。

取值范围:布尔型

  • on表示在MY数据库模式下支持自定义用户变量。
  • off表示在MY数据库模式下不支持自定义用户变量。

behavior_compat_options

参数说明:数据库兼容性行为配置项,该参数的值由若干个配置项用逗号隔开构成。

该参数属于USERSET类型参数,请参考表GUC参数分类中对应设置方法进行设置。

取值范围:字符串

默认值:空

img 说明

  • 配置多个兼容性配置项时,相邻配置项用逗号隔开,例如:set behavior_compat_options='end_month_calculate,display_leading_zero';

当前支持的兼容性配置项及其行为控制如下:

  • display_leading_zero

    浮点数显示配置项。

    • 不设置此配置项时,对于-1~0和0~1之间的小数,不显示小数点前的0。比如:

      MogDB=# select 0.1231243 as a, 0.1231243::numeric as b,0.1231243::integer(10,3) as c, length(0.1242343) as d;
          a     |    b     |  c   | d
      ----------+----------+------+---
       .1231243 | .1231243 | .123 | 8
      (1 row)
    • 设置此配置项时,对于-1~0和0~1之间的小数,显示小数点前的0。比如:

      MogDB=# select 0.1231243 as a, 0.1231243::numeric as b,0.1231243::integer(10,3) as c, length(0.1242343) as d;
           a     |     b     |   c   | d
      -----------+-----------+-------+---
       0.1231243 | 0.1231243 | 0.123 | 9
      (1 row)
  • end_month_calculate

    add_months函数计算逻辑配置项。

    假定函数add_months的两个参数分别为param1和param2,param1的月份和param2的和为月份result。

    • 不设置此配置项时,如果param1的日期(Day字段)为月末,并且param1的日期(Day字段)比result月份的月末日期小,计算结果中的日期字段(Day字段)和param1的日期字段保持一致。比如:

      MogDB=# select add_months('2018-02-28',3) from sys_dummy;
      add_months
      \---------------------\
      2018-05-28 00:00:00
      (1 row)
    • 设置此配置项时,如果param1的日期(Day字段)为月末,并且param1的日期(Day字段)比result月份的月末日期比小,计算结果中的日期字段(Day字段)和result的月末日期保持一致。比如:

      MogDB=# select add_months('2018-02-28',3) from sys_dummy;
      add_months
      \---------------------\
      2018-05-31 00:00:00
      (1 row)
  • compat_analyze_sample

    analyze采样行为配置项。

    设置此配置项时,会优化analyze的采样行为,主要体现在analyze时全局采样会更精确的控制在3万条左右,更好的控制analyze时DBnode端的内存消耗,保证analyze性能的稳定性。

  • bind_schema_tablespace

    绑定模式与同名表空间配置项。

    如果存在与模式名sche_name相同的表空间名,那么如果设置search_path为sche_name, default_tablespace也会同步切换到sche_name。

  • bind_procedure_searchpath

    未指定模式名的数据库对象的搜索路径配置项。

    在存储过程中如果不显示指定模式名,会优先在存储过程所属的模式下搜索。

    如果找不到,则有两种情况:

    • 若不设置此参数,报错退出。
    • 若设置此参数,按照search_path中指定的顺序继续搜索。如果还是找不到,报错退出。
  • correct_to_number

    控制to_number()结果兼容性的配置项。

    若设置此配置项,则to_number()函数结果与pg11保持一致,否则默认与Oracle保持一致。

  • unbind_divide_bound

    控制对整数除法的结果进行范围校验。

    若设置此配置项,则不需要对除法结果做范围校验,例如,INT_MIN/(-1)可以得到输出结果为INT_MAX+1,反之,则会因为超过结果大于INT_MAX而报越界错误。

  • return_null_string

    控制函数lpad()和rpad()结果为空字符串''的显示配置项。

    不设置此配置项时,空字符串显示为NULL。

    MogDB=# select length(lpad('123',0,'*')) from sys_dummy;
    length
    \--------\
    (1 row)

    设置此配置项时,空字符串显示为''。

    MogDB=# select length(lpad('123',0,'*')) from sys_dummy;
    length
    \--------\
    0
    (1 row)
  • compat_concat_variadic

    控制函数concat()和concat_ws()对variadic类型结果兼容性的配置项。

    若设置此配置项,当concat函数参数为variadic类型时,保留a db和Teradata兼容模式下不同的结果形式;否则默认a db和Teradata兼容模式下结果相同,且与a db保持一致。由于MY无variadic类型,所以该选项对MY无影响。

  • merge_update_multi

    控制在使用MERGE INTO ... WHEN MATCHED THEN UPDATE(参考MERGE INTO) 和INSERT ... ON DUPLICATE KEY UPDATE(参考INSERT)时,当目标表中一条目标数据与多条源数据冲突时UPDATE行为。

    若设置此配置项,当存在上述场景时,该冲突行将会多次执行UPDATE;否则(默认)报错,即MERGE或INSERT操作失败。

  • plstmt_implicit_savepoint

    控制存储过程中更新语句的执行是否拥有独立的子事务。

    若设置此配置项,存储过程中每条更新语句前开启隐式保存点,EXCEPTION块中默认回退到最近的保存点,从而保证只回退失败语句的修改。该选项是为了兼容O数据库的EXCEPTION行为。

  • hide_tailing_zero

    numeric显示配置项。不设置此项时,numeric按照指定精度显示。设置此项时,所有输出numeric的场景均隐藏小数点后的末尾0,包括显示指定format精度情况。

    MogDB=# set behavior_compat_options='hide_tailing_zero';
    MogDB=# select cast(123.123 as numeric(15,10)) as a, to_char(cast(123.123 as numeric(15,10)), '999D999999');
        a    | to_char
    ---------+----------
     123.123 |  123.123
    (1 row)
    MogDB=# set behavior_compat_options='';
    MogDB=# select cast(123.123 as numeric(15,10)) as a, to_char(cast(123.123 as numeric(15,10)), '999D999999');
           a        |   to_char
    ----------------+-------------
     123.1230000000 |  123.123000
    (1 row)
  • rownum_type_compat

    控制ROWNUM的类型,ROWNUM默认类型为INT8,设置此参数后,ROWNUM类型变更为NUMERIC类型。

  • aformat_null_test

    控制rowtype类型判空逻辑,设置此项时,对于rowtype is not null判断,当一行数据有一列不为空的时候返回ture。

    否则,对于rowtype is not null判断,当一行数据所有列不为空的时候返回ture。

  • aformat_regexp_match

    控制正则表达式函数的匹配行为。

    设置此项,且sql_compatibility参数的值为A或B时,正则表达式的flags参数支持的选项含义有变更:

    1. “.”默认不能匹配 '\n' 字符。

    2. flags 中包含n选项时,“.”能够匹配 '\n' 字符。

    3. regexp_replace(source, pattern replacement) 函数替换所有匹配的子串。

    4. regexp_replace(source, pattern, replacement, flags) 在 flags值为''或者null时,返回值为null。

    否则,正则表达式的 flags 参数支持的选项含义:

    1. “.”默认能匹配 '\n' 字符。
    2. flags中的n选项表示按照多行模式匹配。
    3. regexp_replace(source, pattern replacement)函数仅替换第一个匹配到的子串。
    4. regexp_replace(source, pattern, replacement, flags)在flags值为''或者null时,返回值为替换后的字符串。
  • compat_cursor

    控制隐式游标状态兼容行为。设置此项,且兼容O,隐式游标状态(SQL%FOUND、SQL%NOTFOUND、SQL%ISOPNE、SQL%ROWCOUNT)由原先的仅在当前执行的函数有效,拓展到包括本函数调用的子函数有效。

  • proc_outparam_override

    控制存储过程出参的重载行为,打开该参数后,对于存储过程只有out出参部分不同的情况下,也可以正常调用。设置此选项后,包含了out参数的函数或者存储过程,必须显式调用out参数。

    函数或者存储过程是否包含out参数,可以通过\df 函数名查看,例如:

    MogDB=# \df DBE_PERF.get_global_bgwriter_stat
    List of functions
    -[ RECORD 1 ]-------+----------------------------------------------------------------------
    Schema              | dbe_perf
    Name                | get_global_bgwriter_stat
    Result data type    | SETOF record
    Argument data types | OUT node_name name, OUT checkpoints_timed bigint, OUT checkpoints_req bigint, OUT checkpoint_write_time double precision, OUT checkpoint_sync_time double precision, OUT buffers_checkpoint bigint, OUT buffers_clean bigint, OUT maxwritten_clean bigint, OUT buffers_backend bigint, OUT buffers_backend_fsync bigint, OUT buffers_alloc bigint, OUT stats_reset timestamp with time zone
    Type                | normal
    fencedmode          | f
    propackage          | f
    prokind             | f

    out/inout参数需要传入变量,不能为常量;关闭重载时,out参数在perform操作下可以不显式调用。

    关于proc_outparam_override选项和perform操作行为的说明如下:

    1. 关闭proc_outparam_override选项时,针对out参数,perform不支持传入常量,必须传入变量;针对inout参数,perform支持传入常量,原因在于perform的作用是忽略out参数,此时给inout参数传常量,实际是给in参数传常量。

    2. 打开proc_outparam_override选项时,perform支持给out参数传入变量和常量,但是传入常量时会报错,原因在于out参数需要有变量来接收它的值,而传入常量时无法再给常量赋值,所以需要传变量。相当于打开此选项时,perform原本忽略out参数的特性不起作用。

  • proc_implicit_for_loop_variable

    控制存储过程中FOR_LOOP查询语句行为设置此项时,在FOR rec IN query LOOP语句中,若rec已经定义,不会复用已经定义的rec变量,而且重新建立一个新的变量。否则,会复用已经定义的rec变量,不会建立新的变量。

  • allow_procedure_compile_check

    控制存储过程中select语句和open cursor语句的编译检查设置此项时,在存储过程中执行select语句、open cursor for语句、cursor%rowtype语句、for rec in语句时,若查询的表不存在,则无法创建创建存储过程,不支持trigger函数的编译检查,若查询的表存在,则成功创建存储过程。

  • char_coerce_compat

    控制char(n)类型向其它变长字符串类型转换时的行为。默认情况下char(n)类型转换其它变长字符串类型时会省略尾部的空格,开启该参数后,转换时不再省略尾部的空格,并且在转换时如果char(n)类型的长度超过其它变长字符串类型时将会报错。设置此选项时,unknow类型字符串会消除多余空格。该参数仅在sql_compatibility参数的值为A时生效。

  • truncate_numeric_tail_zero

    numeric显示配置项。不设置此项时,numeric按照默认精度显示。设置此项时,除去to_char(numeric, format)这种显示设置精度的情况,所有输出numeric的场景均会隐藏小数点后的末尾0。例如:

    MogDB=# set behavior_compat_options='truncate_numeric_tail_zero';
    MogDB=# select cast(123.123 as numeric(15,10)) as a, to_char(cast(123.123 as numeric(15,10)), '999D999999');
        a    |   to_char
    ---------+-------------
     123.123 |  123.123000
    (1 row)
    MogDB=# set behavior_compat_options='';
    MogDB=# select cast(123.123 as numeric(15,10)) as a, to_char(cast(123.123 as numeric(15,10)), '999D999999');
           a        |   to_char
    ----------------+-------------
     123.1230000000 |  123.123000
    (1 row)
  • pgformat_substr

    控制substr(str, from, for)在不同场景下的表现。默认情况下,当from小于0时,substr将从字符串尾部开始计数;当for小于1时,substr将返回NULL。开启该参数后,当from小于0时,将从字符串的第一位的前(-from + 1)位开始计数;当for小于0时,substr将报错。该参数仅在sql_compatibility参数的值为PG时生效。

  • allow_orderby_undistinct_column

    SQL语法兼容B的情况下,开启此参数后,select语句支持order by后面的列不在distinct中。如:select distinct a from test order by b;

    注意:该参数只支持distinct,不支持distinct on,且当DOLPHIN插件存在时不生效,转由dolphin.sql_mode参数控制。dolphin.sql_mode未设置sql_mode_full_group选项时相当于打开此选项。

  • select_into_return_null

    在B或PG兼容模式下,开启此参数后,存储过程语句SELECT select_expressions INTO [STRICT] target FROM ...允许在不指定STRICT并且查询结果为空时给变量赋NULL值。

  • convert_string_digit_to_numeric

    控制是否将表中以字符串形式表示的numeric常量和数字类型作比较时统一都转换为numeric类型再进行比较。

    MogDB=# create table test1(c1 int, c2 varchar);
    MogDB=# insert into test1 values(2, '1.1');
    MogDB=# set behavior_compat_options = '';
    MogDB=# select * from test1 where c2 > 1;
    ERROR:  invalid input syntax for type bigint: "1.1"
    MogDB=# set behavior_compat_options = 'convert_string_digit_to_numeric';
    MogDB=# select * test1 from where c2 > 1;
     c1 | c2
    ----+-----
      2 | 1.1
    (1 row)
  • plsql_security_definer

    开启此参数后,创建存储过程时默认为定义者权限。

  • skip_insert_gs_source

    开启此参数后,创建PL/SQL对象时不再插入DBE_PLDEVELOPER.gs_source表中。

  • compat_sort_group_column

    开启此参数后,GROUP/ORDER BY子句的行为和Oracle保持一致,常量不再影响GROUP/ORDER BY结果集。该参数仅在sql_compatibility参数值为A时生效。

  • sql_implicit_savepoint

    用于控制事务中出现单条SQL报错时,是否回滚整个事务。设置此选项时,事务中单条SQL报错不影响其它SQL的提交,提交会保留已正确执行的SQL结果。此选项仅适用于A兼容模式。

  • accept_empty_str

    在A兼容模式下,关闭此参数后,MogDB处理空字符串时会当做NULL处理;反之则正常接受空字符串。例如:

    MogDB=# set behavior_compat_options='accept_empty_str';
    MogDB=# select '' is null;
     ?column?
    ----------
     f
    (1 row)
    MogDB=# set behavior_compat_options='';
    MogDB=# select '' is null;
     ?column?
    ----------
     t
    (1 row)
  • set_procedure_current_schema

    开启此开关且所编译的function(包括package中的function)或procedure为调用者权限,则设置function(包括package中的function)或procedure的search path为当前执行时的current_schema。

  • compat_oracle_txn_control

    • 在驱动为非自动提交模式下,配置此选项开启select自动提交事务功能。
    • 在驱动为自动提交模式 (autocommit = on) 下,当驱动版本为JDBC 5.0.0.6/5.0.0.7、Psycopg2 5.0.0.4、ODBC 5.0.0.2时,如果打开此功能,会导致驱动的自动提交模式不生效。后续驱动版本会解决此冲突问题,临时解决方案是在驱动连接字符串里关闭此参数。
    • compat_oracle_txn_control 选项在 JDBC 5.0.0.8 、Psycopg2 5.0.0.5 之后不允许通过 set behavior_compat_options 修改
    • 通过 JDBC setSavepointselect 不自动提交
  • bpchar_coerce_compat

    控制bpchar和text运算时隐式转换text为bpchar,使bpchar_col = 'xxx'::text条件可直接运用索引或者分区裁剪,提升查询效率。

  • allow_like_indexable

    配置此选项会自动创建支持模糊匹配的索引(自5.0.4版本引入)。

plsql_compile_check_options

参数说明: 数据库兼容性行为配置项,该参数的值由若干个配置项用逗号隔开构成。

该参数属于USERSET类型参数,请参考GUC参数设置方式中对应设置方法进行设置。

取值范围: 字符串

默认值: ""

img 说明

  • 当前只支持表2兼容性配置项。
  • 配置多个兼容性配置项时,相邻配置项用逗号隔开,例如:set plsql_compile_check_options='for_loop,outparam';

表 2 兼容性配置项

兼容性配置项 兼容性行为控制
for_loop 控制存储过程中FOR_LOOP查询语句行为设置此项时,在FOR rec IN query LOOP语句中,若rec已经定义,不会复用已经定义的rec变量,而且重新建立一个新的变量。否则,会复用已经定义的rec变量,不会建立新的变量。(与proc_implicit_for_loop_variable相同,后续进行收编)
outparam 可能存在多个同名但输出参数列表不同的重载参数,若开启该选项,将对out出参进行检查,out出参为常量时报错。

td_compatible_truncation

参数说明: 控制是否开启与Teradata数据库相应兼容的特征。该参数在用户连接上与TD兼容的数据库时,可以将参数设置成为on(即超长字符串自动截断功能启用),该功能启用后,在后续的insert语句中,对目标表中char和varchar类型的列插入超长字符串时,会按照目标表中相应列定义的最大长度对超长字符串进行自动截断。保证数据都能插入目标表中,而不是报错。

img 说明:超长字符串自动截断功能不适用于insert语句包含外表的场景。如果向字符集为字节类型编码(SQL_ASCII、LATIN1等)的数据库中插入多字节字符数据(如汉字等),且字符数据跨越截断位置,这种情况下,按照字节长度自动截断,自动截断后会在尾部产生非预期结果。如果用户有对于截断结果正确性的要求,建议用户采用UTF8等能够按照字符截断的输入字符集作为数据库的编码集。

该参数属于USERSET类型参数,请参考表GUC参数分类中对应设置方法进行设置。

取值范围:布尔型

  • on表示启动超长字符串自动截断功能。
  • off表示停止超长字符串自动截断功能。

默认值:off

uppercase_attribute_name

参数说明:设置列名以大写形式返回给客户端。该参数仅限于ORA兼容模式和集中式环境下使用。

该参数属于USERSET类型参数,请参考GUC参数分类中对应设置方法进行设置。

取值范围:布尔型

  • on表示开启列名以大写形式返回给客户端。
  • off表示关闭列名以大写形式返回给客户端。

默认值:off

lastval_supported

参数说明:控制是否可以使用lastval函数。

该参数属于POSTMASTER类型参数,请参考表GUC参数分类中对应设置方法进行设置。

取值范围:布尔型

  • on表示支持lastval函数,同时nextval函数不支持下推。
  • off表示不支持lastval函数,同时nextval函数可以下推。

默认值:off

enable_custom_parser

该参数当前版本不支持。

enable_date_operator_sub_oracle

参数说明:控制是否开启两个date类型字段相减返回numeric类型结果,表示两个日期之间间隔的天数。

该参数属于USERSET类型参数,请参考表GUC参数分类中对应设置方法进行设置。

取值范围:布尔型

  • on表示使用两个date相减为numeric的操作符
  • off表示使用MogDB原有处理,两个date相减为Interval类型的操作符

默认值:off

proc_inparam_immutable

参数说明:控制包内常量是否作为函数或者存储过程入参的默认值。适用于A兼容模式。

该参数属于SUSET类型参数,请参考表GUC参数分类中对应设置方法进行设置。

取值范围:布尔型

  • on:MogDB入参只有IN类型才可以使用default value,并且FUNCTION/PROCEDURE中不能对入参进行修改,与ORACLE保持一致。修改PACKAGE变量的值影响函数入参的行为和Oracle保持一致。
  • off:不支持包内常量作为函数或者存储过程入参的默认值。

默认值:on

参数说明:控制 Oracle dblink 列是否区分大小写。默认不区分大小写。

该参数属于SUSET类型参数,请参考表GUC参数分类中对应设置方法进行设置。

取值范围:布尔型

默认值:off

enable_mergeinto_subqueryalias

参数说明:控制在A模式下merge into using的源表为子查询时是否可以使用目标表别名。

该参数属于USERSET类型参数,请参考表GUC参数分类中对应设置方法进行设置。

取值范围:布尔类型

  • on表示可以使用目标表别名
  • off表示不可以使用目标表别名

默认值:off

enable_multitable_update

参数说明:MogDB默认只在B模式下支持多表更新操作,打开此参数支持在A模式下使用多表更新功能。

该参数属于USERSET类型参数,请参考表GUC参数分类中对应设置方法进行设置。

取值范围:布尔类型

  • on表示支持在A模式下使用多表更新功能
  • off表示不支持在A模式下使用多表更新功能

默认值:off

Copyright © 2011-2024 www.enmotech.com All rights reserved.