Merge pull request #20750 from taosdata/fix/TS-3071
fix: add stmt error handling
This commit is contained in:
commit
dace3393ab
|
@ -26,6 +26,7 @@ extern "C" {
|
|||
#define tscFatal(...) do { if (cDebugFlag & DEBUG_FATAL) { taosPrintLog("TSC FATAL ", DEBUG_FATAL, cDebugFlag, __VA_ARGS__); }} while(0)
|
||||
#define tscError(...) do { if (cDebugFlag & DEBUG_ERROR) { taosPrintLog("TSC ERROR ", DEBUG_ERROR, cDebugFlag, __VA_ARGS__); }} while(0)
|
||||
#define tscWarn(...) do { if (cDebugFlag & DEBUG_WARN) { taosPrintLog("TSC WARN ", DEBUG_WARN, cDebugFlag, __VA_ARGS__); }} while(0)
|
||||
#define tscWarnL(...) do { if (cDebugFlag & DEBUG_WARN) { taosPrintLongString("TSC WARN ", DEBUG_WARN, cDebugFlag, __VA_ARGS__); }} while(0)
|
||||
#define tscInfo(...) do { if (cDebugFlag & DEBUG_INFO) { taosPrintLog("TSC ", DEBUG_INFO, cDebugFlag, __VA_ARGS__); }} while(0)
|
||||
#define tscDebug(...) do { if (cDebugFlag & DEBUG_DEBUG) { taosPrintLog("TSC ", DEBUG_DEBUG, cDebugFlag, __VA_ARGS__); }} while(0)
|
||||
#define tscTrace(...) do { if (cDebugFlag & DEBUG_TRACE) { taosPrintLog("TSC ", DEBUG_TRACE, cDebugFlag, __VA_ARGS__); }} while(0)
|
||||
|
|
|
@ -102,6 +102,7 @@ typedef struct STscStmt {
|
|||
SStmtBindInfo bInfo;
|
||||
|
||||
int64_t reqid;
|
||||
int32_t errCode;
|
||||
} STscStmt;
|
||||
|
||||
extern char *gStmtStatusStr[];
|
||||
|
@ -121,6 +122,7 @@ extern char *gStmtStatusStr[];
|
|||
int32_t _code = c; \
|
||||
if (_code != TSDB_CODE_SUCCESS) { \
|
||||
terrno = _code; \
|
||||
pStmt->errCode = _code; \
|
||||
return _code; \
|
||||
} \
|
||||
} while (0)
|
||||
|
@ -129,6 +131,7 @@ extern char *gStmtStatusStr[];
|
|||
int32_t _code = c; \
|
||||
if (_code != TSDB_CODE_SUCCESS) { \
|
||||
terrno = _code; \
|
||||
pStmt->errCode = _code; \
|
||||
} \
|
||||
return _code; \
|
||||
} while (0)
|
||||
|
@ -137,6 +140,7 @@ extern char *gStmtStatusStr[];
|
|||
code = c; \
|
||||
if (code != TSDB_CODE_SUCCESS) { \
|
||||
terrno = code; \
|
||||
pStmt->errCode = code; \
|
||||
goto _return; \
|
||||
} \
|
||||
} while (0)
|
||||
|
|
|
@ -103,6 +103,7 @@ static void deregisterRequest(SRequestObj *pRequest) {
|
|||
|
||||
if (duration >= SLOW_QUERY_INTERVAL) {
|
||||
atomic_add_fetch_64((int64_t *)&pActivity->numOfSlowQueries, 1);
|
||||
tscWarnL("slow query: %s, duration:%" PRId64, pRequest->sqlstr, duration);
|
||||
}
|
||||
|
||||
releaseTscObj(pTscObj->id);
|
||||
|
|
|
@ -32,8 +32,14 @@ int32_t stmtSwitchStatus(STscStmt* pStmt, STMT_STATUS newStatus) {
|
|||
STMT_LOG_SEQ(newStatus);
|
||||
}
|
||||
|
||||
if (pStmt->errCode && newStatus != STMT_PREPARE) {
|
||||
STMT_DLOG("stmt already failed with err: %s", tstrerror(pStmt->errCode));
|
||||
return pStmt->errCode;
|
||||
}
|
||||
|
||||
switch (newStatus) {
|
||||
case STMT_PREPARE:
|
||||
pStmt->errCode = 0;
|
||||
break;
|
||||
case STMT_SETTBNAME:
|
||||
if (STMT_STATUS_EQ(INIT) || STMT_STATUS_EQ(BIND) || STMT_STATUS_EQ(BIND_COL)) {
|
||||
|
@ -197,7 +203,10 @@ int32_t stmtGetExecInfo(TAOS_STMT* stmt, SHashObj** pVgHash, SHashObj** pBlockHa
|
|||
STscStmt* pStmt = (STscStmt*)stmt;
|
||||
|
||||
*pVgHash = pStmt->sql.pVgHash;
|
||||
pStmt->sql.pVgHash = NULL;
|
||||
|
||||
*pBlockHash = pStmt->exec.pBlockHash;
|
||||
pStmt->exec.pBlockHash = NULL;
|
||||
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
@ -325,6 +334,8 @@ int32_t stmtCleanExecInfo(STscStmt* pStmt, bool keepTable, bool deepClean) {
|
|||
}
|
||||
|
||||
int32_t stmtCleanSQLInfo(STscStmt* pStmt) {
|
||||
STMT_DLOG_E("start to free SQL info");
|
||||
|
||||
taosMemoryFree(pStmt->sql.queryRes.fields);
|
||||
taosMemoryFree(pStmt->sql.queryRes.userFields);
|
||||
taosMemoryFree(pStmt->sql.sqlStr);
|
||||
|
@ -351,6 +362,8 @@ int32_t stmtCleanSQLInfo(STscStmt* pStmt) {
|
|||
|
||||
memset(&pStmt->sql, 0, sizeof(pStmt->sql));
|
||||
|
||||
STMT_DLOG_E("end to free SQL info");
|
||||
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -441,11 +454,10 @@ int32_t stmtGetFromCache(STscStmt* pStmt) {
|
|||
.mgmtEps = getEpSet_s(&pStmt->taos->pAppInfo->mgmtEp)};
|
||||
int32_t code = catalogGetTableMeta(pStmt->pCatalog, &conn, &pStmt->bInfo.sname, &pTableMeta);
|
||||
if (TSDB_CODE_PAR_TABLE_NOT_EXIST == code) {
|
||||
STMT_ERR_RET(stmtCleanBindInfo(pStmt));
|
||||
|
||||
tscDebug("tb %s not exist", pStmt->bInfo.tbFName);
|
||||
stmtCleanBindInfo(pStmt);
|
||||
|
||||
return TSDB_CODE_SUCCESS;
|
||||
STMT_ERR_RET(code);
|
||||
}
|
||||
|
||||
STMT_ERR_RET(code);
|
||||
|
@ -922,9 +934,13 @@ _return:
|
|||
int stmtClose(TAOS_STMT* stmt) {
|
||||
STscStmt* pStmt = (STscStmt*)stmt;
|
||||
|
||||
STMT_DLOG_E("start to free stmt");
|
||||
|
||||
stmtCleanSQLInfo(pStmt);
|
||||
taosMemoryFree(stmt);
|
||||
|
||||
STMT_DLOG_E("stmt freed");
|
||||
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
@ -122,9 +122,11 @@ int insertAUTOTest2(TAOS_STMT *stmt, TAOS *taos);
|
|||
int insertAUTOTest3(TAOS_STMT *stmt, TAOS *taos);
|
||||
int queryColumnTest(TAOS_STMT *stmt, TAOS *taos);
|
||||
int queryMiscTest(TAOS_STMT *stmt, TAOS *taos);
|
||||
int insertNonExistsTb(TAOS_STMT *stmt, TAOS *taos);
|
||||
|
||||
enum {
|
||||
TTYPE_INSERT = 1,
|
||||
TTYPE_INSERT_NG,
|
||||
TTYPE_QUERY,
|
||||
};
|
||||
|
||||
|
@ -187,6 +189,8 @@ CaseCfg gCase[] = {
|
|||
{"query:SUBT-COLUMN", tListLen(fullColList), fullColList, TTYPE_QUERY, 0, false, false, queryColumnTest, 10, 10, 1, 3, 0, 0, 1, 2},
|
||||
{"query:SUBT-MISC", tListLen(fullColList), fullColList, TTYPE_QUERY, 0, false, false, queryMiscTest, 10, 10, 1, 3, 0, 0, 1, 2},
|
||||
|
||||
{"query:NG-TBNEXISTS",tListLen(fullColList), fullColList, TTYPE_INSERT_NG,0, false, false, insertNonExistsTb, 10, 10, 1, 3, 0, 0, 1, -1},
|
||||
|
||||
// {"query:SUBT-COLUMN", tListLen(fullColList), fullColList, TTYPE_QUERY, 0, false, false, queryColumnTest, 1, 10, 1, 1, 0, 0, 1, 2},
|
||||
// {"query:SUBT-MISC", tListLen(fullColList), fullColList, TTYPE_QUERY, 0, false, false, queryMiscTest, 2, 10, 1, 1, 0, 0, 1, 2},
|
||||
|
||||
|
@ -250,7 +254,7 @@ CaseCtrl gCaseCtrl = {
|
|||
.funcIdxList = NULL,
|
||||
.checkParamNum = false,
|
||||
.runTimes = 0,
|
||||
.caseIdx = 24,
|
||||
.caseIdx = 26,
|
||||
.caseNum = 1,
|
||||
.caseRunIdx = -1,
|
||||
.caseRunNum = -1,
|
||||
|
@ -2191,6 +2195,47 @@ int queryMiscTest(TAOS_STMT *stmt, TAOS *taos) {
|
|||
}
|
||||
|
||||
|
||||
int insertNonExistsTb(TAOS_STMT *stmt, TAOS *taos) {
|
||||
BindData data = {0};
|
||||
prepareInsertData(&data);
|
||||
|
||||
int code = taos_stmt_prepare(stmt, data.sql, 0);
|
||||
if (code != 0){
|
||||
printf("!!!failed to execute taos_stmt_prepare. error:%s\n", taos_stmt_errstr(stmt));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
bpCheckIsInsert(stmt, 1);
|
||||
|
||||
char *buf = "tbnexist";
|
||||
code = bpSetTableNameTags(&data, 0, buf, stmt);
|
||||
if (code == 0){
|
||||
printf("!!!taos_stmt_set_tbname expected error not occurred\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (0 == taos_stmt_bind_param_batch(stmt, data.pBind)) {
|
||||
printf("!!!taos_stmt_bind_param_batch expected error not occurred\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (0 == taos_stmt_add_batch(stmt)) {
|
||||
printf("!!!taos_stmt_add_batch expected error not occurred\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (0 == taos_stmt_execute(stmt)) {
|
||||
printf("!!!taos_stmt_execute expected error not occurred\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
destroyData(&data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int errorSQLTest1(TAOS_STMT *stmt, TAOS *taos) {
|
||||
BindData data = {0};
|
||||
|
||||
|
@ -2213,6 +2258,10 @@ int errorSQLTest1(TAOS_STMT *stmt, TAOS *taos) {
|
|||
}
|
||||
|
||||
void prepareCheckResultImpl(TAOS * taos, char *tname, bool printr, int expected, bool silent) {
|
||||
if (TTYPE_INSERT_NG == gCurCase->testType) {
|
||||
return;
|
||||
}
|
||||
|
||||
char sql[255] = "SELECT * FROM ";
|
||||
int32_t rows = 0;
|
||||
|
||||
|
|
Loading…
Reference in New Issue