From 11e28e3ddbf92d4fc871173e992c9e2bfc3f6ca8 Mon Sep 17 00:00:00 2001 From: Shuduo Sang Date: Sun, 10 Oct 2021 18:00:32 +0800 Subject: [PATCH] Hotfix/sangshuduo/td 10530 taosdump inf loop for develop (#8171) * [TD-10530]: taosdump infinite loop query table des fail on normal table. and value is NULL. * fix binary string with quote symbol --- src/kit/taosdump/taosdump.c | 51 +++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/src/kit/taosdump/taosdump.c b/src/kit/taosdump/taosdump.c index b760c642e5..f768195d56 100644 --- a/src/kit/taosdump/taosdump.c +++ b/src/kit/taosdump/taosdump.c @@ -1020,25 +1020,25 @@ static void dumpCreateMTableClause( strcasecmp(tableDes->cols[counter].type, "nchar") == 0) { //pstr += sprintf(pstr, ", \'%s\'", tableDes->cols[counter].note); if (tableDes->cols[counter].var_value) { - pstr += sprintf(pstr, ", %s", + pstr += sprintf(pstr, ", \'%s\'", tableDes->cols[counter].var_value); } else { - pstr += sprintf(pstr, ", %s", tableDes->cols[counter].value); + pstr += sprintf(pstr, ", \'%s\'", tableDes->cols[counter].value); } } else { - pstr += sprintf(pstr, ", %s", tableDes->cols[counter].value); + pstr += sprintf(pstr, ", \'%s\'", tableDes->cols[counter].value); } } else { if (strcasecmp(tableDes->cols[counter].type, "binary") == 0 || strcasecmp(tableDes->cols[counter].type, "nchar") == 0) { //pstr += sprintf(pstr, "\'%s\'", tableDes->cols[counter].note); if (tableDes->cols[counter].var_value) { - pstr += sprintf(pstr, "%s", tableDes->cols[counter].var_value); + pstr += sprintf(pstr, "\'%s\'", tableDes->cols[counter].var_value); } else { - pstr += sprintf(pstr, "%s", tableDes->cols[counter].value); + pstr += sprintf(pstr, "\'%s\'", tableDes->cols[counter].value); } } else { - pstr += sprintf(pstr, "%s", tableDes->cols[counter].value); + pstr += sprintf(pstr, "\'%s\'", tableDes->cols[counter].value); } /* pstr += sprintf(pstr, "%s", tableDes->cols[counter].note); */ } @@ -1149,6 +1149,10 @@ static int64_t dumpNormalTable( colCount = getTableDes(dbName, tbName, tableDes, false); if (colCount < 0) { + errorPrint("%s() LN%d, failed to get table[%s] schema\n", + __func__, + __LINE__, + tbName); free(tableDes); return -1; } @@ -1160,6 +1164,10 @@ static int64_t dumpNormalTable( colCount = getTableDes(dbName, tbName, tableDes, false); if (colCount < 0) { + errorPrint("%s() LN%d, failed to get table[%s] schema\n", + __func__, + __LINE__, + tbName); free(tableDes); return -1; } @@ -1172,19 +1180,21 @@ static int64_t dumpNormalTable( if (g_args.avro) { if (0 != convertTbDesToAvroSchema( dbName, tbName, tableDes, colCount, &jsonAvroSchema)) { + errorPrint("%s() LN%d, convertTbDesToAvroSchema failed\n", + __func__, + __LINE__); freeTbDes(tableDes); return -1; } } - free(tableDes); - int64_t ret = 0; if (!g_args.schemaonly) { ret = dumpTableData(fp, tbName, dbName, precision, jsonAvroSchema); } + freeTbDes(tableDes); return ret; } @@ -1281,20 +1291,23 @@ static void *dumpNtbOfDb(void *arg) { return NULL; } + int64_t count; for (int64_t i = 0; i < pThreadInfo->tablesOfDumpOut; i++) { debugPrint("[%d] No.\t%"PRId64" table name: %s\n", pThreadInfo->threadIndex, i, ((TableInfo *)(g_tablesList + pThreadInfo->tableFrom+i))->name); - dumpNormalTable( + count = dumpNormalTable( pThreadInfo->dbName, ((TableInfo *)(g_tablesList + pThreadInfo->tableFrom+i))->stable, ((TableInfo *)(g_tablesList + pThreadInfo->tableFrom+i))->name, pThreadInfo->precision, fp); + if (count < 0) { + break; + } } fclose(fp); - return NULL; } @@ -1340,16 +1353,20 @@ static void *dumpNormalTablesOfStb(void *arg) { TAOS_ROW row = NULL; int64_t i = 0; + int64_t count; while((row = taos_fetch_row(res)) != NULL) { debugPrint("[%d] sub table %"PRId64": name: %s\n", pThreadInfo->threadIndex, i++, (char *)row[TSDB_SHOW_TABLES_NAME_INDEX]); - dumpNormalTable( + count = dumpNormalTable( pThreadInfo->dbName, pThreadInfo->stbName, (char *)row[TSDB_SHOW_TABLES_NAME_INDEX], pThreadInfo->precision, fp); + if (count < 0) { + break; + } } fclose(fp); @@ -2006,9 +2023,9 @@ static int getTableDes( if (row[TSDB_SHOW_TABLES_NAME_INDEX] == NULL) { sprintf(tableDes->cols[i].note, "%s", "NUL"); + sprintf(tableDes->cols[i].value, "%s", "NULL"); taos_free_result(res); res = NULL; - taos_close(taos); continue; } @@ -2050,26 +2067,22 @@ static int getTableDes( int len = strlen((char *)row[0]); // FIXME for long value if (len < (COL_VALUEBUF_LEN - 2)) { - tableDes->cols[i].value[0] = '\''; converStringToReadable( (char *)row[0], length[0], - tableDes->cols[i].value + 1, + tableDes->cols[i].value, len); - tableDes->cols[i].value[len+1] = '\''; } else { - tableDes->cols[i].var_value = calloc(1, len + 2); + tableDes->cols[i].var_value = calloc(1, len * 2); if (tableDes->cols[i].var_value == NULL) { errorPrint("%s() LN%d, memory alalocation failed!\n", __func__, __LINE__); taos_free_result(res); return -1; } - tableDes->cols[i].var_value[0] = '\''; converStringToReadable((char *)row[0], length[0], - (char *)(tableDes->cols[i].var_value + 1), len); - tableDes->cols[i].var_value[len+1] = '\''; + (char *)(tableDes->cols[i].var_value), len); } break; -- GitLab