Commit 4a9c2390 authored by Tom Lane's avatar Tom Lane

Fix brain death in !!= operator ... it's still pretty bogus

but at least now it does what it's supposed to do ...
parent 265c283e
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/not_in.c,v 1.14 1999/02/13 23:19:26 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/not_in.c,v 1.15 1999/03/15 03:24:32 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -36,11 +36,10 @@ static int my_varattno(Relation rd, char *a); ...@@ -36,11 +36,10 @@ static int my_varattno(Relation rd, char *a);
* ---------------------------------------------------------------- * ----------------------------------------------------------------
*/ */
bool bool
int4notin(int16 not_in_arg, char *relation_and_attr) int4notin(int32 not_in_arg, char *relation_and_attr)
{ {
Relation relation_to_scan; Relation relation_to_scan;
int left_side_argument, int32 integer_value;
integer_value;
HeapTuple current_tuple; HeapTuple current_tuple;
HeapScanDesc scan_descriptor; HeapScanDesc scan_descriptor;
bool dummy, bool dummy,
...@@ -48,47 +47,55 @@ int4notin(int16 not_in_arg, char *relation_and_attr) ...@@ -48,47 +47,55 @@ int4notin(int16 not_in_arg, char *relation_and_attr)
int attrid; int attrid;
char *relation, char *relation,
*attribute; *attribute;
char my_copy[32]; char my_copy[NAMEDATALEN*2+2];
Datum value; Datum value;
NameData relNameData;
ScanKeyData skeyData;
strcpy(my_copy, relation_and_attr); strncpy(my_copy, relation_and_attr, sizeof(my_copy));
my_copy[sizeof(my_copy)-1] = '\0';
relation = (char *) strtok(my_copy, "."); relation = (char *) strtok(my_copy, ".");
attribute = (char *) strtok(NULL, "."); attribute = (char *) strtok(NULL, ".");
if (attribute == NULL)
{
elog(ERROR, "int4notin: must provide relationname.attributename");
}
/* Open the relation and get a relation descriptor */
/* fetch tuple OID */ relation_to_scan = heap_openr(relation);
if (!RelationIsValid(relation_to_scan))
left_side_argument = not_in_arg; {
elog(ERROR, "int4notin: unknown relation %s",
relation);
}
/* Open the relation and get a relation descriptor */ /* Find the column to search */
namestrcpy(&relNameData, relation);
relation_to_scan = heap_openr(relNameData.data);
attrid = my_varattno(relation_to_scan, attribute); attrid = my_varattno(relation_to_scan, attribute);
if (attrid < 0)
{
elog(ERROR, "int4notin: unknown attribute %s for relation %s",
attribute, relation);
}
/* the last argument should be a ScanKey, not an integer! - jolly */
/* it looks like the arguments are out of order, too */
/* but skeyData is never initialized! does this work?? - ay 2/95 */
scan_descriptor = heap_beginscan(relation_to_scan, false, SnapshotNow, scan_descriptor = heap_beginscan(relation_to_scan, false, SnapshotNow,
0, &skeyData); 0, (ScanKey) NULL);
retval = true; retval = true;
/* do a scan of the relation, and do the check */ /* do a scan of the relation, and do the check */
while (HeapTupleIsValid(current_tuple = heap_getnext(scan_descriptor, 0)) && while (HeapTupleIsValid(current_tuple = heap_getnext(scan_descriptor, 0)))
retval)
{ {
value = heap_getattr(current_tuple, value = heap_getattr(current_tuple,
(AttrNumber) attrid, (AttrNumber) attrid,
RelationGetDescr(relation_to_scan), RelationGetDescr(relation_to_scan),
&dummy); &dummy);
integer_value = DatumGetInt32(value);
integer_value = DatumGetInt16(value); if (not_in_arg == integer_value)
if (left_side_argument == integer_value) {
retval = false; retval = false;
break; /* can stop scanning now */
}
} }
/* close the relation */ /* close the relation */
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: builtins.h,v 1.76 1999/03/14 16:44:01 momjian Exp $ * $Id: builtins.h,v 1.77 1999/03/15 03:24:31 tgl Exp $
* *
* NOTES * NOTES
* This should normally only be included by fmgr.h. * This should normally only be included by fmgr.h.
...@@ -331,7 +331,7 @@ extern int32 userfntest(int i); ...@@ -331,7 +331,7 @@ extern int32 userfntest(int i);
#define NonNullValue(v,b) nonnullvalue(v,b) #define NonNullValue(v,b) nonnullvalue(v,b)
/* not_in.c */ /* not_in.c */
extern bool int4notin(int16 not_in_arg, char *relation_and_attr); extern bool int4notin(int32 not_in_arg, char *relation_and_attr);
extern bool oidnotin(Oid the_oid, char *compare); extern bool oidnotin(Oid the_oid, char *compare);
/* oid.c */ /* oid.c */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment