Commit f48a7ad2 authored by unknown's avatar unknown

Merge mskold@bk-internal.mysql.com:/home/bk/mysql-5.0-ndb

into  mysql.com:/windows/Linux_space/MySQL/mysql-5.0-ndb
parents 040491a9 de1eced0
...@@ -398,3 +398,10 @@ INSERT INTO t1 VALUES (1,1),(2,2),(3,3); ...@@ -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); UPDATE t1 SET var2 = 9 WHERE var1 IN(1,2,3);
DROP TRIGGER testtrigger; DROP TRIGGER testtrigger;
DROP TABLE t1, t2; 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;
...@@ -282,3 +282,12 @@ UPDATE t1 SET var2 = 9 WHERE var1 IN(1,2,3); ...@@ -282,3 +282,12 @@ UPDATE t1 SET var2 = 9 WHERE var1 IN(1,2,3);
DROP TRIGGER testtrigger; DROP TRIGGER testtrigger;
DROP TABLE t1, t2; 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;
...@@ -63,12 +63,14 @@ public: ...@@ -63,12 +63,14 @@ public:
bool order_by, bool order_by,
bool order_desc = false, bool order_desc = false,
bool read_range_no = false, bool read_range_no = false,
bool keyinfo = false) { bool keyinfo = false,
bool multi_range = false) {
Uint32 scan_flags = Uint32 scan_flags =
(SF_OrderBy & -(Int32)order_by) | (SF_OrderBy & -(Int32)order_by) |
(SF_Descending & -(Int32)order_desc) | (SF_Descending & -(Int32)order_desc) |
(SF_ReadRangeNo & -(Int32)read_range_no) | (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); return readTuples(lock_mode, scan_flags, parallel, batch);
} }
......
...@@ -37,13 +37,15 @@ class NdbScanOperation : public NdbOperation { ...@@ -37,13 +37,15 @@ class NdbScanOperation : public NdbOperation {
public: public:
/** /**
* Scan flags. OR-ed together and passed as second argument to * Scan flags. OR-ed together and passed as second argument to
* readTuples. * readTuples. Note that SF_MultiRange has to be set if several
* ranges (bounds) are to be passed.
*/ */
enum ScanFlag { enum ScanFlag {
SF_TupScan = (1 << 16), // scan TUP SF_TupScan = (1 << 16), // scan TUP
SF_OrderBy = (1 << 24), // index scan in order SF_OrderBy = (1 << 24), // index scan in order
SF_Descending = (2 << 24), // index scan in descending order SF_Descending = (2 << 24), // index scan in descending order
SF_ReadRangeNo = (4 << 24), // enable @ref get_range_no 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 SF_KeyInfo = 1 // request KeyInfo to be sent back
}; };
...@@ -70,7 +72,8 @@ public: ...@@ -70,7 +72,8 @@ public:
*/ */
#ifdef ndb_readtuples_impossible_overload #ifdef ndb_readtuples_impossible_overload
int readTuples(LockMode lock_mode = LM_Read, 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 = false);
#endif #endif
inline int readTuples(int parallell){ inline int readTuples(int parallell){
...@@ -262,6 +265,7 @@ protected: ...@@ -262,6 +265,7 @@ protected:
bool m_descending; bool m_descending;
Uint32 m_read_range_no; Uint32 m_read_range_no;
NdbRecAttr *m_curr_row; // Pointer to last returned row NdbRecAttr *m_curr_row; // Pointer to last returned row
bool m_multi_range; // Mark if operation is part of multi-range scan
}; };
inline inline
......
...@@ -1188,7 +1188,7 @@ NdbIndexScanOperation::setBound(const NdbColumnImpl* tAttrInfo, ...@@ -1188,7 +1188,7 @@ NdbIndexScanOperation::setBound(const NdbColumnImpl* tAttrInfo,
* so it's safe to use [tIndexAttrId] * so it's safe to use [tIndexAttrId]
* (instead of looping as is NdbOperation::equal_impl) * (instead of looping as is NdbOperation::equal_impl)
*/ */
if(type == BoundEQ && tDistrKey) if(type == BoundEQ && tDistrKey && !m_multi_range)
{ {
theNoOfTupKeyLeft--; theNoOfTupKeyLeft--;
return handle_distribution_key((Uint64*)aValue, sizeInWords); return handle_distribution_key((Uint64*)aValue, sizeInWords);
...@@ -1249,7 +1249,8 @@ NdbIndexScanOperation::readTuples(LockMode lm, ...@@ -1249,7 +1249,8 @@ NdbIndexScanOperation::readTuples(LockMode lm,
const bool order_by = scan_flags & SF_OrderBy; const bool order_by = scan_flags & SF_OrderBy;
const bool order_desc = scan_flags & SF_Descending; const bool order_desc = scan_flags & SF_Descending;
const bool read_range_no = scan_flags & SF_ReadRangeNo; 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); int res = NdbScanOperation::readTuples(lm, scan_flags, parallel, batch);
if(!res && read_range_no) if(!res && read_range_no)
{ {
...@@ -1716,6 +1717,12 @@ NdbIndexScanOperation::reset_bounds(bool forceSend){ ...@@ -1716,6 +1717,12 @@ NdbIndexScanOperation::reset_bounds(bool forceSend){
int int
NdbIndexScanOperation::end_of_bound(Uint32 no) NdbIndexScanOperation::end_of_bound(Uint32 no)
{ {
DBUG_ENTER("end_of_bound");
DBUG_PRINT("info", ("Range number %u", no));
/* Check that SF_MultiRange has been specified if more
than one range is specified */
if (no > 0 && !m_multi_range)
DBUG_RETURN(-1);
if(no < (1 << 13)) // Only 12-bits no of ranges if(no < (1 << 13)) // Only 12-bits no of ranges
{ {
Uint32 bound_head = * m_first_bound_word; Uint32 bound_head = * m_first_bound_word;
...@@ -1724,9 +1731,9 @@ NdbIndexScanOperation::end_of_bound(Uint32 no) ...@@ -1724,9 +1731,9 @@ NdbIndexScanOperation::end_of_bound(Uint32 no)
m_first_bound_word = theKEYINFOptr + theTotalNrOfKeyWordInSignal;; m_first_bound_word = theKEYINFOptr + theTotalNrOfKeyWordInSignal;;
m_this_bound_start = theTupKeyLen; m_this_bound_start = theTupKeyLen;
return 0; DBUG_RETURN(0);
} }
return -1; DBUG_RETURN(-1);
} }
int int
......
...@@ -1995,8 +1995,7 @@ int ha_ndbcluster::set_bounds(NdbIndexScanOperation *op, ...@@ -1995,8 +1995,7 @@ int ha_ndbcluster::set_bounds(NdbIndexScanOperation *op,
DBUG_PRINT("error", ("key %d unknown flag %d", j, p.key->flag)); DBUG_PRINT("error", ("key %d unknown flag %d", j, p.key->flag));
DBUG_ASSERT(FALSE); DBUG_ASSERT(FALSE);
// Stop setting bounds but continue with what we have // Stop setting bounds but continue with what we have
op->end_of_bound(range_no); DBUG_RETURN(op->end_of_bound(range_no));
DBUG_RETURN(0);
} }
} }
} }
...@@ -2043,8 +2042,7 @@ int ha_ndbcluster::set_bounds(NdbIndexScanOperation *op, ...@@ -2043,8 +2042,7 @@ int ha_ndbcluster::set_bounds(NdbIndexScanOperation *op,
tot_len+= part_store_len; tot_len+= part_store_len;
} }
op->end_of_bound(range_no); DBUG_RETURN(op->end_of_bound(range_no));
DBUG_RETURN(0);
} }
/* /*
...@@ -6364,7 +6362,7 @@ ha_ndbcluster::read_multi_range_first(KEY_MULTI_RANGE **found_range_p, ...@@ -6364,7 +6362,7 @@ ha_ndbcluster::read_multi_range_first(KEY_MULTI_RANGE **found_range_p,
} }
else if ((scanOp= m_active_trans->getNdbIndexScanOperation(idx, tab)) else if ((scanOp= m_active_trans->getNdbIndexScanOperation(idx, tab))
&&!scanOp->readTuples(lm, 0, parallelism, sorted, &&!scanOp->readTuples(lm, 0, parallelism, sorted,
FALSE, TRUE, need_pk) FALSE, TRUE, need_pk, TRUE)
&&!generate_scan_filter(m_cond_stack, scanOp) &&!generate_scan_filter(m_cond_stack, scanOp)
&&!define_read_attrs(end_of_buffer-reclength, scanOp)) &&!define_read_attrs(end_of_buffer-reclength, scanOp))
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment