Sync ECPG's CREATE TABLE AS statement with backend's.

Author: Higuchi-san ("Higuchi, Daisuke" <higuchi.daisuke@jp.fujitsu.com>)
This commit is contained in:
Michael Meskes 2019-02-18 11:57:34 +01:00
parent 050710b369
commit e81f0e3113
7 changed files with 283 additions and 1 deletions

View File

@ -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);
}
;

View File

@ -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

View File

@ -0,0 +1,164 @@
/* Processed by ecpg (regression mode) */
/* These include files are added by the preprocessor */
#include <ecpglib.h>
#include <ecpgerrno.h>
#include <sqlca.h>
/* End of automatic include section */
#define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y))
#line 1 "createtableas.pgc"
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#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;
}

View File

@ -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 <DEFAULT> port <DEFAULT>
[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

View File

@ -0,0 +1,2 @@
ID = 100
ID = 0

View File

@ -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 \

View File

@ -0,0 +1,41 @@
#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 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;
}