lightdb 23.3新特性

lightdb 23.3已於2023年9月28日正式發佈。相關的特性如下:

E.1. 版本發佈 13.8-23.3

版本發佈日期:. 2023年9月30日

E.1.1. Oracle 兼容

  • CREATE SEQUENCE 命令創建序列時支持聲明 NOMAXVALUE,兼容Oracle創建序列時 NOMAXVALUE 定義。請參見 CREATE SEQUENCE

    示例:

    create sequence s1 nomaxvalue;
    \d+ s1
                                Sequence "public.s1"
    Type  | Start | Minimum |       Maximum       | Increment | Cycles? | Cache
    --------+-------+---------+---------------------+-----------+---------+-------
    bigint |     1 |       1 | 9223372036854775807 |         1 | no      |     1
                    
  • CREATE SEQUENCE 命令創建序列時支持聲明 MAXVALUE,兼容Oracle創建序列時 MAXVALUE 定義。請參見 CREATE SEQUENCE

    示例:

    create sequence s2 maxvalue 100000;
    \d+ s2
    Sequence "public.s2"
    Type  | Start | Minimum | Maximum | Increment | Cycles? | Cache
    --------+-------+---------+---------+-----------+---------+-------
    bigint |     1 |       1 |  100000 |         1 | no      |     1
                    
  • CREATE TABLE 命令創建分區時支持 nocompress/compress 關鍵字。請參見 CREATE TABLE

    示例:

    CREATE TABLE lt_oracle_partition_list1
    (
        a int,
        b float,
        c date,
        d timestamp,
        e varchar2(20)
    ) PARTITION BY LIST(e)
    (
        PARTITION p1 VALUES ('0001', '0002', '0003', '0004', '0005') compress,
        PARTITION p2 VALUES ('0006', '0007', '0008', '0009') nocompress,
        PARTITION p3 VALUES ('0010', '0011')
    );
    \d+ lt_oracle_partition_list1
    
    Partitioned table "public.lt_oracle_partition_list1"
    Column |            Type             | Collation | Nullable | Default | Storage  | Stats target | Description
    --------+-----------------------------+-----------+----------+---------+----------+--------------+-------------
    a      | integer                     |           |          |         | plain    |              |
    b      | double precision            |           |          |         | plain    |              |
    c      | oracle.date                 |           |          |         | plain    |              |
    d      | timestamp without time zone |           |          |         | plain    |              |
    e      | varchar2(20)                |           |          |         | extended |              |
    Partition key: LIST (e)
    Partitions: "lt_oracle_partition_list1$p$p1" FOR VALUES IN ('0001', '0002', '0003', '0004', '0005'),
    "lt_oracle_partition_list1$p$p2" FOR VALUES IN ('0006', '0007', '0008', '0009'),
    "lt_oracle_partition_list1$p$p3" FOR VALUES IN ('0010', '0011')
                    
  • CREATE TABLE 命令創建分區時支持 list+hash 複合分區。請參見 CREATE TABLE

    示例:

    create table lt_lh_partition(a int, b int)
    partition by list(a)
    subpartition by hash(b)
    (
        partition l_1 values(1),
        partition l_2 values(2)
    );
    
    \d+ lt_lh_partition
    
    Partitioned table "public.lt_lh_partition"
    Column |  Type   | Collation | Nullable | Default | Storage | Stats target | Description
    --------+---------+-----------+----------+---------+---------+--------------+-------------
    a      | integer |           |          |         | plain   |              |
    b      | integer |           |          |         | plain   |              |
    Partition key: LIST (a)
    Partitions: "lt_lh_partition$p$l_1" FOR VALUES IN (1), PARTITIONED,
    "lt_lh_partition$p$l_2" FOR VALUES IN (2), PARTITIONED
    
    \d+ lt_lh_partition$p$l_1
    
    Partitioned table "public.lt_lh_partition$p$l_1"
    Column |  Type   | Collation | Nullable | Default | Storage | Stats target | Description
    --------+---------+-----------+----------+---------+---------+--------------+-------------
    a      | integer |           |          |         | plain   |              |
    b      | integer |           |          |         | plain   |              |
    Partition of: lt_lh_partition FOR VALUES IN (1)
    Partition constraint: ((a IS NOT NULL) AND (a = 1))
    Partition key: HASH (b)
    Partitions: "lt_lh_partition$p$l_1_p0" FOR VALUES WITH (modulus 1, remainder 0)
                    
  • CREATE TABLE 命令支持了一些選項,如compress/nocompress,logging/nologging。 這些選項在歷史版本使用上有順序限制,該版本允許這些選項可以任意順序出現。請參見 CREATE TABLE

  • 禁止 CREATE TABLE 創建的表名和 CREATE PACKAGE 創建的包名重複。

  • ALTER TABLE 命令支持一次添加多列時可以把列定義放在要括號裏。請參見 ALTER TABLE

    示例:

    CREATE TABLE foo(a int);
    ALTER TABLE foo ADD COLUMN a1 int;
    ALTER TABLE foo ADD COLUMN a2 int default 3;
    ALTER TABLE foo ADD COLUMN b1 int, ADD COLUMN b2 int;
    ALTER TABLE foo ADD (c1 int);
    ALTER TABLE foo ADD (c2 int default 3);
    ALTER TABLE foo ADD (e1 int), ADD e2 int, ADD COLUMN e3 int, ADD (e4 int, e5 int);
    begin
        execute immediate 'alter table foo add(d int)';
    end;
    /
                    
  • ALTER TABLE 命令支持 TRUNCATE PARTITION partition_name 時指定 update indexes。請參見 ALTER TABLE

    示例:

    create table part_update_indexes_range(id int primary key)
    PARTITION by range(id)(
        partition p1 VALUES LESS THAN (202000) nocompress,
        partition p2 VALUES LESS THAN (202001) compress,
        partition p3 VALUES LESS THAN (202002)
    );
    
    ALTER  TABLE  part_update_indexes_range  TRUNCATE  PARTITION  p1 update indexes;
                    
  • DROP TABLE 命令支持通過 cascade constraints 級聯刪除該表所有的約束。請參見 DROP TABLE

    示例:

    CREATE TABLE student(id int, name varchar2(100));
    
    ALTER TABLE student ADD CONSTRAINT uk_student unique(id);
    
    \d student
    Table "public.student"
    Column |     Type      | Collation | Nullable | Default
    --------+---------------+-----------+----------+---------
    id     | integer       |           |          |
    name   | varchar2(100) |           |          |
    Indexes:
    "uk_student" UNIQUE CONSTRAINT, btree (id)
    
    DROP TABLE student cascade constraints;
                    
  • 新增 CREATE TYPE name { AS | IS } OBJECT 語法,支持創建對象類型。請參見 CREATE TYPE

    示例:

    select dbms_output.serveroutput(true);
    CREATE TYPE stock AS OBJECT (
        stock_no int,
        price    numeric(16,2),
        member procedure dis(prompt varchar)
    );
    
    CREATE TYPE BODY stock AS
    member procedure dis(prompt varchar) is
        begin
            dbms_output.put_line(prompt || ':' || self.stock_no || '-' || self.price);
        end;
    END;
    /
    
    DECLARE
        s stock := stock(600570, 180.00);
    BEGIN
        s.dis('current');
    END;
    /
    
    current:600570-180.00
    DO
                    
  • 新增 TO_CLOB 函數,通過該函數我們將能夠將數據從文本字符串類型轉換爲 CLOB 類型。請參見 orafce

    示例:

    CREATE TABLE testorafce_to_clob (
        col_char CHAR(10),
        col_varchar2 VARCHAR2(20),
        col_varchar VARCHAR(20),
        col_nchar NCHAR(10),
        col_nvarchar2 NVARCHAR2(20),
        col_smallint smallint,
        col_integer integer,
        col_bigint bigint,
        col_decimal decimal,
        col_numeric numeric,
        col_real real,
        col_double double precision,
        col_clob CLOB,
        col_raw raw(10)
    );
    
    INSERT INTO testorafce_to_clob (col_char, col_varchar2, col_varchar, col_nchar, col_nvarchar2, col_smallint, col_integer, col_bigint, col_decimal, col_numeric, col_real, col_double, col_clob, col_raw)
    VALUES ('ABC1', 'Hello', 'world', 'hello', 'world', 1, 2, 3, 4, 5, 6, 7, 'This is a CLOB', 'AB');
    
    INSERT INTO testorafce_to_clob (col_char, col_varchar2, col_varchar, col_nchar, col_nvarchar2, col_smallint, col_integer, col_bigint, col_decimal, col_numeric, col_real, col_double, col_clob, col_raw)
    VALUES ('ABC2', 'Hello', 'world', 'hello', 'world', 1, 2, 3, 4, 5, 6, 7, 'This is a CLOB', '1');
    
    INSERT INTO testorafce_to_clob (col_char, col_varchar2, col_varchar, col_nchar, col_nvarchar2, col_smallint, col_integer, col_bigint, col_decimal, col_numeric, col_real, col_double, col_clob, col_raw)
    VALUES ('ABC3', 'Hello', 'world', 'hello', 'world', 1, 2, 3, 4, 5, 6, 7, to_clob('This is a CLOB'), '1AB456789');
    
    SELECT  to_clob(col_char) AS clob_char,
            to_clob(col_varchar2) AS clob_varchar2,
            to_clob(col_varchar) AS col_varchar,
            to_clob(col_nchar) AS clob_nchar,
            to_clob(col_nvarchar2) AS clob_nvarchar2,
            to_clob(col_clob) AS clob_clob,
            to_clob(col_smallint) AS col_smallint,
            to_clob(col_integer) AS col_integer,
            to_clob(col_bigint) AS col_bigint,
            to_clob(col_decimal) AS col_decimal,
            to_clob(col_numeric) AS col_numeric,
            to_clob(col_real) AS col_real,
            to_clob(col_double) AS col_double,
            to_clob(col_raw) AS clob_nclob
    FROM testorafce_to_clob order by col_char asc;
    
    clob_char  | clob_varchar2 | col_varchar | clob_nchar | clob_nvarchar2 |   clob_clob    | col_smallint | col_integer | col_bigint | col_decimal | col_numeric | col_real | col_double | clob_nclob
    ------------+---------------+-------------+------------+----------------+----------------+--------------+-------------+------------+-------------+-------------+----------+------------+------------
    ABC1       | Hello         | world       | hello      | world          | This is a CLOB | 1            | 2           | 3          | 4           | 5           | 6        | 7          | AB
    ABC2       | Hello         | world       | hello      | world          | This is a CLOB | 1            | 2           | 3          | 4           | 5           | 6        | 7          | 01
    ABC3       | Hello         | world       | hello      | world          | This is a CLOB | 1            | 2           | 3          | 4           | 5           | 6        | 7          | 01AB456789
    (3 rows)
                    
  • 新增 XMLType 對象類型,支持 XMLType.getClobVal 方法。請參見 orafce

    示例:

    CREATE TABLE xml_table (id NUMBER, xml_column XMLType );
    
    INSERT INTO xml_table (id, xml_column) VALUES (1, XMLType('<root><name>John</name></root>'));
    
    DECLARE
        v_clob CLOB;
    BEGIN
        SELECT XMLType.getClobVal(xml_column) INTO v_clob FROM xml_table WHERE id = 1;
        DBMS_OUTPUT.PUT_LINE('CLOB value: ' || v_clob);
    END;
    /
    CLOB value: <root><name>John</name></root>
    DO
    
    DECLARE
        xml_data XMLType;
        clob_data CLOB;
    BEGIN
        xml_data := XMLType('<root><name>John Doe</name></root>');
        clob_data := xml_data.getClobVal();
        DBMS_OUTPUT.PUT_LINE(clob_data);
    END;
    /
    <root><name>John Doe</name></root>
    DO
    
    SELECT XMLType.getClobVal(xml_column) from xml_table;
    getclobval
    --------------------------------
    <root><name>John</name></root>
    (1 row)
    
                    
  • 新增 lightdb_oracle_sql_mode GUC參數,用於支持Oracle模式下列名顯示默認轉爲大寫。請參見 lightdb_oracle_sql_mode

    示例:

    create table std(no int, name varchar2(32));
    
    insert into std values(1, 'zhangsan');
    
    select * from std;
    no |   name
    ----+----------
    1 | zhangsan
    (1 row)
    
    set lightdb_oracle_sql_mode to 'true';
    
    select * from std;
    NO |   NAME
    ----+----------
    1 | zhangsan
    (1 row)
                    
  • ltsql 命令新增支持Oracle SQL*Plus的 RENAME old_name TO new_name 命令,可以對錶名進行重命名。請參見 RENAME 命令

  • ltsql 命令新增支持Oracle SQL*Plus SPOOL命令。請參見 SPOOL 命令

  • Oracle模式下支持 binary_float 和 binary_double,都遵循IEEE754標準。請參見 orafce

  • Oracle模式下支持 '\0' 可以正常插入 char(n) 類型字符串中。

    示例:

    create database oradb with lightdb_ascii_zero_store_value 20 lightdb_syntax_compatible_type 'oracle';
    \c oradb
    
    create table t00(a char(1), b char(2));
    
    insert into t00(a,b) values(E'\0',E'\0');
    
    insert into t00(a,b) values(chr(0),chr(0));
    
    select * from t00;
    
    a   |   b
    ------+-------
    \x14 | \x14
    \x14 | \x14
    (2 rows)
    
    '\0' 轉爲了lightdb_ascii_zero_store_value值進行存儲
                    
  • Oracle模式下日期作差結果兼容Oracle,返回numeric類型。

  • col視圖兼容Oracle,width字段與Oracle保持兼容。

  • greatest/least兼容Oracle。請參見 GREATEST和LEAST

    主要實現了以下兼容特性:

    只要有一個參數爲 NULL 結果就返回 NULL。

    把第一個參數作爲被比較的類型,其餘參數類型強制轉換爲第一個參數的類型。

    當遇到一個參數爲 NULL 時,不再解析其餘參數。

  • orafce 中的所有Oracle函數改成默認safe的,默認支持啓用並行處理。

E.1.2. plorasql 增強

  • PL/oraSQL 函數支持事務提交回滾。請參見 針對Oracle的增強功能

  • PL/oraSQL 函數支持 inout 參數。請參見 聲明函數參數

  • PL/oraSQL 函數支持DML語句。請參見 PL/oraSQL中執行DML

  • PL/oraSQL 存儲過程中支持使用CREATE DOMAIN創建遊標類型的變量。

    示例:

    SELECT dbms_output.serveroutput(true);
    CREATE TABLE employees(employee_id int, first_name varchar2(100), last_name varchar2(100));
    INSERT INTO employees values(1500, 'first15', 'last15');
    CREATE DOMAIN mycursor AS refcursor;
    CREATE OR REPLACE PROCEDURE get_employee_name AS
        employee_cursor mycursor;
        v_employee_name VARCHAR2(50);
    BEGIN
        OPEN employee_cursor FOR SELECT first_name FROM employees WHERE employee_id = 1500;
        LOOP
            FETCH employee_cursor INTO v_employee_name;
            EXIT WHEN employee_cursor%NOTFOUND;
            DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_employee_name);
        END LOOP;
        CLOSE employee_cursor;
    END;
    /
    call get_employee_name ();
    Employee Name: first15
    CALL
    
                    

E.1.3. MySQL 兼容

  • 新增 INSERT IGNORE 功能。 請參見 INSERT 。

    示例:

    create database test_mysql with lightdb_syntax_compatible_type  mysql;
    \c test_mysql
    
    create table t(a int primary key, b int);
    insert ignore into t(a,b) values(1,1),(1,1),(2,2);
    select * from t;
    a | b
    ---+---
    1 | 1
    2 | 2
    (2 rows)
                    
  • 新增 INSERT 支持對自增列插入NULL語法,每次插入都會根據序列進行自增。 請參見 INSERT NULL說明 。

  • 新增 JSON 函數集合。 請參見 myfce JSON函數 。 函數清單如下:

    JSON_ARRAY

    JSON_OBJECT

    JSON_EXTRACT

    JSON_CONTAINS

    JSON_CONTAINS_PATH

    JSON_PRETTY

    JSON_REMOVE

    JSON_INSERT

    JSON_REPLACE

    JSON_SET

  • 新增 lightdb_mysql_lower_case_table_names 參數。 使用 create database 語句創建數據庫時,可以指定參數來設置是否開啓大小寫敏感功能。 請參見 CREATE DATABASE 。

  • varchar 類型兼容 boolean 類型數據。 請參見 myfce 。

E.1.4. lightdb 新特性

  • 新增 lt_upgrade_check 升級前檢查工具,用於提前檢查升級不兼容及異常項,儘量避免在升級過程中出現失敗。請參見 lt_upgrade_check 。

  • 新增 ECPG 代碼中支持使用 ‘–’ 和 ‘//’ 註釋。 請參見 ECPG 。

  • 新增服務端、客戶端支持GBK,GB18030-2022,已通過塞西最高級別認證。 請參見 本地化 。

  • 新增 lt_createdb 行爲在CN分佈式下默認傳播到DN節點。 請參見 lt_createdb 。

  • 新增 lightdb_cursor_after_commit GUC參數來控制fetch行爲。 lightdb_cursor_after_commit 爲 off 時不能在一個事務提交之後再去 fetch操作這個結果集; 爲 on 時一個事務提交之後,這個遊標還可以繼續使用。 請參見 lightdb_cursor_after_commit 。

  • 新增 distinct connect by level 語法支持。

  • 新增 connect_by_isleaf 語法支持。 請參見 SELECT 。

  • ltsql 增強支持提示當前服務數據庫的兼容模式。

  • lt_upgrade 增強支持跨版本升級。

  • ltloader 增強性能,達到Oracle sqlldr的80%以上。 請參見 ltldr 。

  • lt_dump 增強。 請參見 lt_dump 。 清單如下:

    --lt-exclude-lightdb-objects 支持過濾內置用戶 lightdb 和 lt_probackup

    --lt-exclude-lightdb-objects 支持導出 ACCESS METHOD

    lt_dump 和 lt_dumpall 增加 --lt-target-version 選項,用於指定導出的內容所適用的目標版本。

    導出默認的創建模版支持爲 template1

    create database 語句支持 lightdb_syntax_compatible_type 選項邏輯。

  • mysql_fdw 增強支持查詢超過64K的字段。

E.1.5. ltjdbc 增強

  • ltjdbc 支持 numeric 使用 Short 類型。

  • ltjdbc 支持setNull傳入 Types.CLOB 和 Types.BLOB 。

  • ltjdbc 支持整型數值使用 string 類型。

  • ltjdbc 支持函數 xmlparse

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章