From: Marc G. Fournier <scrappy@hub.org>
Date: Sun, 31 Jan 1999 19:56:28 +0000 (+0000)
Subject: From: Michael Meskes <Michael.Meskes@usa.net>
X-Git-Tag: REL6_5~745
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=91fed81c7762a56c536ce65ab8fd52bd8449a8e7;p=postgresql

From: Michael Meskes <Michael.Meskes@usa.net>

+
+ Wed Jan 27 12:42:22 CET 1999
+
+       - Fixed bug that caused ecpg to lose 'goto' information.
+       - Set ecpg version to 2.4.7
+
+ Fri Jan 29 18:03:52 CET 1999
+
+       - Fixed bug that caused 'enum' to be rejected in pure C code.
+       - Fixed bug that caused function names to be translated to lower case.
+       - Set ecpg version to 2.4.8
+
---

diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog
index 9675f48227..9e4389dac2 100644
--- a/src/interfaces/ecpg/ChangeLog
+++ b/src/interfaces/ecpg/ChangeLog
@@ -383,3 +383,15 @@ Thu Jan 21 21:29:00 CET 1999
 	- Set library version to 2.6.3
 	- Added 'exec sql whenever sqlwarning'.
 	- Set ecpg version to 2.4.6
+
+Wed Jan 27 12:42:22 CET 1999
+
+	- Fixed bug that caused ecpg to lose 'goto' information.
+	- Set ecpg version to 2.4.7
+
+Fri Jan 29 18:03:52 CET 1999
+
+	- Fixed bug that caused 'enum' to be rejected in pure C code.
+	- Fixed bug that caused function names to be translated to lower case.
+	- Set ecpg version to 2.4.8
+ 
diff --git a/src/interfaces/ecpg/preproc/Makefile b/src/interfaces/ecpg/preproc/Makefile
index 2a3f5b2633..7d13a7a98a 100644
--- a/src/interfaces/ecpg/preproc/Makefile
+++ b/src/interfaces/ecpg/preproc/Makefile
@@ -3,7 +3,7 @@ include $(SRCDIR)/Makefile.global
 
 MAJOR_VERSION=2
 MINOR_VERSION=4
-PATCHLEVEL=6
+PATCHLEVEL=8
 
 CFLAGS+=-I../include -DMAJOR_VERSION=$(MAJOR_VERSION) \
 	-DMINOR_VERSION=$(MINOR_VERSION) -DPATCHLEVEL=$(PATCHLEVEL) \
diff --git a/src/interfaces/ecpg/preproc/pgc.l b/src/interfaces/ecpg/preproc/pgc.l
index 2af1e3e522..e6ef819a59 100644
--- a/src/interfaces/ecpg/preproc/pgc.l
+++ b/src/interfaces/ecpg/preproc/pgc.l
@@ -333,22 +333,23 @@ cppline		{space}*#.*(\\{space}*\n)*\n*
 <SQL>{identifier}/{space}*-{number}	{
 					int i;
 					ScanKeyword		*keyword;
+					char lower_text[NAMEDATALEN];
 
 					BEGIN(xm);
-					for(i = 0; yytext[i]; i++)
-						if (isascii((unsigned char)yytext[i]) && isupper(yytext[i]))
-							yytext[i] = tolower(yytext[i]);
-
-					if (i >= NAMEDATALEN)
-						yytext[NAMEDATALEN-1] = '\0';
-
-					keyword = ScanKeywordLookup((char*)yytext);
+					/* this should leave the last byte set to '\0' */
+					strncpy(lower_text, yytext, NAMEDATALEN-1);
+					for(i = 0; lower_text[i]; i++)
+						if (isascii((unsigned char)lower_text[i]) && isupper(lower_text[i]))
+							lower_text[i] = tolower(lower_text[i]);
+
+printf("yyt= %s, lt = %s\n", yytext, lower_text);
+					keyword = ScanKeywordLookup((char*)lower_text);
 					if (keyword != NULL) {
 						return keyword->value;
 					}
 					else
 					{
-						keyword = ScanECPGKeywordLookup((char*)yytext);
+						keyword = ScanECPGKeywordLookup((char*)lower_text);
 						if (keyword != NULL) {
 							return keyword->value;
 						}
@@ -475,21 +476,22 @@ cppline		{space}*#.*(\\{space}*\n)*\n*
 <SQL>{identifier}	{
 					int i;
 					ScanKeyword		*keyword;
+					char lower_text[NAMEDATALEN];
 
-					for(i = 0; yytext[i]; i++)
-						if (isascii((unsigned char)yytext[i]) && isupper(yytext[i]))
-							yytext[i] = tolower(yytext[i]);
-
-					if (i >= NAMEDATALEN)
-						yytext[NAMEDATALEN-1] = '\0';
+					/* this should leave the last byte set to '\0' */
+					strncpy(lower_text, yytext, NAMEDATALEN-1);
+					for(i = 0; lower_text[i]; i++)
+						if (isascii((unsigned char)lower_text[i]) && isupper(lower_text[i]))
+							lower_text[i] = tolower(lower_text[i]);
 
-					keyword = ScanKeywordLookup((char*)yytext);
+printf("yyt= %s, lt = %s\n", yytext, lower_text);
+					keyword = ScanKeywordLookup((char*)lower_text);
 					if (keyword != NULL) {
 						return keyword->value;
 					}
 					else
 					{
-						keyword = ScanECPGKeywordLookup((char*)yytext);
+						keyword = ScanECPGKeywordLookup((char*)lower_text);
 						if (keyword != NULL) {
 							return keyword->value;
 						}
diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y
index 0e34aa36dc..cda77f5281 100644
--- a/src/interfaces/ecpg/preproc/preproc.y
+++ b/src/interfaces/ecpg/preproc/preproc.y
@@ -521,7 +521,8 @@ output_statement(char * stmt, int mode)
 /* special embedded SQL token */
 %token		SQL_BREAK SQL_CALL SQL_CONNECT SQL_CONNECTION SQL_CONTINUE
 %token		SQL_DISCONNECT SQL_FOUND SQL_GO SQL_GOTO
-%token		SQL_IDENTIFIED SQL_IMMEDIATE SQL_INDICATOR SQL_OPEN SQL_RELEASE
+%token		SQL_IDENTIFIED SQL_IMMEDIATE SQL_INDICATOR SQL_OPEN 
+%token		SQL_PREPARE SQL_RELEASE
 %token		SQL_SECTION SQL_SEMI SQL_SQLERROR SQL_SQLPRINT SQL_START
 %token		SQL_STOP SQL_WHENEVER SQL_SQLWARNING
 
@@ -813,6 +814,9 @@ stmt:  AddAttrStmt			{ output_statement($1, 0); }
 						output_line_number();
 						free($1);
 					}
+		| ECPGPrepare		{
+						yyerror("PREPARE is not supported yet.");
+					}
 
 /*
  * We start with a lot of stuff that's very similar to the backend's parsing
@@ -4671,12 +4675,12 @@ action : SQL_CONTINUE {
 }
        | SQL_GOTO name {
         $<action>$.code = W_GOTO;
-        $<action>$.command = $2;
+        $<action>$.command = strdup($2);
 	$<action>$.str = cat2_str(make1_str("goto "), $2);
 }
        | SQL_GO TO name {
         $<action>$.code = W_GOTO;
-        $<action>$.command = $3;
+        $<action>$.command = strdup($3);
 	$<action>$.str = cat2_str(make1_str("goto "), $3);
 }
        | DO name '(' dotext ')' {
@@ -4695,8 +4699,15 @@ action : SQL_CONTINUE {
 	$<action>$.str = cat2_str(make1_str("call"), mm_strdup($<action>$.command));
 }
 
-/* some other stuff for ecpg */
+/*
+ * As long as the prepare statement in not supported by the backend, we will
+ * try to simulate it here so we get dynamic SQL 
+ */
+ECPGPrepare: SQL_PREPARE name FROM name
+	{
+	}
 
+/* some other stuff for ecpg */
 ecpg_expr:  attr opt_indirection
 				{
 					$$ = cat2_str($1, $2);
@@ -5032,6 +5043,7 @@ c_anything:  IDENT 	{ $$ = $1; }
 	| S_CHAR	{ $$ = make1_str("char"); }
 	| S_CONST	{ $$ = make1_str("const"); }
 	| S_DOUBLE	{ $$ = make1_str("double"); }
+	| S_ENUM	{ $$ = make1_str("enum"); }
 	| S_EXTERN	{ $$ = make1_str("extern"); }
 	| S_FLOAT	{ $$ = make1_str("float"); }
         | S_INT		{ $$ = make1_str("int"); }
diff --git a/src/interfaces/ecpg/test/header_test.h b/src/interfaces/ecpg/test/header_test.h
index 5050113e18..d6a84322b1 100644
--- a/src/interfaces/ecpg/test/header_test.h
+++ b/src/interfaces/ecpg/test/header_test.h
@@ -1,9 +1,9 @@
 exec sql include sqlca;
 
-exec sql whenever sqlerror do print_and_stop();
+exec sql whenever sqlerror do PrintAndStop();
 exec sql whenever sqlwarning do warn();
 
-void print_and_stop(void)
+void PrintAndStop(void)
 {
 	sqlprint();
 	exit(-1);