From 20288400f3ad4a29fe6fa4623c35314c0f8eee05 Mon Sep 17 00:00:00 2001
From: "Marc G. Fournier" <scrappy@hub.org>
Date: Fri, 19 Jul 1996 07:24:11 +0000
Subject: [PATCH] Fixes:

I have written some patches which add support for NULLs to Postgres95.
In fact support for NULLs was already present in postgres, but it had been
disabled because not completely debugged, I believe. My patches simply add
some checks here and there. To enable the new code you must add -DNULL_PATCH
to CFLAGS in Makefile.global. After recompiling you can do things like:

insert into a (x, y) values (1, NULL);
update a set x = NULL where x = 0;

You can't still use a "where x=NULL" clause, you must use ISNULL instead.
This could probably be an easy fix to do.




Submitted by: Massimo Dal Zotto <dz@cs.unitn.it>
---
 src/backend/parser/analyze.c       |  7 ++++++-
 src/backend/parser/catalog_utils.c |  7 ++++++-
 src/backend/parser/parse_query.c   |  6 +++++-
 src/backend/parser/parser.c        | 18 +++++++++++++++++-
 4 files changed, 34 insertions(+), 4 deletions(-)

diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c
index 504e557abee..3f44037ca74 100644
--- a/src/backend/parser/analyze.c
+++ b/src/backend/parser/analyze.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.1.1.1 1996/07/09 06:21:39 scrappy Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.2 1996/07/19 07:24:06 scrappy Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1313,6 +1313,11 @@ make_targetlist_expr(ParseState *pstate,
 	 elog(WARN, "make_targetlist_expr: invalid use of NULL expression");
 
      type_id = exprType(expr);
+#ifdef NULL_PATCH
+     if (!type_id) {
+	 type_len = 0;
+     } else
+#endif
      type_len = tlen(get_id_type(type_id));
 
      /* I have no idea what the following does! */
diff --git a/src/backend/parser/catalog_utils.c b/src/backend/parser/catalog_utils.c
index a4fc775c452..ad84da0b916 100644
--- a/src/backend/parser/catalog_utils.c
+++ b/src/backend/parser/catalog_utils.c
@@ -6,7 +6,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/parser/Attic/catalog_utils.c,v 1.1.1.1 1996/07/09 06:21:40 scrappy Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/parser/Attic/catalog_utils.c,v 1.2 1996/07/19 07:24:08 scrappy Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -471,6 +471,11 @@ oper(char *op, int arg1, int arg2)
     CandidateList candidates;
     int ncandidates;
 
+#ifdef NULL_PATCH
+    if (!arg2) arg2=arg1;
+    if (!arg1) arg1=arg2;
+#endif
+
     if (!(tup = SearchSysCacheTuple(OPRNAME,
 				    PointerGetDatum(op),
 				    ObjectIdGetDatum(arg1),
diff --git a/src/backend/parser/parse_query.c b/src/backend/parser/parse_query.c
index 37c955017ef..974238aed47 100644
--- a/src/backend/parser/parse_query.c
+++ b/src/backend/parser/parse_query.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/parser/Attic/parse_query.c,v 1.1.1.1 1996/07/09 06:21:40 scrappy Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/parser/Attic/parse_query.c,v 1.2 1996/07/19 07:24:09 scrappy Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -617,7 +617,11 @@ make_const(Value *value)
 
 	    /* null const */
 	    con = makeConst(0, 0, (Datum)NULL, TRUE, 0, FALSE);
+#ifdef NULL_PATCH
+	    return con;
+#else
 	    return NULL /*con*/;
+#endif
 	}
     }
 
diff --git a/src/backend/parser/parser.c b/src/backend/parser/parser.c
index e0dae907588..752db2f1f67 100644
--- a/src/backend/parser/parser.c
+++ b/src/backend/parser/parser.c
@@ -6,7 +6,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/parser/parser.c,v 1.1.1.1 1996/07/09 06:21:40 scrappy Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/parser/parser.c,v 1.2 1996/07/19 07:24:11 scrappy Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -302,6 +302,10 @@ parser_typecast2(Node *expr, int exprType, Type tp, int typlen)
     Assert(IsA(expr,Const));
     
     switch (exprType) {
+#ifdef NULL_PATCH
+      case 0: /* NULL */
+	break;
+#endif
     case 23: /* int4 */
 	const_string = (char *) palloc(256);
 	string_palloced = true;
@@ -352,6 +356,18 @@ parser_typecast2(Node *expr, int exprType, Type tp, int typlen)
 	elog(WARN,"unknown type%d ",exprType);
     }
     
+#ifdef NULL_PATCH
+    if (!exprType) {
+	adt = makeConst((Oid)typeid(tp),
+			(Size) 0,
+			(Datum) NULL,
+			true, 	/* isnull */
+			0 	/* was omitted */,
+			0 	/* not a set */);
+	return ((Node*) adt);
+    }
+#endif
+
     cp = instr2 (tp, const_string, typlen);
     
     
-- 
GitLab