提交 c413d18b 编写于 作者: S slguan

Merge branch 'feature/slguan' of https://github.com/taosdata/TDengine into feature/slguan

...@@ -34,7 +34,7 @@ TDengine能够与开源数据可视化系统[Grafana](https://www.grafana.com/) ...@@ -34,7 +34,7 @@ TDengine能够与开源数据可视化系统[Grafana](https://www.grafana.com/)
### 安装Grafana ### 安装Grafana
目前TDengine支持Grafana 5.2.4以上的版本。用户可以根据当前的操作系统,到Grafana官网下载安装包,并执行安装。下载地址如下:https://grafana.com/grafana/download 目前TDengine支持Grafana 5.2.4以上的版本。用户可以根据当前的操作系统,到Grafana官网下载安装包,并执行安装。下载地址如下:https://grafana.com/grafana/download
### 配置Grafana ### 配置Grafana
...@@ -42,43 +42,60 @@ TDengine的Grafana插件在安装包的/usr/local/taos/connector/grafana目录 ...@@ -42,43 +42,60 @@ TDengine的Grafana插件在安装包的/usr/local/taos/connector/grafana目录
以CentOS 7.2操作系统为例,将tdengine目录拷贝到/var/lib/grafana/plugins目录下,重新启动grafana即可。 以CentOS 7.2操作系统为例,将tdengine目录拷贝到/var/lib/grafana/plugins目录下,重新启动grafana即可。
### 使用Grafana ### 使用 Grafana
用户可以直接通过localhost:3000的网址,登录Grafana服务器(用户名/密码:admin/admin),配置TDengine数据源,如下图所示,此时可以在下拉列表中看到TDengine数据源。 #### 配置数据源
![img](../assets/clip_image001.png) 用户可以直接通过localhost:3000的网址,登录Grafana服务器(用户名/密码:admin/admin),通过左侧`Configuration -> Data Sources`可以添加数据源,如下图所示:
TDengine数据源中的HTTP配置里面的Host地址要设置为TDengine集群的中任意一台服务器的IP地址与TDengine RESTful接口的端口号(6020)。假设TDengine数据库与Grafana部署在同一机器,那么应输入:http://localhost:6020。 ![img](../assets/add_datasource1.jpg)
此外,还需配置登录TDengine的用户名与密码,然后点击下图中的Save&Test按钮保存。 点击 `Add data source` 可进入新增数据源页面,在查询框中输入TDengine 可选择添加,如下图所示:
![img](../assets/clip_image001-2474914.png) ![img](../assets/add_datasource2.jpg)
进入数据源配置页面,按照默认提示修改相应配置即可:
![img](../assets/add_datasource3.jpg)
然后,就可以在Grafana的数据源列表中看到刚创建好的TDengine的数据源: * HostTDengine:集群的中任意一台服务器的IP地址与TDengine RESTful接口的端口号(6020),默认http://localhost:6020。
* User:TDengine 用户名。
* Password:TDengine 用户密码。
![img](../assets/clip_image001-2474939.png) 点击 `Save & Test` 进行测试,成功会有如下提示:
![img](../assets/add_datasource4.jpg)
#### 创建 Dashboard
基于上面的步骤,就可以在创建Dashboard的时候使用TDengine数据源,如下图所示: 回到主界面创建 Dashboard,点击 Add Query 进入面板查询页面:
![img](../assets/clip_image001-2474961.png) ![img](../assets/create_dashboard1.jpg)
如上图所示,在 Query 中选中 `TDengine` 数据源,在下方查询框可输入相应 sql 进行查询,具体说明如下:
* INPUT SQL:输入要查询的语句(该 SQL 语句的结果集应为两列多行),例如:`select avg(mem_system) from log.dn where ts >= $from and ts < $to interval($interval)` ,其中,from、to 和 interval 为 TDengine插件的内置变量,表示从Grafana插件面板获取的查询范围和时间间隔。除了内置变量外,`也支持可以使用自定义模板变量`
* ALIAS BY:可设置当前查询别名。
* GENERATE SQL: 点击该按钮会自动替换相应变量,并生成最终执行的语句。
然后,可以点击Add Query按钮增加一个新查询。 按照默认提示查询当前 TDengine 部署所在服务器指定间隔系统内存平均使用量如下:
在INPUT SQL输入框中输入查询SQL语句,该SQL语句的结果集应为两行多列的曲线数据,例如SELECT count(*) FROM sys.cpu WHERE ts>=from and ts<​to interval(interval)。其中,from、to和interval为TDengine插件的内置变量,表示从Grafana插件面板获取的查询范围和时间间隔。 ![img](../assets/create_dashboard2.jpg)
ALIAS BY输入框为查询的别名,点击GENERATE SQL 按钮可以获取发送给TDengine的SQL语句。如下图所示: > 关于如何使用Grafana创建相应的监测界面以及更多有关使用Grafana的信息,请参考Grafana官方的[文档](https://grafana.com/docs/)。
>
#### 导入 Dashboard
![img](../assets/clip_image001-2474987.png) 在 Grafana 插件目录 /usr/local/taos/connector/grafana/tdengine/dashboard/ 下提供了一个 `tdengine-grafana.json` 可导入的 dashboard。
点击左侧 `Import` 按钮,并上传 `tdengine-grafana.json` 文件:
![img](../assets/import_dashboard1.jpg)
导入完成之后可看到如下效果:
![img](../assets/import_dashboard2.jpg)
关于如何使用Grafana创建相应的监测界面以及更多有关使用Grafana的信息,请参考Grafana官方的[文档](https://grafana.com/docs/)
## Matlab ## Matlab
......
...@@ -66,19 +66,24 @@ typedef struct SJoinSubquerySupporter { ...@@ -66,19 +66,24 @@ typedef struct SJoinSubquerySupporter {
char path[PATH_MAX]; // temporary file path char path[PATH_MAX]; // temporary file path
} SJoinSubquerySupporter; } SJoinSubquerySupporter;
void tscDestroyDataBlock(STableDataBlocks* pDataBlock); int32_t tscCreateDataBlock(size_t initialSize, int32_t rowSize, int32_t startOffset, const char* name,
STableDataBlocks* tscCreateDataBlock(size_t initialBufSize, int32_t rowSize, int32_t startOffset, const char* name); STableDataBlocks** dataBlocks);
void tscAppendDataBlock(SDataBlockList* pList, STableDataBlocks* pBlocks); void tscAppendDataBlock(SDataBlockList* pList, STableDataBlocks* pBlocks);
void tscDestroyDataBlock(STableDataBlocks* pDataBlock);
SParamInfo* tscAddParamToDataBlock(STableDataBlocks* pDataBlock, char type, uint8_t timePrec, short bytes, SParamInfo* tscAddParamToDataBlock(STableDataBlocks* pDataBlock, char type, uint8_t timePrec, short bytes,
uint32_t offset); uint32_t offset);
SDataBlockList* tscCreateBlockArrayList(); SDataBlockList* tscCreateBlockArrayList();
void* tscDestroyBlockArrayList(SDataBlockList* pList); void* tscDestroyBlockArrayList(SDataBlockList* pList);
int32_t tscCopyDataBlockToPayload(SSqlObj* pSql, STableDataBlocks* pDataBlock); int32_t tscCopyDataBlockToPayload(SSqlObj* pSql, STableDataBlocks* pDataBlock);
void tscFreeUnusedDataBlocks(SDataBlockList* pList); void tscFreeUnusedDataBlocks(SDataBlockList* pList);
int32_t tscMergeTableDataBlocks(SSqlObj* pSql, SDataBlockList* pDataList); int32_t tscMergeTableDataBlocks(SSqlObj* pSql, SDataBlockList* pDataList);
STableDataBlocks* tscGetDataBlockFromList(void* pHashList, SDataBlockList* pDataBlockList, int64_t id, int32_t size, int32_t tscGetDataBlockFromList(void* pHashList, SDataBlockList* pDataBlockList, int64_t id, int32_t size,
int32_t startOffset, int32_t rowSize, const char* tableId); int32_t startOffset, int32_t rowSize, const char* tableId,
STableDataBlocks** dataBlocks);
SVnodeSidList* tscGetVnodeSidList(SMetricMeta* pMetricmeta, int32_t vnodeIdx); SVnodeSidList* tscGetVnodeSidList(SMetricMeta* pMetricmeta, int32_t vnodeIdx);
SMeterSidExtInfo* tscGetMeterSidInfo(SVnodeSidList* pSidList, int32_t idx); SMeterSidExtInfo* tscGetMeterSidInfo(SVnodeSidList* pSidList, int32_t idx);
......
...@@ -466,11 +466,17 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_fetchRowImp(JNIEn ...@@ -466,11 +466,17 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_fetchRowImp(JNIEn
case TSDB_DATA_TYPE_BIGINT: case TSDB_DATA_TYPE_BIGINT:
(*env)->CallVoidMethod(env, rowobj, g_rowdataSetLongFp, i, (jlong) * ((int64_t *)row[i])); (*env)->CallVoidMethod(env, rowobj, g_rowdataSetLongFp, i, (jlong) * ((int64_t *)row[i]));
break; break;
case TSDB_DATA_TYPE_FLOAT: case TSDB_DATA_TYPE_FLOAT: {
(*env)->CallVoidMethod(env, rowobj, g_rowdataSetFloatFp, i, (jfloat) * ((float *)row[i])); float fv = 0;
fv = GET_FLOAT_VAL(row[i]);
(*env)->CallVoidMethod(env, rowobj, g_rowdataSetFloatFp, i, (jfloat)fv);
}
break; break;
case TSDB_DATA_TYPE_DOUBLE: case TSDB_DATA_TYPE_DOUBLE: {
(*env)->CallVoidMethod(env, rowobj, g_rowdataSetDoubleFp, i, (jdouble) * ((double *)row[i])); double dv = 0;
dv = GET_DOUBLE_VAL(row[i]);
(*env)->CallVoidMethod(env, rowobj, g_rowdataSetDoubleFp, i, (jdouble)dv);
}
break; break;
case TSDB_DATA_TYPE_BINARY: { case TSDB_DATA_TYPE_BINARY: {
strncpy(tmp, row[i], (size_t) fields[i].bytes); // handle the case that terminated does not exist strncpy(tmp, row[i], (size_t) fields[i].bytes); // handle the case that terminated does not exist
...@@ -615,11 +621,17 @@ JNIEXPORT jobject JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_consumeImp(JNI ...@@ -615,11 +621,17 @@ JNIEXPORT jobject JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_consumeImp(JNI
case TSDB_DATA_TYPE_BIGINT: case TSDB_DATA_TYPE_BIGINT:
(*env)->CallVoidMethod(env, rowobj, g_rowdataSetLongFp, i, (jlong) * ((int64_t *)row[i])); (*env)->CallVoidMethod(env, rowobj, g_rowdataSetLongFp, i, (jlong) * ((int64_t *)row[i]));
break; break;
case TSDB_DATA_TYPE_FLOAT: case TSDB_DATA_TYPE_FLOAT: {
(*env)->CallVoidMethod(env, rowobj, g_rowdataSetFloatFp, i, (jfloat) * ((float *)row[i])); float fv = 0;
fv = GET_FLOAT_VAL(row[i]);
(*env)->CallVoidMethod(env, rowobj, g_rowdataSetFloatFp, i, (jfloat)fv);
}
break; break;
case TSDB_DATA_TYPE_DOUBLE: case TSDB_DATA_TYPE_DOUBLE:{
(*env)->CallVoidMethod(env, rowobj, g_rowdataSetDoubleFp, i, (jdouble) * ((double *)row[i])); double dv = 0;
dv = GET_DOUBLE_VAL(row[i]);
(*env)->CallVoidMethod(env, rowobj, g_rowdataSetDoubleFp, i, (jdouble)dv);
}
break; break;
case TSDB_DATA_TYPE_BINARY: { case TSDB_DATA_TYPE_BINARY: {
strncpy(tmp, row[i], (size_t) fields[i].bytes); // handle the case that terminated does not exist strncpy(tmp, row[i], (size_t) fields[i].bytes); // handle the case that terminated does not exist
......
...@@ -39,25 +39,17 @@ static int32_t getToStringLength(const char *pData, int32_t length, int32_t type ...@@ -39,25 +39,17 @@ static int32_t getToStringLength(const char *pData, int32_t length, int32_t type
case TSDB_DATA_TYPE_NCHAR: case TSDB_DATA_TYPE_NCHAR:
return length; return length;
case TSDB_DATA_TYPE_DOUBLE: { case TSDB_DATA_TYPE_DOUBLE: {
#ifdef _TD_ARM_32_
double dv = 0; double dv = 0;
*(int64_t *)(&dv) = *(int64_t *)pData; dv = GET_DOUBLE_VAL(pData);
len = sprintf(buf, "%f", dv); len = sprintf(buf, "%lf", dv);
#else
len = sprintf(buf, "%lf", *(double *)pData);
#endif
if (strncasecmp("nan", buf, 3) == 0) { if (strncasecmp("nan", buf, 3) == 0) {
len = 4; len = 4;
} }
} break; } break;
case TSDB_DATA_TYPE_FLOAT: { case TSDB_DATA_TYPE_FLOAT: {
#ifdef _TD_ARM_32_
float fv = 0; float fv = 0;
*(int32_t *)(&fv) = *(int32_t *)pData; fv = GET_FLOAT_VAL(pData);
len = sprintf(buf, "%f", fv); len = sprintf(buf, "%f", fv);
#else
len = sprintf(buf, "%f", *(float *)pData);
#endif
if (strncasecmp("nan", buf, 3) == 0) { if (strncasecmp("nan", buf, 3) == 0) {
len = 4; len = 4;
} }
...@@ -201,22 +193,14 @@ static int32_t tscSetValueToResObj(SSqlObj *pSql, int32_t rowLen) { ...@@ -201,22 +193,14 @@ static int32_t tscSetValueToResObj(SSqlObj *pSql, int32_t rowLen) {
taosUcs4ToMbs(pTagValue, pSchema[i].bytes, target); taosUcs4ToMbs(pTagValue, pSchema[i].bytes, target);
break; break;
case TSDB_DATA_TYPE_FLOAT: { case TSDB_DATA_TYPE_FLOAT: {
#ifdef _TD_ARM_32_
float fv = 0; float fv = 0;
*(int32_t *)(&fv) = *(int32_t *)pTagValue; fv = GET_FLOAT_VAL(pTagValue);
sprintf(target, "%f", fv); sprintf(target, "%f", fv);
#else
sprintf(target, "%f", *(float *)pTagValue);
#endif
} break; } break;
case TSDB_DATA_TYPE_DOUBLE: { case TSDB_DATA_TYPE_DOUBLE: {
#ifdef _TD_ARM_32_
double dv = 0; double dv = 0;
*(int64_t *)(&dv) = *(int64_t *)pTagValue; dv = GET_DOUBLE_VAL(pTagValue);
sprintf(target, "%lf", dv); sprintf(target, "%lf", dv);
#else
sprintf(target, "%lf", *(double *)pTagValue);
#endif
} break; } break;
case TSDB_DATA_TYPE_TINYINT: case TSDB_DATA_TYPE_TINYINT:
sprintf(target, "%d", *(int8_t *)pTagValue); sprintf(target, "%d", *(int8_t *)pTagValue);
......
...@@ -653,9 +653,12 @@ static int32_t doParseInsertStatement(SSqlObj *pSql, void *pTableHashList, char ...@@ -653,9 +653,12 @@ static int32_t doParseInsertStatement(SSqlObj *pSql, void *pTableHashList, char
SMeterMetaInfo *pMeterMetaInfo = tscGetMeterMetaInfo(pCmd, 0); SMeterMetaInfo *pMeterMetaInfo = tscGetMeterMetaInfo(pCmd, 0);
SMeterMeta * pMeterMeta = pMeterMetaInfo->pMeterMeta; SMeterMeta * pMeterMeta = pMeterMetaInfo->pMeterMeta;
STableDataBlocks *dataBuf = STableDataBlocks *dataBuf = NULL;
tscGetDataBlockFromList(pTableHashList, pCmd->pDataBlocks, pMeterMeta->uid, TSDB_DEFAULT_PAYLOAD_SIZE, int32_t ret = tscGetDataBlockFromList(pTableHashList, pCmd->pDataBlocks, pMeterMeta->uid, TSDB_DEFAULT_PAYLOAD_SIZE,
sizeof(SShellSubmitBlock), pMeterMeta->rowSize, pMeterMetaInfo->name); sizeof(SShellSubmitBlock), pMeterMeta->rowSize, pMeterMetaInfo->name, &dataBuf);
if (ret != TSDB_CODE_SUCCESS) {
return ret;
}
int32_t maxNumOfRows = tscAllocateMemIfNeed(dataBuf, pMeterMeta->rowSize); int32_t maxNumOfRows = tscAllocateMemIfNeed(dataBuf, pMeterMeta->rowSize);
if (0 == maxNumOfRows) { if (0 == maxNumOfRows) {
...@@ -1072,8 +1075,12 @@ int doParserInsertSql(SSqlObj *pSql, char *str) { ...@@ -1072,8 +1075,12 @@ int doParserInsertSql(SSqlObj *pSql, char *str) {
strcpy(fname, full_path.we_wordv[0]); strcpy(fname, full_path.we_wordv[0]);
wordfree(&full_path); wordfree(&full_path);
STableDataBlocks *pDataBlock = tscCreateDataBlock(PATH_MAX, pMeterMetaInfo->pMeterMeta->rowSize, STableDataBlocks *pDataBlock = NULL;
sizeof(SShellSubmitBlock), pMeterMetaInfo->name); int32_t ret = tscCreateDataBlock(PATH_MAX, pMeterMetaInfo->pMeterMeta->rowSize, sizeof(SShellSubmitBlock),
pMeterMetaInfo->name, &pDataBlock);
if (ret != TSDB_CODE_SUCCESS) {
goto _error_clean;
}
tscAppendDataBlock(pCmd->pDataBlocks, pDataBlock); tscAppendDataBlock(pCmd->pDataBlocks, pDataBlock);
strcpy(pDataBlock->filename, fname); strcpy(pDataBlock->filename, fname);
...@@ -1314,8 +1321,12 @@ static int tscInsertDataFromFile(SSqlObj *pSql, FILE *fp, char *tmpTokenBuf) { ...@@ -1314,8 +1321,12 @@ static int tscInsertDataFromFile(SSqlObj *pSql, FILE *fp, char *tmpTokenBuf) {
int32_t rowSize = pMeterMeta->rowSize; int32_t rowSize = pMeterMeta->rowSize;
pCmd->pDataBlocks = tscCreateBlockArrayList(); pCmd->pDataBlocks = tscCreateBlockArrayList();
STableDataBlocks *pTableDataBlock = tscCreateDataBlock(TSDB_PAYLOAD_SIZE, pMeterMeta->rowSize, STableDataBlocks *pTableDataBlock = NULL;
sizeof(SShellSubmitBlock), pMeterMetaInfo->name); int32_t ret = tscCreateDataBlock(TSDB_PAYLOAD_SIZE, pMeterMeta->rowSize, sizeof(SShellSubmitBlock),
pMeterMetaInfo->name, &pTableDataBlock);
if (ret != TSDB_CODE_SUCCESS) {
return -1;
}
tscAppendDataBlock(pCmd->pDataBlocks, pTableDataBlock); tscAppendDataBlock(pCmd->pDataBlocks, pTableDataBlock);
......
...@@ -121,11 +121,11 @@ static int normalStmtBindParam(STscStmt* stmt, TAOS_BIND* bind) { ...@@ -121,11 +121,11 @@ static int normalStmtBindParam(STscStmt* stmt, TAOS_BIND* bind) {
break; break;
case TSDB_DATA_TYPE_FLOAT: case TSDB_DATA_TYPE_FLOAT:
var->dKey = *(float*)tb->buffer; var->dKey = GET_FLOAT_VAL(tb->buffer);
break; break;
case TSDB_DATA_TYPE_DOUBLE: case TSDB_DATA_TYPE_DOUBLE:
var->dKey = *(double*)tb->buffer; var->dKey = GET_DOUBLE_VAL(tb->buffer);
break; break;
case TSDB_DATA_TYPE_BINARY: case TSDB_DATA_TYPE_BINARY:
......
...@@ -2165,7 +2165,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, int32_t colIdx, tSQLExprItem* pItem ...@@ -2165,7 +2165,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, int32_t colIdx, tSQLExprItem* pItem
if (optr == TK_PERCENTILE || optr == TK_APERCENTILE) { if (optr == TK_PERCENTILE || optr == TK_APERCENTILE) {
tVariantDump(pVariant, val, TSDB_DATA_TYPE_DOUBLE); tVariantDump(pVariant, val, TSDB_DATA_TYPE_DOUBLE);
double dp = *((double*)val); double dp = GET_DOUBLE_VAL(val);
if (dp < 0 || dp > TOP_BOTTOM_QUERY_LIMIT) { if (dp < 0 || dp > TOP_BOTTOM_QUERY_LIMIT) {
return invalidSqlErrMsg(pCmd, msg5); return invalidSqlErrMsg(pCmd, msg5);
} }
......
...@@ -887,12 +887,18 @@ int taos_print_row(char *str, TAOS_ROW row, TAOS_FIELD *fields, int num_fields) ...@@ -887,12 +887,18 @@ int taos_print_row(char *str, TAOS_ROW row, TAOS_FIELD *fields, int num_fields)
len += sprintf(str + len, "%" PRId64 " ", *((int64_t *)row[i])); len += sprintf(str + len, "%" PRId64 " ", *((int64_t *)row[i]));
break; break;
case TSDB_DATA_TYPE_FLOAT: case TSDB_DATA_TYPE_FLOAT: {
len += sprintf(str + len, "%f ", *((float *)row[i])); float fv = 0;
fv = GET_FLOAT_VAL(row[i]);
len += sprintf(str + len, "%f ", fv);
}
break; break;
case TSDB_DATA_TYPE_DOUBLE: case TSDB_DATA_TYPE_DOUBLE:{
len += sprintf(str + len, "%lf ", *((double *)row[i])); double dv = 0;
dv = GET_DOUBLE_VAL(row[i]);
len += sprintf(str + len, "%lf ", dv);
}
break; break;
case TSDB_DATA_TYPE_BINARY: case TSDB_DATA_TYPE_BINARY:
......
...@@ -22,8 +22,8 @@ ...@@ -22,8 +22,8 @@
#include "tscJoinProcess.h" #include "tscJoinProcess.h"
#include "tscProfile.h" #include "tscProfile.h"
#include "tscSecondaryMerge.h" #include "tscSecondaryMerge.h"
#include "tscUtil.h"
#include "tschemautil.h" #include "tschemautil.h"
#include "tscUtil.h"
#include "tsclient.h" #include "tsclient.h"
#include "tsqldef.h" #include "tsqldef.h"
#include "ttimer.h" #include "ttimer.h"
...@@ -60,7 +60,7 @@ void tscGetMetricMetaCacheKey(SSqlCmd* pCmd, char* str, uint64_t uid) { ...@@ -60,7 +60,7 @@ void tscGetMetricMetaCacheKey(SSqlCmd* pCmd, char* str, uint64_t uid) {
} }
// estimate the buffer size // estimate the buffer size
size_t tbnameCondLen = pTagCond->tbnameCond.cond != NULL? strlen(pTagCond->tbnameCond.cond):0; size_t tbnameCondLen = pTagCond->tbnameCond.cond != NULL ? strlen(pTagCond->tbnameCond.cond) : 0;
size_t redundantLen = 20; size_t redundantLen = 20;
size_t bufSize = strlen(pMeterMetaInfo->name) + tbnameCondLen + strlen(join) + strlen(tagIdBuf); size_t bufSize = strlen(pMeterMetaInfo->name) + tbnameCondLen + strlen(join) + strlen(tagIdBuf);
...@@ -68,12 +68,11 @@ void tscGetMetricMetaCacheKey(SSqlCmd* pCmd, char* str, uint64_t uid) { ...@@ -68,12 +68,11 @@ void tscGetMetricMetaCacheKey(SSqlCmd* pCmd, char* str, uint64_t uid) {
bufSize += strlen(cond->cond); bufSize += strlen(cond->cond);
} }
bufSize = (size_t) ((bufSize + redundantLen) * 1.5); bufSize = (size_t)((bufSize + redundantLen) * 1.5);
char* tmp = calloc(1, bufSize); char* tmp = calloc(1, bufSize);
int32_t keyLen = snprintf(tmp, bufSize, "%s,%s,%s,%d,%s,[%s],%d", pMeterMetaInfo->name, int32_t keyLen = snprintf(tmp, bufSize, "%s,%s,%s,%d,%s,[%s],%d", pMeterMetaInfo->name,
(cond != NULL ? cond->cond : NULL), (cond != NULL ? cond->cond : NULL), (tbnameCondLen > 0 ? pTagCond->tbnameCond.cond : NULL),
(tbnameCondLen > 0 ? pTagCond->tbnameCond.cond : NULL),
pTagCond->relType, join, tagIdBuf, pCmd->groupbyExpr.orderType); pTagCond->relType, join, tagIdBuf, pCmd->groupbyExpr.orderType);
assert(keyLen <= bufSize); assert(keyLen <= bufSize);
...@@ -84,7 +83,7 @@ void tscGetMetricMetaCacheKey(SSqlCmd* pCmd, char* str, uint64_t uid) { ...@@ -84,7 +83,7 @@ void tscGetMetricMetaCacheKey(SSqlCmd* pCmd, char* str, uint64_t uid) {
MD5_CTX ctx; MD5_CTX ctx;
MD5Init(&ctx); MD5Init(&ctx);
MD5Update(&ctx, (uint8_t*) tmp, keyLen); MD5Update(&ctx, (uint8_t*)tmp, keyLen);
char* pStr = base64_encode(ctx.digest, tListLen(ctx.digest)); char* pStr = base64_encode(ctx.digest, tListLen(ctx.digest));
strcpy(str, pStr); strcpy(str, pStr);
} }
...@@ -242,11 +241,11 @@ bool tscProjectionQueryOnMetric(SSqlCmd* pCmd) { ...@@ -242,11 +241,11 @@ bool tscProjectionQueryOnMetric(SSqlCmd* pCmd) {
return false; return false;
} }
//for project query, only the following two function is allowed // for project query, only the following two function is allowed
for (int32_t i = 0; i < pCmd->fieldsInfo.numOfOutputCols; ++i) { for (int32_t i = 0; i < pCmd->fieldsInfo.numOfOutputCols; ++i) {
int32_t functionId = tscSqlExprGet(pCmd, i)->functionId; int32_t functionId = tscSqlExprGet(pCmd, i)->functionId;
if (functionId != TSDB_FUNC_PRJ && functionId != TSDB_FUNC_TAGPRJ && if (functionId != TSDB_FUNC_PRJ && functionId != TSDB_FUNC_TAGPRJ && functionId != TSDB_FUNC_TAG &&
functionId != TSDB_FUNC_TAG && functionId != TSDB_FUNC_TS && functionId != TSDB_FUNC_ARITHM) { functionId != TSDB_FUNC_TS && functionId != TSDB_FUNC_ARITHM) {
return false; return false;
} }
} }
...@@ -460,7 +459,7 @@ void tscDestroyDataBlock(STableDataBlocks* pDataBlock) { ...@@ -460,7 +459,7 @@ void tscDestroyDataBlock(STableDataBlocks* pDataBlock) {
tfree(pDataBlock->params); tfree(pDataBlock->params);
// free the refcount for metermeta // free the refcount for metermeta
taosRemoveDataFromCache(tscCacheHandle, (void**) &(pDataBlock->pMeterMeta), false); taosRemoveDataFromCache(tscCacheHandle, (void**)&(pDataBlock->pMeterMeta), false);
tfree(pDataBlock); tfree(pDataBlock);
} }
...@@ -533,16 +532,16 @@ void* tscDestroyBlockArrayList(SDataBlockList* pList) { ...@@ -533,16 +532,16 @@ void* tscDestroyBlockArrayList(SDataBlockList* pList) {
} }
int32_t tscCopyDataBlockToPayload(SSqlObj* pSql, STableDataBlocks* pDataBlock) { int32_t tscCopyDataBlockToPayload(SSqlObj* pSql, STableDataBlocks* pDataBlock) {
SSqlCmd *pCmd = &pSql->cmd; SSqlCmd* pCmd = &pSql->cmd;
assert(pDataBlock->pMeterMeta != NULL); assert(pDataBlock->pMeterMeta != NULL);
pCmd->count = pDataBlock->numOfMeters; pCmd->count = pDataBlock->numOfMeters;
SMeterMetaInfo *pMeterMetaInfo = tscGetMeterMetaInfo(pCmd, 0); SMeterMetaInfo* pMeterMetaInfo = tscGetMeterMetaInfo(pCmd, 0);
//set the correct metermeta object, the metermeta has been locked in pDataBlocks, so it must be in the cache // set the correct metermeta object, the metermeta has been locked in pDataBlocks, so it must be in the cache
if (pMeterMetaInfo->pMeterMeta != pDataBlock->pMeterMeta) { if (pMeterMetaInfo->pMeterMeta != pDataBlock->pMeterMeta) {
strcpy(pMeterMetaInfo->name, pDataBlock->meterId); strcpy(pMeterMetaInfo->name, pDataBlock->meterId);
taosRemoveDataFromCache(tscCacheHandle, (void**) &(pMeterMetaInfo->pMeterMeta), false); taosRemoveDataFromCache(tscCacheHandle, (void**)&(pMeterMetaInfo->pMeterMeta), false);
pMeterMetaInfo->pMeterMeta = pDataBlock->pMeterMeta; pMeterMetaInfo->pMeterMeta = pDataBlock->pMeterMeta;
pDataBlock->pMeterMeta = NULL; // delegate the ownership of metermeta to pMeterMetaInfo pDataBlock->pMeterMeta = NULL; // delegate the ownership of metermeta to pMeterMetaInfo
...@@ -587,13 +586,18 @@ void tscFreeUnusedDataBlocks(SDataBlockList* pList) { ...@@ -587,13 +586,18 @@ void tscFreeUnusedDataBlocks(SDataBlockList* pList) {
* @param rowSize * @param rowSize
* @param startOffset * @param startOffset
* @param name * @param name
* @param pMeterMeta the ownership of pMeterMeta should be transfer to STableDataBlocks * @param dataBlocks
* @return * @return
*/ */
STableDataBlocks* tscCreateDataBlock(size_t initialSize, int32_t rowSize, int32_t startOffset, const char* name) { int32_t tscCreateDataBlock(size_t initialSize, int32_t rowSize, int32_t startOffset, const char* name,
STableDataBlocks** dataBlocks) {
STableDataBlocks* dataBuf = (STableDataBlocks*)calloc(1, sizeof(STableDataBlocks)); STableDataBlocks* dataBuf = (STableDataBlocks*)calloc(1, sizeof(STableDataBlocks));
dataBuf->nAllocSize = (uint32_t) initialSize; if (dataBuf == NULL) {
tscError("failed to allocated memory, reason:%s", strerror(errno));
return TSDB_CODE_CLI_OUT_OF_MEMORY;
}
dataBuf->nAllocSize = (uint32_t)initialSize;
dataBuf->pData = calloc(1, dataBuf->nAllocSize); dataBuf->pData = calloc(1, dataBuf->nAllocSize);
dataBuf->ordered = true; dataBuf->ordered = true;
dataBuf->prevTS = INT64_MIN; dataBuf->prevTS = INT64_MIN;
...@@ -604,29 +608,43 @@ STableDataBlocks* tscCreateDataBlock(size_t initialSize, int32_t rowSize, int32_ ...@@ -604,29 +608,43 @@ STableDataBlocks* tscCreateDataBlock(size_t initialSize, int32_t rowSize, int32_
strncpy(dataBuf->meterId, name, TSDB_METER_ID_LEN); strncpy(dataBuf->meterId, name, TSDB_METER_ID_LEN);
// sure that the metermeta must be in the local client cache /*
* The metermeta may be released since the metermeta cache are completed clean by other thread
* due to operation such as drop database.
*/
dataBuf->pMeterMeta = taosGetDataFromCache(tscCacheHandle, dataBuf->meterId); dataBuf->pMeterMeta = taosGetDataFromCache(tscCacheHandle, dataBuf->meterId);
assert(dataBuf->pMeterMeta != NULL && initialSize > 0); assert(initialSize > 0);
return dataBuf; if (dataBuf->pMeterMeta == NULL) {
tfree(dataBuf);
return TSDB_CODE_QUERY_CACHE_ERASED;
} else {
*dataBlocks = dataBuf;
return TSDB_CODE_SUCCESS;
}
} }
STableDataBlocks* tscGetDataBlockFromList(void* pHashList, SDataBlockList* pDataBlockList, int64_t id, int32_t size, int32_t tscGetDataBlockFromList(void* pHashList, SDataBlockList* pDataBlockList, int64_t id, int32_t size,
int32_t startOffset, int32_t rowSize, const char* tableId) { int32_t startOffset, int32_t rowSize, const char* tableId,
STableDataBlocks* dataBuf = NULL; STableDataBlocks** dataBlocks) {
*dataBlocks = NULL;
STableDataBlocks** t1 = (STableDataBlocks**)taosGetIntHashData(pHashList, id); STableDataBlocks** t1 = (STableDataBlocks**) taosGetIntHashData(pHashList, id);
if (t1 != NULL) { if (t1 != NULL) {
dataBuf = *t1; *dataBlocks = *t1;
} }
if (dataBuf == NULL) { if (*dataBlocks == NULL) {
dataBuf = tscCreateDataBlock((size_t)size, rowSize, startOffset, tableId); int32_t ret = tscCreateDataBlock((size_t) size, rowSize, startOffset, tableId, dataBlocks);
dataBuf = *(STableDataBlocks**)taosAddIntHash(pHashList, id, (char*)&dataBuf); if (ret != TSDB_CODE_SUCCESS) {
tscAppendDataBlock(pDataBlockList, dataBuf); return ret;
} }
return dataBuf; *dataBlocks = *(STableDataBlocks**)taosAddIntHash(pHashList, id, (char*)dataBlocks);
tscAppendDataBlock(pDataBlockList, *dataBlocks);
}
return TSDB_CODE_SUCCESS;
} }
int32_t tscMergeTableDataBlocks(SSqlObj* pSql, SDataBlockList* pTableDataBlockList) { int32_t tscMergeTableDataBlocks(SSqlObj* pSql, SDataBlockList* pTableDataBlockList) {
...@@ -638,9 +656,15 @@ int32_t tscMergeTableDataBlocks(SSqlObj* pSql, SDataBlockList* pTableDataBlockLi ...@@ -638,9 +656,15 @@ int32_t tscMergeTableDataBlocks(SSqlObj* pSql, SDataBlockList* pTableDataBlockLi
for (int32_t i = 0; i < pTableDataBlockList->nSize; ++i) { for (int32_t i = 0; i < pTableDataBlockList->nSize; ++i) {
STableDataBlocks* pOneTableBlock = pTableDataBlockList->pData[i]; STableDataBlocks* pOneTableBlock = pTableDataBlockList->pData[i];
STableDataBlocks* dataBuf = STableDataBlocks* dataBuf = NULL;
tscGetDataBlockFromList(pVnodeDataBlockHashList, pVnodeDataBlockList, pOneTableBlock->vgid, TSDB_PAYLOAD_SIZE, int32_t ret = tscGetDataBlockFromList(pVnodeDataBlockHashList, pVnodeDataBlockList, pOneTableBlock->vgid,
tsInsertHeadSize, 0, pOneTableBlock->meterId); TSDB_PAYLOAD_SIZE, tsInsertHeadSize, 0, pOneTableBlock->meterId, &dataBuf);
if (ret != TSDB_CODE_SUCCESS) {
tscError("%p failed to allocate the data buffer block for merging table data", pSql);
tscDestroyBlockArrayList(pTableDataBlockList);
return ret;
}
int64_t destSize = dataBuf->size + pOneTableBlock->size; int64_t destSize = dataBuf->size + pOneTableBlock->size;
if (dataBuf->nAllocSize < destSize) { if (dataBuf->nAllocSize < destSize) {
...@@ -1155,7 +1179,7 @@ SColumnBase* tscColumnBaseInfoInsert(SSqlCmd* pCmd, SColumnIndex* pColIndex) { ...@@ -1155,7 +1179,7 @@ SColumnBase* tscColumnBaseInfoInsert(SSqlCmd* pCmd, SColumnIndex* pColIndex) {
} }
void tscColumnFilterInfoCopy(SColumnFilterInfo* dst, const SColumnFilterInfo* src) { void tscColumnFilterInfoCopy(SColumnFilterInfo* dst, const SColumnFilterInfo* src) {
assert (src != NULL && dst != NULL); assert(src != NULL && dst != NULL);
assert(src->filterOnBinary == 0 || src->filterOnBinary == 1); assert(src->filterOnBinary == 0 || src->filterOnBinary == 1);
if (src->lowerRelOptr == TSDB_RELATION_INVALID && src->upperRelOptr == TSDB_RELATION_INVALID) { if (src->lowerRelOptr == TSDB_RELATION_INVALID && src->upperRelOptr == TSDB_RELATION_INVALID) {
...@@ -1164,15 +1188,15 @@ void tscColumnFilterInfoCopy(SColumnFilterInfo* dst, const SColumnFilterInfo* sr ...@@ -1164,15 +1188,15 @@ void tscColumnFilterInfoCopy(SColumnFilterInfo* dst, const SColumnFilterInfo* sr
*dst = *src; *dst = *src;
if (dst->filterOnBinary) { if (dst->filterOnBinary) {
size_t len = (size_t) dst->len + 1; size_t len = (size_t)dst->len + 1;
char* pTmp = calloc(1, len); char* pTmp = calloc(1, len);
dst->pz = (int64_t) pTmp; dst->pz = (int64_t)pTmp;
memcpy((char*) dst->pz, (char*) src->pz, (size_t) len); memcpy((char*)dst->pz, (char*)src->pz, (size_t)len);
} }
} }
void tscColumnBaseCopy(SColumnBase* dst, const SColumnBase* src) { void tscColumnBaseCopy(SColumnBase* dst, const SColumnBase* src) {
assert (src != NULL && dst != NULL); assert(src != NULL && dst != NULL);
*dst = *src; *dst = *src;
...@@ -1230,7 +1254,7 @@ void tscColumnBaseInfoDestroy(SColumnBaseInfo* pColumnBaseInfo) { ...@@ -1230,7 +1254,7 @@ void tscColumnBaseInfoDestroy(SColumnBaseInfo* pColumnBaseInfo) {
assert(pColBase->filterInfo[j].filterOnBinary == 0 || pColBase->filterInfo[j].filterOnBinary == 1); assert(pColBase->filterInfo[j].filterOnBinary == 0 || pColBase->filterInfo[j].filterOnBinary == 1);
if (pColBase->filterInfo[j].filterOnBinary) { if (pColBase->filterInfo[j].filterOnBinary) {
free((char*) pColBase->filterInfo[j].pz); free((char*)pColBase->filterInfo[j].pz);
pColBase->filterInfo[j].pz = 0; pColBase->filterInfo[j].pz = 0;
} }
} }
...@@ -1780,13 +1804,15 @@ bool tscIsUpdateQuery(STscObj* pObj) { ...@@ -1780,13 +1804,15 @@ bool tscIsUpdateQuery(STscObj* pObj) {
SSqlCmd* pCmd = &pObj->pSql->cmd; SSqlCmd* pCmd = &pObj->pSql->cmd;
return ((pCmd->command >= TSDB_SQL_INSERT && pCmd->command <= TSDB_SQL_DROP_DNODE) || return ((pCmd->command >= TSDB_SQL_INSERT && pCmd->command <= TSDB_SQL_DROP_DNODE) ||
TSDB_SQL_USE_DB == pCmd->command) ? 1 : 0; TSDB_SQL_USE_DB == pCmd->command)
? 1
: 0;
} }
int32_t tscInvalidSQLErrMsg(char *msg, const char *additionalInfo, const char *sql) { int32_t tscInvalidSQLErrMsg(char* msg, const char* additionalInfo, const char* sql) {
const char *msgFormat1 = "invalid SQL: %s"; const char* msgFormat1 = "invalid SQL: %s";
const char *msgFormat2 = "invalid SQL: syntax error near \"%s\" (%s)"; const char* msgFormat2 = "invalid SQL: syntax error near \"%s\" (%s)";
const char *msgFormat3 = "invalid SQL: syntax error near \"%s\""; const char* msgFormat3 = "invalid SQL: syntax error near \"%s\"";
const int32_t BACKWARD_CHAR_STEP = 0; const int32_t BACKWARD_CHAR_STEP = 0;
...@@ -1816,4 +1842,3 @@ bool tscHasReachLimitation(SSqlObj* pSql) { ...@@ -1816,4 +1842,3 @@ bool tscHasReachLimitation(SSqlObj* pSql) {
return (pCmd->globalLimit > 0 && pRes->numOfTotal >= pCmd->globalLimit); return (pCmd->globalLimit > 0 && pRes->numOfTotal >= pCmd->globalLimit);
} }
...@@ -27,11 +27,11 @@ import "C" ...@@ -27,11 +27,11 @@ import "C"
import ( import (
"database/sql/driver" "database/sql/driver"
"errors" "errors"
"strconv"
"unsafe"
"fmt" "fmt"
"io" "io"
"strconv"
"time" "time"
"unsafe"
) )
/****************************************************************************** /******************************************************************************
...@@ -44,7 +44,7 @@ func (mc *taosConn) readColumns(count int) ([]taosSqlField, error) { ...@@ -44,7 +44,7 @@ func (mc *taosConn) readColumns(count int) ([]taosSqlField, error) {
var result unsafe.Pointer var result unsafe.Pointer
result = C.taos_use_result(mc.taos) result = C.taos_use_result(mc.taos)
if result == nil { if result == nil {
return nil , errors.New("invalid result") return nil, errors.New("invalid result")
} }
pFields := (*C.struct_taosField)(C.taos_fetch_fields(result)) pFields := (*C.struct_taosField)(C.taos_fetch_fields(result))
...@@ -52,7 +52,7 @@ func (mc *taosConn) readColumns(count int) ([]taosSqlField, error) { ...@@ -52,7 +52,7 @@ func (mc *taosConn) readColumns(count int) ([]taosSqlField, error) {
// TODO: Optimized rewriting !!!! // TODO: Optimized rewriting !!!!
fields := (*[1 << 30]C.struct_taosField)(unsafe.Pointer(pFields)) fields := (*[1 << 30]C.struct_taosField)(unsafe.Pointer(pFields))
for i := 0; i<count; i++ { for i := 0; i < count; i++ {
//columns[i].tableName = ms.taos. //columns[i].tableName = ms.taos.
//fmt.Println(reflect.TypeOf(fields[i].name)) //fmt.Println(reflect.TypeOf(fields[i].name))
var charray []byte var charray []byte
...@@ -60,7 +60,7 @@ func (mc *taosConn) readColumns(count int) ([]taosSqlField, error) { ...@@ -60,7 +60,7 @@ func (mc *taosConn) readColumns(count int) ([]taosSqlField, error) {
//fmt.Println("fields[i].name[j]: ", fields[i].name[j]) //fmt.Println("fields[i].name[j]: ", fields[i].name[j])
if fields[i].name[j] != 0 { if fields[i].name[j] != 0 {
charray = append(charray, byte(fields[i].name[j])) charray = append(charray, byte(fields[i].name[j]))
}else { } else {
break break
} }
} }
...@@ -91,6 +91,7 @@ func (rows *taosSqlRows) readRow(dest []driver.Value) error { ...@@ -91,6 +91,7 @@ func (rows *taosSqlRows) readRow(dest []driver.Value) error {
row := C.taos_fetch_row(result) row := C.taos_fetch_row(result)
if row == nil { if row == nil {
rows.rs.done = true rows.rs.done = true
C.taos_free_result(result)
rows.mc = nil rows.mc = nil
return io.EOF return io.EOF
} }
...@@ -98,7 +99,7 @@ func (rows *taosSqlRows) readRow(dest []driver.Value) error { ...@@ -98,7 +99,7 @@ func (rows *taosSqlRows) readRow(dest []driver.Value) error {
// because sizeof(void*) == sizeof(int*) == 8 // because sizeof(void*) == sizeof(int*) == 8
// notes: sizeof(int) == 8 in go, but sizeof(int) == 4 in C. // notes: sizeof(int) == 8 in go, but sizeof(int) == 4 in C.
for i := range dest { for i := range dest {
currentRow := (unsafe.Pointer)(uintptr(*((*int)(unsafe.Pointer(uintptr(unsafe.Pointer(row)) + uintptr(i) * unsafe.Sizeof(int(0))))))) currentRow := (unsafe.Pointer)(uintptr(*((*int)(unsafe.Pointer(uintptr(unsafe.Pointer(row)) + uintptr(i)*unsafe.Sizeof(int(0)))))))
if currentRow == nil { if currentRow == nil {
dest[i] = nil dest[i] = nil
...@@ -107,7 +108,7 @@ func (rows *taosSqlRows) readRow(dest []driver.Value) error { ...@@ -107,7 +108,7 @@ func (rows *taosSqlRows) readRow(dest []driver.Value) error {
switch rows.rs.columns[i].fieldType { switch rows.rs.columns[i].fieldType {
case C.TSDB_DATA_TYPE_BOOL: case C.TSDB_DATA_TYPE_BOOL:
if (*((*byte)(currentRow))) != 0{ if (*((*byte)(currentRow))) != 0 {
dest[i] = true dest[i] = true
} else { } else {
dest[i] = false dest[i] = false
...@@ -142,7 +143,7 @@ func (rows *taosSqlRows) readRow(dest []driver.Value) error { ...@@ -142,7 +143,7 @@ func (rows *taosSqlRows) readRow(dest []driver.Value) error {
charLen := rows.rs.columns[i].length charLen := rows.rs.columns[i].length
var index uint32 var index uint32
binaryVal := make([]byte, charLen) binaryVal := make([]byte, charLen)
for index=0; index < charLen; index++ { for index = 0; index < charLen; index++ {
binaryVal[index] = *((*byte)(unsafe.Pointer(uintptr(currentRow) + uintptr(index)))) binaryVal[index] = *((*byte)(unsafe.Pointer(uintptr(currentRow) + uintptr(index))))
} }
dest[i] = string(binaryVal[:]) dest[i] = string(binaryVal[:])
...@@ -152,7 +153,7 @@ func (rows *taosSqlRows) readRow(dest []driver.Value) error { ...@@ -152,7 +153,7 @@ func (rows *taosSqlRows) readRow(dest []driver.Value) error {
if mc.cfg.parseTime == true { if mc.cfg.parseTime == true {
timestamp := (int64)(*((*int64)(currentRow))) timestamp := (int64)(*((*int64)(currentRow)))
dest[i] = timestampConvertToString(timestamp, int(C.taos_result_precision(result))) dest[i] = timestampConvertToString(timestamp, int(C.taos_result_precision(result)))
}else { } else {
dest[i] = (int64)(*((*int64)(currentRow))) dest[i] = (int64)(*((*int64)(currentRow)))
} }
break break
......
此差异已折叠。
...@@ -20,27 +20,27 @@ ...@@ -20,27 +20,27 @@
"engineStrict": true, "engineStrict": true,
"devDependencies": { "devDependencies": {
"babel": "^6.23.0", "babel": "^6.23.0",
"babel-preset-env": "^1.7.0",
"babel-plugin-transform-object-rest-spread": "^6.26.0", "babel-plugin-transform-object-rest-spread": "^6.26.0",
"babel-preset-env": "^1.7.0",
"chai": "~3.5.0", "chai": "~3.5.0",
"grunt": "^1.0.1", "grunt": "^1.0.4",
"grunt-babel": "~6.0.0", "grunt-babel": "~6.0.0",
"grunt-cli": "^1.2.0", "grunt-cli": "^1.2.0",
"grunt-contrib-clean": "^1.1.0", "grunt-contrib-clean": "^1.1.0",
"grunt-contrib-copy": "^1.0.0", "grunt-contrib-copy": "^1.0.0",
"grunt-contrib-uglify": "^2.3.0", "grunt-contrib-uglify": "^2.3.0",
"grunt-contrib-watch": "^1.0.0", "grunt-contrib-watch": "^1.0.0",
"grunt-execute": "~0.2.2",
"grunt-mocha-test": "^0.13.2", "grunt-mocha-test": "^0.13.2",
"grunt-systemjs-builder": "^1.0.0", "grunt-systemjs-builder": "^1.0.0",
"jsdom": "~9.12.0", "jsdom": "~9.12.0",
"load-grunt-tasks": "^3.5.2", "load-grunt-tasks": "^3.5.2",
"mocha": "^3.2.0", "mocha": "^6.2.2",
"prunk": "^1.3.0", "prunk": "^1.3.0",
"q": "^1.5.0" "q": "^1.5.0"
}, },
"dependencies": { "dependencies": {
"lodash": "^4.17.13" "lodash": "^4.17.13",
"yarn": "^1.21.1"
}, },
"homepage": "https://github.com/taosdata/TDengine/tree/develop/src/connector/grafana/tdengine" "homepage": "https://github.com/taosdata/TDengine/tree/develop/src/connector/grafana/tdengine"
} }
...@@ -137,8 +137,9 @@ extern "C" { ...@@ -137,8 +137,9 @@ extern "C" {
#define TSDB_CODE_INVALID_VNODE_STATUS 116 #define TSDB_CODE_INVALID_VNODE_STATUS 116
#define TSDB_CODE_FAILED_TO_LOCK_RESOURCES 117 #define TSDB_CODE_FAILED_TO_LOCK_RESOURCES 117
#define TSDB_CODE_TABLE_ID_MISMATCH 118 #define TSDB_CODE_TABLE_ID_MISMATCH 118
#define TSDB_CODE_QUERY_CACHE_ERASED 119
#define TSDB_CODE_MAX_ERROR_CODE 119 #define TSDB_CODE_MAX_ERROR_CODE 120
#ifdef __cplusplus #ifdef __cplusplus
} }
......
...@@ -182,6 +182,10 @@ extern "C" { ...@@ -182,6 +182,10 @@ extern "C" {
#define TSDB_MAX_AVG_BLOCKS 2048 #define TSDB_MAX_AVG_BLOCKS 2048
#define TSDB_DEFAULT_AVG_BLOCKS 4 #define TSDB_DEFAULT_AVG_BLOCKS 4
/*
* There is a bug in function taosAllocateId.
* When "create database tables 1" is executed, the wrong sid is assigned, so the minimum value is set to 2.
*/
#define TSDB_MIN_TABLES_PER_VNODE 2 #define TSDB_MIN_TABLES_PER_VNODE 2
#define TSDB_MAX_TABLES_PER_VNODE 220000 #define TSDB_MAX_TABLES_PER_VNODE 220000
......
...@@ -84,7 +84,6 @@ int shellDumpResult(TAOS* con, char* fname, int* error_no, bool printMode); ...@@ -84,7 +84,6 @@ int shellDumpResult(TAOS* con, char* fname, int* error_no, bool printMode);
void shellPrintNChar(char* str, int width, bool printMode); void shellPrintNChar(char* str, int width, bool printMode);
void shellGetGrantInfo(void *con); void shellGetGrantInfo(void *con);
int isCommentLine(char *line); int isCommentLine(char *line);
#define max(a, b) ((int)(a) < (int)(b) ? (int)(b) : (int)(a))
/**************** Global variable declarations ****************/ /**************** Global variable declarations ****************/
extern char PROMPT_HEADER[]; extern char PROMPT_HEADER[];
......
...@@ -16,12 +16,12 @@ ...@@ -16,12 +16,12 @@
#define _XOPEN_SOURCE #define _XOPEN_SOURCE
#define _DEFAULT_SOURCE #define _DEFAULT_SOURCE
#include <inttypes.h>
#include "os.h" #include "os.h"
#include "shell.h" #include "shell.h"
#include "shellCommand.h" #include "shellCommand.h"
#include "ttime.h" #include "ttime.h"
#include "tutil.h" #include "tutil.h"
#include <regex.h> #include <regex.h>
/**************** Global variables ****************/ /**************** Global variables ****************/
...@@ -295,7 +295,6 @@ void shellRunCommandOnServer(TAOS *con, char command[]) { ...@@ -295,7 +295,6 @@ void shellRunCommandOnServer(TAOS *con, char command[]) {
if (fname != NULL) { if (fname != NULL) {
wordfree(&full_path); wordfree(&full_path);
} }
return;
} }
/* Function to do regular expression check */ /* Function to do regular expression check */
...@@ -376,29 +375,29 @@ int shellDumpResult(TAOS *con, char *fname, int *error_no, bool printMode) { ...@@ -376,29 +375,29 @@ int shellDumpResult(TAOS *con, char *fname, int *error_no, bool printMode) {
for (int col = 0; col < num_fields; col++) { for (int col = 0; col < num_fields; col++) {
switch (fields[col].type) { switch (fields[col].type) {
case TSDB_DATA_TYPE_BOOL: case TSDB_DATA_TYPE_BOOL:
l[col] = max(BOOL_OUTPUT_LENGTH, strlen(fields[col].name)); l[col] = MAX(BOOL_OUTPUT_LENGTH, strlen(fields[col].name));
break; break;
case TSDB_DATA_TYPE_TINYINT: case TSDB_DATA_TYPE_TINYINT:
l[col] = max(TINYINT_OUTPUT_LENGTH, strlen(fields[col].name)); l[col] = MAX(TINYINT_OUTPUT_LENGTH, strlen(fields[col].name));
break; break;
case TSDB_DATA_TYPE_SMALLINT: case TSDB_DATA_TYPE_SMALLINT:
l[col] = max(SMALLINT_OUTPUT_LENGTH, strlen(fields[col].name)); l[col] = MAX(SMALLINT_OUTPUT_LENGTH, strlen(fields[col].name));
break; break;
case TSDB_DATA_TYPE_INT: case TSDB_DATA_TYPE_INT:
l[col] = max(INT_OUTPUT_LENGTH, strlen(fields[col].name)); l[col] = MAX(INT_OUTPUT_LENGTH, strlen(fields[col].name));
break; break;
case TSDB_DATA_TYPE_BIGINT: case TSDB_DATA_TYPE_BIGINT:
l[col] = max(BIGINT_OUTPUT_LENGTH, strlen(fields[col].name)); l[col] = MAX(BIGINT_OUTPUT_LENGTH, strlen(fields[col].name));
break; break;
case TSDB_DATA_TYPE_FLOAT: case TSDB_DATA_TYPE_FLOAT:
l[col] = max(FLOAT_OUTPUT_LENGTH, strlen(fields[col].name)); l[col] = MAX(FLOAT_OUTPUT_LENGTH, strlen(fields[col].name));
break; break;
case TSDB_DATA_TYPE_DOUBLE: case TSDB_DATA_TYPE_DOUBLE:
l[col] = max(DOUBLE_OUTPUT_LENGTH, strlen(fields[col].name)); l[col] = MAX(DOUBLE_OUTPUT_LENGTH, strlen(fields[col].name));
break; break;
case TSDB_DATA_TYPE_BINARY: case TSDB_DATA_TYPE_BINARY:
case TSDB_DATA_TYPE_NCHAR: case TSDB_DATA_TYPE_NCHAR:
l[col] = max(fields[col].bytes, strlen(fields[col].name)); l[col] = MAX(fields[col].bytes, strlen(fields[col].name));
/* l[col] = max(BINARY_OUTPUT_LENGTH, strlen(fields[col].name)); */ /* l[col] = max(BINARY_OUTPUT_LENGTH, strlen(fields[col].name)); */
break; break;
case TSDB_DATA_TYPE_TIMESTAMP: { case TSDB_DATA_TYPE_TIMESTAMP: {
...@@ -409,7 +408,7 @@ int shellDumpResult(TAOS *con, char *fname, int *error_no, bool printMode) { ...@@ -409,7 +408,7 @@ int shellDumpResult(TAOS *con, char *fname, int *error_no, bool printMode) {
if (taos_result_precision(result) == TSDB_TIME_PRECISION_MICRO) { if (taos_result_precision(result) == TSDB_TIME_PRECISION_MICRO) {
defaultWidth += 3; defaultWidth += 3;
} }
l[col] = max(defaultWidth, strlen(fields[col].name)); l[col] = MAX(defaultWidth, strlen(fields[col].name));
break; break;
} }
...@@ -458,25 +457,15 @@ int shellDumpResult(TAOS *con, char *fname, int *error_no, bool printMode) { ...@@ -458,25 +457,15 @@ int shellDumpResult(TAOS *con, char *fname, int *error_no, bool printMode) {
printf("%*" PRId64 "|", l[i], *((int64_t *)row[i])); printf("%*" PRId64 "|", l[i], *((int64_t *)row[i]));
break; break;
case TSDB_DATA_TYPE_FLOAT: { case TSDB_DATA_TYPE_FLOAT: {
#ifdef _TD_ARM_32_
float fv = 0; float fv = 0;
//memcpy(&fv, row[i], sizeof(float)); fv = GET_FLOAT_VAL(row[i]);
*(int32_t*)(&fv) = *(int32_t*)row[i];
printf("%*.5f|", l[i], fv); printf("%*.5f|", l[i], fv);
#else
printf("%*.5f|", l[i], *((float *)row[i]));
#endif
} }
break; break;
case TSDB_DATA_TYPE_DOUBLE: { case TSDB_DATA_TYPE_DOUBLE: {
#ifdef _TD_ARM_32_
double dv = 0; double dv = 0;
//memcpy(&dv, row[i], sizeof(double)); dv = GET_DOUBLE_VAL(row[i]);
*(int64_t*)(&dv) = *(int64_t*)row[i];
printf("%*.9f|", l[i], dv); printf("%*.9f|", l[i], dv);
#else
printf("%*.9f|", l[i], *((double *)row[i]));
#endif
} }
break; break;
case TSDB_DATA_TYPE_BINARY: case TSDB_DATA_TYPE_BINARY:
...@@ -543,32 +532,22 @@ int shellDumpResult(TAOS *con, char *fname, int *error_no, bool printMode) { ...@@ -543,32 +532,22 @@ int shellDumpResult(TAOS *con, char *fname, int *error_no, bool printMode) {
printf("%" PRId64 "\n", *((int64_t *)row[i])); printf("%" PRId64 "\n", *((int64_t *)row[i]));
break; break;
case TSDB_DATA_TYPE_FLOAT: { case TSDB_DATA_TYPE_FLOAT: {
#ifdef _TD_ARM_32_
float fv = 0; float fv = 0;
//memcpy(&fv, row[i], sizeof(float)); fv = GET_FLOAT_VAL(row[i]);
*(int32_t*)(&fv) = *(int32_t*)row[i];
printf("%.5f\n", fv); printf("%.5f\n", fv);
#else
printf("%.5f\n", *((float *)row[i]));
#endif
} }
break; break;
case TSDB_DATA_TYPE_DOUBLE: { case TSDB_DATA_TYPE_DOUBLE: {
#ifdef _TD_ARM_32_
double dv = 0; double dv = 0;
//memcpy(&dv, row[i], sizeof(double)); dv = GET_DOUBLE_VAL(row[i]);
*(int64_t*)(&dv) = *(int64_t*)row[i];
printf("%.9f\n", dv); printf("%.9f\n", dv);
#else
printf("%.9f\n", *((double *)row[i]));
#endif
} }
break; break;
case TSDB_DATA_TYPE_BINARY: case TSDB_DATA_TYPE_BINARY:
case TSDB_DATA_TYPE_NCHAR: case TSDB_DATA_TYPE_NCHAR:
memset(t_str, 0, TSDB_MAX_BYTES_PER_ROW); memset(t_str, 0, TSDB_MAX_BYTES_PER_ROW);
memcpy(t_str, row[i], fields[i].bytes); memcpy(t_str, row[i], fields[i].bytes);
l[i] = max(fields[i].bytes, strlen(fields[i].name)); l[i] = MAX(fields[i].bytes, strlen(fields[i].name));
shellPrintNChar(t_str, l[i], printMode); shellPrintNChar(t_str, l[i], printMode);
break; break;
case TSDB_DATA_TYPE_TIMESTAMP: case TSDB_DATA_TYPE_TIMESTAMP:
...@@ -631,25 +610,15 @@ int shellDumpResult(TAOS *con, char *fname, int *error_no, bool printMode) { ...@@ -631,25 +610,15 @@ int shellDumpResult(TAOS *con, char *fname, int *error_no, bool printMode) {
fprintf(fp, "%" PRId64, *((int64_t *)row[i])); fprintf(fp, "%" PRId64, *((int64_t *)row[i]));
break; break;
case TSDB_DATA_TYPE_FLOAT: { case TSDB_DATA_TYPE_FLOAT: {
#ifdef _TD_ARM_32_
float fv = 0; float fv = 0;
//memcpy(&fv, row[i], sizeof(float)); fv = GET_FLOAT_VAL(row[i]);
*(int32_t*)(&fv) = *(int32_t*)row[i];
fprintf(fp, "%.5f", fv); fprintf(fp, "%.5f", fv);
#else
fprintf(fp, "%.5f", *((float *)row[i]));
#endif
} }
break; break;
case TSDB_DATA_TYPE_DOUBLE: { case TSDB_DATA_TYPE_DOUBLE: {
#ifdef _TD_ARM_32_
double dv = 0; double dv = 0;
//memcpy(&dv, row[i], sizeof(double)); dv = GET_DOUBLE_VAL(row[i]);
*(int64_t*)(&dv) = *(int64_t*)row[i];
fprintf(fp, "%.9f", dv); fprintf(fp, "%.9f", dv);
#else
fprintf(fp, "%.9f", *((double *)row[i]));
#endif
} }
break; break;
case TSDB_DATA_TYPE_BINARY: case TSDB_DATA_TYPE_BINARY:
...@@ -795,8 +764,17 @@ void source_file(TAOS *con, char *fptr) { ...@@ -795,8 +764,17 @@ void source_file(TAOS *con, char *fptr) {
char *fname = full_path.we_wordv[0]; char *fname = full_path.we_wordv[0];
if (access(fname, R_OK) == -1) { if (access(fname, F_OK) != 0) {
fprintf(stderr, "ERROR: file %s is not exist\n", fptr);
wordfree(&full_path);
free(cmd);
return;
}
if (access(fname, R_OK) != 0) {
fprintf(stderr, "ERROR: file %s is not readable\n", fptr); fprintf(stderr, "ERROR: file %s is not readable\n", fptr);
wordfree(&full_path); wordfree(&full_path);
free(cmd); free(cmd);
return; return;
......
...@@ -154,9 +154,19 @@ static void shellSourceFile(TAOS *con, char *fptr) { ...@@ -154,9 +154,19 @@ static void shellSourceFile(TAOS *con, char *fptr) {
char *fname = full_path.we_wordv[0]; char *fname = full_path.we_wordv[0];
if (access(fname, R_OK) == -1) { if (access(fname, F_OK) != 0) {
fprintf(stderr, "ERROR: file %s is not exist\n", fptr);
wordfree(&full_path);
free(cmd);
return;
}
if (access(fname, R_OK) != 0) {
fprintf(stderr, "ERROR: file %s is not readable\n", fptr); fprintf(stderr, "ERROR: file %s is not readable\n", fptr);
wordfree(&full_path); wordfree(&full_path);
free(cmd);
return; return;
} }
......
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/types.h> #include <sys/types.h>
#include <time.h> #include <time.h>
#include <inttypes.h>
#include "winsock2.h" #include "winsock2.h"
#include <WS2tcpip.h> #include <WS2tcpip.h>
......
...@@ -242,5 +242,6 @@ char *tsError[] = {"success", ...@@ -242,5 +242,6 @@ char *tsError[] = {"success",
"invalid table id", // 115 "invalid table id", // 115
"invalid vnode status", "invalid vnode status",
"failed to lock resources", "failed to lock resources",
"table id/uid mismatch", // 118 "table id/uid mismatch",
"client query cache erased", // 119
}; };
...@@ -2240,6 +2240,7 @@ static void teardownQueryRuntimeEnv(SQueryRuntimeEnv *pRuntimeEnv) { ...@@ -2240,6 +2240,7 @@ static void teardownQueryRuntimeEnv(SQueryRuntimeEnv *pRuntimeEnv) {
} }
tVariantDestroy(&pCtx->tag); tVariantDestroy(&pCtx->tag);
tfree(pCtx->tagInfo.pTagCtxList);
tfree(pRuntimeEnv->resultInfo[i].interResultBuf); tfree(pRuntimeEnv->resultInfo[i].interResultBuf);
} }
...@@ -3687,20 +3688,19 @@ static int32_t allocateOutputBufForGroup(SMeterQuerySupportObj *pSupporter, SQue ...@@ -3687,20 +3688,19 @@ static int32_t allocateOutputBufForGroup(SMeterQuerySupportObj *pSupporter, SQue
return TSDB_CODE_SERV_OUT_OF_MEMORY; return TSDB_CODE_SERV_OUT_OF_MEMORY;
} }
// create group result buffer
for (int32_t k = 0; k < slot; ++k) { for (int32_t k = 0; k < slot; ++k) {
SOutputRes *pOneRes = &pSupporter->pResult[k]; SOutputRes *pOneRes = &pSupporter->pResult[k];
pOneRes->nAlloc = 1;
/* /*
* for top/bottom query, the output for group by normal column, the output rows is equals to the * for single table top/bottom query, the output for group by normal column, the output rows is
* maximum rows, instead of 1. * equals to the maximum rows, instead of 1.
*/ */
if (!isMetricQuery && isTopBottomQuery(pQuery)) {
assert(pQuery->numOfOutputCols > 1);
SSqlFunctionExpr *pExpr = &pQuery->pSelectExpr[1]; SSqlFunctionExpr *pExpr = &pQuery->pSelectExpr[1];
if ((pExpr->pBase.functionId == TSDB_FUNC_TOP || pExpr->pBase.functionId == TSDB_FUNC_BOTTOM) &&
pExpr->resType != TSDB_DATA_TYPE_BINARY) {
pOneRes->nAlloc = pExpr->pBase.arg[0].argValue.i64; pOneRes->nAlloc = pExpr->pBase.arg[0].argValue.i64;
} else {
pOneRes->nAlloc = 1;
} }
createGroupResultBuf(pQuery, pOneRes, isMetricQuery); createGroupResultBuf(pQuery, pOneRes, isMetricQuery);
...@@ -6011,14 +6011,14 @@ int32_t getDataBlocksForMeters(SMeterQuerySupportObj *pSupporter, SQuery *pQuery ...@@ -6011,14 +6011,14 @@ int32_t getDataBlocksForMeters(SMeterQuerySupportObj *pSupporter, SQuery *pQuery
pSummary->loadCompInfoUs += (et - st); pSummary->loadCompInfoUs += (et - st);
if (!setCurrentQueryRange(pMeterDataInfo[j], pQuery, pSupporter->rawEKey, &minval, &maxval)) { if (!setCurrentQueryRange(pMeterDataInfo[j], pQuery, pSupporter->rawEKey, &minval, &maxval)) {
clearAllMeterDataBlockInfo(pMeterDataInfo, 0, j); clearAllMeterDataBlockInfo(pMeterDataInfo, j, j);
continue; continue;
} }
int32_t end = 0; int32_t end = 0;
if (!getValidDataBlocksRangeIndex(pMeterDataInfo[j], pQuery, pMeterDataInfo[j]->pBlock, compInfo.numOfBlocks, if (!getValidDataBlocksRangeIndex(pMeterDataInfo[j], pQuery, pMeterDataInfo[j]->pBlock, compInfo.numOfBlocks,
minval, maxval, &end)) { minval, maxval, &end)) {
clearAllMeterDataBlockInfo(pMeterDataInfo, 0, j); clearAllMeterDataBlockInfo(pMeterDataInfo, j, j);
continue; continue;
} }
......
...@@ -57,7 +57,6 @@ ELSEIF (TD_WINDOWS_64) ...@@ -57,7 +57,6 @@ ELSEIF (TD_WINDOWS_64)
LIST(APPEND SRC ./src/tsched.c) LIST(APPEND SRC ./src/tsched.c)
LIST(APPEND SRC ./src/tskiplist.c) LIST(APPEND SRC ./src/tskiplist.c)
LIST(APPEND SRC ./src/tsocket.c) LIST(APPEND SRC ./src/tsocket.c)
LIST(APPEND SRC ./src/tstatus.c)
LIST(APPEND SRC ./src/tstrbuild.c) LIST(APPEND SRC ./src/tstrbuild.c)
LIST(APPEND SRC ./src/ttime.c) LIST(APPEND SRC ./src/ttime.c)
LIST(APPEND SRC ./src/ttimer.c) LIST(APPEND SRC ./src/ttimer.c)
......
...@@ -97,10 +97,11 @@ void tExtMemBufferDestroy(tExtMemBuffer **pMemBuffer) { ...@@ -97,10 +97,11 @@ void tExtMemBufferDestroy(tExtMemBuffer **pMemBuffer) {
// close temp file // close temp file
if ((*pMemBuffer)->dataFile != 0) { if ((*pMemBuffer)->dataFile != 0) {
int32_t ret = fclose((*pMemBuffer)->dataFile); if (fclose((*pMemBuffer)->dataFile) != 0) {
if (ret != 0) {
pError("failed to close file:%s, reason:%s", (*pMemBuffer)->dataFilePath, strerror(errno)); pError("failed to close file:%s, reason:%s", (*pMemBuffer)->dataFilePath, strerror(errno));
} }
pTrace("remove temp file:%s for external buffer", (*pMemBuffer)->dataFilePath);
unlink((*pMemBuffer)->dataFilePath); unlink((*pMemBuffer)->dataFilePath);
} }
......
char version[64] = "1.6.4.4"; char version[64] = "1.6.5.1";
char compatible_version[64] = "1.6.1.0"; char compatible_version[64] = "1.6.1.0";
char gitinfo[128] = "d62c5c30231d04a736d437cf428af6e12599bd9f"; char gitinfo[128] = "2ea714387009421beb35e7f03b94c6a87d22529a";
char gitinfoOfInternal[128] = "8094a32d78dc519bd883d01ac2ba6ec49ac57a80"; char gitinfoOfInternal[128] = "950f54ac026bc05bcec5cff356f4964a18d635bd";
char buildinfo[512] = "Built by ubuntu at 2019-12-16 21:40"; char buildinfo[512] = "Built by ubuntu at 2019-12-21 11:14";
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册