ecpg 支持多种注释方式
原版的pg只支持在 ecpg 的 EXEC SQL 中使用 ‘/**/’ 形式的注释,因为ecpg 会转换SQL, 把SQL 转换为一行,去掉了换行符,导致 ‘–’ 和 ‘//’ 这种行注释的使用会有问题。在oracle 的pro*c 中这两种注释都支持。
LightDB 在 23.3 版本支持在ecpg代码中使用 ‘–’ 和 ‘//’ 注释。案例如下:
EXEC SQL
Do $asa$ -- :abcdef
declare
val text := $$:ad--/*sds*/ds$$;
begin
begin // :abcdef
-- :abcdef
// :abcdef
// :abcdef --:abcdef
--:abcdef // :abcdef
update/*3631412 :abcdef*/ t1 set c = '--///**/C :v_id' where id = :v_id;
if SQL%NOTFOUND then -- :abcdef
:iReturnCode = 1; // :abcdef
end if;
:iReturnCode = 0;
commit;
end;
end;
$asa$ Language plorasql;
exec sql create table t1(
id integer, // id
t text, -- id
d1 numeric, /* d1-- */
d2 float8,
c char(100));
在使用ecpg 程序转换时, 会把’–’ 和 ‘//’ 注释去掉。而’/**/’ 会保留在ECPGdo函数开头,具体如下所示:
/*3631412 :abcdef*/{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "do $asa$ \
declare\
val text := $$:ad--/*sds*/ds$$ ;\
begin\
begin \
\
\
update t1 set c = '--///**/C :v_id' where id = $1 ;\
\
if SQL%NOTFOUND then \
$2 = 1; end if;\
$2 = 0;\
\
commit;\
end;\
end;\
$asa$ (INT, INT) using ($1, $2) language plorasql",
ECPGt_int,&(v_id),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_int,&(iReturnCode),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(v_id),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_int,&(iReturnCode),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
/* d1-- */{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "create table t1 ( id integer , t text , d1 numeric , d2 float8 , c char ( 100 ) )", ECPGt_EOIT, ECPGt_EORT);