Skip to content

Commit 65156bc

Browse files
authored
fix: the issue that query processes get stuck when both dbname and tbname are set to ? in query statements executed via stmt2 (#33864)
* fix stmt2 query block * fix review
1 parent 1054ad5 commit 65156bc

File tree

3 files changed

+107
-10
lines changed

3 files changed

+107
-10
lines changed

source/client/src/clientStmt2.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -795,7 +795,7 @@ static void* stmtBindThreadFunc(void* param) {
795795
setThreadName("stmt2Bind");
796796

797797
STscStmt2* pStmt = (STscStmt2*)param;
798-
STMT2_ILOG_E("stmt2 bind thread started");
798+
STMT2_DLOG_E("stmt2 bind thread started");
799799

800800
while (true) {
801801
SStmtQNode* asyncParam = NULL;
@@ -811,7 +811,7 @@ static void* stmtBindThreadFunc(void* param) {
811811
stmtAsyncOutput(pStmt, asyncParam);
812812
}
813813

814-
STMT2_ILOG_E("stmt2 bind thread stopped");
814+
STMT2_DLOG_E("stmt2 bind thread stopped");
815815
return NULL;
816816
}
817817

@@ -2335,12 +2335,12 @@ int stmtClose2(TAOS_STMT2* stmt) {
23352335
}
23362336
}
23372337

2338-
STMT2_DLOG("stmt %p closed, stbInterlaceMode:%d, statInfo: ctgGetTbMetaNum=>%" PRId64 ", getCacheTbInfo=>%" PRId64
2338+
STMT2_DLOG("stbInterlaceMode:%d, statInfo: ctgGetTbMetaNum=>%" PRId64 ", getCacheTbInfo=>%" PRId64
23392339
", parseSqlNum=>%" PRId64 ", pStmt->stat.bindDataNum=>%" PRId64
23402340
", settbnameAPI:%u, bindAPI:%u, addbatchAPI:%u, execAPI:%u"
23412341
", setTbNameUs:%" PRId64 ", bindDataUs:%" PRId64 ",%" PRId64 ",%" PRId64 ",%" PRId64 " addBatchUs:%" PRId64
23422342
", execWaitUs:%" PRId64 ", execUseUs:%" PRId64,
2343-
pStmt, pStmt->sql.stbInterlaceMode, pStmt->stat.ctgGetTbMetaNum, pStmt->stat.getCacheTbInfo,
2343+
pStmt->sql.stbInterlaceMode, pStmt->stat.ctgGetTbMetaNum, pStmt->stat.getCacheTbInfo,
23442344
pStmt->stat.parseSqlNum, pStmt->stat.bindDataNum, pStmt->seqIds[STMT_SETTBNAME], pStmt->seqIds[STMT_BIND],
23452345
pStmt->seqIds[STMT_ADD_BATCH], pStmt->seqIds[STMT_EXECUTE], pStmt->stat.setTbNameUs,
23462346
pStmt->stat.bindDataUs1, pStmt->stat.bindDataUs2, pStmt->stat.bindDataUs3, pStmt->stat.bindDataUs4,
@@ -2476,7 +2476,7 @@ int stmtGetParamNum2(TAOS_STMT2* stmt, int* nums) {
24762476
STMT_ERRI_JRET(stmtFetchColFields2(stmt, nums, NULL));
24772477
}
24782478

2479-
STMT2_TLOG("get param num success, nums:%d", *nums);
2479+
STMT2_DLOG("get param num success, nums:%d", *nums);
24802480

24812481
_return:
24822482

source/client/test/stmt2Test.cpp

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1842,7 +1842,7 @@ void asyncExec(void* param, TAOS_RES* res, int code) {
18421842
return;
18431843
}
18441844

1845-
TEST(stmt2Case, stmt2_query) {
1845+
TEST(stmt2Case, query) {
18461846
TAOS* taos = taos_connect("localhost", "root", "taosdata", "", 0);
18471847
ASSERT_NE(taos, nullptr);
18481848
do_query(taos, "drop database if exists stmt2_testdb_7");
@@ -1931,6 +1931,8 @@ TEST(stmt2Case, stmt2_query) {
19311931
AsyncArgs* aa = (AsyncArgs*)taosMemoryMalloc(sizeof(AsyncArgs));
19321932
aa->async_affected_rows = 0;
19331933
ASSERT_EQ(tsem_init(&aa->sem, 0, 0), TSDB_CODE_SUCCESS);
1934+
// int code = taos_stmt2_prepare(stmt, "select tbname,t2,b from stmt2_testdb_7.stb where ts = ? and tbname = ?", 0);
1935+
// checkError(stmt, code);
19341936

19351937
TAOS_STMT2_OPTION option = {0, true, true, asyncExec, (void*)aa};
19361938
TAOS_STMT2* stmt = taos_stmt2_init(taos, &option);
@@ -1964,6 +1966,53 @@ TEST(stmt2Case, stmt2_query) {
19641966
tsem_destroy(&aa->sem);
19651967
taosMemoryFree(aa);
19661968
}
1969+
{
1970+
AsyncArgs* aa = (AsyncArgs*)taosMemoryMalloc(sizeof(AsyncArgs));
1971+
aa->async_affected_rows = 0;
1972+
ASSERT_EQ(tsem_init(&aa->sem, 0, 0), TSDB_CODE_SUCCESS);
1973+
1974+
TAOS_STMT2_OPTION option = {0, true, true, stmtAsyncQueryCb, (void*)aa};
1975+
1976+
TAOS_STMT2* stmt = taos_stmt2_init(taos, &option);
1977+
ASSERT_NE(stmt, nullptr);
1978+
1979+
const char* sql =
1980+
"select table_name, db_name, stable_name from information_schema.ins_tables where 1 = 1 and table_name = ? and "
1981+
"db_name = ?";
1982+
int code = taos_stmt2_prepare(stmt, sql, 0);
1983+
checkError(stmt, code);
1984+
1985+
int fieldNum = 0;
1986+
TAOS_FIELD_ALL* pFields = NULL;
1987+
code = taos_stmt2_get_fields(stmt, &fieldNum, &pFields);
1988+
checkError(stmt, code);
1989+
ASSERT_EQ(fieldNum, 2);
1990+
1991+
int b_len = 3;
1992+
int b_len2 = 14;
1993+
TAOS_STMT2_BIND params[2] = {{TSDB_DATA_TYPE_BINARY, (void*)"tb1", &b_len, NULL, 1},
1994+
{TSDB_DATA_TYPE_BINARY, (void*)"stmt2_testdb_7", &b_len2, NULL, 1}};
1995+
TAOS_STMT2_BIND* paramv = &params[0];
1996+
TAOS_STMT2_BINDV bindv = {1, NULL, NULL, &paramv};
1997+
code = taos_stmt2_bind_param(stmt, &bindv, -1);
1998+
checkError(stmt, code);
1999+
2000+
taos_stmt2_exec(stmt, NULL);
2001+
checkError(stmt, code);
2002+
2003+
tsem_wait(&aa->sem);
2004+
tsem_destroy(&aa->sem);
2005+
taosMemoryFree(aa);
2006+
2007+
TAOS_RES* pRes = taos_stmt2_result(stmt);
2008+
ASSERT_NE(pRes, nullptr);
2009+
TAOS_ROW row = taos_fetch_row(pRes);
2010+
ASSERT_NE(row, nullptr);
2011+
ASSERT_EQ(strncmp((char*)row[0], "tb1", 3), 0);
2012+
ASSERT_EQ(strncmp((char*)row[1], "stmt2_testdb_7", 14), 0);
2013+
ASSERT_EQ(strncmp((char*)row[2], "stb", 3), 0);
2014+
taos_stmt2_close(stmt);
2015+
}
19672016

19682017
do_query(taos, "drop database if exists stmt2_testdb_7");
19692018
taos_close(taos);

source/libs/parser/src/parUtil.c

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -564,17 +564,65 @@ static int32_t getInsTagsTableTargetNameFromOp(int32_t acctId, SOperatorNode* pO
564564
} else if (QUERY_NODE_VALUE == nodeType(pOper->pRight)) {
565565
pVal = (SValueNode*)pOper->pRight;
566566
}
567-
if (NULL == pCol || NULL == pVal || NULL == pVal->literal || 0 == strcmp(pVal->literal, "")) {
567+
if (NULL == pCol || NULL == pVal) {
568568
return TSDB_CODE_SUCCESS;
569569
}
570570

571+
const char* valueStr = NULL;
572+
int32_t valueLen = 0;
573+
574+
if (pVal->placeholderNo != 0) {
575+
if (NULL == pVal->datum.p) {
576+
qError("getInsTagsTableTargetNameFromOp: placeholderNo=%d but datum.p is NULL, colName=%s, literal=%s",
577+
pVal->placeholderNo, pCol->colName, pVal->literal ? pVal->literal : "NULL");
578+
return TSDB_CODE_SUCCESS;
579+
}
580+
581+
if (TSDB_DATA_TYPE_NCHAR == pVal->node.resType.type) {
582+
int32_t ucs4Len = varDataLen(pVal->datum.p);
583+
char* tmp = taosMemoryCalloc(1, ucs4Len * TSDB_NCHAR_SIZE + 1);
584+
if (NULL == tmp) {
585+
return terrno;
586+
}
587+
int32_t output = taosUcs4ToMbs((TdUcs4*)varDataVal(pVal->datum.p), ucs4Len, tmp, NULL);
588+
if (output < 0) {
589+
taosMemoryFree(tmp);
590+
return terrno;
591+
}
592+
valueStr = tmp;
593+
valueLen = output;
594+
} else if (IS_VAR_DATA_TYPE(pVal->node.resType.type)) {
595+
valueStr = varDataVal(pVal->datum.p);
596+
valueLen = varDataLen(pVal->datum.p);
597+
qDebug("getInsTagsTableTargetNameFromOp: extracted VARCHAR value, len=%d, value=%.*s", valueLen, valueLen,
598+
valueStr);
599+
} else {
600+
qError("getInsTagsTableTargetNameFromOp: unsupported data type %d for placeholder", pVal->node.resType.type);
601+
return TSDB_CODE_INVALID_PARA;
602+
;
603+
}
604+
} else {
605+
if (NULL == pVal->literal || 0 == strcmp(pVal->literal, "")) {
606+
return TSDB_CODE_SUCCESS;
607+
}
608+
valueStr = pVal->literal;
609+
valueLen = strlen(pVal->literal);
610+
}
611+
612+
int32_t code = TSDB_CODE_SUCCESS;
613+
bool needFree = (pVal->placeholderNo != 0 && TSDB_DATA_TYPE_NCHAR == pVal->node.resType.type);
614+
571615
if (0 == strcmp(pCol->colName, "db_name")) {
572-
return tNameSetDbName(pName, acctId, pVal->literal, strlen(pVal->literal));
616+
code = tNameSetDbName(pName, acctId, valueStr, valueLen);
573617
} else if (0 == strcmp(pCol->colName, "table_name")) {
574-
return tNameAddTbName(pName, pVal->literal, strlen(pVal->literal));
618+
code = tNameAddTbName(pName, valueStr, valueLen);
575619
}
576620

577-
return TSDB_CODE_SUCCESS;
621+
if (needFree) {
622+
taosMemoryFree((char*)valueStr);
623+
}
624+
625+
return code;
578626
}
579627

580628
static int32_t getInsTagsTableTargetObjName(int32_t acctId, SNode* pNode, SName* pName) {

0 commit comments

Comments
 (0)