diff --git a/contrib/gms_sql/expected/gms_sql.out b/contrib/gms_sql/expected/gms_sql.out index a46227b3e939980651aeec463d71978674a71ee0..9244689acfd3db519103ac5b08a1a8b7e9e5bd37 100644 --- a/contrib/gms_sql/expected/gms_sql.out +++ b/contrib/gms_sql/expected/gms_sql.out @@ -461,7 +461,7 @@ l_cnt int; l_desctab gms_sql.desc_tab; l_sqltext varchar(2000); begin - l_sqltext='select * from pg_object;'; + l_sqltext='select * from pg_object order by 1;'; l_curid := gms_sql.open_cursor(); gms_sql.parse(l_curid, l_sqltext, 0); gms_sql.describe_columns(l_curid, l_cnt, l_desctab); @@ -479,6 +479,7 @@ NOTICE: mtime,181 NOTICE: createcsn,2 NOTICE: changecsn,2 NOTICE: valid,109 +NOTICE: object_options,2 create table t1(id int, name varchar(20)); insert into t1 select generate_series(1,3), 'abcddd'; create table t2(a int, b date); @@ -751,3 +752,101 @@ CONTEXT: referenced column: close_cursor select gms_sql.close_cursor(-1); ERROR: cursor -1 value of cursor id is out of range CONTEXT: referenced column: close_cursor +--:1传参 test +drop table if exists cux_demo; +NOTICE: table "cux_demo" does not exist, skipping +create table cux_demo(a int,b int); +insert into cux_demo values(1,2); +insert into cux_demo values(2,2); +DECLARE +p_no NUMBER := 80; +CURSOR_NAME INTEGER := gms_sql.open_cursor; +row_process INTEGER; +v_b NUMBER; +BEGIN +gms_sql.parse(CURSOR_NAME, 'select * from cux_demo where a = :1 and b = :2', gms_sql.native); +gms_sql.bind_variable(CURSOR_NAME, '1', p_no); +gms_sql.bind_variable(CURSOR_NAME, '2', p_no); +raise notice 'CURSOR_NAME,%',CURSOR_NAME; +raise notice 'p_no,%',p_no; +row_process := gms_sql.execute(CURSOR_NAME); +gms_sql.close_cursor(CURSOR_NAME); +END; +/ +NOTICE: CURSOR_NAME,0 +NOTICE: p_no,80 +DECLARE +p_no NUMBER := 80; +CURSOR_NAME INTEGER := gms_sql.open_cursor; +row_process INTEGER; +v_b NUMBER; +BEGIN +gms_sql.parse(CURSOR_NAME, 'select * from cux_demo where a = :1 and b = :2', gms_sql.native); +gms_sql.bind_variable(CURSOR_NAME, ':1', p_no); +gms_sql.bind_variable(CURSOR_NAME, ':2', p_no); +raise notice 'CURSOR_NAME,%',CURSOR_NAME; +raise notice 'p_no,%',p_no; +row_process := gms_sql.execute(CURSOR_NAME); +gms_sql.close_cursor(CURSOR_NAME); +END; +/ +NOTICE: CURSOR_NAME,0 +NOTICE: p_no,80 +--err test +DECLARE +p_no NUMBER := 80; +CURSOR_NAME INTEGER := gms_sql.open_cursor; +row_process INTEGER; +v_b NUMBER; +BEGIN +gms_sql.parse(CURSOR_NAME, 'select * from cux_demo where a = :1 and b = :2', gms_sql.native); +gms_sql.bind_variable(CURSOR_NAME, ':11232153235', p_no); +gms_sql.bind_variable(CURSOR_NAME, '2', p_no); +raise notice 'CURSOR_NAME,%',CURSOR_NAME; +raise notice 'p_no,%',p_no; +raise notice ':1,%',p_no; +row_process := gms_sql.execute(CURSOR_NAME); +gms_sql.close_cursor(CURSOR_NAME); +END; +/ +ERROR: variable "11232153235" doesn't exists +CONTEXT: SQL statement "CALL gms_sql.bind_variable(CURSOR_NAME,':11232153235',p_no)" +PL/pgSQL function inline_code_block line 7 at PERFORM +DECLARE +p_no NUMBER := 80; +CURSOR_NAME INTEGER := gms_sql.open_cursor; +row_process INTEGER; +v_b NUMBER; +BEGIN +gms_sql.parse(CURSOR_NAME, 'select * from cux_demo where a = :1 and b = :2', gms_sql.native); +gms_sql.bind_variable(CURSOR_NAME, ':abc', p_no); +gms_sql.bind_variable(CURSOR_NAME, '2', p_no); +raise notice 'CURSOR_NAME,%',CURSOR_NAME; +raise notice 'p_no,%',p_no; +raise notice ':1,%',p_no; +row_process := gms_sql.execute(CURSOR_NAME); +gms_sql.close_cursor(CURSOR_NAME); +END; +/ +ERROR: variable "abc" doesn't exists +CONTEXT: SQL statement "CALL gms_sql.bind_variable(CURSOR_NAME,':abc',p_no)" +PL/pgSQL function inline_code_block line 7 at PERFORM +drop extension gms_sql; +create extension gms_xmlgen; +create extension gms_sql; +DECLARE + c NUMBER; +BEGIN + c := GMS_SQL.OPEN_CURSOR; + GMS_SQL.CLOSE_CURSOR(c); +END; +/ +DECLARE + c NUMBER; +BEGIN + c := GMS_SQL.OPEN_CURSOR; + GMS_SQL.CLOSE_CURSOR(c); +END; +/ +drop extension gms_xmlgen; +drop extension gms_sql; diff --git a/contrib/gms_sql/gms_sql.cpp b/contrib/gms_sql/gms_sql.cpp index e13eb5c3b1ea8725735151f4b81e4b077a132eaa..4bafa940f7b19047d09074c4096982785bad61db 100644 --- a/contrib/gms_sql/gms_sql.cpp +++ b/contrib/gms_sql/gms_sql.cpp @@ -1549,6 +1549,8 @@ is_identif(unsigned char c) return true; else if (c >= 0200) return true; + else if (c >= '0' && c <= '0') + return true; else return false; } diff --git a/contrib/gms_sql/sql/gms_sql.sql b/contrib/gms_sql/sql/gms_sql.sql index 9bb6a9d88790eaa400527e4faf959969a62c7dbf..529a571fbb592919c1b0667ea76bb747296660e1 100644 --- a/contrib/gms_sql/sql/gms_sql.sql +++ b/contrib/gms_sql/sql/gms_sql.sql @@ -174,7 +174,7 @@ l_cnt int; l_desctab gms_sql.desc_tab; l_sqltext varchar(2000); begin - l_sqltext='select * from pg_object;'; + l_sqltext='select * from pg_object order by 1;'; l_curid := gms_sql.open_cursor(); gms_sql.parse(l_curid, l_sqltext, 0); gms_sql.describe_columns(l_curid, l_cnt, l_desctab); @@ -313,3 +313,95 @@ select gms_sql.close_cursor(3); select gms_sql.is_open(3); select gms_sql.close_cursor(10000); select gms_sql.close_cursor(-1); + +--:1传参 test +drop table if exists cux_demo; +create table cux_demo(a int,b int); +insert into cux_demo values(1,2); +insert into cux_demo values(2,2); + +DECLARE +p_no NUMBER := 80; +CURSOR_NAME INTEGER := gms_sql.open_cursor; +row_process INTEGER; +v_b NUMBER; +BEGIN +gms_sql.parse(CURSOR_NAME, 'select * from cux_demo where a = :1 and b = :2', gms_sql.native); +gms_sql.bind_variable(CURSOR_NAME, '1', p_no); +gms_sql.bind_variable(CURSOR_NAME, '2', p_no); +raise notice 'CURSOR_NAME,%',CURSOR_NAME; +raise notice 'p_no,%',p_no; +row_process := gms_sql.execute(CURSOR_NAME); +gms_sql.close_cursor(CURSOR_NAME); +END; +/ + +DECLARE +p_no NUMBER := 80; +CURSOR_NAME INTEGER := gms_sql.open_cursor; +row_process INTEGER; +v_b NUMBER; +BEGIN +gms_sql.parse(CURSOR_NAME, 'select * from cux_demo where a = :1 and b = :2', gms_sql.native); +gms_sql.bind_variable(CURSOR_NAME, ':1', p_no); +gms_sql.bind_variable(CURSOR_NAME, ':2', p_no); +raise notice 'CURSOR_NAME,%',CURSOR_NAME; +raise notice 'p_no,%',p_no; +row_process := gms_sql.execute(CURSOR_NAME); +gms_sql.close_cursor(CURSOR_NAME); +END; +/ + +--err test +DECLARE +p_no NUMBER := 80; +CURSOR_NAME INTEGER := gms_sql.open_cursor; +row_process INTEGER; +v_b NUMBER; +BEGIN +gms_sql.parse(CURSOR_NAME, 'select * from cux_demo where a = :1 and b = :2', gms_sql.native); +gms_sql.bind_variable(CURSOR_NAME, ':11232153235', p_no); +gms_sql.bind_variable(CURSOR_NAME, '2', p_no); +raise notice 'CURSOR_NAME,%',CURSOR_NAME; +raise notice 'p_no,%',p_no; +raise notice ':1,%',p_no; +row_process := gms_sql.execute(CURSOR_NAME); +gms_sql.close_cursor(CURSOR_NAME); +END; +/ + +DECLARE +p_no NUMBER := 80; +CURSOR_NAME INTEGER := gms_sql.open_cursor; +row_process INTEGER; +v_b NUMBER; +BEGIN +gms_sql.parse(CURSOR_NAME, 'select * from cux_demo where a = :1 and b = :2', gms_sql.native); +gms_sql.bind_variable(CURSOR_NAME, ':abc', p_no); +gms_sql.bind_variable(CURSOR_NAME, '2', p_no); +raise notice 'CURSOR_NAME,%',CURSOR_NAME; +raise notice 'p_no,%',p_no; +raise notice ':1,%',p_no; +row_process := gms_sql.execute(CURSOR_NAME); +gms_sql.close_cursor(CURSOR_NAME); +END; +/ +drop extension gms_sql; +create extension gms_xmlgen; +create extension gms_sql; +DECLARE + c NUMBER; +BEGIN + c := GMS_SQL.OPEN_CURSOR; + GMS_SQL.CLOSE_CURSOR(c); +END; +/ +DECLARE + c NUMBER; +BEGIN + c := GMS_SQL.OPEN_CURSOR; + GMS_SQL.CLOSE_CURSOR(c); +END; +/ +drop extension gms_xmlgen; +drop extension gms_sql;