diff options
author | Michael Meskes <meskes@postgresql.org> | 2007-08-14 10:01:54 +0000 |
---|---|---|
committer | Michael Meskes <meskes@postgresql.org> | 2007-08-14 10:01:54 +0000 |
commit | 635a0b9a8640bb7f2944a3f77ddc370f8dd7b010 (patch) | |
tree | d54146b2416fecd2a544f3bf786108079b879cfc /src/interfaces/ecpg/test/sql | |
parent | b83bd31bd953b6daa22bcbdaee5ade2a27ec7324 (diff) | |
download | postgresql-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/Makefile | 6 | ||||
-rw-r--r-- | src/interfaces/ecpg/test/sql/array.pgc | 2 | ||||
-rw-r--r-- | src/interfaces/ecpg/test/sql/desc.pgc | 12 | ||||
-rw-r--r-- | src/interfaces/ecpg/test/sql/dyntest.pgc | 2 | ||||
-rw-r--r-- | src/interfaces/ecpg/test/sql/execute.pgc | 13 | ||||
-rw-r--r-- | src/interfaces/ecpg/test/sql/fetch.pgc | 4 | ||||
-rw-r--r-- | src/interfaces/ecpg/test/sql/func.pgc | 7 | ||||
-rw-r--r-- | src/interfaces/ecpg/test/sql/indicators.pgc | 20 | ||||
-rw-r--r-- | src/interfaces/ecpg/test/sql/insupd.pgc | 16 | ||||
-rw-r--r-- | src/interfaces/ecpg/test/sql/oldexec.pgc | 93 | ||||
-rw-r--r-- | src/interfaces/ecpg/test/sql/quote.pgc | 25 |
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; |