Commit ba8a684d authored by unknown's avatar unknown
Browse files

Fix for bug#25821 Excessive partition pruning for multi-range index scan in...

Fix for bug#25821  Excessive partition pruning for multi-range index scan in NDB API: don't set distribution key if multi_range


parent c9950f26
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -398,3 +398,10 @@ INSERT INTO t1 VALUES (1,1),(2,2),(3,3);
UPDATE t1 SET var2 = 9 WHERE var1 IN(1,2,3);
DROP TRIGGER testtrigger;
DROP TABLE t1, t2;
create table t2 (a int, b int, primary key (a), key ab (a,b)) engine=ndbcluster;
insert into t2 values (1,1), (10,10);
select * from t2 use index (ab) where a in(1,10) order by a;
a	b
1	1
10	10
drop table t2;
+9 −0
Original line number Diff line number Diff line
@@ -282,3 +282,12 @@ UPDATE t1 SET var2 = 9 WHERE var1 IN(1,2,3);
DROP TRIGGER testtrigger;

DROP TABLE t1, t2;

#bug#25821
create table t2 (a int, b int, primary key (a), key ab (a,b)) engine=ndbcluster;

insert into t2 values (1,1), (10,10);

select * from t2 use index (ab) where a in(1,10) order by a;

drop table t2;
+4 −2
Original line number Diff line number Diff line
@@ -64,12 +64,14 @@ public:
                        bool order_by,
                        bool order_desc = false,
                        bool read_range_no = false,
			bool keyinfo = false) {
			bool keyinfo = false,
			bool multi_range = false) {
    Uint32 scan_flags =
      (SF_OrderBy & -(Int32)order_by) |
      (SF_Descending & -(Int32)order_desc) |
      (SF_ReadRangeNo & -(Int32)read_range_no) | 
      (SF_KeyInfo & -(Int32)keyinfo);
      (SF_KeyInfo & -(Int32)keyinfo) |
      (SF_MultiRange & -(Int32)multi_range);
    
    return readTuples(lock_mode, scan_flags, parallel, batch);
  }
+4 −1
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ public:
    SF_OrderBy = (1 << 24),     // index scan in order
    SF_Descending = (2 << 24),  // index scan in descending order
    SF_ReadRangeNo = (4 << 24), // enable @ref get_range_no
    SF_MultiRange = (8 << 24),  // scan is part of multi-range scan
    SF_KeyInfo = 1              // request KeyInfo to be sent back
  };

@@ -71,7 +72,8 @@ public:
   */ 
#ifdef ndb_readtuples_impossible_overload
  int readTuples(LockMode lock_mode = LM_Read, 
		 Uint32 batch = 0, Uint32 parallel = 0, bool keyinfo = false);
		 Uint32 batch = 0, Uint32 parallel = 0, 
                 bool keyinfo = false, bool multi_range);
#endif
  
  inline int readTuples(int parallell){
@@ -263,6 +265,7 @@ protected:
  bool m_descending;
  Uint32 m_read_range_no;
  NdbRecAttr *m_curr_row; // Pointer to last returned row
  bool m_multi_range; // Mark if operation is part of multi-range scan
};

inline
+3 −2
Original line number Diff line number Diff line
@@ -1189,7 +1189,7 @@ NdbIndexScanOperation::setBound(const NdbColumnImpl* tAttrInfo,
     * so it's safe to use [tIndexAttrId] 
     * (instead of looping as is NdbOperation::equal_impl)
     */
    if(type == BoundEQ && tDistrKey)
    if(type == BoundEQ && tDistrKey && !m_multi_range)
    {
      theNoOfTupKeyLeft--;
      return handle_distribution_key((Uint64*)aValue, sizeInWords);
@@ -1250,6 +1250,7 @@ NdbIndexScanOperation::readTuples(LockMode lm,
  const bool order_by = scan_flags & SF_OrderBy;
  const bool order_desc = scan_flags & SF_Descending;
  const bool read_range_no = scan_flags & SF_ReadRangeNo;
  m_multi_range = scan_flags & SF_MultiRange;

  int res = NdbScanOperation::readTuples(lm, scan_flags, parallel, batch);
  if(!res && read_range_no)
Loading