From 5933f1857f572fffcd783ea79c5f6e671fa2b599 Mon Sep 17 00:00:00 2001
From: Michael Meskes <meskes@postgresql.org>
Date: Wed, 16 Feb 2000 11:52:25 +0000
Subject: [PATCH] *** empty log message ***

---
 src/interfaces/ecpg/ChangeLog       |  10 +++
 src/interfaces/ecpg/TODO            |   3 +-
 src/interfaces/ecpg/lib/Makefile.in |   4 +-
 src/interfaces/ecpg/lib/ecpglib.c   | 121 +++++++++++++++++++++++-----
 src/interfaces/ecpg/test/Makefile   |   4 +-
 src/interfaces/ecpg/test/test1.pgc  |  16 ++--
 src/interfaces/ecpg/test/test4.pgc  |   2 +-
 7 files changed, 130 insertions(+), 30 deletions(-)

diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog
index defc1cfa0fb..3d5828f6ba6 100644
--- a/src/interfaces/ecpg/ChangeLog
+++ b/src/interfaces/ecpg/ChangeLog
@@ -799,5 +799,15 @@ Tue Feb 15 11:14:07 CET 2000
 
 	- Synced keyword.c.
 	- Synced preproc.y with gram.y.
+
+Tue Feb 15 17:39:19 CET 2000
+
+	- Do only write the first 70 bytes of the error message to the 
+	  sqlca structure since there are only 70 bytes free space.
 	- Set library version to 3.0.10.
+
+Wed Feb 16 11:57:02 CET 2000
+
+	- Fixed library to be able to input complete arrays.
+	- Set library version to 3.1.0.
 	- Set ecpg version to 2.7.0.
diff --git a/src/interfaces/ecpg/TODO b/src/interfaces/ecpg/TODO
index 16af8686437..542894945d1 100644
--- a/src/interfaces/ecpg/TODO
+++ b/src/interfaces/ecpg/TODO
@@ -13,7 +13,8 @@ stderr. Instead it should be listed as a warning.
 The error handling has to be improved by adding additional error-rules to
 the parser.
 
-it would be nice to be able to use :var[:index] as cvariable for an array var
+it would be nice to be able to use :var[:index] or :var[<integer>] as
+cvariable for an array var
 
 How can one insert arrays from c variables?
 
diff --git a/src/interfaces/ecpg/lib/Makefile.in b/src/interfaces/ecpg/lib/Makefile.in
index 0fcbc7b808d..296c3c5a409 100644
--- a/src/interfaces/ecpg/lib/Makefile.in
+++ b/src/interfaces/ecpg/lib/Makefile.in
@@ -6,13 +6,13 @@
 # Copyright (c) 1994, Regents of the University of California
 #
 # IDENTIFICATION
-#    $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/Makefile.in,v 1.56 2000/01/18 13:03:47 meskes Exp $
+#    $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/Makefile.in,v 1.57 2000/02/16 11:52:24 meskes Exp $
 #
 #-------------------------------------------------------------------------
 
 NAME= ecpg
 SO_MAJOR_VERSION= 3
-SO_MINOR_VERSION= 0.10
+SO_MINOR_VERSION= 1.0
 
 SRCDIR= @top_srcdir@
 include $(SRCDIR)/Makefile.global
diff --git a/src/interfaces/ecpg/lib/ecpglib.c b/src/interfaces/ecpg/lib/ecpglib.c
index 205a051a1e7..5074bc20e07 100644
--- a/src/interfaces/ecpg/lib/ecpglib.c
+++ b/src/interfaces/ecpg/lib/ecpglib.c
@@ -414,7 +414,7 @@ ECPGexecute(struct statement * stmt)
 		char	   *mallocedval = NULL;
 		char	   *tobeinserted = NULL;
 		char	   *p;
-		char		buff[20];
+		char	    buff[20];
 
 		/*
 		 * Some special treatment is needed for records since we want
@@ -450,49 +450,132 @@ ECPGexecute(struct statement * stmt)
 		{
 			switch (var->type)
 			{
+				int element;
+				
 				case ECPGt_short:
-					sprintf(buff, "%d", *(short *) var->value);
-					tobeinserted = buff;
+					if (!(mallocedval = ecpg_alloc(var->arrsize * 20, stmt->lineno)))
+						return false;
+
+					sprintf(mallocedval, "%s", (var->arrsize > 1) ? "'{" : ""); 
+						
+					for (element = 0; element < var->arrsize; element++)
+						sprintf(mallocedval + strlen(mallocedval), "%d,", ((short *) var->value)[element]);
+						
+					sprintf(mallocedval + strlen(mallocedval) - 1, "%s", (var->arrsize > 1) ? "}'" : ""); 
+
+					tobeinserted = mallocedval;
 					break;
 
 				case ECPGt_int:
-					sprintf(buff, "%d", *(int *) var->value);
-					tobeinserted = buff;
+					if (!(mallocedval = ecpg_alloc(var->arrsize * 20, stmt->lineno)))
+						return false;
+
+					sprintf(mallocedval, "%s", (var->arrsize > 1) ? "'{" : ""); 
+						
+					for (element = 0; element < var->arrsize; element++)
+						sprintf(mallocedval + strlen(mallocedval), "%d,", ((int *) var->value)[element]);
+						
+					sprintf(mallocedval + strlen(mallocedval) - 1, "%s", (var->arrsize > 1) ? "}'" : ""); 
+
+					tobeinserted = mallocedval;
 					break;
 
 				case ECPGt_unsigned_short:
-					sprintf(buff, "%d", *(unsigned short *) var->value);
-					tobeinserted = buff;
+					if (!(mallocedval = ecpg_alloc(var->arrsize * 20, stmt->lineno)))
+						return false;
+
+					sprintf(mallocedval, "%s", (var->arrsize > 1) ? "'{" : ""); 
+						
+					for (element = 0; element < var->arrsize; element++)
+						sprintf(mallocedval + strlen(mallocedval), "%d,", ((unsigned short *) var->value)[element]);
+						
+					sprintf(mallocedval + strlen(mallocedval) - 1, "%s", (var->arrsize > 1) ? "}'" : ""); 
+
+					tobeinserted = mallocedval;
 					break;
 
 				case ECPGt_unsigned_int:
-					sprintf(buff, "%d", *(unsigned int *) var->value);
-					tobeinserted = buff;
+					if (!(mallocedval = ecpg_alloc(var->arrsize * 20, stmt->lineno)))
+						return false;
+
+					sprintf(mallocedval, "%s", (var->arrsize > 1) ? "'{" : ""); 
+						
+					for (element = 0; element < var->arrsize; element++)
+						sprintf(mallocedval + strlen(mallocedval), "%d,", ((unsigned int *) var->value)[element]);
+						
+					sprintf(mallocedval + strlen(mallocedval) - 1, "%s", (var->arrsize > 1) ? "}'" : ""); 
+
+					tobeinserted = mallocedval;
 					break;
 
 				case ECPGt_long:
-					sprintf(buff, "%ld", *(long *) var->value);
-					tobeinserted = buff;
+					if (!(mallocedval = ecpg_alloc(var->arrsize * 20, stmt->lineno)))
+						return false;
+
+					sprintf(mallocedval, "%s", (var->arrsize > 1) ? "'{" : ""); 
+						
+					for (element = 0; element < var->arrsize; element++)
+						sprintf(mallocedval + strlen(mallocedval), "%ld,", ((long *) var->value)[element]);
+						
+					sprintf(mallocedval + strlen(mallocedval) - 1, "%s", (var->arrsize > 1) ? "}'" : ""); 
+
+					tobeinserted = mallocedval;
 					break;
 
 				case ECPGt_unsigned_long:
-					sprintf(buff, "%ld", *(unsigned long *) var->value);
-					tobeinserted = buff;
+					if (!(mallocedval = ecpg_alloc(var->arrsize * 20, stmt->lineno)))
+						return false;
+
+					sprintf(mallocedval, "%s", (var->arrsize > 1) ? "'{" : ""); 
+						
+					for (element = 0; element < var->arrsize; element++)
+						sprintf(mallocedval + strlen(mallocedval), "%ld,", ((unsigned long *) var->value)[element]);
+						
+					sprintf(mallocedval + strlen(mallocedval) - 1, "%s", (var->arrsize > 1) ? "}'" : ""); 
+
+					tobeinserted = mallocedval;
 					break;
 
 				case ECPGt_float:
-					sprintf(buff, "%.14g", *(float *) var->value);
-					tobeinserted = buff;
+					if (!(mallocedval = ecpg_alloc(var->arrsize * 20, stmt->lineno)))
+						return false;
+
+					sprintf(mallocedval, "%s", (var->arrsize > 1) ? "'{" : ""); 
+						
+					for (element = 0; element < var->arrsize; element++)
+						sprintf(mallocedval + strlen(mallocedval), "%.14g,", ((float *) var->value)[element]);
+						
+					sprintf(mallocedval + strlen(mallocedval) - 1, "%s", (var->arrsize > 1) ? "}'" : ""); 
+
+					tobeinserted = mallocedval;
 					break;
 
 				case ECPGt_double:
-					sprintf(buff, "%.14g", *(double *) var->value);
-					tobeinserted = buff;
+					if (!(mallocedval = ecpg_alloc(var->arrsize * 20, stmt->lineno)))
+						return false;
+
+					sprintf(mallocedval, "%s", (var->arrsize > 1) ? "'{" : ""); 
+						
+					for (element = 0; element < var->arrsize; element++)
+						sprintf(mallocedval + strlen(mallocedval), "%.14g,", ((double *) var->value)[element]);
+						
+					sprintf(mallocedval + strlen(mallocedval) - 1, "%s", (var->arrsize > 1) ? "}'" : ""); 
+
+					tobeinserted = mallocedval;
 					break;
 
 				case ECPGt_bool:
-					sprintf(buff, "'%c'", (*(char *) var->value ? 't' : 'f'));
-					tobeinserted = buff;
+					if (!(mallocedval = ecpg_alloc(var->arrsize * 20, stmt->lineno)))
+						return false;
+
+					sprintf(mallocedval, "%s", (var->arrsize > 1) ? "'{" : ""); 
+						
+					for (element = 0; element < var->arrsize; element++)
+						sprintf(mallocedval + strlen(mallocedval), "%c,", (((char *) var->value)[element]) ? 't' : 'f');
+						
+					sprintf(mallocedval + strlen(mallocedval) - 1, "%s", (var->arrsize > 1) ? "}'" : ""); 
+
+					tobeinserted = mallocedval;
 					break;
 
 				case ECPGt_char:
diff --git a/src/interfaces/ecpg/test/Makefile b/src/interfaces/ecpg/test/Makefile
index c6b5621acfb..03afc89b6d3 100644
--- a/src/interfaces/ecpg/test/Makefile
+++ b/src/interfaces/ecpg/test/Makefile
@@ -1,8 +1,8 @@
 all: stp.so test1 test2 test3 test4 test5 perftest
 
 #LDFLAGS=-g -I /usr/local/pgsql/include -L/usr/local/pgsql/lib -lecpg -lpq -lcrypt
-LDFLAGS=-g -I../include -I/usr/include/postgresql  -L/usr/lib/postgresql -L../lib -lecpg -lpq -lcrypt
-#LDFLAGS=-g -I/usr/include/postgresql -lecpg -lpq -lcrypt
+#LDFLAGS=-g -I../include -I/usr/include/postgresql  -L/usr/lib/postgresql -L../lib -lecpg -lpq -lcrypt
+LDFLAGS=-g -I/usr/include/postgresql -lecpg -lpq -lcrypt
 
 #ECPG=/usr/local/pgsql/bin/ecpg
 ECPG=../preproc/ecpg -I../include
diff --git a/src/interfaces/ecpg/test/test1.pgc b/src/interfaces/ecpg/test/test1.pgc
index 02a631a12f5..5bbabc6a44f 100644
--- a/src/interfaces/ecpg/test/test1.pgc
+++ b/src/interfaces/ecpg/test/test1.pgc
@@ -18,7 +18,7 @@ void warn(void)
 exec sql include sqlca;
 
 /* comment */
-exec sql define AMOUNT 4;
+exec sql define AMOUNT 6;
 
 exec sql type intarray is int[AMOUNT];
 exec sql type string is char(8); 
@@ -97,12 +97,18 @@ exec sql end declare section;
 	printf("Database: mm\n");
         for (i=0, j=sqlca.sqlerrd[2]; i<j; i++)
 	{
-            printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, name[i], i, amount[i],i, letter[i][0]);
+	    exec sql begin declare section;
+	    char n[8], l = letter[i][0];
+	    int a = amount[i];
+	    exec sql end declare section;
+
+	    strncpy(n, name[i], 8);
+            printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
 	    amount[i]+=1000;
-	}
 
-	strcpy(msg, "insert");
-	exec sql at pm insert into "Test" (name, amount, letter) values (:name, :amount, :letter);
+	    strcpy(msg, "insert");
+	    exec sql at pm insert into "Test" (name, amount, letter) values (:n, :a, :l);	     
+	}
 
         strcpy(msg, "select");
         exec sql at pm select * into :name, :amount, :letter from "Test";
diff --git a/src/interfaces/ecpg/test/test4.pgc b/src/interfaces/ecpg/test/test4.pgc
index 57a2143cc5b..d4822218706 100644
--- a/src/interfaces/ecpg/test/test4.pgc
+++ b/src/interfaces/ecpg/test/test4.pgc
@@ -30,7 +30,7 @@ EXEC SQL END DECLARE SECTION;
 
 	EXEC SQL INSERT INTO test(f,i,a) VALUES(404.90,1,'{0,1,2,3,4,5,6,7,8,9}');
 
-/*	EXEC SQL INSERT INTO test(f,i,a) VALUES(140787.0,2,:a);*/
+	EXEC SQL INSERT INTO test(f,i,a) VALUES(140787.0,2,:a);
 
 	EXEC SQL COMMIT;
 
-- 
GitLab