Fix brain death in !!= operator ... it's still pretty bogus
authorTom Lane
Mon, 15 Mar 1999 03:24:32 +0000 (03:24 +0000)
committerTom Lane
Mon, 15 Mar 1999 03:24:32 +0000 (03:24 +0000)
but at least now it does what it's supposed to do ...

src/backend/utils/adt/not_in.c
src/include/utils/builtins.h

index fb383046d580a0e5d75c43bd6d1b1167b11ce9fd..62a76c836928825c9f087ae723e3dfc80c43f58e 100644 (file)
@@ -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 */
index 9522169dcdcd53c57dbeba02e272f837232dd45b..47dbef4c67b8f7099aa88eff07f205b517e28060 100644 (file)
@@ -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 */