>Description:

I am using mysql 4.04.

Here is a quote from the mysql manual that started me on this adventure:

        "You can have non-unique keys in a HEAP table (this isn't common for hashed 
tables)."

Based on this claim, I designed a database which took advantage of non-unique keys in 
HEAP tables.  A number of things myseriously failed to work right, however, and 
problems could be shown only to surface when the tables in question were of type HEAP 
rather than anything else.

The below repro script demonstrates the problem in just about the simplest cast 
possible.  There is one key and one "value" column.  Two rows are inserted, with the 
same value for the key.  Doing an unqualified row count gives the correct number, 2, 
but doing a row count with a traversal by the key only yields a value of 1!  Clearly 
what is happening is that the underlying hash index implementation does not utilize 
any sort of chaining to bin duplicate keys, or if it does, the traversal code stops 
after reading the first hashed value.

This problem has deeper implications.  I actually first ran into it when doing JOINs 
between a table and a heap table with non-unique index: when the non-unique index was 
involved in the JOIN condition, less rows were produced in the output than there 
should have been.  Actually, this means the relational algebra is broken... 

Anyway, strictly speaking, the above claim from the documentation is not violated by 
these phenomenon; you can indeed have non-unique keys in a HEAP table.  Just don't 
expect them to work =)  I hope this is in fact a bug, and the claim was not put forth 
with this trivial meaning (that would seem fairly dishonest).

I checked the changelogs for newer versions and didn't see anything referring to this 
bug, so that is why I have not tried anything later than 4.04.

>How-To-Repeat:

        create temporary table heaptest (id int default 0, name varchar(32), key(id)) 
TYPE=Heap;

        insert into heaptest values(1, 'foo');
        insert into heaptest values(1, 'bar');
        select count(*) as unqualified_count from heaptest;
        select count(*) as count_by_nonunique_key from heaptest where id=1;

>Fix:
        I have no clue, implementation wise (I wish I had time to go look...).  I'm 
assuming that the HEAP index implementation is either not chained, or the index 
traversal code is not aware of this chaining.  I'd be surprised if it was the former, 
because that would mean someone knowingly broke the relational algebra.

>Submitter-Id:  <submitter ID>
>Originator:    Aaron Krowne
>Organization:
 Digital Library Research Lab
 Virginia Tech
 Blacksburg, VA, USA
>MySQL support: none
>Synopsis:      non-unique indicies in HEAP tables handled incorrectly.
>Severity:  critical
>Priority:      high
>Category:      mysql
>Class:         sw-bug
>Release:       mysql-4.0.4-beta (Official MySQL RPM)

>Environment:
        
System: Linux shaun 2.4.18 #1 Tue Dec 3 05:32:59 EST 2002 i686 unknown
Architecture: i686

Some paths:  /usr/local/bin/perl /usr/bin/make /usr/bin/gmake /usr/bin/gcc /usr/bin/cc
GCC: Reading specs from /usr/lib/gcc-lib/i386-linux/2.95.4/specs
gcc version 2.95.4 20010902 (Debian prerelease)
Compilation info: CC='gcc'  CFLAGS='-O6 -fno-omit-frame-pointer -mpentium'  CXX='gcc'  
CXXFLAGS='-O6 -fno-omit-frame-pointer              -felide-constructors 
-fno-exceptions -fno-rtti -mpentium'  LDFLAGS=''
LIBC: 
lrwxrwxrwx    1 root     root           14 Dec  3 05:53 /lib/libc.so.5 -> 
libc.so.5.4.46
-rw-r--r--    1 root     root       563068 Feb  4  2002 /lib/libc.so.5.4.46
lrwxrwxrwx    1 root     root           13 Dec  3 05:53 /lib/libc.so.6 -> libc-2.3.1.so
-rwxr-xr-x    1 root     root      1109068 Nov 19 13:13 /lib/libc-2.3.1.so
-rw-r--r--    1 root     root      2344038 Nov 19 13:14 /usr/lib/libc.a
-rw-r--r--    1 root     root          178 Nov 19 13:14 /usr/lib/libc.so
Configure command: ./configure --disable-shared --with-mysqld-ldflags=-all-static 
--with-client-ldflags=-all-static --without-berkeley-db --with-innodb --without-vio 
--without-openssl --enable-assembler --enable-local-infile --with-mysqld-user=mysql 
--with-unix-socket-path=/var/lib/mysql/mysql.sock --prefix=/ 
--with-extra-charsets=complex --exec-prefix=/usr --libexecdir=/usr/sbin 
--sysconfdir=/etc --datadir=/usr/share --localstatedir=/var/lib/mysql 
--infodir=/usr/share/info --includedir=/usr/include --mandir=/usr/share/man 
--with-embedded-server --enable-thread-safe-client '--with-comment=Official MySQL RPM' 
CC=gcc 'CFLAGS=-O6 -fno-omit-frame-pointer -mpentium' 'CXXFLAGS=-O6 
-fno-omit-frame-pointer               -felide-constructors -fno-exceptions -fno-rtti 
-mpentium' CXX=gcc


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