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>
This commit is contained in:
parent
83adddfcc3
commit
20288400f3
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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");
|
elog(WARN, "make_targetlist_expr: invalid use of NULL expression");
|
||||||
|
|
||||||
type_id = exprType(expr);
|
type_id = exprType(expr);
|
||||||
|
#ifdef NULL_PATCH
|
||||||
|
if (!type_id) {
|
||||||
|
type_len = 0;
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
type_len = tlen(get_id_type(type_id));
|
type_len = tlen(get_id_type(type_id));
|
||||||
|
|
||||||
/* I have no idea what the following does! */
|
/* I have no idea what the following does! */
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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;
|
CandidateList candidates;
|
||||||
int ncandidates;
|
int ncandidates;
|
||||||
|
|
||||||
|
#ifdef NULL_PATCH
|
||||||
|
if (!arg2) arg2=arg1;
|
||||||
|
if (!arg1) arg1=arg2;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!(tup = SearchSysCacheTuple(OPRNAME,
|
if (!(tup = SearchSysCacheTuple(OPRNAME,
|
||||||
PointerGetDatum(op),
|
PointerGetDatum(op),
|
||||||
ObjectIdGetDatum(arg1),
|
ObjectIdGetDatum(arg1),
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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 */
|
/* null const */
|
||||||
con = makeConst(0, 0, (Datum)NULL, TRUE, 0, FALSE);
|
con = makeConst(0, 0, (Datum)NULL, TRUE, 0, FALSE);
|
||||||
|
#ifdef NULL_PATCH
|
||||||
|
return con;
|
||||||
|
#else
|
||||||
return NULL /*con*/;
|
return NULL /*con*/;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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));
|
Assert(IsA(expr,Const));
|
||||||
|
|
||||||
switch (exprType) {
|
switch (exprType) {
|
||||||
|
#ifdef NULL_PATCH
|
||||||
|
case 0: /* NULL */
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
case 23: /* int4 */
|
case 23: /* int4 */
|
||||||
const_string = (char *) palloc(256);
|
const_string = (char *) palloc(256);
|
||||||
string_palloced = true;
|
string_palloced = true;
|
||||||
@ -352,6 +356,18 @@ parser_typecast2(Node *expr, int exprType, Type tp, int typlen)
|
|||||||
elog(WARN,"unknown type%d ",exprType);
|
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);
|
cp = instr2 (tp, const_string, typlen);
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user