diff --git a/src/interfaces/ecpg/test/expected/sql-declare.c b/src/interfaces/ecpg/test/expected/sql-declare.c index 7ca540df28..26ef6039c6 100644 --- a/src/interfaces/ecpg/test/expected/sql-declare.c +++ b/src/interfaces/ecpg/test/expected/sql-declare.c @@ -97,7 +97,7 @@ struct sqlca_t *ECPGget_sqlca(void); #line 8 "declare.pgc" -#define ARRAY_SZIE 20 +#define ARRAY_SZIE 2 void execute_test(void); void commitTable(void); @@ -216,11 +216,11 @@ if (sqlca.sqlcode < 0) sqlprint();} void execute_test(void) { /* exec sql begin declare section */ - + #line 63 "declare.pgc" - int i ; + int i , count , length ; #line 64 "declare.pgc" char * selectString = "SELECT f1,f2,f3 FROM source" ; @@ -353,7 +353,7 @@ if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();} #line 110 "declare.pgc" - { ECPGdeallocate(__LINE__, 0, NULL, "stmt_2"); + { ECPGdeallocate(__LINE__, 0, "con1", "stmt_2"); #line 111 "declare.pgc" if (sqlca.sqlcode < 0) sqlprint();} @@ -421,7 +421,7 @@ if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();} #line 134 "declare.pgc" - { ECPGdeallocate(__LINE__, 0, "con2", "stmt_3"); + { ECPGdeallocate(__LINE__, 0, "con1", "stmt_3"); #line 135 "declare.pgc" if (sqlca.sqlcode < 0) sqlprint();} @@ -538,21 +538,128 @@ if (sqlca.sqlcode < 0) sqlprint();} printResult("testcase5", 2); + + /* + * DESCRIBE statement is also supported. + */ + /* declare \"stmt_desc\" as an SQL identifier */ +#line 182 "declare.pgc" + + { ECPGprepare(__LINE__, "con1", 0, "stmt_desc", selectString); +#line 183 "declare.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 183 "declare.pgc" + + /* declare cur_desc cursor for $1 */ +#line 184 "declare.pgc" + + { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "declare cur_desc cursor for $1", + ECPGt_char_variable,(ECPGprepared_statement("con1", "stmt_desc", __LINE__)),(long)1,(long)1,(1)*sizeof(char), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT); +#line 185 "declare.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 185 "declare.pgc" + + + /* descriptor can be used for describe statement */ + ECPGallocate_desc(__LINE__, "desc_for_describe"); +#line 188 "declare.pgc" + +if (sqlca.sqlcode < 0) sqlprint(); +#line 188 "declare.pgc" + + { ECPGdescribe(__LINE__, 0, 0, "con1", "stmt_desc", + ECPGt_descriptor, "desc_for_describe", 1L, 1L, 1L, + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);} +#line 189 "declare.pgc" + + + { ECPGget_desc_header(__LINE__, "desc_for_describe", &(count)); + +#line 191 "declare.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 191 "declare.pgc" + + { ECPGget_desc(__LINE__, "desc_for_describe", 3,ECPGd_length, + ECPGt_int,&(length),(long)1,(long)1,sizeof(int), ECPGd_EODT); + +#line 192 "declare.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 192 "declare.pgc" + + + ECPGdeallocate_desc(__LINE__, "desc_for_describe"); +#line 194 "declare.pgc" + +if (sqlca.sqlcode < 0) sqlprint(); +#line 194 "declare.pgc" + + + /* for fetch statement */ + ECPGallocate_desc(__LINE__, "desc_for_fetch"); +#line 197 "declare.pgc" + +if (sqlca.sqlcode < 0) sqlprint(); +#line 197 "declare.pgc" + + { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "fetch cur_desc", ECPGt_EOIT, + ECPGt_descriptor, "desc_for_fetch", 1L, 1L, 1L, + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 198 "declare.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 198 "declare.pgc" + + + { ECPGget_desc(__LINE__, "desc_for_fetch", 3,ECPGd_data, + ECPGt_char,(f3[0]),(long)20,(long)1,(20)*sizeof(char), ECPGd_EODT); + +#line 200 "declare.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 200 "declare.pgc" + + + ECPGdeallocate_desc(__LINE__, "desc_for_fetch"); +#line 202 "declare.pgc" + +if (sqlca.sqlcode < 0) sqlprint(); +#line 202 "declare.pgc" + + { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "close cur_desc", ECPGt_EOIT, ECPGt_EORT); +#line 203 "declare.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 203 "declare.pgc" + + { ECPGdeallocate(__LINE__, 0, "con1", "stmt_desc"); +#line 204 "declare.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 204 "declare.pgc" + + + printf("****descriptor results****\n"); + printf("count: %d, length: %d, data: %s\n", count, length, f3[0]); } void commitTable() { { ECPGtrans(__LINE__, "con1", "commit"); -#line 182 "declare.pgc" +#line 212 "declare.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 182 "declare.pgc" +#line 212 "declare.pgc" { ECPGtrans(__LINE__, "con2", "commit"); -#line 183 "declare.pgc" +#line 213 "declare.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 183 "declare.pgc" +#line 213 "declare.pgc" } diff --git a/src/interfaces/ecpg/test/expected/sql-declare.stderr b/src/interfaces/ecpg/test/expected/sql-declare.stderr index 71aa21ece4..29d0b828e7 100644 --- a/src/interfaces/ecpg/test/expected/sql-declare.stderr +++ b/src/interfaces/ecpg/test/expected/sql-declare.stderr @@ -40,9 +40,9 @@ [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_process_output on line 39: OK: INSERT 0 1 [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ECPGtrans on line 182: action "commit"; connection "con1" +[NO_PID]: ECPGtrans on line 212: action "commit"; connection "con1" [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ECPGtrans on line 183: action "commit"; connection "con2" +[NO_PID]: ECPGtrans on line 213: action "commit"; connection "con2" [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: prepare_common on line 74: name stmt_1; query: "SELECT f1,f2,f3 FROM source" [NO_PID]: sqlca: code: 0, state: 00000 @@ -138,9 +138,8 @@ [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_process_output on line 110: OK: CLOSE CURSOR [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: raising sqlcode -230 on line 111: invalid statement name "stmt_2" on line 111 -[NO_PID]: sqlca: code: -230, state: 26000 -SQL error: invalid statement name "stmt_2" on line 111 +[NO_PID]: deallocate_one on line 111: name stmt_2 +[NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: prepare_common on line 123: name stmt_3; query: "SELECT f1,f2,f3 FROM source" [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_execute on line 125: query: declare cur_3 cursor for SELECT f1,f2,f3 FROM source; with 0 parameter(s) on connection con1 @@ -187,9 +186,8 @@ SQL error: invalid statement name "stmt_2" on line 111 [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_process_output on line 134: OK: CLOSE CURSOR [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: raising sqlcode -230 on line 135: invalid statement name "stmt_3" on line 135 -[NO_PID]: sqlca: code: -230, state: 26000 -SQL error: invalid statement name "stmt_3" on line 135 +[NO_PID]: deallocate_one on line 135: name stmt_3 +[NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: prepare_common on line 148: name stmt_4; query: "SELECT f1,f2,f3 FROM source" [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_execute on line 150: query: declare cur_4 cursor for SELECT f1,f2,f3 FROM source; with 0 parameter(s) on connection con2 @@ -260,6 +258,40 @@ SQL error: invalid statement name "stmt_3" on line 135 [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: deallocate_one on line 175: name stmt_5 [NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: prepare_common on line 183: name stmt_desc; query: "SELECT f1,f2,f3 FROM source" +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 185: query: declare cur_desc cursor for SELECT f1,f2,f3 FROM source; with 0 parameter(s) on connection con1 +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 185: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 185: OK: DECLARE CURSOR +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ECPGget_desc_header: found 3 attributes +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ECPGget_desc: reading items for tuple 3 +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ECPGget_desc: LENGTH = 20 +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 198: query: fetch cur_desc; with 0 parameter(s) on connection con1 +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 198: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 198: correctly got 1 tuples with 3 fields +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 198: putting result (1 tuples) into descriptor desc_for_fetch +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ECPGget_desc: reading items for tuple 3 +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 200: RESULT: db on con1 offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 203: query: close cur_desc; with 0 parameter(s) on connection con1 +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 203: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 203: OK: CLOSE CURSOR +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: deallocate_one on line 204: name stmt_desc +[NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_execute on line 45: query: drop table if exists source; with 0 parameter(s) on connection con1 [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_execute on line 45: using PQexec @@ -272,15 +304,11 @@ SQL error: invalid statement name "stmt_3" on line 135 [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_process_output on line 46: OK: DROP TABLE [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ECPGtrans on line 182: action "commit"; connection "con1" +[NO_PID]: ECPGtrans on line 212: action "commit"; connection "con1" [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ECPGtrans on line 183: action "commit"; connection "con2" +[NO_PID]: ECPGtrans on line 213: action "commit"; connection "con2" [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_finish: connection con2 closed [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: deallocate_one on line 0: name stmt_3 -[NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: deallocate_one on line 0: name stmt_2 -[NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_finish: connection con1 closed [NO_PID]: sqlca: code: 0, state: 00000 diff --git a/src/interfaces/ecpg/test/expected/sql-declare.stdout b/src/interfaces/ecpg/test/expected/sql-declare.stdout index 3352d47cc4..d32ba4b6a4 100644 --- a/src/interfaces/ecpg/test/expected/sql-declare.stdout +++ b/src/interfaces/ecpg/test/expected/sql-declare.stdout @@ -18,3 +18,5 @@ f1=2, f2=20, f3=db on con2 f1=1, f2=10, f3=db on con2 f1=2, f2=20, f3=db on con2 +****descriptor results**** +count: 3, length: 20, data: db on con1 diff --git a/src/interfaces/ecpg/test/sql/declare.pgc b/src/interfaces/ecpg/test/sql/declare.pgc index f9ef468741..f8b36291dc 100644 --- a/src/interfaces/ecpg/test/sql/declare.pgc +++ b/src/interfaces/ecpg/test/sql/declare.pgc @@ -7,7 +7,7 @@ EXEC SQL WHENEVER SQLERROR SQLPRINT; EXEC SQL INCLUDE sqlca; EXEC SQL INCLUDE ../regression; -#define ARRAY_SZIE 20 +#define ARRAY_SZIE 2 void execute_test(void); void commitTable(void); @@ -60,7 +60,7 @@ int main(void) void execute_test(void) { EXEC SQL BEGIN DECLARE SECTION; - int i; + int i, count, length; char *selectString = "SELECT f1,f2,f3 FROM source"; EXEC SQL END DECLARE SECTION; @@ -175,6 +175,36 @@ void execute_test(void) EXEC SQL DEALLOCATE PREPARE stmt_5; printResult("testcase5", 2); + + /* + * DESCRIBE statement is also supported. + */ + EXEC SQL AT con1 DECLARE stmt_desc STATEMENT; + EXEC SQL PREPARE stmt_desc FROM :selectString; + EXEC SQL DECLARE cur_desc CURSOR FOR stmt_desc; + EXEC SQL OPEN cur_desc; + + /* descriptor can be used for describe statement */ + EXEC SQL AT con1 ALLOCATE DESCRIPTOR desc_for_describe; + EXEC SQL DESCRIBE stmt_desc INTO SQL DESCRIPTOR desc_for_describe; + + EXEC SQL AT con1 GET DESCRIPTOR desc_for_describe :count = COUNT; + EXEC SQL AT con1 GET DESCRIPTOR desc_for_describe VALUE 3 :length = LENGTH; + + EXEC SQL AT con1 DEALLOCATE DESCRIPTOR desc_for_describe; + + /* for fetch statement */ + EXEC SQL AT con1 ALLOCATE DESCRIPTOR desc_for_fetch; + EXEC SQL FETCH cur_desc INTO SQL DESCRIPTOR desc_for_fetch; + + EXEC SQL AT con1 GET DESCRIPTOR desc_for_fetch VALUE 3 :f3[0] = DATA; + + EXEC SQL AT con1 DEALLOCATE DESCRIPTOR desc_for_fetch; + EXEC SQL CLOSE cur_desc; + EXEC SQL DEALLOCATE stmt_desc; + + printf("****descriptor results****\n"); + printf("count: %d, length: %d, data: %s\n", count, length, f3[0]); } void commitTable()