From 25c00833cb694bea1c4fb3caeccbc9a1fb72d6f8 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Sat, 19 Nov 2005 02:08:45 +0000
Subject: [PATCH] Add defenses against nulls-in-arrays to contrib/ltree. 
 Possibly it'd be useful to actually do something with nulls, rather than
 reject them, but I'll just close the hole for now.

---
 contrib/ltree/_ltree_gist.c |  8 ++++++++
 contrib/ltree/_ltree_op.c   | 17 +++++++++++++++++
 contrib/ltree/lquery_op.c   |  4 ++++
 contrib/ltree/ltree_gist.c  |  4 ++++
 4 files changed, 33 insertions(+)

diff --git a/contrib/ltree/_ltree_gist.c b/contrib/ltree/_ltree_gist.c
index 0344b6dc134..c4623ec020f 100644
--- a/contrib/ltree/_ltree_gist.c
+++ b/contrib/ltree/_ltree_gist.c
@@ -76,6 +76,10 @@ _ltree_compress(PG_FUNCTION_ARGS)
 			ereport(ERROR,
 					(errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
 					 errmsg("array must be one-dimensional")));
+		if (ARR_HASNULL(val))
+			ereport(ERROR,
+					(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+					 errmsg("array must not contain nulls")));
 
 		key = (ltree_gist *) palloc(len);
 		key->len = len;
@@ -518,6 +522,10 @@ _arrq_cons(ltree_gist * key, ArrayType *_query)
 		ereport(ERROR,
 				(errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
 				 errmsg("array must be one-dimensional")));
+	if (ARR_HASNULL(_query))
+		ereport(ERROR,
+				(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+				 errmsg("array must not contain nulls")));
 
 	while (num > 0)
 	{
diff --git a/contrib/ltree/_ltree_op.c b/contrib/ltree/_ltree_op.c
index 729d19c0829..ff8eec793a6 100644
--- a/contrib/ltree/_ltree_op.c
+++ b/contrib/ltree/_ltree_op.c
@@ -47,6 +47,10 @@ array_iterator(ArrayType *la, PGCALL2 callback, void *param, ltree ** found)
 		ereport(ERROR,
 				(errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
 				 errmsg("array must be one-dimensional")));
+	if (ARR_HASNULL(la))
+		ereport(ERROR,
+				(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+				 errmsg("array must not contain nulls")));
 
 	if (found)
 		*found = NULL;
@@ -143,6 +147,10 @@ _lt_q_regex(PG_FUNCTION_ARGS)
 		ereport(ERROR,
 				(errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
 				 errmsg("array must be one-dimensional")));
+	if (ARR_HASNULL(_query))
+		ereport(ERROR,
+				(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+				 errmsg("array must not contain nulls")));
 
 	while (num > 0)
 	{
@@ -293,6 +301,15 @@ _lca(PG_FUNCTION_ARGS)
 	ltree	  **a,
 			   *res;
 
+	if (ARR_NDIM(la) != 1)
+		ereport(ERROR,
+				(errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+				 errmsg("array must be one-dimensional")));
+	if (ARR_HASNULL(la))
+		ereport(ERROR,
+				(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+				 errmsg("array must not contain nulls")));
+
 	a = (ltree **) palloc(sizeof(ltree *) * num);
 	while (num > 0)
 	{
diff --git a/contrib/ltree/lquery_op.c b/contrib/ltree/lquery_op.c
index 54466a5b6be..6d5a937bebb 100644
--- a/contrib/ltree/lquery_op.c
+++ b/contrib/ltree/lquery_op.c
@@ -328,6 +328,10 @@ lt_q_regex(PG_FUNCTION_ARGS)
 		ereport(ERROR,
 				(errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
 				 errmsg("array must be one-dimensional")));
+	if (ARR_HASNULL(_query))
+		ereport(ERROR,
+				(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+				 errmsg("array must not contain nulls")));
 
 	while (num > 0)
 	{
diff --git a/contrib/ltree/ltree_gist.c b/contrib/ltree/ltree_gist.c
index 2be6449329c..9cdbcde886e 100644
--- a/contrib/ltree/ltree_gist.c
+++ b/contrib/ltree/ltree_gist.c
@@ -607,6 +607,10 @@ arrq_cons(ltree_gist * key, ArrayType *_query)
 		ereport(ERROR,
 				(errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
 				 errmsg("array must be one-dimensional")));
+	if (ARR_HASNULL(_query))
+		ereport(ERROR,
+				(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+				 errmsg("array must not contain nulls")));
 
 	while (num > 0)
 	{
-- 
GitLab