|
7 | 7 | *
|
8 | 8 | *
|
9 | 9 | * IDENTIFICATION
|
10 |
| - * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/not_in.c,v 1.14 1999/02/13 23:19:26 momjian Exp $ |
| 10 | + * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/not_in.c,v 1.15 1999/03/15 03:24:32 tgl Exp $ |
11 | 11 | *
|
12 | 12 | *-------------------------------------------------------------------------
|
13 | 13 | */
|
@@ -36,59 +36,66 @@ static int my_varattno(Relation rd, char *a);
|
36 | 36 | * ----------------------------------------------------------------
|
37 | 37 | */
|
38 | 38 | bool
|
39 |
| -int4notin(int16 not_in_arg, char *relation_and_attr) |
| 39 | +int4notin(int32 not_in_arg, char *relation_and_attr) |
40 | 40 | {
|
41 | 41 | Relation relation_to_scan;
|
42 |
| - int left_side_argument, |
43 |
| - integer_value; |
| 42 | + int32 integer_value; |
44 | 43 | HeapTuple current_tuple;
|
45 | 44 | HeapScanDesc scan_descriptor;
|
46 | 45 | bool dummy,
|
47 | 46 | retval;
|
48 | 47 | int attrid;
|
49 | 48 | char *relation,
|
50 | 49 | *attribute;
|
51 |
| - char my_copy[32]; |
| 50 | + char my_copy[NAMEDATALEN*2+2]; |
52 | 51 | Datum value;
|
53 |
| - NameData relNameData; |
54 |
| - ScanKeyData skeyData; |
55 | 52 |
|
56 |
| - strcpy(my_copy, relation_and_attr); |
| 53 | + strncpy(my_copy, relation_and_attr, sizeof(my_copy)); |
| 54 | + my_copy[sizeof(my_copy)-1] = '\0'; |
57 | 55 |
|
58 | 56 | relation = (char *) strtok(my_copy, ".");
|
59 | 57 | attribute = (char *) strtok(NULL, ".");
|
| 58 | + if (attribute == NULL) |
| 59 | + { |
| 60 | + elog(ERROR, "int4notin: must provide relationname.attributename"); |
| 61 | + } |
60 | 62 |
|
| 63 | + /* Open the relation and get a relation descriptor */ |
61 | 64 |
|
62 |
| - /* fetch tuple OID */ |
63 |
| - |
64 |
| - left_side_argument = not_in_arg; |
| 65 | + relation_to_scan = heap_openr(relation); |
| 66 | + if (!RelationIsValid(relation_to_scan)) |
| 67 | + { |
| 68 | + elog(ERROR, "int4notin: unknown relation %s", |
| 69 | + relation); |
| 70 | + } |
65 | 71 |
|
66 |
| - /* Open the relation and get a relation descriptor */ |
| 72 | + /* Find the column to search */ |
67 | 73 |
|
68 |
| - namestrcpy(&relNameData, relation); |
69 |
| - relation_to_scan = heap_openr(relNameData.data); |
70 | 74 | attrid = my_varattno(relation_to_scan, attribute);
|
| 75 | + if (attrid < 0) |
| 76 | + { |
| 77 | + elog(ERROR, "int4notin: unknown attribute %s for relation %s", |
| 78 | + attribute, relation); |
| 79 | + } |
71 | 80 |
|
72 |
| - /* the last argument should be a ScanKey, not an integer! - jolly */ |
73 |
| - /* it looks like the arguments are out of order, too */ |
74 |
| - /* but skeyData is never initialized! does this work?? - ay 2/95 */ |
75 | 81 | scan_descriptor = heap_beginscan(relation_to_scan, false, SnapshotNow,
|
76 |
| - 0, &skeyData); |
| 82 | + 0, (ScanKey) NULL); |
77 | 83 |
|
78 | 84 | retval = true;
|
79 | 85 |
|
80 | 86 | /* do a scan of the relation, and do the check */
|
81 |
| - while (HeapTupleIsValid(current_tuple = heap_getnext(scan_descriptor, 0)) && |
82 |
| - retval) |
| 87 | + while (HeapTupleIsValid(current_tuple = heap_getnext(scan_descriptor, 0))) |
83 | 88 | {
|
84 | 89 | value = heap_getattr(current_tuple,
|
85 | 90 | (AttrNumber) attrid,
|
86 | 91 | RelationGetDescr(relation_to_scan),
|
87 | 92 | &dummy);
|
88 |
| - |
89 |
| - integer_value = DatumGetInt16(value); |
90 |
| - if (left_side_argument == integer_value) |
| 93 | + integer_value = DatumGetInt32(value); |
| 94 | + if (not_in_arg == integer_value) |
| 95 | + { |
91 | 96 | retval = false;
|
| 97 | + break; /* can stop scanning now */ |
| 98 | + } |
92 | 99 | }
|
93 | 100 |
|
94 | 101 | /* close the relation */
|
|
0 commit comments