| Bug #34928 | Confusion by having Primary Key and Index | ||
|---|---|---|---|
| Submitted: | 28 Feb 2008 14:18 | Modified: | 7 Apr 2008 17:31 | 
| Reporter: | Lars Johansson | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: Optimizer | Severity: | S2 (Serious) | 
| Version: | 5.1.23 | OS: | Any | 
| Assigned to: | Alexey Kopytov | CPU Architecture: | Any | 
   [28 Feb 2008 14:18]
   Lars Johansson        
  
 
   [28 Feb 2008 15:54]
   Valeriy Kravchuk        
  Thak you for the problem report. Can you upload that DB3_BOM_PROD EXTENDED table? Please, send SHOW CREATE TABLE and SHOW TABLE STATUS results for it.
   [28 Feb 2008 16:16]
   Lars Johansson        
  Hi,
Here are show create and show status displays,
i submit two status first on one repaired version and then on an unrepaired version of the table. The index lengths do not match.
I try to send the table tomorrow 
show create table DB3_BOM_PROD
    -> ;
| Table        | Create Table
| DB3_BOM_PROD | CREATE TABLE `DB3_BOM_PROD` (
  `P_PLANT` char(4) NOT NULL DEFAULT '',
  `P_MATNR` char(18) NOT NULL DEFAULT '',
  `P_REFCD` char(2) DEFAULT NULL,
  `P_DIS_CON_IND` char(1) DEFAULT NULL,
  `P_PRO_TYPE` char(1) DEFAULT NULL,
  `P_SPEC_PRO` char(2) DEFAULT NULL,
  `BOM_USE` char(1) NOT NULL DEFAULT '',
  `ALT_BOM` char(2) NOT NULL DEFAULT '',
  `P_MRP_CON` char(3) DEFAULT NULL,
  `DISCON_IND` char(1) DEFAULT NULL,
  `POSNR` char(4) NOT NULL DEFAULT '',
  `C_PLANT` char(4) NOT NULL DEFAULT '',
  `C_MATNR` char(18) NOT NULL DEFAULT '',
  `C_REFCD` char(2) DEFAULT NULL,
  `C_DIS_CON_IND` char(1) DEFAULT NULL,
  `C_PRO_TYPE` char(1) DEFAULT NULL,
  `C_SPEC_PRO` char(2) DEFAULT NULL,
  `C_MRP_CON` char(3) DEFAULT NULL,
  `QTY` decimal(13,3) DEFAULT NULL,
  `UNIT` char(3) DEFAULT NULL,
  `ITEM_CAT` char(1) DEFAULT NULL,
  `REL_COST` char(1) DEFAULT NULL,
  `SORT_STR` char(10) DEFAULT NULL,
  `MAT_TYPE` char(4) DEFAULT NULL,
  `VALID_FR` date DEFAULT NULL,
  `CREATED_DATE` date DEFAULT NULL,
  `CHANGED_DATE` date DEFAULT NULL,
  `CREATED` datetime DEFAULT NULL,
  PRIMARY KEY (`P_PLANT`,`P_MATNR`,`BOM_USE`,`ALT_BOM`,`POSNR`,`C_PLANT`,`C_MATNR`),
  KEY `COMP2` (`P_PLANT`,`P_MATNR`,`ALT_BOM`,`BOM_USE`),
  KEY `P_PLANT` (`P_PLANT`),
  KEY `P_MATNR` (`P_MATNR`),
  KEY `C_PLANT` (`C_PLANT`),
  KEY `C_MATNR` (`C_MATNR`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
1 row in set (0.00 sec)
mysql> show table status LIKE 'DB3_BOM_PROD'; (from a repaired version)
+--------------+--------+---------+------------+--------+----------------+-------------+-------------------+--------------+-----------+----------------+---------------------+---------------------+---------------------+-------------------+----------+----------------+---------+
| Name         | Engine | Version | Row_format | Rows   | Avg_row_length | Data_length | Max_data_length   | Index_length | Data_free | Auto_increment | Create_time         | Update_time         | Check_time          | Collation         | Checksum | Create_options | Comment |
+--------------+--------+---------+------------+--------+----------------+-------------+-------------------+--------------+-----------+----------------+---------------------+---------------------+---------------------+-------------------+----------+----------------+---------+
| DB3_BOM_PROD | MyISAM |      10 | Fixed      | 266423 |            116 |    30905068 | 32651097298436095 |     17341440 |         0 |           NULL | 2008-02-28 04:02:35 | 2008-02-28 14:51:39 | 2008-02-28 14:51:43 | latin1_swedish_ci |     NULL |                |         |
+--------------+--------+---------+------------+--------+----------------+-------------+-------------------+--------------+-----------+----------------+---------------------+---------------------+---------------------+-------------------+----------+----------------+---------+
1 row in set (0.00 sec)
mysql> show table status LIKE 'DB3_BOM_PROD'; (from an unrepaired version)
+--------------+--------+---------+------------+--------+----------------+-------------+-------------------+--------------+-----------+----------------+---------------------+---------------------+---------------------+-------------------+----------+----------------+---------+
| Name         | Engine | Version | Row_format | Rows   | Avg_row_length | Data_length | Max_data_length   | Index_length | Data_free | Auto_increment | Create_time         | Update_time         | Check_time          | Collation         | Checksum | Create_options | Comment |
+--------------+--------+---------+------------+--------+----------------+-------------+-------------------+--------------+-----------+----------------+---------------------+---------------------+---------------------+-------------------+----------+----------------+---------+
| DB3_BOM_PROD | MyISAM |      10 | Fixed      | 266423 |            116 |    30905068 | 32651097298436095 |     20739072 |         0 |           NULL | 2008-02-28 04:02:35 | 2008-02-28 04:03:20 | 2008-02-28 04:02:46 | latin1_swedish_ci |     NULL |                |         |
+--------------+--------+---------+------------+--------+----------------+-------------+-------------------+--------------+-----------+----------------+---------------------+---------------------+---------------------+-------------------+----------+----------------+---------+
1 row in set (0.01 sec)
 
   [28 Feb 2008 18:19]
   Lars Johansson        
  Here is a log from last nite create of the table DB3_BOM_PR
Note this is mysql vs 5.1.22, (so this works).
080228 040235 2500 Log enabled, invoked as:  ./scriptS.php schedule=dts_bom.xml logmode=warning
080228 040235 2500 Log PHP version 5.2.2, Zend version 2.2.0
080228 040235 2500 Note Current directory=/home/actaadm/dw_data_mngr/data/080228040215_dts_bom/dts_bom_prod, SQL-log=SQLLOG_0.TXT
080228 040235 2500 Note Host info 10.40.23.126 via TCP/IP
080228 040235 2500 Note mysql version 5.1.22-rc-log
080228 040235 2500 Note 10.40.23.126 via TCP/IP protocol version 10
080228 040235 2500 Note Client library vs 5.1.12-beta
080228 040235 2500 Note Default database is ACTADW
080228 040235 2500 Note Start executing sqlscript create
080228 040235 2500 Note Exec USE ACTADW;
080228 040235 2500 Note SQLSTATE=00000, ERRORNO=0
080228 040235 2500 Note Exec DROP TABLE IF EXISTS DB3_BOM_PROD;
080228 040235 2500 Note SQLSTATE=00000, ERRORNO=0
080228 040235 2500 Note Exec CREATE TABLE DB3_BOM_PROD(
 PRIMARY KEY COMP1 (P_PLANT, P_MATNR, BOM_USE, ALT_BOM, POSNR, C_PLANT, C_MATNR)
,INDEX COMP2 (P_PLANT,  P_MATNR, ALT_BOM ,BOM_USE)
,P_PLANT  CHAR(4) 
,INDEX P_PLANT (P_PLANT)
,P_MATNR  CHAR(18) 
,INDEX P_MATNR (P_MATNR)
,P_REFCD  CHAR(2) 
,P_DIS_CON_IND CHAR(1) 
,P_PRO_TYPE  CHAR(1) 
,P_SPEC_PRO CHAR(2) 
,BOM_USE CHAR(1) 
,ALT_BOM CHAR(2)  
,P_MRP_CON  CHAR(3) 
,DISCON_IND CHAR(1) 
,POSNR    CHAR(4) 
,C_PLANT   CHAR(4) 
,INDEX C_PLANT (C_PLANT)
,C_MATNR   CHAR(18) 
,INDEX C_MATNR (C_MATNR)
,C_REFCD   CHAR(2) 
,C_DIS_CON_IND CHAR(1) 
,C_PRO_TYPE CHAR(1) 
,C_SPEC_PRO CHAR(2) 
,C_MRP_CON  CHAR(3) 
,QTY  NUMERIC (13,3)
,UNIT CHAR(3) 
,ITEM_CAT   CHAR(1) 
,REL_COST CHAR(1) 
,SORT_STR CHAR(10) 
,MAT_TYPE CHAR(4) 
,VALID_FR   DATE
,CREATED_DATE DATE
,CHANGED_DATE DATE
,CREATED DATETIME
);
080228 040235 2500 Note SQLSTATE=00000, ERRORNO=0
080228 040235 2500 Note Start executing sqlscript load
080228 040235 2500 Note Exec USE ACTADW;
080228 040235 2500 Note SQLSTATE=00000, ERRORNO=0
080228 040235 2500 Note Exec LOAD DATA LOCAL INFILE 'DTS_STPO_PROD.TXT'                                         
    REPLACE                                                                     
    INTO TABLE DB3_BOM_PROD                                                      
    FIELDS                                                                      
           TERMINATED BY ';'                                                    
    IGNORE 0 LINES                                                              
;
080228 040246 2500 Note SQLSTATE=00000, ERRORNO=0
080228 040246 2500 Note SQLINFO Records: 207483  Deleted: 1  Skipped: 0  Warnings: 0 SQLSTATE=00000, ERRORNO=0
080228 040246 2500 Log disabled ./scriptS.php
 
   [28 Feb 2008 18:23]
   Lars Johansson        
  Hi, the infile we load to create DB3_BOM_PROD is 25mB so I do not know how to transfer it. but I send you a couple of lines. Please tell if you want more and how I should send. 1100;0101121280;;;E;CT;1;01;306;;0010;1100;0101121200;;;F;;140;2.000;ST;L;X;0;ZMAT;20040425;20050427;00000000;2008-02-28 02:14:12 1100;0517530095;;;E;CT;1;01;305;;0010;1100;0515800014;;;F;;176;1.000;ST;L;X;0;ZMAT;20050101;20060109;00000000;2008-02-28 02:14:12 1100;0517530095;;;E;CT;1;01;305;;0020;1100;0517530015;;;F;;176;2.000;ST;L;X;0;ZMAT;20050101;20060109;00000000;2008-02-28 02:14:12 1100;0909100260;;;E;CT;1;01;305;;0010;1100;0909100200;;;F;;140;1.000;ST;L;X;0;ZMAT;20040425;20050427;00000000;2008-02-28 02:14:12 1100;0909100260;;;E;CT;1;01;305;;0020;1100;4150166760;;;F;;140;1.000;ST;L;X;0;ZMAT;20040425;20050427;00000000;2008-02-28 02:14:12 1100;0909100260;;;E;CT;1;01;305;;0030;1100;9900000301;;;F;;140;1.000;ST;L;X;0;ZMAT;20040425;20050427;00000000;2008-02-28 02:14:12 1100;0909100290;;;E;CT;1;01;305;;0010;1100;0909100200;;;F;;140;1.000;ST;L;X;0;ZMAT;20040425;20050427;00000000;2008-02-28 02:14:12 1100;0909100290;;;E;CT;1;01;305;;0020;1100;4150166760;;;F;;140;1.000;ST;L;X;0;ZMAT;20040425;20050427;00000000;2008-02-28 02:14:12 1100;0909100290;;;E;CT;1;01;305;;0030;1100;9900000301;;;F;;140;1.000;ST;L;X;0;ZMAT;20040425;20050427;00000000;2008-02-28 02:14:12 1100;1000000001;Z0;;X;;1;01;178;;0010;1100;0217110041;;;F;;140;2.000;ST;L;X;0;ZMAT;20040425;20050427;00000000;2008-02-28 02:14:12 1100;1000000001;Z0;;X;;1;01;178;;0020;1100;0217110042;;;F;;140;2.000;ST;L;X;0;ZMAT;20040425;20050427;00000000;2008-02-28 02:14:12 1100;1000000001;Z0;;X;;1;01;178;;0030;1100;0661100048;;;F;;140;2.000;ST;L;X;0;ZMAT;20040425;20050427;00000000;2008-02-28 02:14:12 1100;1000000001;Z0;;X;;1;01;178;;0040;1100;4175080801;;;F;;143;1.000;ST;L;X;0;ZMAT;20040425;20050427;00000000;2008-02-28 02:14:12 1100;1000000001;Z0;;X;;1;01;178;;0050;1100;4175088502;;;F;;176;1.000;ST;L;X;0;ZMAT;20040425;20050427;00000000;2008-02-28 02:14:12 1100;2050002813;;;E;;1;01;201;;0010;1100;0054371339;;;F;;184;0.212;KG;L;X;;ROH;20051231;20070125;00000000;2008-02-28 02:14:12 1100;2050114272;;;E;CT;1;01;326;;0005;1100;0335212500;;;F;;140;1.000;ST;L;X;0;ZMAT;20050101;20070917;00000000;2008-02-28 02:14:12 1100;2050114272;;;E;CT;1;01;326;;0006;1100;4250189400;;;F;;143;1.000;ST;L;X;0;ZMAT;20050101;20070917;00000000;2008-02-28 02:14:12 1100;2050114272;;;E;CT;1;01;326;;0007;1100;4250202101;;;F;;143;1.000;ST;L;X;0;ZMAT;20050101;20070917;00000000;2008-02-28 02:14:12 1100;2050114272;;;E;CT;1;01;326;;0008;1100;4250201900;;;F;;143;1.000;ST;L;X;0;ZMAT;20050101;20070917;00000000;2008-02-28 02:14:12 1100;2050114272;;;E;CT;1;01;326;;0009;1100;4250202111;;;F;;143;1.000;ST;L;X;0;ZMAT;20050101;20070917;00000000;2008-02-28 02:14:12 1100;2050114272;;;E;CT;1;01;326;;0011;1100;0663210246;;;F;;140;1.000;ST;L;X;0;ZMAT;20050101;20070917;00000000;2008-02-28 02:14:12 1100;2050114272;;;E;CT;1;01;326;;0012;1100;4250222200;;;F;;176;1.000;ST;L;X;0;ZMAT;20050101;20070917;00000000;2008-02-28 02:14:12 1100;2050114272;;;E;CT;1;01;326;;0013;1100;0663900300;;;F;;140;1.000;ST;L;X;0;ZMAT;20050101;20070917;00000000;2008-02-28 02:14:12
   [29 Feb 2008 10:27]
   Lars Johansson        
  Hi,
You can create the table in vs 5.1.22 and still se the garbage in vs 5.1.23.
I reproduced the bug with following script and supplied file.
CREATE TABLE DB3_BOM_PROD_LJ1(  PRIMARY KEY COMP1 (P_PLANT, P_MATNR, BOM_USE, ALT_BOM, POSNR, C_PLANT, C_MATNR) ,INDEX COMP2 (P_PLANT,  P_MATNR, ALT_BOM ,BOM_USE) ,P_PLANT  CHAR(4)  ,INDEX P_PLANT (P_PLANT) ,P_MATNR  CHAR(18)  ,INDEX P_MATNR (P_MATNR) ,P_REFCD  CHAR(2)  ,P_DIS_CON_IND CHAR(1)  ,P_PRO_TYPE  CHAR(1)  ,P_SPEC_PRO CHAR(2)  ,BOM_USE CHAR(1)  ,ALT_BOM CHAR(2)   ,P_MRP_CON  CHAR(3)  ,DISCON_IND CHAR(1)  ,POSNR    CHAR(4)  ,C_PLANT   CHAR(4)  ,INDEX C_PLANT (C_PLANT) ,C_MATNR   CHAR(18)  ,INDEX C_MATNR (C_MATNR) ,C_REFCD   CHAR(2)  ,C_DIS_CON_IND CHAR(1)  ,C_PRO_TYPE CHAR(1)  ,C_SPEC_PRO CHAR(2)  ,C_MRP_CON  CHAR(3)  ,QTY  NUMERIC (13,3) ,UNIT CHAR(3)  ,ITEM_CAT   CHAR(1)  ,REL_COST CHAR(1)  ,SORT_STR CHAR(10)  ,MAT_TYPE CHAR(4)  ,VALID_FR   DATE ,CREATED_DATE DATE ,CHANGED_DATE DATE ,CREATED DATETIME );
Query OK, 0 rows affected (0.01 sec)
LOAD DATA LOCAL INFILE '/home/actaadm/dw_data_mngr/data/080229040205_dts_bom/dts_bom_prod/DTS_STPO_PROD_LJ.TXT'                         
    ->     REPLACE
    ->     INTO TABLE DB3_BOM_PROD_LJ1
    ->     FIELDS
    ->            TERMINATED BY ';'
    ->     IGNORE 0 LINES
    -> ;
Query OK, 3500 rows affected (0.20 sec)
Records: 3500  Deleted: 0  Skipped: 0  Warnings: 0
select distinct P_PLANT, P_MATNR,ALT_BOM,BOM_USE from DB3_BOM_PROD_LJ1  order by  P_PLANT, P_MATNR,ALT_BOM,BOM_USE limit 25;
 
   [11 Mar 2008 8:26]
   Susanne Ebrecht        
  Lars, many thanks for reporting this bug. We can reproduce it without problems ... The bug in analyzing status because I am on the topic to figure out more details at the moment.
   [11 Mar 2008 14:01]
   Susanne Ebrecht        
  That the "SELECT" displayed the right results after "CHECK TABLE" is the result of bug #35212 I am still on my way to analyze what's wrong with "Index + Load data infile" here.
   [11 Mar 2008 15:12]
   Susanne Ebrecht        
  This bug needs a long time for analysing. The problem here is that MyISAM seems to get confused when limit is higher then 9 by having a PK and an index with the same columns but different order. I will attache a dump for reproducing. mysql> select distinct a,b,d,c from test order by a,b,d,c limit 10; Primary key is: a,b,c,d,e Index is: a,b,d,c This will only display nothing and Yen-sign when you have both: PK and Index. When you drop Index or PK it will show you the right result. It also doesn't matter if you make a "load data infile" or extended insert or a single insert statement for every row. Consider, this only occurs when limit is 10 or higher.
   [11 Mar 2008 15:14]
   Susanne Ebrecht        
  dump for reproducing
Attachment: bug34928.dump (application/octet-stream, text), 131.82 KiB.
   [12 Mar 2008 13:48]
   Susanne Ebrecht        
  Just to be sure this is a MyISAM problem. I also tested this with Innodb and Memory and both don't get confused with this indexes. They work as expected. Only MyISAM has this problem.
   [20 Mar 2008 10:07]
   Mattias Jonsson        
  Smaller dump that still shows the bug
Attachment: bug34928_small.dump (application/octet-stream, text), 4.12 KiB.
   [20 Mar 2008 10:08]
   Mattias Jonsson        
  Test case for the bug
Attachment: bug34928.test (application/octet-stream, text), 1.20 KiB.
   [26 Mar 2008 15:54]
   Alexey Kopytov        
  A shorter test case:
CREATE TABLE t1(a INT, b INT, c INT, d INT, e INT, 
                PRIMARY KEY(a,b,c,d,e), 
                KEY(a,b,d,c) 
); 
 
INSERT INTO t1(a, b, c) VALUES (1, 1, 1), 
                               (1, 1, 2), 
                               (1, 1, 3), 
                               (1, 2, 1), 
                               (1, 2, 2), 
                               (1, 2, 3); 
 
EXPLAIN SELECT DISTINCT a, b, d, c FROM t1; 
 
SELECT DISTINCT a, b, d, c FROM t1;
 
   [26 Mar 2008 16:38]
   Bugs System        
  A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/44461 ChangeSet@1.2569, 2008-03-26 19:37:36+03:00, kaa@kaamos.(none) +3 -0 Fix for bug #34928: Confusion by having Primary Key and Index The bug is a regression introduced in 5.1 by the patch for bug28404. Under some circumstances test_if_skip_sort_order() could leave some data structures in an inconsistent state so that some parts of code could assume the selected execution strategy for GROUP BY/DISTINCT as a loose index scan (e.g. JOIN_TAB::is_using_loose_index_scan()), while the actual strategy chosen was an ordered index scan, which led to wrong data being returned. Fixed test_if_skip_sort_order() so that when changing the type for a join table, select->quick is reset not only for EXPLAIN, but for the actual join execution as well, to not confuse code that depends on its value to determine the chosen GROUP BY/DISTINCT strategy.
   [31 Mar 2008 14:54]
   Bugs System        
  Pushed into 5.1.24-rc
   [2 Apr 2008 19:01]
   Paul DuBois        
  Noted in 5.1.24 changelog. For some queries, the optimizer used an ordered index scan for GROUP BY or DISTINCT when it was supposed to use a loose index scan, leading to incorrect results. Resetting report to Patch queued waiting for push into 6.0.x.
   [3 Apr 2008 13:02]
   Bugs System        
  Pushed into 6.0.5-alpha
   [7 Apr 2008 17:31]
   Paul DuBois        
  Noted in 6.0.5 changelog.

