From e48cfacb8414231db82dc930995492085a260fc7 Mon Sep 17 00:00:00 2001
From: Michael Meskes <meskes@postgresql.org>
Date: Mon, 28 Jun 2004 11:47:42 +0000
Subject: [PATCH] Arrays can be read as arrays or as character strings now.

---
 src/interfaces/ecpg/ChangeLog      |  4 ++++
 src/interfaces/ecpg/ecpglib/data.c | 21 +++++++++++++++++----
 src/interfaces/ecpg/test/test4.pgc |  9 ++++++++-
 3 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog
index 0f2476d8c10..ab69eb0fed6 100644
--- a/src/interfaces/ecpg/ChangeLog
+++ b/src/interfaces/ecpg/ChangeLog
@@ -1821,6 +1821,10 @@ Sun Jun 27 13:50:58 CEST 2004
 	- Variables that are out of scope, were not removed all the time.
 	- Make a varchar NULL set everything to 0 when not using indicators.
 	- Synced parser.
+	
+Mon Jun 28 11:08:42 CEST 2004
+
+	- Arrays can be read as arrays or as character strings now.
 	- Set pgtypes library version to 1.2.
 	- Set ecpg version to 3.2.0.
 	- Set compat library version to 1.2.
diff --git a/src/interfaces/ecpg/ecpglib/data.c b/src/interfaces/ecpg/ecpglib/data.c
index 17d2f8ddf4e..eb1360efc60 100644
--- a/src/interfaces/ecpg/ecpglib/data.c
+++ b/src/interfaces/ecpg/ecpglib/data.c
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/data.c,v 1.24 2004/06/27 12:28:39 meskes Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/data.c,v 1.25 2004/06/28 11:47:41 meskes Exp $ */
 
 #define POSTGRES_ECPG_INTERNAL
 #include "postgres_fe.h"
@@ -152,6 +152,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
 						ECPGraise(lineno, ECPG_INT_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
 						return (false);
 					}
+					pval = scan_length;
 				}
 				else
 					res = 0L;
@@ -184,6 +185,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
 						ECPGraise(lineno, ECPG_UINT_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
 						return (false);
 					}
+					pval = scan_length;
 				}
 				else
 					ures = 0L;
@@ -216,6 +218,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
 						ECPGraise(lineno, ECPG_INT_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
 						return (false);
 					}
+					pval = scan_length;
 				}
 				else
 					*((long long int *) (var + offset * act_tuple)) = (long long) 0;
@@ -233,6 +236,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
 						ECPGraise(lineno, ECPG_UINT_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
 						return (false);
 					}
+					pval = scan_length;
 				}
 				else
 					*((unsigned long long int *) (var + offset * act_tuple)) = (long long) 0;
@@ -258,6 +262,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
 						ECPGraise(lineno, ECPG_FLOAT_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
 						return (false);
 					}
+					pval = scan_length;
 				}
 				else
 					dres = 0.0;
@@ -312,8 +317,9 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
 
 			case ECPGt_char:
 			case ECPGt_unsigned_char:
+				if (pval)
 				{
-					if (varcharsize == 0)
+					if (varcharsize == 0 || varcharsize > strlen(pval))
 						strncpy((char *) ((long) var + offset * act_tuple), pval, strlen(pval) + 1);
 					else
 					{
@@ -348,10 +354,12 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
 							sqlca->sqlwarn[0] = sqlca->sqlwarn[1] = 'W';
 						}
 					}
+					pval += strlen(pval);
 				}
 				break;
 
 			case ECPGt_varchar:
+				if (pval)
 				{
 					struct ECPGgeneric_varchar *variable =
 					(struct ECPGgeneric_varchar *) ((long) var + offset * act_tuple);
@@ -394,6 +402,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
 							variable->len = varcharsize;
 						}
 					}
+					pval += strlen(pval);
 				}
 				break;
 
@@ -433,6 +442,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
 							return (false);
 						}
 					}
+					pval = scan_length;
 				}
 				else
 					nres = PGTYPESnumeric_from_asc("0.0", &scan_length);
@@ -476,6 +486,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
 							return (false);
 						}
 					}
+					pval = scan_length;
 				}
 				else
 					ires = PGTYPESinterval_from_asc("0 seconds", NULL);
@@ -517,6 +528,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
 					}
 
 					*((date *) (var + offset * act_tuple)) = ddres;
+					pval = scan_length;
 				}
 				break;
 
@@ -555,6 +567,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
 					}
 
 					*((timestamp *) (var + offset * act_tuple)) = tres;
+					pval = scan_length;
 				}
 				break;
 
@@ -571,7 +584,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
 			++act_tuple;
 
 			/* set pval to the next entry */
-			for (; string || (*pval != ',' && *pval != '}'); ++pval)
+			for (; string || (*pval != ',' && *pval != '}' && *pval != '\0'); ++pval)
 				if (*pval == '"')
 					string = string ? false : true;
 
@@ -593,7 +606,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
 			if (*pval == ' ')
 				++pval;
 		}
-	} while ((isarray == ECPG_ARRAY_ARRAY && *pval != '}') || (isarray == ECPG_ARRAY_VECTOR && *pval != '\0'));
+	} while (*pval != '\0' && ((isarray == ECPG_ARRAY_ARRAY && *pval != '}') || isarray == ECPG_ARRAY_VECTOR));
 
 	return (true);
 }
diff --git a/src/interfaces/ecpg/test/test4.pgc b/src/interfaces/ecpg/test/test4.pgc
index 10a5fdca1cf..8d58af2817b 100644
--- a/src/interfaces/ecpg/test/test4.pgc
+++ b/src/interfaces/ecpg/test/test4.pgc
@@ -13,7 +13,7 @@ EXEC SQL BEGIN DECLARE SECTION;
 	int i = 1;
 	int *did = &i;
 	int a[10] = {9,8,7,6,5,4,3,2,1,0};
-	char text[10] = "klmnopqrst";
+	char text[25] = "klmnopqrst";
 	char *t = (char *)malloc(10);
 	double f;
 	bool b = true;
@@ -64,6 +64,13 @@ EXEC SQL END DECLARE SECTION;
 
 	printf("Found text=%10.10s\n", t);
 
+	EXEC SQL SELECT a
+	 INTO :text
+	 FROM test
+	 WHERE f = :f;
+
+	printf("Found text=%s\n", text);
+
 	EXEC SQL DROP TABLE test;
 
 	EXEC SQL COMMIT;
-- 
GitLab