From 53c15ceda0e84d3d592d653fda29af03ef5ffc77 Mon Sep 17 00:00:00 2001
From: Michael Meskes <meskes@postgresql.org>
Date: Thu, 13 Feb 2003 20:37:28 +0000
Subject: [PATCH] Just intermediate results for backup reasons.

---
 src/interfaces/ecpg/preproc/pgc.l     |  13 ++-
 src/interfaces/ecpg/preproc/preproc.y | 120 +++++++++++++++++++++++---
 2 files changed, 117 insertions(+), 16 deletions(-)

diff --git a/src/interfaces/ecpg/preproc/pgc.l b/src/interfaces/ecpg/preproc/pgc.l
index 0ff7900c68b..44e22f5cc00 100644
--- a/src/interfaces/ecpg/preproc/pgc.l
+++ b/src/interfaces/ecpg/preproc/pgc.l
@@ -12,7 +12,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.102 2003/02/13 13:11:52 meskes Exp $
+ *	  $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.103 2003/02/13 20:37:28 meskes Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -831,7 +831,16 @@ cppline			{space}*#(.*\\{space})*.*
 							i > 0 && isspace((unsigned char) yytext[i]);
 							i-- )
 					  		{}
-					  	yytext[i+1] = '\0';
+
+						/* Remove trailing '"' if it exists */
+						if (yytext[i] == '"') 
+							yytext[i] = '\0';
+						else
+						  	yytext[i+1] = '\0';
+
+						/* also remove starting '"' */
+						if (yytext[0] == '"')
+							memmove(yytext, yytext+1, strlen(yytext));
 
 					  	yyin = NULL;
 					  	for (ip = include_paths; yyin == NULL && ip != NULL; ip = ip->next)
diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y
index e1e374cd690..3d407f1cac6 100644
--- a/src/interfaces/ecpg/preproc/preproc.y
+++ b/src/interfaces/ecpg/preproc/preproc.y
@@ -1,4 +1,4 @@
-/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Attic/preproc.y,v 1.206 2003/01/21 20:01:12 meskes Exp $ */
+/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Attic/preproc.y,v 1.207 2003/02/13 20:37:28 meskes Exp $ */
 
 /* Copyright comment */
 %{
@@ -376,7 +376,7 @@ make_name(void)
 %type  <str>	storage_clause opt_initializer c_anything
 %type  <str>	variable_list variable c_thing c_term
 %type  <str>	opt_pointer ECPGDisconnect dis_name storage_modifier
-%type  <str>	stmt ECPGRelease execstring server_name
+%type  <str>	ECPGRelease execstring server_name ECPGVarDeclaration
 %type  <str>	connection_object opt_server opt_port c_stuff c_stuff_item
 %type  <str>	user_name opt_user char_variable ora_user ident opt_reference
 %type  <str>	var_type_declarations quoted_ident_stringvar
@@ -385,13 +385,13 @@ make_name(void)
 %type  <str>	enum_type civar civarind ECPGCursorStmt ECPGDeallocate
 %type  <str>	ECPGFree ECPGDeclare ECPGVar opt_at enum_definition
 %type  <str>	struct_type s_struct vt_declarations variable_declarations
-%type  <str>	var_declaration type_declaration
+%type  <str>	var_declaration type_declaration single_vt_declaration
 %type  <str>	s_union union_type ECPGSetAutocommit on_off
 %type  <str>	ECPGAllocateDescr ECPGDeallocateDescr symbol opt_symbol
-%type  <str>	ECPGGetDescriptorHeader ECPGColLabel
+%type  <str>	ECPGGetDescriptorHeader ECPGColLabel single_var_declaration
 %type  <str>	reserved_keyword unreserved_keyword
 %type  <str>	col_name_keyword func_name_keyword
-%type  <str>	ECPGTypeName variablelist
+%type  <str>	ECPGTypeName variablelist ECPGColLabelCommon
 
 %type  <descriptor> ECPGGetDescriptor
 
@@ -399,7 +399,7 @@ make_name(void)
 
 %type  <dtype_enum> descriptor_item desc_header_item
 
-%type  <type>	type
+%type  <type>	type common_type single_vt_type
 
 %type  <action> action
 
@@ -652,6 +652,12 @@ stmt:  AlterDatabaseSetStmt { output_statement($1, 0, connection); }
 
 			output_simple_statement($1);
 		}
+		| ECPGVarDeclaration
+		{
+			fprintf(yyout, "%s", $1);
+                        free($1);
+			output_line_number();
+		}
 		| ECPGWhenever
 		{
 			if (connection)
@@ -4125,8 +4131,89 @@ ECPGDeallocate: DEALLOCATE PREPARE ident
 			{ $$ = cat_str(2, make_str("ECPGdeallocate(__LINE__, \""), $2, make_str("\");")); }
 		;
 
+/* 
+ * variable decalartion outside exec sql declare block
+ */
+ECPGVarDeclaration: single_vt_declaration;
+
+single_vt_declaration: type_declaration		{ $$ = $1; }
+		| single_var_declaration	{ $$ = $1; }
+		;
+	
+single_var_declaration: storage_clause storage_modifier
+		{
+			actual_storage[struct_level] = cat2_str(mm_strdup($1), mm_strdup($2));
+			actual_startline[struct_level] = hashline_number();
+		}
+		single_vt_type
+		{
+			actual_type[struct_level].type_enum = $4.type_enum;
+			actual_type[struct_level].type_dimension = $4.type_dimension;
+			actual_type[struct_level].type_index = $4.type_index;
+			actual_type[struct_level].type_sizeof = $4.type_sizeof;
+
+			/* we do not need the string "varchar" for output */
+			/* so replace it with an empty string */
+			if ($4.type_enum == ECPGt_varchar)
+			{
+				free($4.type_str);
+				$4.type_str=EMPTY;
+			}
+		}
+		variable_list 
+		{
+			$$ = cat_str(6, actual_startline[struct_level], $1, $2, $4.type_str, $6, make_str(";\n"));
+		}
+		;
+
+single_vt_type: common_type
+		| ECPGColLabelCommon
+		{
+			/*
+			 * Check for type names that the SQL grammar treats as
+			 * unreserved keywords
+			 */
+			if (strcmp($1, "varchar") == 0)
+			{
+				$$.type_enum = ECPGt_varchar;
+				$$.type_str = make_str("varchar");
+				$$.type_dimension = -1;
+				$$.type_index = -1;
+				$$.type_sizeof = NULL;
+			}
+			else if (strcmp($1, "float") == 0)
+			{
+				$$.type_enum = ECPGt_float;
+				$$.type_str = make_str("float");
+				$$.type_dimension = -1;
+				$$.type_index = -1;
+				$$.type_sizeof = NULL;
+			}
+			else if (strcmp($1, "double") == 0)
+			{
+				$$.type_enum = ECPGt_double;
+				$$.type_str = make_str("double");
+				$$.type_dimension = -1;
+				$$.type_index = -1;
+				$$.type_sizeof = NULL;
+			}
+			else
+			{
+				/* this is for typedef'ed types */
+				struct typedefs *this = get_typedef($1);
+
+				$$.type_str = (this->type->type_enum == ECPGt_varchar) ? EMPTY : mm_strdup(this->name);
+				$$.type_enum = this->type->type_enum;
+				$$.type_dimension = this->type->type_dimension;
+				$$.type_index = this->type->type_index;
+				$$.type_sizeof = this->type->type_sizeof;
+				struct_member_list[struct_level] = ECPGstruct_member_dup(this->struct_member_list);
+			}
+		}
+		;
+
 /*
- * variable declaration inside the exec sql declare block
+ * variable declaration inside exec sql declare block
  */
 ECPGDeclaration: sql_startdeclare
 		{ fputs("/* exec sql begin declare section */", yyout); }
@@ -4256,7 +4343,7 @@ storage_modifier : S_CONST		{ $$ = make_str("const"); }
 		| /*EMPTY*/				{ $$ = EMPTY; }
 		;
 
-type: simple_type
+common_type: simple_type
 		{
 			$$.type_enum = $1;
 			$$.type_str = mm_strdup(ECPGtype_name($1));
@@ -4288,6 +4375,9 @@ type: simple_type
 			$$.type_index = -1;
 			$$.type_sizeof = NULL;
 		}
+		;
+
+type:		common_type
 		| ECPGColLabel
 		{
 			/*
@@ -5108,15 +5198,17 @@ ColLabel:  ECPGColLabel					{ $$ = $1; }
 		| UNION							{ $$ = make_str("union"); }
 		;
 
-ECPGColLabel:  ident					{ $$ = $1; }
+ECPGColLabelCommon:  ident                              { $$ = $1; }
+                | col_name_keyword                      { $$ = $1; }
+                | func_name_keyword                     { $$ = $1; }
+                ;
+		
+ECPGColLabel:  ECPGColLabelCommon			{ $$ = $1; }
 		| unreserved_keyword			{ $$ = $1; }
-		| col_name_keyword				{ $$ = $1; }
-		| func_name_keyword				{ $$ = $1; }
-		| reserved_keyword				{ $$ = $1; }
-		| ECPGKeywords					{ $$ = $1; }
+		| reserved_keyword			{ $$ = $1; }
+		| ECPGKeywords				{ $$ = $1; }
 		;
 
-
 /*
  * Keyword classification lists.  Generally, every keyword present in
  * the Postgres grammar should appear in exactly one of these lists.
-- 
GitLab