aboutsummaryrefslogtreecommitdiff
path: root/src/interfaces/ecpg/test/sql
diff options
context:
space:
mode:
authorMichael Meskes <meskes@postgresql.org>2007-08-14 10:01:54 +0000
committerMichael Meskes <meskes@postgresql.org>2007-08-14 10:01:54 +0000
commit635a0b9a8640bb7f2944a3f77ddc370f8dd7b010 (patch)
treed54146b2416fecd2a544f3bf786108079b879cfc /src/interfaces/ecpg/test/sql
parentb83bd31bd953b6daa22bcbdaee5ade2a27ec7324 (diff)
downloadpostgresql-635a0b9a8640bb7f2944a3f77ddc370f8dd7b010.tar.gz
postgresql-635a0b9a8640bb7f2944a3f77ddc370f8dd7b010.zip
- Finished major rewrite to use new protocol version
- Really prepare statements - Added more regression tests - Added auto-prepare mode - Use '$n' for positional variables, '?' is still possible via ecpg option - Cleaned up the sources a little bit
Diffstat (limited to 'src/interfaces/ecpg/test/sql')
-rw-r--r--src/interfaces/ecpg/test/sql/Makefile6
-rw-r--r--src/interfaces/ecpg/test/sql/array.pgc2
-rw-r--r--src/interfaces/ecpg/test/sql/desc.pgc12
-rw-r--r--src/interfaces/ecpg/test/sql/dyntest.pgc2
-rw-r--r--src/interfaces/ecpg/test/sql/execute.pgc13
-rw-r--r--src/interfaces/ecpg/test/sql/fetch.pgc4
-rw-r--r--src/interfaces/ecpg/test/sql/func.pgc7
-rw-r--r--src/interfaces/ecpg/test/sql/indicators.pgc20
-rw-r--r--src/interfaces/ecpg/test/sql/insupd.pgc16
-rw-r--r--src/interfaces/ecpg/test/sql/oldexec.pgc93
-rw-r--r--src/interfaces/ecpg/test/sql/quote.pgc25
11 files changed, 158 insertions, 42 deletions
diff --git a/src/interfaces/ecpg/test/sql/Makefile b/src/interfaces/ecpg/test/sql/Makefile
index 7d58a761e56..dc58291cc80 100644
--- a/src/interfaces/ecpg/test/sql/Makefile
+++ b/src/interfaces/ecpg/test/sql/Makefile
@@ -16,6 +16,7 @@ TESTS = array array.c \
fetch fetch.c \
func func.c \
indicators indicators.c \
+ oldexec oldexec.c \
parser parser.c \
quote quote.c \
show show.c \
@@ -23,7 +24,6 @@ TESTS = array array.c \
all: $(TESTS)
-# bits needs the -c option for the "EXEC SQL TYPE" construct
-bits.c: bits.pgc ../regression.h
- $(ECPG) -c -o $@ -I$(srcdir) $<
+oldexec.c: oldexec.pgc ../regression.h
+ $(ECPG) -r questionmarks -o $@ -I$(srcdir) $<
diff --git a/src/interfaces/ecpg/test/sql/array.pgc b/src/interfaces/ecpg/test/sql/array.pgc
index 2444e0158be..d589a242f57 100644
--- a/src/interfaces/ecpg/test/sql/array.pgc
+++ b/src/interfaces/ecpg/test/sql/array.pgc
@@ -35,7 +35,7 @@ EXEC SQL END DECLARE SECTION;
EXEC SQL INSERT INTO test(f,i,a,text) VALUES(404.90,3,'{0,1,2,3,4,5,6,7,8,9}','abcdefghij');
EXEC SQL INSERT INTO test(f,i,a,text) VALUES(140787.0,2,:a,:text);
-
+
EXEC SQL INSERT INTO test(f,i,a,text) VALUES(14.07,:did,:a,:t);
EXEC SQL COMMIT;
diff --git a/src/interfaces/ecpg/test/sql/desc.pgc b/src/interfaces/ecpg/test/sql/desc.pgc
index 9eae845ddfa..bf615bf22a7 100644
--- a/src/interfaces/ecpg/test/sql/desc.pgc
+++ b/src/interfaces/ecpg/test/sql/desc.pgc
@@ -5,9 +5,9 @@ int
main(void)
{
EXEC SQL BEGIN DECLARE SECTION;
- char *stmt1 = "INSERT INTO test1 VALUES (?, ?)";
- char *stmt2 = "SELECT * from test1 where a = ? and b = ?";
- char *stmt3 = "SELECT * from test1 where a = ?";
+ char *stmt1 = "INSERT INTO test1 VALUES ($1, $2)";
+ char *stmt2 = "SELECT * from test1 where a = $1 and b = $2";
+ char *stmt3 = "SELECT * from test1 where :var = a";
int val1 = 1;
char val2[4] = "one", val2output[] = "AAA";
@@ -28,6 +28,7 @@ main(void)
EXEC SQL CREATE TABLE test1 (a int, b text);
EXEC SQL PREPARE foo1 FROM :stmt1;
+ EXEC SQL PREPARE "Foo-1" FROM :stmt1;
EXEC SQL PREPARE foo2 FROM :stmt2;
EXEC SQL PREPARE foo3 FROM :stmt3;
@@ -41,7 +42,9 @@ main(void)
EXEC SQL SET DESCRIPTOR indesc VALUE 1 DATA = 3;
EXEC SQL SET DESCRIPTOR indesc VALUE 2 INDICATOR = :val1, DATA = 'this is a long test';
- EXEC SQL EXECUTE foo1 USING DESCRIPTOR indesc;
+ EXEC SQL EXECUTE "Foo-1" USING DESCRIPTOR indesc;
+
+ EXEC SQL DEALLOCATE "Foo-1";
EXEC SQL SET DESCRIPTOR indesc VALUE 1 DATA = :val1;
EXEC SQL SET DESCRIPTOR indesc VALUE 2 INDICATOR = :val2i, DATA = :val2;
@@ -75,6 +78,7 @@ main(void)
printf("val1=%d val2=%c%c%c%c warn=%c truncate=%d\n", val1output, val2output[0], val2output[1], val2output[2], val2output[3], sqlca.sqlwarn[0], val2i);
EXEC SQL DROP TABLE test1;
+ EXEC SQL DEALLOCATE ALL;
EXEC SQL DISCONNECT;
EXEC SQL DEALLOCATE DESCRIPTOR indesc;
diff --git a/src/interfaces/ecpg/test/sql/dyntest.pgc b/src/interfaces/ecpg/test/sql/dyntest.pgc
index 2a2abfb4f95..a1efabe033c 100644
--- a/src/interfaces/ecpg/test/sql/dyntest.pgc
+++ b/src/interfaces/ecpg/test/sql/dyntest.pgc
@@ -54,7 +54,7 @@ main (int argc, char **argv)
exec sql insert into dyntest values ('first entry', 14.7, 14, 123045607890, true, 'The world''''s most advanced open source database.', '1987-07-14');
exec sql insert into dyntest values ('second entry', 1407.87, 1407, 987065403210, false, 'The elephant never forgets.', '1999-11-5');
- exec sql prepare MYQUERY from:QUERY;
+ exec sql prepare MYQUERY from :QUERY;
exec sql declare MYCURS cursor for MYQUERY;
exec sql open MYCURS;
diff --git a/src/interfaces/ecpg/test/sql/execute.pgc b/src/interfaces/ecpg/test/sql/execute.pgc
index 5c23bb36a49..486a70db08e 100644
--- a/src/interfaces/ecpg/test/sql/execute.pgc
+++ b/src/interfaces/ecpg/test/sql/execute.pgc
@@ -36,7 +36,7 @@ exec sql end declare section;
printf("Inserted %ld tuples via execute immediate\n", sqlca.sqlerrd[2]);
- sprintf(command, "insert into test (name, amount, letter) select name, amount+?, letter from test");
+ sprintf(command, "insert into test (name, amount, letter) select name, amount+$1, letter from test");
exec sql prepare I from :command;
exec sql execute I using :increment;
@@ -46,8 +46,8 @@ exec sql end declare section;
sprintf (command, "select * from test");
- exec sql prepare F from :command;
- exec sql declare CUR cursor for F;
+ exec sql prepare f from :command;
+ exec sql declare CUR cursor for f;
exec sql open CUR;
exec sql fetch 8 in CUR into :name, :amount, :letter;
@@ -64,11 +64,12 @@ exec sql end declare section;
}
exec sql close CUR;
+ exec sql deallocate f;
- sprintf (command, "select * from test where amount = ?");
+ sprintf (command, "select * from test where amount = $1");
- exec sql prepare F from :command;
- exec sql declare CUR2 cursor for F;
+ exec sql prepare f from :command;
+ exec sql declare CUR2 cursor for f;
exec sql open CUR2 using 1;
exec sql fetch in CUR2 into :name, :amount, :letter;
diff --git a/src/interfaces/ecpg/test/sql/fetch.pgc b/src/interfaces/ecpg/test/sql/fetch.pgc
index 936a4f8cd2d..a65d393748e 100644
--- a/src/interfaces/ecpg/test/sql/fetch.pgc
+++ b/src/interfaces/ecpg/test/sql/fetch.pgc
@@ -7,7 +7,7 @@ EXEC SQL INCLUDE ../regression;
int main(int argc, char* argv[]) {
EXEC SQL BEGIN DECLARE SECTION;
char str[25];
- int i, how_many = 1;
+ int i;
EXEC SQL END DECLARE SECTION;
ECPGdebug(1, stderr);
@@ -36,7 +36,7 @@ int main(int argc, char* argv[]) {
EXEC SQL WHENEVER NOT FOUND CONTINUE;
EXEC SQL MOVE BACKWARD 2 IN C;
- EXEC SQL FETCH :how_many IN C INTO :i, :str;
+ EXEC SQL FETCH 1 IN C INTO :i, :str;
printf("%d: %s\n", i, str);
EXEC SQL CLOSE C;
diff --git a/src/interfaces/ecpg/test/sql/func.pgc b/src/interfaces/ecpg/test/sql/func.pgc
index 71835a316d3..19c4ba7cc64 100644
--- a/src/interfaces/ecpg/test/sql/func.pgc
+++ b/src/interfaces/ecpg/test/sql/func.pgc
@@ -5,6 +5,7 @@
EXEC SQL INCLUDE ../regression;
int main(int argc, char* argv[]) {
+ EXEC SQL char text[25];
ECPGdebug(1, stderr);
EXEC SQL CONNECT TO REGRESSDB1;
@@ -14,11 +15,12 @@ int main(int argc, char* argv[]) {
EXEC SQL WHENEVER SQLERROR SQLPRINT;
EXEC SQL CREATE TABLE My_Table ( Item1 int, Item2 text );
+ EXEC SQL CREATE TABLE Log (name text, w text);
EXEC SQL CREATE FUNCTION My_Table_Check() RETURNS trigger
AS $test$
BEGIN
- RAISE WARNING 'Notice: TG_NAME=%, TG WHEN=%', TG_NAME, TG_WHEN;
+ INSERT INTO Log VALUES(TG_NAME, TG_WHEN);
RETURN NEW;
END; $test$
LANGUAGE plpgsql;
@@ -31,9 +33,12 @@ int main(int argc, char* argv[]) {
EXEC SQL INSERT INTO My_Table VALUES (1234, 'Some random text');
EXEC SQL INSERT INTO My_Table VALUES (5678, 'The Quick Brown');
+ EXEC SQL SELECT name INTO :text FROM Log LIMIT 1;
+ printf("Trigger %s fired.\n", text);
EXEC SQL DROP TRIGGER My_Table_Check_Trigger ON My_Table;
EXEC SQL DROP FUNCTION My_Table_Check();
+ EXEC SQL DROP TABLE Log;
EXEC SQL DROP TABLE My_Table;
EXEC SQL DISCONNECT ALL;
diff --git a/src/interfaces/ecpg/test/sql/indicators.pgc b/src/interfaces/ecpg/test/sql/indicators.pgc
index 96c312b506a..6ccf568afb4 100644
--- a/src/interfaces/ecpg/test/sql/indicators.pgc
+++ b/src/interfaces/ecpg/test/sql/indicators.pgc
@@ -16,34 +16,34 @@ int main(int argc, char **argv)
exec sql connect to REGRESSDB1;
exec sql set autocommit to off;
- exec sql create table test (
+ exec sql create table indicator_test (
"id" int primary key,
"str" text NOT NULL,
val int null);
exec sql commit work;
- exec sql insert into test (id, str, val) values ( 1, 'Hello', 0);
+ exec sql insert into indicator_test (id, str, val) values ( 1, 'Hello', 0);
/* use indicator in insert */
- exec sql insert into test (id, str, val) values ( 2, 'Hi there', :intvar :nullind);
+ exec sql insert into indicator_test (id, str, val) values ( 2, 'Hi there', :intvar :nullind);
nullind = 0;
- exec sql insert into test (id, str, val) values ( 3, 'Good evening', :intvar :nullind);
+ exec sql insert into indicator_test (id, str, val) values ( 3, 'Good evening', :intvar :nullind);
exec sql commit work;
/* use indicators to get information about selects */
- exec sql select val into :intvar from test where id = 1;
- exec sql select val into :intvar :nullind from test where id = 2;
+ exec sql select val into :intvar from indicator_test where id = 1;
+ exec sql select val into :intvar :nullind from indicator_test where id = 2;
printf("intvar: %d, nullind: %d\n", intvar, nullind);
- exec sql select val into :intvar :nullind from test where id = 3;
+ exec sql select val into :intvar :nullind from indicator_test where id = 3;
printf("intvar: %d, nullind: %d\n", intvar, nullind);
/* use indicators for update */
intvar = 5; nullind = -1;
- exec sql update test set val = :intvar :nullind where id = 1;
- exec sql select val into :intvar :nullind from test where id = 1;
+ exec sql update indicator_test set val = :intvar :nullind where id = 1;
+ exec sql select val into :intvar :nullind from indicator_test where id = 1;
printf("intvar: %d, nullind: %d\n", intvar, nullind);
- exec sql drop table test;
+ exec sql drop table indicator_test;
exec sql commit work;
exec sql disconnect;
diff --git a/src/interfaces/ecpg/test/sql/insupd.pgc b/src/interfaces/ecpg/test/sql/insupd.pgc
index c406c3aba20..9be1af498f7 100644
--- a/src/interfaces/ecpg/test/sql/insupd.pgc
+++ b/src/interfaces/ecpg/test/sql/insupd.pgc
@@ -15,17 +15,17 @@ int main(int argc, char* argv[]) {
EXEC SQL WHENEVER SQLWARNING SQLPRINT;
EXEC SQL WHENEVER SQLERROR SQLPRINT;
- EXEC SQL CREATE TABLE test(a int, b int);
+ EXEC SQL CREATE TABLE insupd_test(a int, b int);
- EXEC SQL INSERT INTO test (a,b) values (1, 1);
- EXEC SQL INSERT INTO test (a,b) values (2, 2);
- EXEC SQL INSERT INTO test (a,b) values (3, 3);
+ EXEC SQL INSERT INTO insupd_test (a,b) values (1, 1);
+ EXEC SQL INSERT INTO insupd_test (a,b) values (2, 2);
+ EXEC SQL INSERT INTO insupd_test (a,b) values (3, 3);
- EXEC SQL UPDATE test set a=a+1;
- EXEC SQL UPDATE test set (a,b)=(5,5) where a = 4;
- EXEC SQL UPDATE test set a=4 where a=3;;
+ EXEC SQL UPDATE insupd_test set a=a+1;
+ EXEC SQL UPDATE insupd_test set (a,b)=(5,5) where a = 4;
+ EXEC SQL UPDATE insupd_test set a=4 where a=3;;
- EXEC SQL SELECT a,b into :i1,:i2 from test order by a;
+ EXEC SQL SELECT a,b into :i1,:i2 from insupd_test order by a;
printf("test\na b\n%d %d\n%d %d\n%d %d\n", i1[0], i2[0], i1[1], i2[1], i1[2], i2[2]);
diff --git a/src/interfaces/ecpg/test/sql/oldexec.pgc b/src/interfaces/ecpg/test/sql/oldexec.pgc
new file mode 100644
index 00000000000..a740aeb7de0
--- /dev/null
+++ b/src/interfaces/ecpg/test/sql/oldexec.pgc
@@ -0,0 +1,93 @@
+#include <stdlib.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+exec sql include ../regression;
+
+exec sql whenever sqlerror sqlprint;
+
+int
+main(void)
+{
+exec sql begin declare section;
+ int amount[8];
+ int increment=100;
+ char name[8][8];
+ char letter[8][1];
+ char command[128];
+exec sql end declare section;
+ int i,j;
+
+ ECPGdebug(1, stderr);
+
+ exec sql connect to REGRESSDB1 as main;
+ exec sql create table test (name char(8), amount int, letter char(1));
+ exec sql commit;
+
+ sprintf(command, "insert into test (name, amount, letter) values ('db: ''r1''', 1, 'f')");
+ exec sql execute immediate :command;
+
+ sprintf(command, "insert into test (name, amount, letter) values ('db: ''r1''', 2, 't')");
+ exec sql execute immediate :command;
+
+ sprintf(command, "insert into test (name, amount, letter) select name, amount+10, letter from test");
+ exec sql execute immediate :command;
+
+ printf("Inserted %ld tuples via execute immediate\n", sqlca.sqlerrd[2]);
+
+ sprintf(command, "insert into test (name, amount, letter) select name, amount+$1, letter from test");
+ exec sql prepare I from :command;
+ exec sql execute I using :increment;
+
+ printf("Inserted %ld tuples via prepared execute\n", sqlca.sqlerrd[2]);
+
+ exec sql commit;
+
+ sprintf (command, "select * from test");
+
+ exec sql prepare F from :command;
+ exec sql declare CUR cursor for F;
+
+ exec sql open CUR;
+ exec sql fetch 8 in CUR into :name, :amount, :letter;
+
+ for (i=0, j=sqlca.sqlerrd[2]; i<j; i++)
+ {
+ exec sql begin declare section;
+ char n[8], l = letter[i][0];
+ int a = amount[i];
+ exec sql end declare section;
+
+ strncpy(n, name[i], 8);
+ printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
+ }
+
+ exec sql close CUR;
+
+ sprintf (command, "select * from test where ? = amount");
+
+ exec sql prepare F from :command;
+ exec sql declare CUR3 cursor for F;
+
+ exec sql open CUR3 using 1;
+ exec sql fetch in CUR3 into :name, :amount, :letter;
+
+ for (i=0, j=sqlca.sqlerrd[2]; i<j; i++)
+ {
+ exec sql begin declare section;
+ char n[8], l = letter[i][0];
+ int a = amount[i];
+ exec sql end declare section;
+
+ strncpy(n, name[i], 8);
+ printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
+ }
+
+ exec sql close CUR3;
+ exec sql drop table test;
+ exec sql commit;
+ exec sql disconnect;
+
+ return (0);
+}
diff --git a/src/interfaces/ecpg/test/sql/quote.pgc b/src/interfaces/ecpg/test/sql/quote.pgc
index 1349a181941..25aca500caa 100644
--- a/src/interfaces/ecpg/test/sql/quote.pgc
+++ b/src/interfaces/ecpg/test/sql/quote.pgc
@@ -7,6 +7,7 @@ EXEC SQL INCLUDE ../regression;
int main(int argc, char* argv[]) {
EXEC SQL BEGIN DECLARE SECTION;
char var[25];
+ int i;
EXEC SQL END DECLARE SECTION;
ECPGdebug(1, stderr);
@@ -23,18 +24,30 @@ int main(int argc, char* argv[]) {
/* this is a\\b actually */
EXEC SQL INSERT INTO "My_Table" VALUES ( 1, 'a\\\\b' );
- /* this is a\b */
+ /* this is a\\b */
EXEC SQL INSERT INTO "My_Table" VALUES ( 1, E'a\\\\b' );
EXEC SQL SET standard_conforming_strings TO on;
- /* this is a\\b actually */
- EXEC SQL INSERT INTO "My_Table" VALUES ( 1, 'a\\\\b' );
- /* this is a\b */
- EXEC SQL INSERT INTO "My_Table" VALUES ( 1, E'a\\\\b' );
+ /* this is a\\\\b actually */
+ EXEC SQL INSERT INTO "My_Table" VALUES ( 2, 'a\\\\b' );
+ /* this is a\\b */
+ EXEC SQL INSERT INTO "My_Table" VALUES ( 2, E'a\\\\b' );
+
+ EXEC SQL BEGIN;
+ EXEC SQL DECLARE C CURSOR FOR SELECT * FROM "My_Table";
+
+ EXEC SQL OPEN C;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
- EXEC SQL SELECT * FROM "My_Table";
+ while (true)
+ {
+ EXEC SQL FETCH C INTO :i, :var;
+ printf("value: %d %s\n", i, var);
+ }
+ EXEC SQL ROLLBACK;
EXEC SQL DROP TABLE "My_Table";
EXEC SQL DISCONNECT ALL;