Commit 03716f34 authored by pekka@mysql.com's avatar pekka@mysql.com

ndb - TUP interpreter: use byte length in attr OP const

parent 9ca2c7c6
...@@ -1837,12 +1837,8 @@ int Dbtup::interpreterNextLab(Signal* signal, ...@@ -1837,12 +1837,8 @@ int Dbtup::interpreterNextLab(Signal* signal,
tmpHabitant = attrId; tmpHabitant = attrId;
} }
// get type
attrId >>= 16; attrId >>= 16;
AttributeHeader ah(tmpArea[0]);
const char* s1 = (char*)&tmpArea[1];
const char* s2 = (char*)&TcurrentProgram[TprogramCounter+1];
Uint32 attrLen = (4 * ah.getDataSize());
Uint32 TattrDescrIndex = tabptr.p->tabDescriptor + Uint32 TattrDescrIndex = tabptr.p->tabDescriptor +
(attrId << ZAD_LOG_SIZE); (attrId << ZAD_LOG_SIZE);
Uint32 TattrDesc1 = tableDescriptor[TattrDescrIndex].tabDescr; Uint32 TattrDesc1 = tableDescriptor[TattrDescrIndex].tabDescr;
...@@ -1855,27 +1851,32 @@ int Dbtup::interpreterNextLab(Signal* signal, ...@@ -1855,27 +1851,32 @@ int Dbtup::interpreterNextLab(Signal* signal,
cs = tabptr.p->charsetArray[pos]; cs = tabptr.p->charsetArray[pos];
} }
const NdbSqlUtil::Type& sqlType = NdbSqlUtil::getType(typeId); const NdbSqlUtil::Type& sqlType = NdbSqlUtil::getType(typeId);
// get data
AttributeHeader ah(tmpArea[0]);
const char* s1 = (char*)&tmpArea[1];
const char* s2 = (char*)&TcurrentProgram[TprogramCounter+1];
// fixed length in 5.0
Uint32 attrLen = AttributeDescriptor::getSizeInBytes(TattrDesc1);
bool r1_null = ah.isNULL(); bool r1_null = ah.isNULL();
bool r2_null = argLen == 0; bool r2_null = argLen == 0;
int res; int res;
if(r1_null || r2_null) if (cond != Interpreter::LIKE &&
{ cond != Interpreter::NOT_LIKE) {
res = r1_null && r2_null ? 0 : r1_null ? -1 : 1; if (r1_null || r2_null) {
} // NULL==NULL and NULL<not-NULL
else if (cond != Interpreter::LIKE && res = r1_null && r2_null ? 0 : r1_null ? -1 : 1;
cond != Interpreter::NOT_LIKE) } else {
{ res = (*sqlType.m_cmp)(cs, s1, attrLen, s2, argLen, true);
/* --------------------------------------------------------- */ }
// If length of argument rounded to nearest word is } else {
// the same as attribute size, use that as argument size if (r1_null || r2_null) {
/* --------------------------------------------------------- */ // NULL like NULL is true (has no practical use)
if ((((argLen + 3) >> 2) << 2) == attrLen) argLen= attrLen; res = r1_null && r2_null ? 0 : -1;
res = (*sqlType.m_cmp)(cs, s1, attrLen, s2, argLen, true); } else {
} res = (*sqlType.m_like)(cs, s1, attrLen, s2, argLen);
else }
{
res = (*sqlType.m_like)(cs, s1, attrLen, s2, argLen);
} }
switch ((Interpreter::BinaryCondition)cond) { switch ((Interpreter::BinaryCondition)cond) {
......
...@@ -1027,13 +1027,15 @@ NdbOperation::branch_col(Uint32 type, ...@@ -1027,13 +1027,15 @@ NdbOperation::branch_col(Uint32 type,
} }
Uint32 sizeInBytes = col->m_attrSize * col->m_arraySize; Uint32 sizeInBytes = col->m_attrSize * col->m_arraySize;
if(len != 0 && len != sizeInBytes) if (! col->getCharType()) {
{ // prevent assert in NdbSqlUtil on length error
setErrorCodeAbort(4209); if(len != 0 && len != sizeInBytes)
return -1; {
setErrorCodeAbort(4209);
return -1;
}
len = sizeInBytes;
} }
len = sizeInBytes;
if (insertATTRINFO(Interpreter::BranchCol(c, 0, 0, false)) == -1) if (insertATTRINFO(Interpreter::BranchCol(c, 0, 0, false)) == -1)
return -1; return -1;
......
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