diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog
index 632c4c9565353f7fff6248ad8a8b9abf64ea8ca4..f8c0162a93097bc59be088fe2c4992191b034898 100644
--- a/src/interfaces/ecpg/ChangeLog
+++ b/src/interfaces/ecpg/ChangeLog
@@ -1714,3 +1714,11 @@ Mon Nov  3 15:43:19 CET 2003
 	- Set pgtypes library to 1.0.0
 	- Set compat library to 1.0.0
 
+Wed Dec  3 09:45:21 CET 2003
+
+	- Added patch for array handling by Dave Cramer
+	- Set ecpg version to 3.1.0
+	- Set ecpg library to 4.1.0
+	- Set pgtypes library to 1.1.0
+	- Set compat library to 1.1.0
+
diff --git a/src/interfaces/ecpg/ecpglib/execute.c b/src/interfaces/ecpg/ecpglib/execute.c
index 8a9e94da9bbf56ddc80e812a80c86ad0342a43cc..0953ebb6e4ca2fbfe400af81860502e0c40427ec 100644
--- a/src/interfaces/ecpg/ecpglib/execute.c
+++ b/src/interfaces/ecpg/ecpglib/execute.c
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.29 2003/11/29 19:52:08 pgsql Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.30 2003/12/03 08:49:17 meskes Exp $ */
 
 /*
  * The aim is to get a simpler inteface to the database routines.
@@ -314,16 +314,21 @@ ECPGis_type_an_array(int type, const struct statement * stmt, const struct varia
 	sprintf(array_query, "select typlen from pg_type where oid=%d and typelem<>0", type);
 	query = PQexec(stmt->connection->connection, array_query);
 	ECPGfree(array_query);
-	if (PQresultStatus(query) == PGRES_TUPLES_OK)
+	if (PQresultStatus(query) == PGRES_TUPLES_OK )
 	{
-		isarray = (atol((char *) PQgetvalue(query, 0, 0)) == -1) ? ECPG_ARRAY_ARRAY : ECPG_ARRAY_VECTOR;
-		if (ECPGDynamicType(type) == SQL3_CHARACTER ||
-			ECPGDynamicType(type) == SQL3_CHARACTER_VARYING)
-		{
-			/*
-			 * arrays of character strings are not yet implemented
-			 */
+		if ( PQntuples(query) == 0 )
 			isarray = ECPG_ARRAY_NONE;
+		else
+		{
+			isarray = (atol((char *) PQgetvalue(query, 0, 0)) == -1) ? ECPG_ARRAY_ARRAY : ECPG_ARRAY_VECTOR;
+			if (ECPGDynamicType(type) == SQL3_CHARACTER ||
+				ECPGDynamicType(type) == SQL3_CHARACTER_VARYING)
+			{
+				/*
+				 * arrays of character strings are not yet implemented
+				 */
+				isarray = ECPG_ARRAY_NONE;
+			}
 		}
 	}
 	PQclear(query);
@@ -353,7 +358,7 @@ ECPGstore_result(const PGresult *results, int act_field,
 		{
 			ECPGlog("ECPGexecute line %d: Incorrect number of matches: %d don't fit into array of %d\n",
 					stmt->lineno, ntuples, var->arrsize);
-			ECPGraise(stmt->lineno, ECPG_TOO_MANY_MATCHES, ECPG_SQLSTATE_CARDINALITY_VIOLATION, NULL);
+			ECPGraise(stmt->lineno, INFORMIX_MODE(stmt->compat)?ECPG_INFORMIX_SUBSELECT_NOT_ONE:ECPG_TOO_MANY_MATCHES, ECPG_SQLSTATE_CARDINALITY_VIOLATION, NULL);
 			return false;
 		}
 	}