[Fwd: Re: [HACKERS] obj_description problems?] - Mailing list pgsql-patches

From Christopher Kings-Lynne
Subject [Fwd: Re: [HACKERS] obj_description problems?]
Date
Msg-id 3F94C7D7.3030102@familyhealth.com.au
Whole thread Raw
List pgsql-patches
Doh - this should have been sent to -patches in the first place...

Chris

-------- Original Message --------
Subject: Re: [HACKERS] obj_description problems?
Date: Tue, 21 Oct 2003 13:42:16 +0800
From: Christopher Kings-Lynne <chriskl@familyhealth.com.au>
To: Christopher Kings-Lynne <chriskl@familyhealth.com.au>
CC: Hackers <pgsql-hackers@postgresql.org>
References: <3F94C239.3070601@familyhealth.com.au>

Ooer - it is a nasty bug.  From pg_proc.h, the definition of
obj_description is:

select description from pg_description where objoid = $1 and classoid =
(select oid from pg_class where relname = $2 and relnamespace = PGNSP)
and objsubid = 0

And what's more, none of the SQL functions in pg_proc.h are properly
qualified.  I have attached a patch that may or may not be the solution
- please check.

I didn't know how to handle 'timestamp without time zone' types and
'overlaps'.

I realise now that there's no need to schema-qualify names - you can
only do names from pg_catalog.

Chris


Christopher Kings-Lynne wrote:

> How do I use a schema-qualified name in obj_description?  Or is this a
> nsty little bug?
>
> Chris
>
> test2=# create schema myschema;
> CREATE SCHEMA
> test2=# create table myschema.pg_class (a int4);
> CREATE TABLE
> test2=# select oid from pg_catalog.pg_class where
> oid='myschema.pg_class'::regclass;
>    oid
> ---------
>  1475161
> (1 row)
>
> test2=# select obj_description('1475161', 'pg_class');
>  obj_description
> -----------------
>
> (1 row)
>
> test2=# select obj_description('1475161', 'pg_catalog.pg_class');
>  obj_description
> -----------------
>
> (1 row)
>
> test2=# set search_path to myschema, pg_catalog;
> SET
> test2=# select obj_description('1475161', 'pg_class');
> ERROR:  Attribute "relname" not found
> test2=# select obj_description('1475161', 'pg_catalog.pg_class');
> ERROR:  Attribute "relname" not found
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 6: Have you searched our list archives?
>
>               http://archives.postgresql.org


Index: src/include/catalog/pg_proc.h
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/include/catalog/pg_proc.h,v
retrieving revision 1.313
diff -c -r1.313 pg_proc.h
*** src/include/catalog/pg_proc.h    17 Aug 2003 19:58:06 -0000    1.313
--- src/include/catalog/pg_proc.h    21 Oct 2003 05:36:56 -0000
***************
*** 1477,1483 ****
  DESCR("convert abstime to timestamp with time zone");
  DATA(insert OID = 1174 (  timestamptz       PGNSP PGUID 12 f f t f s 1 1184 "1082"  date_timestamptz - _null_ ));
  DESCR("convert date to timestamp with time zone");
! DATA(insert OID = 1176 (  timestamptz       PGNSP PGUID 14 f f t f s 2 1184 "1082 1083"    "select timestamptz($1 +
$2)"- _null_ )); 
  DESCR("convert date and time to timestamp with time zone");
  DATA(insert OID = 1177 (  interval           PGNSP PGUID 12 f f t f i 1 1186 "703"    reltime_interval - _null_ ));
  DESCR("convert reltime to interval");
--- 1477,1483 ----
  DESCR("convert abstime to timestamp with time zone");
  DATA(insert OID = 1174 (  timestamptz       PGNSP PGUID 12 f f t f s 1 1184 "1082"  date_timestamptz - _null_ ));
  DESCR("convert date to timestamp with time zone");
! DATA(insert OID = 1176 (  timestamptz       PGNSP PGUID 14 f f t f s 2 1184 "1082 1083"    "select
pg_catalog.timestamptz($1+ $2)" - _null_ )); 
  DESCR("convert date and time to timestamp with time zone");
  DATA(insert OID = 1177 (  interval           PGNSP PGUID 12 f f t f i 1 1186 "703"    reltime_interval - _null_ ));
  DESCR("convert reltime to interval");
***************
*** 1520,1528 ****
  DATA(insert OID = 1200 (  interval            PGNSP PGUID 12 f f t f i 2 1186 "1186 23"    interval_scale - _null_
));
  DESCR("adjust interval precision");

! DATA(insert OID = 1215 (  obj_description    PGNSP PGUID 14 f f t f s 2    25 "26 19"    "select description from
pg_descriptionwhere objoid = $1 and classoid = (select oid from pg_class where relname = $2 and relnamespace = PGNSP)
andobjsubid = 0" - _null_ )); 
  DESCR("get description for object id and catalog name");
! DATA(insert OID = 1216 (  col_description    PGNSP PGUID 14 f f t f s 2    25 "26 23"    "select description from
pg_descriptionwhere objoid = $1 and classoid = \'pg_catalog.pg_class\'::regclass and objsubid = $2" - _null_ )); 
  DESCR("get description for table column");

  DATA(insert OID = 1217 (  date_trunc       PGNSP PGUID 12 f f t f i 2 1184 "25 1184"    timestamptz_trunc - _null_
));
--- 1520,1528 ----
  DATA(insert OID = 1200 (  interval            PGNSP PGUID 12 f f t f i 2 1186 "1186 23"    interval_scale - _null_
));
  DESCR("adjust interval precision");

! DATA(insert OID = 1215 (  obj_description    PGNSP PGUID 14 f f t f s 2    25 "26 19"    "select description from
pg_catalog.pg_descriptionwhere objoid = $1 and classoid = (select oid from pg_catalog.pg_class where relname = $2 and
relnamespace= PGNSP) and objsubid = 0" - _null_ )); 
  DESCR("get description for object id and catalog name");
! DATA(insert OID = 1216 (  col_description    PGNSP PGUID 14 f f t f s 2    25 "26 23"    "select description from
pg_catalog.pg_descriptionwhere objoid = $1 and classoid = \'pg_catalog.pg_class\'::regclass and objsubid = $2" - _null_
));
  DESCR("get description for table column");

  DATA(insert OID = 1217 (  date_trunc       PGNSP PGUID 12 f f t f i 2 1184 "25 1184"    timestamptz_trunc - _null_
));
***************
*** 1683,1689 ****
   * This form of obj_description is now deprecated, since it will fail if
   * OIDs are not unique across system catalogs.    Use the other forms instead.
   */
! DATA(insert OID = 1348 (  obj_description     PGNSP PGUID 14 f f t f s 1 25 "26"  "select description from
pg_descriptionwhere objoid = $1 and objsubid = 0" - _null_ )); 
  DESCR("get description for object id (deprecated)");
  DATA(insert OID = 1349 (  oidvectortypes     PGNSP PGUID 12 f f t f s 1 25 "30"  oidvectortypes - _null_ ));
  DESCR("print type names of oidvector field");
--- 1683,1689 ----
   * This form of obj_description is now deprecated, since it will fail if
   * OIDs are not unique across system catalogs.    Use the other forms instead.
   */
! DATA(insert OID = 1348 (  obj_description     PGNSP PGUID 14 f f t f s 1 25 "26"  "select description from
pg_catalog.pg_descriptionwhere objoid = $1 and objsubid = 0" - _null_ )); 
  DESCR("get description for object id (deprecated)");
  DATA(insert OID = 1349 (  oidvectortypes     PGNSP PGUID 12 f f t f s 1 25 "30"  oidvectortypes - _null_ ));
  DESCR("print type names of oidvector field");
***************
*** 1740,1754 ****
  DATA(insert OID = 1381 (  char_length       PGNSP PGUID 12 f f t f i 1 23 "25"  textlen - _null_ ));
  DESCR("character length");

! DATA(insert OID = 1382 (  date_part    PGNSP PGUID 14 f f t f s 2  701 "25 702"  "select date_part($1,
timestamptz($2))"- _null_ )); 
  DESCR("extract field from abstime");
! DATA(insert OID = 1383 (  date_part    PGNSP PGUID 14 f f t f s 2  701 "25 703"  "select date_part($1, cast($2 as
interval))"- _null_ )); 
  DESCR("extract field from reltime");
! DATA(insert OID = 1384 (  date_part    PGNSP PGUID 14 f f t f i 2  701 "25 1082"    "select date_part($1, cast($2 as
timestampwithout time zone))" - _null_ )); 
  DESCR("extract field from date");
  DATA(insert OID = 1385 (  date_part    PGNSP PGUID 12 f f t f i 2  701 "25 1083"  time_part - _null_ ));
  DESCR("extract field from time");
! DATA(insert OID = 1386 (  age           PGNSP PGUID 14 f f t f s 1 1186 "1184"  "select age(cast(current_date as
timestampwith time zone), $1)" - _null_ )); 
  DESCR("date difference from today preserving months and years");

  DATA(insert OID = 1388 (  timetz       PGNSP PGUID 12 f f t f s 1 1266 "1184"  timestamptz_timetz - _null_ ));
--- 1740,1754 ----
  DATA(insert OID = 1381 (  char_length       PGNSP PGUID 12 f f t f i 1 23 "25"  textlen - _null_ ));
  DESCR("character length");

! DATA(insert OID = 1382 (  date_part    PGNSP PGUID 14 f f t f s 2  701 "25 702"  "select pg_catalog.date_part($1,
pg_catalog.timestamptz($2))"- _null_ )); 
  DESCR("extract field from abstime");
! DATA(insert OID = 1383 (  date_part    PGNSP PGUID 14 f f t f s 2  701 "25 703"  "select pg_catalog.date_part($1,
cast($2as pg_catalog.interval))" - _null_ )); 
  DESCR("extract field from reltime");
! DATA(insert OID = 1384 (  date_part    PGNSP PGUID 14 f f t f i 2  701 "25 1082"    "select pg_catalog.date_part($1,
cast($2as timestamp without time zone))" - _null_ )); 
  DESCR("extract field from date");
  DATA(insert OID = 1385 (  date_part    PGNSP PGUID 12 f f t f i 2  701 "25 1083"  time_part - _null_ ));
  DESCR("extract field from time");
! DATA(insert OID = 1386 (  age           PGNSP PGUID 14 f f t f s 1 1186 "1184"  "select
pg_catalog.age(cast(current_dateas timestamp with time zone), $1)" - _null_ )); 
  DESCR("date difference from today preserving months and years");

  DATA(insert OID = 1388 (  timetz       PGNSP PGUID 12 f f t f s 1 1266 "1184"  timestamptz_timetz - _null_ ));
***************
*** 1789,1797 ****
  DATA(insert OID = 1403 (  current_schemas    PGNSP PGUID 12 f f t f s 1    1003 "16"    current_schemas - _null_ ));
  DESCR("current schema search list");

! DATA(insert OID = 1404 (  overlay            PGNSP PGUID 14 f f t f i 4 25 "25 25 23 23"  "select substring($1, 1,
($3- 1)) || $2 || substring($1, ($3 + $4))" - _null_ )); 
  DESCR("substitute portion of string");
! DATA(insert OID = 1405 (  overlay            PGNSP PGUID 14 f f t f i 3 25 "25 25 23"  "select substring($1, 1, ($3 -
1))|| $2 || substring($1, ($3 + char_length($2)))" - _null_ )); 
  DESCR("substitute portion of string");

  DATA(insert OID = 1406 (  isvertical        PGNSP PGUID 12 f f t f i 2    16 "600 600"  point_vert - _null_ ));
--- 1789,1797 ----
  DATA(insert OID = 1403 (  current_schemas    PGNSP PGUID 12 f f t f s 1    1003 "16"    current_schemas - _null_ ));
  DESCR("current schema search list");

! DATA(insert OID = 1404 (  overlay            PGNSP PGUID 14 f f t f i 4 25 "25 25 23 23"  "select
pg_catalog.substring($1,1, ($3 - 1)) || $2 || pg_catalog.substring($1, ($3 + $4))" - _null_ )); 
  DESCR("substitute portion of string");
! DATA(insert OID = 1405 (  overlay            PGNSP PGUID 14 f f t f i 3 25 "25 25 23"  "select
pg_catalog.substring($1,1, ($3 - 1)) || $2 || pg_catalog.substring($1, ($3 + char_length($2)))" - _null_ )); 
  DESCR("substitute portion of string");

  DATA(insert OID = 1406 (  isvertical        PGNSP PGUID 12 f f t f i 2    16 "600 600"  point_vert - _null_ ));
***************
*** 1835,1841 ****
  DESCR("multiply box by point (scale)");
  DATA(insert OID = 1425 (  box_div            PGNSP PGUID 12 f f t f i 2 603 "603 600"    box_div - _null_ ));
  DESCR("divide box by point (scale)");
! DATA(insert OID = 1426 (  path_contain_pt    PGNSP PGUID 14 f f t f i 2    16 "602 600"  "select on_ppath($2, $1)" -
_null_)); 
  DESCR("path contains point?");
  DATA(insert OID = 1428 (  poly_contain_pt    PGNSP PGUID 12 f f t f i 2    16 "604 600"  poly_contain_pt - _null_ ));
  DESCR("polygon contains point?");
--- 1835,1841 ----
  DESCR("multiply box by point (scale)");
  DATA(insert OID = 1425 (  box_div            PGNSP PGUID 12 f f t f i 2 603 "603 600"    box_div - _null_ ));
  DESCR("divide box by point (scale)");
! DATA(insert OID = 1426 (  path_contain_pt    PGNSP PGUID 14 f f t f i 2    16 "602 600"  "select
pg_catalog.on_ppath($2,$1)" - _null_ )); 
  DESCR("path contains point?");
  DATA(insert OID = 1428 (  poly_contain_pt    PGNSP PGUID 12 f f t f i 2    16 "604 600"  poly_contain_pt - _null_ ));
  DESCR("polygon contains point?");
***************
*** 2015,2021 ****
  DESCR("center of");
  DATA(insert OID = 1543 (  center            PGNSP PGUID 12 f f t f i 1 600 "718"    circle_center - _null_ ));
  DESCR("center of");
! DATA(insert OID = 1544 (  polygon            PGNSP PGUID 14 f f t f i 1 604 "718"    "select polygon(12, $1)" -
_null_)); 
  DESCR("convert circle to 12-vertex polygon");
  DATA(insert OID = 1545 (  npoints            PGNSP PGUID 12 f f t f i 1    23 "602"  path_npoints - _null_ ));
  DESCR("number of points in path");
--- 2015,2021 ----
  DESCR("center of");
  DATA(insert OID = 1543 (  center            PGNSP PGUID 12 f f t f i 1 600 "718"    circle_center - _null_ ));
  DESCR("center of");
! DATA(insert OID = 1544 (  polygon            PGNSP PGUID 14 f f t f i 1 604 "718"    "select pg_catalog.polygon(12,
$1)"- _null_ )); 
  DESCR("convert circle to 12-vertex polygon");
  DATA(insert OID = 1545 (  npoints            PGNSP PGUID 12 f f t f i 1    23 "602"  path_npoints - _null_ ));
  DESCR("number of points in path");
***************
*** 2165,2173 ****
  DESCR("return portion of string");
  DATA(insert OID =  878 (  translate    PGNSP PGUID 12 f f t f i 3 25 "25 25 25"  translate - _null_ ));
  DESCR("map a set of character appearing in string");
! DATA(insert OID =  879 (  lpad           PGNSP PGUID 14 f f t f i 2 25 "25 23"    "select lpad($1, $2, \' \')" -
_null_)); 
  DESCR("left-pad string to length");
! DATA(insert OID =  880 (  rpad           PGNSP PGUID 14 f f t f i 2 25 "25 23"    "select rpad($1, $2, \' \')" -
_null_)); 
  DESCR("right-pad string to length");
  DATA(insert OID =  881 (  ltrim           PGNSP PGUID 12 f f t f i 1 25 "25"  ltrim1 - _null_ ));
  DESCR("trim spaces from left end of string");
--- 2165,2173 ----
  DESCR("return portion of string");
  DATA(insert OID =  878 (  translate    PGNSP PGUID 12 f f t f i 3 25 "25 25 25"  translate - _null_ ));
  DESCR("map a set of character appearing in string");
! DATA(insert OID =  879 (  lpad           PGNSP PGUID 14 f f t f i 2 25 "25 23"    "select pg_catalog.lpad($1, $2, \'
\')"- _null_ )); 
  DESCR("left-pad string to length");
! DATA(insert OID =  880 (  rpad           PGNSP PGUID 14 f f t f i 2 25 "25 23"    "select pg_catalog.rpad($1, $2, \'
\')"- _null_ )); 
  DESCR("right-pad string to length");
  DATA(insert OID =  881 (  ltrim           PGNSP PGUID 12 f f t f i 1 25 "25"  ltrim1 - _null_ ));
  DESCR("trim spaces from left end of string");
***************
*** 2315,2321 ****

  DATA(insert OID = 1698 (  position           PGNSP PGUID 12 f f t f i 2 23 "1560 1560" bitposition - _null_ ));
  DESCR("return position of sub-bitstring");
! DATA(insert OID = 1699 (  substring            PGNSP PGUID 14 f f t f i 2 1560 "1560 23"  "select substring($1, $2,
-1)"- _null_ )); 
  DESCR("return portion of bitstring");


--- 2315,2321 ----

  DATA(insert OID = 1698 (  position           PGNSP PGUID 12 f f t f i 2 23 "1560 1560" bitposition - _null_ ));
  DESCR("return position of sub-bitstring");
! DATA(insert OID = 1699 (  substring            PGNSP PGUID 14 f f t f i 2 1560 "1560 23"  "select
pg_catalog.substring($1,$2, -1)" - _null_ )); 
  DESCR("return portion of bitstring");


***************
*** 2445,2455 ****
  DESCR("sign of value");
  DATA(insert OID = 1707 ( round                    PGNSP PGUID 12 f f t f i 2 1700 "1700 23"  numeric_round - _null_
));
  DESCR("value rounded to 'scale'");
! DATA(insert OID = 1708 ( round                    PGNSP PGUID 14 f f t f i 1 1700 "1700"    "select round($1,0)" -
_null_)); 
  DESCR("value rounded to 'scale' of zero");
  DATA(insert OID = 1709 ( trunc                    PGNSP PGUID 12 f f t f i 2 1700 "1700 23"  numeric_trunc - _null_
));
  DESCR("value truncated to 'scale'");
! DATA(insert OID = 1710 ( trunc                    PGNSP PGUID 14 f f t f i 1 1700 "1700"    "select trunc($1,0)" -
_null_)); 
  DESCR("value truncated to 'scale' of zero");
  DATA(insert OID = 1711 ( ceil                    PGNSP PGUID 12 f f t f i 1 1700 "1700"    numeric_ceil - _null_ ));
  DESCR("smallest integer >= value");
--- 2445,2455 ----
  DESCR("sign of value");
  DATA(insert OID = 1707 ( round                    PGNSP PGUID 12 f f t f i 2 1700 "1700 23"  numeric_round - _null_
));
  DESCR("value rounded to 'scale'");
! DATA(insert OID = 1708 ( round                    PGNSP PGUID 14 f f t f i 1 1700 "1700"    "select
pg_catalog.round($1,0)"- _null_ )); 
  DESCR("value rounded to 'scale' of zero");
  DATA(insert OID = 1709 ( trunc                    PGNSP PGUID 12 f f t f i 2 1700 "1700 23"  numeric_trunc - _null_
));
  DESCR("value truncated to 'scale'");
! DATA(insert OID = 1710 ( trunc                    PGNSP PGUID 14 f f t f i 1 1700 "1700"    "select
pg_catalog.trunc($1,0)"- _null_ )); 
  DESCR("value truncated to 'scale' of zero");
  DATA(insert OID = 1711 ( ceil                    PGNSP PGUID 12 f f t f i 1 1700 "1700"    numeric_ceil - _null_ ));
  DESCR("smallest integer >= value");
***************
*** 2501,2507 ****
  DESCR("m raised to the power of n");
  DATA(insert OID = 1740 ( numeric                PGNSP PGUID 12 f f t f i 1 1700 "23"    int4_numeric - _null_ ));
  DESCR("(internal)");
! DATA(insert OID = 1741 ( log                    PGNSP PGUID 14 f f t f i 1 1700 "1700"    "select log(10, $1)" -
_null_)); 
  DESCR("logarithm base 10 of n");
  DATA(insert OID = 1742 ( numeric                PGNSP PGUID 12 f f t f i 1 1700 "700"  float4_numeric - _null_ ));
  DESCR("(internal)");
--- 2501,2507 ----
  DESCR("m raised to the power of n");
  DATA(insert OID = 1740 ( numeric                PGNSP PGUID 12 f f t f i 1 1700 "23"    int4_numeric - _null_ ));
  DESCR("(internal)");
! DATA(insert OID = 1741 ( log                    PGNSP PGUID 14 f f t f i 1 1700 "1700"    "select pg_catalog.log(10,
$1)"- _null_ )); 
  DESCR("logarithm base 10 of n");
  DATA(insert OID = 1742 ( numeric                PGNSP PGUID 12 f f t f i 1 1700 "700"  float4_numeric - _null_ ));
  DESCR("(internal)");
***************
*** 2575,2585 ****
  DESCR("I/O");


! DATA(insert OID = 1810 (  bit_length       PGNSP PGUID 14 f f t f i 1 23 "17" "select octet_length($1) * 8" - _null_
));
  DESCR("length in bits");
! DATA(insert OID = 1811 (  bit_length       PGNSP PGUID 14 f f t f i 1 23 "25" "select octet_length($1) * 8" - _null_
));
  DESCR("length in bits");
! DATA(insert OID = 1812 (  bit_length       PGNSP PGUID 14 f f t f i 1 23 "1560" "select length($1)" - _null_ ));
  DESCR("length in bits");

  /* Selectivity estimators for LIKE and related operators */
--- 2575,2585 ----
  DESCR("I/O");


! DATA(insert OID = 1810 (  bit_length       PGNSP PGUID 14 f f t f i 1 23 "17" "select pg_catalog.octet_length($1) *
8"- _null_ )); 
  DESCR("length in bits");
! DATA(insert OID = 1811 (  bit_length       PGNSP PGUID 14 f f t f i 1 23 "25" "select pg_catalog.octet_length($1) *
8"- _null_ )); 
  DESCR("length in bits");
! DATA(insert OID = 1812 (  bit_length       PGNSP PGUID 14 f f t f i 1 23 "1560" "select pg_catalog.length($1)" -
_null_)); 
  DESCR("length in bits");

  /* Selectivity estimators for LIKE and related operators */
***************
*** 2936,2942 ****
  DESCR("greater-than");
  DATA(insert OID = 2058 (  age                PGNSP PGUID 12 f f t f i 2 1186 "1114 1114"  timestamp_age - _null_ ));
  DESCR("date difference preserving months and years");
! DATA(insert OID = 2059 (  age                PGNSP PGUID 14 f f t f s 1 1186 "1114"    "select age(cast(current_date
astimestamp without time zone), $1)" - _null_ )); 
  DESCR("date difference from today preserving months and years");

  DATA(insert OID = 2069 (  timezone            PGNSP PGUID 12 f f t f s 2 1184 "25 1114"  timestamp_zone - _null_ ));
--- 2936,2942 ----
  DESCR("greater-than");
  DATA(insert OID = 2058 (  age                PGNSP PGUID 12 f f t f i 2 1186 "1114 1114"  timestamp_age - _null_ ));
  DESCR("date difference preserving months and years");
! DATA(insert OID = 2059 (  age                PGNSP PGUID 14 f f t f s 1 1186 "1114"    "select
pg_catalog.age(cast(current_dateas timestamp without time zone), $1)" - _null_ )); 
  DESCR("date difference from today preserving months and years");

  DATA(insert OID = 2069 (  timezone            PGNSP PGUID 12 f f t f s 2 1184 "25 1114"  timestamp_zone - _null_ ));
***************
*** 2950,2956 ****

  DATA(insert OID = 2073 (  substring            PGNSP PGUID 12 f f t f i 2 25 "25 25"    textregexsubstr - _null_ ));
  DESCR("extracts text matching regular expression");
! DATA(insert OID = 2074 (  substring            PGNSP PGUID 14 f f t f i 3 25 "25 25 25"    "select substring($1,
similar_escape($2,$3))" - _null_ )); 
  DESCR("extracts text matching SQL99 regular expression");

  DATA(insert OID = 2075 (  bit                PGNSP PGUID 12 f f t f i 1 1560 "20"    bitfromint8 - _null_ ));
--- 2950,2956 ----

  DATA(insert OID = 2073 (  substring            PGNSP PGUID 12 f f t f i 2 25 "25 25"    textregexsubstr - _null_ ));
  DESCR("extracts text matching regular expression");
! DDATA(insert OID = 2074 (  substring            PGNSP PGUID 14 f f t f i 3 25 "25 25 25"    "select
pg_catalog.substring($1,pg_catalog.similar_escape($2, $3))" - _null_ )); 
  DESCR("extracts text matching SQL99 regular expression");

  DATA(insert OID = 2075 (  bit                PGNSP PGUID 12 f f t f i 1 1560 "20"    bitfromint8 - _null_ ));


pgsql-patches by date:

Previous
From: Tom Lane
Date:
Subject: Re: AIX port current
Next
From: Christopher Kings-Lynne
Date:
Subject: Re: [HACKERS] obj_description problems?