diff --git a/src/client/src/tscParseLineProtocol.c b/src/client/src/tscParseLineProtocol.c index 4e0f3a12fe252848469cf540c4a9565717ac4d8c..7c673591b0c07f4957b3afc9077397d92d3175f0 100644 --- a/src/client/src/tscParseLineProtocol.c +++ b/src/client/src/tscParseLineProtocol.c @@ -573,7 +573,11 @@ static int32_t getTableMetaFromLocalCache(TAOS* taos, char* tableName, STableMet } if (tableMeta != NULL) { - *outTableMeta = tableMeta; + if (outTableMeta != NULL) { + *outTableMeta = tableMeta; + } else { + free(tableMeta); + } return TSDB_CODE_SUCCESS; } else { return TSDB_CODE_TSC_NO_META_CACHED; @@ -841,11 +845,12 @@ static int32_t applyChildTableDataPointsWithInsertSQL(TAOS* taos, char* cTableNa free(colKVs); sql[totalLen] = '\0'; - tscInfo("SML:0x%"PRIx64" insert child table table %s of super table %s sql: %s", info->id, cTableName, sTableName, sql); + tscDebug("SML:0x%"PRIx64" insert child table table %s of super table %s sql: %s", info->id, cTableName, sTableName, sql); TAOS_RES* res = taos_query(taos, sql); free(sql); code = taos_errno(res); info->affectedRows = taos_affected_rows(res); + taos_free_result(res); return code; } @@ -1167,6 +1172,62 @@ int tscSmlInsert(TAOS* taos, TAOS_SML_DATA_POINT* points, int numPoint, SSmlLine info->affectedRows = 0; + //TODO: + if (numPoint == 1) { + TAOS_SML_DATA_POINT* point = points; + if (!point->childTableName) { + int tableNameLen = TSDB_TABLE_NAME_LEN; + point->childTableName = calloc(1, tableNameLen + 1); + getSmlMd5ChildTableName(point, point->childTableName, &tableNameLen, info); + point->childTableName[tableNameLen] = '\0'; + } + int32_t ret = getTableMetaFromLocalCache(taos, point->childTableName, NULL, info); + if (ret == TSDB_CODE_SUCCESS) { + STableMeta* tableMeta; + int32_t ret2 = getTableMetaFromLocalCache(taos, point->stableName, &tableMeta, info); + if (ret2 != TSDB_CODE_SUCCESS) { + tscError("SML:0x%"PRIx64" meta of super table %s not found but meta of child table %s found ", + info->id, point->stableName, point->childTableName); + } + uint8_t precision = tableMeta->tableInfo.precision; + free(tableMeta); + + char* sql = malloc(TSDB_MAX_SQL_LEN+1); + int freeBytes = TSDB_MAX_SQL_LEN; + int sqlLen = 0; + sqlLen += snprintf(sql+sqlLen, freeBytes-sqlLen, "insert into %s(", point->childTableName); + for (int col = 0; col < point->fieldNum; ++col) { + TAOS_SML_KV* kv = point->fields + col; + sqlLen += snprintf(sql+sqlLen, freeBytes-sqlLen, "%s,", kv->key); + } + --sqlLen; + sqlLen += snprintf(sql+sqlLen, freeBytes-sqlLen, ") values ("); + TAOS_SML_KV* tsField = point->fields + 0; + int64_t ts = *(int64_t*)(tsField->value); + ts = convertTimePrecision(ts, TSDB_TIME_PRECISION_NANO, precision); + sqlLen += snprintf(sql+sqlLen, freeBytes-sqlLen, "%" PRId64 ",", ts); + for (int col = 1; col < point->fieldNum; ++col) { + TAOS_SML_KV* kv = point->fields + col; + int32_t len = 0; + converToStr(sql+sqlLen, kv->type, kv->value, kv->length, &len); + sqlLen += len; + sqlLen += snprintf(sql+sqlLen, freeBytes-sqlLen, ","); + } + --sqlLen; + sqlLen += snprintf(sql+sqlLen, freeBytes-sqlLen, ")"); + sql[sqlLen] = 0; + tscDebug("SML:0x%"PRIx64" insert child table table %s of super table %s sql: %s", info->id, point->childTableName, point->stableName, sql); + TAOS_RES* res = taos_query(taos, sql); + free(sql); + code = taos_errno(res); + info->affectedRows = taos_affected_rows(res); + taos_free_result(res); + if (code == TSDB_CODE_SUCCESS) { + return code; + } + } + } + tscDebug("SML:0x%"PRIx64" build data point schemas", info->id); SArray* stableSchemas = taosArrayInit(32, sizeof(SSmlSTableSchema)); // SArray code = buildDataPointSchemas(points, numPoint, stableSchemas, info); diff --git a/src/client/src/tscParseOpenTSDB.c b/src/client/src/tscParseOpenTSDB.c index d064ede134129d796928768910c56573712319d1..71ac4d8481397391830cb30a7d5bed19afd08bd4 100644 --- a/src/client/src/tscParseOpenTSDB.c +++ b/src/client/src/tscParseOpenTSDB.c @@ -125,8 +125,9 @@ static int32_t parseTelnetTimeStamp(TAOS_SML_KV **pTS, int *num_kvs, const char } tfree(value); - (*pTS)->key = tcalloc(sizeof(key), 1); + (*pTS)->key = tcalloc(sizeof(key) + TS_ESCAPE_CHAR_SIZE, 1); memcpy((*pTS)->key, key, sizeof(key)); + addEscapeCharToString((*pTS)->key, strlen(key)); *num_kvs += 1; *index = cur + 1;