Use oper_select_candidate() for unary operators
authorThomas G. Lockhart
Wed, 16 Sep 1998 14:22:22 +0000 (14:22 +0000)
committerThomas G. Lockhart
Wed, 16 Sep 1998 14:22:22 +0000 (14:22 +0000)
 rather than func_select_candidate().
Fix oper_select_candidate() to work with a single operator argument.
Repair left operator checking for null return from candidate list.

src/backend/parser/parse_oper.c

index 5cf6f34898abf4a72851c647d61db116904eb144..a58bc51def876ad0c5a038ad95f0241bb8641bb8 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/parser/parse_oper.c,v 1.17 1998/09/01 04:30:34 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/parser/parse_oper.c,v 1.18 1998/09/16 14:22:22 thomas Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include "catalog/pg_operator.h"
 #include "catalog/pg_type.h"
 #include "fmgr.h"
-#include "parser/parse_func.h"
 #include "parser/parse_oper.h"
 #include "parser/parse_type.h"
 #include "parser/parse_coerce.h"
 #include "storage/bufmgr.h"
 #include "utils/syscache.h"
 
-Oid *
-           oper_select_candidate(int nargs, Oid *input_typeids, CandidateList candidates);
+Oid * oper_select_candidate(int nargs, Oid *input_typeids, CandidateList candidates);
 static int binary_oper_get_candidates(char *opname,
                           Oid leftTypeId,
                           Oid rightTypeId,
@@ -38,8 +36,7 @@ static int unary_oper_get_candidates(char *op,
                          Oid typeId,
                          CandidateList *candidates,
                          char rightleft);
-static void
-           op_error(char *op, Oid arg1, Oid arg2);
+static void op_error(char *op, Oid arg1, Oid arg2);
 
 Oid
 any_ordering_op(int restype)
@@ -312,7 +309,7 @@ oper_select_candidate(int nargs,
    if (ncandidates <= 1)
    {
        if (!can_coerce_type(1, &input_typeids[0], &candidates->args[0])
-        || !can_coerce_type(1, &input_typeids[1], &candidates->args[1]))
+        || ((nargs > 1) && !can_coerce_type(1, &input_typeids[1], &candidates->args[1])))
        {
            ncandidates = 0;
 #ifdef PARSEDEBUG
@@ -718,7 +715,7 @@ right_oper(char *op, Oid arg)
        }
        else
        {
-           targetOid = func_select_candidate(1, &arg, candidates);
+           targetOid = oper_select_candidate(1, &arg, candidates);
 
            if (targetOid != NULL)
            {
@@ -729,12 +726,14 @@ right_oper(char *op, Oid arg)
                                          CharGetDatum('r'));
            }
            else
+           {
                tup = NULL;
+           }
 
            if (!HeapTupleIsValid(tup))
            {
-               elog(ERROR, "Unable to convert right operator '%s' from type %s to %s",
-                    op, typeidTypeName(arg), typeidTypeName(*targetOid));
+               elog(ERROR, "Unable to convert right operator '%s' from type %s",
+                    op, typeidTypeName(arg));
                return NULL;
            }
        }
@@ -782,17 +781,24 @@ left_oper(char *op, Oid arg)
        }
        else
        {
-           targetOid = func_select_candidate(1, &arg, candidates);
-           tup = SearchSysCacheTuple(OPRNAME,
-                                     PointerGetDatum(op),
-                                     ObjectIdGetDatum(InvalidOid),
-                                     ObjectIdGetDatum(*targetOid),
-                                     CharGetDatum('l'));
+           targetOid = oper_select_candidate(1, &arg, candidates);
+           if (targetOid != NULL)
+           {
+               tup = SearchSysCacheTuple(OPRNAME,
+                                         PointerGetDatum(op),
+                                         ObjectIdGetDatum(InvalidOid),
+                                         ObjectIdGetDatum(*targetOid),
+                                         CharGetDatum('l'));
+           }
+           else
+           {
+               tup = NULL;
+           }
 
            if (!HeapTupleIsValid(tup))
            {
-               elog(ERROR, "Unable to convert left operator '%s' from type %s to %s",
-                    op, typeidTypeName(arg), typeidTypeName(*targetOid));
+               elog(ERROR, "Unable to convert left operator '%s' from type %s",
+                    op, typeidTypeName(arg));
                return NULL;
            }
 #ifdef PARSEDEBUG