版本发布日期:. 2023年12月31日
支持set define
命令,可以用于开启或关闭变量替换功能。
请参见set define on/off 命令。
客户端命令行支持'/'。 请参见斜杠。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle Select 1+2; ?column? ---------- 3 (1 row) /
支持大写字段名加双引号进行查询。 请参见词法结构。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle create table t1(id int, "Id" int); insert into t1 values(1,2),(3,4),(5,6); select "ID" from t1; ID ---- 1 3 5 (3 rows)
支持timestamp
、oracle.date
和数值的加减运算。
请参见orafce。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle Create table t_data(dt date, d1 integer, d2 bigint, d3 smallint, d4 numeric(10, 2), dd date); insert into t_data values(to_date('2023-11-28 20:10:30', 'YYYY-MM-DD HH24:mi:ss'), 1, 2, 3, 4.4, to_date('2023-11-27 20:10:30', 'YYYY-MM-DD HH24:mi:ss')); insert into t_data values(to_date('2023-11-28 00:00:01', 'YYYY-MM-DD HH24:mi:ss'), 1, 2, 3, 4.5, to_date('2023-11-27 00:00:02', 'YYYY-MM-DD HH24:mi:ss')); select dt, dt - d1, dt - d1 + d2 , dt - d1 + d2 - d3, dt - d1 + d2 - d3 + d4, dt - dd from t_data; dt | ?column? | ?column? | ?column? | ?column? | ?column? ---------------------+---------------------+---------------------+---------------------+---------------------+------------------------ 2023-11-28 20:10:30 | 2023-11-27 20:10:30 | 2023-11-29 20:10:30 | 2023-11-26 20:10:30 | 2023-12-01 05:46:30 | 1.00000000000000000000 2023-11-28 00:00:01 | 2023-11-27 00:00:01 | 2023-11-29 00:00:01 | 2023-11-26 00:00:01 | 2023-11-30 12:00:01 | 0.99998842592592592500 (2 rows)
支持rownum
作为右值表达式来使用。
请参见ROWNUM。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle SELECT TO_CHAR(TO_DATE(TRIM('20230110'), 'YYYYMMDD') + ROWNUM, 'YYYYMMDD') from dual; to_char ---------- 20230111 (1 row)
支持decode
函数参数中数值类型与该数值小数位带有无效0等价。
请参见DECODE。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle SELECT decode(0.0, 0, 1, 2), decode(0, 0, 1, 2), decode(0, 0.0, 1, 2), decode(0, 1, 2, 0.0, 4, 5) FROM dual; decode | decode | decode | decode --------+--------+--------+-------- 1 | 1 | 1 | 4 (1 row) SELECT decode(1.10, 1.1, 1, 2) FROM dual; decode -------- 1 (1 row) SELECT decode(1.0, 1, 1, 2) FROM dual; decode -------- 1 (1 row)
substr
函数支持text,numeric,numeric
或者text,numeric
参数组合。
请参见orafce。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle create table tt_substr(a number(10), b number(10)); INSERT INTO tt_substr (a, b) VALUES(2, 1); select substr('aaaaa'::varchar2, 2, a + b) FROM tt_substr; substr -------- aaa (1 row) select substr('aaaaa'::varchar2, a) FROM tt_substr; substr -------- aaaa (1 row)
to_char
函数将日期、数字格式改成文本格式呈现。
请参见orafce。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle Select to_char(sysdate+1 + interval '-1' year,'d','NLS_DATE_LANGUAGE=''SIMPLIFIED CHINESE'''); to_char --------- 6 (1 row)
rawtohex
函数支持uuid
类型作参数。
请参见orafce。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle select rawtohex(sys_guid()) from dual; rawtohex ---------------------------------- 6653ab0b8ad34634bdc1645f3f264455 (1 row)
rowidtochar
函数将rowid
类型转换为字符类型。
请参见orafce。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle create table tt1(idd int); insert into tt1 values(3); create table tt7 as select rowidtochar(rowid) as rowid1,* from tt1; \d tt7 Table "public.tt7" Column | Type | Collation | Nullable | Default --------+----------+-----------+----------+--------- rowid1 | varchar2 | | | idd | integer | | |
to_timestamp
将字符型时间值转换为时间戳格式。
请参见orafce。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle SELECT TO_TIMESTAMP('2023-10-11 10:10:10', 'YYYY-MM-DD HH:MI:SS PM') FROM dual; to_timestamp ------------------------ 2023-10-11 10:10:10+08 (1 row)
支持empty_clob/empty_blob
初始化lob
对象,
返回不为null
, 即empty_blob()
is null
不成立。
请参见orafce。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle Select empty_clob(); empty_clob ------------ (1 row) Select empty_blob(); empty_blob ------------ \x (1 row)
systimestamp(n)
支持精度参数。
请参见日期/时间函数。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle select current_timestamp,systimestamp(0); current_timestamp | systimestamp -------------------------------+------------------------ 2024-01-02 01:48:16.899369-05 | 2024-01-02 01:48:17-05 (1 row) select current_timestamp,systimestamp(1); current_timestamp | systimestamp -------------------------------+-------------------------- 2024-01-02 01:48:16.900603-05 | 2024-01-02 01:48:16.9-05
支持nvl
函数传参为null。
请参见orafce。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle select nvl(null::numeric, '0'); nvl ----- 0 (1 row)
支持to_date
函数时间的字符串与输出数据格式不匹配。
请参见orafce。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle select to_date('2022/02/02','yyyy-mm-dd') from dual; to_date --------------------- 2022-02-02 00:00:00 (1 row)
支持xmlparse
,xmlagg
函数。
请参见XML 函数。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle SELECT XMLPARSE(CONTENT '124 <purchaseOrder poNo="12435"> <customerName> Acme Enterprises</customerName> <itemNo>32987457</itemNo> </purchaseOrder>' WELLFORMED) AS PO FROM DUAL; po --------------------------------------------------- 124 <purchaseOrder poNo="12435"> <customerName> Acme Enterprises</customerName> <itemNo>32987457</itemNo> </purchaseOrder> (1 row)
创建分区表的名称不超过31个字符长度。 请参见CREATE TABLE。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle CREATE TABLE test_partition_table_len_31__lh(a int,b int) PARTITION BY list(a) SUBPARTITION BY hash(b) ( PARTITION p11 VALUES(1,2,3,4), PARTITION p12 VALUES(5,6,7,8) );
支持replace
重建object类型。
请参见CREATE TYPE。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle CREATE OR REPLACE TYPE employee_type AS OBJECT( x int, y int, MEMBER FUNCTION psum(a int, b int) RETURN int, MEMBER PROCEDURE p(prompt varchar) ); CREATE TYPE.
支持alter session enable/disable parallel dml
命令。
请参见ALTER SESSION。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle alter session enable parallel dml;
支持tabs
视图,用来查看数据库中所有表空间及其关联对象信息的内置视图。
请参见orafce。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle CREATE TABLE measurement ( city_id int not null, logdate date not null, peaktemp int, unitsales int ) PARTITION BY RANGE (logdate); SELECT table_name, tablespace_name FROM oracle.TABS WHERE TABLE_NAME IN ('TEST_VIEW', 'MEASUREMENT', 'MEASUREMENT_Y2018') ORDER BY TABLE_NAME; table_name | tablespace_name -------------+----------------- MEASUREMENT | DEFAULT (1 row)
支持普通表在线转换成list
类型分区表,并且同步更新索引。
请参见CREATE TABLE。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle CREATE TABLE my_list_tab ( a NUMBER(38,0), cu VARCHAR2(20)); insert into my_list_tab values(1,'china'); insert into my_list_tab values(2,'THAILAND'); insert into my_list_tab values(3,'GERMANY'); insert into my_list_tab values(4,'ITALY'); insert into my_list_tab values(5,'SWITZERLAND'); insert into my_list_tab values(6,'AMERICA'); insert into my_list_tab values(7,'INDIA'); CREATE INDEX i_a ON my_list_tab (a); CREATE INDEX i_cu ON my_list_tab (cu); ALTER TABLE my_list_tab MODIFY PARTITION BY LIST (cu) ( PARTITION asia VALUES ('CHINA', 'THAILAND'), PARTITION europe VALUES ('GERMANY', 'ITALY', 'SWITZERLAND'), PARTITION west VALUES ('AMERICA'), PARTITION east VALUES ('INDIA'), PARTITION rest VALUES (DEFAULT)) online update indexes ( i_a GLOBAL, i_cu local ); \d+ my_list_tab Partitioned table "public.my_list_tab" Column | Type | Collation | Nullable | Default | Storage | Stats target | Description --------+---------------+-----------+----------+---------+----------+--------------+------------- a | numeric(38,0) | | | | main | | cu | varchar2(20) | | | | extended | | Partition key: LIST (cu) Indexes: "i_a" btree (a) "i_cu" btree (cu) Partitions: "my_list_tab$asia" FOR VALUES IN ('CHINA', 'THAILAND'), "my_list_tab$east" FOR VALUES IN ('INDIA'), "my_list_tab$europe" FOR VALUES IN ('GERMANY', 'ITALY', 'SWITZERLAND'), "my_list_tab$west" FOR VALUES IN ('AMERICA'), "my_list_tab$rest" DEFAULT
SELECT
多表查询使用(+)做外连接时,支持在where条件中非重复列可以不指定表名。
请参见SELECT。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle Create table t1(key1 int, key2 int); Create table t2(key1 int); Select * from t1, t2 where t1.key1(+)=t2.key1 and key2=2; key1 | key2 | key1 ------+------+------ (0 rows)
支持聚合count(*)
运算与order by
结合运算。
请参见SELECT。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle CREATE TABLE EMP ( EMPNO NUMBER(4, 0), ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER(4, 0), HIREDATE DATE, SAL NUMBER(7, 2), COMM NUMBER(7, 2), DEPTNO NUMBER(2, 0), DNAME VARCHAR2(100), CONSTRAINT PK_EMP PRIMARY KEY (EMPNO) ); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DNAME) values (7369, 'SMITH', 'CLERK', 7902, to_date('1980-12-17','yyyy-mm-dd'), 800.00, null, 20, null); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DNAME) values (7499, 'ALLEN', 'SALESMAN', 7698, to_date('1981-02-20','yyyy-mm-dd'), 1600.00, 300.00, 30, null); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DNAME) values (7521, 'WARD', 'SALESMAN', 7698, to_date('1981-02-22','yyyy-mm-dd'), 1250.00, 500.00, 30, null); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DNAME) values (7566, 'JONES', 'MANAGER', 7839, to_date('1981-04-02','yyyy-mm-dd'), 2975.00, null, 20, null); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DNAME) values (7654, 'MARTIN', 'SALESMAN', 7698, to_date('1981-09-28','yyyy-mm-dd'), 1250.00, 1400.00, 30, null); select count(*) from emp order by empno; count ------- 6 (1 row)
connect by
支持绑定变量。
请参见SELECT。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle PREPARE my_query (VARCHAR) AS SELECT LEVEL, empno FROM emp CONNECT BY PRIOR empno = mgr START WITH ename = $1; EXECUTE my_query('ALLEN'); level | empno -------+------- 1 | 7499 (1 row)
merge into
语句中支持insert
语句分支使用表别名。
请参见MERGE INTO。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle CREATE TABLE EMP ( EMPNO NUMBER(4, 0), ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER(4, 0), HIREDATE DATE, SAL NUMBER(7, 2), COMM NUMBER(7, 2), DEPTNO NUMBER(2, 0), DNAME VARCHAR2(100), CONSTRAINT PK_EMP PRIMARY KEY (EMPNO) ); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DNAME) values (7369, 'SMITH', 'CLERK', 7902, to_date('1980-12-17','yyyy-mm-dd'), 800.00, null, 20, null); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DNAME) values (7499, 'ALLEN', 'SALESMAN', 7698, to_date('1981-02-20','yyyy-mm-dd'), 1600.00, 300.00, 30, null); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DNAME) values (7521, 'WARD', 'SALESMAN', 7698, to_date('1981-02-22','yyyy-mm-dd'), 1250.00, 500.00, 30, null); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DNAME) values (7566, 'JONES', 'MANAGER', 7839, to_date('1981-04-02','yyyy-mm-dd'), 2975.00, null, 20, null); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DNAME) values (7654, 'MARTIN', 'SALESMAN', 7698, to_date('1981-09-28','yyyy-mm-dd'), 1250.00, 1400.00, 30, null); declare i number; begin execute immediate q'[MERGE INTO emp e USING ( SELECT 1 as empno, 'ename' as ename FROM dual ) new_data ON (e.empno = new_data.empno) WHEN MATCHED THEN UPDATE SET e.ename = new_data.ename WHEN NOT MATCHED THEN INSERT (e.empno, e.ename) VALUES ( new_data.empno, new_data.ename )]'; commit; end; /
新增6个优化器提示(hint
)。
请参见lt_hint_plan。
支持ignore_row_on_dupkey_index
hint
。
提示忽略特定列集或指定索引的唯一键违规。
支持push_subq
hint
。
提示强制优化器不下推带子链接的过滤条件,而在最后才使用此条件过滤数据。
支持no_push_subq
hint
。
提示强制优化器下推带子链接的过滤条件,尽可能早的使用此条件过滤数据。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle create table test_no_push_subq1 as select * from pg_class order by oid limit 100; create table test_no_push_subq2 as select * from pg_class order by oid limit 100; create table test_no_push_subq3 as select * from pg_class order by oid limit 100; create table test_no_push_subq4 as select * from pg_class order by oid limit 100; EXPLAIN (COSTS false) select a.oid from test_no_push_subq1 a join test_no_push_subq3 b on a.reltype =b.reltype and a.oid = b.oid where a.oid = (select/*+no_push_subq*/ max(oid) from test_no_push_subq2); QUERY PLAN ------------------------------------------------------------ Hash Join Hash Cond: ((a.reltype = b.reltype) AND (a.oid = b.oid)) Join Filter: (a.oid = $0) InitPlan 1 (returns $0) -> Aggregate -> Seq Scan on test_no_push_subq2 @"lt#0" -> Seq Scan on test_no_push_subq1 a @"lt#1" -> Hash -> Seq Scan on test_no_push_subq3 b @"lt#1" (9 rows)
支持opt_param
hint
。
提示在生成执行计划的过程中修改guc
参数。
支持no_star_transformation
hint
。
提示优化器不执行星型查询转换。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle CREATE TABLE times ( time_id NUMBER PRIMARY KEY, calendar_quarter_desc VARCHAR2(20) ); CREATE TABLE customers ( cust_id NUMBER PRIMARY KEY, cust_city VARCHAR2(20), cust_state_province VARCHAR2(20) ); CREATE TABLE channels ( channel_id NUMBER PRIMARY KEY, channel_class VARCHAR2(20), channel_desc VARCHAR2(20) ); CREATE TABLE sales ( time_id NUMBER REFERENCES times(time_id), cust_id NUMBER REFERENCES customers(cust_id), channel_id NUMBER REFERENCES channels(channel_id), amount_sold NUMBER ); EXPLAIN (COSTS false) SELECT/*+no_star_transformation*/ ch.channel_class, c.cust_city, t.calendar_quarter_desc, SUM(s.amount_sold) sales_amount FROM sales s, times t, customers c, channels ch WHERE s.time_id = t.time_id AND s.cust_id = c.cust_id AND s.channel_id = ch.channel_id AND c.cust_state_province = 'CA' AND ch.channel_desc in ('Internet','Catalog') AND t.calendar_quarter_desc IN ('1999-Q1','1999-Q2') GROUP BY ch.channel_class, c.cust_city, t.calendar_quarter_desc; LOG: lt_hint_plan: used hint: no_star_transformation not used hint: duplication hint: error hint: QUERY PLAN ---------------------------------------------------------------------------- --------------------------- GroupAggregate Group Key: ch.channel_class, c.cust_city, t.calendar_quarter_desc -> Sort Sort Key: ch.channel_class, c.cust_city, t.calendar_quarter_desc -> Nested Loop -> Nested Loop -> Hash Join Hash Cond: (s.cust_id = c.cust_id) -> Seq Scan on sales s @"lt#0" -> Hash -> Seq Scan on customers c @"lt#0" Filter: ((cust_state_province)::text = 'CA'::text) -> Index Scan using times_pkey on times t @"lt#0" Index Cond: (time_id = s.time_id) Filter: ((calendar_quarter_desc)::text = ANY ('{1 999-Q1,1999-Q2}'::text[])) -> Index Scan using channels_pkey on channels ch @"lt#0" Index Cond: (channel_id = s.channel_id) Filter: ((channel_desc)::text = ANY ('{Internet,Catalog }'::text[])) (18 rows)
支持no_push_pred
hint
。
提示优化器不要将连接谓词推送到子查询中。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle create table test_no_push_pred1 (key1 int primary key, key2 int); create table test_no_push_pred2 (key1 int primary key, key2 int); create table test_no_push_pred3 (key1 int primary key, key2 int); set enable_hashjoin to off; set enable_mergejoin to off; EXPLAIN (COSTS false) select /*+leading(a) no_push_pred(b)*/* from test_no_push_pred1 a join (select * from test_no_push_pred2 order by key1 limit 1) b on a.key1 =b.key2; QUERY PLAN ---------------------------------------------------------------------------- ------ Nested Loop Join Filter: (a.key1 = test_no_push_pred2.key2) -> Seq Scan on test_no_push_pred1 a @"lt#1" -> Materialize -> Limit -> Index Scan using test_no_push_pred2_pkey on test_no_push_pred2 (6 rows)
支持append
hint
。
提示优化器对insert
select
模式的语句使用 direct-path 插入。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle create table test_append(key1 int, key2 int, key3 int, key4 int); create table test_append1(key1 int, key2 int, key3 int, key4 int); insert into test_append1 values(1,2,3,4); insert into test_append1 values(11,21,31,41); insert into test_append1 values(111,211,311,411); EXPLAIN (COSTS FALSE) insert/*+append */ into test_append select 1, 1, 1, 2 from dual; LOG: lt_hint_plan: used hint: not used hint: append duplication hint: error hint: QUERY PLAN ------------------------------- Insert on test_append @"lt#1" -> Result (2 rows)
to_char
支持HH24MiSS
时间格式。
请参见orafce。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle select to_char(timestamp 'now','HH24MiSS'); to_char --------- 042121 (1 row)
table
表函数column_value
伪列。
请参见表函数。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle create type phone as table of int; CREATE TYPE select column_value from table(phone(3,6,9)); column_value -------------- 3 6 9 (3 rows)
支持pivot
函数。
只支持单聚集函数,单列多组的情景。
请参见orafce。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle create table test123(name varchar(40),chinese int,math int, course varchar(40), score int); insert into test123 values('lisi',88,99,'math',99); insert into test123 values('lisi',88,99,'chinese',88); insert into test123 values('zhangsan',90,100,'chinese',90); insert into test123 values('zhangsan',90,100,'math',100); select * from test123 pivot (sum(score) for course in('chinese','math')); name | chinese | math | 'chinese' | 'math' ----------+---------+------+-----------+-------- lisi | 88 | 99 | 88 | 99 lisi | 89 | 100 | | 99 lisi | 100 | 70 | 100 | zhangsan | 76 | 89 | 99 | zhangsan | 90 | 100 | 90 | 100 zhangsan | 95 | 85 | | 100 (6 rows) drop table test123;
merge into
支持cte
通用表表达式。
请参见 MERGE INTO。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle CREATE TABLE target (tid integer, balance integer); CREATE TABLE source (sid integer, delta integer); INSERT INTO target VALUES (2, 20); INSERT INTO target VALUES (3, 30); INSERT INTO source VALUES (1, 11); INSERT INTO source VALUES (5, 55); WITH s AS ( SELECT sid, delta FROM source ), U AS ( UPDATE target AS t SET tid = 5 FROM s WHERE t.tid = s.sid RETURNING t.tid ) INSERT INTO target ( SELECT * FROM s where sid NOT IN ( SELECT tid FROM U) ); table target; tid | balance -----+--------- 2 | 20 3 | 30 5 | 10 1 | 11 (4 rows)
支持不可变表(Immutable
)。
请参见CREATE TABLE。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle CREATE IMMUTABLE TABLE trade_ledger1 (id NUMBER, luser VARCHAR2(40), value NUMBER) NO DROP NO DELETE; CREATE TABLE
group by
跟随字符串常量。
请参见SELECT
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle select * from dual group by 1; dummy ------- X (1 row)
支持alter
给表添加约束。
请参见ALTER TABLE。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle create table add_constraints(id int); alter table add_constraints add constraint u_add_constraints unique(id); ALTER TABLE
支持listagg
on overflow truncate
和error
语法。
请参见orafce。
创建视图支持force editionable
和with read only
语法。
请参见CREATE VIEW。
支持全局临时表创建在不同schema
模式下。
请参见System Catalogs。
varchar2支持toast属性。 请参见orafce。
number
类型格式化不保留小数后缀无效0。
请参见orafce。
示例:
create database test_oracle with lightdb_syntax_compatible_type oracle; \c test_oracle select nvl(cast(NULL as int),'1.100'); nvl ----- 1.1 (1 row)
支持dblink
。
请参见oracle_fdw。
新增 CAST
强制转换成SIGNED
或UNSIGNED
目标类型。
请参见 MySQL兼容函数。
示例:
create database test_mysql with lightdb_syntax_compatible_type mysql; \c test_mysql select cast(2.5 as unsigned); numeric2unsigned ------------------ 3 (1 row) select cast('2.5' as unsigned); numeric2unsigned ------------------ 3 (1 row) select cast(2.5 as signed); signed -------- 3 (1 row) select cast('2.5' as signed); signed -------- 2 (1 row)
新增 CAST
强制转换成CHAR
目标类型,
CHAR
默认长度为1,强转的数字、字符串超过长度1不会被截断,上限为1GB。
请参见 data type。
示例:
create database test_mysql with lightdb_syntax_compatible_type mysql; \c test_mysql select cast(2.5 as char); varchar --------- 2.5 (1 row)
支持数值类型与空字符比较。 此时空串的值为0。 请参见 MySQL兼容函数。
示例:
create database test_mysql with lightdb_syntax_compatible_type mysql; \c test_mysql select 0 = ''; ?column? ---------- t (1 row)
当字符(仅包括text
,varchar
,char
)转换成
数值(仅包括int
,bigint
,numeric
,small int
)时,
忽略尾部的不合法字符。
示例:
create database test_mysql with lightdb_syntax_compatible_type mysql; \c test_mysql select '1a' >''; ?column? ---------- t (1 row)
优化transform_null_equals
参数。
兼容null
和''
的关系运算。
请参见 MySQL兼容函数。
示例:
create database test_mysql with lightdb_syntax_compatible_type mysql; \c test_mysql SELECT '' IS null; ?column? ---------- f (1 row) SELECT null = ''; ?column? ---------- (1 row)
支持时间类型与字符串。 请参见 MySQL兼容函数。
示例:
create database test_mysql with lightdb_syntax_compatible_type mysql; \c test_mysql select current_date > '2023-01-01'; ?column? ---------- t (1 row)
增加时间类型函数。
DATEDIFF
函数。
支持日期与数值类型求差,数值类型与数值类型求差;
当数值型为浮点型时,先truncate
浮点型为整型后,再进行求差。
请参见 MySQL兼容函数。
示例:
create database test_mysql with lightdb_syntax_compatible_type mysql; \c test_mysql SELECT DATEDIFF(curdate(),curdate()+1.5); datediff ---------- -1 (1 row) SELECT DATEDIFF(curdate(),curdate()-1.5); datediff ---------- 2 (1 row)
TIMESTAMPDIFF
函数。
请参见 MySQL兼容函数。
CURRENT_DATE
函数。
请参见 当前日期/时间。
CURDATE
函数。
函数返回格式只支持'YYYY-MM-DD'
,并且不支持乘除运算。
请参见 MySQL兼容函数。
QUARTER
函数。
返回日期代表的季度,数字范围为1 ~ 4。
如果日期为 NULL
则返回NULL
;
入参仅支持 date
和 timestamp
(也即datetime
) 类型。
请参见 MySQL兼容函数。
LAST_DAY
函数。
返回参数所在月份的最后一天的日期值。
请参见 MySQL兼容函数。
SUBSTRING_INDEX
函数。
从指定字符串中返回指定分隔符出现n次数前的子字符串。
请参见 MySQL兼容函数。
UUID
函数。
生成一个36字节的UUID
字符串。
请参见 MySQL兼容函数 。
AES
加解密。
持下列AES加解密和十六进制转换操作。
请参见 MySQL兼容函数 。
HEX
函数。
HEX
函数将bytea
类型数据转成text
类型。
UNHEX
函数。
UNHEX
函数将varchar
类型数据转成bytea
类型。
AES_ENCRYPT
函数。
AES
加密函数。
AES_DECRYPT
函数。
AES
解密函数。
时间类型支持字符串赋值。
在insert
和update
语句中,
可以使用char(n)
,varchar
和text
类型的值
给timestamp with time zone
, datetime
类型的属性赋值。
请参见 MySQL兼容函数。
支持动态预处理语句。
示例:
create database test_mysql with lightdb_syntax_compatible_type mysql; \c test_mysql create table my_table(a varchar(200)); SET @sql = 'INSERT INTO my_table values(''a'')'; @sql ---------------------------------- INSERT INTO my_table values('a') (1 row) PREPARE stmt FROM @sql; EXECUTE stmt; INSERT 0 1 DEALLOCATE PREPARE stmt;
WITH ROLLUP
语法,在聚合查询中生成额外行来进行数据汇总。
请参见 GROUP BY
子句 。
示例:
create database test_mysql with lightdb_syntax_compatible_type mysql; \c test_mysql CREATE TABLE score ( id int, name varchar(100), course varchar(100), score int ); INSERT INTO score VALUES(1,'zhangsan','yuwen',58); INSERT INTO score VALUES(2,'lisi','shuxue',38); SELECT name, COUNT(id), SUM(score) FROM score GROUP BY name WITH ROLLUP; name | count | sum ----------+-------+----- | 2 | 96 lisi | 1 | 38 zhangsan | 1 | 58 (3 rows)
CASE WHEN
类型兼容。
CASE WHEN
表达式的结果集可以是字符,数值,日期。
同时包含字符,数值和日期中任意两种及两种以上时,返回值的类型为字符串。
请参见 条件表达式 。
数值类型兼容布尔类型。 integer类型的值作为布尔值使用。 请参见 MySQL兼容函数。
自增序列支持NULL
。
请参见 MySQL兼容函数。
lightdb.conf
中新增guc
参数修改记录。
请参见 通过SQL影响参数 。
所有的类型,系统表,函数的oid
内置不变。
调整关键字级别。 请参见 SQL关键词。
模板库区分Oracle、MySQL 和Postgres模式。 请参见 CREATE DATABASE 。
支持numeric
转换为varchar
。
支持int
转换为double
。
支持varchar
转换为long
。
支持timestamptz
转换为java.time.LocalDateTime
。
支持匿名块参数绑定,绑定个数最多为32767。
支持clob.setCharacterstream
函数。
支持metaData
的getColumnType
方法返回varchar2
类型。
主键冲突抛出异常java.sql.SQLIntegrityConstraintViolationException
。
绑定参数使用setNull
传值,类型能够正确匹配。
pivot
。