]> granicus.if.org Git - postgresql/commitdiff
Enable fallback to string type when argument(s) are of UNKNOWN type.
authorThomas G. Lockhart <lockhart@fourpalms.org>
Tue, 7 Nov 2000 16:01:01 +0000 (16:01 +0000)
committerThomas G. Lockhart <lockhart@fourpalms.org>
Tue, 7 Nov 2000 16:01:01 +0000 (16:01 +0000)
 Same code exactly as for function resolution.
 An obvious example is for
  select '1' = '01';
 which used to throw an error and which now resolves to two text strings.

src/backend/parser/parse_oper.c

index 73be990c01083f0f070f174621ac422d38674396..7b30131251e1c4027bfbbfee4f676ea11e80e004 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/parser/parse_oper.c,v 1.41 2000/05/28 17:56:00 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/parser/parse_oper.c,v 1.42 2000/11/07 16:01:01 thomas Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -443,8 +443,21 @@ oper_select_candidate(int nargs,
                                }
                                else if (current_category != slot_category)
                                {
-                                       /* punt if more than one category for this slot */
-                                       return NULL;
+                                       /* started out as unknown type, so give preference to string type, if available */
+                                       if (current_category == STRING_TYPE)
+                                       {
+                                               /* forget all previous candidates */
+                                               candidates = current_candidate;
+                                               last_candidate = current_candidate;
+                                       }
+                                       else if (slot_category == STRING_TYPE)
+                                       {
+                                               /* forget this candidate */
+                                               if (last_candidate)
+                                                       last_candidate->next = current_candidate->next;
+                                               else
+                                                       candidates = current_candidate->next;
+                                       }
                                }
                                else if (current_type != slot_type)
                                {