summaryrefslogtreecommitdiffstats
path: root/src/interfaces/ecpg/test/preproc/cursor.pgc
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 12:15:05 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 12:15:05 +0000
commit46651ce6fe013220ed397add242004d764fc0153 (patch)
tree6e5299f990f88e60174a1d3ae6e48eedd2688b2b /src/interfaces/ecpg/test/preproc/cursor.pgc
parentInitial commit. (diff)
downloadpostgresql-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.pgc256
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;
+}