127 lines
3.0 KiB
C
Raw Normal View History

/*-------------------------------------------------------------------------
*
* not_in.c
* Executes the "not_in" operator for any data type
*
* Copyright (c) 1994, Regents of the University of California
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/not_in.c,v 1.20 1999/07/17 20:17:58 momjian Exp $
*
*-------------------------------------------------------------------------
*/
/*
*
* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
* X HACK WARNING!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! X
* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
*
* This code is the OLD not-in code that is HACKED
* into place until operators that can have arguments as
* columns are ******REALLY****** implemented!!!!!!!!!!!
*
*/
#include "postgres.h"
#include "access/heapam.h"
1999-07-16 03:14:30 +00:00
#include "utils/builtins.h"
static int my_varattno(Relation rd, char *a);
/* ----------------------------------------------------------------
*
* ----------------------------------------------------------------
*/
bool
int4notin(int32 not_in_arg, char *relation_and_attr)
{
Relation relation_to_scan;
int32 integer_value;
HeapTuple current_tuple;
HeapScanDesc scan_descriptor;
bool dummy,
retval;
int attrid;
char *relation,
*attribute;
1999-05-25 16:15:34 +00:00
char my_copy[NAMEDATALEN * 2 + 2];
Datum value;
strncpy(my_copy, relation_and_attr, sizeof(my_copy));
1999-05-25 16:15:34 +00:00
my_copy[sizeof(my_copy) - 1] = '\0';
relation = (char *) strtok(my_copy, ".");
attribute = (char *) strtok(NULL, ".");
if (attribute == NULL)
elog(ERROR, "int4notin: must provide relationname.attributename");
/* Open the relation and get a relation descriptor */
relation_to_scan = heap_openr(relation);
if (!RelationIsValid(relation_to_scan))
{
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);
}
scan_descriptor = heap_beginscan(relation_to_scan, false, SnapshotNow,
0, (ScanKey) NULL);
retval = true;
/* do a scan of the relation, and do the check */
while (HeapTupleIsValid(current_tuple = heap_getnext(scan_descriptor, 0)))
{
value = heap_getattr(current_tuple,
(AttrNumber) attrid,
1998-09-01 03:29:17 +00:00
RelationGetDescr(relation_to_scan),
&dummy);
integer_value = DatumGetInt32(value);
if (not_in_arg == integer_value)
{
retval = false;
break; /* can stop scanning now */
}
}
/* close the relation */
heap_close(relation_to_scan);
1998-09-01 03:29:17 +00:00
return retval;
}
bool
oidnotin(Oid the_oid, char *compare)
{
if (the_oid == InvalidOid)
return false;
1998-09-01 03:29:17 +00:00
return int4notin(the_oid, compare);
}
/*
* XXX
* If varattno (in parser/catalog_utils.h) ever is added to
* cinterface.a, this routine should go away
*/
static int
my_varattno(Relation rd, char *a)
{
int i;
for (i = 0; i < rd->rd_rel->relnatts; i++)
{
if (!namestrcmp(&rd->rd_att->attrs[i]->attname, a))
1998-09-01 03:29:17 +00:00
return i + 1;
}
1998-09-01 03:29:17 +00:00
return -1;
}