diff --git a/src/client/inc/tsclient.h b/src/client/inc/tsclient.h index 6226cf1f1d836c8ba42d131b42c03a644ba0ce74..60ad60ab4a191f1c02b88b8470123a327c5e29a5 100644 --- a/src/client/inc/tsclient.h +++ b/src/client/inc/tsclient.h @@ -386,6 +386,8 @@ typedef struct _sql_obj { SSqlRes res; char numOfSubs; + char* asyncTblPos; + void* pTableHashList; struct _sql_obj **pSubs; struct _sql_obj * prev, *next; } SSqlObj; diff --git a/src/client/src/tscParseInsert.c b/src/client/src/tscParseInsert.c index 58cfcda17e27e42aae22c0f7a65658e6ce279476..f01652b7160d6124f0d6ee27fbda977cdc6de5c6 100644 --- a/src/client/src/tscParseInsert.c +++ b/src/client/src/tscParseInsert.c @@ -840,9 +840,17 @@ int doParserInsertSql(SSqlObj *pSql, char *str) { return code; } - void *pTableHashList = taosInitIntHash(128, POINTER_BYTES, taosHashInt); - - pSql->cmd.pDataBlocks = tscCreateBlockArrayList(); + if ((NULL == pSql->asyncTblPos) && (NULL == pSql->pTableHashList)) { + pSql->pTableHashList = taosInitIntHash(128, POINTER_BYTES, taosHashInt); + pSql->cmd.pDataBlocks = tscCreateBlockArrayList(); + if (NULL == pSql->pTableHashList || NULL == pSql->cmd.pDataBlocks) { + code = TSDB_CODE_CLI_OUT_OF_MEMORY; + goto _error_clean; + } + } else { + str = pSql->asyncTblPos; + } + tscTrace("%p create data block list for submit data, %p", pSql, pSql->cmd.pDataBlocks); while (1) { @@ -861,6 +869,8 @@ int doParserInsertSql(SSqlObj *pSql, char *str) { } } + pSql->asyncTblPos = sToken.z; + // Check if the table name available or not if (validateTableName(sToken.z, sToken.n) != TSDB_CODE_SUCCESS) { code = tscInvalidSQLErrMsg(pCmd->payload, "table name invalid", sToken.z); @@ -875,7 +885,8 @@ int doParserInsertSql(SSqlObj *pSql, char *str) { void *fp = pSql->fp; if ((code = tscParseSqlForCreateTableOnDemand(&str, pSql)) != TSDB_CODE_SUCCESS) { if (fp != NULL) { - goto _clean; + //goto _clean; + return code; } else { /* * for async insert, the free data block operations, which is tscDestroyBlockArrayList, @@ -918,7 +929,7 @@ int doParserInsertSql(SSqlObj *pSql, char *str) { * app here insert data in different vnodes, so we need to set the following * data in another submit procedure using async insert routines */ - code = doParseInsertStatement(pSql, pTableHashList, &str, &spd, &totalNum); + code = doParseInsertStatement(pSql, pSql->pTableHashList, &str, &spd, &totalNum); if (code != TSDB_CODE_SUCCESS) { goto _error_clean; } @@ -1033,7 +1044,7 @@ int doParserInsertSql(SSqlObj *pSql, char *str) { goto _error_clean; } - code = doParseInsertStatement(pSql, pTableHashList, &str, &spd, &totalNum); + code = doParseInsertStatement(pSql, pSql->pTableHashList, &str, &spd, &totalNum); if (code != TSDB_CODE_SUCCESS) { goto _error_clean; } @@ -1073,7 +1084,8 @@ _error_clean: pCmd->pDataBlocks = tscDestroyBlockArrayList(pCmd->pDataBlocks); _clean: - taosCleanUpIntHash(pTableHashList); + taosCleanUpIntHash(pSql->pTableHashList); + pSql->pTableHashList = NULL; return code; } @@ -1108,7 +1120,11 @@ int tsParseSql(SSqlObj *pSql, char *acct, char *db, bool multiVnodeInsertion) { // must before clean the sqlcmd object tscRemoveAllMeterMetaInfo(&pSql->cmd, false); - tscCleanSqlCmd(&pSql->cmd); + + if (NULL == pSql->asyncTblPos) { + tscTrace("continue parse sql: %s", pSql->asyncTblPos); + tscCleanSqlCmd(&pSql->cmd); + } if (tscIsInsertOrImportData(pSql->sqlstr)) { /* diff --git a/src/client/src/tscServer.c b/src/client/src/tscServer.c index 64c0be92837e6713830dae163fd29c59966af7ee..1daca7b8a3875c55eb51735d779ee54c272b7b45 100644 --- a/src/client/src/tscServer.c +++ b/src/client/src/tscServer.c @@ -3581,9 +3581,9 @@ int tscGetMeterMeta(SSqlObj *pSql, char *meterId, int32_t index) { * for async insert operation, release data block buffer before issue new object to get metermeta * because in metermeta callback function, the tscParse function will generate the submit data blocks */ - if (pSql->fp != NULL && pSql->pStream == NULL) { - tscFreeSqlCmdData(pCmd); - } + //if (pSql->fp != NULL && pSql->pStream == NULL) { + // tscFreeSqlCmdData(pCmd); + //} return tscDoGetMeterMeta(pSql, meterId, index); } diff --git a/src/client/src/tscSql.c b/src/client/src/tscSql.c index 233a37dc5930f8b5d16d608882ced99148493c4f..0732a87e64b0c5d942dc3b7ca1cd2bbfacba785b 100644 --- a/src/client/src/tscSql.c +++ b/src/client/src/tscSql.c @@ -230,6 +230,12 @@ int taos_query_imp(STscObj* pObj, SSqlObj* pSql) { pRes->numOfRows = 1; pRes->numOfTotal = 0; + pSql->asyncTblPos = NULL; + if (NULL != pSql->pTableHashList) { + taosCleanUpIntHash(pSql->pTableHashList); + pSql->pTableHashList = NULL; + } + tscTrace("%p SQL: %s pObj:%p", pSql, pSql->sqlstr, pObj); pRes->code = (uint8_t)tsParseSql(pSql, pObj->acctId, pObj->db, false); @@ -940,6 +946,12 @@ int taos_validate_sql(TAOS *taos, const char *sql) { strtolower(pSql->sqlstr, sql); + pSql->asyncTblPos = NULL; + if (NULL != pSql->pTableHashList) { + taosCleanUpIntHash(pSql->pTableHashList); + pSql->pTableHashList = NULL; + } + pRes->code = (uint8_t)tsParseSql(pSql, pObj->acctId, pObj->db, false); int code = pRes->code;