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>
This commit is contained in:
Marc G. Fournier 1996-07-19 07:24:11 +00:00
parent 83adddfcc3
commit 20288400f3
4 changed files with 34 additions and 4 deletions

View File

@ -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! */

View File

@ -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),

View File

@ -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
}
}

View File

@ -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);