another bug in substring_index in conjunction with UDF functions?

2001-02-07 Thread Michael Widenius


Hi!

 "ch" == ch  [EMAIL PROTECTED] writes:

 Description:
ch My udf function and an equal udf function I found in the internet
ch seem to work well as does substring_index. Only when I call them
ch together I get a bug. As my function (quotet below) is so simple 
ch that it doubtly has a bug I guess substring_index has one.
 How-To-Repeat:
mysql select substring_index("1.2.3.4/24","/",1) ;
ch +-+
ch | substring_index("1.2.3.4/24","/",1) |
ch +-+
ch | 1.2.3.4 |
ch +-+
ch 1 row in set (0.00 sec)

mysql select ewu_aton("1.2.3.4"); 
ch +-+
ch | ewu_aton("1.2.3.4") |
ch +-+
ch |16909060 |
ch +-+
ch 1 row in set (0.01 sec)

mysql select ewu_aton( substring_index("1.2.3.4/24","/",1) );
ch +-+
ch | ewu_aton( substring_index("1.2.3.4/24","/",1) ) |
ch +-+
ch |  3772388104 |
ch +-+
ch 1 row in set (0.00 sec)

ch Here the correct value should had been 16909060 (0x01020304), too!


ch My Function:
ch /*
ch ** inet_aton() 
ch */
ch my_bool ewu_aton_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
ch {
ch   if (args-arg_count != 1 || args-arg_type[0] != STRING_RESULT)
ch   {
ch strmov(message,"Wrong arguments to ewu_aton;  Use the source!");
ch return 1;
ch   }
initid- max_length=20;
initid- maybe_null=0;
ch   return 0;
ch }
ch long long ewu_aton(UDF_INIT *initid, UDF_ARGS *args,
chchar *is_null, char *error)
ch {
ch   struct in_addrin;
 
ch   inet_aton(((char*) args-args[0]), in);
ch   *is_null=0;

ch   return htonl(in.s_addr);
ch }

 Fix:
ch I'd wish I'd have one :-)

The problem is probaly that you are assuming that the string argument
ends with a '\0', which may not be the case!

Try this instead:

long long ewu_aton(UDF_INIT *initid, UDF_ARGS *args,
   char *is_null, char *error)
{
  struct in_addrin;
  char buff[20];
  strnmov(buff,(char*) args-args[0], min(args-lengths[0],20));
 
  inet_aton(buff, in);
  *is_null=0;

  return htonl(in.s_addr);
}

Regards,
Monty

-
Before posting, please check:
   http://www.mysql.com/manual.php   (the manual)
   http://lists.mysql.com/   (the list archive)

To request this thread, e-mail [EMAIL PROTECTED]
To unsubscribe, e-mail [EMAIL PROTECTED]
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php




another bug in substring_index in conjunction with UDF functions?

2001-02-06 Thread ch

Description:
My udf function and an equal udf function I found in the internet
seem to work well as does substring_index. Only when I call them
together I get a bug. As my function (quotet below) is so simple 
that it doubtly has a bug I guess substring_index has one.
How-To-Repeat:
mysql select substring_index("1.2.3.4/24","/",1) ;
+-+
| substring_index("1.2.3.4/24","/",1) |
+-+
| 1.2.3.4 |
+-+
1 row in set (0.00 sec)

mysql select ewu_aton("1.2.3.4"); 
+-+
| ewu_aton("1.2.3.4") |
+-+
|16909060 |
+-+
1 row in set (0.01 sec)

mysql select ewu_aton( substring_index("1.2.3.4/24","/",1) );
+-+
| ewu_aton( substring_index("1.2.3.4/24","/",1) ) |
+-+
|  3772388104 |
+-+
1 row in set (0.00 sec)

Here the correct value should had been 16909060 (0x01020304), too!


My Function:
/*
** inet_aton() 
*/
my_bool ewu_aton_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
{
  if (args-arg_count != 1 || args-arg_type[0] != STRING_RESULT)
  {
strmov(message,"Wrong arguments to ewu_aton;  Use the source!");
return 1;
  }
  initid-max_length=20;
  initid-maybe_null=0;
  return 0;
}
long long ewu_aton(UDF_INIT *initid, UDF_ARGS *args,
   char *is_null, char *error)
{
  struct in_addrin;
 
  inet_aton(((char*) args-args[0]), in);
  *is_null=0;

  return htonl(in.s_addr);
}

Fix:
I'd wish I'd have one :-)

Submitter-Id:  submitter ID
Originator:Christian Hammers
Organization:  WESTEND GmbH
MySQL support: none
Synopsis:  substring_index bug with udf function
Severity:  serious
Priority:  medium
Category:  mysql
Class: sw-bug
Release:   mysql-3.23.30-gamma (Source distribution)
Server: /usr/bin/mysqladmin  Ver 8.13 Distrib 3.23.30-gamma, for pc-linux-gnu on i586
Copyright (C) 2000 MySQL AB  MySQL Finland AB  TCX DataKonsult AB
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license

Server version  3.23.30-gamma and 3.21.30
Protocol version10
Connection  Localhost via UNIX socket
UNIX socket /var/run/mysqld/mysqld.sock
Uptime: 5 days 17 hours 34 min 27 sec

Threads: 3  Questions: 128800303  Slow queries: 1299  Opens: 260  Flush tables: 1  
Open tables: 48 Queries per second avg: 260.062
Environment:
Testet on two different i386 architecture machins running with two
versions of Debian GNU/Linux (an old and the latest)
System: Linux han 2.4.0-test12 #1 Fre Dez 22 15:58:55 CET 2000 i686 unknown
Architecture: i686

Some paths:  /usr/bin/perl /usr/bin/make /usr/local/bin/gcc /usr/bin/cc
GCC: Reading specs from /usr/local/pgcc/lib/gcc-lib/i686-pc-linux-gnu/pgcc-2.95.2/specs
gcc version pgcc-2.95.2 19991024 (release)
Compilation info: CC='gcc'  CFLAGS='-O2 -fomit-frame-pointer -g'  CXX='g++'  
CXXFLAGS='-O2 -fomit-frame-pointer -g -felide-constructors -fno-exceptions -fno-rtti'  
LDFLAGS=''
LIBC: 
lrwxrwxrwx1 root root   13 Jan 19 09:25 /lib/libc.so.6 - libc-2.2.1.so
-rwxr-xr-x1 root root  1078540 Jan 14 07:51 /lib/libc-2.2.1.so
-rw-r--r--1 root root  2471916 Jan 14 07:53 /usr/lib/libc.a
-rw-r--r--1 root root  178 Jan 14 07:53 /usr/lib/libc.so
-rw-r--r--1 root root  2024202 Sep  6 15:18 /usr/lib/libc-client.a
-rw-r--r--1 root root   665260 Sep  6 15:18 /usr/lib/libc-client.so
-rw-r--r--1 root root   665260 Sep  6 15:18 /usr/lib/libc-client.so.4.7
Configure command: ./configure  --prefix=/usr --exec-prefix=/usr 
--libexecdir=/usr/sbin --datadir=/usr/share --sysconfdir=/etc/mysql 
--localstatedir=/var/lib/mysql --includedir=/usr/include --infodir=/usr/share/info 
--mandir=/usr/share/man --enable-shared --with-libwrap --enable-assembler 
--with-berkeley-db-includes=/home/ch/debian/mysql/mysql-3.23.30/debian/db-3.2.3g/build_unix
 
--with-berkeley-db-libs=/home/ch/debian/mysql/mysql-3.23.30/debian/db-3.2.3g/build_unix
 --enable-static --enable-shared --with-raid 
--with-unix-socket-path=/var/run/mysqld/mysqld.sock --with-mysqld-user=mysql 
--without-bench --without-readline --with-extra-charsets=all