aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>1999-03-15 03:24:32 +0000
committerTom Lane <tgl@sss.pgh.pa.us>1999-03-15 03:24:32 +0000
commit4a9c2390638aefb00fdabcf37b0b4058a39c6a7d (patch)
treed06aa44712b668fbdf69ba3f7c379c889353393b /src
parent265c283e1b81c46deffe770faf48959510632292 (diff)
downloadpostgresql-4a9c2390638aefb00fdabcf37b0b4058a39c6a7d.tar.gz
postgresql-4a9c2390638aefb00fdabcf37b0b4058a39c6a7d.zip
Fix brain death in !!= operator ... it's still pretty bogus
but at least now it does what it's supposed to do ...
Diffstat (limited to 'src')
-rw-r--r--src/backend/utils/adt/not_in.c53
-rw-r--r--src/include/utils/builtins.h4
2 files changed, 32 insertions, 25 deletions
diff --git a/src/backend/utils/adt/not_in.c b/src/backend/utils/adt/not_in.c
index fb383046d58..62a76c83692 100644
--- a/src/backend/utils/adt/not_in.c
+++ b/src/backend/utils/adt/not_in.c
@@ -7,7 +7,7 @@
*
*
* 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
-int4notin(int16 not_in_arg, char *relation_and_attr)
+int4notin(int32 not_in_arg, char *relation_and_attr)
{
Relation relation_to_scan;
- int left_side_argument,
- integer_value;
+ int32 integer_value;
HeapTuple current_tuple;
HeapScanDesc scan_descriptor;
bool dummy,
@@ -48,47 +47,55 @@ int4notin(int16 not_in_arg, char *relation_and_attr)
int attrid;
char *relation,
*attribute;
- char my_copy[32];
+ char my_copy[NAMEDATALEN*2+2];
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, ".");
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 */
-
- left_side_argument = not_in_arg;
+ relation_to_scan = heap_openr(relation);
+ if (!RelationIsValid(relation_to_scan))
+ {
+ 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);
+ 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,
- 0, &skeyData);
+ 0, (ScanKey) NULL);
retval = true;
/* do a scan of the relation, and do the check */
- while (HeapTupleIsValid(current_tuple = heap_getnext(scan_descriptor, 0)) &&
- retval)
+ while (HeapTupleIsValid(current_tuple = heap_getnext(scan_descriptor, 0)))
{
value = heap_getattr(current_tuple,
(AttrNumber) attrid,
RelationGetDescr(relation_to_scan),
&dummy);
-
- integer_value = DatumGetInt16(value);
- if (left_side_argument == integer_value)
+ integer_value = DatumGetInt32(value);
+ if (not_in_arg == integer_value)
+ {
retval = false;
+ break; /* can stop scanning now */
+ }
}
/* close the relation */
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 9522169dcdc..47dbef4c67b 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -6,7 +6,7 @@
*
* 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
* 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)
/* 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);
/* oid.c */