Loading mysql-test/r/row.result +18 −0 Original line number Diff line number Diff line Loading @@ -170,3 +170,21 @@ ROW(2,10) <=> ROW(3,4) SELECT ROW(NULL,10) <=> ROW(3,NULL); ROW(NULL,10) <=> ROW(3,NULL) 0 SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),ROW(1,1)); ERROR 21000: Operand should contain 2 column(s) SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),ROW(1,1),ROW(1,ROW(2,3))); ERROR 21000: Operand should contain 2 column(s) SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),ROW(1,ROW(2,2,2))); ERROR 21000: Operand should contain 2 column(s) SELECT ROW(1,ROW(2,3,4)) IN (ROW(1,ROW(2,3,4)),ROW(1,ROW(2,2))); ERROR 21000: Operand should contain 3 column(s) SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),(SELECT 1,1)); ERROR 21000: Operand should contain 2 column(s) SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),(SELECT 1,1),ROW(1,ROW(2,4))); ERROR 21000: Operand should contain 2 column(s) SELECT ROW(1,ROW(2,3)) IN ((SELECT 1,1),ROW(1,ROW(2,3))); ERROR 21000: Operand should contain 2 column(s) SELECT ROW(2,1) IN (ROW(21,2),ROW(ROW(1,1,3),0)); ERROR 21000: Operand should contain 1 column(s) SELECT ROW(2,1) IN (ROW(ROW(1,1,3),0),ROW(21,2)); ERROR 21000: Operand should contain 1 column(s) mysql-test/t/row.test +25 −0 Original line number Diff line number Diff line Loading @@ -83,4 +83,29 @@ drop table t1; SELECT ROW(2,10) <=> ROW(3,4); SELECT ROW(NULL,10) <=> ROW(3,NULL); # # Bug #27484: nested row expressions in IN predicate # --error 1241 SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),ROW(1,1)); --error 1241 SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),ROW(1,1),ROW(1,ROW(2,3))); --error 1241 SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),ROW(1,ROW(2,2,2))); --error 1241 SELECT ROW(1,ROW(2,3,4)) IN (ROW(1,ROW(2,3,4)),ROW(1,ROW(2,2))); --error 1241 SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),(SELECT 1,1)); --error 1241 SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),(SELECT 1,1),ROW(1,ROW(2,4))); --error 1241 SELECT ROW(1,ROW(2,3)) IN ((SELECT 1,1),ROW(1,ROW(2,3))); --error 1241 SELECT ROW(2,1) IN (ROW(21,2),ROW(ROW(1,1,3),0)); --error 1241 SELECT ROW(2,1) IN (ROW(ROW(1,1,3),0),ROW(21,2)); # End of 4.1 tests ndb/src/kernel/blocks/ERROR_codes.txt +6 −1 Original line number Diff line number Diff line Loading @@ -6,7 +6,7 @@ Next DBTUP 4014 Next DBLQH 5043 Next DBDICT 6006 Next DBDIH 7178 Next DBTC 8038 Next DBTC 8039 Next CMVMI 9000 Next BACKUP 10022 Next DBUTIL 11002 Loading Loading @@ -285,6 +285,11 @@ ABORT OF TCKEYREQ 8037 : Invalid schema version in TCINDXREQ ------ 8038 : Simulate API disconnect just after SCAN_TAB_REQ CMVMI ----- 9000 Set RestartOnErrorInsert to restart -n Loading ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp +10 −12 Original line number Diff line number Diff line Loading @@ -311,6 +311,16 @@ void Cmvmi::execSTTOR(Signal* signal) jamEntry(); if (theStartPhase == 1){ jam(); if(theConfig.lockPagesInMainMemory()) { int res = NdbMem_MemLockAll(); if(res != 0){ g_eventLogger.warning("Failed to memlock pages"); warningEvent("Failed to memlock pages"); } } sendSTTORRY(signal); return; } else if (theStartPhase == 3) { Loading @@ -330,18 +340,6 @@ void Cmvmi::execSTTOR(Signal* signal) signal->theData[2] = NodeInfo::REP; execOPEN_COMREQ(signal); globalData.theStartLevel = NodeState::SL_STARTED; sendSTTORRY(signal); } else { jam(); if(theConfig.lockPagesInMainMemory()){ int res = NdbMem_MemLockAll(); if(res != 0){ g_eventLogger.warning("Failed to memlock pages"); warningEvent("Failed to memlock pages"); } } sendSTTORRY(signal); } } Loading ndb/src/kernel/blocks/dbtc/DbtcMain.cpp +36 −2 Original line number Diff line number Diff line Loading @@ -8619,6 +8619,20 @@ void Dbtc::execSCAN_TABREQ(Signal* signal) * IF ANY TO RECEIVE. **********************************************************/ scanptr.p->scanState = ScanRecord::WAIT_AI; if (ERROR_INSERTED(8038)) { /** * Force API_FAILREQ */ DisconnectRep * const rep = (DisconnectRep *)signal->getDataPtrSend(); rep->nodeId = refToNode(apiConnectptr.p->ndbapiBlockref); rep->err = 8038; EXECUTE_DIRECT(CMVMI, GSN_DISCONNECT_REP, signal, 2); CLEAR_ERROR_INSERT_VALUE; } return; SCAN_error_check: Loading Loading @@ -8706,6 +8720,7 @@ void Dbtc::initScanrec(ScanRecordPtr scanptr, jam(); ScanFragRecPtr ptr; ndbrequire(list.seize(ptr)); ptr.p->scanFragState = ScanFragRec::IDLE; ptr.p->scanRec = scanptr.i; ptr.p->scanFragId = 0; ptr.p->m_apiPtr = cdata[i]; Loading Loading @@ -9457,9 +9472,17 @@ Dbtc::close_scan_req(Signal* signal, ScanRecordPtr scanPtr, bool req_received){ ScanRecord* scanP = scanPtr.p; ndbrequire(scanPtr.p->scanState != ScanRecord::IDLE); ScanRecord::ScanState old = scanPtr.p->scanState; scanPtr.p->scanState = ScanRecord::CLOSING_SCAN; scanPtr.p->m_close_scan_req = req_received; if (old == ScanRecord::WAIT_FRAGMENT_COUNT) { jam(); scanPtr.p->scanState = old; return; // Will continue on execDI_FCOUNTCONF } /** * Queue : Action * ============= : ================= Loading Loading @@ -9487,11 +9510,22 @@ Dbtc::close_scan_req(Signal* signal, ScanRecordPtr scanPtr, bool req_received){ ScanFragRecPtr curr = ptr; // Remove while iterating... running.next(ptr); if(curr.p->scanFragState == ScanFragRec::WAIT_GET_PRIMCONF){ switch(curr.p->scanFragState){ case ScanFragRec::IDLE: jam(); // real early abort ndbrequire(old == ScanRecord::WAIT_AI); running.release(curr); continue; case ScanFragRec::WAIT_GET_PRIMCONF: jam(); continue; case ScanFragRec::LQH_ACTIVE: jam(); break; default: jamLine(curr.p->scanFragState); ndbrequire(false); } ndbrequire(curr.p->scanFragState == ScanFragRec::LQH_ACTIVE); curr.p->startFragTimer(ctcTimer); curr.p->scanFragState = ScanFragRec::LQH_ACTIVE; Loading Loading
mysql-test/r/row.result +18 −0 Original line number Diff line number Diff line Loading @@ -170,3 +170,21 @@ ROW(2,10) <=> ROW(3,4) SELECT ROW(NULL,10) <=> ROW(3,NULL); ROW(NULL,10) <=> ROW(3,NULL) 0 SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),ROW(1,1)); ERROR 21000: Operand should contain 2 column(s) SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),ROW(1,1),ROW(1,ROW(2,3))); ERROR 21000: Operand should contain 2 column(s) SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),ROW(1,ROW(2,2,2))); ERROR 21000: Operand should contain 2 column(s) SELECT ROW(1,ROW(2,3,4)) IN (ROW(1,ROW(2,3,4)),ROW(1,ROW(2,2))); ERROR 21000: Operand should contain 3 column(s) SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),(SELECT 1,1)); ERROR 21000: Operand should contain 2 column(s) SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),(SELECT 1,1),ROW(1,ROW(2,4))); ERROR 21000: Operand should contain 2 column(s) SELECT ROW(1,ROW(2,3)) IN ((SELECT 1,1),ROW(1,ROW(2,3))); ERROR 21000: Operand should contain 2 column(s) SELECT ROW(2,1) IN (ROW(21,2),ROW(ROW(1,1,3),0)); ERROR 21000: Operand should contain 1 column(s) SELECT ROW(2,1) IN (ROW(ROW(1,1,3),0),ROW(21,2)); ERROR 21000: Operand should contain 1 column(s)
mysql-test/t/row.test +25 −0 Original line number Diff line number Diff line Loading @@ -83,4 +83,29 @@ drop table t1; SELECT ROW(2,10) <=> ROW(3,4); SELECT ROW(NULL,10) <=> ROW(3,NULL); # # Bug #27484: nested row expressions in IN predicate # --error 1241 SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),ROW(1,1)); --error 1241 SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),ROW(1,1),ROW(1,ROW(2,3))); --error 1241 SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),ROW(1,ROW(2,2,2))); --error 1241 SELECT ROW(1,ROW(2,3,4)) IN (ROW(1,ROW(2,3,4)),ROW(1,ROW(2,2))); --error 1241 SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),(SELECT 1,1)); --error 1241 SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),(SELECT 1,1),ROW(1,ROW(2,4))); --error 1241 SELECT ROW(1,ROW(2,3)) IN ((SELECT 1,1),ROW(1,ROW(2,3))); --error 1241 SELECT ROW(2,1) IN (ROW(21,2),ROW(ROW(1,1,3),0)); --error 1241 SELECT ROW(2,1) IN (ROW(ROW(1,1,3),0),ROW(21,2)); # End of 4.1 tests
ndb/src/kernel/blocks/ERROR_codes.txt +6 −1 Original line number Diff line number Diff line Loading @@ -6,7 +6,7 @@ Next DBTUP 4014 Next DBLQH 5043 Next DBDICT 6006 Next DBDIH 7178 Next DBTC 8038 Next DBTC 8039 Next CMVMI 9000 Next BACKUP 10022 Next DBUTIL 11002 Loading Loading @@ -285,6 +285,11 @@ ABORT OF TCKEYREQ 8037 : Invalid schema version in TCINDXREQ ------ 8038 : Simulate API disconnect just after SCAN_TAB_REQ CMVMI ----- 9000 Set RestartOnErrorInsert to restart -n Loading
ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp +10 −12 Original line number Diff line number Diff line Loading @@ -311,6 +311,16 @@ void Cmvmi::execSTTOR(Signal* signal) jamEntry(); if (theStartPhase == 1){ jam(); if(theConfig.lockPagesInMainMemory()) { int res = NdbMem_MemLockAll(); if(res != 0){ g_eventLogger.warning("Failed to memlock pages"); warningEvent("Failed to memlock pages"); } } sendSTTORRY(signal); return; } else if (theStartPhase == 3) { Loading @@ -330,18 +340,6 @@ void Cmvmi::execSTTOR(Signal* signal) signal->theData[2] = NodeInfo::REP; execOPEN_COMREQ(signal); globalData.theStartLevel = NodeState::SL_STARTED; sendSTTORRY(signal); } else { jam(); if(theConfig.lockPagesInMainMemory()){ int res = NdbMem_MemLockAll(); if(res != 0){ g_eventLogger.warning("Failed to memlock pages"); warningEvent("Failed to memlock pages"); } } sendSTTORRY(signal); } } Loading
ndb/src/kernel/blocks/dbtc/DbtcMain.cpp +36 −2 Original line number Diff line number Diff line Loading @@ -8619,6 +8619,20 @@ void Dbtc::execSCAN_TABREQ(Signal* signal) * IF ANY TO RECEIVE. **********************************************************/ scanptr.p->scanState = ScanRecord::WAIT_AI; if (ERROR_INSERTED(8038)) { /** * Force API_FAILREQ */ DisconnectRep * const rep = (DisconnectRep *)signal->getDataPtrSend(); rep->nodeId = refToNode(apiConnectptr.p->ndbapiBlockref); rep->err = 8038; EXECUTE_DIRECT(CMVMI, GSN_DISCONNECT_REP, signal, 2); CLEAR_ERROR_INSERT_VALUE; } return; SCAN_error_check: Loading Loading @@ -8706,6 +8720,7 @@ void Dbtc::initScanrec(ScanRecordPtr scanptr, jam(); ScanFragRecPtr ptr; ndbrequire(list.seize(ptr)); ptr.p->scanFragState = ScanFragRec::IDLE; ptr.p->scanRec = scanptr.i; ptr.p->scanFragId = 0; ptr.p->m_apiPtr = cdata[i]; Loading Loading @@ -9457,9 +9472,17 @@ Dbtc::close_scan_req(Signal* signal, ScanRecordPtr scanPtr, bool req_received){ ScanRecord* scanP = scanPtr.p; ndbrequire(scanPtr.p->scanState != ScanRecord::IDLE); ScanRecord::ScanState old = scanPtr.p->scanState; scanPtr.p->scanState = ScanRecord::CLOSING_SCAN; scanPtr.p->m_close_scan_req = req_received; if (old == ScanRecord::WAIT_FRAGMENT_COUNT) { jam(); scanPtr.p->scanState = old; return; // Will continue on execDI_FCOUNTCONF } /** * Queue : Action * ============= : ================= Loading Loading @@ -9487,11 +9510,22 @@ Dbtc::close_scan_req(Signal* signal, ScanRecordPtr scanPtr, bool req_received){ ScanFragRecPtr curr = ptr; // Remove while iterating... running.next(ptr); if(curr.p->scanFragState == ScanFragRec::WAIT_GET_PRIMCONF){ switch(curr.p->scanFragState){ case ScanFragRec::IDLE: jam(); // real early abort ndbrequire(old == ScanRecord::WAIT_AI); running.release(curr); continue; case ScanFragRec::WAIT_GET_PRIMCONF: jam(); continue; case ScanFragRec::LQH_ACTIVE: jam(); break; default: jamLine(curr.p->scanFragState); ndbrequire(false); } ndbrequire(curr.p->scanFragState == ScanFragRec::LQH_ACTIVE); curr.p->startFragTimer(ctcTimer); curr.p->scanFragState = ScanFragRec::LQH_ACTIVE; Loading