diff --git a/src/interfaces/ecpg/preproc/ecpg.trailer b/src/interfaces/ecpg/preproc/ecpg.trailer index 88b27a297a..1d58c778d9 100644 --- a/src/interfaces/ecpg/preproc/ecpg.trailer +++ b/src/interfaces/ecpg/preproc/ecpg.trailer @@ -34,7 +34,14 @@ CreateAsStmt: CREATE OptTemp TABLE create_as_target AS {FoundInto = 0;} SelectSt if (FoundInto == 1) mmerror(PARSE_ERROR, ET_ERROR, "CREATE TABLE AS cannot specify INTO"); - $$ = cat_str(6, mm_strdup("create"), $2, mm_strdup("table"), $4, mm_strdup("as"), $7); + $$ = cat_str(7, mm_strdup("create"), $2, mm_strdup("table"), $4, mm_strdup("as"), $7, $8); + } + | CREATE OptTemp TABLE IF_P NOT EXISTS create_as_target AS {FoundInto = 0;} SelectStmt opt_with_data + { + if (FoundInto == 1) + mmerror(PARSE_ERROR, ET_ERROR, "CREATE TABLE AS cannot specify INTO"); + + $$ = cat_str(7, mm_strdup("create"), $2, mm_strdup("table if not exists"), $7, mm_strdup("as"), $10, $11); } ; diff --git a/src/interfaces/ecpg/test/ecpg_schedule b/src/interfaces/ecpg/test/ecpg_schedule index 89b21533be..939381e7bc 100644 --- a/src/interfaces/ecpg/test/ecpg_schedule +++ b/src/interfaces/ecpg/test/ecpg_schedule @@ -35,6 +35,7 @@ test: sql/binary test: sql/bytea test: sql/code100 test: sql/copystdout +test: sql/createtableas test: sql/define test: sql/desc test: sql/sqlda diff --git a/src/interfaces/ecpg/test/expected/sql-createtableas.c b/src/interfaces/ecpg/test/expected/sql-createtableas.c new file mode 100644 index 0000000000..973b46324f --- /dev/null +++ b/src/interfaces/ecpg/test/expected/sql-createtableas.c @@ -0,0 +1,164 @@ +/* Processed by ecpg (regression mode) */ +/* These include files are added by the preprocessor */ +#include +#include +#include +/* End of automatic include section */ +#define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y)) + +#line 1 "createtableas.pgc" +#include +#include +#include +#include + + +#line 1 "regression.h" + + + + + + +#line 6 "createtableas.pgc" + + +/* exec sql whenever sqlerror sqlprint ; */ +#line 8 "createtableas.pgc" + + +int +main(void) +{ + /* exec sql begin declare section */ + + +#line 14 "createtableas.pgc" + int id ; +/* exec sql end declare section */ +#line 15 "createtableas.pgc" + + + ECPGdebug(1, stderr); + { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , NULL, 0); +#line 18 "createtableas.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 18 "createtableas.pgc" + + + { ECPGsetcommit(__LINE__, "on", NULL); +#line 20 "createtableas.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 20 "createtableas.pgc" + + /* exec sql whenever sql_warning sqlprint ; */ +#line 21 "createtableas.pgc" + + /* exec sql whenever sqlerror sqlprint ; */ +#line 22 "createtableas.pgc" + + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "create table cta_test ( id int )", ECPGt_EOIT, ECPGt_EORT); +#line 24 "createtableas.pgc" + +if (sqlca.sqlwarn[0] == 'W') sqlprint(); +#line 24 "createtableas.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 24 "createtableas.pgc" + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into cta_test values ( 100 )", ECPGt_EOIT, ECPGt_EORT); +#line 25 "createtableas.pgc" + +if (sqlca.sqlwarn[0] == 'W') sqlprint(); +#line 25 "createtableas.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 25 "createtableas.pgc" + + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "create table if not exists cta_test1 as select * from cta_test", ECPGt_EOIT, ECPGt_EORT); +#line 27 "createtableas.pgc" + +if (sqlca.sqlwarn[0] == 'W') sqlprint(); +#line 27 "createtableas.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 27 "createtableas.pgc" + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select id from cta_test1", ECPGt_EOIT, + ECPGt_int,&(id),(long)1,(long)1,sizeof(int), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 28 "createtableas.pgc" + +if (sqlca.sqlwarn[0] == 'W') sqlprint(); +#line 28 "createtableas.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 28 "createtableas.pgc" + + printf("ID = %d\n", id); + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "create table cta_test2 as select * from cta_test with no data", ECPGt_EOIT, ECPGt_EORT); +#line 31 "createtableas.pgc" + +if (sqlca.sqlwarn[0] == 'W') sqlprint(); +#line 31 "createtableas.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 31 "createtableas.pgc" + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select count ( id ) from cta_test2", ECPGt_EOIT, + ECPGt_int,&(id),(long)1,(long)1,sizeof(int), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 32 "createtableas.pgc" + +if (sqlca.sqlwarn[0] == 'W') sqlprint(); +#line 32 "createtableas.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 32 "createtableas.pgc" + + printf("ID = %d\n", id); + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table cta_test", ECPGt_EOIT, ECPGt_EORT); +#line 35 "createtableas.pgc" + +if (sqlca.sqlwarn[0] == 'W') sqlprint(); +#line 35 "createtableas.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 35 "createtableas.pgc" + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table cta_test1", ECPGt_EOIT, ECPGt_EORT); +#line 36 "createtableas.pgc" + +if (sqlca.sqlwarn[0] == 'W') sqlprint(); +#line 36 "createtableas.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 36 "createtableas.pgc" + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table cta_test2", ECPGt_EOIT, ECPGt_EORT); +#line 37 "createtableas.pgc" + +if (sqlca.sqlwarn[0] == 'W') sqlprint(); +#line 37 "createtableas.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 37 "createtableas.pgc" + + { ECPGdisconnect(__LINE__, "ALL"); +#line 38 "createtableas.pgc" + +if (sqlca.sqlwarn[0] == 'W') sqlprint(); +#line 38 "createtableas.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 38 "createtableas.pgc" + + + return 0; +} diff --git a/src/interfaces/ecpg/test/expected/sql-createtableas.stderr b/src/interfaces/ecpg/test/expected/sql-createtableas.stderr new file mode 100644 index 0000000000..adb67111bf --- /dev/null +++ b/src/interfaces/ecpg/test/expected/sql-createtableas.stderr @@ -0,0 +1,66 @@ +[NO_PID]: ECPGdebug: set to 1 +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ECPGconnect: opening database ecpg1_regression on port +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ECPGsetcommit on line 20: action "on"; connection "ecpg1_regression" +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 24: query: create table cta_test ( id int ); with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 24: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 24: OK: CREATE TABLE +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 25: query: insert into cta_test values ( 100 ); with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 25: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 25: OK: INSERT 0 1 +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 27: query: create table if not exists cta_test1 as select * from cta_test; with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 27: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 27: OK: SELECT 1 +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 28: query: select id from cta_test1; with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 28: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 28: correctly got 1 tuples with 1 fields +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 28: RESULT: 100 offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 31: query: create table cta_test2 as select * from cta_test with no data; with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 31: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 31: OK: CREATE TABLE AS +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 32: query: select count ( id ) from cta_test2; with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 32: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 32: correctly got 1 tuples with 1 fields +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 32: RESULT: 0 offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 35: query: drop table cta_test; with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 35: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 35: OK: DROP TABLE +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 36: query: drop table cta_test1; with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 36: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 36: OK: DROP TABLE +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 37: query: drop table cta_test2; with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 37: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 37: OK: DROP TABLE +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_finish: connection ecpg1_regression closed +[NO_PID]: sqlca: code: 0, state: 00000 diff --git a/src/interfaces/ecpg/test/expected/sql-createtableas.stdout b/src/interfaces/ecpg/test/expected/sql-createtableas.stdout new file mode 100644 index 0000000000..e27a3e9d7f --- /dev/null +++ b/src/interfaces/ecpg/test/expected/sql-createtableas.stdout @@ -0,0 +1,2 @@ +ID = 100 +ID = 0 diff --git a/src/interfaces/ecpg/test/sql/Makefile b/src/interfaces/ecpg/test/sql/Makefile index d7182c900f..4e018ccb52 100644 --- a/src/interfaces/ecpg/test/sql/Makefile +++ b/src/interfaces/ecpg/test/sql/Makefile @@ -7,6 +7,7 @@ TESTS = array array.c \ binary binary.c \ code100 code100.c \ copystdout copystdout.c \ + createtableas createtableas.c \ define define.c \ desc desc.c \ sqlda sqlda.c \ diff --git a/src/interfaces/ecpg/test/sql/createtableas.pgc b/src/interfaces/ecpg/test/sql/createtableas.pgc new file mode 100644 index 0000000000..72f7077a43 --- /dev/null +++ b/src/interfaces/ecpg/test/sql/createtableas.pgc @@ -0,0 +1,41 @@ +#include +#include +#include +#include + +exec sql include ../regression; + +exec sql whenever sqlerror sqlprint; + +int +main(void) +{ + EXEC SQL BEGIN DECLARE SECTION; + int id; + EXEC SQL END DECLARE SECTION; + + ECPGdebug(1, stderr); + EXEC SQL connect to REGRESSDB1; + + EXEC SQL SET AUTOCOMMIT TO ON; + EXEC SQL WHENEVER SQLWARNING SQLPRINT; + EXEC SQL WHENEVER SQLERROR SQLPRINT; + + EXEC SQL CREATE TABLE cta_test (id int); + EXEC SQL INSERT INTO cta_test values (100); + + EXEC SQL CREATE TABLE IF NOT EXISTS cta_test1 AS SELECT * FROM cta_test; + EXEC SQL SELECT id INTO :id FROM cta_test1; + printf("ID = %d\n", id); + + EXEC SQL CREATE TABLE cta_test2 AS SELECT * FROM cta_test WITH NO DATA; + EXEC SQL SELECT count(id) INTO :id FROM cta_test2; + printf("ID = %d\n", id); + + EXEC SQL DROP TABLE cta_test; + EXEC SQL DROP TABLE cta_test1; + EXEC SQL DROP TABLE cta_test2; + EXEC SQL DISCONNECT all; + + return 0; +}