@@ -223,7 +223,7 @@ class QMYSQLResultPrivate: public QSqlResultPrivate
223223 struct QMyField
224224 {
225225 char *outField = nullptr ;
226- MYSQL_FIELD *myField = nullptr ;
226+ const MYSQL_FIELD *myField = nullptr ;
227227 QMetaType::Type type = QMetaType::UnknownType;
228228 my_bool nullIndicator = false ;
229229 ulong bufLength = 0ul ;
@@ -309,6 +309,7 @@ static QMetaType::Type qDecodeMYSQLType(int mysqltype, uint flags)
309309 case FIELD_TYPE_MEDIUM_BLOB :
310310 case FIELD_TYPE_LONG_BLOB :
311311 case FIELD_TYPE_GEOMETRY :
312+ case MYSQL_TYPE_JSON :
312313 type = (flags & BINARY_FLAG) ? QMetaType::QByteArray : QMetaType::QString;
313314 break ;
314315 default :
@@ -347,7 +348,8 @@ static bool qIsBlob(int t)
347348 return t == MYSQL_TYPE_TINY_BLOB
348349 || t == MYSQL_TYPE_BLOB
349350 || t == MYSQL_TYPE_MEDIUM_BLOB
350- || t == MYSQL_TYPE_LONG_BLOB;
351+ || t == MYSQL_TYPE_LONG_BLOB
352+ || t == MYSQL_TYPE_JSON;
351353}
352354
353355static bool qIsInteger (int t)
@@ -360,12 +362,9 @@ static bool qIsInteger(int t)
360362
361363void QMYSQLResultPrivate::bindBlobs ()
362364{
363- int i;
364- MYSQL_FIELD *fieldInfo;
365365 MYSQL_BIND *bind;
366-
367- for (i = 0 ; i < fields.count (); ++i) {
368- fieldInfo = fields.at (i).myField ;
366+ for (int i = 0 ; i < fields.count (); ++i) {
367+ const MYSQL_FIELD *fieldInfo = fields.at (i).myField ;
369368 if (qIsBlob (inBinds[i].buffer_type ) && meta && fieldInfo) {
370369 bind = &inBinds[i];
371370 bind->buffer_length = fieldInfo->max_length ;
@@ -378,8 +377,6 @@ void QMYSQLResultPrivate::bindBlobs()
378377
379378bool QMYSQLResultPrivate::bindInValues ()
380379{
381- MYSQL_BIND *bind;
382- char *field;
383380 int i = 0 ;
384381
385382 if (!meta)
@@ -392,35 +389,34 @@ bool QMYSQLResultPrivate::bindInValues()
392389 inBinds = new MYSQL_BIND[fields.size ()];
393390 memset (inBinds, 0 , fields.size () * sizeof (MYSQL_BIND));
394391
395- MYSQL_FIELD *fieldInfo;
392+ const MYSQL_FIELD *fieldInfo;
396393
397394 while ((fieldInfo = mysql_fetch_field (meta))) {
395+ MYSQL_BIND *bind = &inBinds[i];
396+
398397 QMyField &f = fields[i];
399398 f.myField = fieldInfo;
400-
399+ bind->buffer_length = f.bufLength = fieldInfo->length + 1 ;
400+ bind->buffer_type = fieldInfo->type ;
401401 f.type = qDecodeMYSQLType (fieldInfo->type , fieldInfo->flags );
402402 if (qIsBlob (fieldInfo->type )) {
403403 // the size of a blob-field is available as soon as we call
404404 // mysql_stmt_store_result()
405405 // after mysql_stmt_exec() in QMYSQLResult::exec()
406- fieldInfo-> length = 0 ;
406+ bind-> buffer_length = f. bufLength = 0 ;
407407 hasBlobs = true ;
408408 } else if (qIsInteger (f.type )) {
409- fieldInfo-> length = 8 ;
409+ bind-> buffer_length = f. bufLength = 8 ;
410410 } else {
411- fieldInfo-> type = MYSQL_TYPE_STRING;
411+ bind-> buffer_type = MYSQL_TYPE_STRING;
412412 }
413- bind = &inBinds[i];
414- field = new char [fieldInfo->length + 1 ];
415- memset (field, 0 , fieldInfo->length + 1 );
416413
417- bind->buffer_type = fieldInfo->type ;
418- bind->buffer = field;
419- bind->buffer_length = f.bufLength = fieldInfo->length + 1 ;
420414 bind->is_null = &f.nullIndicator ;
421415 bind->length = &f.bufLength ;
422416 bind->is_unsigned = fieldInfo->flags & UNSIGNED_FLAG ? 1 : 0 ;
423- f.outField =field;
417+
418+ char *field = new char [bind->buffer_length + 1 ]{};
419+ bind->buffer = f.outField = field;
424420
425421 ++i;
426422 }
@@ -1597,3 +1593,5 @@ bool QMYSQLDriver::isIdentifierEscaped(const QString &identifier, IdentifierType
15971593}
15981594
15991595QT_END_NAMESPACE
1596+
1597+ #include " moc_qsql_mysql_p.cpp"
0 commit comments