Re: array support patch phase 1 patch

Поиск
Список
Период
Сортировка
От Joe Conway
Тема Re: array support patch phase 1 patch
Дата
Msg-id 3ED94577.5010801@joeconway.com
обсуждение исходный текст
Ответ на Re: array support patch phase 1 patch  (Tom Lane <tgl@sss.pgh.pa.us>)
Ответы Re: array support patch phase 1 patch  (Tom Lane <tgl@sss.pgh.pa.us>)
Re: array support patch phase 1 patch  (Joe Conway <mail@joeconway.com>)
Re: array support patch phase 1 patch  (Kris Jurka <books@ejurka.com>)
Список pgsql-patches
Tom Lane wrote:
> Another problem is:
>
> regression=# select distinct array(select * from text_tbl) from foo;
> ERROR:  Unable to identify an equality operator for type text[]
>
> This DISTINCT query would fail anyway of course, for lack of a '<'
> operator for arrays, but it seems like we ought to be able to find the
> polymorphic '=' operator.

The attached small patch addresses the above concern (finding
polymorphic "=" operator) by introducing a new function,
IsPolymorphicCoercible().

Now, as predicted, I get:

regression=# select distinct array(select f1 from tse);
ERROR:  Unable to identify an ordering operator for type integer[]
         Use an explicit ordering operator or modify the query

If there are no objections, please apply.

Next question this begs is, should I work on a '<' operator for arrays?
And if so, how is the behavior defined? Hannu suggested
element-by-element, analogous to character-by-character text string
comparison. Comments?

Thanks,

Joe
Index: src/backend/parser/parse_oper.c
===================================================================
RCS file: /opt/src/cvs/pgsql-server/src/backend/parser/parse_oper.c,v
retrieving revision 1.64
diff -c -r1.64 parse_oper.c
*** src/backend/parser/parse_oper.c    26 May 2003 00:11:27 -0000    1.64
--- src/backend/parser/parse_oper.c    1 Jun 2003 00:01:30 -0000
***************
*** 412,417 ****
--- 412,421 ----
          IsBinaryCoercible(arg2, opform->oprright))
          return optup;

+     /* last check -- polymorphic types? */
+     if (IsPolymorphicCoercible(arg1 , arg2))
+         return optup;
+
      /* nope... */
      ReleaseSysCache(optup);

Index: src/backend/parser/parse_coerce.c
===================================================================
RCS file: /opt/src/cvs/pgsql-server/src/backend/parser/parse_coerce.c,v
retrieving revision 2.97
diff -c -r2.97 parse_coerce.c
*** src/backend/parser/parse_coerce.c    26 May 2003 00:11:27 -0000    2.97
--- src/backend/parser/parse_coerce.c    31 May 2003 23:59:07 -0000
***************
*** 1187,1192 ****
--- 1187,1230 ----
      return result;
  }

+ /* IsPolymorphicCoercible()
+  *        Check if srctype and targettype are a polymorphic compatible pair.
+  *
+  * We consider two types polymorphic-coercible if:
+  * 1) both are the same (we should never have been called this way, but what
+  *    the heck)
+  * 2) one is ANYARRAY and the other is an array type
+  * 3) one is ANYELEMENT and the other is not an array type
+
+  */
+ bool
+ IsPolymorphicCoercible(Oid srctype, Oid targettype)
+ {
+     /* Case 1: fast path if same type */
+     if (srctype == targettype)
+         return true;
+
+     /* Case 2: check for matching arrays */
+     if (srctype == ANYARRAYOID)
+         if (get_element_type(targettype) != InvalidOid)
+             return true;
+
+     if (targettype == ANYARRAYOID)
+         if (get_element_type(srctype) != InvalidOid)
+             return true;
+
+     /* Case 3: check for matching elements */
+     if (srctype == ANYELEMENTOID)
+         if (get_element_type(targettype) == InvalidOid)
+             return true;
+
+     if (targettype == ANYELEMENTOID)
+         if (get_element_type(srctype) == InvalidOid)
+             return true;
+
+     /* if all else fails... */
+     return false;
+ }

  /*
   * find_coercion_pathway
Index: src/include/parser/parse_coerce.h
===================================================================
RCS file: /opt/src/cvs/pgsql-server/src/include/parser/parse_coerce.h,v
retrieving revision 1.51
diff -c -r1.51 parse_coerce.h
*** src/include/parser/parse_coerce.h    29 Apr 2003 22:13:11 -0000    1.51
--- src/include/parser/parse_coerce.h    31 May 2003 23:51:19 -0000
***************
*** 36,41 ****
--- 36,42 ----


  extern bool IsBinaryCoercible(Oid srctype, Oid targettype);
+ extern bool IsPolymorphicCoercible(Oid srctype, Oid targettype);
  extern bool IsPreferredType(CATEGORY category, Oid type);
  extern CATEGORY TypeCategory(Oid type);


В списке pgsql-patches по дате отправления:

Предыдущее
От: Joe Conway
Дата:
Сообщение: array support phase 3 patch (was Re: array support patch phase 1 patch)
Следующее
От: Sean Chittenden
Дата:
Сообщение: Re: [HACKERS] Are we losing momentum?