]> granicus.if.org Git - postgresql/commitdiff
Fix brain death in !!= operator ... it's still pretty bogus
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 15 Mar 1999 03:24:32 +0000 (03:24 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
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 */