diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 12:15:05 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 12:15:05 +0000 |
commit | 46651ce6fe013220ed397add242004d764fc0153 (patch) | |
tree | 6e5299f990f88e60174a1d3ae6e48eedd2688b2b /src/interfaces/ecpg/test/preproc/cursor.pgc | |
parent | Initial commit. (diff) | |
download | postgresql-14-upstream.tar.xz postgresql-14-upstream.zip |
Adding upstream version 14.5.upstream/14.5upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/interfaces/ecpg/test/preproc/cursor.pgc')
-rw-r--r-- | src/interfaces/ecpg/test/preproc/cursor.pgc | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/src/interfaces/ecpg/test/preproc/cursor.pgc b/src/interfaces/ecpg/test/preproc/cursor.pgc new file mode 100644 index 0000000..8a286ad --- /dev/null +++ b/src/interfaces/ecpg/test/preproc/cursor.pgc @@ -0,0 +1,256 @@ +#include <stdlib.h> +#include <string.h> + +exec sql include ../regression; + +exec sql whenever sqlerror stop; + +exec sql type c is char reference; +typedef char* c; + +exec sql type ind is union { int integer; short smallint; }; +typedef union { int integer; short smallint; } ind; + +#define BUFFERSIZ 8 +exec sql type str is varchar[BUFFERSIZ]; + +#define CURNAME "mycur" + +int +main (void) +{ +exec sql begin declare section; + char *stmt1 = "SELECT id, t FROM t1"; + char *curname1 = CURNAME; + char *curname2 = CURNAME; + char *curname3 = CURNAME; + varchar curname4[50]; + char *curname5 = CURNAME; + int count; + int id; + char t[64]; +exec sql end declare section; + + char msg[128]; + + ECPGdebug(1, stderr); + + strcpy(msg, "connect"); + exec sql connect to REGRESSDB1 as test1; + exec sql connect to REGRESSDB2 as test2; + + strcpy(msg, "set"); + exec sql at test1 set datestyle to iso; + + strcpy(msg, "create"); + exec sql at test1 create table t1(id serial primary key, t text); + exec sql at test2 create table t1(id serial primary key, t text); + + strcpy(msg, "insert"); + exec sql at test1 insert into t1(id, t) values (default, 'a'); + exec sql at test1 insert into t1(id, t) values (default, 'b'); + exec sql at test1 insert into t1(id, t) values (default, 'c'); + exec sql at test1 insert into t1(id, t) values (default, 'd'); + exec sql at test2 insert into t1(id, t) values (default, 'e'); + + strcpy(msg, "commit"); + exec sql at test1 commit; + exec sql at test2 commit; + + /* Dynamic cursorname test with INTO list in FETCH stmts */ + + strcpy(msg, "declare"); + exec sql at test1 declare :curname1 cursor for + select id, t from t1; + + strcpy(msg, "open"); + exec sql at test1 open :curname1; + + strcpy(msg, "fetch from"); + exec sql at test1 fetch forward from :curname1 into :id, :t; + printf("%d %s\n", id, t); + + strcpy(msg, "fetch"); + exec sql at test1 fetch forward :curname1 into :id, :t; + printf("%d %s\n", id, t); + + strcpy(msg, "fetch 1 from"); + exec sql at test1 fetch 1 from :curname1 into :id, :t; + printf("%d %s\n", id, t); + + strcpy(msg, "fetch :count from"); + count = 1; + exec sql at test1 fetch :count from :curname1 into :id, :t; + printf("%d %s\n", id, t); + + strcpy(msg, "move in"); + exec sql at test1 move absolute 0 in :curname1; + + strcpy(msg, "fetch 1"); + exec sql at test1 fetch 1 :curname1 into :id, :t; + printf("%d %s\n", id, t); + + strcpy(msg, "fetch :count"); + count = 1; + exec sql at test1 fetch :count :curname1 into :id, :t; + printf("%d %s\n", id, t); + + strcpy(msg, "close"); + exec sql at test1 close :curname1; + + /* Dynamic cursorname test with INTO list in DECLARE stmt */ + + strcpy(msg, "declare"); + exec sql at test1 declare :curname2 cursor for + select id, t into :id, :t from t1; + + strcpy(msg, "open"); + exec sql at test1 open :curname2; + + strcpy(msg, "fetch from"); + exec sql at test1 fetch from :curname2; + printf("%d %s\n", id, t); + + strcpy(msg, "fetch"); + exec sql at test1 fetch :curname2; + printf("%d %s\n", id, t); + + strcpy(msg, "fetch 1 from"); + exec sql at test1 fetch 1 from :curname2; + printf("%d %s\n", id, t); + + strcpy(msg, "fetch :count from"); + count = 1; + exec sql at test1 fetch :count from :curname2; + printf("%d %s\n", id, t); + + strcpy(msg, "move"); + exec sql at test1 move absolute 0 :curname2; + + strcpy(msg, "fetch 1"); + exec sql at test1 fetch 1 :curname2; + printf("%d %s\n", id, t); + + strcpy(msg, "fetch :count"); + count = 1; + exec sql at test1 fetch :count :curname2; + printf("%d %s\n", id, t); + + strcpy(msg, "close"); + exec sql at test1 close :curname2; + + /* Dynamic cursorname test with PREPARED stmt */ + + strcpy(msg, "prepare"); + exec sql at test1 prepare st_id1 from :stmt1; + exec sql at test2 prepare st_id1 from :stmt1; + + strcpy(msg, "declare"); + exec sql at test1 declare :curname3 cursor for st_id1; + exec sql at test2 declare :curname5 cursor for st_id1; + + strcpy(msg, "open"); + exec sql at test1 open :curname3; + exec sql at test2 open :curname5; + + strcpy(msg, "fetch"); + exec sql at test2 fetch :curname5 into :id, :t; + printf("%d %s\n", id, t); + + strcpy(msg, "fetch from"); + exec sql at test1 fetch from :curname3 into :id, :t; + printf("%d %s\n", id, t); + + strcpy(msg, "fetch 1 from"); + exec sql at test1 fetch 1 from :curname3 into :id, :t; + printf("%d %s\n", id, t); + + strcpy(msg, "fetch :count from"); + count = 1; + exec sql at test1 fetch :count from :curname3 into :id, :t; + printf("%d %s\n", id, t); + + strcpy(msg, "move"); + exec sql at test1 move absolute 0 :curname3; + + strcpy(msg, "fetch 1"); + exec sql at test1 fetch 1 :curname3 into :id, :t; + printf("%d %s\n", id, t); + + strcpy(msg, "fetch :count"); + count = 1; + exec sql at test1 fetch :count :curname3 into :id, :t; + printf("%d %s\n", id, t); + + strcpy(msg, "close"); + exec sql at test1 close :curname3; + exec sql at test2 close :curname5; + + strcpy(msg, "deallocate prepare"); + exec sql at test1 deallocate prepare st_id1; + exec sql at test2 deallocate prepare st_id1; + + /* Dynamic cursorname test with PREPARED stmt, + cursor name in varchar */ + + curname4.len = strlen(CURNAME); + strcpy(curname4.arr, CURNAME); + + strcpy(msg, "prepare"); + exec sql at test1 prepare st_id2 from :stmt1; + + strcpy(msg, "declare"); + exec sql at test1 declare :curname4 cursor for st_id2; + + strcpy(msg, "open"); + exec sql at test1 open :curname4; + + strcpy(msg, "fetch from"); + exec sql at test1 fetch from :curname4 into :id, :t; + printf("%d %s\n", id, t); + + strcpy(msg, "fetch"); + exec sql at test1 fetch :curname4 into :id, :t; + printf("%d %s\n", id, t); + + strcpy(msg, "fetch 1 from"); + exec sql at test1 fetch 1 from :curname4 into :id, :t; + printf("%d %s\n", id, t); + + strcpy(msg, "fetch :count from"); + count = 1; + exec sql at test1 fetch :count from :curname4 into :id, :t; + printf("%d %s\n", id, t); + + strcpy(msg, "move"); + exec sql at test1 move absolute 0 :curname4; + + strcpy(msg, "fetch 1"); + exec sql at test1 fetch 1 :curname4 into :id, :t; + printf("%d %s\n", id, t); + + strcpy(msg, "fetch :count"); + count = 1; + exec sql at test1 fetch :count :curname4 into :id, :t; + printf("%d %s\n", id, t); + + strcpy(msg, "close"); + exec sql at test1 close :curname4; + + strcpy(msg, "deallocate prepare"); + exec sql at test1 deallocate prepare st_id2; + + /* End test */ + + strcpy(msg, "drop"); + exec sql at test1 drop table t1; + exec sql at test2 drop table t1; + + strcpy(msg, "commit"); + exec sql at test1 commit; + + strcpy(msg, "disconnect"); + exec sql disconnect all; + + return 0; +} |