>Description:

        I have some tables (authentication0106 through authentication0108)
        for which I create a MERGE table (authentication). Some Perl script
        is adding records to authentication0107 as fast as it can. While it
        is doing this, I run the mysql client and issue the following query

        select count(*), max(id), max(auth_time) from authentication;

        Most of the time, this results in one row with sane values, e.g.:

        +----------+---------+----------------+
        | count(*) | max(id) | max(auth_time) |
        +----------+---------+----------------+
        |    59776 |   59776 |      982157198 |
        +----------+---------+----------------+
        1 row in set (0.00 sec)

        But sometimes I get results like these (which is wrong because
        all id's and auth_time's have a value):

        +----------+---------+----------------+
        | count(*) | max(id) | max(auth_time) |
        +----------+---------+----------------+
        |   650614 |    NULL |           NULL |
        +----------+---------+----------------+
        1 row in set (0.00 sec)

        Or even this (max(id) seems okay, but max(auth_time) is wrong):

        +----------+---------+----------------+
        | count(*) | max(id) | max(auth_time) |
        +----------+---------+----------------+
        |   680402 |  680402 |           NULL |
        +----------+---------+----------------+
        1 row in set (0.00 sec)

>How-To-Repeat:

        1. Create tables in mysql client:

        create table authentication0106 (
                id int not null,
                auth_time int not null,
                primary key(id),
                key auth_time(auth_time)) ;
        create table authentication0107 (
                id int not null,
                auth_time int not null,
                primary key(id),
                key auth_time(auth_time)) ;
        create table authentication0108 (
                id int not null,
                auth_time int not null,
                primary key(id),
                key auth_time(auth_time)) ;
        create table authentication (
                id int not null,
                auth_time int not null,
                primary key(id),
                key auth_time(auth_time))
                type=merge
                union=(authentication0106,authentication0107,authentication0108);

        2. Start this Perl script:

        #!/usr/local/bin/perl5 -w

        use DBI;
        use DBD::mysql;

        use POSIX;

        sub main {

                my ($dbname) = @_;

                #DBI->trace(2);

                my $prev_yearweek = '';
                my $sth_yearweek = '';

                my $dbh = 
DBI->connect("dbi:mysql:database=$dbname:mysql_socket=/tmp/mysql-3.23.32.sock", 
"test", "test", {RaiseError => 1});


                #
                # find last stored auth_time and id
                #
                my $lasttime;
                my $sth = $dbh->prepare("select max(id), max(auth_time) from 
authentication");

                $sth->execute();
                ($id, $lasttime) = ($sth->fetchrow_array())[0..1];
                $id = $id ? $id + 1 : 1;
                $sth = undef;

                for ($i=0; $i<1000000; $i++) {

                        my $time = time();

                        #
                        # see for which week this is an authentication
                        #

                        my $yearweek = strftime("%g%U", localtime($time));
                        $yearweek = '0107';

                        if ($yearweek ne $prev_yearweek) {
                                $prev_yearweek = $yearweek;
                                $sth_yearweek = $dbh->prepare(
                                        "insert into authentication".$yearweek." set 
id = ?, auth_time = ?");
                        }

                        $sth_yearweek->execute(
                                $id++,
                                $time,
                                );
                }

                #$dbh->commit();
                $dbh->disconnect();
        }

        my $dbname = 'test';

        &main($dbname);

        3. Repeatedly execute this query in the mysql client while the
           Perl script above is running:

        select count(*), max(id), max(auth_time) from authentication;

        It seems to be some race-condition so there's no guaranteed reproduction
        but it gives incorrect results once every 5 or 10 times in my case.

>Fix:
        Unknown

>Submitter-Id:        <[EMAIL PROTECTED]>
>Originator:        Fred van Engen
>Organization:  XO Communications B.V.
>MySQL support: none
>Synopsis:        NULL and 0 values when reading from MERGE table while INSERTing
>Severity:        serious
>Priority:        medium
>Category:        mysql
>Class:                sw-bug
>Release:        mysql-3.23.32 (Source distribution)

>Environment:
        
System: SunOS lei 5.7 Generic_106541-07 sun4u sparc SUNW,Ultra-250
Architecture: sun4

Some paths:  /usr/local/bin/perl /usr/local/bin/make /usr/local/bin/gcc
GCC: Reading specs from /opt/gcc/lib/gcc-lib/sparc-sun-solaris2.7/2.8.1/specs
gcc version 2.8.1
Compilation info: CC='gcc'  CFLAGS=''  CXX='gcc'  CXXFLAGS=''  LDFLAGS=''
LIBC: 
-rw-r--r--   1 bin      bin      1693556 Sep 22  1999 /lib/libc.a
lrwxrwxrwx   1 root     root          11 Oct  7  1999 /lib/libc.so -> ./libc.so.1
-rwxr-xr-x   1 bin      bin      1115304 Sep 22  1999 /lib/libc.so.1
-rw-r--r--   1 bin      bin      1693556 Sep 22  1999 /usr/lib/libc.a
lrwxrwxrwx   1 root     root          11 Oct  7  1999 /usr/lib/libc.so -> ./libc.so.1
-rwxr-xr-x   1 bin      bin      1115304 Sep 22  1999 /usr/lib/libc.so.1
Configure command: ./configure  --prefix=/opt/mysql-3.23.32
Perl: This is perl, version 5.005_03 built for sun4-solaris

!!! The above is generated by mysqlbug on the system that MySQL runs on. The
!!! MySQL source was compiled on an identical system with gcc 2.95.2.

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