From 1347ddf89276bb8931c01fa476f4f01e664da1e3 Mon Sep 17 00:00:00 2001 From: shenglian zhou Date: Sat, 24 Jul 2021 23:05:58 +0800 Subject: [PATCH] fix change tag values errors --- src/client/src/tscParseLineProtocol.c | 41 ++++++++++++++++----------- tests/examples/c/apitest.c | 36 ++++++++++++++++++++--- tests/examples/c/schemaless.c | 4 +-- 3 files changed, 58 insertions(+), 23 deletions(-) diff --git a/src/client/src/tscParseLineProtocol.c b/src/client/src/tscParseLineProtocol.c index dd24d2c458..d5883af7f6 100644 --- a/src/client/src/tscParseLineProtocol.c +++ b/src/client/src/tscParseLineProtocol.c @@ -474,7 +474,7 @@ int32_t loadTableMeta(TAOS* taos, char* tableName, SSmlSTableSchema* schema) { return code; } -static int32_t reconcileDBSchemas(TAOS* taos, SArray* stableSchemas) { +static int32_t modifyDBSchemas(TAOS* taos, SArray* stableSchemas) { int32_t code = 0; size_t numStable = taosArrayGetSize(stableSchemas); for (int i = 0; i < numStable; ++i) { @@ -691,7 +691,6 @@ static int32_t insertChildTableBatch(TAOS* taos, char* cTableName, SArray* cols } do { - code = taos_stmt_set_tbname(stmt, cTableName); if (code != 0) { tscError("%s", taos_stmt_errstr(stmt)); @@ -818,20 +817,22 @@ static int32_t applyChildTableTags(TAOS* taos, char* cTableName, char* sTableNam } // select tag1,tag2,... from stable where tbname in (ctable) - char sql[TSDB_MAX_BINARY_LEN]; - int capacity = TSDB_MAX_BINARY_LEN; - snprintf(sql, capacity, "select tbname, "); + char* sql = malloc(tsMaxSQLStringLen+1); + int freeBytes = tsMaxSQLStringLen + 1; + snprintf(sql, freeBytes, "select tbname, "); for (int i = 0; i < numNotNullTags ; ++i) { - snprintf(sql + strlen(sql), capacity-strlen(sql), "%s,", tagKVs[notNullTagsIndices[i]]->key); + snprintf(sql + strlen(sql), freeBytes-strlen(sql), "%s,", tagKVs[notNullTagsIndices[i]]->key); } - - snprintf(sql + strlen(sql) - 1, capacity - strlen(sql) + 1, + snprintf(sql + strlen(sql) - 1, freeBytes - strlen(sql) + 1, " from %s where tbname in (\'%s\')", sTableName, cTableName); + sql[strlen(sql)] = '\0'; + TAOS_RES* result = taos_query(taos, sql); + free(sql); + int32_t code = taos_errno(result); if (code != 0) { - tscError("%s", taos_errstr(result)); - taos_free_result(result); + tscError("get child table %s tags failed. error string %s", cTableName, taos_errstr(result)); goto cleanup; } @@ -842,18 +843,20 @@ static int32_t applyChildTableTags(TAOS* taos, char* cTableName, char* sTableNam TAOS_FIELD* fields = taos_fetch_fields(result); int* lengths = taos_fetch_lengths(result); for (int i = 1; i < numFields; ++i) { - uint8_t type = fields[i].type; + uint8_t dbType = fields[i].type; int32_t length = lengths[i]; char* val = row[i]; TAOS_SML_KV* tagKV = tagKVs[notNullTagsIndices[i-1]]; - if (tagKV->type != type) { + if (tagKV->type != dbType) { tscError("child table %s tag %s type mismatch. point type : %d, db type : %d", - cTableName, tagKV->key, tagKV->type, type); + cTableName, tagKV->key, tagKV->type, dbType); return TSDB_CODE_TSC_INVALID_VALUE; } - if (memcmp(tagKV->value, val, length) != 0) { + assert(tagKV->value); + + if (val == NULL || length != tagKV->length || memcmp(tagKV->value, val, length) != 0) { TAOS_BIND* bind = taosArrayGet(tagBinds, tagKV->fieldSchemaIdx); code = changeChildTableTagValue(taos, cTableName, tagKV->key, bind); if (code != 0) { @@ -861,8 +864,8 @@ static int32_t applyChildTableTags(TAOS* taos, char* cTableName, char* sTableNam goto cleanup; } } - } + tscDebug("successfully applied point tags. child table: %s", cTableName); } else { code = creatChildTableIfNotExists(taos, cTableName, sTableName, sTableSchema->tags, tagBinds); if (code != 0) { @@ -871,6 +874,7 @@ static int32_t applyChildTableTags(TAOS* taos, char* cTableName, char* sTableNam } cleanup: + taos_free_result(result); for (int i = 0; i < taosArrayGetSize(tagBinds); ++i) { TAOS_BIND* bind = taosArrayGet(tagBinds, i); free(bind->length); @@ -953,6 +957,8 @@ static int32_t applyDataPoints(TAOS* taos, TAOS_SML_DATA_POINT* points, int32_t goto cleanup; } + tscDebug("successfully applied data points of child table %s", point->childTableName); + pCTablePoints = taosHashIterate(cname2points, pCTablePoints); } @@ -961,6 +967,7 @@ cleanup: while (pCTablePoints) { SArray* pPoints = *pCTablePoints; taosArrayDestroy(pPoints); + pCTablePoints = taosHashIterate(cname2points, pCTablePoints); } taosHashCleanup(cname2points); return code; @@ -978,7 +985,7 @@ int taos_sml_insert(TAOS* taos, TAOS_SML_DATA_POINT* points, int numPoint) { goto clean_up; } - code = reconcileDBSchemas(taos, stableSchemas); + code = modifyDBSchemas(taos, stableSchemas); if (code != 0) { tscError("error change db schema : %s", tstrerror(code)); goto clean_up; @@ -986,7 +993,7 @@ int taos_sml_insert(TAOS* taos, TAOS_SML_DATA_POINT* points, int numPoint) { code = applyDataPoints(taos, points, numPoint, stableSchemas); if (code != 0) { - tscError("error insert points : %s", tstrerror(code)); + tscError("error apply data points : %s", tstrerror(code)); } clean_up: diff --git a/tests/examples/c/apitest.c b/tests/examples/c/apitest.c index 37e93cdacb..fbe6a381df 100644 --- a/tests/examples/c/apitest.c +++ b/tests/examples/c/apitest.c @@ -963,11 +963,25 @@ int32_t verify_schema_less(TAOS* taos) { taos_free_result(result); usleep(100000); - int code = 0; + + char* lines[] = { + "st,t1=3i64,t2=4f64,t3=\"t3\" c1=3i64,c3=L\"passit\",c2=false,c4=4f64 1626006833639000000ns", + "st,t1=4i64,t3=\"t4\",t2=5f64,t4=5f64 c1=3i64,c3=L\"passitagin\",c2=true,c4=5f64,c5=5f64 1626006833640000000ns", + "ste,t2=5f64,t3=L\"ste\" c1=true,c2=4i64,c3=\"iam\" 1626056811823316532ns", + "st,t1=4i64,t2=5f64,t3=\"t4\" c1=3i64,c3=L\"passitagain\",c2=true,c4=5f64 1626006833642000000ns", + "ste,t2=5f64,t3=L\"ste2\" c3=\"iamszhou\",c4=false 1626056811843316532ns", + "ste,t2=5f64,t3=L\"ste2\" c3=\"iamszhou\",c4=false,c5=32i8,c6=64i16,c7=32i32,c8=88.88f32 1626056812843316532ns", + "st,t1=4i64,t3=\"t4\",t2=5f64,t4=5f64 c1=3i64,c3=L\"passitagin\",c2=true,c4=5f64,c5=5f64,c6=7u64 1626006933640000000ns", + "stf,t1=4i64,t3=\"t4\",t2=5f64,t4=5f64 c1=3i64,c3=L\"passitagin\",c2=true,c4=5f64,c5=5f64,c6=7u64 1626006933640000000ns", + "stf,t1=4i64,t3=\"t4\",t2=5f64,t4=5f64 c1=3i64,c3=L\"passitagin_stf\",c2=false,c5=5f64,c6=7u64 1626006933641000000ns" + }; + + code = taos_insert_lines(taos, lines , sizeof(lines)/sizeof(char*)); + char* lines2[] = { - "zqlbgs,id=\"zqlbgs_39302_21680\",t0=f,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=f,c1=127i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"binaryColValue\",c8=L\"ncharColValue\",c9=7u64 1626006833639000000ns", - "zqlbgs,t9=f,id=\"zqlbgs_39302_21680\",t0=f,t1=127i8,t11=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\",t10=L\"ncharTagValue\" c10=f,c0=f,c1=127i8,c12=127i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"binaryColValue\",c8=L\"ncharColValue\",c9=7u64,c11=L\"ncharColValue\" 1626006833639000000ns" + "stg,t1=3i64,t2=4f64,t3=\"t3\" c1=3i64,c3=L\"passit\",c2=false,c4=4f64 1626006833639000000ns", + "stg,t1=4i64,t3=\"t4\",t2=5f64,t4=5f64 c1=3i64,c3=L\"passitagin\",c2=true,c4=5f64,c5=5f64 1626006833640000000ns" }; code = taos_insert_lines(taos, &lines2[0], 1); code = taos_insert_lines(taos, &lines2[1], 1); @@ -983,7 +997,21 @@ int32_t verify_schema_less(TAOS* taos) { "dgtyqodr,t2=5f64,t3=L\"ste\" c1=tRue,c2=4i64,c3=\"iam\" 1626056811823316532ns" }; code = taos_insert_lines(taos, lines4, 2); - return code; + + char* lines5[] = { + "zqlbgs,id=\"zqlbgs_39302_21680\",t0=f,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=f,c1=127i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"binaryColValue\",c8=L\"ncharColValue\",c9=7u64 1626006833639000000ns", + "zqlbgs,t9=f,id=\"zqlbgs_39302_21680\",t0=f,t1=127i8,t11=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\",t10=L\"ncharTagValue\" c10=f,c0=f,c1=127i8,c12=127i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"binaryColValue\",c8=L\"ncharColValue\",c9=7u64,c11=L\"ncharColValue\" 1626006833639000000ns" + }; + code = taos_insert_lines(taos, &lines5[0], 1); + code = taos_insert_lines(taos, &lines5[1], 1); + + + char* lines6[] = { + "st123456,t1=3i64,t2=4f64,t3=\"t3\" c1=3i64,c3=L\"passit\",c2=false,c4=4f64 1626006833639000000ns", + "dgtyqodr,t2=5f64,t3=L\"ste\" c1=tRue,c2=4i64,c3=\"iam\" 1626056811823316532ns" + }; + code = taos_insert_lines(taos, lines6, 2); + return (code); } int main(int argc, char *argv[]) { diff --git a/tests/examples/c/schemaless.c b/tests/examples/c/schemaless.c index d6450914df..8fae408049 100644 --- a/tests/examples/c/schemaless.c +++ b/tests/examples/c/schemaless.c @@ -9,8 +9,8 @@ #include int numSuperTables = 8; -int numChildTables = 1024; -int numRowsPerChildTable = 128; +int numChildTables = 4; +int numRowsPerChildTable = 2048; void shuffle(char**lines, size_t n) { -- GitLab