云数据库 GAUSSDB-逻辑解码支持DDL:解码格式

时间:2024-11-13 10:04:58

解码格式

  • JSON格式

    对于输入的DDL语句,SQL引擎解析器会通过语法、词法分析将其分解为解析树,解析树节点中包含了DDL的全部信息,并且执行器会根据解析树内容,执行系统元信息的修改。在执行器执行完成之后,便可以获取到DDL操作数据对象的search_path。本特性在执行器执行成功之后,对解析树信息以及执行器结果进行反解析,以还原出DDL原语句的全部信息。反解析的方式可以分解整个DDL语句,以方便输出JSON格式的DDL,用以适配异构数据库场景。

    CREATE TABLE语句在经过词法、语法分析之后,得到对应的CreateStmt解析树节点,节点中包含了表信息、列信息、分布式信息(DistributeBy结构体)、分区信息(PartitionState结构)等。通过反解析后,可输出的JSON格式如下:

    {"JDDL":{"fmt":"CREATE %{persistence}s TABLE %{if_not_exists}s %{identity}D %{table_elements}s %{with_clause}s %{compression}s","identity":{"object_name":"test_create_table_a","schema_name":"public"},"compression":"NOCOMPRESS","persistence":"","with_clause":{"fmt":"WITH (%{with:, }s)","with":[{"fmt":"%{label}s = %{value}L","label":{"fmt":"%{label}I","label":"orientation"},"value":"row"},{"fmt":"%{label}s = %{value}L","label":{"fmt":"%{label}I","label":"compression"},"value":"no"}]},"if_not_exists":"","table_elements":{"fmt":"(%{elements:, }s)","elements":[{"fmt":"%{name}I %{column_type}T","name":"a","column_type":{"typmod":"","typarray":false,"type_name":"int4","schema_name":"pg_catalog"}}]}}}

    可以看到,JSON格式中包含对象的search_path,其中的identity键标识schema为public,表名为test_create_table_a,其中%{persistence}s对应的字段如下,此SQL语句不含此字段所以为空。

    [ [ GLOBAL | LOCAL ] [ TEMPORARY | TEMP ] | UN LOG GED ]

    %{if_not_exists}s对应SQL语句中的字段,不含此字段所以为空:

    [ IF NOT EXISTS ]

    %{identity}D对应SQL语句中的字段:

    table_name  

    %{table_elements}s对应SQL语句中的字段:

     (column_name data_type) 

    %{with_clause}s对应SQL语句中的字段:

    [ WITH ( {storage_parameter = value} [, ... ] ) ]

    %{compression}s对应SQL语句中的字段:

    [ COMPRESS | NOCOMPRESS ]
  • decode-style指定格式

    输出的格式由decode-style参数控制,如当decode-style='j'时,输出格式如下:

    {"TDDL":"CREATE  TABLE  public.test_create_table_a (a pg_catalog.int4) WITH (orientation = 'row', compression = 'no') NOCOMPRESS"}

    其中语句中也包含Schema名称。

support.huaweicloud.com/fg-gaussdb-cent-v8/gaussdb-48-0042.html