diff --git a/src/interfaces/ecpg/TODO b/src/interfaces/ecpg/TODO index 114500850c66f3a19f07042016fbe9d17a1eee56..f6e425b958a5800217acee99d8568c38633e2316 100644 --- a/src/interfaces/ecpg/TODO +++ b/src/interfaces/ecpg/TODO @@ -13,6 +13,8 @@ support for dynamic SQL with unknown number of variables with DESCRIPTORS The line numbering is not exact. +Inside an SQL statement quoting only works with SQL92 style double quotes: ''. + Missing statements: - exec sql allocate - exec sql deallocate diff --git a/src/interfaces/ecpg/lib/ecpglib.c b/src/interfaces/ecpg/lib/ecpglib.c index b74febcd1cce7b8f95cda8c345781390119c63c4..0643571a0180785fabcd12bfeb3459555c56dc0a 100644 --- a/src/interfaces/ecpg/lib/ecpglib.c +++ b/src/interfaces/ecpg/lib/ecpglib.c @@ -241,41 +241,6 @@ quote_postgres(char *arg, int lineno) return res; } -/* This function returns a newly malloced string that has the \ - in the strings inside the argument quoted with another \. - */ -static -char * -quote_strings(char *arg, int lineno) -{ - char *res = (char *) ecpg_alloc(2 * strlen(arg) + 1, lineno); - int i, - ri; - bool string = false; - - if (!res) - return (res); - - for (i = 0, ri = 0; arg[i]; i++, ri++) - { - switch (arg[i]) - { - case '\'': - string = string ? false : true; - break; - case '\\': - res[ri++] = '\\'; - default: - ; - } - - res[ri] = arg[i]; - } - res[ri] = '\0'; - - return res; -} - /* * create a list of variables * The variables are listed with input variables preceeding outputvariables @@ -544,17 +509,8 @@ ECPGexecute(struct statement * stmt) strncpy(newcopy, (char *) var->value, slen); newcopy[slen] = '\0'; - if (!(mallocedval = (char *) ecpg_alloc(2 * strlen(newcopy) + 1, stmt->lineno))) - return false; - - tmp = quote_strings(newcopy, stmt->lineno); - if (!tmp) - return false; - strcat(mallocedval, tmp); - free(newcopy); - - tobeinserted = mallocedval; + tobeinserted = newcopy; } break; case ECPGt_varchar: diff --git a/src/interfaces/ecpg/preproc/Makefile b/src/interfaces/ecpg/preproc/Makefile index 80ac7444b2ecb682e3cd38c1d40d8f898b7239de..26e1cf3f9024ae44c1ac23b2996eb4d4e6890e4e 100644 --- a/src/interfaces/ecpg/preproc/Makefile +++ b/src/interfaces/ecpg/preproc/Makefile @@ -9,8 +9,9 @@ CFLAGS+=-I../include -DMAJOR_VERSION=$(MAJOR_VERSION) \ -DMINOR_VERSION=$(MINOR_VERSION) -DPATCHLEVEL=$(PATCHLEVEL) \ -DINCLUDE_PATH=\"$(HEADERDIR)\" -OBJ=preproc.o pgc.o type.o ecpg.o ecpg_keywords.o ../../../backend/parser/scansup.o \ +OBJ=preproc.o pgc.o type.o ecpg.o ecpg_keywords.o \ keywords.o c_keywords.o ../lib/typename.o +#../../../backend/parser/scansup.o all:: ecpg diff --git a/src/interfaces/ecpg/preproc/pgc.l b/src/interfaces/ecpg/preproc/pgc.l index 071dc4731d0fd731a2dd2098b0ce1cab98a2696b..1585e395b0cb729932a717df41c4866775115080 100644 --- a/src/interfaces/ecpg/preproc/pgc.l +++ b/src/interfaces/ecpg/preproc/pgc.l @@ -248,7 +248,8 @@ cppline {space}*#.*(\\{space}*\n)*\n* } <xq>{xqstop} { BEGIN(SQL); - yylval.str = mm_strdup(scanstr(literal)); + /* yylval.str = mm_strdup(scanstr(literal));*/ + yylval.str = mm_strdup(literal); return SCONST; } <xq>{xqdouble} | @@ -609,7 +610,8 @@ cppline {space}*#.*(\\{space}*\n)*\n* if (strcmp(old, ptr->old) == 0) { free(ptr->new); - ptr->new = mm_strdup(scanstr(literal)); + /* ptr->new = mm_strdup(scanstr(literal));*/ + ptr->new = mm_strdup(literal); } } if (ptr == NULL) @@ -618,7 +620,8 @@ cppline {space}*#.*(\\{space}*\n)*\n* /* initial definition */ this->old = old; - this->new = mm_strdup(scanstr(literal)); + /* this->new = mm_strdup(scanstr(literal));*/ + this->new = mm_strdup(literal); this->next = defines; defines = this; } diff --git a/src/interfaces/ecpg/test/test1.pgc b/src/interfaces/ecpg/test/test1.pgc index bed83f96380de3ba2564fca5d8c0ac22905ca9ad..9f7e2de52e8c28d6d1c121d4f221b1667d555281 100644 --- a/src/interfaces/ecpg/test/test1.pgc +++ b/src/interfaces/ecpg/test/test1.pgc @@ -6,7 +6,7 @@ exec sql include sqlca; exec sql define AMOUNT 4; exec sql type intarray is int[AMOUNT]; -exec sql type string is char(6); +exec sql type string is char(8); typedef int intarray[AMOUNT]; @@ -16,7 +16,7 @@ main () exec sql begin declare section; intarray amount; int increment=100; - char name[AMOUNT][6]; + char name[AMOUNT][8]; char letter[AMOUNT][1]; char command[128]; exec sql end declare section; @@ -35,8 +35,8 @@ exec sql end declare section; exec sql connect to pm; strcpy(msg, "create"); - exec sql at main create table test(name char(6), amount int, letter char(1)); - exec sql create table test(name char(6), amount int, letter char(1)); + exec sql at main create table test(name char(8), amount int, letter char(1)); + exec sql create table test(name char(8), amount int, letter char(1)); strcpy(msg, "commit"); exec sql at main commit; @@ -46,13 +46,13 @@ exec sql end declare section; exec sql set connection to main; strcpy(msg, "execute insert 1"); - sprintf(command, "insert into test(name, amount, letter) values ('db: mm', 1, 'f')"); + sprintf(command, "insert into test(name, amount, letter) values ('db: ''mm''', 1, 'f')"); exec sql execute immediate :command; - sprintf(command, "insert into test(name, amount, letter) values ('db: mm', 2, 't')"); + sprintf(command, "insert into test(name, amount, letter) values ('db: ''mm''', 2, 't')"); exec sql execute immediate :command; strcpy(msg, "execute insert 2"); - sprintf(command, "insert into test(name, amount, letter) values ('db: pm', 1, 'f')"); + sprintf(command, "insert into test(name, amount, letter) values ('db: ''pm''', 1, 'f')"); exec sql at pm execute immediate :command; strcpy(msg, "execute insert 3"); @@ -78,12 +78,12 @@ exec sql end declare section; exec sql select name, amount, letter into :name, :amount, :letter from test; for (i=0, j=sqlca.sqlerrd[2]; i<j; i++) - printf("name[%d]=%6.6s\tamount[%d]=%d\tletter[%d]=%c\n", i, name[i], i, amount[i],i, letter[i][0]); + printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, name[i], i, amount[i],i, letter[i][0]); exec sql at pm select name, amount, letter into :name, :amount, :letter from test; for (i=0, j=sqlca.sqlerrd[2]; i<j; i++) - printf("name[%d]=%6.6s\tamount[%d]=%d\tletter[%d]=%c\n", i, name[i], i, amount[i],i, letter[i][0]); + printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, name[i], i, amount[i],i, letter[i][0]); strcpy(msg, "drop"); exec sql drop table test; diff --git a/src/interfaces/ecpg/test/test3.pgc b/src/interfaces/ecpg/test/test3.pgc index 03341221431a6dfb3d90c67014acf243dbc2fa4e..13786518f05e5b162936d66a78ef4d0bb6713fe5 100644 --- a/src/interfaces/ecpg/test/test3.pgc +++ b/src/interfaces/ecpg/test/test3.pgc @@ -18,7 +18,7 @@ exec sql begin declare section; int children; int ind_children; str *married = NULL; - char *testname="Petra"; + char *wifesname="Petra"; char *query="select name, born, age, married, children from meskes where name = :var1"; exec sql end declare section; @@ -32,13 +32,13 @@ exec sql end declare section; ECPGdebug(1, dbgs); strcpy(msg, "connect"); - exec sql connect to unix:postgresql://localhost:5432/mm; + exec sql connect to unix:postgresql://localhost:5432/mm; strcpy(msg, "create"); exec sql create table meskes(name char(8), born integer, age smallint, married date, children integer); strcpy(msg, "insert"); - exec sql insert into meskes(name, married, children) values ('Petra', '19900404', 3); + exec sql insert into meskes(name, married, children) values (:wifesname, '19900404', 3); exec sql insert into meskes(name, born, age, married, children) values ('Michael', 19660117, 33, '19900404', 3); exec sql insert into meskes(name, born, age) values ('Carsten', 19910103, 8); exec sql insert into meskes(name, born, age) values ('Marc', 19930907, 5); @@ -78,7 +78,7 @@ exec sql end declare section; exec sql declare prep cursor for MM; strcpy(msg, "open"); - exec sql open prep using :testname; + exec sql open prep using :wifesname; exec sql whenever not found do break;