Обсуждение: oid8types() borken?

Поиск
Список
Период
Сортировка

oid8types() borken?

От
Christopher Oliver
Дата:
The query generated by \df causes the backend to fail in oid8types.

The simplest illustration I found was:

    SELECT oid8types(proargtypes) FROM pg_proc;

It appears that oid8types() originally expected an array of pointers
to oid8, but now it gets the base of an array of oid8.  The following
seems to fix things for me in today's snapshot.  Any comments?

--- include/utils/builtins.h    1998/09/18 03:25:18    1.1
+++ include/utils/builtins.h    1998/09/18 03:25:47
@@ -358,7 +358,7 @@
 /* regproc.c */
 extern int32 regprocin(char *pro_name_and_oid);
 extern char *regprocout(RegProcedure proid);
-extern text *oid8types(Oid **oidArray);
+extern text *oid8types(Oid *oidArray);
 extern Oid    regproctooid(RegProcedure rp);

 /* define macro to replace mixed-case function call - tgl 97/04/27 */
--- backend/utils/adt/regproc.c    1998/09/18 02:25:19    1.1
+++ backend/utils/adt/regproc.c    1998/09/18 03:23:19
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *      $Header: /home/staff/oliver/lab/pgsql/src/backend/utils/adt/regproc.c,v 1.1 1998/09/18 02:25:19 oliver Exp
oliver$ 
+ *      $Header: /usr/local/cvsroot/pgsql/src/backend/utils/adt/regproc.c,v 1.26 1998/09/01 04:32:47 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -211,7 +211,7 @@
  *        int8typeout            - converts int8 type oids to "typname" list
  */
 text *
-oid8types(Oid **oidArray)
+oid8types(Oid *oidArray)
 {
     HeapTuple    typetup;
     text       *result;
@@ -228,7 +228,7 @@
     result = (text *) palloc(NAMEDATALEN * 8 + 8 + VARHDRSZ);
     *VARDATA(result) = '\0';

-    sp = *oidArray;
+    sp = oidArray;
     for (num = 8; num != 0; num--, sp++)
     {
         if (*sp != InvalidOid)

--
Christopher Oliver                     Traverse Internet
Systems Coordinator                    223 Grandview Pkwy, Suite 108
oliver@traverse.net                    Traverse City, Michigan, 49684
  "What good is a can of worms if you never open it?"  -Bob Arning

Re: [HACKERS] oid8types() borken?

От
Bruce Momjian
Дата:
Fixed.  The actual fix is to change:

    oid8types(Oid **oidArray)

to:

    oid8types(Oid (*oidArray)[])

Can someone explain what this is?  This is the old 6.3 code, and forgot
to reverse back this part when I realized my change to **oidArray did
not work.


> The query generated by \df causes the backend to fail in oid8types.
>
> The simplest illustration I found was:
>
>     SELECT oid8types(proargtypes) FROM pg_proc;
>
> It appears that oid8types() originally expected an array of pointers
> to oid8, but now it gets the base of an array of oid8.  The following
> seems to fix things for me in today's snapshot.  Any comments?
>
> --- include/utils/builtins.h    1998/09/18 03:25:18    1.1
> +++ include/utils/builtins.h    1998/09/18 03:25:47
> @@ -358,7 +358,7 @@
>  /* regproc.c */
>  extern int32 regprocin(char *pro_name_and_oid);
>  extern char *regprocout(RegProcedure proid);
> -extern text *oid8types(Oid **oidArray);
> +extern text *oid8types(Oid *oidArray);
>  extern Oid    regproctooid(RegProcedure rp);
>
>  /* define macro to replace mixed-case function call - tgl 97/04/27 */
> --- backend/utils/adt/regproc.c    1998/09/18 02:25:19    1.1
> +++ backend/utils/adt/regproc.c    1998/09/18 03:23:19
> @@ -7,7 +7,7 @@
>   *
>   *
>   * IDENTIFICATION
> - *      $Header: /home/staff/oliver/lab/pgsql/src/backend/utils/adt/regproc.c,v 1.1 1998/09/18 02:25:19 oliver Exp
oliver$ 
> + *      $Header: /usr/local/cvsroot/pgsql/src/backend/utils/adt/regproc.c,v 1.26 1998/09/01 04:32:47 momjian Exp $
>   *
>   *-------------------------------------------------------------------------
>   */
> @@ -211,7 +211,7 @@
>   *        int8typeout            - converts int8 type oids to "typname" list
>   */
>  text *
> -oid8types(Oid **oidArray)
> +oid8types(Oid *oidArray)
>  {
>      HeapTuple    typetup;
>      text       *result;
> @@ -228,7 +228,7 @@
>      result = (text *) palloc(NAMEDATALEN * 8 + 8 + VARHDRSZ);
>      *VARDATA(result) = '\0';
>
> -    sp = *oidArray;
> +    sp = oidArray;
>      for (num = 8; num != 0; num--, sp++)
>      {
>          if (*sp != InvalidOid)
>
> --
> Christopher Oliver                     Traverse Internet
> Systems Coordinator                    223 Grandview Pkwy, Suite 108
> oliver@traverse.net                    Traverse City, Michigan, 49684
>   "What good is a can of worms if you never open it?"  -Bob Arning
>
>


--
Bruce Momjian                          |  830 Blythe Avenue
maillist@candle.pha.pa.us              |  Drexel Hill, Pennsylvania 19026
http://www.op.net/~candle              |  (610) 353-9879(w)
  +  If your life is a hard drive,     |  (610) 853-3000(h)
  +  Christ can be your backup.        |

Re: [HACKERS] oid8types() borken?

От
t-ishii@sra.co.jp (Tatsuo Ishii)
Дата:
At 0:47 AM 98.9.18 -0400, Bruce Momjian wrote:
>Fixed.  The actual fix is to change:
>
>    oid8types(Oid **oidArray)
>
>to:
>
>    oid8types(Oid (*oidArray)[])
>
>Can someone explain what this is?  This is the old 6.3 code, and forgot
>to reverse back this part when I realized my change to **oidArray did
>not work.

Oid **oidArray and (Oid (*oidArray)[] are quite different.
The latter is a pointer to Oid array. Sample code for a caller might
be:

Oid oids[8];
    :
    :
oid8types(&oids);

&oids is actually same as oids or &oids[0]. Interesting but just
waste of time IMHO.
You will see oidArray and *oidArray shows same value in oid8types().

Seems just

     oid8types(Oid *oidArray)
or
     oid8types(Oid oidArray[])

are simpler and more effective.

--
Tatsuo Ishii
t-ishii@sra.co.jp


Re: [HACKERS] oid8types() borken?

От
Bruce Momjian
Дата:
> At 0:47 AM 98.9.18 -0400, Bruce Momjian wrote:
> >Fixed.  The actual fix is to change:
> >
> >    oid8types(Oid **oidArray)
> >
> >to:
> >
> >    oid8types(Oid (*oidArray)[])
> >
> >Can someone explain what this is?  This is the old 6.3 code, and forgot
> >to reverse back this part when I realized my change to **oidArray did
> >not work.
>
> Oid **oidArray and (Oid (*oidArray)[] are quite different.
> The latter is a pointer to Oid array. Sample code for a caller might
> be:
>
> Oid oids[8];
>     :
>     :
> oid8types(&oids);
>
> &oids is actually same as oids or &oids[0]. Interesting but just
> waste of time IMHO.

Yes, I have seen people do this, and it is a waste.

> You will see oidArray and *oidArray shows same value in oid8types().
>
> Seems just
>
>      oid8types(Oid *oidArray)
> or
>      oid8types(Oid oidArray[])
>
> are simpler and more effective.

Ah, I see now, just a confusion of adding meaningless [].  I am applying
the cleanup now.  Thanks.

--
Bruce Momjian                          |  830 Blythe Avenue
maillist@candle.pha.pa.us              |  Drexel Hill, Pennsylvania 19026
http://www.op.net/~candle              |  (610) 353-9879(w)
  +  If your life is a hard drive,     |  (610) 853-3000(h)
  +  Christ can be your backup.        |