From 51f6578f803130a9d8b93116ac6b8fa2200b18ab Mon Sep 17 00:00:00 2001 From: Abdirahim Musse <33973272+abmusse@users.noreply.github.com> Date: Tue, 19 Jul 2022 14:12:17 -0500 Subject: [PATCH 1/6] fix: Alter table issue --- db2i_file.cc | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/db2i_file.cc b/db2i_file.cc index 09b2ae9..c730c3b 100644 --- a/db2i_file.cc +++ b/db2i_file.cc @@ -41,6 +41,9 @@ OF SUCH DAMAGE. #include "db2i_misc.h" #include "db2i_errors.h" #include "my_dir.h" +#undef min +#undef max +#include db2i_table::db2i_table(const TABLE_SHARE* myTable, const char* path) : @@ -346,14 +349,14 @@ size_t db2i_table::smartFilenameToTableName(const char *in, char* out, size_t ou { strncpy(out, in, outlen); my_free(test); - return min(outlen, strlen(out)); + return std::min(outlen, strlen(out)); } ++cur; } strncpy(out, test, outlen); my_free(test); - return min(outlen, strlen(out)); + return std::min(outlen, strlen(out)); } void db2i_table::filenameToTablename(const char* in, char* out, size_t outlen) @@ -371,14 +374,27 @@ void db2i_table::filenameToTablename(const char* in, char* out, size_t outlen) part2 = strstr(part1, "#P#"); if (part2) { + fprintf(stderr, "In if part2\n"); part3 = part2 + 3; part4 = strchr(part3, '#'); - if (!part4) + if (!part4){ + fprintf(stderr, "In if !part4\n"); part4 = strend(in); + } } - - memcpy(temp, part1, min(outlen, part2 - part1)); - temp[min(outlen-1, part2-part1)] = 0; + fprintf(stderr, "in %p, out %p, part1 %p, part2 %p, part3 %p, part 4 %p\n", in, out, part1, part2, part3, part4); + // fprintf(stderr, "in %s, out %s, part1 %s, part2 %s, part3 %s, part 4 %s\n", in, out, part1, part2, part3, part4); + fprintf(stderr, "outlen: %lu\n", outlen); + fprintf(stderr, "part2 - part1: %lu\n", (part2 - part1)); + fprintf(stderr, "len of part1: %lu\n", strlen(part1)); + size_t num_bytes = std::min(outlen, static_cast(part2 - part1)); + fprintf(stderr, "Num bytes passed to memcpy: %lu\n", num_bytes); + //memcpy(temp, part1, min(outlen, part2 - part1)); + //temp[min(outlen-1, part2-part1)] = 0; + memcpy(temp, part1, std::min(outlen, static_cast(part2 - part1))); + fprintf(stderr, "temp: %s\n", temp); + fprintf(stderr, "After memcpy\n"); + temp[std::min(outlen-1, static_cast(part2-part1))] = 0; int32 accumLen = smartFilenameToTableName(temp, out, outlen); @@ -387,8 +403,10 @@ void db2i_table::filenameToTablename(const char* in, char* out, size_t outlen) strcat(out, "#P#"); accumLen += 4; - memset(temp, 0, min(outlen, part2-part1)); - memcpy(temp, part3, min(outlen, part4-part3)); + // memset(temp, 0, min(outlen, part2-part1)); + // memcpy(temp, part3, min(outlen, part4-part3)); + memset(temp, 0, std::min(outlen, static_cast(part2-part1))); + memcpy(temp, part3, std::min(outlen, static_cast(part4-part3))); temp[min(outlen-1, part4-part3)] = 0; accumLen += smartFilenameToTableName(temp, strend(out), outlen-accumLen); @@ -496,7 +514,7 @@ int32 db2i_table::appendQualifiedIndexFileName(const char* indexName, strncat(generatedName, tableName+1, - min(strlen(tableName), (MAX_DB2_FILENAME_LENGTH-lenWithoutFile))-2 ); + std::min(strlen(tableName), static_cast(MAX_DB2_FILENAME_LENGTH-lenWithoutFile))-2 ); char finalName[MAX_DB2_FILENAME_LENGTH+1]; convertMySQLNameToDB2Name(generatedName, finalName, sizeof(finalName), true, (format==ASCII_SQL)); From 5eefbb0c267a3f2f58412d3a1d6b80366e843407 Mon Sep 17 00:00:00 2001 From: Abdirahim Musse <33973272+abmusse@users.noreply.github.com> Date: Fri, 12 Aug 2022 09:55:26 -0500 Subject: [PATCH 2/6] fixup! fix: Alter table issue --- db2i_blobCollection.cc | 4 +-- db2i_conversion.cc | 57 +++++++++++++++++++++++++++++------------- db2i_file.cc | 15 +---------- db2i_global.h | 5 ++-- db2i_ileBridge.cc | 4 ++- db2i_misc.cc | 4 ++- db2i_safeString.cc | 5 +++- db2i_safeString.h | 2 +- ha_ibmdb2i.cc | 22 ++++++++-------- 9 files changed, 67 insertions(+), 51 deletions(-) diff --git a/db2i_blobCollection.cc b/db2i_blobCollection.cc index 9f36894..2395af4 100644 --- a/db2i_blobCollection.cc +++ b/db2i_blobCollection.cc @@ -61,9 +61,9 @@ BlobCollection::getSizeToAllocate(int fieldIndex, bool& shouldProtect) uint curMaxSize = table->getBlobFieldActualSize(fieldIndex); - uint defaultAllocSize = min(defaultAllocation, fieldLength); + uint defaultAllocSize = std::min(defaultAllocation, fieldLength); - return max(defaultAllocSize, curMaxSize); + return std::max(defaultAllocSize, curMaxSize); } diff --git a/db2i_conversion.cc b/db2i_conversion.cc index 9b21fde..91ddb6c 100644 --- a/db2i_conversion.cc +++ b/db2i_conversion.cc @@ -535,13 +535,15 @@ int ha_ibmdb2i::getFieldTypeMapping(Field* field, { if (field->type() == MYSQL_TYPE_STRING) { - sprintf(stringBuildBuffer, "BINARY(%d)", max(fieldLength, 1)); + // type of fieldLength = uint32 + sprintf(stringBuildBuffer, "BINARY(%u)", std::max(fieldLength, 1u)); } else { if (fieldLength <= MAX_VARCHAR_LENGTH) { - sprintf(stringBuildBuffer, "VARBINARY(%d)", max(fieldLength, 1)); + // fieldLength = uint32 + sprintf(stringBuildBuffer, "VARBINARY(%u)", std::max(fieldLength, 1u)); } else if (blobMapping == AS_VARCHAR && (field->flags & PART_KEY_FLAG)) @@ -550,8 +552,9 @@ int ha_ibmdb2i::getFieldTypeMapping(Field* field, } else { - fieldLength = min(MAX_BLOB_LENGTH, fieldLength); - sprintf(stringBuildBuffer, "BLOB(%d)", max(fieldLength, 1)); + fieldLength = std::min(MAX_BLOB_LENGTH, fieldLength); + // fieldLength = uint32 + sprintf(stringBuildBuffer, "BLOB(%u)", std::max(fieldLength, 1u)); } } mapping.append(stringBuildBuffer); @@ -586,14 +589,17 @@ int ha_ibmdb2i::getFieldTypeMapping(Field* field, return 1; if (fieldCharSet->mbmaxlen > 1 && (!is_utf8 || is_utf8_general_ci)) { - sprintf(stringBuildBuffer, "GRAPHIC(%d)", max(fieldLength / fieldCharSet->mbmaxlen, 1)); // Number of characters + // type of fieldLength = uint32 + // mbmaxlen = uint + // 1u + sprintf(stringBuildBuffer, "GRAPHIC(%u)", std::max(fieldLength / fieldCharSet->mbmaxlen, 1u)); // Number of characters // Need to set CCSID to 1200 (UTF-16) when using multi-byte charsets // As well as when the collation is utf*_general_ci because of sort sequence issues db2Ccsid = 1200; } else { - sprintf(stringBuildBuffer, "CHAR(%d)", max(fieldLength, 1)); + sprintf(stringBuildBuffer, "CHAR(%u)", std::max(fieldLength, 1u)); } mapping.append(stringBuildBuffer); } @@ -603,14 +609,14 @@ int ha_ibmdb2i::getFieldTypeMapping(Field* field, { if (fieldCharSet->mbmaxlen > 1 && (!is_utf8 || is_utf8_general_ci)) { - sprintf(stringBuildBuffer, "VARGRAPHIC(%d)", max(fieldLength / fieldCharSet->mbmaxlen, 1)); // Number of characters + sprintf(stringBuildBuffer, "VARGRAPHIC(%u)", std::max(fieldLength / fieldCharSet->mbmaxlen, 1u)); // Number of characters // Need to set CCSID to 1200 (UTF-16) when using multi-byte charsets // As well as when the collation is utf*_general_ci because of sort sequence issues db2Ccsid = 1200; } else { - sprintf(stringBuildBuffer, "VARCHAR(%d)", max(fieldLength, 1)); + sprintf(stringBuildBuffer, "VARCHAR(%u)", std::max(fieldLength, 1u)); } } else if (blobMapping == AS_VARCHAR && @@ -630,18 +636,23 @@ int ha_ibmdb2i::getFieldTypeMapping(Field* field, } else { - fieldLength = min(MAX_BLOB_LENGTH, fieldLength); + // MAX_BLOB_LENGTH = uint32 + // fieldLength = uint32 + fieldLength = std::min(MAX_BLOB_LENGTH, fieldLength); if (fieldCharSet->mbmaxlen > 1 && (!is_utf8 || is_utf8_general_ci)) { - sprintf(stringBuildBuffer, "DBCLOB(%d)", max(fieldLength / fieldCharSet->mbmaxlen, 1)); // Number of characters + // fieldlength = uint32 + // mbmaxlen = uint + sprintf(stringBuildBuffer, "DBCLOB(%u)", std::max(fieldLength / fieldCharSet->mbmaxlen,1u)); // Number of characters // Need to set CCSID to 1200 (UTF-16) when using multi-byte charsets // As well as when the collation is utf*_general_ci because of sort sequence issues db2Ccsid = 1200; } else { - sprintf(stringBuildBuffer, "CLOB(%d)", max(fieldLength, 1)); // Number of characters + // fieldLength = uint32 + sprintf(stringBuildBuffer, "CLOB(%u)", std::max(fieldLength, 1u)); // Number of characters } } @@ -689,7 +700,9 @@ int32 ha_ibmdb2i::convertMySQLtoDB2(Field* field, const DB2Field& db2Field, char { uint precision= ((Field_new_decimal*)field)->precision; uint scale= field->decimals(); - uint db2Precision = min(precision, MAX_DEC_PRECISION); + // precison = uint + // MAX_DEC_PRECISION = uint32 + uint db2Precision = std::min(precision, MAX_DEC_PRECISION); uint truncationAmount = precision - db2Precision; if (scale >= truncationAmount) @@ -1160,8 +1173,12 @@ int32 ha_ibmdb2i::convertMySQLtoDB2(Field* field, const DB2Field& db2Field, char if (maxDisplayLength == 0 && db2FieldType == QMY_GRAPHIC) maxDb2BytesToStore = 2; else - maxDb2BytesToStore = min(((bytesToStore * 2) / fieldCharSet->mbminlen), - ((maxDisplayLength * 2) / fieldCharSet->mbmaxlen)); + // bytesToStore = uint32 + // field->mbinlen = uint + // maxDisplayLength = uint32 + // field->mbmaxlen = uint + maxDb2BytesToStore = std::min(bytesToStore * 2 / fieldCharSet->mbminlen, + maxDisplayLength * 2 / fieldCharSet->mbmaxlen); if (bytesToStore == 0) db2BytesToStore = 0; @@ -1205,8 +1222,12 @@ int32 ha_ibmdb2i::convertMySQLtoDB2(Field* field, const DB2Field& db2Field, char else // Else Far East, special UTF8 or non-special UTF8/UCS2 { size_t maxDb2BytesToStore; - maxDb2BytesToStore = min(((bytesToStore * 2) / fieldCharSet->mbminlen), - ((maxDisplayLength * 2) / fieldCharSet->mbmaxlen)); + // bytesToStore = uint32 + // field->mbinlen = uint + // maxDisplayLength = uint32 + // field->mbmaxlen = uint + maxDb2BytesToStore = std::min(bytesToStore * 2 / fieldCharSet->mbminlen, + maxDisplayLength * 2 / fieldCharSet->mbmaxlen); temp = getCharacterConversionBuffer(field->field_index, maxDb2BytesToStore); rc = convertFieldChars(toDB2, field->field_index, (char*)dataToStore,temp,bytesToStore, maxDb2BytesToStore, &db2BytesToStore); if (rc) @@ -1258,7 +1279,9 @@ int32 ha_ibmdb2i::convertDB2toMySQL(const DB2Field& db2Field, Field* field, cons { uint precision= ((Field_new_decimal*)field)->precision; uint scale= field->decimals(); - uint db2Precision = min(precision, MAX_DEC_PRECISION); + // precsion = uint + // MAX_DEC_PRECISION = uint32 + uint db2Precision = std::min(precision, MAX_DEC_PRECISION); uint decimalPlace = precision-scale+1; char temp[80]; diff --git a/db2i_file.cc b/db2i_file.cc index c730c3b..b1549b4 100644 --- a/db2i_file.cc +++ b/db2i_file.cc @@ -41,9 +41,6 @@ OF SUCH DAMAGE. #include "db2i_misc.h" #include "db2i_errors.h" #include "my_dir.h" -#undef min -#undef max -#include db2i_table::db2i_table(const TABLE_SHARE* myTable, const char* path) : @@ -382,15 +379,7 @@ void db2i_table::filenameToTablename(const char* in, char* out, size_t outlen) part4 = strend(in); } } - fprintf(stderr, "in %p, out %p, part1 %p, part2 %p, part3 %p, part 4 %p\n", in, out, part1, part2, part3, part4); - // fprintf(stderr, "in %s, out %s, part1 %s, part2 %s, part3 %s, part 4 %s\n", in, out, part1, part2, part3, part4); - fprintf(stderr, "outlen: %lu\n", outlen); - fprintf(stderr, "part2 - part1: %lu\n", (part2 - part1)); - fprintf(stderr, "len of part1: %lu\n", strlen(part1)); size_t num_bytes = std::min(outlen, static_cast(part2 - part1)); - fprintf(stderr, "Num bytes passed to memcpy: %lu\n", num_bytes); - //memcpy(temp, part1, min(outlen, part2 - part1)); - //temp[min(outlen-1, part2-part1)] = 0; memcpy(temp, part1, std::min(outlen, static_cast(part2 - part1))); fprintf(stderr, "temp: %s\n", temp); fprintf(stderr, "After memcpy\n"); @@ -403,11 +392,9 @@ void db2i_table::filenameToTablename(const char* in, char* out, size_t outlen) strcat(out, "#P#"); accumLen += 4; - // memset(temp, 0, min(outlen, part2-part1)); - // memcpy(temp, part3, min(outlen, part4-part3)); memset(temp, 0, std::min(outlen, static_cast(part2-part1))); memcpy(temp, part3, std::min(outlen, static_cast(part4-part3))); - temp[min(outlen-1, part4-part3)] = 0; + temp[std::min(static_cast(outlen-1), static_cast(part4-part3))] = 0; accumLen += smartFilenameToTableName(temp, strend(out), outlen-accumLen); diff --git a/db2i_global.h b/db2i_global.h index 0d08f6d..6108587 100644 --- a/db2i_global.h +++ b/db2i_global.h @@ -74,8 +74,7 @@ OF SUCH DAMAGE. * Explicit macro will be used. */ -#define min(a,b) ((long long)(a)>(long long)(b) ? (b) : (a)) -#define max(a,b) ((long long)(a)<(long long)(b) ? (b) : (a)) +#include #define db2i_beint16_from_ptr2leint16(V,M) \ do { int16 def_temp;\ @@ -159,7 +158,7 @@ const uint MAX_DB2_KEY_PARTS=120; const int MAX_DB2_V5R4_LIBNAME_LENGTH = 10; const int MAX_DB2_V6R1_LIBNAME_LENGTH = 30; const int MAX_DB2_SCHEMANAME_LENGTH=258; -const int MAX_DB2_FILENAME_LENGTH=258; +const uint32 MAX_DB2_FILENAME_LENGTH=258; const int MAX_DB2_COLNAME_LENGTH=128; const int MAX_DB2_SAVEPOINTNAME_LENGTH=128; const int MAX_DB2_QUALIFIEDNAME_LENGTH=MAX_DB2_V6R1_LIBNAME_LENGTH + 1 + MAX_DB2_FILENAME_LENGTH; diff --git a/db2i_ileBridge.cc b/db2i_ileBridge.cc index bf55b0a..113247d 100644 --- a/db2i_ileBridge.cc +++ b/db2i_ileBridge.cc @@ -612,7 +612,9 @@ int32 db2i_ileBridge::prepOpen(const char* statement, { Qmy_MSPO0100_output* output = (Qmy_MSPO0100_output*)parmBlock->outParms; *rfileHandle = output->ObjHnd; - *recLength = max(output->InNxtRowOff, output->OutNxtRowOff); + // output->InNxtRowOff = + // output->OutNxtRowOff = + *recLength = std::max(output->InNxtRowOff, output->OutNxtRowOff); } diff --git a/db2i_misc.cc b/db2i_misc.cc index e67e815..add9c64 100644 --- a/db2i_misc.cc +++ b/db2i_misc.cc @@ -100,7 +100,9 @@ EXTERN bool convertMySQLNameToDB2Name(const char* input, if (delimit) output[o++] = '"'; - output[min(o, outlen-1)] = 0; // This isn't the most user-friendly way to handle overflows, + // o = uint + // outlen = size_t + output[std::min( static_cast(o), outlen-1)] = 0; // This isn't the most user-friendly way to handle overflows, // but at least its safe. return (o <= outlen-1); } diff --git a/db2i_safeString.cc b/db2i_safeString.cc index ac5852f..88f0f1f 100644 --- a/db2i_safeString.cc +++ b/db2i_safeString.cc @@ -67,7 +67,10 @@ OF SUCH DAMAGE. SafeString& SafeString::strncat(const char* str, size_t len) { - uint64 amountToCopy = min((allocSize-1) - curPos, len); + // alllocSize = size_t + // curPos = size_t + // len = size_t + size_t amountToCopy = std::min(allocSize-1 - curPos, len); memcpy(buf + curPos, str, amountToCopy); curPos += amountToCopy; buf[curPos] = 0; diff --git a/db2i_safeString.h b/db2i_safeString.h index a1d5af2..17a5c75 100644 --- a/db2i_safeString.h +++ b/db2i_safeString.h @@ -65,7 +65,7 @@ class SafeString private: char* buf; - uint64 curPos; + size_t curPos; size_t allocSize; }; diff --git a/ha_ibmdb2i.cc b/ha_ibmdb2i.cc index 4953ec2..b5e974e 100644 --- a/ha_ibmdb2i.cc +++ b/ha_ibmdb2i.cc @@ -63,7 +63,7 @@ static const char __NOT_NULL_VALUE_EBCDIC = 0xF0; // '0' static const char __NULL_VALUE_EBCDIC = 0xF1; // '1' static const char __DEFAULT_VALUE_EBCDIC = 0xC4; // 'D' static const char BlankASPName[19] = " "; -static const int DEFAULT_MAX_ROWS_TO_BUFFER = 4096; +static const ha_rows DEFAULT_MAX_ROWS_TO_BUFFER = 4096; static const char SAVEPOINT_PREFIX[] = {0xD4, 0xE8, 0xE2, 0xD7}; // MYSP (in EBCDIC) @@ -2791,10 +2791,9 @@ int ha_ibmdb2i::prepReadBuffer(ha_rows rowsToRead, const db2i_file* file, char i forceSingleRowRead = true; rowsToRead = 1; } + rowsToRead = std::min(stats.records+1,std::min(rowsToRead, static_cast(DEFAULT_MAX_ROWS_TO_BUFFER))); - rowsToRead = min(stats.records+1,min(rowsToRead, DEFAULT_MAX_ROWS_TO_BUFFER)); - - uint bufSize = min((format->readRowLen * rowsToRead), THDVAR(thd, max_read_buffer_size)); + uint bufSize = std::min(format->readRowLen * rowsToRead, static_cast(THDVAR(thd, max_read_buffer_size))); multiRowReadBuf.allocBuf(format->readRowLen, format->readRowNullOffset, bufSize); activeReadBuf = &multiRowReadBuf; @@ -2830,9 +2829,9 @@ int ha_ibmdb2i::prepWriteBuffer(ha_rows rowsToWrite, const db2i_file* file) if (unlikely(rc)) DBUG_RETURN(rc); - rowsToWrite = min(rowsToWrite, DEFAULT_MAX_ROWS_TO_BUFFER); + rowsToWrite = std::min(rowsToWrite, DEFAULT_MAX_ROWS_TO_BUFFER); - uint bufSize = min((format->writeRowLen * rowsToWrite), THDVAR(ha_thd(), max_write_buffer_size)); + uint bufSize = std::min((format->writeRowLen * rowsToWrite), static_cast(THDVAR(ha_thd(), max_write_buffer_size))); multiRowWriteBuf.allocBuf(format->writeRowLen, format->writeRowNullOffset, bufSize); activeWriteBuf = &multiRowWriteBuf; @@ -2916,8 +2915,8 @@ int ha_ibmdb2i::flushWrite(FILE_HANDLE fileHandle, uchar* buf ) else { char unknownIndex[MAX_DB2_FILENAME_LENGTH+1]; - convFromEbcdic(lastDupKeyNamePtr, unknownIndex, min(lastDupKeyNameLen, MAX_DB2_FILENAME_LENGTH)); - unknownIndex[min(lastDupKeyNameLen, MAX_DB2_FILENAME_LENGTH)] = 0; + convFromEbcdic(lastDupKeyNamePtr, unknownIndex, std::min(lastDupKeyNameLen, static_cast(MAX_DB2_FILENAME_LENGTH))); + unknownIndex[std::min(lastDupKeyNameLen, static_cast(MAX_DB2_FILENAME_LENGTH))] = 0; getErrTxt(DB2I_ERR_UNKNOWN_IDX, unknownIndex); } } @@ -3292,7 +3291,7 @@ void ha_ibmdb2i::doInitialRead(char orientation, if (forceSingleRowRead) rowsToBuffer = 1; else - rowsToBuffer = min(rowsToBuffer, activeReadBuf->getRowCapacity()); + rowsToBuffer = std::min(rowsToBuffer, activeReadBuf->getRowCapacity()); activeReadBuf->newReadRequest(activeHandle, orientation, @@ -3430,7 +3429,7 @@ double ha_ibmdb2i::read_time(uint index, uint ranges, ha_rows rows) double dataPageCount = stats.data_file_length/IO_SIZE; cost = (rows * dataPageCount / totalRecords) + - min(idxPageCnt, (log_2(idxPageCnt) * ranges + + std::min(idxPageCnt, (log_2(idxPageCnt) * ranges + rows * (log_2(idxPageCnt) + log_2(rows) - log_2(totalRecords)))); } } @@ -3578,8 +3577,9 @@ void ha_ibmdb2i::setIndexReadEstimate(uint index, ha_rows rows) ha_rows ha_ibmdb2i::getIndexReadEstimate(uint index) { + ha_rows i = 1; if (indexReadSizeEstimates) - return max(indexReadSizeEstimates[index], 1); + return std::max(indexReadSizeEstimates[index], i); return 10000; // Assume index scan if no estimate exists. } From abccee7d3d2eb3d80d0e6d97a70c5eb2581e132a Mon Sep 17 00:00:00 2001 From: Abdirahim Musse <33973272+abmusse@users.noreply.github.com> Date: Fri, 12 Aug 2022 10:18:06 -0500 Subject: [PATCH 3/6] fixup! fixup! fix: Alter table issue --- db2i_conversion.cc | 21 --------------------- db2i_file.cc | 7 +------ db2i_global.h | 2 +- db2i_ileBridge.cc | 2 -- db2i_misc.cc | 2 -- db2i_safeString.cc | 3 --- 6 files changed, 2 insertions(+), 35 deletions(-) diff --git a/db2i_conversion.cc b/db2i_conversion.cc index 91ddb6c..50b206e 100644 --- a/db2i_conversion.cc +++ b/db2i_conversion.cc @@ -535,14 +535,12 @@ int ha_ibmdb2i::getFieldTypeMapping(Field* field, { if (field->type() == MYSQL_TYPE_STRING) { - // type of fieldLength = uint32 sprintf(stringBuildBuffer, "BINARY(%u)", std::max(fieldLength, 1u)); } else { if (fieldLength <= MAX_VARCHAR_LENGTH) { - // fieldLength = uint32 sprintf(stringBuildBuffer, "VARBINARY(%u)", std::max(fieldLength, 1u)); } else if (blobMapping == AS_VARCHAR && @@ -553,7 +551,6 @@ int ha_ibmdb2i::getFieldTypeMapping(Field* field, else { fieldLength = std::min(MAX_BLOB_LENGTH, fieldLength); - // fieldLength = uint32 sprintf(stringBuildBuffer, "BLOB(%u)", std::max(fieldLength, 1u)); } } @@ -589,9 +586,6 @@ int ha_ibmdb2i::getFieldTypeMapping(Field* field, return 1; if (fieldCharSet->mbmaxlen > 1 && (!is_utf8 || is_utf8_general_ci)) { - // type of fieldLength = uint32 - // mbmaxlen = uint - // 1u sprintf(stringBuildBuffer, "GRAPHIC(%u)", std::max(fieldLength / fieldCharSet->mbmaxlen, 1u)); // Number of characters // Need to set CCSID to 1200 (UTF-16) when using multi-byte charsets // As well as when the collation is utf*_general_ci because of sort sequence issues @@ -636,14 +630,10 @@ int ha_ibmdb2i::getFieldTypeMapping(Field* field, } else { - // MAX_BLOB_LENGTH = uint32 - // fieldLength = uint32 fieldLength = std::min(MAX_BLOB_LENGTH, fieldLength); if (fieldCharSet->mbmaxlen > 1 && (!is_utf8 || is_utf8_general_ci)) { - // fieldlength = uint32 - // mbmaxlen = uint sprintf(stringBuildBuffer, "DBCLOB(%u)", std::max(fieldLength / fieldCharSet->mbmaxlen,1u)); // Number of characters // Need to set CCSID to 1200 (UTF-16) when using multi-byte charsets // As well as when the collation is utf*_general_ci because of sort sequence issues @@ -651,7 +641,6 @@ int ha_ibmdb2i::getFieldTypeMapping(Field* field, } else { - // fieldLength = uint32 sprintf(stringBuildBuffer, "CLOB(%u)", std::max(fieldLength, 1u)); // Number of characters } } @@ -700,8 +689,6 @@ int32 ha_ibmdb2i::convertMySQLtoDB2(Field* field, const DB2Field& db2Field, char { uint precision= ((Field_new_decimal*)field)->precision; uint scale= field->decimals(); - // precison = uint - // MAX_DEC_PRECISION = uint32 uint db2Precision = std::min(precision, MAX_DEC_PRECISION); uint truncationAmount = precision - db2Precision; @@ -1173,10 +1160,6 @@ int32 ha_ibmdb2i::convertMySQLtoDB2(Field* field, const DB2Field& db2Field, char if (maxDisplayLength == 0 && db2FieldType == QMY_GRAPHIC) maxDb2BytesToStore = 2; else - // bytesToStore = uint32 - // field->mbinlen = uint - // maxDisplayLength = uint32 - // field->mbmaxlen = uint maxDb2BytesToStore = std::min(bytesToStore * 2 / fieldCharSet->mbminlen, maxDisplayLength * 2 / fieldCharSet->mbmaxlen); @@ -1222,10 +1205,6 @@ int32 ha_ibmdb2i::convertMySQLtoDB2(Field* field, const DB2Field& db2Field, char else // Else Far East, special UTF8 or non-special UTF8/UCS2 { size_t maxDb2BytesToStore; - // bytesToStore = uint32 - // field->mbinlen = uint - // maxDisplayLength = uint32 - // field->mbmaxlen = uint maxDb2BytesToStore = std::min(bytesToStore * 2 / fieldCharSet->mbminlen, maxDisplayLength * 2 / fieldCharSet->mbmaxlen); temp = getCharacterConversionBuffer(field->field_index, maxDb2BytesToStore); diff --git a/db2i_file.cc b/db2i_file.cc index b1549b4..f3457df 100644 --- a/db2i_file.cc +++ b/db2i_file.cc @@ -371,18 +371,13 @@ void db2i_table::filenameToTablename(const char* in, char* out, size_t outlen) part2 = strstr(part1, "#P#"); if (part2) { - fprintf(stderr, "In if part2\n"); part3 = part2 + 3; part4 = strchr(part3, '#'); - if (!part4){ - fprintf(stderr, "In if !part4\n"); + if (!part4) part4 = strend(in); - } } size_t num_bytes = std::min(outlen, static_cast(part2 - part1)); memcpy(temp, part1, std::min(outlen, static_cast(part2 - part1))); - fprintf(stderr, "temp: %s\n", temp); - fprintf(stderr, "After memcpy\n"); temp[std::min(outlen-1, static_cast(part2-part1))] = 0; int32 accumLen = smartFilenameToTableName(temp, out, outlen); diff --git a/db2i_global.h b/db2i_global.h index 6108587..4b838f6 100644 --- a/db2i_global.h +++ b/db2i_global.h @@ -158,7 +158,7 @@ const uint MAX_DB2_KEY_PARTS=120; const int MAX_DB2_V5R4_LIBNAME_LENGTH = 10; const int MAX_DB2_V6R1_LIBNAME_LENGTH = 30; const int MAX_DB2_SCHEMANAME_LENGTH=258; -const uint32 MAX_DB2_FILENAME_LENGTH=258; +const int MAX_DB2_FILENAME_LENGTH=258; const int MAX_DB2_COLNAME_LENGTH=128; const int MAX_DB2_SAVEPOINTNAME_LENGTH=128; const int MAX_DB2_QUALIFIEDNAME_LENGTH=MAX_DB2_V6R1_LIBNAME_LENGTH + 1 + MAX_DB2_FILENAME_LENGTH; diff --git a/db2i_ileBridge.cc b/db2i_ileBridge.cc index 113247d..5fc1851 100644 --- a/db2i_ileBridge.cc +++ b/db2i_ileBridge.cc @@ -612,8 +612,6 @@ int32 db2i_ileBridge::prepOpen(const char* statement, { Qmy_MSPO0100_output* output = (Qmy_MSPO0100_output*)parmBlock->outParms; *rfileHandle = output->ObjHnd; - // output->InNxtRowOff = - // output->OutNxtRowOff = *recLength = std::max(output->InNxtRowOff, output->OutNxtRowOff); } diff --git a/db2i_misc.cc b/db2i_misc.cc index add9c64..c0b32e4 100644 --- a/db2i_misc.cc +++ b/db2i_misc.cc @@ -100,8 +100,6 @@ EXTERN bool convertMySQLNameToDB2Name(const char* input, if (delimit) output[o++] = '"'; - // o = uint - // outlen = size_t output[std::min( static_cast(o), outlen-1)] = 0; // This isn't the most user-friendly way to handle overflows, // but at least its safe. return (o <= outlen-1); diff --git a/db2i_safeString.cc b/db2i_safeString.cc index 88f0f1f..17596a9 100644 --- a/db2i_safeString.cc +++ b/db2i_safeString.cc @@ -67,9 +67,6 @@ OF SUCH DAMAGE. SafeString& SafeString::strncat(const char* str, size_t len) { - // alllocSize = size_t - // curPos = size_t - // len = size_t size_t amountToCopy = std::min(allocSize-1 - curPos, len); memcpy(buf + curPos, str, amountToCopy); curPos += amountToCopy; From f44f0cd2fd71ebd60064c7218d282fe91fa861c2 Mon Sep 17 00:00:00 2001 From: Abdirahim Musse <33973272+abmusse@users.noreply.github.com> Date: Fri, 12 Aug 2022 10:23:27 -0500 Subject: [PATCH 4/6] fixup! fixup! fixup! fix: Alter table issue --- db2i_conversion.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/db2i_conversion.cc b/db2i_conversion.cc index 50b206e..0e3744d 100644 --- a/db2i_conversion.cc +++ b/db2i_conversion.cc @@ -1258,8 +1258,6 @@ int32 ha_ibmdb2i::convertDB2toMySQL(const DB2Field& db2Field, Field* field, cons { uint precision= ((Field_new_decimal*)field)->precision; uint scale= field->decimals(); - // precsion = uint - // MAX_DEC_PRECISION = uint32 uint db2Precision = std::min(precision, MAX_DEC_PRECISION); uint decimalPlace = precision-scale+1; char temp[80]; From e053f7c7c9745daf47f48e3f07b7f3b0ab08e175 Mon Sep 17 00:00:00 2001 From: Abdirahim Musse <33973272+abmusse@users.noreply.github.com> Date: Tue, 16 Aug 2022 08:38:32 -0500 Subject: [PATCH 5/6] fixup! fixup! fixup! fixup! fix: Alter table issue --- db2i_file.cc | 11 ++++++----- db2i_misc.cc | 4 ++-- ha_ibmdb2i.cc | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/db2i_file.cc b/db2i_file.cc index f3457df..08c5231 100644 --- a/db2i_file.cc +++ b/db2i_file.cc @@ -377,8 +377,8 @@ void db2i_table::filenameToTablename(const char* in, char* out, size_t outlen) part4 = strend(in); } size_t num_bytes = std::min(outlen, static_cast(part2 - part1)); - memcpy(temp, part1, std::min(outlen, static_cast(part2 - part1))); - temp[std::min(outlen-1, static_cast(part2-part1))] = 0; + memcpy(temp, part1, std::min(outlen, num_bytes)); + temp[std::min(outlen-1, num_bytes)] = 0; int32 accumLen = smartFilenameToTableName(temp, out, outlen); @@ -387,9 +387,10 @@ void db2i_table::filenameToTablename(const char* in, char* out, size_t outlen) strcat(out, "#P#"); accumLen += 4; - memset(temp, 0, std::min(outlen, static_cast(part2-part1))); - memcpy(temp, part3, std::min(outlen, static_cast(part4-part3))); - temp[std::min(static_cast(outlen-1), static_cast(part4-part3))] = 0; + memset(temp, 0, std::min(outlen, num_bytes)); + size_t num_bytes2 = std::min(outlen, static_cast(part4-part3)); + memcpy(temp, part3, std::min(outlen, num_bytes2)); + temp[std::min(static_cast(outlen-1), num_bytes2)] = 0; accumLen += smartFilenameToTableName(temp, strend(out), outlen-accumLen); diff --git a/db2i_misc.cc b/db2i_misc.cc index c0b32e4..ab0e793 100644 --- a/db2i_misc.cc +++ b/db2i_misc.cc @@ -82,7 +82,7 @@ EXTERN bool convertMySQLNameToDB2Name(const char* input, bool delimit, bool delimitQuotes) { - uint o = 0; + size_t o = 0; if (delimit) output[o++] = '"'; @@ -100,7 +100,7 @@ EXTERN bool convertMySQLNameToDB2Name(const char* input, if (delimit) output[o++] = '"'; - output[std::min( static_cast(o), outlen-1)] = 0; // This isn't the most user-friendly way to handle overflows, + output[std::min(o, outlen-1)] = 0; // This isn't the most user-friendly way to handle overflows, // but at least its safe. return (o <= outlen-1); } diff --git a/ha_ibmdb2i.cc b/ha_ibmdb2i.cc index b5e974e..1ad9fcb 100644 --- a/ha_ibmdb2i.cc +++ b/ha_ibmdb2i.cc @@ -2791,7 +2791,7 @@ int ha_ibmdb2i::prepReadBuffer(ha_rows rowsToRead, const db2i_file* file, char i forceSingleRowRead = true; rowsToRead = 1; } - rowsToRead = std::min(stats.records+1,std::min(rowsToRead, static_cast(DEFAULT_MAX_ROWS_TO_BUFFER))); + rowsToRead = std::min(stats.records+1,std::min(rowsToRead, DEFAULT_MAX_ROWS_TO_BUFFER)); uint bufSize = std::min(format->readRowLen * rowsToRead, static_cast(THDVAR(thd, max_read_buffer_size))); multiRowReadBuf.allocBuf(format->readRowLen, format->readRowNullOffset, bufSize); From 4e611ee9f2b7c239af2a0134f906bd1df92336fa Mon Sep 17 00:00:00 2001 From: Abdirahim Musse <33973272+abmusse@users.noreply.github.com> Date: Tue, 13 Sep 2022 14:07:59 -0500 Subject: [PATCH 6/6] fixup! fixup! fixup! fixup! fixup! fix: Alter table issue --- db2i_file.cc | 20 ++++++++++++-------- ha_ibmdb2i.cc | 3 +-- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/db2i_file.cc b/db2i_file.cc index 08c5231..fd9d530 100644 --- a/db2i_file.cc +++ b/db2i_file.cc @@ -376,10 +376,13 @@ void db2i_table::filenameToTablename(const char* in, char* out, size_t outlen) if (!part4) part4 = strend(in); } - size_t num_bytes = std::min(outlen, static_cast(part2 - part1)); - memcpy(temp, part1, std::min(outlen, num_bytes)); - temp[std::min(outlen-1, num_bytes)] = 0; - + + { + size_t num_bytes = std::min(outlen-1, static_cast(part2 - part1)); + memcpy(temp, part1, num_bytes); + temp[num_bytes] = 0; + } + int32 accumLen = smartFilenameToTableName(temp, out, outlen); if (part2 && (accumLen + 4 < (int) outlen)) @@ -387,10 +390,11 @@ void db2i_table::filenameToTablename(const char* in, char* out, size_t outlen) strcat(out, "#P#"); accumLen += 4; - memset(temp, 0, std::min(outlen, num_bytes)); - size_t num_bytes2 = std::min(outlen, static_cast(part4-part3)); - memcpy(temp, part3, std::min(outlen, num_bytes2)); - temp[std::min(static_cast(outlen-1), num_bytes2)] = 0; + { + size_t num_bytes = std::min(outlen, static_cast(part4-part3)); + memcpy(temp, part3, std::min(outlen, num_bytes)); + temp[std::min(static_cast(outlen-1), num_bytes)] = 0; + } accumLen += smartFilenameToTableName(temp, strend(out), outlen-accumLen); diff --git a/ha_ibmdb2i.cc b/ha_ibmdb2i.cc index 1ad9fcb..a0f3048 100644 --- a/ha_ibmdb2i.cc +++ b/ha_ibmdb2i.cc @@ -3577,9 +3577,8 @@ void ha_ibmdb2i::setIndexReadEstimate(uint index, ha_rows rows) ha_rows ha_ibmdb2i::getIndexReadEstimate(uint index) { - ha_rows i = 1; if (indexReadSizeEstimates) - return std::max(indexReadSizeEstimates[index], i); + return std::max(indexReadSizeEstimates[index], ha_rows{1}); return 10000; // Assume index scan if no estimate exists. }