Release date: 2023-06-30
            The CHAR data type now supports specifying
            byte or character lengths. When defining a column in a table
            using the CHAR data type, you can now
            specify the length of the column value, which can be either
            byte length or character length. See
            Character Types.
          
For example:
create table t (id char (1 char)); create table t (id char (1 byte));
            The hierarchical query has been enhanced to include new
            features such as CONNECT_BY_ROOT, which
            displays the root node of the current row, and
            CONNECT BY LEVEL < n, which displays all
            recursive results up to a specified level
            n. Additionally, hierarchical queries now
            support subqueries, join queries, and expression calculations.
            See CONNECT BY Clause.
          
For example:
SELECT employee, CONNECT_BY_ROOT employee_id as "Manager", SYS_CONNECT_BY_PATH(employee, '/') "Path" FROM example START WITH manager_id is not null CONNECT BY PRIOR employee_id = manager_id ORDER BY employee_id, manager_id; employee | Manager | Path ----------+---------+----------- Josh | 2 | /Josh Ali | 3 | /Ali Ali | 2 | /Josh/Ali Kyle | 5 | /Kyle (4 rows)
            The ALTER TABLE command has been enhanced
            to support deleting indexes and constraints on the same
            column. See ALTER TABLE.
          
For example:
ALTER TABLE my_table DROP CONSTRAINT my_constraint, DROP INDEX my_index;
            Support the use of the + symbol to
            represent LEFT JOIN and
            RIGHT JOIN. See
            oracle plus.
          
For example:
SELECT * FROM table1, table2 WHERE table1.id = table2.id (+);
            USING INDEX clause is now supported
            in CREATE TABLE and ALTER TABLE
            statements to specify an index to support a constraint. See
            ALTER TABLE.
          
For example:
ALTER TABLE employees ADD CONSTRAINT emp_id_pk PRIMARY KEY (id) USING INDEX;
            FROM is now optional
            in DELETE statements. See
            DELETE.
          
For example:
DELETE table_name WHERE col = 1;
            SYS.COL system view is now available to
            display columns information for all tables, including column
            name, data type, length, precision, nullability, default
            value, and character set name. See
            orafce.
          
For example:
  create table test_col_view(key0 varchar(100), key1 number not null, key2 number(38,0));
  select * from col where tname= 'TEST_COL_VIEW' order by colno;
       tname     | colno | cname |  coltype  | width | scale | precision |  nulls   | defaultval | character_set_name
  ---------------+-------+-------+-----------+-------+-------+-----------+----------+------------+--------------------
   TEST_COL_VIEW |     1 | KEY0  | VARCHAR   | 100   |       |           | NULL     |            |
   TEST_COL_VIEW |     2 | KEY1  | NUMBER    |       |       |           | NOT NULL |            |
   TEST_COL_VIEW |     3 | KEY2  | NUMBER    | 38,0  |     0 |        38 | NULL     |            |
  (3 rows)
  
            INSERT ALL syntax is now supported for
            inserting multiple rows into one or more tables in a single
            statement. See INSERT.
          
For example:
  INSERT ALL
      INTO table_name (column1, column2, column3) VALUES (value1, value2, value3)
      INTO table_name (column1, column2, column3) VALUES (value1, value2, value3)
  SELECT 1 FROM DUAL;
  
            INSERT INTO statement now supports using
            aliases to specify the table to insert data into. See
            INSERT.
          
For example:
INSERT INTO employees e (employee_id, first_name, last_name) VALUES (1001, 'John', 'Doe');
            MERGE INTO statement now supports
            distributed scenarios. See MERGE
            INTO.
          
For example:
  MERGE INTO target t
  USING source s
  ON t.tid = s.sid
  WHEN MATCHED THEN
      update set balance = t.balance + s.delta
  WHEN NOT MATCHED THEN
      INSERT VALUES(s.sid, s.delta);
  
            Support implicit type
            conversion for NUMBER and BOOLEAN data
            types. See orafce.
          
For example:
select 0::NUMBER = TRUE; ?column? ---------- f (1 row) select 1::NUMBER = TRUE; ?column? ---------- t (1 row)
Partitioned tables are now more compatible with Oracle, as they support both Oracle-compatible partition naming and operations on subpartitions. See ALTER TABLE.
For example:
alter table lt_truncate_t_r truncate partition p1; alter table lt_truncate_t_r add partition p2 values less than(30); alter table lt_truncate_t_r truncate partition p2; alter table lt_truncate_t_r drop partition p2;
            CREATE TABLE now supports the
            STORAGE, compress /
            nocompress, and logging
            / nologging keywords, although these are
            only syntactic sugar and do not provide actual functionality.
            See CREATE TABLE.
          
For example:
create table comp_log1(id int) compress; create table comp_log3(id int) logging; create table comp_log5(id int) compress logging; create table comp_log13(id int) storage(abcd);
            PROMPT command is now supported to
            display text messages to users. See
            prompt command.
          
For example:
  PROMPT Creating table...
  CREATE TABLE test_table (
    id NUMBER PRIMARY KEY,
    name VARCHAR2(50)
  );
  PROMPT Inserting data...
  BEGIN;
  INSERT INTO test_table (id, name) VALUES (1, 'John Doe');
  INSERT INTO test_table (id, name) VALUES (2, 'Jane Smith');
  COMMIT;
  PROMPT Querying data...
  SELECT * FROM test_table;
  DROP table test_table;
  PROMPT Done.
  
            ALTER INDEX now supports the
            REBUILD keyword to rebuild a specific
            index. See ALTER INDEX.
          
For example:
CREATE TABLE tt(a int); CREATE INDEX idx_tt_a on tt(a); ALTER INDEX idx_tt_a REBUILD;
            SEQUENCE statement now supports
            order / noorder /
            nocycle / nocache
            keywords, although these are only syntactic sugar and do not
            provide actual functionality. See
            CREATE SEQUENCE.
          
For example:
create sequence lt_seq_test1 order start 100; create sequence lt_seq_test3 start 100 nocycle; create sequence lt_seq_test5 start 100 ORDER nocache NOCYCLE; alter sequence lt_seq_test1 nocache nocycle noorder;
            CREATE FORCE VIEW statement is now
            supported, although this is only syntactic sugar and does not
            provide actual functionality. See
            CREATE VIEW.
          
For example:
CREATE FORCE VIEW force_view as SELECT 1 as ltapk, 2 as ltaut;
            ECPG(Oracle Pro*c Compatible) now supports anonymous execution
            blocks with binding parameters. See
            Executing a Do
            Statement with Input and Output Parameters.
          
For example:
  EXEC SQL EXECUTE
   begin
       begin
          update/*3631412*/ t1 set c = 'C' where id = :v_error_no;
           exception
              when others then
                  :iReturnCode = 456;
                  rollback;
              when DUP_VAL_ON_INDEX then
                  null;
          if SQL%NOTFOUND then
              null;
          end if;
       end;
   end;
  END-EXEC;
  
            Added support for sqlcode in pl/sql.
            Users can now create functions that return
            sqlcode values like in Oracle. See
            support SQLCODE.
          
For example, the following code will output the SQL error code when a zero divide error occurs:
  create or replace function zero_divide_f return int as
    a int := 10;
    b int := 0;
    code int;
  begin
    a := a / b;
    exception
      when zero_divide then
        code := sqlcode;
        dbms_output.put_line('this is a normal error ' || code || ' ' || sqlcode || 'sqlcode_to_sqlstate(code) || ' ' ||sqlcode_to_sqlstate(sqlcode));
    return 1;
  end;
  /
  
            Added support for the with clause in
            pl/sql. Users can now use the with clause
            to define temporary result sets within a single SQL statement.
            See Execute a
            DML Query with with_clause.
          
For example:
  declare
      v_count varchar(100);
  begin
      with tmp as (select * from company where id=2) select * into v_count from tmp;
      DBMS_OUTPUT.PUT_LINE(v_count);
  end;
  /
  
            Added support for parsing the
            PRAGMA AUTONOMOUS_TRANSACTION syntax in
            pl/sql. Note that this is a syntax sugar feature and does
            not implement the actual functionality in Oracle. See
            AUTONOMOUS
            TRANSACTION Pragma.
          
For example:
  CREATE OR REPLACE PROCEDURE test_pragma_procedure()
  IS
    PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
      NULL;
  END;
  /
  Enabled case-insensitive cursor variable names in pl/sql. This means that users can now use cursor variable names with different capitalizations than when they were declared without causing syntax errors. See Cursors .
For example:
  DECLARE
    CURSOR D_tmp(zxc NUMBER,bnm NUMBER,ff smallint default 1234) IS
          SELECT ff || a as feiwu FROM tt;
    ddd D_tMp%ROWTYPE;
    BEGIN
      OPEN D_tmP(5,6);
      FETCH d_tmp INTO ddd;
      DBMS_OUTPUT.PUT_LINE(ddd.feiwu);
      CLOSE D_tmP;
  end;
  /
  
            Added support for referencing the type of a variable defined
            in a package using the %TYPE syntax in
            pl/sql. See
            Declarations .
          
For example:
  create table t_binjiang(a int, b int);
  -- define package
  create or replace package pkgtype is
    v_a int := 0;
    v_b int := 0;
  end;
  /
  -- anonymous block references variables in the package
  declare
      a pkgtype.v_a%type := 1;
      b pkgtype.v_b%type := 1;
  begin
      insert into t_binjiang values(a, b);
  end;
  /
  
            Added support for the goto statement in
            pl/sql. Users can now use the goto
            statement to jump to a specific label within a block. See
            GOTO Statement .
          
For example:
  DO $$
  BEGIN
      RAISE NOTICE 'out block 1';
      goto testlabel;
      RAISE NOTICE 'out block 2';
      <<testlabel>>
      BEGIN
          RAISE NOTICE 'in block 1';
          goto testlabel2;
          RAISE NOTICE 'in block 2';
      END;
      RAISE NOTICE 'out block 3';
      <<testlabel2>>
      RAISE NOTICE 'out block 4';
  END$$;
  NOTICE:  out block 1
  NOTICE:  in block 1
  NOTICE:  out block 4
  Enabled the ability to call package functions in distributed scenarios in pl/sql. See Packages .
For example:
  create or replace package typkg
  as
      type nt is table of tab1%rowtype;
      res nt;
      function myfunc(v int) return nt;
  end;
  /
  create or replace package body typkg
  as
      function myfunc(v int) return nt
      is
      begin
      res(1) := ROW(1,1);
      res(2) := ROW(2,2);
      res(3) := ROW(3,3);
      return res;
      end;
  end;
  /
  select * from table(typkg.myfunc(1)) t0
  where t0.a in (select a from tab1) order by t0.a;
  
            Supports
            DROP INDEX [IF EXISTS] index_name ON table_name;
            See DROP INDEX .
          
For example:
create table t1(id int); create unique index idx_t1_id on t1(id); drop index idx_t1_id on t1;
            Case-insensitive column querying and case-sensitive column
            display. In mysql mode, guc parameter
            lightdb_sql_mode is set to
            uppercase_identifier. See
            SELECT .
          
For example:
create table test_case_1(identifier1 varchar(10)); select * from test_case_1; identifier1 ------------- (0 rows) select IDentifier1 from test_case_1; IDentifier1 ------------- (0 rows) select identifier1 as IDentifier1 from test_case_1; IDentifier1 ------------- (0 rows)
            Supports INSERT IGNORE INTO syntax.
            INSERT IGNORE INTO statement is used to
            insert data into a table. If the inserted data violates
            uniqueness constraints such as primary key or unique index,
            the data will be ignored without throwing any errors or
            warnings. See INSERT .
          
For example:
INSERT IGNORE INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);
            Supports adding comments to database objects (such as tables,
            columns, etc.) using the COMMENT keyword.
            See CREATE TABLE .
          
For example:
  create table t1 (
      id int primary comment 'this is id of t1' not null,
      name varchar(10) not null comment 'this is name of t1'
  ) comment = 'this is t1';
  Supports JSON-related functions. See MySQL Compatible Functions .
            JSON_ARRAY: creates a JSON array.
          
            JSON_OBJECT: creates a JSON object.
          
            JSON_EXTRACT: extracts values from JSON
            data.
          
            JSON_CONTAINS: checks whether JSON data
            contains the specified value.
          
            JSON_CONTAINS_PATH: checks whether the
            specified path exists in JSON string.
          
            JSON_PRETTY: a function used to format JSON
            string. It takes an unformatted JSON string as input and
            formats it into an easy-to-read form.
          
            Supports sysdate() function for retrieving
            the current execution time. See
            Current
            Date/Time .
          
For example:
  select sysdate();
         sysdate
  ---------------------
   2023-05-09 13:21:13
  (1 row)
  
            Fixed the issue of dual virtual table in
            mysql mode, which caused unauthorized
            access for ordinary users. See
            MySQL Compatible Functions .
          
For example:
  create user mytestuser with password 'mytestuser';
  \c - mytestuser
  select 2 from dual;
   ?column?
  ----------
          2
  (1 row)
  PWR accurately measures real-time query IO events, IPC events, race conditions and other time overhead, and optimizes the performance report statistics of PWR. See lt_profile .
            lt_hint_plan optimizes scenarios that do
            not support hints and ignores unimplemented hints. See
            lt_hint_plan .
          
Supports incremental checkpoint to reduce the performance impact on the database system when triggering checkpoints. See CHECKPOINT .
            Supports debugging PL/pgsql stored
            procedures in pgadmin/navicat. See
            pldebugger .
          
            PL/pgsql supports execute immediate syntax.
            Note that this is only a syntax sugar feature and does not
            implement the corresponding functionality. See
            Executing
            Dynamic Commands .
          
For example:
  CREATE OR REPLACE FUNCTION get_employee_name_func(p_employee_id INTEGER)
  RETURNS VARCHAR AS $$
  DECLARE
      sql_query TEXT;
      emp_name  VARCHAR;
  BEGIN
      sql_query := 'SELECT first_name FROM test_employees WHERE employee_id = $1';
      EXECUTE IMMEDIATE sql_query INTO emp_name USING p_employee_id;
      RAISE NOTICE 'Employee name is: %', emp_name;
      RETURN emp_name;
  END;
  $$ LANGUAGE plpgsql;
  Released a client package. After extracting and configuring the environment variables, users can directly use the relevant tools, including the following tools:
            lt_distributed_probackup.py
          
            lt_distributed_dump.py
          
            lt_distributed_restore.py
          
            ltuldr
          
            lt_basebackup
          
            lt_dump
          
            lt_dumpall
          
            lt_isready
          
            lt_probackup
          
            lt_restore
          
            lt_verifybackup
          
            ltsql
          
            Added support for reading BLOB values in the form of byte
            arrays using
            the java.sql.ResultSet #getBlob (java.lang.String) method.
            See LightDB JDBC .
          
            Added support for executing SQL statements to create stored
            procedures and functions using syntax such
            as CREATE PROCEDURE and CREATE FUNCTION in
            the ltjdbc library. See LightDB
            JDBC .
          
            Added support for converting date column types
            to LocalDateTime objects using
            the java.sql.ResultSet#getObject(int, java.lang.Class<T>) method.
            See See LightDB JDBC .