From 20288400f3ad4a29fe6fa4623c35314c0f8eee05 Mon Sep 17 00:00:00 2001 From: "Marc G. Fournier" 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 --- 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 504e557abe..3f44037ca7 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 a4fc775c45..ad84da0b91 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 37c955017e..974238aed4 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 e0dae90758..752db2f1f6 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); -- 2.40.0