At 5:21 +0000 11/2/02, Kevin McManus wrote:
Date: Sat, 2 Nov 2002 05:09:44 +0000
From: Kevin McManus <[EMAIL PROTECTED]>
To: [EMAIL PROTECTED]
Subject: behaviour of WHERE statement with NULL fields
User-Agent: Mutt/1.4i

Description:
        The WHERE statement does not correctly return rows matching NULL
	fields when using NOT with IN, LIKE or REGEXP - or using REGEXP
	with negation ^
That makes perfect sense.  That value of NULL is unknown, so it's
impossible to say whether or not it matches a pattern.  The only
reasonable result is NULL.  Even NULL LIKE NULL and NULL REGEXP NULL
return NULL, because you can't tell whether or not one unknown value
is the same as another.


How-To-Repeat:
	Please see the SQL at the foot of this email for the bugtest table
        SELECT * FROM bugtest WHERE grp IN ('A','B')
           Correctly returns rows where grp is 'A' or 'B'
        SELECT * FROM bugtest WHERE grp NOT IN ('A','B')
	   Returns rows where grp is 'C' but fails to return rows where
	   grp is NULL (but clearly not 'A' or 'B')
	SELECT * FROM bugtest WHERE grp NOT LIKE 'A'
	   Returns only rows where grp is 'B' and 'C' but not NULL
	SELECT * FROM bugtest WHERE grp NOT LIKE '_'
	   Returns no rows but NULL is not like a single character
	SELECT * FROM bugtest WHERE grp REGEXP '[AB]'
	   Returns rows where grp matches 'A' or 'B'
	SELECT * FROM bugtest WHERE grp REGEXP '[^AB]'
	   Returns rows where grp is 'C' but fails to return rows where
           grp is NULL

Fix:
	Use IS NULL
        SELECT * FROM bugtest WHERE grp IS NULL OR grp REGEXP '[^AB]'
	Returns what would be expected from the last How-To-Repeat example

Submitter-Id:  <submitter ID>
Originator:    Kevin McManus
Organization:
	School of Computing & Math Science
	The University of Greenwich
	Park Row, Greenwich
	London SE10 9LS  UK
MySQL support: none
Synopsis:      behaviour of WHERE statement with NULL fields
Severity:      medium
Priority:      low
Category:      mysql
Class:         sw-bug
Release:       mysql-3.23.41 (Source distribution)

Environment:
<machine, os, target, libraries (multiple lines)>
System: Linux raq566.uk2net.com 2.2.16C28_III #1 Mon Jul 30 22:07:58 PDT 2001 i586 unknown
Architecture: i586

Some paths: /usr/bin/perl /usr/bin/make /usr/bin/gmake /usr/bin/gcc /usr/bin/cc
GCC: Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/specs
gcc version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)
Compilation info: CC='gcc' CFLAGS='' CXX='c++' CXXFLAGS='' LDFLAGS=''
LIBC:
lrwxrwxrwx 1 root root 13 Jan 20 2001 /lib/libc.so.6 -> libc-2.1.3.so
-rwxr-xr-x 1 root root 4101836 Sep 5 2000 /lib/libc-2.1.3.so
-rw-r--r-- 1 root root 20273284 Sep 5 2000 /usr/lib/libc.a
-rw-r--r-- 1 root root 178 Sep 5 2000 /usr/lib/libc.so
lrwxrwxrwx 1 root root 19 Sep 26 2001 /usr/lib/libc-client.a -> /usr/lib/c-client.a
Configure command: ./configure --prefix=/usr/local/mysql --with-unix-socket-path=/tmp/mysql.sock --with-mysqld-user=mysql
Perl: This is perl, version 5.005_03 built for i386-linux

CREATE TABLE bugtest (
id int(11) NOT NULL auto_increment,
name varchar(16) default NULL,
grp char(1) binary default NULL,
PRIMARY KEY (id)
) TYPE=MyISAM;

#
# Dumping data for table 'bugtest'
#

INSERT INTO bugtest VALUES (1,'fred','A');
INSERT INTO bugtest VALUES (2,'joe','B');
INSERT INTO bugtest VALUES (3,'bert','C');
INSERT INTO bugtest VALUES (4,'sally',NULL);
INSERT INTO bugtest VALUES (5,'sue','B');
INSERT INTO bugtest VALUES (6,'alan',NULL);
INSERT INTO bugtest VALUES (7,'cathy','A');
INSERT INTO bugtest VALUES (8,'mary','C');

PS An earlier attempt to post this report appears to have failed
Apologies if this is a repeat posting

[EMAIL PROTECTED] - http://staffweb.cms.gre.ac.uk/~k.mcmanus
--------------------------------------------------------------
Dr Kevin McManus ||Queen Mary 413
School of Computing & Math Science ||
The University of Greenwich ||
Park Row, Greenwich ||Tel +44 (0)208 331 8719
London SE10 9LS UK ||Fax +44 (0)208 331 8665

---------------------------------------------------------------------
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

Reply via email to