Re: bytea operator bugs (was Re: [GENERAL] BYTEA, indexes

Поиск
Список
Период
Сортировка
От Joe Conway
Тема Re: bytea operator bugs (was Re: [GENERAL] BYTEA, indexes
Дата
Msg-id 3D613924.9040607@joeconway.com
обсуждение исходный текст
Ответ на bytea operator bugs (was Re: [GENERAL] BYTEA, indexes and "like")  (Joe Conway <mail@joeconway.com>)
Ответы Re: bytea operator bugs (was Re: [GENERAL] BYTEA, indexes  (Bruce Momjian <pgman@candle.pha.pa.us>)
Re: bytea operator bugs (was Re: [GENERAL] BYTEA, indexes  (Bruce Momjian <pgman@candle.pha.pa.us>)
Список pgsql-patches
Joe Conway wrote:
> Back on the pattern selectivity issue. With some more study I can
> clearly see what you were referring to. Dragging string length through
> the maze of function calls that would need it would be a mess.
>
> In the longer term (i.e. not for 7.3) it might make sense to create a
> set of pattern selectivity functions, just for bytea, that are careful
> to avoid the null-terminated string assumption. But, for now, I'm
> leaning toward restricting the right-hand argument of bytealike to TEXT,
> as you suggested.

As suggested by Tom, this patch restricts the right-hand argument of
bytealike to TEXT.

This leaves like_escape_bytea() without anything to do, but I left it in
place in anticipation of the eventual bytea pattern selectivity
functions. If there is agreement that this would be the best long term
solution, I'll take it as a TODO for 7.4.

I'll look around the docs to see if there is someplace where a note wrt
this is appropriate.

If there are no objections, please apply.

Thanks,

Joe
Index: src/backend/utils/adt/like.c
===================================================================
RCS file: /opt/src/cvs/pgsql-server/src/backend/utils/adt/like.c,v
retrieving revision 1.49
diff -c -r1.49 like.c
*** src/backend/utils/adt/like.c    20 Jun 2002 20:29:37 -0000    1.49
--- src/backend/utils/adt/like.c    19 Aug 2002 17:06:10 -0000
***************
*** 264,270 ****
  bytealike(PG_FUNCTION_ARGS)
  {
      bytea       *str = PG_GETARG_BYTEA_P(0);
!     bytea       *pat = PG_GETARG_BYTEA_P(1);
      bool        result;
      unsigned char *s,
                 *p;
--- 264,270 ----
  bytealike(PG_FUNCTION_ARGS)
  {
      bytea       *str = PG_GETARG_BYTEA_P(0);
!     text       *pat = PG_GETARG_TEXT_P(1);
      bool        result;
      unsigned char *s,
                 *p;
***************
*** 285,291 ****
  byteanlike(PG_FUNCTION_ARGS)
  {
      bytea       *str = PG_GETARG_BYTEA_P(0);
!     bytea       *pat = PG_GETARG_BYTEA_P(1);
      bool        result;
      unsigned char *s,
                 *p;
--- 285,291 ----
  byteanlike(PG_FUNCTION_ARGS)
  {
      bytea       *str = PG_GETARG_BYTEA_P(0);
!     text       *pat = PG_GETARG_TEXT_P(1);
      bool        result;
      unsigned char *s,
                 *p;
Index: src/include/catalog/pg_operator.h
===================================================================
RCS file: /opt/src/cvs/pgsql-server/src/include/catalog/pg_operator.h,v
retrieving revision 1.106
diff -c -r1.106 pg_operator.h
*** src/include/catalog/pg_operator.h    24 Jul 2002 19:11:12 -0000    1.106
--- src/include/catalog/pg_operator.h    19 Aug 2002 17:43:31 -0000
***************
*** 827,835 ****
  DATA(insert OID = 1958 ( "<="       PGNSP PGUID b f 17 17    16 1960 1959 0      0   0   0 byteale scalarltsel
scalarltjoinsel)); 
  DATA(insert OID = 1959 ( ">"       PGNSP PGUID b f 17 17    16 1957 1958 0      0   0   0 byteagt scalargtsel
scalargtjoinsel)); 
  DATA(insert OID = 1960 ( ">="       PGNSP PGUID b f 17 17    16 1958 1957 0      0   0   0 byteage scalargtsel
scalargtjoinsel)); 
! DATA(insert OID = 2016 (  "~~"       PGNSP PGUID b f 17 17    16 0    2017 0      0   0   0 bytealike likesel
likejoinsel)); 
  #define OID_BYTEA_LIKE_OP        2016
! DATA(insert OID = 2017 (  "!~~"    PGNSP PGUID b f 17 17    16 0    2016 0      0   0   0 byteanlike nlikesel
nlikejoinsel)); 
  DATA(insert OID = 2018 (  "||"       PGNSP PGUID b f 17 17    17 0    0     0      0   0   0 byteacat - - ));

  /* timestamp operators */
--- 827,835 ----
  DATA(insert OID = 1958 ( "<="       PGNSP PGUID b f 17 17    16 1960 1959 0      0   0   0 byteale scalarltsel
scalarltjoinsel)); 
  DATA(insert OID = 1959 ( ">"       PGNSP PGUID b f 17 17    16 1957 1958 0      0   0   0 byteagt scalargtsel
scalargtjoinsel)); 
  DATA(insert OID = 1960 ( ">="       PGNSP PGUID b f 17 17    16 1958 1957 0      0   0   0 byteage scalargtsel
scalargtjoinsel)); 
! DATA(insert OID = 2016 (  "~~"       PGNSP PGUID b f 17 25    16 0    2017 0      0   0   0 bytealike likesel
likejoinsel)); 
  #define OID_BYTEA_LIKE_OP        2016
! DATA(insert OID = 2017 (  "!~~"    PGNSP PGUID b f 17 25    16 0    2016 0      0   0   0 byteanlike nlikesel
nlikejoinsel)); 
  DATA(insert OID = 2018 (  "||"       PGNSP PGUID b f 17 17    17 0    0     0      0   0   0 byteacat - - ));

  /* timestamp operators */
Index: src/include/catalog/pg_proc.h
===================================================================
RCS file: /opt/src/cvs/pgsql-server/src/include/catalog/pg_proc.h,v
retrieving revision 1.256
diff -c -r1.256 pg_proc.h
*** src/include/catalog/pg_proc.h    17 Aug 2002 13:04:15 -0000    1.256
--- src/include/catalog/pg_proc.h    19 Aug 2002 17:06:10 -0000
***************
*** 2766,2778 ****
  DATA(insert OID = 1969 (  timetz           PGNSP PGUID 12 f f t f i 2 1266 "1266 23"    timetz_scale - _null_ ));
  DESCR("adjust time with time zone precision");

! DATA(insert OID = 2005 (  bytealike           PGNSP PGUID 12 f f t f i 2 16 "17 17" bytealike - _null_ ));
  DESCR("matches LIKE expression");
! DATA(insert OID = 2006 (  byteanlike       PGNSP PGUID 12 f f t f i 2 16 "17 17" byteanlike - _null_ ));
  DESCR("does not match LIKE expression");
! DATA(insert OID = 2007 (  like               PGNSP PGUID 12 f f t f i 2 16 "17 17"    bytealike - _null_ ));
  DESCR("matches LIKE expression");
! DATA(insert OID = 2008 (  notlike           PGNSP PGUID 12 f f t f i 2 16 "17 17"    byteanlike - _null_ ));
  DESCR("does not match LIKE expression");
  DATA(insert OID = 2009 (  like_escape       PGNSP PGUID 12 f f t f i 2 17 "17 17" like_escape_bytea - _null_ ));
  DESCR("convert match pattern to use backslash escapes");
--- 2766,2778 ----
  DATA(insert OID = 1969 (  timetz           PGNSP PGUID 12 f f t f i 2 1266 "1266 23"    timetz_scale - _null_ ));
  DESCR("adjust time with time zone precision");

! DATA(insert OID = 2005 (  bytealike           PGNSP PGUID 12 f f t f i 2 16 "17 25" bytealike - _null_ ));
  DESCR("matches LIKE expression");
! DATA(insert OID = 2006 (  byteanlike       PGNSP PGUID 12 f f t f i 2 16 "17 25" byteanlike - _null_ ));
  DESCR("does not match LIKE expression");
! DATA(insert OID = 2007 (  like               PGNSP PGUID 12 f f t f i 2 16 "17 25"    bytealike - _null_ ));
  DESCR("matches LIKE expression");
! DATA(insert OID = 2008 (  notlike           PGNSP PGUID 12 f f t f i 2 16 "17 25"    byteanlike - _null_ ));
  DESCR("does not match LIKE expression");
  DATA(insert OID = 2009 (  like_escape       PGNSP PGUID 12 f f t f i 2 17 "17 17" like_escape_bytea - _null_ ));
  DESCR("convert match pattern to use backslash escapes");

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

Предыдущее
От: Joe Conway
Дата:
Сообщение: Re: bytea operator bugs (was Re: [GENERAL] BYTEA, indexes
Следующее
От: Neil Conway
Дата:
Сообщение: first cut at PL/PgSQL table functions