From e56cd51a2c67180e59351f7803c79505be6a374d Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Sat, 6 Jun 2020 10:46:43 +0800 Subject: [PATCH 1/2] [td-426] --- src/client/src/tscLocal.c | 66 ++++++++++++++++++++++++++-------- src/client/src/tscSQLParser.c | 19 +++++----- src/client/src/tscSchemaUtil.c | 7 ---- src/client/src/tscServer.c | 29 +++++---------- src/client/src/tscSql.c | 11 +++--- src/client/src/tscUtil.c | 11 ++++-- 6 files changed, 81 insertions(+), 62 deletions(-) diff --git a/src/client/src/tscLocal.c b/src/client/src/tscLocal.c index 5ffdcd2167..3835cda2a7 100644 --- a/src/client/src/tscLocal.c +++ b/src/client/src/tscLocal.c @@ -26,7 +26,7 @@ #include "tschemautil.h" #include "tname.h" -static void tscSetLocalQueryResult(SSqlObj *pSql, const char *val, const char *columnName, size_t valueLength); +static void tscSetLocalQueryResult(SSqlObj *pSql, const char *val, const char *columnName, int16_t type, size_t valueLength); static int32_t getToStringLength(const char *pData, int32_t length, int32_t type) { char buf[512] = {0}; @@ -275,22 +275,37 @@ static void tscProcessCurrentUser(SSqlObj *pSql) { SQueryInfo* pQueryInfo = tscGetQueryInfoDetail(&pSql->cmd, 0); SSqlExpr* pExpr = taosArrayGetP(pQueryInfo->exprList, 0); - tscSetLocalQueryResult(pSql, pSql->pTscObj->user, pExpr->aliasName, TSDB_USER_LEN); + pExpr->resBytes = TSDB_USER_LEN + TSDB_DATA_TYPE_BINARY; + pExpr->resType = TSDB_DATA_TYPE_BINARY; + + char* vx = calloc(1, pExpr->resBytes); + STR_WITH_MAXSIZE_TO_VARSTR(vx, pSql->pTscObj->user, TSDB_USER_LEN); + + tscSetLocalQueryResult(pSql, vx, pExpr->aliasName, pExpr->resType, pExpr->resBytes); + free(vx); } static void tscProcessCurrentDB(SSqlObj *pSql) { char db[TSDB_DB_NAME_LEN + 1] = {0}; extractDBName(pSql->pTscObj->db, db); - // no use db is invoked before. - if (strlen(db) == 0) { - setNull(db, TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN); - } - SQueryInfo* pQueryInfo = tscGetQueryInfoDetail(&pSql->cmd, 0); SSqlExpr* pExpr = taosArrayGetP(pQueryInfo->exprList, 0); - tscSetLocalQueryResult(pSql, db, pExpr->aliasName, TSDB_DB_NAME_LEN); + pExpr->resType = TSDB_DATA_TYPE_BINARY; + + size_t t = strlen(db); + pExpr->resBytes = TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE; + + char* vx = calloc(1, pExpr->resBytes); + if (t == 0) { + setVardataNull(vx, TSDB_DATA_TYPE_BINARY); + } else { + STR_WITH_SIZE_TO_VARSTR(vx, db, t); + } + + tscSetLocalQueryResult(pSql, vx, pExpr->aliasName, pExpr->resType, pExpr->resBytes); + free(vx); } static void tscProcessServerVer(SSqlObj *pSql) { @@ -298,14 +313,32 @@ static void tscProcessServerVer(SSqlObj *pSql) { SQueryInfo* pQueryInfo = tscGetQueryInfoDetail(&pSql->cmd, 0); SSqlExpr* pExpr = taosArrayGetP(pQueryInfo->exprList, 0); - tscSetLocalQueryResult(pSql, v, pExpr->aliasName, tListLen(pSql->pTscObj->sversion)); + pExpr->resType = TSDB_DATA_TYPE_BINARY; + + size_t t = strlen(v); + pExpr->resBytes = t + VARSTR_HEADER_SIZE; + + char* vx = calloc(1, pExpr->resBytes); + STR_WITH_SIZE_TO_VARSTR(vx, v, t); + tscSetLocalQueryResult(pSql, vx, pExpr->aliasName, pExpr->resType, pExpr->resBytes); + + tfree(vx); } static void tscProcessClientVer(SSqlObj *pSql) { SQueryInfo* pQueryInfo = tscGetQueryInfoDetail(&pSql->cmd, 0); SSqlExpr* pExpr = taosArrayGetP(pQueryInfo->exprList, 0); - tscSetLocalQueryResult(pSql, version, pExpr->aliasName, strlen(version)); + pExpr->resType = TSDB_DATA_TYPE_BINARY; + + size_t t = strlen(version); + pExpr->resBytes = t + VARSTR_HEADER_SIZE; + + char* v = calloc(1, pExpr->resBytes); + STR_WITH_SIZE_TO_VARSTR(v, version, t); + tscSetLocalQueryResult(pSql, v, pExpr->aliasName, pExpr->resType, pExpr->resBytes); + + tfree(v); } static void tscProcessServStatus(SSqlObj *pSql) { @@ -325,10 +358,11 @@ static void tscProcessServStatus(SSqlObj *pSql) { SQueryInfo* pQueryInfo = tscGetQueryInfoDetail(&pSql->cmd, 0); SSqlExpr* pExpr = taosArrayGetP(pQueryInfo->exprList, 0); - tscSetLocalQueryResult(pSql, "1", pExpr->aliasName, 2); + int32_t val = 1; + tscSetLocalQueryResult(pSql, (char*) &val, pExpr->aliasName, TSDB_DATA_TYPE_INT, sizeof(int32_t)); } -void tscSetLocalQueryResult(SSqlObj *pSql, const char *val, const char *columnName, size_t valueLength) { +void tscSetLocalQueryResult(SSqlObj *pSql, const char *val, const char *columnName, int16_t type, size_t valueLength) { SSqlCmd *pCmd = &pSql->cmd; SSqlRes *pRes = &pSql->res; @@ -338,8 +372,10 @@ void tscSetLocalQueryResult(SSqlObj *pSql, const char *val, const char *columnNa pQueryInfo->order.order = TSDB_ORDER_ASC; tscFieldInfoClear(&pQueryInfo->fieldsInfo); + pQueryInfo->fieldsInfo.pFields = taosArrayInit(1, sizeof(TAOS_FIELD)); + pQueryInfo->fieldsInfo.pSupportInfo = taosArrayInit(1, sizeof(SFieldSupInfo)); - TAOS_FIELD f = tscCreateField(TSDB_DATA_TYPE_BINARY, columnName, valueLength); + TAOS_FIELD f = tscCreateField(type, columnName, valueLength); tscFieldInfoAppend(&pQueryInfo->fieldsInfo, &f); tscInitResObjForLocalQuery(pSql, 1, valueLength); @@ -348,7 +384,7 @@ void tscSetLocalQueryResult(SSqlObj *pSql, const char *val, const char *columnNa SFieldSupInfo* pInfo = tscFieldInfoGetSupp(&pQueryInfo->fieldsInfo, 0); pInfo->pSqlExpr = taosArrayGetP(pQueryInfo->exprList, 0); - strncpy(pRes->data, val, pField->bytes); + memcpy(pRes->data, val, pField->bytes); } int tscProcessLocalCmd(SSqlObj *pSql) { @@ -385,7 +421,7 @@ int tscProcessLocalCmd(SSqlObj *pSql) { // keep the code in local variable in order to avoid invalid read in case of async query int32_t code = pSql->res.code; if (code == TSDB_CODE_SUCCESS) { - (*pSql->fp)(pSql->param, pSql, 0); + (*pSql->fp)(pSql->param, pSql, code); } else { tscQueueAsyncRes(pSql); } diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index ba012f414e..32ec0a0db1 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -5395,20 +5395,15 @@ int32_t doLocalQueryProcess(SQueryInfo* pQueryInfo, SQuerySQL* pQuerySql) { switch (index) { case 0: - pQueryInfo->command = TSDB_SQL_CURRENT_DB; - return TSDB_CODE_SUCCESS; + pQueryInfo->command = TSDB_SQL_CURRENT_DB;break; case 1: - pQueryInfo->command = TSDB_SQL_SERV_VERSION; - return TSDB_CODE_SUCCESS; - case 2: - pQueryInfo->command = TSDB_SQL_SERV_STATUS; - return TSDB_CODE_SUCCESS; + pQueryInfo->command = TSDB_SQL_SERV_VERSION;break; + case 2: + pQueryInfo->command = TSDB_SQL_SERV_STATUS;break; case 3: - pQueryInfo->command = TSDB_SQL_CLI_VERSION; - return TSDB_CODE_SUCCESS; + pQueryInfo->command = TSDB_SQL_CLI_VERSION;break; case 4: - pQueryInfo->command = TSDB_SQL_CURRENT_USER; - return TSDB_CODE_SUCCESS; + pQueryInfo->command = TSDB_SQL_CURRENT_USER;break; default: { return invalidSqlErrMsg(pQueryInfo->msg, msg3); } } @@ -5418,6 +5413,8 @@ int32_t doLocalQueryProcess(SQueryInfo* pQueryInfo, SQuerySQL* pQuerySql) { const char* name = (pExprList->a[0].aliasName != NULL)? pExprList->a[0].aliasName:functionsInfo[index].name; strncpy(pExpr1->aliasName, name, tListLen(pExpr1->aliasName)); + + return TSDB_CODE_SUCCESS; } // can only perform the parameters based on the macro definitation diff --git a/src/client/src/tscSchemaUtil.c b/src/client/src/tscSchemaUtil.c index ce36a73bfc..59415f842e 100644 --- a/src/client/src/tscSchemaUtil.c +++ b/src/client/src/tscSchemaUtil.c @@ -131,13 +131,6 @@ SSchema* tscGetTableColumnSchema(const STableMeta* pTableMeta, int32_t startCol) assert(pTableMeta != NULL); SSchema* pSchema = (SSchema*) pTableMeta->schema; -#if 0 - if (pTableMeta->tableType == TSDB_CHILD_TABLE) { - assert (pTableMeta->pSTable != NULL); - pSchema = pTableMeta->pSTable->schema; - } -#endif - return &pSchema[startCol]; } diff --git a/src/client/src/tscServer.c b/src/client/src/tscServer.c index d8621f526b..d2e6e0ac3f 100644 --- a/src/client/src/tscServer.c +++ b/src/client/src/tscServer.c @@ -1391,22 +1391,9 @@ int tscProcessDescribeTableRsp(SSqlObj *pSql) { return tscLocalResultCommonBuilder(pSql, numOfRes); } -int tscProcessTagRetrieveRsp(SSqlObj *pSql) { -// SSqlCmd *pCmd = &pSql->cmd; - -// SQueryInfo * pQueryInfo = tscGetQueryInfoDetail(pCmd, pCmd->clauseIndex); -// STableMetaInfo *pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0); - - int32_t numOfRes = 0; -#if 0 - if (tscSqlExprGet(pQueryInfo, 0)->functionId == TSDB_FUNC_TAGPRJ) { - numOfRes = pTableMetaInfo->pMetricMeta->numOfTables; - } else { - numOfRes = 1; // for count function, there is only one output. - } - -#endif - +int tscProcessLocalRetrieveRsp(SSqlObj *pSql) { + int32_t numOfRes = 1; + pSql->res.completed = true; return tscLocalResultCommonBuilder(pSql, numOfRes); } @@ -2562,11 +2549,11 @@ void tscInitMsgsFp() { tscProcessMsgRsp[TSDB_SQL_RETRIEVE] = tscProcessRetrieveRspFromNode; // rsp handled by same function. tscProcessMsgRsp[TSDB_SQL_DESCRIBE_TABLE] = tscProcessDescribeTableRsp; - tscProcessMsgRsp[TSDB_SQL_CURRENT_DB] = tscProcessTagRetrieveRsp; - tscProcessMsgRsp[TSDB_SQL_CURRENT_USER] = tscProcessTagRetrieveRsp; - tscProcessMsgRsp[TSDB_SQL_SERV_VERSION] = tscProcessTagRetrieveRsp; - tscProcessMsgRsp[TSDB_SQL_CLI_VERSION] = tscProcessTagRetrieveRsp; - tscProcessMsgRsp[TSDB_SQL_SERV_STATUS] = tscProcessTagRetrieveRsp; + tscProcessMsgRsp[TSDB_SQL_CURRENT_DB] = tscProcessLocalRetrieveRsp; + tscProcessMsgRsp[TSDB_SQL_CURRENT_USER] = tscProcessLocalRetrieveRsp; + tscProcessMsgRsp[TSDB_SQL_SERV_VERSION] = tscProcessLocalRetrieveRsp; + tscProcessMsgRsp[TSDB_SQL_CLI_VERSION] = tscProcessLocalRetrieveRsp; + tscProcessMsgRsp[TSDB_SQL_SERV_STATUS] = tscProcessLocalRetrieveRsp; tscProcessMsgRsp[TSDB_SQL_RETRIEVE_EMPTY_RESULT] = tscProcessEmptyResultRsp; diff --git a/src/client/src/tscSql.c b/src/client/src/tscSql.c index 5ff417f7d5..e5832bacfc 100644 --- a/src/client/src/tscSql.c +++ b/src/client/src/tscSql.c @@ -414,10 +414,6 @@ int taos_fetch_block_impl(TAOS_RES *res, TAOS_ROW *rows) { static void waitForRetrieveRsp(void *param, TAOS_RES *tres, int numOfRows) { SSqlObj* pSql = (SSqlObj*) tres; - - if (numOfRows < 0) { // set the error code - pSql->res.code = -numOfRows; - } sem_post(&pSql->rspSem); } @@ -445,7 +441,12 @@ TAOS_ROW taos_fetch_row(TAOS_RES *res) { pCmd->command == TSDB_SQL_FETCH || pCmd->command == TSDB_SQL_SHOW || pCmd->command == TSDB_SQL_SELECT || - pCmd->command == TSDB_SQL_DESCRIBE_TABLE)) { + pCmd->command == TSDB_SQL_DESCRIBE_TABLE || + pCmd->command == TSDB_SQL_SERV_STATUS || + pCmd->command == TSDB_SQL_CURRENT_DB || + pCmd->command == TSDB_SQL_SERV_VERSION || + pCmd->command == TSDB_SQL_CLI_VERSION || + pCmd->command == TSDB_SQL_CURRENT_USER )) { taos_fetch_rows_a(res, waitForRetrieveRsp, pSql->pTscObj); sem_wait(&pSql->rspSem); } diff --git a/src/client/src/tscUtil.c b/src/client/src/tscUtil.c index 1b9fec7211..811d0920f9 100644 --- a/src/client/src/tscUtil.c +++ b/src/client/src/tscUtil.c @@ -965,7 +965,8 @@ static SSqlExpr* doBuildSqlExpr(SQueryInfo* pQueryInfo, int16_t functionId, SCol SSchema* pSchema = tscGetTableTagSchema(pTableMetaInfo->pTableMeta); pExpr->colInfo.colId = pSchema[pColIndex->columnIndex].colId; strncpy(pExpr->colInfo.name, pSchema[pColIndex->columnIndex].name, TSDB_COL_NAME_LEN); - } else { + } else if (pTableMetaInfo->pTableMeta != NULL) { + // in handling select database/version/server_status(), the pTableMeta is NULL SSchema* pSchema = tscGetTableColumnSchema(pTableMetaInfo->pTableMeta, pColIndex->columnIndex); pExpr->colInfo.colId = pSchema->colId; strncpy(pExpr->colInfo.name, pSchema->name, TSDB_COL_NAME_LEN); @@ -977,8 +978,12 @@ static SSqlExpr* doBuildSqlExpr(SQueryInfo* pQueryInfo, int16_t functionId, SCol pExpr->colInfo.colIndex = pColIndex->columnIndex; pExpr->resType = type; pExpr->resBytes = size; - pExpr->interBytes = interSize; - pExpr->uid = pTableMetaInfo->pTableMeta->uid; + pExpr->interBytes = interSize; + + if (pTableMetaInfo->pTableMeta) { + pExpr->uid = pTableMetaInfo->pTableMeta->uid; + } + return pExpr; } From 768327dfc0793def2a21f076d5b175d0d2993b8b Mon Sep 17 00:00:00 2001 From: Hui Li Date: Sat, 6 Jun 2020 11:45:12 +0800 Subject: [PATCH 2/2] [modify sim case] --- .../arbitrator/dn3_mn1_vnode_change.sim | 123 ++++++++++++++---- 1 file changed, 97 insertions(+), 26 deletions(-) diff --git a/tests/script/unique/arbitrator/dn3_mn1_vnode_change.sim b/tests/script/unique/arbitrator/dn3_mn1_vnode_change.sim index b94c297ff7..c156d7d55c 100644 --- a/tests/script/unique/arbitrator/dn3_mn1_vnode_change.sim +++ b/tests/script/unique/arbitrator/dn3_mn1_vnode_change.sim @@ -93,14 +93,14 @@ if $data00 != $totalRows then return -1 endi -print ============== step3: stop dnode2, and remove its vnodeX subdirector -system sh/exec.sh -n dnode2 -s stop -x SIGINT +print ============== step3: stop dnode4, and remove its vnodeX subdirector +system sh/exec.sh -n dnode4 -s stop -x SIGINT sleep $sleepTimer -wait_dnode2_offline_0: +wait_dnode4_offline_0: sql show dnodes if $rows != 4 then sleep 2000 - goto wait_dnode2_offline_0 + goto wait_dnode4_offline_0 endi print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1 print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2 @@ -110,26 +110,49 @@ print $data0_3 $data1_3 $data2_3 $data3_3 $data4_3 #print $data0_6 $data1_6 $data2_6 $data3_6 $data4_6 #$dnode1Status = $data4_1 $dnode2Status = $data4_2 -#$dnode3Status = $data4_3 -#$dnode4Status = $data4_4 +$dnode3Status = $data4_3 +$dnode4Status = $data4_4 #$dnode5Status = $data4_5 -if $dnode2Status != offline then +if $dnode4Status != offline then sleep 2000 - goto wait_dnode2_offline_0 + goto wait_dnode4_offline_0 endi -system rm -rf ../../../sim/dnode2/data/vnode/* +wait_dnode4_vgroup_offline: +sql show vgroups +if $rows != 1 then + sleep 2000 + goto wait_dnode4_vgroup_offline +endi +print show vgroups: +print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1 $data5_1 $data6_1 $data7_1 $data8_1 $data9_1 +print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2 $data5_2 $data6_2 $data7_2 $data8_2 $data9_2 +print $data0_3 $data1_3 $data2_3 $data3_3 $data4_3 $data5_3 $data6_3 $data7_3 $data8_3 $data9_3 +$dnode4Vtatus = $data4_2 +$dnode3Vtatus = $data7_2 + +if $dnode4Vtatus != offline then + sleep 2000 + goto wait_dnode4_vgroup_offline +endi +if $dnode3Vtatus != master then + sleep 2000 + goto wait_dnode4_vgroup_offline +endi + + +system rm -rf ../../../sim/dnode4/data/vnode/* sleep 1000 -print ============== step4: restart dnode2, waiting sync end -system sh/exec.sh -n dnode2 -s start +print ============== step4: restart dnode4, waiting sync end +system sh/exec.sh -n dnode4 -s start sleep $sleepTimer -wait_dnode2_reready: +wait_dnode4_reready: sql show dnodes if $rows != 4 then sleep 2000 - goto wait_dnode2_reready + goto wait_dnode4_reready endi print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1 print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2 @@ -139,25 +162,49 @@ print $data0_3 $data1_3 $data2_3 $data3_3 $data4_3 #print $data0_6 $data1_6 $data2_6 $data3_6 $data4_6 #$dnode1Status = $data4_1 $dnode2Status = $data4_2 -#$dnode3Status = $data4_3 -#$dnode4Status = $data4_4 +$dnode3Status = $data4_3 +$dnode4Status = $data4_4 #$dnode5Status = $data4_5 -if $dnode2Status != ready then +if $dnode4Status != ready then sleep 2000 - goto wait_dnode2_reready + goto wait_dnode4_reready endi -print ============== step5: stop dnode3/dnode4, and check rows +wait_dnode4_vgroup_slave: +sql show vgroups +if $rows != 1 then + sleep 2000 + goto wait_dnode4_vgroup_slave +endi +print show vgroups: +print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1 $data5_1 $data6_1 $data7_1 $data8_1 $data9_1 +print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2 $data5_2 $data6_2 $data7_2 $data8_2 $data9_2 +print $data0_3 $data1_3 $data2_3 $data3_3 $data4_3 $data5_3 $data6_3 $data7_3 $data8_3 $data9_3 +$dnode4Vtatus = $data4_2 +$dnode3Vtatus = $data7_2 + +print dnode4Vtatus: $dnode4Vtatus +print dnode3Vtatus: $dnode3Vtatus +if $dnode4Vtatus != slave then + sleep 2000 + goto wait_dnode4_vgroup_slave +endi +if $dnode3Vtatus != master then + sleep 2000 + goto wait_dnode4_vgroup_slave +endi + +print ============== step5: stop dnode3/dnode2, and check rows +system sh/exec.sh -n dnode2 -s stop system sh/exec.sh -n dnode3 -s stop -system sh/exec.sh -n dnode4 -s stop sleep $sleepTimer -wait_dnode34_offline: +wait_dnode23_offline: sql show dnodes if $rows != 4 then sleep 2000 - goto wait_dnode34_offline + goto wait_dnode23_offline endi print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1 print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2 @@ -171,17 +218,41 @@ $dnode3Status = $data4_3 $dnode4Status = $data4_4 #$dnode5Status = $data4_5 -if $dnode2Status != ready then +if $dnode2Status != offline then sleep 2000 - goto wait_dnode34_offline + goto wait_dnode23_offline endi if $dnode3Status != offline then sleep 2000 - goto wait_dnode34_offline + goto wait_dnode23_offline endi -if $dnode4Status != offline then +if $dnode4Status != ready then sleep 2000 - goto wait_dnode34_offline + goto wait_dnode23_offline +endi + +wait_dnode4_vgroup_master: +sql show vgroups +if $rows != 1 then + sleep 2000 + goto wait_dnode4_vgroup_master +endi +print show vgroups: +print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1 $data5_1 $data6_1 $data7_1 $data8_1 $data9_1 +print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2 $data5_2 $data6_2 $data7_2 $data8_2 $data9_2 +print $data0_3 $data1_3 $data2_3 $data3_3 $data4_3 $data5_3 $data6_3 $data7_3 $data8_3 $data9_3 +$dnode4Vtatus = $data4_2 +$dnode3Vtatus = $data7_2 + +print dnode4Vtatus: $dnode4Vtatus +print dnode3Vtatus: $dnode3Vtatus +if $dnode4Vtatus != master then + sleep 2000 + goto wait_dnode4_vgroup_master +endi +if $dnode3Vtatus != offline then + sleep 2000 + goto wait_dnode4_vgroup_master endi # check using select