mirror of
https://github.com/postgres/postgres.git
synced 2025-07-11 10:01:57 +03:00
Fix brain death in !!= operator ... it's still pretty bogus
but at least now it does what it's supposed to do ...
This commit is contained in:
@ -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);
|
|||||||
* ----------------------------------------------------------------
|
* ----------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
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)
|
|||||||
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)
|
||||||
|
{
|
||||||
/* fetch tuple OID */
|
elog(ERROR, "int4notin: must provide relationname.attributename");
|
||||||
|
}
|
||||||
left_side_argument = not_in_arg;
|
|
||||||
|
|
||||||
/* Open the relation and get a relation descriptor */
|
/* Open the relation and get a relation descriptor */
|
||||||
|
|
||||||
namestrcpy(&relNameData, relation);
|
relation_to_scan = heap_openr(relation);
|
||||||
relation_to_scan = heap_openr(relNameData.data);
|
if (!RelationIsValid(relation_to_scan))
|
||||||
attrid = my_varattno(relation_to_scan, attribute);
|
{
|
||||||
|
elog(ERROR, "int4notin: unknown relation %s",
|
||||||
|
relation);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find the column to search */
|
||||||
|
|
||||||
|
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 @@
|
|||||||
*
|
*
|
||||||
* 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);
|
|||||||
#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 */
|
||||||
|
Reference in New Issue
Block a user