From abd310a3b1bace1177ce7d9f94120785deccab1a Mon Sep 17 00:00:00 2001
From: Michael Meskes <meskes@postgresql.org>
Date: Fri, 20 Jun 2003 12:00:59 +0000
Subject: [PATCH] Allow constants in using clauses.

---
 src/interfaces/ecpg/ChangeLog          |  4 ++++
 src/interfaces/ecpg/ecpglib/execute.c  |  5 +++--
 src/interfaces/ecpg/ecpglib/typename.c |  4 +++-
 src/interfaces/ecpg/include/ecpgtype.h |  1 +
 src/interfaces/ecpg/preproc/preproc.y  | 18 +++++++++++++++---
 src/interfaces/ecpg/preproc/type.c     | 11 +++++++++++
 src/interfaces/ecpg/test/test2.pgc     |  3 +--
 7 files changed, 38 insertions(+), 8 deletions(-)

diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog
index a50d7affd4..617d6588e2 100644
--- a/src/interfaces/ecpg/ChangeLog
+++ b/src/interfaces/ecpg/ChangeLog
@@ -1501,6 +1501,10 @@ Thu Jun 19 10:08:26 CEST 2003
 
 	- Added missing rdayofweek function for Informix compatibility.
 	- Fixed fetch into char pointer.
+	
+Fri Jun 20 13:23:07 CEST 2003
+
+	- Enabled constants in using clause.
 	- Set ecpg version to 3.0.0
 	- Set ecpg library to 4.0.0
 	- Set pgtypes library to 1.0.0
diff --git a/src/interfaces/ecpg/ecpglib/execute.c b/src/interfaces/ecpg/ecpglib/execute.c
index 108bbe05ab..4bc0ba8017 100644
--- a/src/interfaces/ecpg/ecpglib/execute.c
+++ b/src/interfaces/ecpg/ecpglib/execute.c
@@ -1,4 +1,4 @@
-/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.10 2003/06/15 04:07:58 momjian Exp $ */
+/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.11 2003/06/20 12:00:59 meskes Exp $ */
 
 /*
  * The aim is to get a simpler inteface to the database routines.
@@ -775,6 +775,7 @@ ECPGstore_input(const struct statement * stmt, const struct variable * var,
 					*malloced_p = true;
 				}
 				break;
+			case ECPGt_const:
 			case ECPGt_char_variable:
 				{
 					int			slen = strlen((char *) var->value);
@@ -1214,7 +1215,7 @@ ECPGexecute(struct statement * stmt)
 	{
 		ECPGlog("ECPGexecute line %d: ASYNC NOTIFY of '%s' from backend pid '%d' received\n",
 				stmt->lineno, notify->relname, notify->be_pid);
-		PQfreemem(notify); 
+		PQfreemem(notify);
 	}
 
 	return status;
diff --git a/src/interfaces/ecpg/ecpglib/typename.c b/src/interfaces/ecpg/ecpglib/typename.c
index 4967674e19..e8ffec94df 100644
--- a/src/interfaces/ecpg/ecpglib/typename.c
+++ b/src/interfaces/ecpg/ecpglib/typename.c
@@ -1,4 +1,4 @@
-/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/typename.c,v 1.5 2003/06/17 07:28:22 meskes Exp $ */
+/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/typename.c,v 1.6 2003/06/20 12:00:59 meskes Exp $ */
 
 #define POSTGRES_ECPG_INTERNAL
 #include "postgres_fe.h"
@@ -56,6 +56,8 @@ ECPGtype_name(enum ECPGttype typ)
 			return "Timestamp";
 		case ECPGt_interval:
 			return "Interval";
+		case ECPGt_char_const:
+			return "Const";
 		default:
 			abort();
 	}
diff --git a/src/interfaces/ecpg/include/ecpgtype.h b/src/interfaces/ecpg/include/ecpgtype.h
index 51f090c844..bd1902a093 100644
--- a/src/interfaces/ecpg/include/ecpgtype.h
+++ b/src/interfaces/ecpg/include/ecpgtype.h
@@ -53,6 +53,7 @@ enum ECPGttype
 	ECPGt_union,
 	ECPGt_descriptor,		/* sql descriptor, no C variable */
 	ECPGt_char_variable,
+	ECPGt_const,			/* a constant is needed sometimes */
 	ECPGt_EOIT,			/* End of insert types. */
 	ECPGt_EORT,			/* End of result types. */
 	ECPGt_NO_INDICATOR		/* no indicator */
diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y
index d096dd220b..107d84251f 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.234 2003/06/19 09:52:11 meskes Exp $ */
+/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Attic/preproc.y,v 1.235 2003/06/20 12:00:59 meskes Exp $ */
 
 /* Copyright comment */
 %{
@@ -475,7 +475,7 @@ adjust_informix(struct arguments *list)
 %type  <str>	ECPGGetDescriptorHeader ECPGColLabel single_var_declaration
 %type  <str>	reserved_keyword unreserved_keyword ecpg_interval opt_ecpg_using
 %type  <str>	col_name_keyword func_name_keyword precision opt_scale
-%type  <str>	ECPGTypeName using_list ECPGColLabelCommon 
+%type  <str>	ECPGTypeName using_list ECPGColLabelCommon UsingConst
 %type  <str>	inf_val_list inf_col_list using_descriptor into_descriptor 
 %type  <str>	ecpg_into_using
 
@@ -5196,7 +5196,19 @@ ecpg_into: INTO into_list		{ $$ = EMPTY; }
 		| into_descriptor	{ $$ = $1; }
 		;
 		
-using_list: civar | civar ',' using_list;
+using_list: UsingConst | UsingConst ',' using_list;
+
+UsingConst: AllConst
+		{
+			if ($1[1] != '?') /* found a constant */
+			{
+				char *length = mm_alloc(sizeof("INT_MAX")+1);
+
+				sprintf(length, "%d", strlen($1));
+				add_variable(&argsinsert, new_variable($1, ECPGmake_simple_type(ECPGt_const, length), 0), &no_indicator);
+			}
+		}
+		;
 
 /*
  * As long as the prepare statement is not supported by the backend, we will
diff --git a/src/interfaces/ecpg/preproc/type.c b/src/interfaces/ecpg/preproc/type.c
index 7ac5c55a28..5f2dd86bb5 100644
--- a/src/interfaces/ecpg/preproc/type.c
+++ b/src/interfaces/ecpg/preproc/type.c
@@ -169,6 +169,9 @@ get_type(enum ECPGttype type)
 										 * quoted */
 			return ("ECPGt_char_variable");
 			break;
+		case ECPGt_const:		/* constant string quoted */
+			return ("ECPGt_const");
+			break;
 		case ECPGt_numeric:
 			return ("ECPGt_numeric");
 			break;
@@ -381,6 +384,14 @@ ECPGdump_a_simple(FILE *o, const char *name, enum ECPGttype type,
 				sprintf(variable, "&(%s%s)", prefix ? prefix : "", name);
 				sprintf(offset, "sizeof(Date)");
 				break;
+			case ECPGt_const:
+
+				/*
+				 * just dump the const as string 
+				 */
+				sprintf(variable, "\"%s\"", name);
+				sprintf(offset, "strlen(\"%s\")", name);
+				break;
 			default:
 
 				/*
diff --git a/src/interfaces/ecpg/test/test2.pgc b/src/interfaces/ecpg/test/test2.pgc
index 0d11c0c38a..8e2160a0ec 100644
--- a/src/interfaces/ecpg/test/test2.pgc
+++ b/src/interfaces/ecpg/test/test2.pgc
@@ -27,7 +27,6 @@ exec sql begin declare section;
 					struct birthinfo ind_birth;
 				  } ind_personal, *i;
 	ind ind_children;
-	c testname="Petra";
 	char *query="select name, born, age, married, children from meskes where name = :var1";
 exec sql end declare section;
 
@@ -92,7 +91,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 'Petra';
 
 	exec sql whenever not found do break;